DBA Data[Home] [Help]

PACKAGE BODY: APPS.FTE_FREIGHT_PRICING

Source


1 PACKAGE BODY FTE_FREIGHT_PRICING as
2 /* $Header: FTEFRPRB.pls 120.24 2011/09/12 06:06:28 ueshanka ship $ */
3 
4 -- Private Package level Variables
5 
6    G_PKG_NAME CONSTANT VARCHAR2(30) := 'FTE_FREIGHT_PRICING';
7 
8    G_RC_SUCCESS 		CONSTANT NUMBER := 0;
9    G_RC_ERROR 			CONSTANT NUMBER := 1;
10    G_RC_REPRICE_NOT_REQUIRED 	CONSTANT NUMBER := 2;
11    G_RC_NOT_RATE_FREIGHT_TERM 	CONSTANT NUMBER := 3;
12    G_RC_NOT_RATE_MANIFESTING 	CONSTANT NUMBER := 4;
13 
14    g_finished_success		EXCEPTION;
15    g_finished_warning		EXCEPTION;
16 
17 CURSOR get_uom_for_each
18 IS
19 SELECT uom_for_num_of_units
20 FROM wsh_global_parameters;
21 
22 -- CURSOR get_uom_for_each
23 -- IS
24 -- SELECT 'Ea' uom_for_num_of_units
25 -- FROM wsh_global_parameters;
26 
27 CURSOR get_category(c_item_id IN NUMBER,c_org_id IN NUMBER,c_classification_code IN VARCHAR2) IS
28 SELECT mc.category_id
29 FROM   mtl_categories mc, mtl_item_categories mic,
30        mtl_category_sets_tl mcstl
31 WHERE  mic.inventory_item_id = c_item_id
32 AND    mic.organization_id   = c_org_id
33 AND    mic.category_set_id   = mcstl.category_set_id
34 AND    mc.category_id        = mic.category_id
35 AND    mc.segment1           = c_classification_code
36 AND    mcstl.category_set_name = 'WSH_COMMODITY_CODE';
37 
38 CURSOR get_category_basis(c_lane_id IN NUMBER,c_category_id IN NUMBER) IS
39 SELECT basis
40 FROM   fte_lane_commodities
41 WHERE  lane_id = c_lane_id
42 AND    commodity_catg_id = c_category_id;
43 
44 -- This category id will get assigned to an item when a lane does not have any classification code assigned to it
45 -- which effectively means the user does not care about the categories of the items going on that lane eg. Parcel lanes
46 g_default_category_id      NUMBER:= -9999;
47 
48    CURSOR c_get_delivery_id(c_leg_id NUMBER)
49    IS
50    SELECT delivery_id
51    FROM wsh_delivery_legs
52    WHERE delivery_leg_id = c_leg_id;
53 
54    CURSOR c_count_delivery_details(c_delivery_id NUMBER)
55    IS
56    SELECT count(delivery_detail_id) FROM wsh_delivery_assignments
57    WHERE delivery_id = c_delivery_id;
58 
59    CURSOR c_count_delivery_details2(c_trip_id NUMBER)
60    IS
61    SELECT count(delivery_detail_id) FROM wsh_delivery_assignments
62    WHERE delivery_id in
63    	(SELECT wdl.delivery_id
64    	 FROM   wsh_delivery_legs wdl,
65           wsh_trip_stops wts1,
66           wsh_trip_stops wts2
67    	 WHERE wts1.trip_id = c_trip_id
68    	 AND   wts2.trip_id = c_trip_id
69    	 AND   wts1.stop_id = wdl.pick_up_stop_id
70    	 AND   wts2.stop_id = wdl.drop_off_stop_id
71    	);
72 
73    -- count the number of deliveries which should not be rated due to freight term
74    CURSOR c_check_del_freight_term(c_delivery_id NUMBER)
75    IS
76    SELECT count(wd.delivery_id)
77    FROM   wsh_new_deliveries wd, wsh_global_parameters wgp
78    WHERE (
79 	  ((wd.shipment_direction in ('I'))
80 	   and (wgp.rate_ib_dels_fgt_term is not null)
81 	   and (wd.freight_terms_code is not null)
82 	   and (wgp.rate_ib_dels_fgt_term <> wd.freight_terms_code)
83 	  )
84    	  OR
85 	  ((wd.shipment_direction in ('D'))
86 	   and (wgp.rate_ds_dels_fgt_term_id is not null)
87 	   and (wd.freight_terms_code is not null)
88 	   and (wgp.rate_ds_dels_fgt_term_id <> wd.freight_terms_code)
89 	  )
90    	  OR
91 	  ((nvl(wd.shipment_direction,'O') in ('O','IO'))
92            and (wgp.skip_rate_ob_dels_fgt_term is not null)
93 	   and (wd.freight_terms_code is not null)
94  	   and (wgp.skip_rate_ob_dels_fgt_term = wd.freight_terms_code)
95 	  )
96 	 )
97    AND    wd.delivery_id    = c_delivery_id;
98 
99    -- count the number of deliveries which should not be rated due to freight term
100    CURSOR c_check_del_freight_term2(c_trip_id NUMBER)
101    IS
102    SELECT count(wd.delivery_id)
103    FROM   wsh_new_deliveries wd, wsh_global_parameters wgp
104    WHERE (
105 	  ((wd.shipment_direction in ('I'))
106 	   and (wgp.rate_ib_dels_fgt_term is not null)
107 	   and (wd.freight_terms_code is not null)
108 	   and (wgp.rate_ib_dels_fgt_term <> wd.freight_terms_code)
109 	  )
110    	  OR
111 	  ((wd.shipment_direction in ('D'))
112 	   and (wgp.rate_ds_dels_fgt_term_id is not null)
113 	   and (wd.freight_terms_code is not null)
114 	   and (wgp.rate_ds_dels_fgt_term_id <> wd.freight_terms_code)
115 	  )
116    	  OR
117 	  ((nvl(wd.shipment_direction,'O') in ('O','IO'))
118            and (wgp.skip_rate_ob_dels_fgt_term is not null)
119 	   and (wd.freight_terms_code is not null)
120  	   and (wgp.skip_rate_ob_dels_fgt_term = wd.freight_terms_code)
121 	  )
122 	 )
123    AND    wd.delivery_id in
124    	(SELECT wdl.delivery_id
125    	 FROM   wsh_delivery_legs wdl,
126           wsh_trip_stops wts1,
127           wsh_trip_stops wts2
128    	 WHERE wts1.trip_id = c_trip_id
129    	 AND   wts2.trip_id = c_trip_id
130    	 AND   wts1.stop_id = wdl.pick_up_stop_id
131    	 AND   wts2.stop_id = wdl.drop_off_stop_id
132    	);
133 
134    -- count the number of deliveries which should not be rated due to manifesting
135   CURSOR c_check_del_manifesting(c_delivery_id NUMBER)
136   IS
137   SELECT count(a.delivery_id)
138   FROM   wsh_new_deliveries a,
139 	 mtl_parameters b,
140 	 wsh_carriers c
141   WHERE  a.organization_id = b.organization_id
142   AND    a.carrier_id = c.carrier_id
143   AND    c.manifesting_enabled_flag = 'Y'
144   AND    b.carrier_manifesting_flag = 'Y'
145   AND    a.delivery_id = c_delivery_id;
146 
147    -- count the number of deliveries which should not be rated due to manifesting
148   CURSOR c_check_del_manifesting2(c_trip_id NUMBER)
149   IS
150   SELECT count(a.delivery_id)
151   FROM   wsh_new_deliveries a,
152 	 mtl_parameters b,
153 	 wsh_carriers c
154   WHERE  a.organization_id = b.organization_id
155   AND    a.carrier_id = c.carrier_id
156   AND    c.manifesting_enabled_flag = 'Y'
157   AND    b.carrier_manifesting_flag = 'Y'
158   AND    a.delivery_id in
159    	(SELECT wdl.delivery_id
160    	 FROM   wsh_delivery_legs wdl,
161           wsh_trip_stops wts1,
162           wsh_trip_stops wts2
163    	 WHERE wts1.trip_id = c_trip_id
164    	 AND   wts2.trip_id = c_trip_id
165    	 AND   wts1.stop_id = wdl.pick_up_stop_id
166    	 AND   wts2.stop_id = wdl.drop_off_stop_id
167    	);
168 
169    CURSOR c_cnt_trip_legs(c_trip_id NUMBER)
170    IS
171    SELECT count(wdl.delivery_leg_id)
172    FROM   wsh_delivery_legs wdl,
173           wsh_trip_stops wts1,
174           wsh_trip_stops wts2
175    WHERE wts1.trip_id = c_trip_id
176    AND   wts2.trip_id = c_trip_id
177    AND   wts1.stop_id = wdl.pick_up_stop_id
178    AND   wts2.stop_id = wdl.drop_off_stop_id;
179 
180    CURSOR c_count_reprice_reqd(c_trip_id IN NUMBER) IS
181    Select count(*)
182    from   wsh_delivery_legs wdl, wsh_trip_stops wts1, wsh_trip_stops wts2,wsh_trips wt
183    where  wdl.pick_up_stop_id    = wts1.stop_id
184    and    wdl.drop_off_stop_id   = wts2.stop_id
185    and    wdl.reprice_required = 'Y'
186    and    wts1.trip_id           = wt.trip_id
187    and    wts2.trip_id           = wt.trip_id
188    and    wt.trip_id             = c_trip_id;
189 
190    TYPE pricing_engine_output_rec_type IS RECORD
191                 (output_index                                   NUMBER ,  -- Should be same as input index
192                  -- input_index                                    NUMBER ,  --  One record per input index
193                  priced_quantity                                NUMBER ,
194                  priced_uom_code                                VARCHAR2(30), -- Do we need or should we
195                                                                               -- return in input uom and currency
196                  unit_price                                     NUMBER ,
197                  adjusted_unit_price                            NUMBER ,
198                  updated_adjusted_unit_price                    NUMBER,
199                  line_unit_price                                NUMBER,
200                  percent_price                                  NUMBER
201                  );
202 
203    TYPE pricing_engine_output_tab_type IS TABLE OF pricing_engine_output_rec_type INDEX BY BINARY_INTEGER;
204 
205    TYPE dlvy_leg_summ_rec_type IS RECORD
206                 (entity_id                                  NUMBER ,
207                  summary_amount                             NUMBER
208                  );
209 
210    TYPE dlvy_leg_summ_tab_type IS TABLE OF dlvy_leg_summ_rec_type INDEX BY BINARY_INTEGER;
211 
212    TYPE basis_categ_rec_type IS RECORD
213                 (category_id                                    NUMBER ,
214                  basis                                          NUMBER
215                  );
216 
217    TYPE basis_categ_tab_type IS TABLE OF basis_categ_rec_type INDEX BY BINARY_INTEGER;
218 
219    TYPE instance_category_rec_type IS RECORD
220                 (category_id                                    NUMBER ,
221                  instance_index                                 NUMBER
222                  );
223 
224    TYPE instance_category_tab_type IS TABLE OF instance_category_rec_type INDEX BY BINARY_INTEGER;
225 
226    TYPE instance_basis_rec_type IS RECORD
227                 (basis                                          NUMBER ,
228                  instance_index                                 NUMBER
229                  );
230 
231    TYPE instance_basis_tab_type IS TABLE OF instance_basis_rec_type INDEX BY BINARY_INTEGER;
232 
233    TYPE instance_enginerow_rec_type IS RECORD
234                 (input_index                                    NUMBER ,
235                  tot_amount                                     NUMBER
236                  );
237 
238    TYPE instance_enginerow_tab_type IS TABLE OF instance_enginerow_rec_type INDEX BY BINARY_INTEGER;
239 
240    TYPE quantity_rec_type IS RECORD
241                 (quantity                                     NUMBER ,
242                  uom                                          VARCHAR2(30)
243                  );
244 
245    TYPE quantity_tab_type IS TABLE OF quantity_rec_type INDEX BY BINARY_INTEGER;
246 
247    TYPE quantity_basis_rec_type IS RECORD
248                 (basis                                        NUMBER ,
249                  quantity                                     NUMBER ,
250                  uom                                          VARCHAR2(30)
251                  );
252 
253    TYPE quantity_basis_tab_type IS TABLE OF quantity_basis_rec_type INDEX BY BINARY_INTEGER;
254 
255    TYPE total_discount_rec_type IS RECORD
256                 (total_amount                                 NUMBER ,
257                  discount_amount                              NUMBER
258                  );
259 
260    TYPE total_discount_tab_type IS TABLE OF total_discount_rec_type INDEX BY BINARY_INTEGER;
261 
262    TYPE container_sum_rec_type IS RECORD
263                 (currency_code                                VARCHAR2(30),
264                  total_amount                                 NUMBER ,
265                  discount_amount                              NUMBER ,
266                  delivery_id                                  NUMBER ,
267                  delivery_leg_id                              NUMBER DEFAULT NULL,
268                  bquantity                                    NUMBER DEFAULT NULL,
269                  bbasis                                       NUMBER DEFAULT NULL,
270                  buom                                         VARCHAR2(20) DEFAULT NULL
271                  );
272 
273    TYPE container_sum_tab_type IS TABLE OF container_sum_rec_type INDEX BY BINARY_INTEGER;
274 
275    TYPE container_detail_rec_type IS RECORD
276                 (entity_id                                    NUMBER ,
277                  detail_id                                    NUMBER
278                  );
279 
280    TYPE container_detail_tab_type IS TABLE OF container_detail_rec_type INDEX BY BINARY_INTEGER;
281 
282    TYPE trip_info_rec IS RECORD
283    (
284           trip_id                         NUMBER,
285           name                            VARCHAR2(30),
286           planned_flag                    VARCHAR2(1),
287           status_code                     VARCHAR2(2),
288           carrier_id                      NUMBER,
289           ship_method_code                VARCHAR2(30),
290           service_level                   VARCHAR2(30),
291           mode_of_transport               VARCHAR2(30),
292           consolidation_allowed           VARCHAR2(1),
293           lane_id                         NUMBER,
294           schedule_id                     NUMBER,
295           load_tender_status              wsh_trips.load_tender_status%TYPE
296     );
297 
298 -- Private APIs
299 
300 PROCEDURE Get_Basis_Meaning ( p_basis           IN NUMBER,
301                               x_basis_meaning   OUT NOCOPY VARCHAR2
302                              )
303 IS
304 
305 BEGIN
306      IF p_basis = G_CONTAINER_BASIS THEN
307         x_basis_meaning := 'CONTAINER';
308      ELSIF p_basis = G_WEIGHT_BASIS THEN
309         x_basis_meaning := 'WEIGHT';
310      ELSIF p_basis = G_VOLUME_BASIS THEN
311         x_basis_meaning := 'VOLUME';
312      END IF;
313 END Get_Basis_Meaning;
314 
315 PROCEDURE MDC_Get_child_fraction(
316 	p_consol_LPN_children IN DBMS_UTILITY.NUMBER_ARRAY,--Indexed by child detail id, value of parent consol detail id
317 	x_fraction  OUT NOCOPY DBMS_UTILITY.NUMBER_ARRAY,
318 	x_return_status           OUT NOCOPY     VARCHAR2) IS
319 
320 i	NUMBER;
321 l_uom VARCHAR2(30);
322 l_weight NUMBER;
323 l_parent_detail_id NUMBER;
324 l_detail_weight DBMS_UTILITY.NUMBER_ARRAY;
325 l_total_lpn_weight DBMS_UTILITY.NUMBER_ARRAY;
326 
327 l_log_level     NUMBER := FTE_FREIGHT_PRICING_UTIL.G_DBG;
328 
329 BEGIN
330 	x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
331 	FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
332 	FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,'MDC_Get_child_fraction','start');
333 
334 
335 	--Gather sum of all children weight in l_total_lpn_weight
336 
337 	l_uom:=NULL;
338 	i:=p_consol_LPN_children.FIRST;
339 	WHILE( i IS NOT NULL)
340 	LOOP
341 		l_detail_weight(i):=0;
342 		IF((g_shipment_line_rows(i).gross_weight IS NOT NULL)
343 		AND (g_shipment_line_rows(i).weight_uom_code IS NOT NULL)
344 		)
345 		THEN
346 			IF(l_uom IS NULL)
347 			THEN
348 				l_uom:=g_shipment_line_rows(i).weight_uom_code;
349 			END IF;
350 
351 			IF (l_uom <> g_shipment_line_rows(i).weight_uom_code)
352 			THEN
353 
354 				l_weight:=FTE_FREIGHT_PRICING_UTIL.convert_uom(
355 					g_shipment_line_rows(i).weight_uom_code,
356 					l_uom,
357 					g_shipment_line_rows(i).gross_weight,
358 					0);
359 				IF (l_weight IS NULL)
360 				THEN
361 					raise FTE_FREIGHT_PRICING_UTIL.g_tl_weight_uom_conv_fail;
362 				END IF;
363 
364 
365 			ELSE
366 				l_weight:=g_shipment_line_rows(i).gross_weight;
367 
368 			END IF;
369 			l_detail_weight(i):=l_weight;
370 			IF (l_total_lpn_weight.EXISTS(p_consol_LPN_children(i)))
371 			THEN
372 				l_total_lpn_weight(p_consol_LPN_children(i)):=
373 					l_total_lpn_weight(p_consol_LPN_children(i))+l_weight;
374 			ELSE
375 				l_total_lpn_weight(p_consol_LPN_children(i)):=l_weight;
376 			END IF;
377 
378 
379 
380 		END IF;
381 
382 
383 		i:=p_consol_LPN_children.NEXT(i);
384 	END LOOP;
385 
386 	--Determine fraction
387 
388 	i:=p_consol_LPN_children.FIRST;
389 	WHILE( i IS NOT NULL)
390 	LOOP
391 		x_fraction(i):=0;
392 		l_parent_detail_id:=p_consol_LPN_children(i);
393 		IF ((l_total_lpn_weight.EXISTS(l_parent_detail_id) )
394 		AND (l_total_lpn_weight(l_parent_detail_id)>0))
395 		THEN
396 			x_fraction(i):=l_detail_weight(i)/l_total_lpn_weight(l_parent_detail_id);
397 
398 		END IF;
399 
400 		i:=p_consol_LPN_children.NEXT(i);
401 	END LOOP;
402 
403 
404 	FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'MDC_Get_child_fraction');
405 
406 EXCEPTION
407    WHEN FTE_FREIGHT_PRICING_UTIL.g_tl_weight_uom_conv_fail THEN
408         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
409         FTE_FREIGHT_PRICING_UTIL.set_exception('MDC_Get_child_fraction',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_tl_weight_uom_conv_fail');
410         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'MDC_Get_child_fraction');
411    WHEN others THEN
412         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
413         FTE_FREIGHT_PRICING_UTIL.set_exception('MDC_Get_child_fraction',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
414         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
415         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'MDC_Get_child_fraction');
416 
417 END MDC_Get_child_fraction;
418 
419 PROCEDURE MDC_Get_LPN_Cost_rec(
420 	p_consol_LPNs IN DBMS_UTILITY.NUMBER_ARRAY,
421 	p_freight_cost_main_tab IN Freight_Cost_Main_Tab_Type,
422 	p_freight_cost_temp_tab IN Freight_Cost_Temp_Tab_Type,
423 	x_ref OUT NOCOPY DBMS_UTILITY.NUMBER_ARRAY,
424 	x_return_status           OUT NOCOPY     VARCHAR2) IS
425 
426 i	NUMBER;
427 l_log_level     NUMBER := FTE_FREIGHT_PRICING_UTIL.G_DBG;
428 
429 BEGIN
430 	x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
431 	FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
432 	FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,'MDC_Get_LPN_Cost_rec','start');
433 
434 	i:=p_freight_cost_main_tab.FIRST;
435 	WHILE (i IS NOT NULL)
436 	LOOP
437 		IF((p_freight_cost_main_tab(i).delivery_detail_id IS NOT NULL)
438 		AND (p_freight_cost_main_tab(i).line_type_code IS NOT NULL)
439 		AND (p_consol_LPNs.EXISTS(p_freight_cost_main_tab(i).delivery_detail_id)))
440 		THEN
441 			x_ref(p_freight_cost_main_tab(i).delivery_detail_id):=i;
442 
443 		END IF;
444 
445 		i:=p_freight_cost_main_tab.NEXT(i);
446 	END LOOP;
447 
448 	i:=p_freight_cost_temp_tab.FIRST;
449 	WHILE (i IS NOT NULL)
450 	LOOP
451 		IF((p_freight_cost_temp_tab(i).delivery_detail_id IS NOT NULL)
452 		AND (p_freight_cost_temp_tab(i).line_type_code IS NOT NULL)
453 		AND (p_consol_LPNs.EXISTS(p_freight_cost_temp_tab(i).delivery_detail_id)))
454 		THEN
455 			x_ref(p_freight_cost_temp_tab(i).delivery_detail_id):=i;
456 
457 		END IF;
458 
459 		i:=p_freight_cost_temp_tab.NEXT(i);
460 	END LOOP;
461 
462 	FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'MDC_Get_LPN_Cost_rec');
463 
464 EXCEPTION
465 
466    WHEN others THEN
467         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
468         FTE_FREIGHT_PRICING_UTIL.set_exception('MDC_Get_LPN_Cost_rec',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
469         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
470         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'MDC_Get_LPN_Cost_rec');
471 
472 
473 END MDC_Get_LPN_Cost_rec;
474 
475 PROCEDURE MDC_Alloc_From_consol_LPN(
476 	p_save_flag               IN     VARCHAR2, -- Whether to save to TEMP table or temp table
477 	p_consol_LPNs IN DBMS_UTILITY.NUMBER_ARRAY,--Indexed by consol LPN detail id
478 	p_consol_LPN_children IN DBMS_UTILITY.NUMBER_ARRAY,--Indexed by child detail id, value of parent consol detail id
479         x_freight_cost_main_price IN OUT NOCOPY Freight_Cost_Main_Tab_Type,
480         x_freight_cost_temp_price IN OUT NOCOPY Freight_Cost_temp_Tab_Type,
481         x_freight_cost_main_charge IN OUT NOCOPY Freight_Cost_Main_Tab_Type,
482         x_freight_cost_temp_charge IN OUT NOCOPY Freight_Cost_temp_Tab_Type,
483 	x_return_status           OUT NOCOPY     VARCHAR2) IS
484 i	NUMBER;
485 j	NUMBER;
486 n	NUMBER;
487 l_temp NUMBER;
488 l_price_ref	DBMS_UTILITY.NUMBER_ARRAY;
489 
490 
491 l_fractions	DBMS_UTILITY.NUMBER_ARRAY;
492 l_dtl_fraction NUMBER;
493 l_LPN_rec_index NUMBER;
494 
495 l_child_dtl_temp_rec Freight_Cost_temp_Rec_Type;
496 l_child_dtl_main_rec WSH_FREIGHT_COSTS_PVT.Freight_Cost_Rec_Type;
497 l_LPN_main_rec WSH_FREIGHT_COSTS_PVT.Freight_Cost_Rec_Type;
498 l_LPN_temp_rec Freight_Cost_Temp_Rec_Type;
499 
500 l_freight_cost_type_id NUMBER;
501 
502 l_return_status VARCHAR2(1);
503 l_log_level     NUMBER := FTE_FREIGHT_PRICING_UTIL.G_DBG;
504 
505 BEGIN
506 	x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
507 	FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
508 	FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,'MDC_Alloc_From_consol_LPN','start');
509 
510 
511 
512 	--Get LPN Summary records locations
513 	MDC_Get_LPN_Cost_rec(
514 		p_consol_LPNs=>p_consol_LPNs,
515 		p_freight_cost_main_tab=>x_freight_cost_main_price,
516 		p_freight_cost_temp_tab=>x_freight_cost_temp_price,
517 		x_ref=>l_price_ref,
518 		x_return_status=>l_return_status);
519 
520 	IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS
521 	THEN
522 	       IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING
523 	       THEN
524 		  raise FTE_FREIGHT_PRICING_UTIL.g_MDC_Get_LPN_cost_rec_fail;
525 	       END IF;
526 	END IF;
527 
528 
529 
530 	MDC_Get_child_fraction(
531 		p_consol_LPN_children=>p_consol_LPN_children,--Indexed by child detail id, value of parent consol detail id
532 		x_fraction=>l_fractions,
533 		x_return_status=>l_return_status);
534 
535 	IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS
536 	THEN
537 	       IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING
538 	       THEN
539 		  raise FTE_FREIGHT_PRICING_UTIL.g_MDC_get_chld_fract_fail;
540 	       END IF;
541 	END IF;
542 
543 
544 
545 	--Price records
546 
547 
548 	i:=p_consol_LPN_children.FIRST;
549 	WHILE(i IS NOT NULL)
550 	LOOP
551 
552 		l_dtl_fraction:=l_fractions(i);
553 
554 		l_LPN_rec_index:=l_price_ref(p_consol_LPN_children(i));
555 
556 		IF(p_save_flag='M')
557 		THEN
558 
559 			l_LPN_main_rec:=x_freight_cost_main_price(l_LPN_rec_index);
560 			l_child_dtl_main_rec:=l_LPN_main_rec;
561 			l_child_dtl_main_rec.delivery_id:=g_shipment_line_rows(i).delivery_id;
562 			l_child_dtl_main_rec.delivery_leg_id:=g_shipment_line_rows(i).delivery_leg_id;
563 			l_child_dtl_main_rec.delivery_detail_id:=i;
564 			l_child_dtl_main_rec.total_amount:=l_dtl_fraction*l_child_dtl_main_rec.total_amount;
565 			l_child_dtl_main_rec.unit_amount:=l_dtl_fraction*l_child_dtl_main_rec.unit_amount;
566 			l_child_dtl_main_rec.quantity:=l_dtl_fraction*l_child_dtl_main_rec.quantity;
567 			l_child_dtl_main_rec.billable_quantity:=l_dtl_fraction*l_child_dtl_main_rec.billable_quantity;
568 			l_child_dtl_main_rec.line_type_code:='PRICE';
569 			x_freight_cost_main_price(x_freight_cost_main_price.LAST+1):=l_child_dtl_main_rec;
570 
571 
572 		--ELSIF(p_save_flag='T')
573 		ELSE -- P or T
574 		--THEN
575 
576 			l_LPN_temp_rec:=x_freight_cost_temp_price(l_LPN_rec_index);
577 
578 			l_child_dtl_temp_rec:=l_LPN_temp_rec;
579 
580 			l_child_dtl_temp_rec.delivery_id:=g_shipment_line_rows(i).delivery_id;
581 
582 			l_child_dtl_temp_rec.delivery_leg_id:=g_shipment_line_rows(i).delivery_leg_id;
583 			l_child_dtl_temp_rec.delivery_detail_id:=i;
584 			l_child_dtl_temp_rec.total_amount:=l_dtl_fraction*l_child_dtl_temp_rec.total_amount;
585 			l_child_dtl_temp_rec.unit_amount:=l_dtl_fraction*l_child_dtl_temp_rec.unit_amount;
586 			l_child_dtl_temp_rec.quantity:=l_dtl_fraction*l_child_dtl_temp_rec.quantity;
587 			l_child_dtl_temp_rec.billable_quantity:=l_dtl_fraction*l_child_dtl_temp_rec.billable_quantity;
588 			l_child_dtl_temp_rec.line_type_code:='PRICE';
589 
590 			x_freight_cost_temp_price(x_freight_cost_temp_price.LAST+1):=l_child_dtl_temp_rec;
591 
592 
593 
594 		END IF;
595 
596 
597 
598 
599 		i:=p_consol_LPN_children.NEXT(i);
600 	END LOOP;
601 
602 
603 	--Charge records
604 
605 
606 
607 	i:=x_freight_cost_main_charge.FIRST;
608 	n:=x_freight_cost_main_charge.LAST;
609 	WHILE((i IS NOT NULL) AND (i<= n) )
610 	LOOP
611 
612 
613 		IF ((x_freight_cost_main_charge(i).delivery_detail_id IS NOT NULL)
614 		AND (p_consol_LPNs.EXISTS(x_freight_cost_main_charge(i).delivery_detail_id)))
615 		THEN
616 			j:=p_consol_LPN_children.FIRST;
617 			WHILE(j IS NOT NULL)
618 			LOOP
619 				IF(p_consol_LPN_children(j)=x_freight_cost_main_charge(i).delivery_detail_id)
620 				THEN
621 
622 					l_dtl_fraction:=l_fractions(j);
623 
624 					l_child_dtl_main_rec:=x_freight_cost_main_charge(i);
625 					l_child_dtl_main_rec.delivery_id:=g_shipment_line_rows(j).delivery_id;
626 					l_child_dtl_main_rec.delivery_leg_id:=g_shipment_line_rows(j).delivery_leg_id;
627 					l_child_dtl_main_rec.delivery_detail_id:=j;
628 					l_child_dtl_main_rec.total_amount:=l_dtl_fraction*l_child_dtl_main_rec.total_amount;
629 					l_child_dtl_main_rec.unit_amount:=l_dtl_fraction*l_child_dtl_main_rec.unit_amount;
630 					l_child_dtl_main_rec.quantity:=l_dtl_fraction*l_child_dtl_main_rec.quantity;
631 					l_child_dtl_main_rec.billable_quantity:=l_dtl_fraction*l_child_dtl_main_rec.billable_quantity;
632 					x_freight_cost_main_charge(x_freight_cost_main_charge.LAST+1):=l_child_dtl_main_rec;
633 
634 
635 
636 				END IF;
637 
638 				j:=p_consol_LPN_children.NEXT(j);
639 
640 			END LOOP;
641 			--Delete this charge for the consol LPN
642 			x_freight_cost_main_charge.DELETE(i);
643 
644 		END IF;
645 
646 		i:=x_freight_cost_main_charge.NEXT(i);
647 	END LOOP;
648 
649 
650 
651 
652 
653 	i:=x_freight_cost_temp_charge.FIRST;
654 	n:=x_freight_cost_temp_charge.LAST;
655 	WHILE((i IS NOT NULL) AND (i<= n) )
656 	LOOP
657 		IF ((x_freight_cost_temp_charge(i).delivery_detail_id IS NOT NULL)
658 		AND (p_consol_LPNs.EXISTS(x_freight_cost_temp_charge(i).delivery_detail_id)))
659 		THEN
660 			j:=p_consol_LPN_children.FIRST;
661 			WHILE(j IS NOT NULL)
662 			LOOP
663 				IF(p_consol_LPN_children(j)=x_freight_cost_temp_charge(i).delivery_detail_id)
664 				THEN
665 
666 					l_dtl_fraction:=l_fractions(j);
667 
668 					l_child_dtl_temp_rec:=x_freight_cost_temp_charge(i);
669 					l_child_dtl_temp_rec.delivery_id:=g_shipment_line_rows(j).delivery_id;
670 					l_child_dtl_temp_rec.delivery_leg_id:=g_shipment_line_rows(j).delivery_leg_id;
671 					l_child_dtl_temp_rec.delivery_detail_id:=j;
672 					l_child_dtl_temp_rec.total_amount:=l_dtl_fraction*l_child_dtl_temp_rec.total_amount;
673 					l_child_dtl_temp_rec.unit_amount:=l_dtl_fraction*l_child_dtl_temp_rec.unit_amount;
674 					l_child_dtl_temp_rec.quantity:=l_dtl_fraction*l_child_dtl_temp_rec.quantity;
675 					l_child_dtl_temp_rec.billable_quantity:=l_dtl_fraction*l_child_dtl_temp_rec.billable_quantity;
676 					x_freight_cost_temp_charge(x_freight_cost_temp_charge.LAST+1):=l_child_dtl_temp_rec;
677 
678 
679 
680 				END IF;
681 
682 				j:=p_consol_LPN_children.NEXT(j);
683 
684 			END LOOP;
685 			--Delete this charge for the consol LPN
686 			x_freight_cost_temp_charge.DELETE(i);
687 
688 		END IF;
689 
690 		i:=x_freight_cost_temp_charge.NEXT(i);
691 	END LOOP;
692 
693 
694 
695 
696 
697 
698 
699 
700 
701 	get_fc_type_id(
702 	   p_line_type_code => 'FTESUMMARY',
703 	   p_charge_subtype_code  => 'SUMMARY',
704 	   x_freight_cost_type_id  =>  l_freight_cost_type_id,
705 	   x_return_status  =>  l_return_status);
706 
707 	IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
708 		IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
709 		  raise FTE_FREIGHT_PRICING_UTIL.g_get_fc_type_failed;
710 		END IF;
711 	ELSE
712 		FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,'fc type id : '||l_freight_cost_type_id);
713 	END IF;
714 
715 
716 
717 	--Alter PRICE to SUMMARY for consol LPNs
718 
719 	i:=l_price_ref.FIRST;
720 	WHILE(i IS NOT NULL)
721 	LOOP
722 		IF(p_save_flag='M')
723 		THEN
724 
725 			x_freight_cost_main_price(l_price_ref(i)).line_type_code:='SUMMARY';
726 
727 			x_freight_cost_main_price(l_price_ref(i)).freight_cost_type_id:=l_freight_cost_type_id;
728 		ELSE--(p_save_flag='T') or P
729 		--THEN
730 			x_freight_cost_temp_price(l_price_ref(i)).line_type_code:='SUMMARY';
731 
732 			x_freight_cost_temp_price(l_price_ref(i)).freight_cost_type_id:=l_freight_cost_type_id;
733 
734 
735 		END IF;
736 
737 		i:=l_price_ref.NEXT(i);
738 	END LOOP;
739 
740 
741 	--Remove gaps in x_freight_cost_main_charge
742 
743 	i:=x_freight_cost_main_charge.FIRST;
744 	j:=i;
745 	WHILE(i IS NOT NULL)
746 	LOOP
747 		IF(j <> i)
748 		THEN
749 			x_freight_cost_main_charge(j):=x_freight_cost_main_charge(i);
750 
751 		END IF;
752 
753 
754 		j:=j+1;
755 		i:=x_freight_cost_main_charge.NEXT(i);
756 	END LOOP;
757 
758 
759 	--Remove gaps in x_freight_cost_temp_charge
760 
761 	i:=x_freight_cost_temp_charge.FIRST;
762 	j:=i;
763 	WHILE(i IS NOT NULL)
764 	LOOP
765 		IF(j <> i)
766 		THEN
767 			x_freight_cost_temp_charge(j):=x_freight_cost_temp_charge(i);
768 
769 		END IF;
770 
771 
772 		j:=j+1;
773 		i:=x_freight_cost_temp_charge.NEXT(i);
774 	END LOOP;
775 
776 	FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'MDC_Alloc_From_consol_LPN');
777 
778 EXCEPTION
779 
780    WHEN FTE_FREIGHT_PRICING_UTIL.g_MDC_Get_LPN_cost_rec_fail THEN
781         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
782         FTE_FREIGHT_PRICING_UTIL.set_exception('MDC_Alloc_From_consol_LPN',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_MDC_Get_LPN_cost_rec_fail');
783         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'MDC_Alloc_From_consol_LPN');
784 
785 
786    WHEN FTE_FREIGHT_PRICING_UTIL.g_MDC_get_chld_fract_fail THEN
787         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
788         FTE_FREIGHT_PRICING_UTIL.set_exception('MDC_Alloc_From_consol_LPN',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_MDC_get_chld_fract_fail');
789         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'MDC_Alloc_From_consol_LPN');
790 
791 
792    WHEN FTE_FREIGHT_PRICING_UTIL.g_get_fc_type_failed THEN
793         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
794         FTE_FREIGHT_PRICING_UTIL.set_exception('MDC_Alloc_From_consol_LPN',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_get_fc_type_failed');
795         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'MDC_Alloc_From_consol_LPN');
796    WHEN others THEN
797         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
798         FTE_FREIGHT_PRICING_UTIL.set_exception('MDC_Alloc_From_consol_LPN',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
799         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
800         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'MDC_Alloc_From_consol_LPN');
801 
802 
803 
804 END MDC_Alloc_From_consol_LPN;
805 
806 
807 PROCEDURE Create_Parent_Dleg_Summaries(
808 	p_save_flag               IN     VARCHAR2, -- Whether to save to TEMP table or temp table
809 	p_parent_dlegs IN DBMS_UTILITY.NUMBER_ARRAY,--Indexed by parent dleg id
810 	p_child_dlegs IN DBMS_UTILITY.NUMBER_ARRAY,--Indexed by child dleg id, value of parent dleg id
811 	p_dleg_to_delivery IN DBMS_UTILITY.NUMBER_ARRAY,
812         x_freight_cost_main_price IN OUT NOCOPY Freight_Cost_main_Tab_Type,
813         x_freight_cost_temp_price IN OUT NOCOPY Freight_Cost_temp_Tab_Type,
814 	x_return_status           OUT NOCOPY     VARCHAR2) IS
815 i	NUMBER;
816 l_parent_dleg_summaries DBMS_UTILITY.NUMBER_ARRAY;
817 l_existing_dlegs DBMS_UTILITY.NUMBER_ARRAY;
818 l_freight_cost_temp_price Freight_Cost_temp_Rec_Type;
819 l_freight_cost_main_price WSH_FREIGHT_COSTS_PVT.Freight_Cost_Rec_Type;
820 l_return_status VARCHAR2(1);
821 l_index NUMBER;
822 l_log_level     NUMBER := FTE_FREIGHT_PRICING_UTIL.G_DBG;
823 
824 BEGIN
825 	x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
826 	FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
827 	FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,'Create_Parent_Dleg_Summaries','start');
828 
829 
830 
831 
832 	i:=x_freight_cost_main_price.FIRST;
833 	WHILE(i IS NOT NULL)
834 	LOOP
835 
836 		IF ((x_freight_cost_main_price(i).delivery_leg_id IS NOT NULL)
837 		AND (x_freight_cost_main_price(i).delivery_detail_id IS NULL)
838 		AND (p_child_dlegs.EXISTS(x_freight_cost_main_price(i).delivery_leg_id)))
839 		THEN
840 
841 
842 			IF(l_parent_dleg_summaries.EXISTS(p_child_dlegs(x_freight_cost_main_price(i).delivery_leg_id)))
843 			THEN
844 
845 				l_parent_dleg_summaries(p_child_dlegs(x_freight_cost_main_price(i).delivery_leg_id)):=
846 				 l_parent_dleg_summaries(p_child_dlegs(x_freight_cost_main_price(i).delivery_leg_id))
847 				 +x_freight_cost_main_price(i).total_amount;
848 			ELSE
849 
850 				l_parent_dleg_summaries(p_child_dlegs(x_freight_cost_main_price(i).delivery_leg_id)):=
851 				 x_freight_cost_main_price(i).total_amount;
852 
853 				l_freight_cost_main_price:=x_freight_cost_main_price(i);
854 			END IF;
855 
856 		END IF;
857 
858 		IF ((x_freight_cost_main_price(i).delivery_leg_id IS NOT NULL)
859 		AND (x_freight_cost_main_price(i).delivery_detail_id IS NULL)
860 		AND (p_parent_dlegs.EXISTS(x_freight_cost_main_price(i).delivery_leg_id)))
861 		THEN
862 
863 			l_existing_dlegs(x_freight_cost_main_price(i).delivery_leg_id):=i;
864 
865 		END IF;
866 
867 		i:=x_freight_cost_main_price.NEXT(i);
868 	END LOOP;
869 
870 
871 	i:=x_freight_cost_temp_price.FIRST;
872 	WHILE(i IS NOT NULL)
873 	LOOP
874 
875 		IF ((x_freight_cost_temp_price(i).delivery_leg_id IS NOT NULL)
876 		AND (x_freight_cost_temp_price(i).delivery_detail_id IS NULL)
877 		AND (p_child_dlegs.EXISTS(x_freight_cost_temp_price(i).delivery_leg_id)))
878 		THEN
879 
880 			IF(l_parent_dleg_summaries.EXISTS(p_child_dlegs(x_freight_cost_temp_price(i).delivery_leg_id)))
881 			THEN
882 
883 				l_parent_dleg_summaries(p_child_dlegs(x_freight_cost_temp_price(i).delivery_leg_id)):=
884 				 l_parent_dleg_summaries(p_child_dlegs(x_freight_cost_temp_price(i).delivery_leg_id))
885 				 +x_freight_cost_temp_price(i).total_amount;
886 			ELSE
887 
888 				l_parent_dleg_summaries(p_child_dlegs(x_freight_cost_temp_price(i).delivery_leg_id)):=
889 				 x_freight_cost_temp_price(i).total_amount;
890 
891 				l_freight_cost_temp_price:=x_freight_cost_temp_price(i);
892 			END IF;
893 
894 		END IF;
895 
896 
897 		IF ((x_freight_cost_temp_price(i).delivery_leg_id IS NOT NULL)
898 		AND (x_freight_cost_temp_price(i).delivery_detail_id IS NULL)
899 		AND (p_parent_dlegs.EXISTS(x_freight_cost_temp_price(i).delivery_leg_id)))
900 		THEN
901 
902 			l_existing_dlegs(x_freight_cost_temp_price(i).delivery_leg_id):=i;
903 		END IF;
904 
905 		i:=x_freight_cost_temp_price.NEXT(i);
906 	END LOOP;
907 
908 
909 	i:=l_parent_dleg_summaries.FIRST;
910 	WHILE(i IS NOT NULL)
911 	LOOP
912 
913 		IF  ( l_existing_dlegs.EXISTS(i))
914 		THEN
915 
916 			IF(p_save_flag='M')
917 			THEN
918 				x_freight_cost_main_price(l_existing_dlegs(i)).total_amount:=l_parent_dleg_summaries(i);
919 				x_freight_cost_main_price(l_existing_dlegs(i)).unit_amount:=l_parent_dleg_summaries(i);
920 			ELSE--(p_save_flag='T')
921 			--THEN
922 				x_freight_cost_temp_price(l_existing_dlegs(i)).total_amount:=l_parent_dleg_summaries(i);
923 				x_freight_cost_temp_price(l_existing_dlegs(i)).unit_amount:=l_parent_dleg_summaries(i);
924 			END IF;
925 
926 
927 		ELSE
928 
929 
930 			IF(p_save_flag='M')
931 			THEN
932 
933 				--get fc id for dleg
934 				l_freight_cost_main_price.freight_cost_id:=FTE_FREIGHT_PRICING.get_fc_id_from_dleg(i);
935 
936 				l_freight_cost_main_price.delivery_leg_id:=i;
937 
938 				l_freight_cost_main_price.delivery_id:=p_dleg_to_delivery(i);
939 
940 				l_freight_cost_main_price.total_amount:=l_parent_dleg_summaries(i);
941 				l_freight_cost_main_price.unit_amount:=l_parent_dleg_summaries(i);
942 
943 				x_freight_cost_main_price(x_freight_cost_main_price.LAST+1):=l_freight_cost_main_price;
944 
945 
946 			ELSE--(p_save_flag='T') or P
947 			--THEN
948 
949 				l_freight_cost_temp_price.delivery_leg_id:=i;
950 
951 				l_freight_cost_temp_price.delivery_id:=p_dleg_to_delivery(i);
952 
953 				l_freight_cost_temp_price.total_amount:=l_parent_dleg_summaries(i);
954 				l_freight_cost_temp_price.unit_amount:=l_parent_dleg_summaries(i);
955 
956 				l_index:=x_freight_cost_temp_price.LAST+1;
957 				x_freight_cost_temp_price(l_index):=l_freight_cost_temp_price;
958 
959 
960 			END IF;
961 
962 		END IF;
963 		i:=l_parent_dleg_summaries.NEXT(i);
964 	END LOOP;
965 
966 	FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'Create_Parent_Dleg_Summaries');
967 
968 EXCEPTION
969    WHEN others THEN
970         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
971         FTE_FREIGHT_PRICING_UTIL.set_exception('Create_Parent_Dleg_Summaries',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
972         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
973         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'Create_Parent_Dleg_Summaries');
974 
975 END Create_Parent_Dleg_Summaries;
976 
977 
978 PROCEDURE Create_Child_Dleg_Summaries(
979 	p_save_flag               IN     VARCHAR2, -- Whether to save to TEMP table or temp table
980 	p_dleg_to_delivery IN DBMS_UTILITY.NUMBER_ARRAY,
981 	p_parent_dlegs IN DBMS_UTILITY.NUMBER_ARRAY,--Indexed by parent dleg id
982 	p_child_dlegs IN DBMS_UTILITY.NUMBER_ARRAY,--Indexed by child dleg id, value of parent dleg id
983         x_freight_cost_main_price IN OUT NOCOPY Freight_Cost_main_Tab_Type,
984         x_fc_main_update_rows IN OUT NOCOPY Freight_Cost_main_Tab_Type,
985         x_freight_cost_temp_price IN OUT NOCOPY Freight_Cost_temp_Tab_Type,
986 	x_return_status           OUT NOCOPY     VARCHAR2) IS
987 
988 l_child_dleg_summaries DBMS_UTILITY.NUMBER_ARRAY;
989 l_existing_dlegs DBMS_UTILITY.NUMBER_ARRAY;
990 i	NUMBER;
991 l_freight_cost_main_price WSH_FREIGHT_COSTS_PVT.Freight_Cost_Rec_Type;
992 l_freight_cost_temp_price Freight_Cost_Temp_Rec_Type;
993 l_freight_cost_type_id NUMBER;
994 l_return_status VARCHAR2(1);
995 l_log_level     NUMBER := FTE_FREIGHT_PRICING_UTIL.G_DBG;
996 
997 BEGIN
998 	x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
999 	FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
1000 	FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,'Create_Child_Dleg_Summaries','start');
1001 
1002 
1003 
1004 	i:=x_freight_cost_main_price.FIRST;
1005 	WHILE(i IS NOT NULL)
1006 	LOOP
1007 		IF((x_freight_cost_main_price(i).delivery_detail_id IS NOT NULL)
1008 		AND (x_freight_cost_main_price(i).line_type_code ='PRICE')
1009 		AND (x_freight_cost_main_price(i).delivery_leg_id IS NOT NULL)
1010 		AND(p_child_dlegs.EXISTS(x_freight_cost_main_price(i).delivery_leg_id)))
1011 		THEN
1012 
1013 			l_freight_cost_main_price:=x_freight_cost_main_price(i);
1014 
1015 			IF(l_child_dleg_summaries.EXISTS(x_freight_cost_main_price(i).delivery_leg_id))
1016 			THEN
1017 				l_child_dleg_summaries(x_freight_cost_main_price(i).delivery_leg_id):=
1018 				 l_child_dleg_summaries(x_freight_cost_main_price(i).delivery_leg_id)
1019 				 +x_freight_cost_main_price(i).total_amount;
1020 			ELSE
1021 				l_child_dleg_summaries(x_freight_cost_main_price(i).delivery_leg_id):=
1022 				 x_freight_cost_main_price(i).total_amount;
1023 
1024 			END IF;
1025 
1026 		END IF;
1027 
1028 		IF((x_freight_cost_main_price(i).delivery_detail_id IS NULL)
1029 		AND (x_freight_cost_main_price(i).line_type_code ='SUMMARY')
1030 		AND (x_freight_cost_main_price(i).delivery_leg_id IS NOT NULL)
1031 		AND(p_child_dlegs.EXISTS(x_freight_cost_main_price(i).delivery_leg_id)))
1032 		THEN
1033 			l_existing_dlegs(x_freight_cost_main_price(i).delivery_leg_id):=i;
1034 
1035 		END IF;
1036 
1037 		i:=x_freight_cost_main_price.NEXT(i);
1038 	END LOOP;
1039 
1040 
1041 
1042 	i:=x_freight_cost_temp_price.FIRST;
1043 	WHILE(i IS NOT NULL)
1044 	LOOP
1045 		IF((x_freight_cost_temp_price(i).delivery_detail_id IS NOT NULL)
1046 		AND (x_freight_cost_temp_price(i).line_type_code ='PRICE')
1047 		AND (x_freight_cost_temp_price(i).delivery_leg_id IS NOT NULL)
1048 		AND(p_child_dlegs.EXISTS(x_freight_cost_temp_price(i).delivery_leg_id)))
1049 		THEN
1050 
1051 			l_freight_cost_temp_price:=x_freight_cost_temp_price(i);
1052 			IF(l_child_dleg_summaries.EXISTS(x_freight_cost_temp_price(i).delivery_leg_id))
1053 			THEN
1054 				l_child_dleg_summaries(x_freight_cost_temp_price(i).delivery_leg_id):=
1055 				 l_child_dleg_summaries(x_freight_cost_temp_price(i).delivery_leg_id)
1056 				 +x_freight_cost_temp_price(i).total_amount;
1057 			ELSE
1058 				l_child_dleg_summaries(x_freight_cost_temp_price(i).delivery_leg_id):=
1059 				 x_freight_cost_temp_price(i).total_amount;
1060 
1061 			END IF;
1062 
1063 		END IF;
1064 
1065 
1066 		IF((x_freight_cost_temp_price(i).delivery_detail_id IS  NULL)
1067 		AND (x_freight_cost_temp_price(i).line_type_code ='SUMMARY')
1068 		AND (x_freight_cost_temp_price(i).delivery_leg_id IS NOT NULL)
1069 		AND(p_child_dlegs.EXISTS(x_freight_cost_temp_price(i).delivery_leg_id)))
1070 		THEN
1071 
1072 			l_existing_dlegs(x_freight_cost_temp_price(i).delivery_leg_id):=i;
1073 		END IF;
1074 
1075 		i:=x_freight_cost_temp_price.NEXT(i);
1076 	END LOOP;
1077 
1078 
1079 
1080 	get_fc_type_id(
1081 	   p_line_type_code => 'FTESUMMARY',
1082 	   p_charge_subtype_code  => 'SUMMARY',
1083 	   x_freight_cost_type_id  =>  l_freight_cost_type_id,
1084 	   x_return_status  =>  l_return_status);
1085 
1086 	IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
1087 		IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
1088 		  raise FTE_FREIGHT_PRICING_UTIL.g_get_fc_type_failed;
1089 		END IF;
1090 	ELSE
1091 		FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,'fc type id : '||l_freight_cost_type_id);
1092 	END IF;
1093 
1094 	l_freight_cost_main_price.freight_cost_type_id:=l_freight_cost_type_id;
1095 	l_freight_cost_main_price.line_type_code:='SUMMARY';
1096 	l_freight_cost_main_price.delivery_detail_id:=NULL;
1097 	l_freight_cost_main_price.quantity:=NULL;
1098 	l_freight_cost_main_price.uom:=NULL;
1099 	l_freight_cost_main_price.billable_basis:=NULL;
1100 	l_freight_cost_main_price.billable_quantity:=NULL;
1101 	l_freight_cost_main_price.billable_uom:=NULL;
1102 	l_freight_cost_main_price.charge_unit_value:=NULL;
1103 
1104 	l_freight_cost_temp_price.freight_cost_type_id:=l_freight_cost_type_id;
1105 	l_freight_cost_temp_price.line_type_code:='SUMMARY';
1106 	l_freight_cost_temp_price.delivery_detail_id:=NULL;
1107 	l_freight_cost_temp_price.quantity:=NULL;
1108 	l_freight_cost_temp_price.uom:=NULL;
1109 	l_freight_cost_temp_price.billable_basis:=NULL;
1110 	l_freight_cost_temp_price.billable_quantity:=NULL;
1111 	l_freight_cost_temp_price.billable_uom:=NULL;
1112 	l_freight_cost_temp_price.charge_unit_value:=NULL;
1113 
1114 
1115 	i:=l_child_dleg_summaries.FIRST;
1116 	WHILE(i IS NOT NULL)
1117 	LOOP
1118 		--Some dlegs may already have summaries created
1119 		--over write their amounts
1120 		IF  ( l_existing_dlegs.EXISTS(i))
1121 		THEN
1122 
1123 			IF(p_save_flag='M')
1124 			THEN
1125 				x_fc_main_update_rows(l_existing_dlegs(i)).total_amount:=l_child_dleg_summaries(i);
1126 				x_fc_main_update_rows(l_existing_dlegs(i)).unit_amount:=l_child_dleg_summaries(i);
1127 			ELSE--(p_save_flag='T') or P
1128 			--THEN
1129 				x_freight_cost_temp_price(l_existing_dlegs(i)).total_amount:=l_child_dleg_summaries(i);
1130 				x_freight_cost_temp_price(l_existing_dlegs(i)).unit_amount:=l_child_dleg_summaries(i);
1131 			END IF;
1132 
1133 
1134 		ELSE
1135 			IF(p_save_flag='M')
1136 			THEN
1137 
1138 
1139 				l_freight_cost_main_price.freight_cost_id:=FTE_FREIGHT_PRICING.get_fc_id_from_dleg(i);
1140 
1141 
1142 				l_freight_cost_main_price.total_amount:=l_child_dleg_summaries(i);
1143 				l_freight_cost_main_price.unit_amount:=l_child_dleg_summaries(i);
1144 				l_freight_cost_main_price.delivery_leg_id:=i;
1145 				l_freight_cost_main_price.delivery_id:=p_dleg_to_delivery(i);
1146 
1147 				x_fc_main_update_rows(x_fc_main_update_rows.LAST+1):=l_freight_cost_main_price;
1148 
1149 			ELSE--IF(p_save_flag='T') or P
1150 			--THEN
1151 
1152 				l_freight_cost_temp_price.total_amount:=l_child_dleg_summaries(i);
1153 				l_freight_cost_temp_price.unit_amount:=l_child_dleg_summaries(i);
1154 				l_freight_cost_temp_price.delivery_leg_id:=i;
1155 				l_freight_cost_temp_price.delivery_id:=p_dleg_to_delivery(i);
1156 
1157 				x_freight_cost_temp_price(x_freight_cost_temp_price.LAST+1):=l_freight_cost_temp_price;
1158 
1159 
1160 			END IF;
1161 
1162 		END IF;
1163 
1164 		i:=l_child_dleg_summaries.NEXT(i);
1165 	END LOOP;
1166 
1167 	FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'Create_Child_Dleg_Summaries');
1168 
1169 EXCEPTION
1170    WHEN FTE_FREIGHT_PRICING_UTIL.g_get_fc_type_failed THEN
1171         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1172         FTE_FREIGHT_PRICING_UTIL.set_exception('Create_Child_Dleg_Summaries',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_get_fc_type_failed');
1173         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'Create_Child_Dleg_Summaries');
1174    WHEN others THEN
1175         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
1176         FTE_FREIGHT_PRICING_UTIL.set_exception('Create_Child_Dleg_Summaries',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
1177         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
1178         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'Create_Child_Dleg_Summaries');
1179 
1180 
1181 END Create_Child_Dleg_Summaries;
1182 
1183 
1184 PROCEDURE Populate_Dleg_Id(
1185 	p_delivery_to_dleg IN DBMS_UTILITY.NUMBER_ARRAY,
1186 	x_freight_cost_temp  IN OUT NOCOPY Freight_Cost_Temp_Tab_Type,
1187 	x_return_status           OUT NOCOPY     VARCHAR2 ) IS
1188 
1189 i	NUMBER;
1190 l_log_level     NUMBER := FTE_FREIGHT_PRICING_UTIL.G_DBG;
1191 
1192 BEGIN
1193 	x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
1194 	FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
1195 	FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,'Populate_Dleg_Id','start');
1196 
1197 
1198 	i:=x_freight_cost_temp.FIRST;
1199 	WHILE( i IS NOT NULL)
1200 	LOOP
1201 		IF((x_freight_cost_temp(i).delivery_id IS NOT NULL)
1202 		AND (x_freight_cost_temp(i).delivery_leg_id IS NULL)
1203 		AND(p_delivery_to_dleg.EXISTS(x_freight_cost_temp(i).delivery_id)))
1204 		THEN
1205 
1206 			x_freight_cost_temp(i).delivery_leg_id:=
1207 				p_delivery_to_dleg(x_freight_cost_temp(i).delivery_id);
1208 
1209 		END IF;
1210 
1211 		i:=x_freight_cost_temp.NEXT(i);
1212 	END LOOP;
1213 	FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'Populate_Dleg_Id');
1214 
1215 EXCEPTION
1216    WHEN others THEN
1217         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
1218         FTE_FREIGHT_PRICING_UTIL.set_exception('Populate_Dleg_Id',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
1219         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
1220         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'Populate_Dleg_Id');
1221 
1222 
1223 END Populate_Dleg_Id;
1224 
1225 PROCEDURE Create_LPN_Summary(
1226 	p_save_flag               IN     VARCHAR2, -- Whether to save to TEMP table or temp table
1227 	p_consol_LPN_children IN DBMS_UTILITY.NUMBER_ARRAY,--Indexed by child detail id, value of parent consol detail id
1228         x_freight_cost_main_price IN OUT NOCOPY Freight_Cost_Main_Tab_Type,
1229         x_freight_cost_temp_price IN OUT NOCOPY Freight_Cost_temp_Tab_Type,
1230         x_freight_cost_main_charge IN OUT NOCOPY Freight_Cost_Main_Tab_Type,
1231         x_freight_cost_temp_charge IN OUT NOCOPY Freight_Cost_temp_Tab_Type,
1232 	x_return_status           OUT NOCOPY     VARCHAR2) IS
1233 
1234 i	NUMBER;
1235 l_LPN_summaries DBMS_UTILITY.NUMBER_ARRAY;
1236 l_existing_LPN DBMS_UTILITY.NUMBER_ARRAY;--If it is required to update existing LPN summaries
1237 l_freight_cost_main_price WSH_FREIGHT_COSTS_PVT.Freight_Cost_Rec_Type;
1238 l_freight_cost_temp_price Freight_Cost_temp_Rec_Type;
1239 l_freight_cost_type_id NUMBER;
1240 l_return_status VARCHAR2(1);
1241 
1242 l_log_level     NUMBER := FTE_FREIGHT_PRICING_UTIL.G_DBG;
1243 
1244 BEGIN
1245 	x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
1246 	FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
1247 	FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,'Create_LPN_Summary','start');
1248 
1249 
1250 	i:=x_freight_cost_main_price.FIRST;
1251 	WHILE(i IS NOT NULL)
1252 	LOOP
1253 		IF ((x_freight_cost_main_price(i).delivery_detail_id IS NOT NULL)
1254 		AND(x_freight_cost_main_price(i).line_type_code='PRICE')
1255 		AND (p_consol_LPN_children.EXISTS(x_freight_cost_main_price(i).delivery_detail_id)))
1256 		THEN
1257 
1258 			IF(l_LPN_summaries.EXISTS(p_consol_LPN_children(x_freight_cost_main_price(i).delivery_detail_id)))
1259 			THEN
1260 				l_LPN_summaries(p_consol_LPN_children(x_freight_cost_main_price(i).delivery_detail_id)):=
1261 				 l_LPN_summaries(p_consol_LPN_children(x_freight_cost_main_price(i).delivery_detail_id))
1262 				 +x_freight_cost_main_price(i).total_amount;
1263 			ELSE
1264 
1265 				l_LPN_summaries(p_consol_LPN_children(x_freight_cost_main_price(i).delivery_detail_id)):=
1266 				 x_freight_cost_main_price(i).total_amount;
1267 
1268 				l_freight_cost_main_price:=x_freight_cost_main_price(i);
1269 			END IF;
1270 
1271 		END IF;
1272 
1273 		i:=x_freight_cost_main_price.NEXT(i);
1274 	END LOOP;
1275 
1276 
1277 	i:=x_freight_cost_temp_price.FIRST;
1278 	WHILE(i IS NOT NULL)
1279 	LOOP
1280 		IF ((x_freight_cost_temp_price(i).delivery_detail_id IS NOT NULL)
1281 		AND(x_freight_cost_temp_price(i).line_type_code='PRICE')
1282 		AND (p_consol_LPN_children.EXISTS(x_freight_cost_temp_price(i).delivery_detail_id)))
1283 		THEN
1284 
1285 			IF(l_LPN_summaries.EXISTS(p_consol_LPN_children(x_freight_cost_temp_price(i).delivery_detail_id)))
1286 			THEN
1287 				l_LPN_summaries(p_consol_LPN_children(x_freight_cost_temp_price(i).delivery_detail_id)):=
1288 				 l_LPN_summaries(p_consol_LPN_children(x_freight_cost_temp_price(i).delivery_detail_id))
1289 				 +x_freight_cost_temp_price(i).total_amount;
1290 			ELSE
1291 
1292 				l_LPN_summaries(p_consol_LPN_children(x_freight_cost_temp_price(i).delivery_detail_id)):=
1293 				 x_freight_cost_temp_price(i).total_amount;
1294 
1295 				l_freight_cost_temp_price:=x_freight_cost_temp_price(i);
1296 			END IF;
1297 
1298 		END IF;
1299 
1300 		i:=x_freight_cost_temp_price.NEXT(i);
1301 	END LOOP;
1302 
1303 
1304 	get_fc_type_id(
1305 	   p_line_type_code => 'FTESUMMARY',
1306 	   p_charge_subtype_code  => 'SUMMARY',
1307 	   x_freight_cost_type_id  =>  l_freight_cost_type_id,
1308 	   x_return_status  =>  l_return_status);
1309 
1310 	IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
1311 		IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
1312 		  raise FTE_FREIGHT_PRICING_UTIL.g_get_fc_type_failed;
1313 		END IF;
1314 	ELSE
1315 		FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,'fc type id : '||l_freight_cost_type_id);
1316 	END IF;
1317 
1318 	l_freight_cost_main_price.freight_cost_type_id:=l_freight_cost_type_id;
1319 	l_freight_cost_main_price.line_type_code:='SUMMARY';
1320 	l_freight_cost_main_price.delivery_detail_id:=NULL;
1321 	l_freight_cost_main_price.quantity:=NULL;
1322 	l_freight_cost_main_price.uom:=NULL;
1323 	l_freight_cost_main_price.billable_basis:=NULL;
1324 	l_freight_cost_main_price.billable_quantity:=NULL;
1325 	l_freight_cost_main_price.billable_uom:=NULL;
1326 	l_freight_cost_main_price.charge_unit_value:=NULL;
1327 
1328 	l_freight_cost_temp_price.freight_cost_type_id:=l_freight_cost_type_id;
1329 	l_freight_cost_temp_price.line_type_code:='SUMMARY';
1330 	l_freight_cost_temp_price.delivery_detail_id:=NULL;
1331 	l_freight_cost_temp_price.quantity:=NULL;
1332 	l_freight_cost_temp_price.uom:=NULL;
1333 	l_freight_cost_temp_price.billable_basis:=NULL;
1334 	l_freight_cost_temp_price.billable_quantity:=NULL;
1335 	l_freight_cost_temp_price.billable_uom:=NULL;
1336 	l_freight_cost_temp_price.charge_unit_value:=NULL;
1337 
1338 
1339 
1340 	i:=l_LPN_summaries.FIRST;
1341 	WHILE(i IS NOT NULL)
1342 	LOOP
1343 		IF(p_save_flag='M')
1344 		THEN
1345 
1346 			l_freight_cost_main_price.delivery_detail_id:=i;
1347 			l_freight_cost_main_price.delivery_id:=g_shipment_line_rows(i).delivery_id;
1348 			l_freight_cost_main_price.delivery_leg_id:=g_shipment_line_rows(i).delivery_leg_id;
1349 
1350 			l_freight_cost_main_price.total_amount:=l_LPN_summaries(i);
1351 			l_freight_cost_main_price.unit_amount:=l_LPN_summaries(i);
1352 			x_freight_cost_main_price(x_freight_cost_main_price.LAST+1):=l_freight_cost_main_price;
1353 
1354 
1355 		ELSE--(p_save_flag='T') or P
1356 		--THEN
1357 			l_freight_cost_temp_price.delivery_detail_id:=i;
1358 			l_freight_cost_temp_price.delivery_id:=g_shipment_line_rows(i).delivery_id;
1359 			l_freight_cost_temp_price.delivery_leg_id:=g_shipment_line_rows(i).delivery_leg_id;
1360 
1361 			l_freight_cost_temp_price.total_amount:=l_LPN_summaries(i);
1362 			l_freight_cost_temp_price.unit_amount:=l_LPN_summaries(i);
1363 			x_freight_cost_temp_price(x_freight_cost_temp_price.LAST+1):=l_freight_cost_temp_price;
1364 
1365 		END IF;
1366 
1367 		i:=l_LPN_summaries.NEXT(i);
1368 	END LOOP;
1369 
1370 	FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'Create_LPN_Summary');
1371 
1372 EXCEPTION
1373    WHEN FTE_FREIGHT_PRICING_UTIL.g_get_fc_type_failed THEN
1374         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1375         FTE_FREIGHT_PRICING_UTIL.set_exception('Create_LPN_Summary',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_get_fc_type_failed');
1376         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'Create_LPN_Summary');
1377    WHEN others THEN
1378         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
1379         FTE_FREIGHT_PRICING_UTIL.set_exception('Create_LPN_Summary',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
1380         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
1381         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'Create_LPN_Summary');
1382 
1383 
1384 END Create_LPN_Summary;
1385 
1386 PROCEDURE MDC_Check_Rated(
1387 	p_save_flag               IN     VARCHAR2, -- Whether to save to TEMP table or temp table
1388 	p_consol_LPNs IN DBMS_UTILITY.NUMBER_ARRAY,--Indexed by consol LPN detail id
1389 	p_consol_LPN_children IN DBMS_UTILITY.NUMBER_ARRAY,--Indexed by child detail id, value of parent consol detail id
1390 	p_parent_dlegs IN DBMS_UTILITY.NUMBER_ARRAY,--Indexed by parent dleg id
1391 	p_child_dlegs IN DBMS_UTILITY.NUMBER_ARRAY,--Indexed by child dleg id, value of parent dleg id
1392 	p_freight_cost_main_price IN Freight_Cost_Main_Tab_Type,
1393 	p_freight_cost_temp_price  IN Freight_Cost_Temp_Tab_Type,
1394 	p_fc_main_update_rows     IN Freight_Cost_Main_Tab_Type,  -- For update of SUMMARY records
1395 	x_child_details_rated	OUT NOCOPY	VARCHAR2,
1396 	x_consol_LPNs_rated	OUT NOCOPY	VARCHAR2,
1397 	x_child_dlegs_rated	OUT NOCOPY	VARCHAR2,
1398 	x_parent_dlegs_rated	OUT NOCOPY	VARCHAR2,
1399         x_return_status	OUT NOCOPY	VARCHAR2) IS
1400 
1401 
1402 l_child_detail_rated DBMS_UTILITY.NUMBER_ARRAY;
1403 l_consol_LPN_rated DBMS_UTILITY.NUMBER_ARRAY;
1404 l_child_dlegs_rated DBMS_UTILITY.NUMBER_ARRAY;
1405 l_parent_dlegs_rated DBMS_UTILITY.NUMBER_ARRAY;
1406 i NUMBER;
1407 l_return_status VARCHAR2(1);
1408 
1409 l_log_level     NUMBER := FTE_FREIGHT_PRICING_UTIL.G_DBG;
1410 
1411 BEGIN
1412 	x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
1413 	FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
1414 	FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,'MDC_Check_Rated','start');
1415 
1416 
1417 	l_child_detail_rated.DELETE;
1418 	l_consol_LPN_rated.DELETE;
1419 
1420 	l_child_dlegs_rated.DELETE;
1421 	l_parent_dlegs_rated.DELETE;
1422 
1423 
1424 	x_child_details_rated:='N';
1425 	x_consol_LPNs_rated:='N';
1426 	x_child_dlegs_rated:='N';
1427 	x_parent_dlegs_rated:='N';
1428 
1429 
1430 	i:=p_freight_cost_main_price.FIRST;
1431 	WHILE(i IS NOT NULL)
1432 	LOOP
1433 		IF ((p_freight_cost_main_price(i).delivery_detail_id IS NOT NULL)
1434 		AND (p_consol_LPN_children.EXISTS(p_freight_cost_main_price(i).delivery_detail_id)))
1435 		THEN
1436 			l_child_detail_rated(p_freight_cost_main_price(i).delivery_detail_id):=1;
1437 
1438 		END IF;
1439 
1440 		IF ((p_freight_cost_main_price(i).delivery_detail_id IS NOT NULL)
1441 		AND (p_consol_LPNs.EXISTS(p_freight_cost_main_price(i).delivery_detail_id)))
1442 		THEN
1443 			l_consol_LPN_rated(p_freight_cost_main_price(i).delivery_detail_id):=1;
1444 
1445 		END IF;
1446 
1447 
1448 		i:=p_freight_cost_main_price.NEXT(i);
1449 	END LOOP;
1450 
1451 
1452 	i:=p_freight_cost_temp_price.FIRST;
1453 	WHILE(i IS NOT NULL)
1454 	LOOP
1455 		IF ((p_freight_cost_temp_price(i).delivery_detail_id IS NOT NULL)
1456 		AND (p_consol_LPN_children.EXISTS(p_freight_cost_temp_price(i).delivery_detail_id)))
1457 		THEN
1458 			l_child_detail_rated(p_freight_cost_temp_price(i).delivery_detail_id):=1;
1459 
1460 		END IF;
1461 
1462 		IF ((p_freight_cost_temp_price(i).delivery_detail_id IS NOT NULL)
1463 		AND (p_consol_LPNs.EXISTS(p_freight_cost_temp_price(i).delivery_detail_id)))
1464 		THEN
1465 			l_consol_LPN_rated(p_freight_cost_temp_price(i).delivery_detail_id):=1;
1466 
1467 		END IF;
1468 
1469 
1470 		IF ((p_freight_cost_temp_price(i).delivery_detail_id IS NULL)
1471 		AND (p_freight_cost_temp_price(i).delivery_leg_id IS NOT NULL)
1472 		AND (p_child_dlegs.EXISTS(p_freight_cost_temp_price(i).delivery_leg_id)))
1473 		THEN
1474 			l_child_dlegs_rated(p_freight_cost_temp_price(i).delivery_leg_id):=1;
1475 
1476 		END IF;
1477 
1478 		IF ((p_freight_cost_temp_price(i).delivery_detail_id IS NULL)
1479 		AND (p_freight_cost_temp_price(i).delivery_leg_id IS NOT NULL)
1480 		AND (p_parent_dlegs.EXISTS(p_freight_cost_temp_price(i).delivery_leg_id)))
1481 		THEN
1482 			l_parent_dlegs_rated(p_freight_cost_temp_price(i).delivery_leg_id):=1;
1483 
1484 		END IF;
1485 
1486 
1487 
1488 		i:=p_freight_cost_temp_price.NEXT(i);
1489 	END LOOP;
1490 
1491 
1492 	i:=p_fc_main_update_rows.FIRST;
1493 	WHILE(i IS NOT NULL)
1494 	LOOP
1495 
1496 
1497 		IF ((p_fc_main_update_rows(i).delivery_detail_id IS NULL)
1498 		AND (p_fc_main_update_rows(i).delivery_leg_id IS NOT NULL)
1499 		AND (p_child_dlegs.EXISTS(p_fc_main_update_rows(i).delivery_leg_id)))
1500 		THEN
1501 			l_child_dlegs_rated(p_fc_main_update_rows(i).delivery_leg_id):=1;
1502 
1503 		END IF;
1504 
1505 		IF ((p_fc_main_update_rows(i).delivery_detail_id IS NULL)
1506 		AND (p_fc_main_update_rows(i).delivery_leg_id IS NOT NULL)
1507 		AND (p_parent_dlegs.EXISTS(p_fc_main_update_rows(i).delivery_leg_id)))
1508 		THEN
1509 			l_parent_dlegs_rated(p_fc_main_update_rows(i).delivery_leg_id):=1;
1510 
1511 		END IF;
1512 
1513 
1514 
1515 		i:=p_fc_main_update_rows.NEXT(i);
1516 	END LOOP;
1517 
1518 
1519 
1520 	IF(l_child_detail_rated.COUNT > 0)
1521 	THEN
1522 		x_child_details_rated:='Y';
1523 
1524 	END IF;
1525 
1526 	IF(l_consol_LPN_rated.COUNT > 0)
1527 	THEN
1528 		x_consol_LPNs_rated:='Y';
1529 	END IF;
1530 
1531 
1532 	IF(l_child_dlegs_rated.COUNT = p_child_dlegs.COUNT)
1533 	THEN
1534 		x_child_dlegs_rated:='Y';
1535 
1536 	END IF;
1537 
1538 	IF(l_parent_dlegs_rated.COUNT > 0)
1539 	THEN
1540 
1541 		x_parent_dlegs_rated:='Y';
1542 	END IF;
1543 
1544 
1545 	FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,
1546 	'Child Detail Rated:'||x_child_details_rated||
1547 	'Consol LPN Rated:'||x_consol_LPNs_rated||
1548 	' Child Dlegs rated:'||x_child_dlegs_rated||
1549 	'Parent Dlegs rated:'||x_parent_dlegs_rated);
1550 
1551 
1552 	FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'MDC_Check_Rated');
1553 
1554 EXCEPTION
1555    WHEN others THEN
1556         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
1557         FTE_FREIGHT_PRICING_UTIL.set_exception('MDC_Check_Rated',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
1558         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
1559         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'MDC_Check_Rated');
1560 
1561 
1562 END MDC_Check_Rated;
1563 
1564 
1565 
1566 PROCEDURE Handle_MDC(
1567         p_save_flag               IN     VARCHAR2, -- Whether to save to TEMP table or temp table
1568         x_freight_cost_main_price IN OUT NOCOPY Freight_Cost_Main_Tab_Type,
1569         x_freight_cost_temp_price  IN OUT NOCOPY Freight_Cost_Temp_Tab_Type,
1570         x_freight_cost_main_charge IN OUT NOCOPY Freight_Cost_Main_Tab_Type,
1571         x_freight_cost_temp_charge IN OUT NOCOPY Freight_Cost_Temp_Tab_Type,
1572         x_fc_main_update_rows     IN OUT NOCOPY     Freight_Cost_Main_Tab_Type,  -- For update of SUMMARY records
1573         x_return_status           OUT NOCOPY     VARCHAR2 ) IS
1574 
1575 l_parent_deliveries DBMS_UTILITY.NUMBER_ARRAY;
1576 l_child_deliveries DBMS_UTILITY.NUMBER_ARRAY;
1577 l_parent_dlegs DBMS_UTILITY.NUMBER_ARRAY;
1578 l_child_dlegs DBMS_UTILITY.NUMBER_ARRAY;
1579 l_consol_LPNs DBMS_UTILITY.NUMBER_ARRAY;--Indexed by child detail id
1580 l_consol_LPN_children DBMS_UTILITY.NUMBER_ARRAY;
1581 l_delivery_to_dleg DBMS_UTILITY.NUMBER_ARRAY;
1582 l_dleg_to_delivery DBMS_UTILITY.NUMBER_ARRAY;
1583 i	NUMBER;
1584 l_child_details_rated VARCHAR2(1);
1585 l_consol_LPNs_rated VARCHAR2(1);
1586 l_child_dlegs_rated VARCHAR2(1);
1587 l_parent_dlegs_rated VARCHAR2(1);
1588 l_return_status VARCHAR2(1);
1589 
1590 l_log_level     NUMBER := FTE_FREIGHT_PRICING_UTIL.G_DBG;
1591 
1592 BEGIN
1593 	x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
1594 	FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
1595 	FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,'Handle_MDC','start');
1596 
1597 
1598 
1599 	IF (p_save_flag IS NOT NULL)--((p_save_flag IS NOT NULL) AND ((p_save_flag ='T') OR (p_save_flag='M')))
1600 	THEN
1601 
1602 		--gather MDC information from cache
1603 
1604 		i:=g_shipment_line_rows.FIRST;
1605 		WHILE(i IS NOT NULL)
1606 		LOOP
1607 
1608 			FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,
1609 			'Detail_id:'||g_shipment_line_rows(i).delivery_detail_id ||
1610 			' Delivery Id:'||g_shipment_line_rows(i).delivery_id ||
1611 			' Dleg Id:'||g_shipment_line_rows(i).delivery_leg_id||
1612 			' Parent Delivery Detail id:'||g_shipment_line_rows(i).parent_delivery_detail_id ||
1613 			' Parent Delivery id:'||g_shipment_line_rows(i).parent_delivery_id ||
1614 			'Parent Dleg Id:'||g_shipment_line_rows(i).parent_delivery_leg_id||
1615 			'Assignment type:'||g_shipment_line_rows(i).assignment_type);
1616 
1617 			IF ((g_shipment_line_rows(i).delivery_id IS NOT NULL) AND (g_shipment_line_rows(i).delivery_leg_id IS NOT NULL))
1618 			THEN
1619 				IF (NOT (l_delivery_to_dleg.EXISTS(g_shipment_line_rows(i).delivery_id)))
1620 				THEN
1621 					l_delivery_to_dleg(g_shipment_line_rows(i).delivery_id):=
1622 						g_shipment_line_rows(i).delivery_leg_id;
1623 				END IF;
1624 
1625 				IF (NOT (l_dleg_to_delivery.EXISTS(g_shipment_line_rows(i).delivery_leg_id)))
1626 				THEN
1627 					l_dleg_to_delivery(g_shipment_line_rows(i).delivery_leg_id):=
1628 						g_shipment_line_rows(i).delivery_id;
1629 				END IF;
1630 
1631 
1632 			END IF;
1633 
1634 			IF ((g_shipment_line_rows(i).parent_delivery_id IS NOT NULL) AND (g_shipment_line_rows(i).parent_delivery_leg_id IS NOT NULL))
1635 			THEN
1636 				l_parent_deliveries(g_shipment_line_rows(i).parent_delivery_id):=g_shipment_line_rows(i).parent_delivery_id;
1637 				l_child_deliveries(g_shipment_line_rows(i).delivery_id):=g_shipment_line_rows(i).delivery_id;
1638 
1639 				l_parent_dlegs(g_shipment_line_rows(i).parent_delivery_leg_id):=g_shipment_line_rows(i).parent_delivery_leg_id;
1640 				l_child_dlegs(g_shipment_line_rows(i).delivery_leg_id):=g_shipment_line_rows(i).parent_delivery_leg_id;
1641 
1642 				l_delivery_to_dleg(g_shipment_line_rows(i).parent_delivery_id):=
1643 					g_shipment_line_rows(i).parent_delivery_leg_id;
1644 
1645 				l_dleg_to_delivery(g_shipment_line_rows(i).parent_delivery_leg_id):=
1646 					g_shipment_line_rows(i).parent_delivery_id;
1647 
1648 
1649 			END IF;
1650 
1651 
1652 			IF ((g_shipment_line_rows(i).assignment_type IS NOT NULL) AND (g_shipment_line_rows(i).assignment_type='C')
1653 			AND (g_shipment_line_rows(i).parent_delivery_detail_id IS NOT NULL))
1654 			THEN
1655 				l_consol_LPNs(g_shipment_line_rows(i).parent_delivery_detail_id):=g_shipment_line_rows(i).parent_delivery_detail_id;
1656 				l_consol_LPN_children(g_shipment_line_rows(i).delivery_detail_id):=g_shipment_line_rows(i).parent_delivery_detail_id;
1657 			END IF;
1658 
1659 			i:=g_shipment_line_rows.NEXT(i);
1660 		END LOOP;
1661 
1662 
1663 
1664 
1665 		--Check if there is any MDC content otherwise do nothing
1666 		IF (l_parent_deliveries.COUNT>0)
1667 		THEN
1668 
1669 
1670 			Populate_Dleg_Id(
1671 				p_delivery_to_dleg=>l_delivery_to_dleg,
1672 				x_freight_cost_temp=>x_freight_cost_temp_price,
1673 				x_return_status=>l_return_status);
1674 
1675 			IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS
1676 			THEN
1677 			       IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING
1678 			       THEN
1679 				  raise FTE_FREIGHT_PRICING_UTIL.g_MDC_populate_dleg_id;
1680 			       END IF;
1681 			END IF;
1682 
1683 
1684 
1685 			Populate_Dleg_Id(
1686 				p_delivery_to_dleg=>l_delivery_to_dleg,
1687 				x_freight_cost_temp=>x_freight_cost_temp_charge,
1688 				x_return_status=>l_return_status);
1689 
1690 			IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS
1691 			THEN
1692 			       IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING
1693 			       THEN
1694 				  raise FTE_FREIGHT_PRICING_UTIL.g_MDC_populate_dleg_id;
1695 			       END IF;
1696 			END IF;
1697 
1698 
1699 
1700 			 MDC_Check_Rated(
1701 				p_save_flag=>p_save_flag,
1702 				p_consol_LPNs=>l_consol_LPNs,
1703 				p_consol_LPN_children=>l_consol_LPN_children,
1704 				p_parent_dlegs=>l_parent_dlegs,
1705 				p_child_dlegs=>l_child_dlegs,
1706 				p_freight_cost_main_price=>x_freight_cost_main_price,
1707 				p_freight_cost_temp_price=>x_freight_cost_temp_price,
1708 				p_fc_main_update_rows=>x_fc_main_update_rows,
1709 				x_child_details_rated=>l_child_details_rated,
1710 				x_consol_LPNs_rated=>l_consol_LPNs_rated,
1711 				x_child_dlegs_rated=>l_child_dlegs_rated,
1712 				x_parent_dlegs_rated=>l_parent_dlegs_rated,
1713 				x_return_status=>l_return_status);
1714 
1715 			IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS
1716 			THEN
1717 			       IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING
1718 			       THEN
1719 				  raise FTE_FREIGHT_PRICING_UTIL.g_MDC_check_rated;
1720 			       END IF;
1721 			END IF;
1722 
1723 
1724 
1725 			--Rates at the detail level
1726 
1727 			IF((l_consol_LPNs.COUNT>0) AND (l_consol_LPNs_rated='Y') AND (l_consol_LPN_children.COUNT> 0)
1728 				AND (l_child_details_rated='N'))
1729 			THEN
1730 
1731 				MDC_Alloc_From_consol_LPN(
1732 					p_save_flag=>p_save_flag,
1733 					p_consol_LPNs=>l_consol_LPNs,
1734 					p_consol_LPN_children=>l_consol_LPN_children,
1735 					x_freight_cost_main_price=>x_freight_cost_main_price,
1736 					x_freight_cost_temp_price=>x_freight_cost_temp_price,
1737 					x_freight_cost_main_charge=>x_freight_cost_main_charge,
1738 					x_freight_cost_temp_charge=>x_freight_cost_temp_charge,
1739 					x_return_status=>l_return_status);
1740 
1741 				IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS
1742 				THEN
1743 				       IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING
1744 				       THEN
1745 					  raise FTE_FREIGHT_PRICING_UTIL.g_MDC_alloc_from_consol_LPN;
1746 				       END IF;
1747 				END IF;
1748 
1749 
1750 
1751 			ELSIF((l_consol_LPNs.COUNT>0) AND (l_consol_LPNs_rated='N') AND (l_consol_LPN_children.COUNT> 0)
1752 				AND (l_child_details_rated='Y'))
1753 			THEN
1754 				Create_LPN_Summary(
1755 					p_save_flag=>p_save_flag,
1756 					p_consol_LPN_children=>l_consol_LPN_children,
1757 					x_freight_cost_main_price=>x_freight_cost_main_price,
1758 					x_freight_cost_temp_price=>x_freight_cost_temp_price,
1759 					x_freight_cost_main_charge=>x_freight_cost_main_charge,
1760 					x_freight_cost_temp_charge=>x_freight_cost_temp_charge,
1761 					x_return_status=>l_return_status);
1762 
1763 				IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS
1764 				THEN
1765 				       IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING
1766 				       THEN
1767 					  raise FTE_FREIGHT_PRICING_UTIL.g_MDC_cre_LPN_summ;
1768 				       END IF;
1769 				END IF;
1770 
1771 
1772 
1773 
1774 			END IF;
1775 
1776 
1777 			--Rates at dleg level
1778 			--Always recalculate child dleg summaries
1779 			IF((l_child_dlegs.COUNT > 0) AND (l_parent_dlegs.COUNT >0))
1780 			THEN
1781 
1782 				Create_Child_Dleg_Summaries(
1783 					p_save_flag=>p_save_flag,
1784 					p_dleg_to_delivery=>l_dleg_to_delivery,
1785 					p_parent_dlegs=>l_parent_dlegs,
1786 					p_child_dlegs=>l_child_dlegs,
1787 					x_freight_cost_main_price=>x_fc_main_update_rows,
1788 					x_freight_cost_temp_price=>x_freight_cost_temp_price,
1789 					x_fc_main_update_rows=>x_fc_main_update_rows,
1790 					x_return_status=>l_return_status);
1791 
1792 				IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS
1793 				THEN
1794 				       IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING
1795 				       THEN
1796 					  raise FTE_FREIGHT_PRICING_UTIL.g_MDC_cre_child_dleg_summ;
1797 				       END IF;
1798 				END IF;
1799 
1800 
1801 
1802 			END IF;
1803 
1804 
1805 			--IF((l_child_dlegs.COUNT > 0) AND (l_child_dlegs_rated='Y')
1806 			--AND (l_parent_dlegs.COUNT >0) AND (l_parent_dlegs_rated='N'))
1807 
1808 			--Always recalculate parent dleg summaries
1809 			IF((l_child_dlegs.COUNT > 0)AND (l_parent_dlegs.COUNT >0))
1810 			THEN
1811 				Create_Parent_Dleg_Summaries(
1812 					p_save_flag=>p_save_flag,
1813 					p_parent_dlegs=>l_parent_dlegs,
1814 					p_child_dlegs=>l_child_dlegs,
1815 					p_dleg_to_delivery=>l_dleg_to_delivery,
1816 					x_freight_cost_main_price=>x_fc_main_update_rows,
1817 					x_freight_cost_temp_price=>x_freight_cost_temp_price,
1818 					x_return_status=>l_return_status);
1819 
1820 				IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS
1821 				THEN
1822 				       IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING
1823 				       THEN
1824 					  raise FTE_FREIGHT_PRICING_UTIL.g_MDC_cre_parent_dleg_summ;
1825 				       END IF;
1826 				END IF;
1827 
1828 
1829 
1830 			END IF;
1831 
1832 
1833 
1834 
1835 
1836 		END IF;
1837 
1838 
1839 	END IF;
1840 
1841 	FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'Handle_MDC');
1842 
1843 EXCEPTION
1844    WHEN FTE_FREIGHT_PRICING_UTIL.g_MDC_populate_dleg_id THEN
1845         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1846         FTE_FREIGHT_PRICING_UTIL.set_exception('Handle_MDC',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_MDC_populate_dleg_id');
1847         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'Handle_MDC');
1848 
1849    WHEN FTE_FREIGHT_PRICING_UTIL.g_MDC_check_rated THEN
1850         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1851         FTE_FREIGHT_PRICING_UTIL.set_exception('Handle_MDC',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_MDC_check_rated');
1852         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'Handle_MDC');
1853 
1854    WHEN FTE_FREIGHT_PRICING_UTIL.g_MDC_alloc_from_consol_LPN THEN
1855         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1856         FTE_FREIGHT_PRICING_UTIL.set_exception('Handle_MDC',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_MDC_alloc_from_consol_LPN');
1857         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'Handle_MDC');
1858 
1859    WHEN FTE_FREIGHT_PRICING_UTIL.g_MDC_cre_LPN_summ THEN
1860         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1861         FTE_FREIGHT_PRICING_UTIL.set_exception('Handle_MDC',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_MDC_cre_LPN_summ');
1862         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'Handle_MDC');
1863 
1864    WHEN FTE_FREIGHT_PRICING_UTIL.g_MDC_cre_parent_dleg_summ THEN
1865         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1866         FTE_FREIGHT_PRICING_UTIL.set_exception('Handle_MDC',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_MDC_cre_parent_dleg_summ');
1867         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'Handle_MDC');
1868 
1869    WHEN FTE_FREIGHT_PRICING_UTIL.g_MDC_cre_child_dleg_summ THEN
1870         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
1871         FTE_FREIGHT_PRICING_UTIL.set_exception('Handle_MDC',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_MDC_cre_child_dleg_summ');
1872         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'Handle_MDC');
1873 
1874    WHEN others THEN
1875         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
1876         FTE_FREIGHT_PRICING_UTIL.set_exception('Handle_MDC',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
1877         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
1878         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'Handle_MDC');
1879 
1880 
1881 END Handle_MDC;
1882 
1883 FUNCTION hasMultipleLegs (
1884          p_delivery_id IN NUMBER) RETURN VARCHAR2
1885 
1886 IS
1887 
1888     l_log_level     NUMBER := FTE_FREIGHT_PRICING_UTIL.G_DBG;
1889 
1890     CURSOR c_get_legs(c_delivery_id NUMBER) IS
1891     SELECT count(delivery_leg_id) FROM wsh_delivery_legs
1892     WHERE delivery_id = c_delivery_id;
1893 
1894     l_count NUMBER :=0;
1895 
1896 BEGIN
1897 
1898     OPEN c_get_legs(p_delivery_id);
1899     FETCH c_get_legs INTO l_count;
1900     CLOSE c_get_legs;
1901 
1902     IF l_count > 1 THEN
1903      RETURN 'Y';
1904     ELSE
1905      RETURN 'N';
1906     END IF;
1907 
1908 END hasMultipleLegs;
1909 
1910 
1911    FUNCTION get_default_category (
1912         p_classification_code IN VARCHAR2) RETURN NUMBER
1913    IS
1914 
1915     l_log_level     NUMBER := FTE_FREIGHT_PRICING_UTIL.G_DBG;
1916 
1917     CURSOR c_get_structure_id
1918     IS
1919     SELECT structure_id
1920     FROM mtl_category_sets mcs, mtl_category_sets_tl mcst
1921     WHERE mcs.category_set_id = mcst.category_set_id
1922     AND   mcst.category_set_name='WSH_COMMODITY_CODE'
1923     AND   mcst.language='US';
1924 
1925     CURSOR c_get_def_category(c_classification_code VARCHAR2, c_structure_id NUMBER)
1926     IS
1927     SELECT category_id
1928     FROM mtl_categories_b
1929     WHERE segment1=c_classification_code
1930     AND   segment4='Y'
1931     AND structure_id=c_structure_id;
1932 
1933     l_structure_id NUMBER;
1934     l_category_id  NUMBER;
1935 
1936    BEGIN
1937 
1938     FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
1939     FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,'get_default_category','start');
1940 
1941     OPEN c_get_structure_id;
1942     FETCH c_get_structure_id INTO l_structure_id;
1943     CLOSE c_get_structure_id;
1944 
1945     IF (p_classification_code IS NOT NULL) THEN
1946        OPEN c_get_def_category(p_classification_code, l_structure_id);
1947        FETCH c_get_def_category INTO l_category_id;
1948        CLOSE c_get_def_category;
1949     ELSE
1950        l_category_id := g_default_category_id;
1951     END IF;
1952 
1953     FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'get_default_category');
1954     RETURN l_category_id;
1955 
1956    EXCEPTION
1957    WHEN others THEN
1958         --x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
1959         FTE_FREIGHT_PRICING_UTIL.set_exception('get_default_category',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
1960         --FTE_FREIGHT_PRICING_UTIL.print_debug('Unexpected Error : '||SQLCODE||' : '||SQLERRM);
1961         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
1962         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'get_default_category');
1963    END  get_default_category;
1964 
1965 
1966 
1967 PROCEDURE  Get_Trip_Mode(
1968 	p_trip_id IN NUMBER,
1969 	p_dleg_id IN NUMBER,
1970 	x_trip_id IN OUT NOCOPY NUMBER,
1971 	x_mode_of_transport IN OUT NOCOPY VARCHAR2,
1972 	x_return_status       OUT NOCOPY     VARCHAR2 )
1973 IS
1974 
1975 	CURSOR c_get_trip_from_dleg(c_dleg_id IN NUMBER)
1976 	IS
1977 	SELECT  t.trip_id, t.mode_of_transport
1978 	FROM    wsh_delivery_legs dl,
1979 		wsh_trip_stops s,
1980 		wsh_trips t
1981 	WHERE dl.delivery_leg_id =c_dleg_id AND
1982 	      dl.pick_up_stop_id=s.stop_id AND
1983 	     s.trip_id=t.trip_id ;
1984 
1985 
1986 	CURSOR c_get_mode_for_trip(c_trip_id IN NUMBER)
1987 	IS
1988 	select t.mode_of_transport
1989 	FROM wsh_trips t
1990 	WHERE t.trip_id=c_trip_id;
1991 
1992       l_log_level               NUMBER := FTE_FREIGHT_PRICING_UTIL.G_LOG;
1993       l_count	NUMBER;
1994       l_api_name           CONSTANT VARCHAR2(30)   := 'VALIDATE_DELIVERY';
1995 
1996 BEGIN
1997 
1998 	x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
1999 
2000    	FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
2001    	FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,l_api_name,'start');
2002 
2003 
2004 	x_mode_of_transport:=NULL;
2005 	x_trip_id:=NULL;
2006 	IF(p_trip_id IS NOT NULL)
2007 	THEN
2008 		x_trip_id:=p_trip_id;
2009 		OPEN c_get_mode_for_trip(p_trip_id);
2010 		FETCH c_get_mode_for_trip INTO x_mode_of_transport;
2011 		CLOSE c_get_mode_for_trip;
2012 
2013 	ELSIF(p_dleg_id IS NOT NULL)
2014 	THEN
2015 
2016 		OPEN c_get_trip_from_dleg(p_dleg_id);
2017 		FETCH c_get_trip_from_dleg INTO x_trip_id,x_mode_of_transport;
2018 		CLOSE c_get_trip_from_dleg;
2019 
2020 	END IF;
2021 
2022    	FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,l_api_name);
2023 
2024 EXCEPTION
2025    WHEN others THEN
2026         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
2027         FTE_FREIGHT_PRICING_UTIL.set_exception(l_api_name,FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
2028         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
2029         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,l_api_name);
2030 
2031 
2032 
2033 END Get_Trip_Mode;
2034 
2035 
2036 
2037   PROCEDURE validate_delivery      (p_delivery_id           IN NUMBER,
2038 				    x_return_code	    OUT NOCOPY NUMBER)
2039   IS
2040       l_log_level               NUMBER := FTE_FREIGHT_PRICING_UTIL.G_LOG;
2041       l_count	NUMBER;
2042       l_api_name           CONSTANT VARCHAR2(30)   := 'VALIDATE_DELIVERY';
2043   BEGIN
2044 --
2045     x_return_code := G_RC_SUCCESS;
2046 
2047     FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
2048     FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,l_api_name,'start');
2049 
2050     FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'p_delivery_id='||p_delivery_id);
2051 
2052     -- check for empty delivery
2053     l_count := 0;
2054     OPEN c_count_delivery_details(p_delivery_id);
2055     FETCH c_count_delivery_details INTO l_count;
2056     CLOSE c_count_delivery_details;
2057     IF ( l_count <= 0 ) THEN
2058 
2059       FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'empty delivery');
2060 
2061       FTE_FREIGHT_PRICING_UTIL.setmsg(
2062 			  p_api			=> l_api_name,
2063 			  p_exc			=> ' ',
2064 			  p_msg_name		=> 'FTE_PRC_EMPTY_DEL',
2065 			  p_msg_type		=> 'E',
2066 			  p_delivery_id		=> p_delivery_id);
2067 	        	RAISE FND_API.G_EXC_ERROR;
2068     END IF;
2069 
2070     -- validate freight term
2071     l_count := 0;
2072     OPEN c_check_del_freight_term(p_delivery_id);
2073     FETCH c_check_del_freight_term INTO l_count;
2074     CLOSE c_check_del_freight_term;
2075     IF ( l_count > 0 ) THEN
2076       FTE_FREIGHT_PRICING_UTIL.setmsg(
2077 			  p_api			=> l_api_name,
2078 			  p_exc			=> ' ',
2079 			  p_msg_name		=> 'FTE_PRC_NOTRATE_DEL_FGT_TERM',
2080 			  p_msg_type		=> 'E',
2081 			  p_delivery_id		=> p_delivery_id);
2082       FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'do not rate the freight term.');
2083       x_return_code := G_RC_NOT_RATE_FREIGHT_TERM;
2084       raise g_finished_warning;
2085     END IF;
2086 
2087     -- Manifesting validation
2088     l_count := 0;
2089     OPEN c_check_del_manifesting(p_delivery_id);
2090     FETCH c_check_del_manifesting INTO l_count;
2091     CLOSE c_check_del_manifesting;
2092     IF ( l_count > 0 ) THEN
2093       FTE_FREIGHT_PRICING_UTIL.setmsg(
2094 			  p_api			=> l_api_name,
2095 			  p_exc			=> ' ',
2096 			  p_msg_name		=> 'FTE_PRC_NOTRATE_DEL_MAN',
2097 			  p_msg_type		=> 'E',
2098 			  p_delivery_id		=> p_delivery_id);
2099       FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'delivery organization is manifesting enabled and carrier is manifesting enabled, do not rate.');
2100       x_return_code := G_RC_NOT_RATE_FREIGHT_TERM;
2101       raise g_finished_warning;
2102     END IF;
2103 
2104     FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,l_api_name);
2105 
2106   EXCEPTION
2107 	WHEN g_finished_warning THEN
2108           FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,l_api_name);
2109 --
2110 	WHEN FND_API.G_EXC_ERROR THEN
2111 		x_return_code := G_RC_ERROR;
2112           FTE_FREIGHT_PRICING_UTIL.set_exception(l_api_name,FTE_FREIGHT_PRICING_UTIL.G_ERR,'FND_API.G_EXC_ERROR');
2113           FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,l_api_name);
2114 --
2115 	WHEN OTHERS THEN
2116 		WSH_UTIL_CORE.DEFAULT_HANDLER(G_PKG_NAME||'.'||l_api_name);
2117 		x_return_code := G_RC_ERROR;
2118         FTE_FREIGHT_PRICING_UTIL.set_exception(l_api_name,FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
2119         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
2120           FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,l_api_name);
2121 --
2122   END validate_delivery;
2123 
2124   PROCEDURE validate_nontl_trip    (p_trip_id               IN NUMBER,
2125                                     x_return_code           OUT NOCOPY  NUMBER)
2126   IS
2127     l_log_level               NUMBER := FTE_FREIGHT_PRICING_UTIL.G_LOG;
2128     l_api_name           CONSTANT VARCHAR2(30)   := 'VALIDATE_NONTL_TRIP';
2129     l_count	NUMBER;
2130   BEGIN
2131 
2132     x_return_code := G_RC_SUCCESS;
2133 
2134     FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
2135     FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,l_api_name,'start');
2136 
2137     FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'p_trip_id='||p_trip_id);
2138 
2139     l_count := 0;
2140     OPEN c_cnt_trip_legs(p_trip_id);
2141     FETCH c_cnt_trip_legs INTO l_count;
2142     CLOSE c_cnt_trip_legs;
2143 
2144     IF (l_count <= 0) THEN
2145       FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'trip '||p_trip_id||' has no delivery');
2146       FTE_FREIGHT_PRICING_UTIL.setmsg(
2147 			  p_api			=> l_api_name,
2148 			  p_exc			=> ' ',
2149 			  p_msg_name		=> 'FTE_PRC_TRP_NO_DLV',
2150 			  p_msg_type		=> 'E',
2151 			  p_trip_id		=> p_trip_id);
2152 	        	RAISE FND_API.G_EXC_ERROR;
2153     END IF;
2154 
2155     -- check for empty delivery
2156     l_count := 0;
2157     OPEN c_count_delivery_details2(p_trip_id);
2158     FETCH c_count_delivery_details2 INTO l_count;
2159     CLOSE c_count_delivery_details2;
2160     IF ( l_count <= 0 ) THEN
2161 
2162       FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'empty delivery');
2163 
2164       FTE_FREIGHT_PRICING_UTIL.setmsg(
2165 			  p_api			=> l_api_name,
2166 			  p_exc			=> ' ',
2167 			  p_msg_name		=> 'FTE_PRC_TRP_NO_DEL_CONTENT',
2168 			  p_msg_type		=> 'E',
2169 			  p_trip_id		=> p_trip_id);
2170 	        	RAISE FND_API.G_EXC_ERROR;
2171     END IF;
2172 
2173     -- validate freight term
2174     l_count := 0;
2175     OPEN c_check_del_freight_term2(p_trip_id);
2176     FETCH c_check_del_freight_term2 INTO l_count;
2177     CLOSE c_check_del_freight_term2;
2178     IF ( l_count > 0 ) THEN
2179       FTE_FREIGHT_PRICING_UTIL.setmsg(
2180 			  p_api			=> l_api_name,
2181 			  p_exc			=> ' ',
2182 			  p_msg_name		=> 'FTE_PRC_NOTRATE_TRP_FGT_TERM',
2183 			  p_msg_type		=> 'E',
2184 			  p_trip_id		=> p_trip_id);
2185       FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'do not rate the freight term.');
2186       x_return_code := G_RC_NOT_RATE_FREIGHT_TERM;
2187       raise g_finished_warning;
2188     END IF;
2189 
2190     -- Manifesting validation
2191     l_count := 0;
2192     OPEN c_check_del_manifesting2(p_trip_id);
2193     FETCH c_check_del_manifesting2 INTO l_count;
2194     CLOSE c_check_del_manifesting2;
2195     IF ( l_count > 0 ) THEN
2196       FTE_FREIGHT_PRICING_UTIL.setmsg(
2197 			  p_api			=> l_api_name,
2198 			  p_exc			=> ' ',
2199 			  p_msg_name		=> 'FTE_PRC_NOTRATE_TRP_MAN',
2200 			  p_msg_type		=> 'E',
2201 			  p_trip_id		=> p_trip_id);
2202       FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'delivery organization is manifesting enabled and carrier is manifesting enabled, do not rate.');
2203       x_return_code := G_RC_NOT_RATE_FREIGHT_TERM;
2204       raise g_finished_warning;
2205     END IF;
2206 
2207     FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,l_api_name);
2208 
2209   EXCEPTION
2210 	WHEN g_finished_warning THEN
2211           FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,l_api_name);
2212 --
2213 	WHEN FND_API.G_EXC_ERROR THEN
2214 		x_return_code := G_RC_ERROR;
2215           FTE_FREIGHT_PRICING_UTIL.set_exception(l_api_name,FTE_FREIGHT_PRICING_UTIL.G_ERR,'FND_API.G_EXC_ERROR');
2216           FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,l_api_name);
2217 --
2218 	WHEN OTHERS THEN
2219 		WSH_UTIL_CORE.DEFAULT_HANDLER(G_PKG_NAME||'.'||l_api_name);
2220 		x_return_code := G_RC_ERROR;
2221         FTE_FREIGHT_PRICING_UTIL.set_exception(l_api_name,FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
2222         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
2223           FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,l_api_name);
2224   END validate_nontl_trip;
2225 --
2226 PROCEDURE Create_Freight_Cost_Temp(
2227          p_freight_cost_temp_info IN     Freight_Cost_Temp_Rec_Type,
2228          x_freight_cost_temp_id   OUT NOCOPY     NUMBER,
2229          x_return_status          OUT NOCOPY     VARCHAR2)
2230 IS
2231 
2232 CURSOR C_Next_Freight_Cost_Id
2233 IS
2234 SELECT fte_freight_costs_temp_s.nextval
2235 FROM sys.dual;
2236 
2237     l_log_level     NUMBER := FTE_FREIGHT_PRICING_UTIL.G_DBG;
2238 
2239 BEGIN
2240 
2241    x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
2242 
2243    FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
2244    FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,'Create_Freight_Cost_Temp','start');
2245 
2246       OPEN C_Next_Freight_Cost_Id;
2247       FETCH C_Next_Freight_Cost_Id INTO x_freight_cost_temp_id;
2248       CLOSE C_Next_Freight_Cost_Id;
2249 
2250       INSERT INTO fte_freight_costs_temp(
2251                 freight_cost_id,
2252                 freight_cost_type_id,
2253                 charge_unit_value,
2254                 unit_amount,
2255                 calculation_method,
2256                 uom,
2257                 quantity,
2258                 total_amount,
2259                 currency_code,
2260                 line_type_code,
2261                 charge_source_code,
2262                 estimated_flag,
2263                 comparison_request_id,
2264                 lane_id,
2265                 schedule_id,
2266                 moved_to_main_flag,
2267                 service_type_code,  -- bug2741467
2268                 conversion_date,
2269                 conversion_rate,
2270                 conversion_type_code,
2271                 trip_id,
2272                 stop_id,
2273                 delivery_id,
2274                 delivery_leg_id,
2275                 delivery_detail_id,
2276                 attribute_category,
2277                 attribute1,
2278                 attribute2,
2279                 attribute3,
2280                 attribute4,
2281                 attribute5,
2282                 attribute6,
2283                 attribute7,
2284                 attribute8,
2285                 attribute9,
2286                 attribute10,
2287                 attribute11,
2288                 attribute12,
2289                 attribute13,
2290                 attribute14,
2291                 attribute15,
2292                 creation_date,
2293                 created_by,
2294                 last_update_date,
2295                 last_updated_by,
2296                 last_update_login,
2297                 program_application_id,
2298                 program_id,
2299                 program_update_date,
2300                 request_id,
2301                 commodity_category_id,
2302                 billable_quantity,
2303                 billable_uom,
2304                 billable_basis
2305         ) VALUES (
2306         x_freight_cost_temp_id,
2307                 p_freight_cost_temp_info.freight_cost_type_id,
2308                 p_freight_cost_temp_info.charge_unit_value,
2309                 p_freight_cost_temp_info.unit_amount,
2310                 p_freight_cost_temp_info.calculation_method,
2311                 p_freight_cost_temp_info.uom,
2312                 p_freight_cost_temp_info.quantity,
2313                 p_freight_cost_temp_info.total_amount,
2314                 p_freight_cost_temp_info.currency_code,
2315                 p_freight_cost_temp_info.line_type_code,
2316                 p_freight_cost_temp_info.charge_source_code,
2317                 p_freight_cost_temp_info.estimated_flag,
2318                 p_freight_cost_temp_info.comparison_request_id,
2319                 p_freight_cost_temp_info.lane_id,
2320                 p_freight_cost_temp_info.schedule_id,
2321                 p_freight_cost_temp_info.moved_to_main_flag,
2322                 p_freight_cost_temp_info.service_type_code,
2323                 p_freight_cost_temp_info.conversion_date,
2324                 p_freight_cost_temp_info.conversion_rate,
2325                 p_freight_cost_temp_info.conversion_type_code,
2326                 p_freight_cost_temp_info.trip_id,
2327                 p_freight_cost_temp_info.stop_id,
2328                 p_freight_cost_temp_info.delivery_id,
2329                 p_freight_cost_temp_info.delivery_leg_id,
2330                 p_freight_cost_temp_info.delivery_detail_id,
2331                 p_freight_cost_temp_info.attribute_category,
2332                 p_freight_cost_temp_info.attribute1,
2333                 p_freight_cost_temp_info.attribute2,
2334                 p_freight_cost_temp_info.attribute3,
2335                 p_freight_cost_temp_info.attribute4,
2336                 p_freight_cost_temp_info.attribute5,
2337                 p_freight_cost_temp_info.attribute6,
2338                 p_freight_cost_temp_info.attribute7,
2339                 p_freight_cost_temp_info.attribute8,
2340                 p_freight_cost_temp_info.attribute9,
2341                 p_freight_cost_temp_info.attribute10,
2342                 p_freight_cost_temp_info.attribute11,
2343                 p_freight_cost_temp_info.attribute12,
2344                 p_freight_cost_temp_info.attribute13,
2345                 p_freight_cost_temp_info.attribute14,
2346                 p_freight_cost_temp_info.attribute15,
2347                 p_freight_cost_temp_info.creation_date,
2348                 p_freight_cost_temp_info.created_by,
2349                 p_freight_cost_temp_info.last_update_date,
2350                 p_freight_cost_temp_info.last_updated_by,
2351                 p_freight_cost_temp_info.last_update_login,
2352                 p_freight_cost_temp_info.program_application_id,
2353                 p_freight_cost_temp_info.program_id,
2354                 p_freight_cost_temp_info.program_update_date,
2355                 p_freight_cost_temp_info.request_id,
2356                 p_freight_cost_temp_info.commodity_category_id,
2357                 p_freight_cost_temp_info.billable_quantity,
2358                 p_freight_cost_temp_info.billable_uom,
2359                 p_freight_cost_temp_info.billable_basis
2360         );
2361 
2362    FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'Create_Freight_Cost_Temp');
2363 EXCEPTION
2364    WHEN others THEN
2365         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
2366         FTE_FREIGHT_PRICING_UTIL.set_exception('Create_Freight_Cost_Temp',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
2367         --FTE_FREIGHT_PRICING_UTIL.print_debug('Unexpected Error : '||SQLCODE||' : '||SQLERRM);
2368         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
2369         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'Create_Freight_Cost_Temp');
2370 
2371 END Create_Freight_Cost_Temp;
2372 
2373 --      This API will look up global g_rolledup_lines
2374 --      It will return the input category/basis total for the input container
2375 
2376 PROCEDURE get_rolledup_amount(
2377         p_container_id            IN  NUMBER,    -- Mandatory
2378         p_category_id             IN  NUMBER DEFAULT NULL,   -- Either category id or basis
2379         p_basis                   IN  NUMBER DEFAULT NULL,
2380         p_line_type_code          IN  VARCHAR2 DEFAULT NULL,  --  gets list line type code from line details
2381         p_wsh_amount              IN  NUMBER,
2382         p_fte_amount              IN  NUMBER DEFAULT NULL,
2383         p_fc_dlvd_rows            IN  total_discount_tab_type,
2384         p_quantity                IN  NUMBER,
2385         p_uom                     IN  VARCHAR2,
2386         p_save_flag               IN  VARCHAR2,
2387         x_freight_cost_main_price  IN OUT NOCOPY Freight_Cost_Main_Tab_Type,
2388         x_freight_cost_temp_price  IN OUT NOCOPY Freight_Cost_Temp_Tab_Type,
2389         x_freight_cost_main_charge IN OUT NOCOPY Freight_Cost_Main_Tab_Type,
2390         x_freight_cost_temp_charge IN OUT NOCOPY Freight_Cost_Temp_Tab_Type,
2391         x_quantity                OUT NOCOPY  NUMBER, -- Returns in input uom
2392         x_return_status           OUT NOCOPY  VARCHAR2)
2393 IS
2394 
2395         i           NUMBER:=0;
2396         l_sum       NUMBER:=0;
2397         l_quantity  NUMBER:=0;
2398         l_wsh_amount NUMBER:=0;
2399         l_fte_amount NUMBER:=0;
2400         l_charge_total_amount         NUMBER:=0;
2401         l_discount_total_amount       NUMBER:=0;
2402         l_index                       NUMBER:=0;
2403         l_main_price_index            NUMBER:=x_freight_cost_main_price.COUNT;
2404         l_main_charge_index           NUMBER:=x_freight_cost_main_charge.COUNT;
2405         l_temp_price_index            NUMBER:=x_freight_cost_temp_price.COUNT;
2406         l_temp_charge_index           NUMBER:=x_freight_cost_temp_charge.COUNT;
2407 
2408         l_fc_rec                      top_level_fc_rec_type;
2409 
2410         l_log_level     NUMBER := FTE_FREIGHT_PRICING_UTIL.G_DBG;
2411         l_basis_meaning VARCHAR2(30);
2412 
2413 BEGIN
2414 
2415    x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
2416    FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
2417    FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,'get_rolledup_amount','start');
2418    FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Container : '||p_container_id);
2419 
2420    IF p_save_flag = 'M' THEN
2421 
2422       IF p_line_type_code IS NOT NULL THEN   --  charge
2423          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'For Charge ');
2424          l_index       := l_main_charge_index;
2425       ELSE
2426          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'For Base Price ');
2427          l_index       := l_main_price_index;
2428       END IF;
2429 
2430    ELSE
2431 
2432       IF p_line_type_code IS NOT NULL THEN   --  charge
2433          l_index       := l_temp_charge_index;
2434       ELSE
2435          l_index       := l_temp_price_index;
2436       END IF;
2437 
2438    END IF;
2439 
2440    Get_Basis_Meaning( p_basis => p_basis,
2441                       x_basis_meaning => l_basis_meaning);
2442 
2443    i := g_rolledup_lines.FIRST;
2444    LOOP
2445       IF g_rolledup_lines(i).master_container_id = p_container_id THEN
2446 
2447          --l_index       := l_index + 1;
2448 
2449          IF g_rolledup_lines(i).line_uom <> p_uom THEN
2450 
2451             l_quantity :=  WSH_WV_UTILS.convert_uom(g_rolledup_lines(i).line_uom,
2452                                        p_uom,
2453                                        g_rolledup_lines(i).line_quantity,
2454                                        0);  -- Within same UOM class
2455          ELSE
2456 
2457             l_quantity := g_rolledup_lines(i).line_quantity;
2458          END IF;
2459 
2460          l_wsh_amount := p_wsh_amount * (l_quantity/p_quantity);
2461         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'roll->delivery_detail_id='||g_rolledup_lines(i).delivery_detail_id);
2462         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'l_quantity='||l_quantity);
2463         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'p_quantity='||p_quantity);
2464         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'l_wsh_amount='||l_wsh_amount);
2465         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'p_category_id='||p_category_id);
2466         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'p_basis='||p_basis);
2467         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'l_basis_meaning'||l_basis_meaning);
2468         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'p_uom='||p_uom);
2469 
2470 
2471         IF (p_category_id IS NOT NULL AND g_rolledup_lines(i).category_id = p_category_id) OR
2472             (p_basis IS NOT NULL AND g_rolledup_lines(i).rate_basis = p_basis)  THEN
2473 
2474                l_index       := l_index + 1;
2475 
2476                IF p_fc_dlvd_rows.COUNT > 0 THEN
2477                   l_charge_total_amount := p_fc_dlvd_rows(g_rolledup_lines(i).delivery_detail_id).total_amount;
2478                   l_discount_total_amount := p_fc_dlvd_rows(g_rolledup_lines(i).delivery_detail_id).discount_amount;
2479                ELSE
2480                   l_charge_total_amount := 0;
2481                   l_discount_total_amount := 0;
2482                END IF;
2483 
2484                l_sum := l_sum + l_quantity;
2485                l_fc_rec.delivery_detail_id := g_rolledup_lines(i).delivery_detail_id;
2486                l_fc_rec.quantity := l_quantity;
2487 
2488                IF p_line_type_code IS NULL THEN   --  base price
2489 
2490                   --l_fc_rec.unit_amount := l_wsh_amount - p_fc_dlvd_rows(g_rolledup_lines(i).delivery_detail_id).discount_amount;
2491                   l_fc_rec.unit_amount := l_wsh_amount - l_discount_total_amount;
2492 
2493                ELSE
2494                   --IF nvl(p_line_type_code,'-N') <> 'DISCOUNT' THEN
2495                   IF nvl(p_line_type_code,'-N') <> 'DIS' THEN
2496 
2497                      l_fc_rec.unit_amount := l_wsh_amount;
2498 
2499                   ELSE
2500 
2501                      l_fc_rec.line_type_code := 'DISCOUNT';
2502 
2503                   END IF;
2504                END IF;
2505 
2506                IF p_fte_amount IS NOT NULL THEN   --  Charge
2507 
2508                  l_fc_rec.total_amount := l_wsh_amount;
2509 
2510                ELSE
2511 
2512                  --l_fc_rec.total_amount := l_wsh_amount + p_fc_dlvd_rows(g_rolledup_lines(i).delivery_detail_id).total_amount;
2513                  l_fc_rec.total_amount := l_wsh_amount + l_charge_total_amount;
2514 
2515                END IF;
2516 
2517          IF p_save_flag = 'M' THEN
2518 
2519             IF p_line_type_code IS NULL THEN   --  base price
2520                x_freight_cost_main_price(l_index).line_type_code := l_fc_rec.line_type_code;
2521                x_freight_cost_main_price(l_index).delivery_detail_id := l_fc_rec.delivery_detail_id;
2522                x_freight_cost_main_price(l_index).quantity := l_fc_rec.quantity;
2523                x_freight_cost_main_price(l_index).unit_amount := round(l_fc_rec.unit_amount,2);
2524                x_freight_cost_main_price(l_index).total_amount := round(l_fc_rec.total_amount,2);
2525             ELSE
2526                x_freight_cost_main_charge(l_index).line_type_code := l_fc_rec.line_type_code;
2527                x_freight_cost_main_charge(l_index).delivery_detail_id := l_fc_rec.delivery_detail_id;
2528                x_freight_cost_main_charge(l_index).quantity := l_fc_rec.quantity;
2529                x_freight_cost_main_charge(l_index).unit_amount := round(l_fc_rec.unit_amount,2);
2530                x_freight_cost_main_charge(l_index).total_amount := round(l_fc_rec.total_amount,2);
2531             END IF;
2532 
2533          ELSE
2534 
2535             IF p_line_type_code IS NULL THEN   --  base price
2536                x_freight_cost_temp_price(l_index).line_type_code := l_fc_rec.line_type_code;
2537                x_freight_cost_temp_price(l_index).delivery_detail_id := l_fc_rec.delivery_detail_id;
2538                x_freight_cost_temp_price(l_index).quantity := l_fc_rec.quantity;
2539                x_freight_cost_temp_price(l_index).unit_amount := round(l_fc_rec.unit_amount,2);
2540                x_freight_cost_temp_price(l_index).total_amount := round(l_fc_rec.total_amount,2);
2541             ELSE
2542                x_freight_cost_temp_charge(l_index).line_type_code := l_fc_rec.line_type_code;
2543                x_freight_cost_temp_charge(l_index).delivery_detail_id := l_fc_rec.delivery_detail_id;
2544                x_freight_cost_temp_charge(l_index).quantity := l_fc_rec.quantity;
2545                x_freight_cost_temp_charge(l_index).unit_amount := round(l_fc_rec.unit_amount,2);
2546                x_freight_cost_temp_charge(l_index).total_amount := round(l_fc_rec.total_amount,2);
2547             END IF;
2548 
2549          END IF;
2550 
2551         ELSIF p_category_id IS NULL AND p_basis IS NULL  THEN
2552 
2553                l_sum := l_sum + l_quantity;
2554 
2555         END IF;
2556 
2557       END IF;
2558 
2559       EXIT WHEN i = g_rolledup_lines.LAST;
2560       i := g_rolledup_lines.NEXT(i);
2561    END LOOP;
2562 
2563    FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'l_sum='||l_sum);
2564    x_quantity := l_sum;
2565    FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'get_rolledup_amount');
2566 
2567 EXCEPTION
2568    WHEN others THEN
2569         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
2570         FTE_FREIGHT_PRICING_UTIL.set_exception('get_rolledup_amount',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
2571         --FTE_FREIGHT_PRICING_UTIL.print_debug('Unexpected Error : '||SQLCODE||' : '||SQLERRM);
2572         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
2573         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'get_rolledup_amount');
2574 
2575 END get_rolledup_amount;
2576 
2577 PROCEDURE get_fc_type_id (
2578             p_line_type_code       IN  VARCHAR2,
2579             p_charge_subtype_code  IN  VARCHAR2 DEFAULT NULL,
2580             x_freight_cost_type_id OUT NOCOPY  NUMBER,
2581             x_return_status        OUT NOCOPY  VARCHAR2 )
2582                                                            -- RETURN NUMBER
2583                                                            -- Also get the charge_subtype_code
2584                                                            -- for line type code = 'CHARGE'
2585 IS
2586 
2587    CURSOR  c_get_fc_type_id IS
2588    SELECT  freight_cost_type_id
2589    FROM    WSH_FREIGHT_COST_TYPES
2590    WHERE   freight_cost_type_code = p_line_type_code;
2591 
2592    CURSOR  c_get_fc_charge_type_id IS
2593    SELECT  freight_cost_type_id
2594    FROM    WSH_FREIGHT_COST_TYPES
2595    WHERE   freight_cost_type_code = p_line_type_code
2596    AND     name                   = p_charge_subtype_code;
2597 
2598    l_freight_cost_type_id       NUMBER:=0;
2599    l_type_count                 NUMBER:=0;
2600 
2601    l_log_level     NUMBER := FTE_FREIGHT_PRICING_UTIL.G_DBG;
2602 
2603 BEGIN
2604 
2605    x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
2606    FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
2607    FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,'get_fc_type_id','start');
2608 
2609    IF p_charge_subtype_code IS NOT NULL THEN
2610    FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'charge');
2611 
2612    OPEN  c_get_fc_charge_type_id;
2613    FETCH c_get_fc_charge_type_id INTO l_freight_cost_type_id;
2614    l_type_count := c_get_fc_charge_type_id%ROWCOUNT;
2615    CLOSE c_get_fc_charge_type_id;
2616 
2617    ELSE
2618    FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'not charge');
2619 
2620    OPEN c_get_fc_type_id;
2621    FETCH c_get_fc_type_id INTO l_freight_cost_type_id;
2622    l_type_count := c_get_fc_type_id%ROWCOUNT;
2623    CLOSE c_get_fc_type_id;
2624 
2625    END IF;
2626    IF l_type_count = 0 THEN
2627       raise FTE_FREIGHT_PRICING_UTIL.g_invalid_fc_type;
2628    END IF;
2629 
2630    x_freight_cost_type_id := l_freight_cost_type_id;
2631    FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'get_fc_type_id');
2632 
2633 EXCEPTION
2634    WHEN FTE_FREIGHT_PRICING_UTIL.g_invalid_fc_type THEN
2635         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
2636         FTE_FREIGHT_PRICING_UTIL.set_exception('get_fc_type_id',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_invalid_fc_type');
2637         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'get_fc_type_id');
2638    WHEN others THEN
2639         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
2640         FTE_FREIGHT_PRICING_UTIL.set_exception('get_fc_type_id',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
2641         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
2642         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'get_fc_type_id');
2643 
2644 END get_fc_type_id;
2645 
2646 PROCEDURE prepare_fc_records (
2647          p_delivery_detail_id       IN NUMBER,  --  Top level container / loose item
2648          p_delivery_id              IN NUMBER,   --  Will be delivery id for 'T'
2649          p_entity_id                IN NUMBER,   --  Will be delivery id for 'T' and delivery leg id for 'M'
2650          p_qp_output_line_row       IN QP_PREQ_GRP.LINE_REC_TYPE,
2651          p_qp_output_detail_rows    IN QP_PREQ_GRP.LINE_DETAIL_TBL_TYPE,
2652          p_pricing_engine_input     IN pricing_engine_input_tab_type,
2653          p_grouping_level           IN VARCHAR2 DEFAULT NULL,
2654          p_aggregation              IN VARCHAR2 DEFAULT NULL,
2655          p_save_flag                IN VARCHAR2,
2656          p_rate_basis               IN VARCHAR2 DEFAULT NULL,
2657          x_container_summary        IN OUT NOCOPY container_sum_tab_type,
2658          x_fc_dleg_rows             IN OUT NOCOPY dlvy_leg_summ_tab_type,
2659          x_freight_cost_main_price  IN OUT NOCOPY Freight_Cost_Main_Tab_Type,
2660          x_freight_cost_temp_price  IN OUT NOCOPY Freight_Cost_Temp_Tab_Type,
2661          x_freight_cost_main_charge IN OUT NOCOPY Freight_Cost_Main_Tab_Type,
2662          x_freight_cost_temp_charge IN OUT NOCOPY Freight_Cost_Temp_Tab_Type,
2663          x_return_status            OUT NOCOPY  VARCHAR2)
2664 IS
2665 
2666          m                             NUMBER:=0;
2667          n                             NUMBER:=0;
2668          o                             NUMBER:=0;
2669          l_output_fte                  NUMBER:=0;
2670          l_output_wsh                  NUMBER:=0;
2671          l_charge_unit_value           NUMBER:=0;
2672          l_dleg_sum_amount             NUMBER:=0;
2673          l_fte_total_amount            NUMBER:=0;
2674          l_curr_fc_count               NUMBER:=0;
2675          l_end_fc_count                NUMBER:=0;
2676          l_category_price              NUMBER:=0;
2677          l_container_price             NUMBER:=0;
2678          l_basis_price                 NUMBER:=0;
2679          l_category_charge             NUMBER:=0;
2680          l_container_charge            NUMBER:=0;
2681          l_basis_charge                NUMBER:=0;
2682          l_category_sum                NUMBER:=0;
2683          l_basis_sum                   NUMBER:=0;
2684          l_total_amount                NUMBER:=0;
2685          l_charge_total_amount         NUMBER:=0;
2686          l_discount_total_amount       NUMBER:=0;
2687          l_freight_cost_type_id        NUMBER:=0;
2688          l_delivery_detail_id          NUMBER:=0;
2689          l_discount_total              NUMBER:=0;
2690          l_discount_cont               NUMBER:=0;
2691          l_container_quantity          NUMBER:=0;
2692          l_return_status               VARCHAR2(1);
2693          --l_container_summary           WSH_UTIL_CORE.id_tab_type;
2694          l_container_summary           container_sum_tab_type;
2695          l_main_price_index            NUMBER:=x_freight_cost_main_price.COUNT;
2696          l_main_charge_index           NUMBER:=x_freight_cost_main_charge.COUNT;
2697          l_temp_price_index            NUMBER:=x_freight_cost_temp_price.COUNT;
2698          l_temp_charge_index           NUMBER:=x_freight_cost_temp_charge.COUNT;
2699          l_fc_dlvd_rows                total_discount_tab_type;
2700          l_fc_rec                      top_level_fc_rec_type;
2701          l_fc_charge_rec               top_level_fc_rec_type;
2702 
2703          l_freight_cost_main_price   Freight_Cost_Main_Tab_Type;
2704          l_freight_cost_temp_price   Freight_Cost_Temp_Tab_Type;
2705          l_freight_cost_main_charge  Freight_Cost_Main_Tab_Type;
2706          l_freight_cost_temp_charge  Freight_Cost_Temp_Tab_Type;
2707 
2708          l_log_level     NUMBER := FTE_FREIGHT_PRICING_UTIL.G_INF;
2709          l_billed_weight   NUMBER;
2710 
2711 BEGIN
2712 
2713       x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
2714       FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
2715       FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,'prepare_fc_records','start');
2716 
2717       l_fte_total_amount := 0;
2718       l_main_price_index :=l_main_price_index + 1;
2719       l_temp_price_index :=l_temp_price_index + 1;
2720 
2721       l_fc_rec.delivery_detail_id := p_delivery_detail_id;
2722       l_fc_rec.delivery_leg_id    := p_entity_id;
2723 
2724       l_fc_rec.line_type_code     := 'PRICE';
2725       l_fc_rec.currency_code      := p_qp_output_line_row.currency_code ;
2726       l_fc_rec.quantity           := p_pricing_engine_input(p_qp_output_line_row.line_index).line_quantity;
2727       l_fc_rec.uom                := p_pricing_engine_input(p_qp_output_line_row.line_index).line_uom;
2728 
2729       -- uom conversion
2730       --l_fc_rec.charge_unit_value  := p_qp_output_line_row.unit_price;
2731       l_fc_rec.charge_unit_value  := (p_qp_output_line_row.unit_price)*(p_qp_output_line_row.priced_quantity/l_fc_rec.quantity);
2732       FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'l_fc_rec.quantity='||l_fc_rec.quantity);
2733       FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'l_fc_rec.uom='||l_fc_rec.uom);
2734       FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'l_fc_rec.charge_unit_value='||l_fc_rec.charge_unit_value);
2735 
2736       FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,' QP Output Detail row count : '||p_qp_output_detail_rows.COUNT);
2737       m := p_qp_output_detail_rows.FIRST;    --   Determine the charges/discounts
2738       IF m IS NOT NULL THEN
2739       -- {
2740       LOOP
2741        -- {
2742        l_discount_cont  := 0;
2743        l_discount_total :=0;
2744 
2745        IF p_qp_output_detail_rows(m).list_line_type_code = 'SUR' OR
2746           p_qp_output_detail_rows(m).list_line_type_code = 'DIS' THEN
2747        -- {
2748 
2749          IF p_qp_output_line_row.line_index = p_qp_output_detail_rows(m).line_index THEN
2750          -- {
2751 
2752             l_fc_charge_rec.delivery_detail_id := p_delivery_detail_id;
2753             l_fc_charge_rec.delivery_leg_id    := p_entity_id;
2754 
2755             l_fc_charge_rec.line_type_code     := p_qp_output_detail_rows(m).charge_subtype_code;
2756             l_fc_charge_rec.currency_code      := p_qp_output_line_row.currency_code ;
2757             -- No change for dfw
2758             l_fc_charge_rec.quantity           := p_pricing_engine_input(p_qp_output_line_row.line_index).line_quantity;
2759             l_fc_charge_rec.uom                := p_pricing_engine_input(p_qp_output_line_row.line_index).line_uom;
2760             -- uom conversion
2761             l_charge_unit_value                := ABS(p_qp_output_detail_rows(m).adjustment_amount);
2762             -- No change for dfw
2763             --l_fc_charge_rec.charge_unit_value  := (ABS(p_qp_output_detail_rows(m).adjustment_amount))*(p_qp_output_line_row.priced_quantity/l_fc_charge_rec.quantity);
2764             l_fc_charge_rec.charge_unit_value  := (l_charge_unit_value)*(p_qp_output_line_row.priced_quantity/l_fc_charge_rec.quantity);
2765 
2766             l_output_fte := l_charge_unit_value*p_qp_output_line_row.priced_quantity;
2767 
2768 
2769 
2770             IF p_save_flag = 'M' THEN
2771                l_curr_fc_count := x_freight_cost_main_charge.COUNT;
2772             ELSE
2773                l_curr_fc_count := x_freight_cost_temp_charge.COUNT;
2774             END IF;
2775 
2776             IF p_pricing_engine_input(p_qp_output_line_row.line_index).loose_item_id IS NOT NULL THEN
2777             -- {
2778 
2779                -- Variable to keep track of the sum of the charges for the loose item
2780 
2781                -- Take care of the fc rows
2782                 l_main_price_index       := l_curr_fc_count + 1;
2783 
2784                IF p_save_flag = 'M' THEN  --  Populate appropriate columns
2785                -- {
2786 
2787                 x_freight_cost_main_charge(l_main_price_index).delivery_detail_id := p_pricing_engine_input(p_qp_output_line_row.line_index).loose_item_id;
2788                 x_freight_cost_main_charge(l_main_price_index).quantity := p_pricing_engine_input(p_qp_output_line_row.line_index).line_quantity;
2789                 x_freight_cost_main_charge(l_main_price_index).total_amount := round(l_output_fte,2);
2790 
2791 
2792 
2793 
2794                 IF p_qp_output_detail_rows(m).list_line_type_code <> 'DIS' THEN
2795 
2796                   x_freight_cost_main_charge(l_main_price_index).unit_amount := round(l_output_fte,2);
2797 
2798                 ELSE
2799 
2800                   x_freight_cost_main_charge(l_main_price_index).line_type_code := 'DISCOUNT';
2801 
2802                 END IF;
2803 
2804                -- }
2805                ELSE
2806                -- {
2807 
2808                 x_freight_cost_temp_charge(l_main_price_index).delivery_detail_id := p_pricing_engine_input(p_qp_output_line_row.line_index).loose_item_id;
2809                 x_freight_cost_temp_charge(l_main_price_index).quantity := p_pricing_engine_input(p_qp_output_line_row.line_index).line_quantity;
2810                 x_freight_cost_temp_charge(l_main_price_index).total_amount := round(l_output_fte,2);
2811 
2812 
2813                 IF p_qp_output_detail_rows(m).list_line_type_code <> 'DIS' THEN
2814 
2815                   x_freight_cost_temp_charge(l_main_price_index).unit_amount := round(l_output_fte,2);
2816 
2817                 ELSE
2818 
2819                   x_freight_cost_temp_charge(l_main_price_index).line_type_code := 'DISCOUNT';
2820 
2821                 END IF;
2822 
2823                -- }
2824                END IF;
2825 
2826             -- }
2827             ELSE  --  Need to prorate among the top level lines
2828             -- {
2829 
2830                IF p_aggregation = 'WITHIN' THEN
2831                -- {
2832                --  Need to prorate back to top level lines based on the category
2833                --  Find out the output line category and quantity : x
2834                --  Find out the rolledup line quantity for that category :y
2835                --  l_fc_charge_rec.total_amount = output line total_amount * y/x
2836 
2837                -- This API would put the freight costs with the applicable/appropriate delivery detail
2838                -- i.e. rolled up line, It would also populate the total_amount and unit_amount
2839 
2840                   get_rolledup_amount(
2841                                p_container_id  =>  p_delivery_detail_id,
2842                                --p_basis         =>  p_pricing_engine_input(p_qp_output_line_row.line_index).basis,
2843                                p_category_id   =>  p_pricing_engine_input(p_qp_output_line_row.line_index).category_id,
2844                                p_line_type_code => p_qp_output_detail_rows(m).list_line_type_code,
2845                                p_wsh_amount     =>  l_output_fte,
2846                                p_fte_amount     =>  l_output_fte,
2847                                p_fc_dlvd_rows   =>  l_fc_dlvd_rows,  --  dummy
2848                                p_quantity      =>   p_pricing_engine_input(p_qp_output_line_row.line_index).line_quantity,
2849                                p_uom           =>  l_fc_charge_rec.uom,
2850                                p_save_flag     =>  p_save_flag,
2851                                x_freight_cost_main_price  => l_freight_cost_main_price,
2852                                x_freight_cost_temp_price  => l_freight_cost_temp_price,
2853                                x_freight_cost_main_charge  => x_freight_cost_main_charge,
2854                                x_freight_cost_temp_charge  => x_freight_cost_temp_charge,
2855                                x_quantity      =>  l_category_sum, -- Returns in input uom
2856                                x_return_status =>  l_return_status);
2857 
2858                      IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
2859                         IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
2860                            FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'Charge get_rolled_up');
2861                            raise FTE_FREIGHT_PRICING_UTIL.g_proration_failed;
2862                         END IF;
2863                      ELSE
2864                         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,'Engine row quantity : '||p_pricing_engine_input(p_qp_output_line_row.line_index).line_quantity);
2865                         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,'Container : '||p_delivery_detail_id||' Category : '||p_pricing_engine_input(p_qp_output_line_row.line_index).category_id||' Children Qty Sum : '||l_category_sum);
2866                      END IF;
2867 
2868                      --l_billed_weight := l_category_sum;
2869                    -- When the category is not there in engine row, there is no proration
2870                    IF p_pricing_engine_input(p_qp_output_line_row.line_index).category_id IS NULL
2871                       AND p_grouping_level = 'CONTAINER' THEN
2872                       l_category_sum := p_pricing_engine_input(p_qp_output_line_row.line_index).line_quantity;
2873                    END IF;
2874 
2875 
2876                    -- Need to create container level SUMMARY FC record here
2877                    -- Only if any new fc record got created
2878 
2879                    l_container_charge := l_output_fte * (l_category_sum/p_pricing_engine_input(p_qp_output_line_row.line_index).line_quantity);
2880 
2881                    IF p_qp_output_detail_rows(m).list_line_type_code = 'DIS' THEN
2882 
2883                      l_discount_cont    := l_container_charge;
2884                      l_container_charge := 0 - l_container_charge;
2885 
2886                    END IF;
2887 
2888                    -- new code for loose items
2889                    -- no need for summary records for loose items
2890                    IF ((g_shipment_line_rows(p_delivery_detail_id).container_flag = 'Y')OR (g_shipment_line_rows(p_delivery_detail_id).container_flag = 'C')) THEN
2891                    IF NOT x_container_summary.EXISTS(p_delivery_detail_id) THEN
2892                       x_container_summary(p_delivery_detail_id).currency_code := l_fc_rec.currency_code;
2893                       x_container_summary(p_delivery_detail_id).total_amount := l_container_charge;
2894                       x_container_summary(p_delivery_detail_id).discount_amount   := l_discount_cont;
2895 
2896                   --MDC
2897                       --x_container_summary(p_delivery_detail_id).delivery_id   := p_delivery_id;
2898                   x_container_summary(p_delivery_detail_id).delivery_id   := g_shipment_line_rows(p_delivery_detail_id).delivery_id;
2899 
2900 
2901 
2902                       IF p_save_flag = 'M' THEN
2903                          x_container_summary(p_delivery_detail_id).delivery_leg_id   := p_entity_id;
2904                       END IF;
2905                    ELSE
2906                       x_container_summary(p_delivery_detail_id).total_amount := x_container_summary(p_delivery_detail_id).total_amount + l_container_charge;
2907                       x_container_summary(p_delivery_detail_id).discount_amount := x_container_summary(p_delivery_detail_id).discount_amount + l_discount_cont;
2908                    END IF;
2909                    END IF;
2910 
2911                -- }
2912                ELSE
2913                -- {
2914                --  Need to prorate back to top level lines based on the basis
2915                --  Find out the output line basis and quantity : x
2916                --  Find out the rolledup line quantity for that basis :y
2917                --  l_fc_charge_rec.total_amount = output line total_amount * y/x
2918 
2919                   --  New API : Case for global l_rolledup_lines
2920                   get_rolledup_amount(
2921                                p_container_id  =>  p_delivery_detail_id,
2922                                p_basis         =>  p_pricing_engine_input(p_qp_output_line_row.line_index).basis,
2923                                --p_line_type_code => p_qp_output_detail_rows(m).charge_subtype_code,
2924                                p_line_type_code => p_qp_output_detail_rows(m).list_line_type_code,
2925                                p_wsh_amount     =>  l_output_fte,
2926                                p_fte_amount     =>  l_output_fte,
2927                                p_fc_dlvd_rows   =>  l_fc_dlvd_rows,  --  dummy
2928                                p_quantity      =>   p_pricing_engine_input(p_qp_output_line_row.line_index).line_quantity,
2929                                p_uom           =>  l_fc_charge_rec.uom,
2930                                p_save_flag     =>  p_save_flag,
2931                                x_freight_cost_main_price  => l_freight_cost_main_price,
2932                                x_freight_cost_temp_price  => l_freight_cost_temp_price,
2933                                x_freight_cost_main_charge  => x_freight_cost_main_charge,
2934                                x_freight_cost_temp_charge  => x_freight_cost_temp_charge,
2935                                x_quantity      =>  l_basis_sum, -- Returns in input uom
2936                                x_return_status =>  l_return_status);
2937 
2938                      IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
2939                         IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
2940                            FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'Charge get_rolled_up');
2941                            raise FTE_FREIGHT_PRICING_UTIL.g_proration_failed;
2942                         END IF;
2943                      ELSE
2944                         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,'Engine row quantity : '||p_pricing_engine_input(p_qp_output_line_row.line_index).line_quantity);
2945                         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,'Container : '||p_delivery_detail_id||' Basis : '||p_pricing_engine_input(p_qp_output_line_row.line_index).basis||' Children Qty Sum : '||l_basis_sum);
2946                      END IF;
2947 
2948                    -- When the basis is not there in engine row, there is no proration
2949                    IF p_pricing_engine_input(p_qp_output_line_row.line_index).basis IS NULL
2950                       AND p_grouping_level = 'CONTAINER' THEN
2951                       l_basis_sum := p_pricing_engine_input(p_qp_output_line_row.line_index).line_quantity;
2952                    END IF;
2953 
2954                    -- Need to create container level SUMMARY FC record here
2955 
2956                    l_container_charge := l_output_fte * (l_basis_sum/p_pricing_engine_input(p_qp_output_line_row.line_index).line_quantity);
2957 
2958                    IF p_qp_output_detail_rows(m).list_line_type_code = 'DIS' THEN
2959 
2960                      l_discount_cont    := l_container_charge;
2961                      l_container_charge := 0 - l_container_charge;
2962 
2963                    END IF;
2964 
2965                    -- new code for loose items
2966                    -- no need for summary records for loose items
2967                    IF ((g_shipment_line_rows(p_delivery_detail_id).container_flag = 'Y') OR (g_shipment_line_rows(p_delivery_detail_id).container_flag = 'C')) THEN
2968                    IF NOT x_container_summary.EXISTS(p_delivery_detail_id) THEN
2969                       x_container_summary(p_delivery_detail_id).currency_code := l_fc_rec.currency_code;
2970                       x_container_summary(p_delivery_detail_id).total_amount := l_container_charge;
2971                       x_container_summary(p_delivery_detail_id).discount_amount   := l_discount_cont;
2972 
2973                       --x_container_summary(p_delivery_detail_id) := l_container_charge;
2974                       --MDC
2975                       --x_container_summary(p_delivery_detail_id).delivery_id   := p_delivery_id;
2976                       x_container_summary(p_delivery_detail_id).delivery_id   := g_shipment_line_rows(p_delivery_detail_id).delivery_id;
2977 
2978                       -- Billable Weight at Container Level Summary
2979                       x_container_summary(p_delivery_detail_id).bquantity   := l_basis_sum;
2980                       x_container_summary(p_delivery_detail_id).bbasis   :=  p_pricing_engine_input(p_qp_output_line_row.line_index).basis;
2981                       x_container_summary(p_delivery_detail_id).buom   := l_fc_charge_rec.uom;
2982 
2983                       IF p_save_flag = 'M' THEN
2984                          --MDC
2985                          --x_container_summary(p_delivery_detail_id).delivery_leg_id   := p_entity_id;
2986                            x_container_summary(p_delivery_detail_id).delivery_leg_id   := g_shipment_line_rows(p_delivery_detail_id).delivery_leg_id;
2987                       END IF;
2988                    ELSE
2989                       x_container_summary(p_delivery_detail_id).total_amount := x_container_summary(p_delivery_detail_id).total_amount + l_container_charge;
2990                       x_container_summary(p_delivery_detail_id).discount_amount := x_container_summary(p_delivery_detail_id).discount_amount + l_discount_cont;
2991                       --x_container_summary(p_delivery_detail_id) := x_container_summary(p_delivery_detail_id) + l_container_charge;
2992                    END IF;
2993                    END IF;
2994 
2995                -- }
2996                END IF;
2997 
2998             -- }
2999             END IF;
3000 
3001             IF p_save_flag = 'M' THEN
3002                l_end_fc_count := x_freight_cost_main_charge.COUNT;
3003             ELSE
3004                l_end_fc_count := x_freight_cost_temp_charge.COUNT;
3005             END IF;
3006 
3007             IF l_end_fc_count = l_curr_fc_count THEN  -- Do it only if No rolled up lines got new fc records
3008             -- {
3009                                       -- And it is not because the container did not have any matching lines
3010                                       -- eg.in case of consolidating SCWB with MCWB
3011 
3012              IF p_aggregation = 'ACROSS' AND p_pricing_engine_input(p_qp_output_line_row.line_index).basis IS NULL
3013              -- {
3014                  AND p_pricing_engine_input(p_qp_output_line_row.line_index).loose_item_id IS NULL THEN
3015 
3016               -- If basis on the input engine line is NULL for commodity_aggregation = 'ACROSS'
3017               -- Put the charge at the container level itself with the proper line type code
3018               -- In this case the container will not have the summary record
3019               -- What about unit amount
3020               -- For these kind of lines unit amount and total amount follows exactly the same logic
3021 
3022                l_main_price_index := l_end_fc_count + 1;
3023                l_container_quantity := p_pricing_engine_input(p_qp_output_line_row.line_index).line_quantity;
3024 
3025                IF p_save_flag = 'M' THEN  --  Populate appropriate columns
3026 
3027                      x_freight_cost_main_charge(l_main_price_index).delivery_detail_id := p_delivery_detail_id;
3028                      -- This quantity will now become the container level gross quantity
3029                      x_freight_cost_main_charge(l_main_price_index).quantity := l_container_quantity;
3030 
3031                      x_freight_cost_main_charge(l_main_price_index).total_amount := round(l_output_fte,2);
3032 
3033                      IF p_qp_output_detail_rows(m).list_line_type_code <> 'DIS' THEN
3034                        x_freight_cost_main_charge(l_main_price_index).unit_amount := round(l_output_fte,2);
3035                      END IF;
3036 
3037 
3038                ELSE
3039 
3040                      x_freight_cost_temp_charge(l_main_price_index).delivery_detail_id := p_delivery_detail_id;
3041                      -- This quantity will now become the container level gross quantity
3042                      x_freight_cost_temp_charge(l_main_price_index).quantity := l_container_quantity;
3043 
3044                      x_freight_cost_temp_charge(l_main_price_index).total_amount := round(l_output_fte,2);
3045 
3046                      IF p_qp_output_detail_rows(m).list_line_type_code <> 'DIS' THEN
3047                        x_freight_cost_temp_charge(l_main_price_index).unit_amount := round(l_output_fte,2);
3048                      END IF;
3049 
3050 
3051                END IF;
3052                l_end_fc_count := l_end_fc_count + 1;
3053 
3054              -- }
3055              END IF;
3056 
3057             -- }
3058             END IF;
3059 
3060             IF p_qp_output_detail_rows(m).list_line_type_code = 'SUR' THEN
3061                --l_freight_cost_type_id := get_fc_type_id(
3062                get_fc_type_id(
3063                       p_line_type_code => 'FTECHARGE',
3064                       p_charge_subtype_code  => l_fc_charge_rec.line_type_code,
3065                       x_freight_cost_type_id  =>  l_freight_cost_type_id,
3066                       x_return_status  =>  l_return_status);
3067             ELSIF p_qp_output_detail_rows(m).list_line_type_code = 'DIS' THEN
3068                --l_freight_cost_type_id := get_fc_type_id(
3069                get_fc_type_id(
3070                       p_line_type_code => 'FTEDISCOUNT',
3071                       p_charge_subtype_code  => 'DISCOUNT',
3072                       x_freight_cost_type_id  =>  l_freight_cost_type_id,
3073                       x_return_status  =>  l_return_status);
3074             END IF;
3075 
3076             IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
3077                IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
3078                   raise FTE_FREIGHT_PRICING_UTIL.g_get_fc_type_failed;
3079                END IF;
3080             ELSE
3081                FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,'fc type id : '||l_freight_cost_type_id);
3082             END IF;
3083 
3084             l_fte_total_amount := 0;
3085 
3086             IF l_end_fc_count > l_curr_fc_count THEN
3087             -- {
3088 
3089             n := l_curr_fc_count + 1;    --   Determine the charges/discounts
3090 
3091             LOOP
3092 
3093             IF p_save_flag = 'M' THEN  --  Populate appropriate columns
3094 
3095                IF x_freight_cost_main_charge(n).line_type_code IS NULL THEN
3096 
3097                   x_freight_cost_main_charge(n).line_type_code := 'CHARGE';
3098 
3099                END IF;
3100 
3101                x_freight_cost_main_charge(n).charge_source_code := 'PRICING_ENGINE';
3102                --x_freight_cost_main_charge(n).estimated_flag := 'Y';
3103                x_freight_cost_main_charge(n).estimated_flag := 'N';
3104 
3105                x_freight_cost_main_charge(n).freight_cost_type_id := l_freight_cost_type_id;
3106                --x_freight_cost_main_charge(n).delivery_leg_id := l_fc_charge_rec.delivery_leg_id;
3107 
3108 	       --MDC
3109                --x_freight_cost_main_charge(n).delivery_leg_id := p_entity_id;
3110                --x_freight_cost_main_charge(n).delivery_id := p_delivery_id;
3111 
3112                x_freight_cost_main_charge(n).delivery_leg_id := g_shipment_line_rows(x_freight_cost_main_charge(n).delivery_detail_id).delivery_leg_id;
3113                x_freight_cost_main_charge(n).delivery_id := g_shipment_line_rows(x_freight_cost_main_charge(n).delivery_detail_id).delivery_id;
3114 
3115 
3116                x_freight_cost_main_charge(n).currency_code := l_fc_charge_rec.currency_code;
3117                x_freight_cost_main_charge(n).uom := l_fc_charge_rec.uom;
3118                x_freight_cost_main_charge(n).charge_unit_value := l_fc_charge_rec.charge_unit_value;
3119 
3120                l_total_amount :=  x_freight_cost_main_charge(n).total_amount;
3121 
3122                IF x_freight_cost_main_charge(n).line_type_code = 'DISCOUNT' THEN
3123 
3124                   l_total_amount := 0 - l_total_amount;
3125                   l_discount_total := x_freight_cost_main_charge(n).total_amount;
3126 
3127                END IF;
3128 
3129                l_delivery_detail_id := x_freight_cost_main_charge(n).delivery_detail_id;
3130 
3131             -- ELSIF p_save_flag = 'T' THEN
3132             ELSE        -- VVP (OM Est change)
3133 
3134                IF x_freight_cost_temp_charge(n).line_type_code IS NULL THEN
3135 
3136                   x_freight_cost_temp_charge(n).line_type_code := 'CHARGE';
3137 
3138                END IF;
3139 
3140                x_freight_cost_temp_charge(n).charge_source_code := 'PRICING_ENGINE';
3141                x_freight_cost_temp_charge(n).estimated_flag := 'Y';
3142 
3143                x_freight_cost_temp_charge(n).freight_cost_type_id := l_freight_cost_type_id;
3144 
3145 	       --MDC
3146                --x_freight_cost_temp_charge(n).delivery_id := p_entity_id;
3147 	       x_freight_cost_temp_charge(n).delivery_id := g_shipment_line_rows(x_freight_cost_temp_charge(n).delivery_detail_id).delivery_id;
3148 
3149                x_freight_cost_temp_charge(n).currency_code := l_fc_charge_rec.currency_code;
3150                x_freight_cost_temp_charge(n).uom := l_fc_charge_rec.uom;
3151                x_freight_cost_temp_charge(n).charge_unit_value := l_fc_charge_rec.charge_unit_value;
3152 
3153                l_total_amount :=  x_freight_cost_temp_charge(n).total_amount;
3154 
3155                IF x_freight_cost_temp_charge(n).line_type_code = 'DISCOUNT' THEN
3156 
3157                   l_total_amount := 0 - l_total_amount;
3158                   l_discount_total := x_freight_cost_temp_charge(n).total_amount;
3159 
3160                END IF;
3161 
3162                l_delivery_detail_id := x_freight_cost_temp_charge(n).delivery_detail_id;
3163 
3164             END IF;
3165 
3166             -- WSH amount for base price lines should be base price
3167             -- less sum of the discounts on that base price
3168 
3169             IF NOT l_fc_dlvd_rows.EXISTS(l_delivery_detail_id) THEN
3170                 l_fc_dlvd_rows(l_delivery_detail_id).total_amount := l_total_amount;
3171                 l_fc_dlvd_rows(l_delivery_detail_id).discount_amount := l_discount_total;
3172                 FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Discount total for detail '||l_delivery_detail_id||' is '||l_fc_dlvd_rows(l_delivery_detail_id).discount_amount);
3173             ELSE
3174                 l_fc_dlvd_rows(l_delivery_detail_id).total_amount := l_fc_dlvd_rows(l_delivery_detail_id).total_amount + l_total_amount;
3175                 l_fc_dlvd_rows(l_delivery_detail_id).discount_amount := l_fc_dlvd_rows(l_delivery_detail_id).discount_amount + l_discount_total;
3176                 FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Discount total for detail '||l_delivery_detail_id||' is '||l_fc_dlvd_rows(l_delivery_detail_id).discount_amount);
3177             END IF;
3178 
3179             IF p_save_flag = 'M' THEN
3180 
3181             EXIT WHEN n = x_freight_cost_main_charge.LAST;   --  Same number of rows in either table
3182             n := x_freight_cost_main_charge.NEXT(n);
3183 
3184             ELSE
3185 
3186             EXIT WHEN n = x_freight_cost_temp_charge.LAST;   --  Same number of rows in either table
3187             n := x_freight_cost_temp_charge.NEXT(n);
3188 
3189             END IF;
3190 
3191             END LOOP;
3192 
3193           --}
3194           END IF;   -- No new fc records were created
3195 
3196          -- }
3197          END IF;
3198 
3199         -- }   -- 'SUR' or 'DIS'
3200         END IF;
3201 
3202         EXIT WHEN m = p_qp_output_detail_rows.LAST;
3203         m := p_qp_output_detail_rows.NEXT(m);
3204        -- }
3205       END LOOP;
3206       -- }
3207       ELSE
3208       -- {
3209          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,'NO QP line detail records created');
3210       -- }
3211       END IF;
3212 
3213       l_charge_unit_value  := p_qp_output_line_row.unit_price;
3214       --l_output_wsh := l_fc_rec.charge_unit_value * l_fc_rec.quantity;
3215       l_output_wsh := l_charge_unit_value * p_qp_output_line_row.priced_quantity;
3216 
3217       IF p_save_flag = 'M' THEN
3218          l_curr_fc_count := x_freight_cost_main_price.COUNT;
3219       ELSE
3220          l_curr_fc_count := x_freight_cost_temp_price.COUNT;
3221       END IF;
3222 
3223       IF p_pricing_engine_input(p_qp_output_line_row.line_index).loose_item_id IS NOT NULL THEN
3224       -- {
3225 
3226          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Loose item id : '||p_pricing_engine_input(p_qp_output_line_row.line_index).loose_item_id);
3227 
3228                l_main_price_index       := l_curr_fc_count + 1;
3229 
3230                IF l_fc_dlvd_rows.COUNT > 0 THEN
3231                   l_charge_total_amount := l_fc_dlvd_rows(p_pricing_engine_input(p_qp_output_line_row.line_index).loose_item_id).total_amount;
3232                   l_discount_total_amount := l_fc_dlvd_rows(p_pricing_engine_input(p_qp_output_line_row.line_index).loose_item_id).discount_amount;
3233                ELSE
3234                   l_charge_total_amount := 0;
3235                   l_discount_total_amount := 0;
3236                END IF;
3237 
3238                IF p_save_flag = 'M' THEN  --  Populate appropriate columns
3239 
3240                 x_freight_cost_main_price(l_main_price_index).delivery_detail_id := p_pricing_engine_input(p_qp_output_line_row.line_index).loose_item_id;
3241                 x_freight_cost_main_price(l_main_price_index).quantity := p_pricing_engine_input(p_qp_output_line_row.line_index).line_quantity;
3242                 x_freight_cost_main_price(l_main_price_index).unit_amount := round(l_output_wsh - l_discount_total_amount,2);
3243 
3244                 x_freight_cost_main_price(l_main_price_index).total_amount := round(l_output_wsh + l_charge_total_amount,2);
3245 
3246                ELSE
3247 
3248                 x_freight_cost_temp_price(l_main_price_index).delivery_detail_id := p_pricing_engine_input(p_qp_output_line_row.line_index).loose_item_id;
3249                 x_freight_cost_temp_price(l_main_price_index).quantity := p_pricing_engine_input(p_qp_output_line_row.line_index).line_quantity;
3250                 x_freight_cost_temp_price(l_main_price_index).unit_amount := round(l_output_wsh - l_discount_total_amount,2);
3251 
3252                 x_freight_cost_temp_price(l_main_price_index).total_amount := round(l_output_wsh + l_charge_total_amount,2);
3253 
3254                END IF;
3255 
3256       -- }
3257       ELSE  --  Need to prorate among the top level lines
3258       -- {
3259 
3260          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,'p_aggregation= '||p_aggregation);
3261          IF p_aggregation = 'WITHIN' THEN
3262          -- {
3263          --  Need to prorate back to top level lines based on the category
3264 
3265                   --  New API : Case for global l_rolledup_lines
3266                   FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,' Basis is : '||p_pricing_engine_input(p_qp_output_line_row.line_index).basis);
3267                   get_rolledup_amount(
3268                                p_container_id  =>  p_delivery_detail_id,
3269                                --p_basis         =>  p_pricing_engine_input(p_qp_output_line_row.line_index).basis,
3270                                p_category_id   =>  p_pricing_engine_input(p_qp_output_line_row.line_index).category_id,
3271                                p_wsh_amount    =>  l_output_wsh,
3272                                p_fc_dlvd_rows  =>  l_fc_dlvd_rows,
3273                                p_quantity      =>   p_pricing_engine_input(p_qp_output_line_row.line_index).line_quantity,
3274                                p_uom           =>  l_fc_rec.uom,
3275                                p_save_flag     =>  p_save_flag,
3276                                x_freight_cost_main_price  => x_freight_cost_main_price,
3277                                x_freight_cost_temp_price  => x_freight_cost_temp_price,
3278                                x_freight_cost_main_charge  => l_freight_cost_main_charge,
3279                                x_freight_cost_temp_charge  => l_freight_cost_temp_charge,
3280                                x_quantity      =>  l_category_sum, -- Returns in input uom
3281                                x_return_status =>  l_return_status);
3282 
3283             FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,' l_category_sum ='||l_category_sum);
3284 
3285                      IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
3286                         IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
3287                            FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'Price get_rolled_up');
3288                            raise FTE_FREIGHT_PRICING_UTIL.g_proration_failed;
3289                         END IF;
3290                      ELSE
3291                         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,'Engine row quantity : '||p_pricing_engine_input(p_qp_output_line_row.line_index).line_quantity);
3292                         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,'Container : '||p_delivery_detail_id||' Category : '||p_pricing_engine_input(p_qp_output_line_row.line_index).category_id||' Children Qty Sum : '||l_category_sum);
3293                      END IF;
3294 
3295                    -- When the category is not there in engine row, there is no proration
3296                    IF p_pricing_engine_input(p_qp_output_line_row.line_index).category_id IS NULL
3297                       AND p_grouping_level = 'CONTAINER' THEN
3298                       l_category_sum := p_pricing_engine_input(p_qp_output_line_row.line_index).line_quantity;
3299                    END IF;
3300 
3301                    -- Need to create container level SUMMARY FC record here
3302 
3303                    l_container_price := l_output_wsh * (l_category_sum/p_pricing_engine_input(p_qp_output_line_row.line_index).line_quantity);
3304 
3305                     l_billed_weight := l_category_sum;
3306                    -- new code for loose items
3307                    -- no need for summary records for loose items
3308                    IF ((g_shipment_line_rows(p_delivery_detail_id).container_flag = 'Y') OR (g_shipment_line_rows(p_delivery_detail_id).container_flag = 'C')) THEN
3309                    -- {
3310                    IF x_container_summary.EXISTS(p_delivery_detail_id) THEN
3311                       x_container_summary(p_delivery_detail_id).total_amount := x_container_summary(p_delivery_detail_id).total_amount + l_container_price;
3312                       x_container_summary(p_delivery_detail_id).discount_amount := l_container_price - x_container_summary(p_delivery_detail_id).discount_amount;
3313 
3314                    ELSE
3315                       x_container_summary(p_delivery_detail_id).currency_code := l_fc_rec.currency_code;
3316                       x_container_summary(p_delivery_detail_id).total_amount :=  l_container_price;
3317                       x_container_summary(p_delivery_detail_id).discount_amount := l_container_price;
3318                       --Billable columns at container level
3319                       x_container_summary(p_delivery_detail_id).bquantity   := l_category_sum;--p_pricing_engine_input(p_qp_output_line_row.line_index).line_quantity;
3320                       x_container_summary(p_delivery_detail_id).bbasis   :=  p_pricing_engine_input(p_qp_output_line_row.line_index).basis;
3321                       x_container_summary(p_delivery_detail_id).buom   := l_fc_rec.uom;
3322 
3323 		      --MDC
3324                       --x_container_summary(p_delivery_detail_id).delivery_id   := p_delivery_id;
3325 		      x_container_summary(p_delivery_detail_id).delivery_id   := g_shipment_line_rows(p_delivery_detail_id).delivery_id;
3326 
3327                       IF p_save_flag = 'M' THEN
3328 			 --MDC
3329                          --x_container_summary(p_delivery_detail_id).delivery_leg_id   := p_entity_id;
3330 			 x_container_summary(p_delivery_detail_id).delivery_leg_id   := g_shipment_line_rows(p_delivery_detail_id).delivery_leg_id;
3331 
3332                       END IF;
3333                    END IF;
3334                    -- }
3335                    END IF;   --container flag
3336 
3337          -- }
3338          ELSE
3339          -- {
3340 
3341                   FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,' Basis 2 is : '||p_pricing_engine_input(p_qp_output_line_row.line_index).basis);
3342                   get_rolledup_amount(
3343                                p_container_id  =>  p_delivery_detail_id,
3344                                p_basis         =>  p_pricing_engine_input(p_qp_output_line_row.line_index).basis,
3345                                p_wsh_amount    =>  l_output_wsh,
3346                                p_fc_dlvd_rows  =>  l_fc_dlvd_rows,
3347                                p_quantity      =>   p_pricing_engine_input(p_qp_output_line_row.line_index).line_quantity,
3348                                p_uom           =>  l_fc_rec.uom,
3349                                p_save_flag     =>  p_save_flag,
3350                                x_freight_cost_main_price  => x_freight_cost_main_price,
3351                                x_freight_cost_temp_price  => x_freight_cost_temp_price,
3352                                x_freight_cost_main_charge  => l_freight_cost_main_charge,
3353                                x_freight_cost_temp_charge  => l_freight_cost_temp_charge,
3354                                x_quantity      =>  l_basis_sum, -- Returns in input uom
3355                                x_return_status =>  l_return_status);
3356 
3357                FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,' l_basis_sum ='||l_basis_sum);
3358 
3359                      IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
3360                         IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
3361                            FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'Price get_rolled_up');
3362                            raise FTE_FREIGHT_PRICING_UTIL.g_proration_failed;
3363                         END IF;
3364                      ELSE
3365                         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,'Engine row quantity : '||p_pricing_engine_input(p_qp_output_line_row.line_index).line_quantity);
3366                         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,'Container : '||p_delivery_detail_id||' Basis : '||p_pricing_engine_input(p_qp_output_line_row.line_index).basis||' Children Qty Sum : '||l_basis_sum);
3367                      END IF;
3368 
3369                    -- When the basis is not there in engine row, there is no proration
3370                    IF p_pricing_engine_input(p_qp_output_line_row.line_index).basis IS NULL
3371                       AND p_grouping_level = 'CONTAINER' THEN
3372                       l_basis_sum := p_pricing_engine_input(p_qp_output_line_row.line_index).line_quantity;
3373                    END IF;
3374 
3375                    -- Need to create container level SUMMARY FC record here
3376 
3377                    l_container_price := l_output_wsh * (l_basis_sum/p_pricing_engine_input(p_qp_output_line_row.line_index).line_quantity);
3378 
3379                    l_billed_weight := l_basis_sum;
3380 
3381                    -- new code for loose items
3382                    -- no need for summary records for loose items
3383                    IF ((g_shipment_line_rows(p_delivery_detail_id).container_flag = 'Y')OR (g_shipment_line_rows(p_delivery_detail_id).container_flag = 'C')) THEN
3384                    -- {
3385                    IF x_container_summary.EXISTS(p_delivery_detail_id) THEN
3386                       x_container_summary(p_delivery_detail_id).total_amount := x_container_summary(p_delivery_detail_id).total_amount + l_container_price;
3387                       x_container_summary(p_delivery_detail_id).discount_amount := l_container_price - x_container_summary(p_delivery_detail_id).discount_amount;
3388 
3389                    ELSE
3390                       x_container_summary(p_delivery_detail_id).currency_code := l_fc_rec.currency_code;
3391                       x_container_summary(p_delivery_detail_id).total_amount :=  l_container_price;
3392                       x_container_summary(p_delivery_detail_id).discount_amount := l_container_price;
3393                       --Billable columns at container level
3394                       x_container_summary(p_delivery_detail_id).bquantity   := p_pricing_engine_input(p_qp_output_line_row.line_index).line_quantity;
3395                       x_container_summary(p_delivery_detail_id).bbasis   :=  p_pricing_engine_input(p_qp_output_line_row.line_index).basis;
3396                       x_container_summary(p_delivery_detail_id).buom   := l_fc_rec.uom;
3397 
3398 
3399 		              --MDC
3400                       --x_container_summary(p_delivery_detail_id).delivery_id   := p_delivery_id;
3401 		             x_container_summary(p_delivery_detail_id).delivery_id   := g_shipment_line_rows(p_delivery_detail_id).delivery_id;
3402                       IF p_save_flag = 'M' THEN
3403 			            --MDC
3404                          --x_container_summary(p_delivery_detail_id).delivery_leg_id   := p_entity_id;
3405 
3406 			             x_container_summary(p_delivery_detail_id).delivery_leg_id   := g_shipment_line_rows(p_delivery_detail_id).delivery_leg_id;
3407 
3408                       END IF;
3409                    END IF;
3410                    -- }
3411                    END IF;
3412 
3413          -- }
3414          END IF;
3415       -- }
3416       END IF;
3417 
3418      FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'l_billed_weight='||l_billed_weight);
3419 
3420       IF p_save_flag = 'M' THEN
3421          l_end_fc_count := x_freight_cost_main_price.COUNT;
3422       ELSE
3423          l_end_fc_count := x_freight_cost_temp_price.COUNT;
3424       END IF;
3425 
3426       FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'No. of fc base price records created w/o Container level BP : '||to_char(l_end_fc_count - l_curr_fc_count));
3427 
3428       IF l_end_fc_count = l_curr_fc_count THEN  -- Do it only if No rolled up lines got new fc records     -- {
3429                                                 -- And it is not because the container did not have any matching lines
3430                                                 -- eg.in case of consolidating SCWB with MCWB
3431 
3432       -- IF p_aggregation = 'ACROSS' AND p_pricing_engine_input(p_qp_output_line_row.line_index).basis IS NULL
3433       --    AND p_pricing_engine_input(p_qp_output_line_row.line_index).loose_item_id IS NULL THEN
3434       IF p_aggregation = 'ACROSS' AND p_pricing_engine_input(p_qp_output_line_row.line_index).basis IS NULL
3435          AND p_pricing_engine_input(p_qp_output_line_row.line_index).loose_item_flag = 'N' THEN
3436       -- {
3437       -- If basis on the input engine line is NULL for commodity_aggregation = 'ACROSS'
3438       -- Put the charge at the container level itself with the proper line type code
3439       -- In this case the container will not have the summary record
3440       -- What about unit amount
3441       -- For these kind of lines unit amount and total amount follows exactly the same logic
3442 
3443        l_main_price_index := l_end_fc_count + 1;
3444        l_container_quantity := p_pricing_engine_input(p_qp_output_line_row.line_index).line_quantity;
3445 
3446 
3447 
3448       FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Container Quantity : '|| l_container_quantity);
3449 
3450        IF p_save_flag = 'M' THEN  --  Populate appropriate columns
3451              x_freight_cost_main_price(l_main_price_index).delivery_detail_id := p_delivery_detail_id;
3452              -- This quantity will now become the container level gross quantity
3453              x_freight_cost_main_price(l_main_price_index).quantity := l_container_quantity;
3454              x_freight_cost_main_price(l_main_price_index).total_amount := round(x_container_summary(p_delivery_detail_id).total_amount,2);
3455              x_freight_cost_main_price(l_main_price_index).unit_amount := round(x_container_summary(p_delivery_detail_id).discount_amount,2);
3456              x_freight_cost_main_price(l_main_price_index).billable_quantity := l_container_quantity;
3457              x_freight_cost_main_price(l_main_price_index).billable_uom := l_fc_rec.uom;
3458              x_freight_cost_main_price(l_main_price_index).billable_basis := p_rate_basis;
3459 
3460        ELSE
3461              x_freight_cost_temp_price(l_main_price_index).delivery_detail_id := p_delivery_detail_id;
3462              -- This quantity will now become the container level gross quantity
3463              x_freight_cost_temp_price(l_main_price_index).quantity := l_container_quantity;
3464              x_freight_cost_temp_price(l_main_price_index).total_amount := round(x_container_summary(p_delivery_detail_id).total_amount,2);
3465              x_freight_cost_temp_price(l_main_price_index).unit_amount := round(x_container_summary(p_delivery_detail_id).discount_amount,2);
3466              x_freight_cost_temp_price(l_main_price_index).billable_quantity := l_container_quantity;
3467              x_freight_cost_temp_price(l_main_price_index).billable_uom := l_fc_rec.uom;
3468              x_freight_cost_temp_price(l_main_price_index).billable_basis := p_rate_basis;
3469 
3470        END IF;
3471        l_end_fc_count := l_end_fc_count + 1;
3472        x_container_summary.DELETE(p_delivery_detail_id);  -- No summary record for this one
3473 
3474       -- }
3475       END IF;
3476 
3477       -- }
3478       END IF;
3479 
3480       FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'No. of fc base price records created in all : '||to_char(l_end_fc_count - l_curr_fc_count));
3481 
3482       IF l_end_fc_count > l_curr_fc_count THEN
3483 
3484         get_fc_type_id(
3485                       p_line_type_code => 'FTEPRICE',
3486                       p_charge_subtype_code  => 'PRICE',
3487                       x_freight_cost_type_id  =>  l_freight_cost_type_id,
3488                       x_return_status  =>  l_return_status);
3489 
3490         IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
3491            IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
3492               raise FTE_FREIGHT_PRICING_UTIL.g_get_fc_type_failed;
3493            END IF;
3494         ELSE
3495            FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,'fc type id : '||l_freight_cost_type_id);
3496         END IF;
3497 
3498         o := l_curr_fc_count + 1;    --   Determine the base price
3499         LOOP
3500 
3501         --l_freight_cost_type_id := get_fc_type_id(
3502 
3503         IF p_save_flag = 'M' THEN  --  Populate appropriate columns
3504 
3505            x_freight_cost_main_price(o).line_type_code := l_fc_rec.line_type_code;
3506            --x_freight_cost_main_price(o).line_type_code := nvl(x_freight_cost_main_price(n).line_type_code,'PRICE');
3507            x_freight_cost_main_price(o).charge_source_code := 'PRICING_ENGINE';
3508            --x_freight_cost_main_price(o).estimated_flag := 'Y';
3509            x_freight_cost_main_price(o).estimated_flag := 'N';
3510            x_freight_cost_main_price(o).freight_cost_type_id := l_freight_cost_type_id;
3511            --x_freight_cost_main_price(o).delivery_leg_id := l_fc_rec.delivery_leg_id;
3512 
3513 	   --MDC
3514 	   --x_freight_cost_main_price(o).delivery_leg_id := p_entity_id;
3515 	   x_freight_cost_main_price(o).delivery_leg_id :=g_shipment_line_rows(x_freight_cost_main_price(o).delivery_detail_id).delivery_leg_id;
3516            --x_freight_cost_main_price(o).delivery_id := p_delivery_id;
3517 	   x_freight_cost_main_price(o).delivery_id :=g_shipment_line_rows(x_freight_cost_main_price(o).delivery_detail_id).delivery_id;
3518 
3519            x_freight_cost_main_price(o).currency_code := l_fc_rec.currency_code;
3520            x_freight_cost_main_price(o).uom := l_fc_rec.uom;
3521            x_freight_cost_main_price(o).charge_unit_value := l_fc_rec.charge_unit_value;
3522 
3523            -- Need to set for Top level Price record in case of commodity based rating
3524            -- Container rates columns are set during container summary records.
3525 
3526            IF p_pricing_engine_input(p_qp_output_line_row.line_index).loose_item_flag = 'Y'
3527              AND l_fc_rec.line_type_code = 'PRICE' THEN
3528                x_freight_cost_main_price(o).billable_uom := l_fc_rec.uom;
3529                x_freight_cost_main_price(o).billable_quantity := l_billed_weight;--l_fc_rec.quantity;
3530                x_freight_cost_main_price(o).billable_basis := p_rate_basis;--p_pricing_engine_input(p_qp_output_line_row.line_index).basis;
3531            END IF;
3532 
3533 		--MDC
3534 		IF x_freight_cost_main_price(o).delivery_leg_id IS NOT NULL THEN
3535 
3536 		 IF NOT x_fc_dleg_rows.EXISTS(x_freight_cost_main_price(o).delivery_leg_id) THEN
3537 		    x_fc_dleg_rows(x_freight_cost_main_price(o).delivery_leg_id).entity_id := x_freight_cost_main_price(o).delivery_leg_id;
3538 		    x_fc_dleg_rows(x_freight_cost_main_price(o).delivery_leg_id).summary_amount := x_freight_cost_main_price(o).total_amount;
3539 		 ELSE
3540 		    x_fc_dleg_rows(x_freight_cost_main_price(o).delivery_leg_id).summary_amount := x_fc_dleg_rows(x_freight_cost_main_price(o).delivery_leg_id).summary_amount + x_freight_cost_main_price(o).total_amount;
3541 		 END IF;
3542 
3543 		END IF;
3544 
3545 
3546            --l_dleg_sum_amount := l_dleg_sum_amount + x_freight_cost_main_price(o).total_amount;
3547 
3548         --ELSIF p_save_flag = 'T' THEN
3549         ELSE              -- VVP (OM Est change)
3550 
3551            x_freight_cost_temp_price(o).line_type_code := l_fc_rec.line_type_code;
3552            --x_freight_cost_temp_price(o).line_type_code := nvl(x_freight_cost_temp_price(n).line_type_code,l_fc_rec.line_type_code);
3553            x_freight_cost_temp_price(o).charge_source_code := 'PRICING_ENGINE';
3554            x_freight_cost_temp_price(o).estimated_flag := 'Y';
3555            x_freight_cost_temp_price(o).freight_cost_type_id := l_freight_cost_type_id;
3556 
3557        --MDC
3558            --x_freight_cost_temp_price(o).delivery_id := p_entity_id;
3559 
3560 	   x_freight_cost_temp_price(o).delivery_id := g_shipment_line_rows(x_freight_cost_temp_price(o).delivery_detail_id).delivery_id;
3561 
3562            x_freight_cost_temp_price(o).currency_code := l_fc_rec.currency_code;
3563            x_freight_cost_temp_price(o).uom := l_fc_rec.uom;
3564            -- Need to set for Top level Price record in case of commodity based rating
3565            -- Container rates columns are set during container summary records.
3566            IF p_pricing_engine_input(p_qp_output_line_row.line_index).loose_item_flag = 'Y'
3567              AND l_fc_rec.line_type_code = 'PRICE' THEN
3568 		FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Setting billed Weight in case of Price and lose Item Y');
3569 
3570 		FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'l_billed_weight ='||l_billed_weight);
3571 		FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'l_fc_rec.quantity ='||l_fc_rec.quantity);
3572 
3573                x_freight_cost_temp_price(o).billable_uom := l_fc_rec.uom;
3574                x_freight_cost_temp_price(o).billable_quantity := l_billed_weight;--l_fc_rec.quantity;
3575                x_freight_cost_temp_price(o).billable_basis := p_rate_basis;--p_pricing_engine_input(p_qp_output_line_row.line_index).basis;
3576            END IF;
3577            x_freight_cost_temp_price(o).charge_unit_value := l_fc_rec.charge_unit_value;
3578 
3579 		--MDC
3580 		IF x_freight_cost_temp_price(o).delivery_id IS NOT NULL THEN
3581 
3582 		 IF NOT x_fc_dleg_rows.EXISTS(x_freight_cost_temp_price(o).delivery_id) THEN
3583 		    x_fc_dleg_rows(x_freight_cost_temp_price(o).delivery_id).entity_id := x_freight_cost_temp_price(o).delivery_id;
3584 		    x_fc_dleg_rows(x_freight_cost_temp_price(o).delivery_id).summary_amount := x_freight_cost_temp_price(o).total_amount;
3585 		 ELSE
3586 		    x_fc_dleg_rows(x_freight_cost_temp_price(o).delivery_id).summary_amount := x_fc_dleg_rows(x_freight_cost_temp_price(o).delivery_id).summary_amount + x_freight_cost_temp_price(o).total_amount;
3587 		 END IF;
3588 
3589 		END IF;
3590 
3591 
3592            --l_dleg_sum_amount := l_dleg_sum_amount + x_freight_cost_temp_price(o).total_amount;
3593 
3594         END IF;
3595 
3596         IF p_save_flag = 'M' THEN
3597 
3598            EXIT WHEN o = x_freight_cost_main_price.LAST;   --  Same number of rows in either table
3599            o := x_freight_cost_main_price.NEXT(o);
3600 
3601         ELSE
3602 
3603            EXIT WHEN o = x_freight_cost_temp_price.LAST;   --  Same number of rows in either table
3604            o := x_freight_cost_temp_price.NEXT(o);
3605 
3606         END IF;
3607 
3608         END LOOP;
3609 
3610 	--MDC
3611         --IF p_entity_id IS NOT NULL THEN
3612 
3613          --IF NOT x_fc_dleg_rows.EXISTS(p_entity_id) THEN
3614             --x_fc_dleg_rows(p_entity_id).entity_id := p_entity_id;
3615             --x_fc_dleg_rows(p_entity_id).summary_amount := l_dleg_sum_amount;
3616          --ELSE
3617             --x_fc_dleg_rows(p_entity_id).summary_amount := x_fc_dleg_rows(p_entity_id).summary_amount + l_dleg_sum_amount;
3618          --END IF;
3619 
3620         --END IF;
3621 
3622       END IF;  --  No new fc records were inserted
3623       FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'prepare_fc_records');
3624 
3625 EXCEPTION
3626    WHEN FTE_FREIGHT_PRICING_UTIL.g_proration_failed THEN
3627         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
3628         FTE_FREIGHT_PRICING_UTIL.set_exception('prepare_fc_records',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_proration_failed');
3629         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'prepare_fc_records failed ');
3630         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'prepare_fc_records');
3631    WHEN FTE_FREIGHT_PRICING_UTIL.g_get_fc_type_failed THEN
3632         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
3633         FTE_FREIGHT_PRICING_UTIL.set_exception('prepare_fc_records',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_get_fc_type_failed');
3634         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'prepare_fc_records');
3635    WHEN others THEN
3636         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
3637         FTE_FREIGHT_PRICING_UTIL.set_exception('prepare_fc_records',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
3638         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
3639         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'prepare_fc_records');
3640 END prepare_fc_records;
3641 
3642 --      This API will result in one qp output line per instance
3643 --      It will delete other engine rows and associated engine output line details
3644 
3645 PROCEDURE resolve_pricing_objective(
3646              p_pricing_dual_instances   IN  pricing_dual_instance_tab_type,
3647              x_pricing_engine_input     IN OUT NOCOPY  pricing_engine_input_tab_type,
3648              x_qp_output_line_rows      IN OUT NOCOPY  QP_PREQ_GRP.LINE_TBL_TYPE,
3649              x_qp_output_line_details   IN OUT NOCOPY  QP_PREQ_GRP.LINE_DETAIL_TBL_TYPE,
3650              x_return_status            OUT NOCOPY   VARCHAR2)
3651 IS
3652         i                         NUMBER:=0;
3653         j                         NUMBER:=0;
3654         l_tot_amount              NUMBER:=0;
3655         l_return_status           VARCHAR2(1);
3656 
3657         l_instance_output         instance_enginerow_tab_type;
3658 
3659     l_log_level     NUMBER := FTE_FREIGHT_PRICING_UTIL.G_INF;
3660 
3661 BEGIN
3662 
3663    x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
3664    FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
3665    FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,'resolve_pricing_objective','start');
3666 
3667    FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,'QP Output line row count : '||x_qp_output_line_rows.COUNT);
3668    i := x_qp_output_line_rows.FIRST;
3669    IF i IS NOT NULL THEN
3670    LOOP
3671     FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'QP line index : '||x_qp_output_line_rows(i).line_index);
3672     -- IF x_pricing_engine_input(x_qp_output_line_rows(i).line_index).loose_item_id IS NULL THEN -- Container
3673     IF x_pricing_engine_input(x_qp_output_line_rows(i).line_index).loose_item_flag = 'N' THEN -- Container
3674 
3675      IF NOT l_instance_output.EXISTS(x_pricing_engine_input(x_qp_output_line_rows(i).line_index).instance_index) THEN
3676 
3677         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'QP line index : '||x_qp_output_line_rows(i).line_index||'Instance : '
3678         ||x_pricing_engine_input(x_qp_output_line_rows(i).line_index).instance_index||' Quanitity : '||x_pricing_engine_input(x_qp_output_line_rows(i).line_index).line_quantity);
3679 
3680         l_instance_output(x_pricing_engine_input(x_qp_output_line_rows(i).line_index).instance_index).input_index := x_qp_output_line_rows(i).line_index;
3681         --l_instance_output(x_pricing_engine_input(x_qp_output_line_rows(i).line_index).instance_index).tot_amount := x_qp_output_line_rows(i).unit_price * x_pricing_engine_input(x_qp_output_line_rows(i).line_index).line_quantity;
3682 
3683         l_instance_output(x_pricing_engine_input(x_qp_output_line_rows(i).line_index).instance_index).tot_amount := x_qp_output_line_rows(i).unit_price * x_qp_output_line_rows(i).priced_quantity;
3684 
3685      ELSE
3686 
3687         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'QP line index : '||x_qp_output_line_rows(i).line_index||'Instance : '
3688         ||x_pricing_engine_input(x_qp_output_line_rows(i).line_index).instance_index||' Quanitity : '||x_pricing_engine_input(x_qp_output_line_rows(i).line_index).line_quantity);
3689 
3690      --  Find out the line index to choose for this instance based on pricing objective
3691      --  What happens if there is no pricing objective ?
3692 
3693         --l_tot_amount := x_qp_output_line_rows(i).unit_price * x_pricing_engine_input(x_qp_output_line_rows(i).line_index).line_quantity; --  assuming same input and output currency code
3694 
3695         l_tot_amount := x_qp_output_line_rows(i).unit_price * x_qp_output_line_rows(i).priced_quantity; --  assuming same input and output currency code
3696 
3697         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Current Total amount : '||l_tot_amount);
3698         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Existing instance amount : '||l_instance_output(x_pricing_engine_input(x_qp_output_line_rows(i).line_index).instance_index).tot_amount);
3699         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Pricing objective : '||p_pricing_dual_instances(x_pricing_engine_input(x_qp_output_line_rows(i).line_index).instance_index).objective);
3700 
3701         IF p_pricing_dual_instances(x_pricing_engine_input(x_qp_output_line_rows(i).line_index).instance_index).objective IS NOT NULL THEN
3702 
3703         IF ((p_pricing_dual_instances(x_pricing_engine_input(x_qp_output_line_rows(i).line_index).instance_index).objective = G_OBJECTIVE_HIGHEST AND
3704            l_tot_amount > l_instance_output(x_pricing_engine_input(x_qp_output_line_rows(i).line_index).instance_index).tot_amount )   OR
3705            (p_pricing_dual_instances(x_pricing_engine_input(x_qp_output_line_rows(i).line_index).instance_index).objective = G_OBJECTIVE_LOWEST AND
3706            l_tot_amount < l_instance_output(x_pricing_engine_input(x_qp_output_line_rows(i).line_index).instance_index).tot_amount ))   THEN
3707 
3708               x_pricing_engine_input.DELETE(l_instance_output(x_pricing_engine_input(x_qp_output_line_rows(i).line_index).instance_index).input_index);
3709 
3710               FTE_QP_ENGINE.delete_lines (
3711                       p_line_index     =>   l_instance_output(x_pricing_engine_input(x_qp_output_line_rows(i).line_index).instance_index).input_index,
3712                       x_qp_output_line_rows     => x_qp_output_line_rows ,
3713                       x_qp_output_detail_rows   =>  x_qp_output_line_details,
3714                       x_return_status  =>   l_return_status);
3715 
3716               IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
3717                  IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
3718                     FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'Highest current higher delete_lines ');
3719                     raise FTE_FREIGHT_PRICING_UTIL.g_delete_qpline_failed;
3720                  END IF;
3721               ELSE
3722                  FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,'Deleted QP output : '||l_instance_output(x_pricing_engine_input(x_qp_output_line_rows(i).line_index).instance_index).input_index);
3723               END IF;
3724 
3725               l_instance_output(x_pricing_engine_input(x_qp_output_line_rows(i).line_index).instance_index).tot_amount := l_tot_amount;
3726               l_instance_output(x_pricing_engine_input(x_qp_output_line_rows(i).line_index).instance_index).input_index := x_qp_output_line_rows(i).line_index;
3727 
3728         ELSE
3729 
3730               x_pricing_engine_input.DELETE(x_qp_output_line_rows(i).line_index);
3731 
3732               FTE_QP_ENGINE.delete_lines (
3733                       p_line_index     =>   i,
3734                       x_qp_output_line_rows     => x_qp_output_line_rows ,
3735                       x_qp_output_detail_rows   =>  x_qp_output_line_details,
3736                       x_return_status  =>   l_return_status);
3737 
3738               IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
3739                  IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
3740                     FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'Highest current not higher delete_lines');
3741                     raise FTE_FREIGHT_PRICING_UTIL.g_delete_qpline_failed;
3742                  END IF;
3743               ELSE
3744                  FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,'Deleted QP output : '||i);
3745               END IF;
3746 
3747         -- For NULL pricing objective we will keep all the output lines for the instance
3748 
3749         END IF;
3750         END IF;  -- pricing_objective NOT NULL
3751 
3752      END IF;
3753 
3754      --  Found out the line index for this instance based on pricing objective
3755     END IF;
3756 
3757     EXIT WHEN i >= x_qp_output_line_rows.LAST;
3758     i := x_qp_output_line_rows.NEXT(i);
3759    END LOOP;
3760    END IF;
3761    FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'resolve_pricing_objective');
3762 
3763 EXCEPTION
3764    WHEN FTE_FREIGHT_PRICING_UTIL.g_delete_qpline_failed THEN
3765         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
3766         FTE_FREIGHT_PRICING_UTIL.set_exception('resolve_pricing_objective',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_delete_qpline_failed');
3767         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'delete_qpline_failed failed ');
3768         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'resolve_pricing_objective');
3769    WHEN others THEN
3770         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
3771         FTE_FREIGHT_PRICING_UTIL.set_exception('resolve_pricing_objective',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
3772         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
3773         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'resolve_pricing_objective');
3774 
3775 END resolve_pricing_objective;
3776 
3777 PROCEDURE add_other_container_summary (
3778           p_save_flag                 IN             VARCHAR2,
3779           x_freight_cost_main_price   IN OUT NOCOPY  Freight_Cost_Main_Tab_Type,
3780           x_freight_cost_temp_price   IN OUT NOCOPY  Freight_Cost_Temp_Tab_Type,
3781           x_return_status             OUT NOCOPY             VARCHAR2)
3782 IS
3783 
3784           i                           NUMBER:=0;
3785           j                           NUMBER:=0;
3786           l                           NUMBER:=0;
3787           n                           NUMBER:=0;
3788           p                           NUMBER:=0;
3789           l_price_first               NUMBER:=0;
3790           l_child_container           NUMBER:=0;
3791           l_master_container          NUMBER:=0;
3792           l_parent_container          NUMBER:=0;
3793           l_price_last                NUMBER:=0;
3794           l_curr_fc_count             NUMBER:=0;
3795           l_main_price_index          NUMBER:=0;
3796           l_freight_cost_type_id      NUMBER:=0;
3797           l_in_between_cont_prv_cnt   NUMBER:=0;
3798           l_container_summary         container_sum_tab_type;
3799           l_between_cont_sum          container_sum_tab_type;
3800           l_in_between_containers     container_detail_tab_type;
3801           l_return_status             VARCHAR2(1);
3802 
3803     l_log_level     NUMBER := FTE_FREIGHT_PRICING_UTIL.G_DBG;
3804 
3805 BEGIN
3806    x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
3807    FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
3808    FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,'add_other_container_summary','start');
3809 
3810    IF p_save_flag = 'M' THEN
3811       l_price_first := x_freight_cost_main_price.FIRST;
3812       l_price_last := x_freight_cost_main_price.LAST;
3813       l_curr_fc_count := x_freight_cost_main_price.COUNT;
3814    ELSE
3815       l_price_first := x_freight_cost_temp_price.FIRST;
3816       l_price_last := x_freight_cost_temp_price.LAST;
3817       l_curr_fc_count := x_freight_cost_temp_price.COUNT;
3818    END IF;
3819 
3820    p := 0;
3821    i := g_rolledup_lines.FIRST;
3822    LOOP
3823       IF g_rolledup_lines(i).master_container_id <> g_rolledup_lines(i).container_id THEN
3824                             -- This is a rolled up line which
3825                             -- actually is inside a non top level container
3826                             -- For this delivery detail we need to look up the total_amount
3827 
3828          -- Now, an interesting problem here would be if the container_id here is not a direct
3829          -- child of the master_container_id and there is no rolled up line
3830          -- for the in between containers
3831          -- For all those in between containers a SUMMARY record needs to be inserted
3832          -- these records will look exactly the same as that of the actual container_id here
3833 
3834          l_in_between_cont_prv_cnt := l_in_between_containers.COUNT;
3835          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Parent non top level container for detail : '||g_rolledup_lines(i).delivery_detail_id);
3836 
3837          l_child_container  := g_rolledup_lines(i).container_id;
3838          l_master_container := g_rolledup_lines(i).master_container_id;
3839          LOOP
3840 
3841            l_parent_container  := g_shipment_line_rows(l_child_container).parent_delivery_detail_id;
3842 
3843            IF l_parent_container <> l_master_container THEN
3844             -- We have to deal with in between containers
3845 
3846                IF NOT l_container_summary.EXISTS(l_parent_container) THEN
3847                   p := p + 1;
3848                   FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Adding in between container : '||l_parent_container);
3849 
3850                   -- If indexed by container_id then can not store detail id
3851                   -- Create a hash of detail and container together  ?
3852                   -- and store both detail and container
3853 
3854                   l_in_between_containers(p).detail_id := g_rolledup_lines(i).delivery_detail_id;
3855                   l_in_between_containers(p).entity_id := l_parent_container;
3856 
3857                END IF;
3858                l_child_container := g_shipment_line_rows(l_child_container).parent_delivery_detail_id;
3859            ELSE
3860                FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Done adding in between containers for detail : '||g_rolledup_lines(i).delivery_detail_id);
3861                EXIT;
3862            END IF;
3863          END LOOP;
3864 
3865          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Parent container : '||g_rolledup_lines(i).container_id);
3866          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Master container : '||g_rolledup_lines(i).master_container_id);
3867          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'In between container count : '||l_in_between_containers.COUNT);
3868 
3869          -- No need to loop over charge records as the PRICE record for the
3870          -- delivery detail would already have taken care of the charges and discounts
3871          -- in its TOTAL_AMOUNT column
3872 
3873          -- Loop over price records
3874          j := l_price_first;
3875          IF j IS NOT NULL THEN
3876          LOOP
3877            IF p_save_flag = 'M' THEN
3878               IF x_freight_cost_main_price(j).delivery_detail_id = g_rolledup_lines(i).delivery_detail_id THEN
3879                  IF NOT l_container_summary.EXISTS(g_rolledup_lines(i).container_id) THEN
3880                     FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Adding non in between other container : '||g_rolledup_lines(i).container_id);
3881 
3882                     l_container_summary(g_rolledup_lines(i).container_id).total_amount    := x_freight_cost_main_price(j).total_amount;
3883                     l_container_summary(g_rolledup_lines(i).container_id).currency_code   := x_freight_cost_main_price(j).currency_code;
3884                     l_container_summary(g_rolledup_lines(i).container_id).delivery_leg_id := x_freight_cost_main_price(j).delivery_leg_id;
3885                     l_container_summary(g_rolledup_lines(i).container_id).delivery_id     := x_freight_cost_main_price(j).delivery_id;
3886                  ELSE
3887                     l_container_summary(g_rolledup_lines(i).container_id).total_amount    :=
3888                     l_container_summary(g_rolledup_lines(i).container_id).total_amount     + x_freight_cost_main_price(j).total_amount;
3889                  END IF;
3890               END IF;
3891            ELSE
3892               IF x_freight_cost_temp_price(j).delivery_detail_id = g_rolledup_lines(i).delivery_detail_id THEN
3893                  IF NOT l_container_summary.EXISTS(g_rolledup_lines(i).container_id) THEN
3894                     FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Adding non in between other container : '||g_rolledup_lines(i).container_id);
3895 
3896                     l_container_summary(g_rolledup_lines(i).container_id).total_amount    := x_freight_cost_temp_price(j).total_amount;
3897                     l_container_summary(g_rolledup_lines(i).container_id).currency_code   := x_freight_cost_temp_price(j).currency_code;
3898                     --l_container_summary(g_rolledup_lines(i).container_id).delivery_leg_id := x_freight_cost_temp_price(j).delivery_leg_id;
3899                     l_container_summary(g_rolledup_lines(i).container_id).delivery_id     := x_freight_cost_temp_price(j).delivery_id;
3900                  ELSE
3901                     l_container_summary(g_rolledup_lines(i).container_id).total_amount    :=
3902                     l_container_summary(g_rolledup_lines(i).container_id).total_amount     + x_freight_cost_temp_price(j).total_amount;
3903                  END IF;
3904               END IF;
3905            END IF;
3906 
3907            IF l_in_between_containers.COUNT > l_in_between_cont_prv_cnt THEN
3908            n := l_in_between_cont_prv_cnt + 1;
3909            IF n IS NOT NULL THEN
3910            LOOP
3911              IF p_save_flag = 'M' THEN
3912                 IF ((x_freight_cost_main_price(j).delivery_detail_id = g_rolledup_lines(i).delivery_detail_id) AND
3913                    (x_freight_cost_main_price(j).delivery_detail_id = l_in_between_containers(n).detail_id)) THEN
3914                     FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Fc exists for in between container : '||l_in_between_containers(n).entity_id);
3915 
3916                     IF NOT l_between_cont_sum.EXISTS(l_in_between_containers(n).entity_id) THEN
3917                       l_between_cont_sum(l_in_between_containers(n).entity_id).total_amount    := x_freight_cost_main_price(j).total_amount;
3918                       l_between_cont_sum(l_in_between_containers(n).entity_id).currency_code   := x_freight_cost_main_price(j).currency_code;
3919                       l_between_cont_sum(l_in_between_containers(n).entity_id).delivery_leg_id := x_freight_cost_main_price(j).delivery_leg_id;
3920                       l_between_cont_sum(l_in_between_containers(n).entity_id).delivery_id     := x_freight_cost_main_price(j).delivery_id;
3921                     ELSE
3922                       l_between_cont_sum(l_in_between_containers(n).entity_id).total_amount :=
3923                         l_between_cont_sum(l_in_between_containers(n).entity_id).total_amount +
3924                         x_freight_cost_main_price(j).total_amount;
3925                     END IF;
3926                 END IF;
3927 
3928              ELSE
3929                 IF ((x_freight_cost_temp_price(j).delivery_detail_id = g_rolledup_lines(i).delivery_detail_id) AND
3930                    (x_freight_cost_temp_price(j).delivery_detail_id = l_in_between_containers(n).detail_id)) THEN
3931                     FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Fc exists for in between container : '||l_in_between_containers(n).entity_id);
3932 
3933                     IF NOT l_between_cont_sum.EXISTS(l_in_between_containers(n).entity_id) THEN
3934                       l_between_cont_sum(l_in_between_containers(n).entity_id).total_amount    := x_freight_cost_temp_price(j).total_amount;
3935                       l_between_cont_sum(l_in_between_containers(n).entity_id).currency_code   := x_freight_cost_temp_price(j).currency_code;
3936                       l_between_cont_sum(l_in_between_containers(n).entity_id).delivery_leg_id := x_freight_cost_temp_price(j).delivery_leg_id;
3937                       l_between_cont_sum(l_in_between_containers(n).entity_id).delivery_id     := x_freight_cost_temp_price(j).delivery_id;
3938                     ELSE
3939                       l_between_cont_sum(l_in_between_containers(n).entity_id).total_amount :=
3940                         l_between_cont_sum(l_in_between_containers(n).entity_id).total_amount +
3941                         x_freight_cost_main_price(j).total_amount;
3942                     END IF;
3943 
3944                 END IF;
3945 
3946              END IF;
3947 
3948              EXIT WHEN n = l_in_between_containers.LAST;
3949              n := l_in_between_containers.NEXT(n);
3950            END LOOP;
3951            END IF;
3952            END IF;
3953 
3954            EXIT WHEN j = l_price_last;
3955            IF p_save_flag = 'M' THEN
3956               j := x_freight_cost_main_price.NEXT(j);
3957            ELSE
3958               j := x_freight_cost_temp_price.NEXT(j);
3959            END IF;
3960 
3961          END LOOP;
3962          END IF;
3963 
3964       END IF;
3965 
3966       EXIT WHEN i = g_rolledup_lines.LAST;
3967       i := g_rolledup_lines.NEXT(i);
3968    END LOOP;
3969 
3970    IF l_container_summary.COUNT > 0 OR l_between_cont_sum.COUNT > 0 THEN
3971 
3972     get_fc_type_id(
3973            p_line_type_code => 'FTESUMMARY',
3974            p_charge_subtype_code  => 'SUMMARY',
3975            x_freight_cost_type_id  =>  l_freight_cost_type_id,
3976            x_return_status  =>  l_return_status);
3977 
3978     IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
3979        IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
3980           raise FTE_FREIGHT_PRICING_UTIL.g_get_fc_type_failed;
3981        END IF;
3982     ELSE
3983        FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,'fc type id : '||l_freight_cost_type_id);
3984     END IF;
3985 
3986    END IF;
3987 
3988    -- Use l_container_summary to add to fc records
3989 
3990    IF l_container_summary.COUNT > 0 THEN
3991 
3992        l_main_price_index       := l_curr_fc_count;
3993        --l_freight_cost_type_id := get_fc_type_id(
3994 
3995        l := l_container_summary.FIRST;
3996        LOOP
3997 
3998        l_main_price_index := l_main_price_index + 1;
3999        IF p_save_flag = 'M' THEN  --  Populate appropriate columns
4000 
4001             x_freight_cost_main_price(l_main_price_index).freight_cost_type_id := l_freight_cost_type_id;
4002             x_freight_cost_main_price(l_main_price_index).charge_source_code := 'PRICING_ENGINE';
4003             x_freight_cost_main_price(l_main_price_index).line_type_code := 'SUMMARY';
4004             x_freight_cost_main_price(l_main_price_index).delivery_detail_id := l;
4005             x_freight_cost_main_price(l_main_price_index).delivery_leg_id := l_container_summary(l).delivery_leg_id;
4006             x_freight_cost_main_price(l_main_price_index).delivery_id := l_container_summary(l).delivery_id;
4007             x_freight_cost_main_price(l_main_price_index).total_amount := round(l_container_summary(l).total_amount,2);
4008             x_freight_cost_main_price(l_main_price_index).currency_code := l_container_summary(l).currency_code;
4009 
4010        ELSE
4011 
4012             x_freight_cost_temp_price(l_main_price_index).freight_cost_type_id := l_freight_cost_type_id;
4013             x_freight_cost_temp_price(l_main_price_index).charge_source_code := 'PRICING_ENGINE';
4014             x_freight_cost_temp_price(l_main_price_index).line_type_code := 'SUMMARY';
4015             x_freight_cost_temp_price(l_main_price_index).delivery_detail_id := l;
4016             x_freight_cost_temp_price(l_main_price_index).delivery_id := l_container_summary(l).delivery_id;
4017 
4018             x_freight_cost_temp_price(l_main_price_index).total_amount := round(l_container_summary(l).total_amount,2);
4019             x_freight_cost_temp_price(l_main_price_index).currency_code := l_container_summary(l).currency_code;
4020 
4021        END IF;
4022 
4023        EXIT WHEN l = l_container_summary.LAST;
4024        l := l_container_summary.NEXT(l);
4025        END LOOP;
4026    END IF;
4027 
4028    -- Use l_in_between_containers to add to fc records
4029 
4030    IF l_between_cont_sum.COUNT > 0 THEN
4031 
4032        IF p_save_flag = 'M' THEN
4033          l_curr_fc_count := x_freight_cost_main_price.COUNT;
4034        ELSE
4035          l_curr_fc_count := x_freight_cost_temp_price.COUNT;
4036        END IF;
4037 
4038        l_main_price_index       := l_curr_fc_count;
4039        --l_freight_cost_type_id := get_fc_type_id(
4040 
4041        l := l_between_cont_sum.FIRST;
4042        LOOP
4043 
4044        IF NOT l_container_summary.EXISTS(l) THEN
4045        l_main_price_index := l_main_price_index + 1;
4046        IF p_save_flag = 'M' THEN  --  Populate appropriate columns
4047 
4048             x_freight_cost_main_price(l_main_price_index).freight_cost_type_id := l_freight_cost_type_id;
4049             x_freight_cost_main_price(l_main_price_index).charge_source_code := 'PRICING_ENGINE';
4050             x_freight_cost_main_price(l_main_price_index).line_type_code := 'SUMMARY';
4051             x_freight_cost_main_price(l_main_price_index).delivery_detail_id := l;
4052             x_freight_cost_main_price(l_main_price_index).delivery_leg_id := l_between_cont_sum(l).delivery_leg_id;
4053             x_freight_cost_main_price(l_main_price_index).delivery_id := l_between_cont_sum(l).delivery_id;
4054 
4055             x_freight_cost_main_price(l_main_price_index).total_amount := round(l_between_cont_sum(l).total_amount,2);
4056             x_freight_cost_main_price(l_main_price_index).currency_code := l_between_cont_sum(l).currency_code;
4057 
4058        ELSE
4059 
4060             x_freight_cost_temp_price(l_main_price_index).freight_cost_type_id := l_freight_cost_type_id;
4061             x_freight_cost_temp_price(l_main_price_index).charge_source_code := 'PRICING_ENGINE';
4062             x_freight_cost_temp_price(l_main_price_index).line_type_code := 'SUMMARY';
4063             x_freight_cost_temp_price(l_main_price_index).delivery_detail_id := l;
4064             x_freight_cost_temp_price(l_main_price_index).delivery_id := l_between_cont_sum(l).delivery_id;
4065 
4066             x_freight_cost_temp_price(l_main_price_index).total_amount := round(l_between_cont_sum(l).total_amount,2);
4067             x_freight_cost_temp_price(l_main_price_index).currency_code := l_between_cont_sum(l).currency_code;
4068 
4069        END IF;
4070        END IF;
4071 
4072        EXIT WHEN l = l_between_cont_sum.LAST;
4073        l := l_between_cont_sum.NEXT(l);
4074        END LOOP;
4075    END IF;
4076    FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'add_other_container_summary');
4077 
4078 EXCEPTION
4079    WHEN FTE_FREIGHT_PRICING_UTIL.g_get_fc_type_failed THEN
4080         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
4081         FTE_FREIGHT_PRICING_UTIL.set_exception('add_other_container_summary',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_get_fc_type_failed');
4082         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'add_other_container_summary');
4083    WHEN others THEN
4084         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
4085         FTE_FREIGHT_PRICING_UTIL.set_exception('add_other_container_summary',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
4086         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
4087         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'add_other_container_summary');
4088 END add_other_container_summary;
4089 
4090 
4091 --      This is the QP engine output post processing API
4092 --      It analyzes the QP engine output by looking at the output lines and input lines
4093 --      It uses l_pricing_dual_instances,l_intersection_rows,l_shpmnt_toplevel_rows
4094 --      and g_shipment_line_rows to deconsolidate freight costs to the proper level
4095 --      It creates freight_costs main/temp record and sends back
4096 --      Looks up delivery detail info from g_shipment_line_rows
4097 
4098 PROCEDURE process_qp_output (
4099         p_qp_output_line_rows     IN     QP_PREQ_GRP.LINE_TBL_TYPE,  -- line_index = input_index
4100         p_qp_output_detail_rows   IN     QP_PREQ_GRP.LINE_DETAIL_TBL_TYPE,
4101         p_pricing_engine_input    IN     pricing_engine_input_tab_type,
4102         p_pricing_dual_instances  IN     pricing_dual_instance_tab_type,
4103         p_pattern_rows            IN     top_level_pattern_tab_type,
4104         p_shpmnt_toplevel_rows    IN     shpmnt_content_tab_type,
4105         p_save_flag               IN     VARCHAR2, -- Whether to save to TEMP table or MAIN table
4106         p_rate_basis              IN     VARCHAR2 DEFAULT NULL,
4107         x_freight_cost_main_price  OUT NOCOPY Freight_Cost_Main_Tab_Type,
4108         x_freight_cost_temp_price  OUT NOCOPY Freight_Cost_Temp_Tab_Type,
4109         x_freight_cost_main_charge OUT NOCOPY Freight_Cost_Main_Tab_Type,
4110         x_freight_cost_temp_charge OUT NOCOPY Freight_Cost_Temp_Tab_Type,
4111         x_fc_main_update_rows     OUT NOCOPY     Freight_Cost_Main_Tab_Type,  -- For update of SUMMARY records
4112         x_summary_lanesched_price      OUT NOCOPY     NUMBER,   -- Only in case of 'T'
4113         x_summary_lanesched_price_uom  OUT NOCOPY     VARCHAR2,
4114         x_return_status           OUT NOCOPY     VARCHAR2 )
4115 IS
4116 
4117         CURSOR c_get_fc_id(p_dleg_id IN NUMBER) IS
4118         SELECT freight_cost_id,created_by,creation_date
4119         FROM   wsh_freight_costs
4120         WHERE  delivery_leg_id = p_dleg_id
4121         AND delivery_detail_id IS NULL
4122         AND    line_type_code = 'SUMMARY';
4123 
4124         CURSOR c_get_dlv_id(c_dleg_id IN NUMBER) IS
4125         SELECT delivery_id
4126         FROM   wsh_delivery_legs
4127         WHERE  delivery_leg_id = c_dleg_id;
4128 
4129         j                         NUMBER:=0;
4130         k                         NUMBER:=0;
4131         l                         NUMBER:=0;
4132         l_freight_cost_id          NUMBER:=0;
4133         l_freight_cost_type_id     NUMBER:=0;
4134         l_curr_fc_count           NUMBER:=0;
4135         l_created_by              NUMBER:=0;
4136         l_creation_date           DATE;
4137         l_main_price_index        NUMBER:=0;
4138         l_temp_price_index        NUMBER:=0;
4139         l_price_count             NUMBER:=0;
4140         l_charge_count            NUMBER:=0;
4141         l_entity_id               NUMBER:=0;
4142         l_delivery_id             NUMBER:=0;
4143         l_return_status           VARCHAR2(1);
4144         l_container_summary       container_sum_tab_type;
4145         l_container_summary_dummy container_sum_tab_type;
4146 
4147         l_currency_code           VARCHAR2(30);
4148 
4149         l_temp_amt                NUMBER;
4150 
4151         l_fc_dleg_rows            dlvy_leg_summ_tab_type;
4152         l_dlv_id                  NUMBER;
4153         l_basis_meaning             VARCHAR2(100);
4154     l_log_level     NUMBER := FTE_FREIGHT_PRICING_UTIL.G_INF;
4155 
4156 
4157 BEGIN
4158 
4159    x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
4160    FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
4161    FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,'process_qp_output','start');
4162 
4163    -- This API will result in one qp output line per instance
4164    -- It will delete other output lines and associated engine output line details
4165 
4166       j := p_qp_output_line_rows.FIRST;  -- Can still have more than one output_line_row per instance
4167                                          -- if there is no pricing objective
4168 
4169       l_currency_code := p_qp_output_line_rows(j).currency_code;
4170       LOOP
4171       -- {
4172 
4173          -- If there are still more than one output line for an instance
4174          -- we should put as many freight cost records for the associated pattern(s)
4175          -- No special logic required
4176 
4177          IF p_pricing_engine_input(p_qp_output_line_rows(j).line_index).loose_item_id IS NOT NULL THEN
4178          -- {
4179 
4180             IF p_save_flag = 'M' THEN
4181                l_price_count := x_freight_cost_main_price.COUNT;
4182                l_charge_count := x_freight_cost_main_charge.COUNT;
4183             ELSE
4184                l_price_count := x_freight_cost_temp_price.COUNT;
4185                l_charge_count := x_freight_cost_temp_charge.COUNT;
4186             END IF;
4187 
4188             IF p_save_flag = 'M' THEN
4189                l_entity_id := p_shpmnt_toplevel_rows(p_pricing_engine_input(p_qp_output_line_rows(j).line_index).loose_item_id).delivery_leg_id;
4190                l_delivery_id := g_shipment_line_rows(p_pricing_engine_input(p_qp_output_line_rows(j).line_index).loose_item_id).delivery_id;
4191             ELSE
4192                l_entity_id := g_shipment_line_rows(p_pricing_engine_input(p_qp_output_line_rows(j).line_index).loose_item_id).delivery_id;
4193                l_delivery_id := g_shipment_line_rows(p_pricing_engine_input(p_qp_output_line_rows(j).line_index).loose_item_id).delivery_id;
4194             END IF;
4195 
4196                  prepare_fc_records (
4197                     p_delivery_detail_id    =>  p_pricing_engine_input(p_qp_output_line_rows(j).line_index).loose_item_id,
4198                     p_delivery_id           =>  l_delivery_id,
4199                     p_entity_id             =>  l_entity_id,
4200                     p_qp_output_line_row    =>  p_qp_output_line_rows(j) ,
4201                     p_qp_output_detail_rows => p_qp_output_detail_rows,
4202                     p_pricing_engine_input  => p_pricing_engine_input,
4203                     p_save_flag             => p_save_flag,
4204                     p_rate_basis            => p_rate_basis,
4205                     x_container_summary     => l_container_summary_dummy,
4206                     x_fc_dleg_rows          => l_fc_dleg_rows,
4207                     x_freight_cost_main_price  =>  x_freight_cost_main_price,
4208                     x_freight_cost_temp_price  =>  x_freight_cost_temp_price,
4209                     x_freight_cost_main_charge =>  x_freight_cost_main_charge,
4210                     x_freight_cost_temp_charge =>  x_freight_cost_temp_charge,
4211                     x_return_status           => l_return_status);
4212 
4213                      IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
4214                         IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
4215                            FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'Loose Item ');
4216                            raise FTE_FREIGHT_PRICING_UTIL.g_prepare_fc_rec_failed;
4217                         END IF;
4218                      ELSE
4219                         IF p_save_flag = 'M' THEN
4220                            FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,x_freight_cost_main_price.COUNT - l_price_count || ' Main fc base price Records created ');
4221                            FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,x_freight_cost_main_charge.COUNT - l_charge_count || ' Main fc charge Records created ');
4222                         ELSE
4223                            FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,x_freight_cost_temp_price.COUNT - l_price_count || ' Temp fc base price Records created ');
4224                            FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,x_freight_cost_temp_charge.COUNT - l_charge_count || ' Temp fc charge Records created ');
4225                         END IF;
4226                      END IF;
4227 
4228 
4229          -- }
4230          ELSE
4231          -- {
4232          k := p_pattern_rows.FIRST;
4233          LOOP
4234           -- {
4235 
4236               IF p_pattern_rows(k).instance_index = p_pricing_engine_input(p_qp_output_line_rows(j).line_index).instance_index THEN
4237 
4238                  IF p_save_flag = 'M' THEN
4239                     l_price_count := x_freight_cost_main_price.COUNT;
4240                     l_charge_count := x_freight_cost_main_charge.COUNT;
4241                  ELSE
4242                     l_price_count := x_freight_cost_temp_price.COUNT;
4243                     l_charge_count := x_freight_cost_temp_charge.COUNT;
4244                  END IF;
4245 
4246                  IF p_save_flag = 'M' THEN
4247                     l_entity_id := p_shpmnt_toplevel_rows(p_pattern_rows(k).content_id).delivery_leg_id;
4248                     l_delivery_id := g_shipment_line_rows(p_pattern_rows(k).content_id).delivery_id;
4249                  ELSE
4250                     l_entity_id := g_shipment_line_rows(p_pattern_rows(k).content_id).delivery_id;
4251                     l_delivery_id := g_shipment_line_rows(p_pattern_rows(k).content_id).delivery_id;
4252                  END IF;
4253 
4254                  prepare_fc_records (
4255                     p_delivery_detail_id    =>  p_pattern_rows(k).content_id,
4256                     p_delivery_id           =>  l_delivery_id,
4257                     p_entity_id             =>  l_entity_id,
4258                     p_qp_output_line_row    =>  p_qp_output_line_rows(j) ,
4259                     p_qp_output_detail_rows => p_qp_output_detail_rows,
4260                     p_pricing_engine_input  => p_pricing_engine_input,
4261                     p_grouping_level        => p_pricing_dual_instances(p_pattern_rows(k).instance_index).grouping_level,
4262                     p_aggregation           => p_pricing_dual_instances(p_pattern_rows(k).instance_index).aggregation,
4263                     p_save_flag             => p_save_flag,
4264                     p_rate_basis            => p_rate_basis,
4265                     x_container_summary     => l_container_summary,
4266                     x_fc_dleg_rows          => l_fc_dleg_rows,
4267                     x_freight_cost_main_price  =>  x_freight_cost_main_price,
4268                     x_freight_cost_temp_price  =>  x_freight_cost_temp_price,
4269                     x_freight_cost_main_charge =>  x_freight_cost_main_charge,
4270                     x_freight_cost_temp_charge =>  x_freight_cost_temp_charge,
4271                     x_return_status           => l_return_status);
4272 
4273                      IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
4274                         IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
4275                            FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'Container '||p_pattern_rows(k).content_id);
4276                            raise FTE_FREIGHT_PRICING_UTIL.g_prepare_fc_rec_failed;
4277                         END IF;
4278                      ELSE
4279                         IF p_save_flag = 'M' THEN
4280                            FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,x_freight_cost_main_price.COUNT - l_price_count || ' Main fc base price Records created ');
4281                            FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,x_freight_cost_main_charge.COUNT - l_charge_count || ' Main fc charge Records created ');
4282                         ELSE
4283                            FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,x_freight_cost_temp_price.COUNT - l_price_count || ' Temp fc base price Records created ');
4284                            FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,x_freight_cost_temp_charge.COUNT - l_charge_count || ' Temp fc charge Records created ');
4285                         END IF;
4286                      END IF;
4287 
4288               END IF;
4289 
4290               EXIT WHEN k = p_pattern_rows.LAST;
4291               k := p_pattern_rows.NEXT(k);
4292           -- }
4293          END LOOP;
4294          -- }
4295          END IF;  --  Loose item
4296 
4297          EXIT WHEN j = p_qp_output_line_rows.LAST;
4298          j := p_qp_output_line_rows.NEXT(j);
4299       -- }
4300       END LOOP;
4301 
4302       get_fc_type_id(
4303                       p_line_type_code => 'FTESUMMARY',
4304                       p_charge_subtype_code  => 'SUMMARY',
4305                       x_freight_cost_type_id  =>  l_freight_cost_type_id,
4306                       x_return_status  =>  l_return_status);
4307 
4308       IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
4309          IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
4310             raise FTE_FREIGHT_PRICING_UTIL.g_get_fc_type_failed;
4311          END IF;
4312       ELSE
4313          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,'fc type id : '||l_freight_cost_type_id);
4314       END IF;
4315 
4316       IF l_container_summary.COUNT > 0 THEN
4317 
4318        IF p_save_flag = 'M' THEN
4319           l_curr_fc_count := x_freight_cost_main_price.COUNT;
4320        ELSE
4321           l_curr_fc_count := x_freight_cost_temp_price.COUNT;
4322        END IF;
4323 
4324        l_main_price_index       := l_curr_fc_count;
4325        --l_freight_cost_type_id := get_fc_type_id(
4326 
4327        l := l_container_summary.FIRST;
4328        LOOP
4329 
4330        IF nvl(l_container_summary(l).total_amount,0) <> 0 THEN
4331 
4332        l_main_price_index := l_main_price_index + 1;
4333        Get_Basis_Meaning ( p_basis => l_container_summary(l).bbasis,
4334                            x_basis_meaning => l_basis_meaning);
4335 
4336         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Before setting billable columns in main for basis :'||l_basis_meaning);
4337        IF p_save_flag = 'M' THEN  --  Populate appropriate columns
4338 
4339             x_freight_cost_main_price(l_main_price_index).freight_cost_type_id := l_freight_cost_type_id;
4340             x_freight_cost_main_price(l_main_price_index).charge_source_code := 'PRICING_ENGINE';
4341             x_freight_cost_main_price(l_main_price_index).line_type_code := 'SUMMARY';
4342             x_freight_cost_main_price(l_main_price_index).delivery_detail_id := l;
4343             x_freight_cost_main_price(l_main_price_index).delivery_leg_id := l_container_summary(l).delivery_leg_id;
4344             x_freight_cost_main_price(l_main_price_index).delivery_id := l_container_summary(l).delivery_id;
4345 
4346             x_freight_cost_main_price(l_main_price_index).total_amount := round(l_container_summary(l).total_amount,2);
4347             --x_freight_cost_main_price(l_main_price_index).currency_code := l_currency_code;
4348             x_freight_cost_main_price(l_main_price_index).currency_code := l_container_summary(l).currency_code;
4349             x_freight_cost_main_price(l_main_price_index).billable_quantity := l_container_summary(l).bquantity;
4350             x_freight_cost_main_price(l_main_price_index).billable_uom := l_container_summary(l).buom;
4351             x_freight_cost_main_price(l_main_price_index).billable_basis := l_basis_meaning;
4352        ELSE
4353 
4354             x_freight_cost_temp_price(l_main_price_index).freight_cost_type_id := l_freight_cost_type_id;
4355             x_freight_cost_temp_price(l_main_price_index).charge_source_code := 'PRICING_ENGINE';
4356             x_freight_cost_temp_price(l_main_price_index).line_type_code := 'SUMMARY';
4357             x_freight_cost_temp_price(l_main_price_index).delivery_detail_id := l;
4358             x_freight_cost_temp_price(l_main_price_index).delivery_id := l_container_summary(l).delivery_id;
4359 
4360             x_freight_cost_temp_price(l_main_price_index).total_amount := round(l_container_summary(l).total_amount,2);
4361             --x_freight_cost_temp_price(l_main_price_index).currency_code := l_currency_code;
4362             x_freight_cost_temp_price(l_main_price_index).currency_code := l_container_summary(l).currency_code;
4363             x_freight_cost_temp_price(l_main_price_index).billable_quantity := l_container_summary(l).bquantity;
4364             x_freight_cost_temp_price(l_main_price_index).billable_basis := l_basis_meaning;
4365             x_freight_cost_temp_price(l_main_price_index).billable_uom := l_container_summary(l).buom;
4366 
4367        END IF;
4368        END IF;
4369 
4370        EXIT WHEN l = l_container_summary.LAST;
4371        l := l_container_summary.NEXT(l);
4372        END LOOP;
4373 
4374       -- Here need to create additional summary fc record for all containers
4375       -- in this shipment_pricing session irrespective of their level in the hierarchy
4376       -- Applicable only if atleast one top level container summary record has been created
4377 
4378        IF p_save_flag = 'M' THEN
4379           l_price_count := x_freight_cost_main_price.COUNT;
4380        ELSE
4381           l_price_count := x_freight_cost_temp_price.COUNT;
4382        END IF;
4383 
4384        add_other_container_summary (
4385                         p_save_flag                 =>  p_save_flag,
4386                         x_freight_cost_main_price   =>  x_freight_cost_main_price,
4387                         x_freight_cost_temp_price   =>  x_freight_cost_temp_price,
4388                         x_return_status             =>  l_return_status);
4389 
4390                      IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
4391                         IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
4392                            raise FTE_FREIGHT_PRICING_UTIL.g_other_cont_summ_failed;
4393                         END IF;
4394                      ELSE
4395                         IF p_save_flag = 'M' THEN
4396                            FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,x_freight_cost_main_price.COUNT - l_price_count || ' Non top level container summary records created');
4397                         ELSE
4398                            FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,x_freight_cost_temp_price.COUNT - l_price_count || ' Non top level container summary records created');
4399                         END IF;
4400                      END IF;
4401 
4402       END IF;
4403 
4404       FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,l_container_summary.COUNT || ' Top level Container Summary fc Records created ');
4405 
4406       IF l_fc_dleg_rows.COUNT > 0 THEN
4407 
4408        IF p_save_flag = 'M' THEN
4409           l_main_price_index := 0;
4410        ELSE
4411           l_main_price_index := x_freight_cost_temp_price.COUNT;
4412        END IF;
4413 
4414       --l_main_price_index := 0;
4415       l := l_fc_dleg_rows.FIRST;  --  Can be delivery level also for 'T'
4416       LOOP
4417 
4418          l_main_price_index := l_main_price_index + 1;
4419          IF p_save_flag = 'M' THEN  --  Populate appropriate columns
4420 
4421             OPEN c_get_fc_id(l);
4422             FETCH c_get_fc_id INTO l_freight_cost_id,l_created_by,l_creation_date;
4423             CLOSE c_get_fc_id;
4424 
4425             OPEN  c_get_dlv_id(l);
4426             FETCH c_get_dlv_id INTO l_dlv_id;
4427             CLOSE c_get_dlv_id;
4428 
4429             --l_main_price_index := 1;
4430             x_fc_main_update_rows(l_main_price_index).freight_cost_type_id := l_freight_cost_type_id;
4431             x_fc_main_update_rows(l_main_price_index).freight_cost_id := l_freight_cost_id;
4432             x_fc_main_update_rows(l_main_price_index).created_by := l_created_by;
4433             x_fc_main_update_rows(l_main_price_index).creation_date := l_creation_date;
4434             x_fc_main_update_rows(l_main_price_index).charge_source_code := 'PRICING_ENGINE';
4435             x_fc_main_update_rows(l_main_price_index).line_type_code := 'SUMMARY';
4436             x_fc_main_update_rows(l_main_price_index).delivery_leg_id := l;
4437             x_fc_main_update_rows(l_main_price_index).currency_code := l_currency_code;
4438             x_fc_main_update_rows(l_main_price_index).total_amount := round(l_fc_dleg_rows(l).summary_amount,2);
4439             -- WSH wants to see the summary record. Hence unit_amount and delivery_id is needed(12/20/02)
4440             x_fc_main_update_rows(l_main_price_index).unit_amount := round(l_fc_dleg_rows(l).summary_amount,2);
4441             x_fc_main_update_rows(l_main_price_index).delivery_id := l_dlv_id;
4442 
4443          -- ELSIF p_save_flag = 'T' THEN  --  Populate appropriate columns
4444          ELSE              -- VVP (OM Est change)
4445 
4446             --l_temp_price_index := x_freight_cost_temp_price.COUNT + 1;
4447             /*
4448             x_freight_cost_temp_price(l_temp_price_index).freight_cost_type_id := l_freight_cost_type_id;
4449             x_freight_cost_temp_price(l_temp_price_index).freight_cost_id := l_freight_cost_id;
4450             x_freight_cost_temp_price(l_temp_price_index).charge_source_code := 'PRICING_ENGINE';
4451             x_freight_cost_temp_price(l_temp_price_index).line_type_code := 'SUMMARY';
4452             x_freight_cost_temp_price(l_temp_price_index).delivery_id := l;
4453             x_freight_cost_temp_price(l_temp_price_index).currency_code := l_currency_code;
4454             x_freight_cost_temp_price(l_temp_price_index).total_amount := round(l_fc_dleg_rows(l).summary_amount,2);
4455             */
4456             x_freight_cost_temp_price(l_main_price_index).freight_cost_type_id := l_freight_cost_type_id;
4457             x_freight_cost_temp_price(l_main_price_index).freight_cost_id := l_freight_cost_id;
4458             x_freight_cost_temp_price(l_main_price_index).charge_source_code := 'PRICING_ENGINE';
4459             x_freight_cost_temp_price(l_main_price_index).line_type_code := 'SUMMARY';
4460             x_freight_cost_temp_price(l_main_price_index).delivery_id := l;
4461             x_freight_cost_temp_price(l_main_price_index).currency_code := l_currency_code;
4462             x_freight_cost_temp_price(l_main_price_index).total_amount := round(l_fc_dleg_rows(l).summary_amount,2);
4463             x_freight_cost_temp_price(l_main_price_index).unit_amount := round(l_fc_dleg_rows(l).summary_amount,2);
4464 
4465          END IF;
4466 
4467          EXIT WHEN l = l_fc_dleg_rows.LAST;
4468          l := l_fc_dleg_rows.NEXT(l);
4469       END LOOP;
4470 
4471       FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,l_fc_dleg_rows.COUNT || ' Delivery Leg Summary fc Records created ');
4472 
4473       -- IF p_save_flag = 'T' THEN
4474       IF p_save_flag <> 'M' THEN       -- VVP  (OM Est change)
4475          -- Need to send back lane/sched level summary amount
4476          -- which will be equal to l_fc_dleg_rows(l).summary_amount
4477          -- as in this case only one entity can be there per call
4478 
4479          -- bug 3373643 : the above assumption is no longer true for J, because
4480          -- it is possible to assign multiple deliveries to trips first and then do service compare
4481          -- from trip workbench. So we must take a sum of summary amounts.
4482          -- I am adding the if condition, only to isolate the problem from cases where the above assumption
4483          -- is still valid
4484 
4485         l_temp_amt :=0;
4486         IF (l_fc_dleg_rows.COUNT > 1) THEN
4487            l := l_fc_dleg_rows.FIRST;
4488            LOOP
4489 
4490                l_temp_amt      :=   l_temp_amt + l_fc_dleg_rows(l).summary_amount;
4491                FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,
4492                        'l='||l||' summary='||l_fc_dleg_rows(l).summary_amount);
4493 
4494              EXIT WHEN l = l_fc_dleg_rows.LAST;
4495              l := l_fc_dleg_rows.NEXT(l);
4496            END LOOP;
4497            x_summary_lanesched_price      :=   round(l_temp_amt,2);
4498            x_summary_lanesched_price_uom  :=   l_currency_code;
4499 
4500         ELSE
4501            -- original code (bug 3373643)
4502            x_summary_lanesched_price      :=   round(l_fc_dleg_rows(l).summary_amount,2);
4503            x_summary_lanesched_price_uom  :=   l_currency_code;
4504            l_temp_amt := round(l_fc_dleg_rows(l).summary_amount,2); --for debug only
4505         END IF;
4506         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'x_summary_lanesched_price='||round(l_temp_amt,2));
4507 
4508       END IF;
4509       ELSE
4510           raise FTE_FREIGHT_PRICING_UTIL.g_dleg_sum_not_created;
4511       END IF; -- l_fc_dleg_rows.COUNT > 0
4512       FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'process_qp_output');
4513 
4514 EXCEPTION
4515    WHEN FTE_FREIGHT_PRICING_UTIL.g_prepare_fc_rec_failed THEN
4516         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
4517         FTE_FREIGHT_PRICING_UTIL.set_exception('process_qp_output',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_prepare_fc_rec_failed');
4518         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'prepare_fc_rec failed ');
4519         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'process_qp_output');
4520    WHEN FTE_FREIGHT_PRICING_UTIL.g_other_cont_summ_failed THEN
4521         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
4522         FTE_FREIGHT_PRICING_UTIL.set_exception('process_qp_output',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_other_cont_summ_failed');
4523         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'other_cont_sum failed ');
4524         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'process_qp_output');
4525    WHEN FTE_FREIGHT_PRICING_UTIL.g_get_fc_type_failed THEN
4526         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
4527         FTE_FREIGHT_PRICING_UTIL.set_exception('process_qp_output',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_get_fc_type_failed');
4528         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'process_qp_output');
4529    WHEN FTE_FREIGHT_PRICING_UTIL.g_dleg_sum_not_created THEN
4530         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
4531         FTE_FREIGHT_PRICING_UTIL.set_exception('process_qp_output',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_dleg_sum_not_created');
4532         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Delivery summary not created ');
4533         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'process_qp_output');
4534    WHEN others THEN
4535         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
4536         FTE_FREIGHT_PRICING_UTIL.set_exception('process_qp_output',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
4537         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
4538         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'process_qp_output');
4539 
4540 END process_qp_output;
4541 
4542 --  Start printing procedures
4543 
4544 PROCEDURE print_top_level_detail (
4545         p_first_level_rows        IN    shpmnt_content_tab_type, -- Will get indexed on delivery_detail_id
4546         x_return_status           OUT NOCOPY    VARCHAR2 )
4547 IS
4548 
4549        i     NUMBER:=0;
4550 
4551 BEGIN
4552 
4553    x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
4554 
4555    IF p_first_level_rows.COUNT > 0 THEN
4556    FTE_FREIGHT_PRICING_UTIL.print_tag(p_msg => '<TOP_LEVEL_DETAIL>');
4557    i := p_first_level_rows.FIRST;
4558    LOOP
4559 
4560       FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg =>
4561 	'content_id:'||p_first_level_rows(i).content_id
4562 	||' delivery_leg_id:'||p_first_level_rows(i).delivery_leg_id
4563 	||' container_flag:'||p_first_level_rows(i).container_flag
4564 	||' container_type_code:'||p_first_level_rows(i).container_type_code
4565 	||' det gross wt:'||g_shipment_line_rows(p_first_level_rows(i).content_id).gross_weight
4566 	||' '||g_shipment_line_rows(p_first_level_rows(i).content_id).weight_uom_code
4567 	||' top level wt:'||p_first_level_rows(i).gross_weight
4568 	||' '||p_first_level_rows(i).weight_uom
4569 	||' wdd_volume:'||p_first_level_rows(i).wdd_volume
4570 	||' '||p_first_level_rows(i).wdd_volume_uom_code
4571 	||' wdd_net_weight:'||p_first_level_rows(i).wdd_net_weight
4572 	||' wdd_tare_weight:'||p_first_level_rows(i).wdd_tare_weight
4573 	||' wdd_gross_weight:'||p_first_level_rows(i).wdd_gross_weight
4574 	||' '||p_first_level_rows(i).wdd_weight_uom_code);
4575 
4576       EXIT WHEN i=p_first_level_rows.LAST;
4577       i := p_first_level_rows.NEXT(i);
4578    END LOOP;
4579    FTE_FREIGHT_PRICING_UTIL.print_tag(p_msg => '</TOP_LEVEL_DETAIL>');
4580    END IF;
4581 
4582    EXCEPTION
4583    WHEN others THEN
4584         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
4585         FTE_FREIGHT_PRICING_UTIL.set_exception('print_top_level_detail',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
4586         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
4587 
4588 END print_top_level_detail;
4589 
4590 
4591 PROCEDURE print_rolledup_lines (
4592         p_rolledup_lines          IN    rolledup_line_tab_type,
4593         x_return_status           OUT NOCOPY    VARCHAR2 )
4594 IS
4595 
4596        i     NUMBER:=0;
4597 
4598 BEGIN
4599 
4600    x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
4601 
4602    IF p_rolledup_lines.COUNT > 0 THEN
4603    FTE_FREIGHT_PRICING_UTIL.print_tag(p_msg => '<ROLLEDUP_LINES>');
4604    i := p_rolledup_lines.FIRST;
4605    LOOP
4606 
4607       FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'delivery_detail_id : '||p_rolledup_lines(i).delivery_detail_id||' category_id : '||p_rolledup_lines(i).category_id||' rate_basis : '||
4608    p_rolledup_lines(i).rate_basis||'container_id : '||p_rolledup_lines(i).container_id||' master_container_id : '||p_rolledup_lines(i).master_container_id||'line_quantity : '||
4609    p_rolledup_lines(i).line_quantity||' line_uom : '||p_rolledup_lines(i).line_uom);
4610 
4611       EXIT WHEN i=p_rolledup_lines.LAST;
4612       i := p_rolledup_lines.NEXT(i);
4613    END LOOP;
4614    FTE_FREIGHT_PRICING_UTIL.print_tag(p_msg => '</ROLLEDUP_LINES>');
4615    END IF;
4616 
4617    EXCEPTION
4618    WHEN others THEN
4619         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
4620         FTE_FREIGHT_PRICING_UTIL.set_exception('print_rolledup_lines',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
4621         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
4622 END print_rolledup_lines;
4623 
4624 
4625 PROCEDURE print_top_level_pattern (
4626         p_pattern_rows            IN    top_level_pattern_tab_type, -- Will get indexed on delivery_detail_id
4627         x_return_status           OUT NOCOPY    VARCHAR2 )
4628 IS
4629 
4630        i     NUMBER:=0;
4631 
4632 BEGIN
4633 
4634    x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
4635 
4636    IF p_pattern_rows.COUNT > 0 THEN
4637    FTE_FREIGHT_PRICING_UTIL.print_tag(p_msg => '<PATTERNS>');
4638    i := p_pattern_rows.FIRST;
4639    LOOP
4640 
4641       FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'pattern_index : '||p_pattern_rows(i).pattern_index||' pattern_no : '||p_pattern_rows(i).pattern_no||' services_hash : '||
4642       p_pattern_rows(i).services_hash||' content_id : '||p_pattern_rows(i).content_id||' instance_index : '||p_pattern_rows(i).instance_index);
4643 
4644       EXIT WHEN i=p_pattern_rows.LAST;
4645       i := p_pattern_rows.NEXT(i);
4646    END LOOP;
4647    FTE_FREIGHT_PRICING_UTIL.print_tag(p_msg => '</PATTERNS>');
4648    END IF;
4649 
4650    EXCEPTION
4651    WHEN others THEN
4652         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
4653         FTE_FREIGHT_PRICING_UTIL.set_exception('print_top_level_pattern',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
4654         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
4655 
4656 END print_top_level_pattern;
4657 
4658 PROCEDURE print_dual_instances (
4659         p_dual_instances          IN    pricing_dual_instance_tab_type, -- Will get indexed on delivery_detail_id
4660         x_return_status           OUT NOCOPY    VARCHAR2 )
4661 IS
4662 
4663        i     NUMBER:=0;
4664 
4665 BEGIN
4666 
4667    x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
4668 
4669    IF p_dual_instances.COUNT > 0 THEN
4670    FTE_FREIGHT_PRICING_UTIL.print_tag(p_msg => '<INSTANCES>');
4671    i := p_dual_instances.FIRST;
4672    LOOP
4673 
4674       FTE_FREIGHT_PRICING_UTIL.print_msg(
4675       p_msg => 'instance_index : '||p_dual_instances(i).instance_index||' pattern_no : '||p_dual_instances(i).pattern_no||' services_hash : '||p_dual_instances(i).services_hash||
4676       ' grouping_level : '||p_dual_instances(i).grouping_level||' aggregation : '||p_dual_instances(i).aggregation||' objective : '||p_dual_instances(i).objective||' count_pattern : '
4677        ||p_dual_instances(i).count_pattern||' loose_item_flag : '||p_dual_instances(i).loose_item_flag);
4678 
4679       EXIT WHEN i=p_dual_instances.LAST;
4680       i := p_dual_instances.NEXT(i);
4681    END LOOP;
4682    FTE_FREIGHT_PRICING_UTIL.print_tag(p_msg => '</INSTANCES>');
4683    END IF;
4684 
4685    EXCEPTION
4686    WHEN others THEN
4687         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
4688         FTE_FREIGHT_PRICING_UTIL.set_exception('print_dual_instances',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
4689         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
4690 
4691 END print_dual_instances;
4692 
4693 PROCEDURE print_qp_output_lines (
4694         p_engine_output_line             IN    QP_PREQ_GRP.LINE_TBL_TYPE,
4695         p_engine_output_detail           IN    QP_PREQ_GRP.LINE_DETAIL_TBL_TYPE,
4696         p_return_status                  IN    VARCHAR2 ,
4697         x_return_status                  OUT NOCOPY    VARCHAR2 )
4698 IS
4699 
4700        I     NUMBER:=0;
4701 
4702 BEGIN
4703 
4704    x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
4705 
4706    FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'Return Status text '||  p_return_status);
4707 
4708 FTE_FREIGHT_PRICING_UTIL.print_tag(p_msg => '<Request_Line_Information>');
4709 
4710 I := p_engine_output_line.FIRST;
4711 IF I IS NOT NULL THEN
4712  LOOP
4713   FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'Line Index: '||p_engine_output_line(I).line_index);
4714   FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'Unit_price: '||p_engine_output_line(I).unit_price);
4715   FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'Adjusted Unit Price: '||p_engine_output_line(I).adjusted_unit_price);
4716   FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Percent price: '||p_engine_output_line(I).percent_price);
4717   FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Pricing status code: '||p_engine_output_line(I).status_code);
4718   FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Pricing status text: '||p_engine_output_line(I).status_text);
4719  fte_freight_pricing_util.print_msg(fte_freight_pricing_util.G_DBG,'-------------------------------- -------------------');
4720   EXIT WHEN I = p_engine_output_line.LAST;
4721   I := p_engine_output_line.NEXT(I);
4722  END LOOP;
4723 END IF;
4724 FTE_FREIGHT_PRICING_UTIL.print_tag(p_msg => '</Request_Line_Information>');
4725 --FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => '</Request Line Information>');
4726 
4727 I := p_engine_output_detail.FIRST;
4728 
4729 FTE_FREIGHT_PRICING_UTIL.print_tag(FTE_FREIGHT_PRICING_UTIL.G_DBG,'<Price_List_Discount_Information>');
4730 
4731 IF I IS NOT NULL THEN
4732  LOOP
4733   FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Line Index: '||p_engine_output_detail(I).line_index);
4734   FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Line Detail Index: '||p_engine_output_detail(I).line_detail_index);
4735   FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Line Detail Type:'||p_engine_output_detail(I).line_detail_type_code);
4736   FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'List Header Id: '||p_engine_output_detail(I).list_header_id);
4737   FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'List Line Id: '||p_engine_output_detail(I).list_line_id);
4738   FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'List Line Type Code: '||p_engine_output_detail(I).list_line_type_code);
4739   FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Charge Type Code: '||p_engine_output_detail(I).charge_type_code);
4740   FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Charge Sub Type Code: '||p_engine_output_detail(I).charge_subtype_code);
4741   FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Adjustment Amount : '||p_engine_output_detail(I).adjustment_amount);
4742   FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Line Quantity : '||p_engine_output_detail(I).line_quantity);
4743   FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Operand Calculation Code: '||p_engine_output_detail(I).Operand_calculation_code);
4744   FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Operand value: '||p_engine_output_detail(I).operand_value);
4745   FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Automatic Flag: '||p_engine_output_detail(I).automatic_flag);
4746   FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Override Flag: '||p_engine_output_detail(I).override_flag);
4747   FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'status_code: '||p_engine_output_detail(I).status_code);
4748   FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'status text: '||p_engine_output_detail(I).status_text);
4749   fte_freight_pricing_util.print_msg(fte_freight_pricing_util.G_DBG,'-------------------------------- -------------------');
4750   EXIT WHEN I =  p_engine_output_detail.LAST;
4751   I := p_engine_output_detail.NEXT(I);
4752  END LOOP;
4753 END IF;
4754 FTE_FREIGHT_PRICING_UTIL.print_tag(FTE_FREIGHT_PRICING_UTIL.G_DBG,'</Price_List_Discount_Information>');
4755    EXCEPTION
4756    WHEN others THEN
4757         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
4758         FTE_FREIGHT_PRICING_UTIL.set_exception('print_qp_output_lines',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
4759         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
4760 
4761 END print_qp_output_lines;
4762 
4763 PROCEDURE print_engine_rows (
4764         p_engine_rows             IN    pricing_engine_input_tab_type,
4765         x_return_status           OUT NOCOPY    VARCHAR2 )
4766 IS
4767 
4768        i     NUMBER:=0;
4769 
4770 BEGIN
4771 
4772    x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
4773 
4774    IF p_engine_rows.COUNT > 0 THEN
4775    FTE_FREIGHT_PRICING_UTIL.print_tag(p_msg => '<ENGINE_ROWS>');
4776    i := p_engine_rows.FIRST;
4777    LOOP
4778 
4779       FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg =>
4780 	'input_index:'||p_engine_rows(i).input_index
4781 	||' instance_index:'||p_engine_rows(i).instance_index
4782 	||' Loose item id:'||p_engine_rows(i).loose_item_id
4783 	||' category_id:'||p_engine_rows(i).category_id
4784 	||' basis:'||p_engine_rows(i).basis
4785 	||' line_quantity:'||p_engine_rows(i).line_quantity
4786 	||' line_uom:'||p_engine_rows(i).line_uom
4787 	||' loose_item_flag:'||p_engine_rows(i).loose_item_flag
4788 	||' container_type_code:'||p_engine_rows(i).container_type_code);
4789 
4790       EXIT WHEN i=p_engine_rows.LAST;
4791       i := p_engine_rows.NEXT(i);
4792    END LOOP;
4793    FTE_FREIGHT_PRICING_UTIL.print_tag(p_msg => '</ENGINE_ROWS>');
4794    END IF;
4795 
4796    EXCEPTION
4797    WHEN others THEN
4798         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
4799         FTE_FREIGHT_PRICING_UTIL.set_exception('print_engine_rows',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
4800         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
4801 
4802 END print_engine_rows;
4803 
4804 PROCEDURE print_attribute_rows (
4805         p_attribute_rows          IN    pricing_attribute_tab_type,
4806         x_return_status           OUT NOCOPY    VARCHAR2 )
4807 IS
4808 
4809        i     NUMBER:=0;
4810 
4811 BEGIN
4812 
4813    x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
4814 
4815    IF p_attribute_rows.COUNT > 0 THEN
4816    FTE_FREIGHT_PRICING_UTIL.print_tag(FTE_FREIGHT_PRICING_UTIL.G_INF,'<ATTRIBUTE_ROWS>');
4817    i := p_attribute_rows.FIRST;
4818    LOOP
4819 
4820       FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,'attribute_index : '||p_attribute_rows(i).attribute_index||' input_index : '||p_attribute_rows(i).input_index||' attribute_name : '||
4821       p_attribute_rows(i).attribute_name||' attribute_value : '||p_attribute_rows(i).attribute_value);
4822 
4823       EXIT WHEN i=p_attribute_rows.LAST;
4824       i := p_attribute_rows.NEXT(i);
4825    END LOOP;
4826    FTE_FREIGHT_PRICING_UTIL.print_tag(FTE_FREIGHT_PRICING_UTIL.G_INF,'</ATTRIBUTE_ROWS>');
4827    END IF;
4828 
4829    EXCEPTION
4830    WHEN others THEN
4831         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
4832         FTE_FREIGHT_PRICING_UTIL.set_exception('print_attribute_rows',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
4833         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
4834 
4835 END print_attribute_rows;
4836 
4837 PROCEDURE print_fc_main_rows (
4838         p_fc_main_rows            IN    Freight_Cost_Main_Tab_Type,
4839         x_return_status           OUT NOCOPY    VARCHAR2 )
4840 IS
4841 
4842        i     NUMBER:=0;
4843 
4844 BEGIN
4845 
4846    x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
4847 
4848    IF p_fc_main_rows.COUNT > 0 THEN
4849    FTE_FREIGHT_PRICING_UTIL.print_tag(FTE_FREIGHT_PRICING_UTIL.G_INF,'<FC_Records>');
4850    i := p_fc_main_rows.FIRST;
4851    LOOP
4852 
4853       FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,'fc type id : '||p_fc_main_rows(i).freight_cost_type_id||' line type code : '||
4854       p_fc_main_rows(i).line_type_code||' detail id : '||p_fc_main_rows(i).delivery_detail_id||' delivery leg : '||
4855       p_fc_main_rows(i).delivery_leg_id||' quantity : '||p_fc_main_rows(i).quantity||' uom : '||p_fc_main_rows(i).uom||' unit amount : '||p_fc_main_rows(i).unit_amount||'total amount : '||
4856       p_fc_main_rows(i).total_amount||' currency code : '||p_fc_main_rows(i).currency_code||' Charge unit value : '||p_fc_main_rows(i).charge_unit_value||' Delivery id : '||p_fc_main_rows(i).delivery_id);
4857 
4858       EXIT WHEN i=p_fc_main_rows.LAST;
4859       i := p_fc_main_rows.NEXT(i);
4860    END LOOP;
4861    FTE_FREIGHT_PRICING_UTIL.print_tag(FTE_FREIGHT_PRICING_UTIL.G_INF,'</FC_Records>');
4862    END IF;
4863 
4864    EXCEPTION
4865    WHEN others THEN
4866         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
4867         FTE_FREIGHT_PRICING_UTIL.set_exception('print_fc_main_rows',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
4868         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
4869 
4870 END print_fc_main_rows;
4871 
4872 PROCEDURE print_fc_temp_rows (
4873         p_fc_temp_rows            IN    Freight_Cost_Temp_Tab_Type,
4874         x_return_status           OUT NOCOPY    VARCHAR2 )
4875 IS
4876 
4877        i     NUMBER:=0;
4878     l_log_level     NUMBER := FTE_FREIGHT_PRICING_UTIL.G_DBG;
4879 
4880 BEGIN
4881 
4882    x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
4883 
4884    IF p_fc_temp_rows.COUNT > 0 THEN
4885    FTE_FREIGHT_PRICING_UTIL.print_tag(l_log_level,'<FC_TEMP_Records>');
4886    i := p_fc_temp_rows.FIRST;
4887    LOOP
4888 
4889 	FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'-------------');
4890 	FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,
4891 	  'FREIGHT_COST_ID='||p_fc_temp_rows(i).FREIGHT_COST_ID);
4892 	FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,
4893 	  'FREIGHT_COST_TYPE_ID='||p_fc_temp_rows(i).FREIGHT_COST_TYPE_ID);
4894 	FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,
4895 	  'UNIT_AMOUNT='||p_fc_temp_rows(i).UNIT_AMOUNT);
4896 	FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,
4897 	  'CALCULATION_METHOD='||p_fc_temp_rows(i).CALCULATION_METHOD);
4898 	FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,
4899 	  'UOM='||p_fc_temp_rows(i).UOM);
4900 	FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,
4901 	  'QUANTITY='||p_fc_temp_rows(i).QUANTITY);
4902 	FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,
4903 	  'TOTAL_AMOUNT='||p_fc_temp_rows(i).TOTAL_AMOUNT);
4904 	FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,
4905 	  'CURRENCY_CODE='||p_fc_temp_rows(i).CURRENCY_CODE);
4906 	FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,
4907 	  'CONVERSION_DATE='||p_fc_temp_rows(i).CONVERSION_DATE);
4908 	FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,
4909 	  'CONVERSION_RATE='||p_fc_temp_rows(i).CONVERSION_RATE);
4910 	FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,
4911 	  'CONVERSION_TYPE_CODE='||p_fc_temp_rows(i).CONVERSION_TYPE_CODE);
4912 	FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,
4913 	  'TRIP_ID='||p_fc_temp_rows(i).TRIP_ID);
4914 	FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,
4915 	  'STOP_ID='||p_fc_temp_rows(i).STOP_ID);
4916 	FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,
4917 	  'DELIVERY_ID='||p_fc_temp_rows(i).DELIVERY_ID);
4918 	FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,
4919 	  'DELIVERY_LEG_ID='||p_fc_temp_rows(i).DELIVERY_LEG_ID);
4920 	FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,
4921 	  'DELIVERY_DETAIL_ID='||p_fc_temp_rows(i).DELIVERY_DETAIL_ID);
4922 	FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,
4923 	  'LINE_TYPE_CODE='||p_fc_temp_rows(i).LINE_TYPE_CODE);
4924 	FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,
4925 	  'PRICING_LIST_HEADER_ID='||p_fc_temp_rows(i).PRICING_LIST_HEADER_ID);
4926 	FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,
4927 	  'PRICING_LIST_LINE_ID='||p_fc_temp_rows(i).PRICING_LIST_LINE_ID);
4928 	FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,
4929 	  'APPLIED_TO_CHARGE_ID='||p_fc_temp_rows(i).APPLIED_TO_CHARGE_ID);
4930 	FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,
4931 	  'CHARGE_UNIT_VALUE='||p_fc_temp_rows(i).CHARGE_UNIT_VALUE);
4932 	FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,
4933 	  'CHARGE_SOURCE_CODE='||p_fc_temp_rows(i).CHARGE_SOURCE_CODE);
4934 	FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,
4935 	  'ESTIMATED_FLAG='||p_fc_temp_rows(i).ESTIMATED_FLAG);
4936 	FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,
4937 	  'COMPARISON_REQUEST_ID='||p_fc_temp_rows(i).COMPARISON_REQUEST_ID);
4938 	FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,
4939 	  'LANE_ID='||p_fc_temp_rows(i).LANE_ID);
4940 	FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,
4941 	  'SCHEDULE_ID='||p_fc_temp_rows(i).SCHEDULE_ID);
4942 	FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,
4943 	  'MOVED_TO_MAIN_FLAG='||p_fc_temp_rows(i).MOVED_TO_MAIN_FLAG);
4944 	FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,
4945 	  'SERVICE_TYPE_CODE='||p_fc_temp_rows(i).SERVICE_TYPE_CODE);
4946 	FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,
4947 	  'COMMODITY_CATEGORY_ID='||p_fc_temp_rows(i).COMMODITY_CATEGORY_ID);
4948 	FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,
4949 	  'BILLABLE_QUANTITY='||p_fc_temp_rows(i).BILLABLE_QUANTITY);
4950 	FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,
4951 	  'BILLABLE_UOM='||p_fc_temp_rows(i).BILLABLE_UOM);
4952 	FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,
4953 	  'BILLABLE_BASIS='||p_fc_temp_rows(i).BILLABLE_BASIS);
4954 
4955 
4956 	FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'-------------');
4957 
4958       EXIT WHEN i=p_fc_temp_rows.LAST;
4959       i := p_fc_temp_rows.NEXT(i);
4960    END LOOP;
4961    FTE_FREIGHT_PRICING_UTIL.print_tag(l_log_level,'</FC_TEMP_Records>');
4962    END IF;
4963 
4964    EXCEPTION
4965    WHEN others THEN
4966         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
4967         FTE_FREIGHT_PRICING_UTIL.set_exception('print_fc_temp_rows',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
4968         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
4969 
4970 END print_fc_temp_rows;
4971 --  End printing procedures
4972 
4973 PROCEDURE rollup_container_hierarchy (
4974         p_container_id            IN     NUMBER,
4975         p_classification_code     IN     VARCHAR2,
4976         p_lane_basis              IN     VARCHAR2,
4977         p_lane_id                 IN     NUMBER,
4978         x_rolledup_lines          IN OUT NOCOPY rolledup_line_tab_type,
4979         x_return_status           OUT NOCOPY     VARCHAR2 )
4980 IS
4981 
4982      l_uom_ea			     VARCHAR2(30);
4983   l_api_name              CONSTANT VARCHAR2(30)   := 'rollup_container_hierarchy';
4984         i                     NUMBER:=0;
4985         l_category_id         NUMBER:=0;
4986         l_basis               VARCHAR2(30):=NULL;
4987         l_num_basis           NUMBER:=0;
4988         l_start_count         NUMBER:=0;
4989         l_detail_count        NUMBER:=0;
4990         l_return_status       VARCHAR2(1);
4991 
4992     l_log_level     NUMBER := FTE_FREIGHT_PRICING_UTIL.G_INF;
4993 
4994 BEGIN
4995 
4996    x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
4997    FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
4998    FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,'rollup_container_hierarchy','start');
4999 
5000        OPEN get_uom_for_each;
5001        FETCH get_uom_for_each INTO l_uom_ea;
5002        CLOSE get_uom_for_each;
5003 
5004 	IF l_uom_ea is null THEN
5005           FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'After get_uom_for_each ');
5006           fte_freight_pricing_util.set_exception(l_api_name,l_log_level,'g_get_uom_for_each_failed');
5007           raise FND_API.G_EXC_ERROR;
5008 	END IF;
5009 
5010    i := g_shipment_line_rows.FIRST;
5011    LOOP
5012       IF g_shipment_line_rows(i).parent_delivery_detail_id = p_container_id THEN
5013 
5014          IF ((g_shipment_line_rows(i).container_flag = 'Y' ) OR (g_shipment_line_rows(i).container_flag = 'C' ))THEN
5015 
5016             l_start_count := x_rolledup_lines.COUNT;
5017             rollup_container_hierarchy (
5018                 p_container_id         =>  g_shipment_line_rows(i).delivery_detail_id,
5019                 p_classification_code  =>  p_classification_code,
5020                 p_lane_basis           =>  p_lane_basis,
5021                 p_lane_id              =>  p_lane_id,
5022                 x_rolledup_lines       =>  x_rolledup_lines,
5023                 x_return_status        =>  l_return_status);
5024 
5025                 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
5026                         IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
5027                            FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'Container '||g_shipment_line_rows(i).delivery_detail_id);
5028                            raise FTE_FREIGHT_PRICING_UTIL.g_rollup_container_failed;
5029                         END IF;
5030                 ELSE
5031                         l_detail_count := x_rolledup_lines.COUNT - l_start_count;
5032                         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,'Container '||g_shipment_line_rows(i).delivery_detail_id||' has '||l_detail_count||' rolled up lines');
5033                 END IF;
5034          ELSE
5035 
5036             IF p_classification_code IS NOT NULL THEN
5037 
5038              IF (g_shipment_line_rows(i).inventory_item_id IS NULL
5039                  AND g_shipment_line_rows(i).comm_category_id IS NOT NULL) THEN
5040                  -- FTE J FTE estimate rate --
5041                  l_category_id := g_shipment_line_rows(i).comm_category_id;
5042              ELSIF (g_shipment_line_rows(i).inventory_item_id IS NULL
5043                  AND g_shipment_line_rows(i).comm_category_id IS NULL) THEN
5044                  -- FTE J one-time items --
5045                  l_category_id := get_default_category(p_classification_code=>p_classification_code);
5046 
5047                  IF (l_category_id IS NOT NULL) THEN
5048                     FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,
5049                      'Default category id '||l_category_id||' got assigned to : '
5050                         || g_shipment_line_rows(i).delivery_detail_id);
5051                     g_shipment_line_rows(i).comm_category_id := l_category_id;
5052                  ELSE
5053                     FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_LOG,
5054                         'No default category found ');
5055                     raise FTE_FREIGHT_PRICING_UTIL.g_category_not_found;
5056                  END IF;
5057 
5058              ELSE
5059 
5060                OPEN get_category(g_shipment_line_rows(i).inventory_item_id,g_shipment_line_rows(i).organization_id,p_classification_code);
5061                -- There should be only one category for one classification code for an item-org
5062                FETCH get_category INTO l_category_id;
5063                IF get_category%NOTFOUND THEN
5064                   CLOSE get_category;
5065                   FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'Rolledup line  '||g_shipment_line_rows(i).delivery_detail_id);
5066                   -- FTE J --
5067                   -- Attempt to assign a default category and continue
5068                  FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,
5069                   'Delivery detail has no commodity assignment. Try to get default category');
5070                  l_category_id := get_default_category(p_classification_code=>p_classification_code);
5071                  IF (l_category_id IS NULL) THEN
5072                     FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_LOG,
5073                         'No default category found ');
5074                     raise FTE_FREIGHT_PRICING_UTIL.g_category_not_found;
5075                  END IF;
5076                  FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,
5077                     'Default category id '||l_category_id);
5078                ELSE
5079                  CLOSE get_category;
5080                END IF;
5081 
5082              END IF; -- if inventory_item_id is null
5083 
5084              OPEN get_category_basis(p_lane_id,l_category_id);
5085              FETCH get_category_basis INTO l_basis;
5086              CLOSE get_category_basis;
5087 
5088             ELSE
5089 
5090                l_category_id := g_default_category_id;
5091                FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,'Default category id (-9999)  got assigned to : '|| g_shipment_line_rows(i).delivery_detail_id||' as no classification code is found on the lane');
5092 
5093             END IF;
5094 
5095             IF l_basis IS NULL THEN
5096                l_basis := p_lane_basis;
5097             END IF;
5098 
5099             IF l_basis = 'CONTAINER' THEN
5100                l_num_basis := G_CONTAINER_BASIS;
5101             ELSIF l_basis = 'WEIGHT' THEN
5102                l_num_basis := G_WEIGHT_BASIS;
5103             ELSIF l_basis = 'VOLUME' THEN
5104                l_num_basis := G_VOLUME_BASIS;
5105             ELSE   -- NULL or non supported basis
5106                raise FTE_FREIGHT_PRICING_UTIL.g_invalid_basis;
5107             END IF;
5108 
5109             x_rolledup_lines(g_shipment_line_rows(i).delivery_detail_id).delivery_detail_id := g_shipment_line_rows(i).delivery_detail_id;
5110             x_rolledup_lines(g_shipment_line_rows(i).delivery_detail_id).container_id  := p_container_id;
5111             x_rolledup_lines(g_shipment_line_rows(i).delivery_detail_id).category_id   := l_category_id;
5112             x_rolledup_lines(g_shipment_line_rows(i).delivery_detail_id).rate_basis    := l_num_basis;
5113 
5114             g_rolledup_lines(g_shipment_line_rows(i).delivery_detail_id).delivery_detail_id := g_shipment_line_rows(i).delivery_detail_id;
5115             g_rolledup_lines(g_shipment_line_rows(i).delivery_detail_id).container_id  := p_container_id;
5116             g_rolledup_lines(g_shipment_line_rows(i).delivery_detail_id).category_id   := l_category_id;
5117             g_rolledup_lines(g_shipment_line_rows(i).delivery_detail_id).rate_basis    := l_num_basis;
5118 
5119             IF l_num_basis = G_CONTAINER_BASIS THEN
5120 
5121                x_rolledup_lines(g_shipment_line_rows(i).delivery_detail_id).line_quantity := 1;
5122                x_rolledup_lines(g_shipment_line_rows(i).delivery_detail_id).line_uom      := l_uom_ea;
5123                g_rolledup_lines(g_shipment_line_rows(i).delivery_detail_id).line_quantity := 1;
5124                g_rolledup_lines(g_shipment_line_rows(i).delivery_detail_id).line_uom      := l_uom_ea;
5125             ELSIF l_num_basis = G_WEIGHT_BASIS THEN
5126 
5127                --x_rolledup_lines(g_shipment_line_rows(i).delivery_detail_id).line_quantity := g_shipment_line_rows(i).net_weight;
5128                x_rolledup_lines(g_shipment_line_rows(i).delivery_detail_id).line_quantity := nvl(g_shipment_line_rows(i).net_weight,g_shipment_line_rows(i).gross_weight);
5129                x_rolledup_lines(g_shipment_line_rows(i).delivery_detail_id).line_uom      := g_shipment_line_rows(i).weight_uom_code;
5130                --g_rolledup_lines(g_shipment_line_rows(i).delivery_detail_id).line_quantity := g_shipment_line_rows(i).net_weight;
5131                g_rolledup_lines(g_shipment_line_rows(i).delivery_detail_id).line_quantity := nvl(g_shipment_line_rows(i).net_weight,g_shipment_line_rows(i).gross_weight);
5132                g_rolledup_lines(g_shipment_line_rows(i).delivery_detail_id).line_uom      := g_shipment_line_rows(i).weight_uom_code;
5133             ELSIF l_num_basis = G_VOLUME_BASIS THEN
5134 
5135                x_rolledup_lines(g_shipment_line_rows(i).delivery_detail_id).line_quantity := g_shipment_line_rows(i).volume;
5136                x_rolledup_lines(g_shipment_line_rows(i).delivery_detail_id).line_uom      := g_shipment_line_rows(i).volume_uom_code;
5137                g_rolledup_lines(g_shipment_line_rows(i).delivery_detail_id).line_quantity := g_shipment_line_rows(i).volume;
5138                g_rolledup_lines(g_shipment_line_rows(i).delivery_detail_id).line_uom      := g_shipment_line_rows(i).volume_uom_code;
5139             END IF;
5140 
5141          END IF;
5142       END IF;
5143 
5144       EXIT WHEN i = g_shipment_line_rows.LAST;
5145       i := g_shipment_line_rows.NEXT(i);
5146    END LOOP;
5147    x_return_status := l_return_status;
5148    FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'rollup_container_hierarchy');
5149 
5150 EXCEPTION
5151    WHEN FND_API.G_EXC_ERROR THEN
5152         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
5153         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'rollup_container_hierarchy');
5154    WHEN FTE_FREIGHT_PRICING_UTIL.g_rollup_container_failed THEN
5155         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
5156         FTE_FREIGHT_PRICING_UTIL.set_exception('rollup_container_hierarchy',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_rollup_container_failed');
5157         --FTE_FREIGHT_PRICING_UTIL.print_debug('rollup_container failed ');
5158         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'rollup_container failed ');
5159         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'rollup_container_hierarchy');
5160    WHEN FTE_FREIGHT_PRICING_UTIL.g_category_not_found THEN
5161         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
5162         FTE_FREIGHT_PRICING_UTIL.set_exception('rollup_container_hierarchy',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_category_not_found');
5163         --FTE_FREIGHT_PRICING_UTIL.print_debug('category_not_found ');
5164         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'category_not_found ');
5165         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'rollup_container_hierarchy');
5166    WHEN FTE_FREIGHT_PRICING_UTIL.g_invalid_basis THEN
5167         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
5168         FTE_FREIGHT_PRICING_UTIL.set_exception('rollup_container_hierarchy',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_invalid_basis');
5169         --FTE_FREIGHT_PRICING_UTIL.print_debug('basis_not_found ');
5170         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'basis_not_found ');
5171         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'rollup_container_hierarchy');
5172    WHEN others THEN
5173         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
5174         FTE_FREIGHT_PRICING_UTIL.set_exception('rollup_container_hierarchy',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
5175         --FTE_FREIGHT_PRICING_UTIL.print_debug('Unexpected Error : '||SQLCODE||' : '||SQLERRM);
5176         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
5177         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'rollup_container_hierarchy');
5178 
5179 END rollup_container_hierarchy;
5180 
5181 
5182 PROCEDURE rollup_loose_item (
5183         p_loose_item_id           IN     NUMBER,
5184         p_classification_code     IN     VARCHAR2,
5185         p_lane_basis              IN     VARCHAR2,
5186         p_lane_id                 IN     NUMBER,
5187         x_rolledup_rec            IN OUT NOCOPY rolledup_line_rec_type,
5188         x_return_status           OUT NOCOPY     VARCHAR2 )
5189 IS
5190 
5191      l_uom_ea			     VARCHAR2(30);
5192   l_api_name              CONSTANT VARCHAR2(30)   := 'rollup_loose_item';
5193         i                     NUMBER:=0;
5194         l_category_id         NUMBER:=0;
5195         l_basis               VARCHAR2(30):=NULL;
5196         l_num_basis           NUMBER:=0;
5197         l_return_status       VARCHAR2(1);
5198 
5199         l_log_level     NUMBER := FTE_FREIGHT_PRICING_UTIL.G_INF;
5200 
5201 BEGIN
5202 -- {
5203 
5204    x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
5205    FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
5206    FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,'rollup_loose_item','start');
5207 
5208        OPEN get_uom_for_each;
5209        FETCH get_uom_for_each INTO l_uom_ea;
5210        CLOSE get_uom_for_each;
5211 
5212 	IF l_uom_ea is null THEN
5213           FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'After get_uom_for_each ');
5214           fte_freight_pricing_util.set_exception(l_api_name,l_log_level,'g_get_uom_for_each_failed');
5215           raise FND_API.G_EXC_ERROR;
5216 	END IF;
5217 
5218       FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'p_classification_code='||p_classification_code);
5219    IF p_classification_code IS NOT NULL THEN
5220    -- {
5221       FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'g_shipment_line_rows.COUNT='||g_shipment_line_rows.COUNT);
5222       FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'g_shipment_line_rows(p_loose_item_id).inventory_item_id ='||g_shipment_line_rows(p_loose_item_id).inventory_item_id);
5223       FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'g_shipment_line_rows(p_loose_item_id).organization_id ='||g_shipment_line_rows(p_loose_item_id).organization_id);
5224 
5225 
5226       IF (g_shipment_line_rows(p_loose_item_id).inventory_item_id IS NULL
5227          AND g_shipment_line_rows(p_loose_item_id).comm_category_id IS NOT NULL) THEN
5228          -- FTE J FTE estimate rate --
5229             FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'g_shipment_line_rows(p_loose_item_id).comm_category_id='||g_shipment_line_rows(p_loose_item_id).comm_category_id);
5230          l_category_id := g_shipment_line_rows(p_loose_item_id).comm_category_id;
5231       ELSIF (g_shipment_line_rows(p_loose_item_id).inventory_item_id IS NULL
5232          AND g_shipment_line_rows(p_loose_item_id).comm_category_id IS NULL) THEN
5233                  -- FTE J one-time items --
5234                  l_category_id := get_default_category(p_classification_code=>p_classification_code);
5235 
5236                  IF (l_category_id IS NOT NULL) THEN
5237                     FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,
5238                      'Default category id '||l_category_id||' got assigned to : '
5239                         || g_shipment_line_rows(p_loose_item_id).delivery_detail_id);
5240                     g_shipment_line_rows(p_loose_item_id).comm_category_id := l_category_id;
5241                  ELSE
5242                     FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_LOG,
5243                         'No default category found ');
5244                     raise FTE_FREIGHT_PRICING_UTIL.g_category_not_found;
5245                  END IF;
5246       ELSE
5247 
5248         OPEN get_category(g_shipment_line_rows(p_loose_item_id).inventory_item_id,g_shipment_line_rows(p_loose_item_id).organization_id,p_classification_code);
5249               -- There should be only one category for one classification code for an item-org
5250         FETCH get_category INTO l_category_id;
5251         IF get_category%NOTFOUND THEN
5252            CLOSE get_category;
5253            FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'Rolledup line  '||g_shipment_line_rows(p_loose_item_id).delivery_detail_id);
5254                   -- FTE J --
5255                   -- Attempt to assign a default category and continue
5256                  FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,
5257                   'Delivery detail has no commodity assignment. Try to get default category');
5258                  l_category_id := get_default_category(p_classification_code=>p_classification_code);
5259                  IF (l_category_id IS NULL) THEN
5260                     FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_LOG,
5261                         'No default category found ');
5262                     raise FTE_FREIGHT_PRICING_UTIL.g_category_not_found;
5263                  END IF;
5264                  FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,
5265                     'Default category id '||l_category_id);
5266         ELSE
5267           CLOSE get_category;
5268         END IF;
5269         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'l_category_id='||l_category_id);
5270 
5271       END IF;
5272 
5273       OPEN get_category_basis(p_lane_id,l_category_id);
5274       FETCH get_category_basis INTO l_basis;
5275       CLOSE get_category_basis;
5276 
5277    -- }
5278    ELSE
5279    -- {
5280 
5281       l_category_id := g_default_category_id;
5282       FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,'Default category id got assigned to : '|| p_loose_item_id ||' as no classification code is found on the lane');
5283 
5284    -- }
5285    END IF;
5286 
5287    IF l_basis IS NULL THEN
5288       l_basis := p_lane_basis;
5289    END IF;
5290 
5291    IF l_basis = 'CONTAINER' THEN
5292       l_num_basis := G_CONTAINER_BASIS;
5293    ELSIF l_basis = 'WEIGHT' THEN
5294       l_num_basis := G_WEIGHT_BASIS;
5295    ELSIF l_basis = 'VOLUME' THEN
5296       l_num_basis := G_VOLUME_BASIS;
5297    ELSE   -- NULL or non supported basis
5298       raise FTE_FREIGHT_PRICING_UTIL.g_invalid_basis;
5299    END IF;
5300 
5301       FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'p_loose_item_id= '||p_loose_item_id);
5302       FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'got basis');
5303 
5304    x_rolledup_rec.delivery_detail_id := p_loose_item_id;
5305    -- x_rolledup_rec.container_id       := null;
5306    x_rolledup_rec.container_id       := p_loose_item_id;
5307    x_rolledup_rec.category_id        := l_category_id;
5308    x_rolledup_rec.rate_basis         := l_num_basis;
5309 
5310    g_rolledup_lines(p_loose_item_id)   := x_rolledup_rec;
5311    FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'added to g_rolledup_lines');
5312 
5313    IF l_num_basis = G_CONTAINER_BASIS THEN
5314 
5315          x_rolledup_rec.line_quantity := 1;
5316          x_rolledup_rec.line_uom      := l_uom_ea;
5317          g_rolledup_lines(p_loose_item_id).line_quantity := 1;
5318          g_rolledup_lines(p_loose_item_id).line_uom      := l_uom_ea;
5319 
5320    ELSIF l_num_basis = G_WEIGHT_BASIS THEN
5321         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'before x_rolledup_rec.line_quantity');
5322 
5323          x_rolledup_rec.line_quantity := nvl(g_shipment_line_rows(p_loose_item_id).net_weight,g_shipment_line_rows(p_loose_item_id).gross_weight);
5324          x_rolledup_rec.line_uom      := g_shipment_line_rows(p_loose_item_id).weight_uom_code;
5325          g_rolledup_lines(p_loose_item_id).line_quantity := x_rolledup_rec.line_quantity;
5326          g_rolledup_lines(p_loose_item_id).line_uom      := x_rolledup_rec.line_uom;
5327 
5328    ELSIF l_num_basis = G_VOLUME_BASIS THEN
5329 
5330          x_rolledup_rec.line_quantity := g_shipment_line_rows(p_loose_item_id).volume;
5331          x_rolledup_rec.line_uom      := g_shipment_line_rows(p_loose_item_id).volume_uom_code;
5332          g_rolledup_lines(p_loose_item_id).line_quantity := x_rolledup_rec.line_quantity;
5333          g_rolledup_lines(p_loose_item_id).line_uom      := x_rolledup_rec.line_uom;
5334 
5335    END IF;
5336 
5337 
5338    x_return_status := l_return_status;
5339    FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'rollup_loose_item');
5340 
5341 EXCEPTION
5342    WHEN FND_API.G_EXC_ERROR THEN
5343         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
5344         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'rollup_loose_item');
5345    WHEN FTE_FREIGHT_PRICING_UTIL.g_rollup_container_failed THEN
5346         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
5347         FTE_FREIGHT_PRICING_UTIL.set_exception('rollup_loose_item',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_rollup_container_failed');
5348         --FTE_FREIGHT_PRICING_UTIL.print_debug('rollup_container failed ');
5349         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'rollup_loose_item failed ');
5350         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'rollup_loose_item');
5351    WHEN FTE_FREIGHT_PRICING_UTIL.g_category_not_found THEN
5352         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
5353         FTE_FREIGHT_PRICING_UTIL.set_exception('rollup_loose_item',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_category_not_found');
5354         --FTE_FREIGHT_PRICING_UTIL.print_debug('category_not_found ');
5355         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'category_not_found ');
5356         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'rollup_loose_item');
5357    WHEN FTE_FREIGHT_PRICING_UTIL.g_invalid_basis THEN
5358         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
5359         FTE_FREIGHT_PRICING_UTIL.set_exception('rollup_loose_item',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_invalid_basis');
5360         --FTE_FREIGHT_PRICING_UTIL.print_debug('basis_not_found ');
5361         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'basis_not_found ');
5362         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'rollup_loose_item');
5363    WHEN others THEN
5364         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
5365         FTE_FREIGHT_PRICING_UTIL.set_exception('rollup_loose_item',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
5366         --FTE_FREIGHT_PRICING_UTIL.print_debug('Unexpected Error : '||SQLCODE||' : '||SQLERRM);
5367         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
5368         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'rollup_loose_item');
5369 
5370 -- }
5371 END rollup_loose_item;
5372 
5373 PROCEDURE search_matching_instance (
5374         --p_rolledup_category_rows  IN     WSH_UTIL_CORE.id_tab_type, -- Indexed on category_id
5375         --p_rolledup_category_basis IN     WSH_UTIL_CORE.id_tab_type,
5376         p_pattern_no              IN     NUMBER,
5377         p_grouping_level          IN     VARCHAR2,
5378         p_aggregation             IN     VARCHAR2,
5379         p_objective               IN     VARCHAR2,
5380         p_toplevel_charges_hash   IN     VARCHAR2, -- Top level requested additional services hash
5381         p_pricing_dual_instances  IN     pricing_dual_instance_tab_type,
5382         --p_pricing_engine_rows     IN     pricing_engine_input_tab_type,
5383         x_matched_instance_index  OUT NOCOPY     NUMBER,  --  -100 if does not match
5384         x_return_status           OUT NOCOPY     VARCHAR2 )
5385 IS
5386 
5387         i                                NUMBER :=0;
5388         j                                NUMBER :=0;
5389         k                                NUMBER :=0;
5390         l                                NUMBER :=0;
5391         m                                NUMBER :=0;
5392         n                                NUMBER :=0;
5393         l_matched_index                  WSH_UTIL_CORE.id_tab_type;
5394         l_matched_category_rows          instance_category_tab_type;
5395         l_matched_basis_rows             instance_basis_tab_type;
5396         l_matched_instance_index         NUMBER :=0;
5397         l_hash_string                    VARCHAR2(50);
5398         l_index                          NUMBER:=0;
5399 
5400     l_log_level     NUMBER := FTE_FREIGHT_PRICING_UTIL.G_DBG;
5401 
5402 BEGIN
5403 
5404    x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
5405    FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
5406    FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,'search_matching_instance','start');
5407 
5408    i := p_pricing_dual_instances.FIRST;
5409    LOOP
5410          -- SC_WB(2) should match with MC_WB(5) and SC_VB(3) should match with MC_VB(6)
5411          -- as long as the pricing dual and pricing objectives match
5412          IF p_pricing_dual_instances(i).pattern_no = p_pattern_no THEN  -- Can match with more than one here
5413             l_matched_index(p_pricing_dual_instances(i).instance_index) := p_pricing_dual_instances(i).instance_index;
5414          ELSIF (p_pattern_no = G_PATTERN_2 OR p_pattern_no = G_PATTERN_5 OR p_pattern_no = G_PATTERN_9) THEN
5415             IF (p_pricing_dual_instances(i).pattern_no = G_PATTERN_5  OR
5416 		p_pricing_dual_instances(i).pattern_no = G_PATTERN_9 OR
5417                p_pricing_dual_instances(i).pattern_no = G_PATTERN_2)  AND
5418                p_pricing_dual_instances(i).grouping_level = p_grouping_level AND
5419                p_pricing_dual_instances(i).aggregation = p_aggregation AND
5420                NVL(p_pricing_dual_instances(i).objective,'N') = NVL(p_objective,'N') THEN
5421                l_matched_index(p_pricing_dual_instances(i).instance_index) :=
5422                                     p_pricing_dual_instances(i).instance_index;
5423             END IF;
5424          ELSIF (p_pattern_no = G_PATTERN_3 OR p_pattern_no = G_PATTERN_6 OR p_pattern_no = G_PATTERN_10) THEN
5425             IF (p_pricing_dual_instances(i).pattern_no = G_PATTERN_6  OR
5426 		p_pricing_dual_instances(i).pattern_no = G_PATTERN_10 OR
5427                p_pricing_dual_instances(i).pattern_no = G_PATTERN_3)  AND
5428                p_pricing_dual_instances(i).grouping_level = p_grouping_level AND
5429                p_pricing_dual_instances(i).aggregation = p_aggregation AND
5430                NVL(p_pricing_dual_instances(i).objective,'N') = NVL(p_objective,'N') THEN
5431                l_matched_index(p_pricing_dual_instances(i).instance_index) :=
5432                                     p_pricing_dual_instances(i).instance_index;
5433             END IF;
5434          END IF;
5435 
5436          EXIT WHEN i = p_pricing_dual_instances.LAST;
5437          i := p_pricing_dual_instances.NEXT(i);
5438    END LOOP;
5439 
5440    IF l_matched_index.COUNT <> 0 THEN
5441 
5442    -- Comes here if there are instances from same pattern and
5443    -- p_aggregation = 'ACROSS' and matching basis or p_aggregation = 'WITHIN' and matching categories
5444    -- Now match the additional services for the top level row with that of the matched instances
5445 
5446       m := p_pricing_dual_instances.FIRST;
5447       LOOP
5448         IF l_matched_index.EXISTS(p_pricing_dual_instances(m).instance_index) THEN
5449            IF NVL(p_pricing_dual_instances(m).services_hash,'N') = NVL(p_toplevel_charges_hash,'N') THEN
5450               l_matched_instance_index := p_pricing_dual_instances(m).instance_index;
5451               EXIT; -- Maximum one can match
5452            END IF;
5453         END IF;
5454 
5455         EXIT WHEN m = p_pricing_dual_instances.LAST;
5456         m := p_pricing_dual_instances.NEXT(m);
5457       END LOOP;
5458 
5459       IF l_matched_instance_index = 0 THEN
5460          l_matched_instance_index := -100;
5461       END IF;
5462 
5463    ELSE
5464       l_matched_instance_index := -100;
5465 
5466    END IF;
5467 
5468    x_matched_instance_index := l_matched_instance_index;
5469    FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'search_matching_instance');
5470    RETURN;
5471 
5472 EXCEPTION
5473    WHEN others THEN
5474         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
5475         FTE_FREIGHT_PRICING_UTIL.set_exception('search_matching_instance',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
5476         --FTE_FREIGHT_PRICING_UTIL.print_debug('Unexpected Error : '||SQLCODE||' : '||SQLERRM);
5477         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
5478         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'search_matching_instance');
5479 END search_matching_instance;
5480 
5481 --      This procedure should be called to create associated engine rows while creating one new instance
5482 --      It also creates relevant associated attribute rows
5483 --      The calling procedure takes care of creating pattern_row and dual_instance_row
5484 --      Additional attributes either at delivery level/container level are also added there
5485 --      It is called for each top level container
5486 --      Can be called for both Single-commodity and multi-commodity (ie. for all patterns)
5487 
5488 PROCEDURE create_new_instance (
5489         p_rolled_up_lines         IN     rolledup_line_tab_type,
5490         p_toplevel_lines          IN     shpmnt_content_rec_type,
5491         p_grouping_level          IN     VARCHAR2,
5492         p_aggregation             IN     VARCHAR2,
5493         p_objective               IN     VARCHAR2,
5494         p_instance_count          IN     NUMBER,
5495         x_pricing_engine_rows     IN OUT NOCOPY   pricing_engine_input_tab_type,
5496         x_pricing_attribute_rows  IN OUT NOCOPY   pricing_attribute_tab_type,
5497         x_return_status           OUT NOCOPY     VARCHAR2 )
5498 IS
5499 
5500         i                                NUMBER:=0;
5501         j                                NUMBER:=0;
5502         l_container_working_weight       NUMBER:=0;
5503         l_container_working_volume       NUMBER:=0;
5504         l_instance_index                 NUMBER:= p_instance_count;
5505         l_input_index                    NUMBER:= x_pricing_engine_rows.COUNT;
5506         l_input_engine_row_count         NUMBER;
5507         l_attribute_index                NUMBER:= x_pricing_attribute_rows.COUNT;
5508         l_hash_string                    VARCHAR2(50);
5509         l_hash_value                     NUMBER;
5510         l_category_rows                  quantity_tab_type;
5511         l_basis_rows                     quantity_tab_type;
5512         l_basis_categ_tab                basis_categ_tab_type;
5513         l_container_flag                 VARCHAR2(1) := 'Y';
5514 
5515     l_log_level     NUMBER := FTE_FREIGHT_PRICING_UTIL.G_DBG;
5516 
5517 BEGIN
5518    x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
5519    FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
5520    FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,'create_new_instance','start');
5521    l_instance_index := l_instance_index + 1;
5522 
5523    l_input_engine_row_count := l_input_index;
5524    i := p_rolled_up_lines.FIRST;
5525    LOOP
5526    -- {
5527 
5528     IF p_aggregation = 'WITHIN' THEN
5529          --OR p_rolled_up_lines(i).rate_basis = G_CONTAINER_BASIS THEN
5530     -- {
5531 
5532    -- Group p_rolled_up_lines by category
5533    -- Sum up quantities for lines within each group (For CONTAINER basis do not sum up the line quantities)
5534    -- Prepare one engine row for each group
5535 
5536       IF NOT l_category_rows.EXISTS(p_rolled_up_lines(i).category_id) THEN
5537       -- {
5538 
5539          l_category_rows(p_rolled_up_lines(i).category_id).uom := p_rolled_up_lines(i).line_uom;
5540          l_category_rows(p_rolled_up_lines(i).category_id).quantity := p_rolled_up_lines(i).line_quantity;
5541          l_input_index := l_input_index + 1;
5542          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Creating engine row : '||l_input_index);
5543          x_pricing_engine_rows(l_input_index).input_index := l_input_index;
5544          x_pricing_engine_rows(l_input_index).instance_index := l_instance_index;
5545          x_pricing_engine_rows(l_input_index).category_id := p_rolled_up_lines(i).category_id;
5546          --x_pricing_engine_rows(l_input_index).basis := p_rolled_up_lines(i).rate_basis;  -- No basis for WITHIN
5547          x_pricing_engine_rows(l_input_index).basis := p_rolled_up_lines(i).rate_basis;  -- No basis for WITHIN
5548          x_pricing_engine_rows(l_input_index).line_quantity := p_rolled_up_lines(i).line_quantity;
5549          x_pricing_engine_rows(l_input_index).line_uom := p_rolled_up_lines(i).line_uom;
5550 
5551          IF p_rolled_up_lines(i).rate_basis = G_CONTAINER_BASIS THEN
5552          -- {
5553               l_attribute_index := l_attribute_index + 1;
5554               x_pricing_attribute_rows(l_attribute_index).attribute_index := l_attribute_index;
5555               x_pricing_attribute_rows(l_attribute_index).input_index     := l_input_index;
5556               x_pricing_attribute_rows(l_attribute_index).attribute_name  := 'CONTAINER_TYPE';
5557               x_pricing_attribute_rows(l_attribute_index).attribute_value := g_shipment_line_rows(p_toplevel_lines.content_id).container_type_code; --  Need to convert to VARCHAR2
5558 
5559          -- }
5560          END IF;
5561 
5562          l_attribute_index := l_attribute_index + 1;
5563          x_pricing_attribute_rows(l_attribute_index).attribute_index := l_attribute_index;
5564          x_pricing_attribute_rows(l_attribute_index).input_index     := l_input_index;
5565          x_pricing_attribute_rows(l_attribute_index).attribute_name  := 'CATEGORY_ID';
5566          x_pricing_attribute_rows(l_attribute_index).attribute_value := TO_CHAR(p_rolled_up_lines(i).category_id); --  Need to convert to VARCHAR2
5567 
5568       -- }
5569       ELSE
5570       -- {
5571          IF p_rolled_up_lines(i).rate_basis <> G_CONTAINER_BASIS THEN
5572           -- {
5573            IF p_rolled_up_lines(i).line_uom = l_category_rows(p_rolled_up_lines(i).category_id).uom THEN
5574             l_category_rows(p_rolled_up_lines(i).category_id).quantity :=
5575               l_category_rows(p_rolled_up_lines(i).category_id).quantity + p_rolled_up_lines(i).line_quantity;
5576            ELSE
5577             FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'Within - uom conversion');
5578             l_category_rows(p_rolled_up_lines(i).category_id).quantity :=
5579               l_category_rows(p_rolled_up_lines(i).category_id).quantity +
5580                                         WSH_WV_UTILS.convert_uom(p_rolled_up_lines(i).line_uom,
5581                                                      l_category_rows(p_rolled_up_lines(i).category_id).uom,
5582                                                      p_rolled_up_lines(i).line_quantity,
5583                                                      0);  -- Within same UOM class
5584            END IF;
5585          -- }
5586          END IF;
5587       -- }
5588       END IF;
5589 
5590     -- }
5591     ELSE -- p_aggregation = 'ACROSS'
5592     -- {
5593 
5594          FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'Across - creating hash');
5595          l_hash_string := CONCAT(TO_CHAR(p_rolled_up_lines(i).rate_basis),TO_CHAR(p_rolled_up_lines(i).category_id));
5596          l_hash_value := dbms_utility.get_hash_value(
5597                                   name => l_hash_string,
5598                                   base => g_hash_base,
5599                                   hash_size =>g_hash_size );
5600 
5601    -- Group p_rolled_up_lines by basis
5602    -- Sum up quantities for lines within each group
5603 
5604       IF NOT l_basis_rows.EXISTS(p_rolled_up_lines(i).rate_basis) THEN
5605       -- {
5606 
5607          l_basis_categ_tab(l_hash_value).basis := p_rolled_up_lines(i).rate_basis;
5608          l_basis_categ_tab(l_hash_value).category_id := p_rolled_up_lines(i).category_id;
5609 
5610          l_basis_rows(p_rolled_up_lines(i).rate_basis).uom := p_rolled_up_lines(i).line_uom;
5611          l_basis_rows(p_rolled_up_lines(i).rate_basis).quantity := p_rolled_up_lines(i).line_quantity;
5612          l_input_index := l_input_index + 1;
5613          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Creating engine row : '||l_input_index);
5614          x_pricing_engine_rows(l_input_index).input_index := l_input_index;
5615          x_pricing_engine_rows(l_input_index).instance_index := l_instance_index;
5616          x_pricing_engine_rows(l_input_index).category_id := p_rolled_up_lines(i).category_id;
5617 
5618          x_pricing_engine_rows(l_input_index).basis := p_rolled_up_lines(i).rate_basis;
5619          x_pricing_engine_rows(l_input_index).line_quantity := p_rolled_up_lines(i).line_quantity;
5620          x_pricing_engine_rows(l_input_index).line_uom := p_rolled_up_lines(i).line_uom;
5621 
5622          IF p_rolled_up_lines(i).rate_basis = G_CONTAINER_BASIS THEN
5623          -- {
5624               l_attribute_index := l_attribute_index + 1;
5625               x_pricing_attribute_rows(l_attribute_index).attribute_index := l_attribute_index;
5626               x_pricing_attribute_rows(l_attribute_index).input_index     := l_input_index;
5627               x_pricing_attribute_rows(l_attribute_index).attribute_name  := 'CONTAINER_TYPE';
5628               x_pricing_attribute_rows(l_attribute_index).attribute_value := g_shipment_line_rows(p_toplevel_lines.content_id).container_type_code; --  Need to convert to VARCHAR2
5629 
5630          -- }
5631          END IF;
5632 
5633          -- Would not put category id if pricing objective is null
5634          IF p_objective IS NOT NULL THEN
5635          -- {
5636 
5637          l_attribute_index := l_attribute_index + 1;
5638          x_pricing_attribute_rows(l_attribute_index).attribute_index := l_attribute_index;
5639          x_pricing_attribute_rows(l_attribute_index).input_index     := l_input_index;
5640          x_pricing_attribute_rows(l_attribute_index).attribute_name  := 'CATEGORY_ID';
5641          x_pricing_attribute_rows(l_attribute_index).attribute_value := TO_CHAR(p_rolled_up_lines(i).category_id);
5642 
5643          -- }
5644          END IF;
5645 
5646       -- }
5647       ELSE
5648       -- {
5649 
5650          IF NOT l_basis_categ_tab.EXISTS(l_hash_value) AND p_objective IS NOT NULL THEN
5651          -- {
5652             l_basis_categ_tab(l_hash_value).basis := p_rolled_up_lines(i).rate_basis;
5653             l_basis_categ_tab(l_hash_value).category_id := p_rolled_up_lines(i).category_id;
5654 
5655          -- Prepare as many engine row as many distinct categories within each group
5656          -- Need to sum up quantities within basis across categories
5657          -- Would not create new engine rows if pricing objective is null
5658 
5659             l_input_index := l_input_index + 1;
5660             FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Creating engine row : '||l_input_index);
5661             x_pricing_engine_rows(l_input_index).input_index := l_input_index;
5662             x_pricing_engine_rows(l_input_index).instance_index := l_instance_index;
5663             x_pricing_engine_rows(l_input_index).category_id := p_rolled_up_lines(i).category_id;
5664             x_pricing_engine_rows(l_input_index).basis := p_rolled_up_lines(i).rate_basis;
5665             x_pricing_engine_rows(l_input_index).line_quantity := p_rolled_up_lines(i).line_quantity;
5666             x_pricing_engine_rows(l_input_index).line_uom := p_rolled_up_lines(i).line_uom;
5667 
5668             IF p_rolled_up_lines(i).rate_basis = G_CONTAINER_BASIS THEN
5669             -- {
5670                  l_attribute_index := l_attribute_index + 1;
5671                  x_pricing_attribute_rows(l_attribute_index).attribute_index := l_attribute_index;
5672                  x_pricing_attribute_rows(l_attribute_index).input_index     := l_input_index;
5673                  x_pricing_attribute_rows(l_attribute_index).attribute_name  := 'CONTAINER_TYPE';
5674                  x_pricing_attribute_rows(l_attribute_index).attribute_value := g_shipment_line_rows(p_toplevel_lines.content_id).container_type_code; --  Need to convert to VARCHAR2
5675 
5676             -- }
5677             END IF;
5678 
5679             l_attribute_index := l_attribute_index + 1;
5680             x_pricing_attribute_rows(l_attribute_index).attribute_index := l_attribute_index;
5681             x_pricing_attribute_rows(l_attribute_index).input_index     := l_input_index;
5682             x_pricing_attribute_rows(l_attribute_index).attribute_name  := 'CATEGORY_ID';
5683             x_pricing_attribute_rows(l_attribute_index).attribute_value := TO_CHAR(p_rolled_up_lines(i).category_id);
5684 
5685          -- }
5686          END IF;
5687 
5688          IF p_rolled_up_lines(i).rate_basis <> G_CONTAINER_BASIS THEN
5689          -- {
5690            IF p_rolled_up_lines(i).line_uom = l_basis_rows(p_rolled_up_lines(i).rate_basis).uom THEN
5691             l_basis_rows(p_rolled_up_lines(i).rate_basis).quantity :=
5692               l_basis_rows(p_rolled_up_lines(i).rate_basis).quantity + p_rolled_up_lines(i).line_quantity;
5693            ELSE
5694             FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'Across - uom conversion');
5695             l_basis_rows(p_rolled_up_lines(i).rate_basis).quantity :=
5696               l_basis_rows(p_rolled_up_lines(i).rate_basis).quantity +
5697                                         WSH_WV_UTILS.convert_uom(p_rolled_up_lines(i).line_uom,
5698                                                      l_basis_rows(p_rolled_up_lines(i).rate_basis).uom,
5699                                                      p_rolled_up_lines(i).line_quantity,
5700                                                      0);  -- Within same UOM class
5701            END IF;
5702          -- }
5703          END IF;
5704       -- }
5705       END IF;
5706 
5707     -- }
5708     END IF;
5709 
5710     EXIT WHEN i = p_rolled_up_lines.LAST;
5711     i := p_rolled_up_lines.NEXT(i);
5712    -- }
5713    END LOOP;
5714 
5715    IF x_pricing_engine_rows.COUNT > l_input_engine_row_count THEN
5716    -- {
5717    j := l_input_engine_row_count + 1;
5718    LOOP
5719    -- {
5720       -- new code for loose items
5721       -- set the loose_item_id in the pricing_engine_row
5722       IF (p_toplevel_lines.container_flag = 'N') THEN
5723          -- x_pricing_engine_rows(j).loose_item_id := p_toplevel_lines.content_id;
5724          x_pricing_engine_rows(j).loose_item_flag := 'Y';
5725       END IF;
5726 
5727       IF x_pricing_engine_rows(j).basis <> G_CONTAINER_BASIS THEN  --  Might not have basis ?
5728        IF p_aggregation = 'WITHIN' THEN
5729          x_pricing_engine_rows(j).line_quantity := l_category_rows(x_pricing_engine_rows(j).category_id).quantity;
5730        ELSE
5731          x_pricing_engine_rows(j).line_quantity := l_basis_rows(x_pricing_engine_rows(j).basis).quantity;
5732        END IF;
5733       END IF;
5734 
5735       -- Do not populate basis in engine row if there exists only one basis for the top level line
5736       -- irrespective of pricing objective present or not
5737       -- No longer 04/30 ST
5738 
5739       IF l_basis_rows.COUNT = 1 AND p_aggregation = 'ACROSS' THEN
5740       -- {
5741 
5742          -- If there is no objective container gross weight/volume should replace sum (line weight/volume)
5743          -- Do not populate basis in engine row
5744          -- Affected - Parcel
5745          -- For now we are going to do this only for a grouping level = Container   03/15
5746          -- If there is a need we will do it for shipment level also
5747 
5748          IF p_objective IS NULL AND p_grouping_level = 'CONTAINER' THEN
5749             IF x_pricing_engine_rows(j).basis = G_WEIGHT_BASIS  THEN
5750 
5751                IF nvl(g_shipment_line_rows(p_toplevel_lines.content_id).gross_weight,0) <> 0 THEN
5752 
5753                -- uom conversion TODO ?
5754                 IF g_shipment_line_rows(p_toplevel_lines.content_id).weight_uom_code = x_pricing_engine_rows(j).line_uom THEN
5755 
5756                   IF p_toplevel_lines.weight_uom = x_pricing_engine_rows(j).line_uom THEN
5757 
5758                     l_container_working_weight := GREATEST(g_shipment_line_rows(p_toplevel_lines.content_id).gross_weight,x_pricing_engine_rows(j).line_quantity + p_toplevel_lines.gross_weight);
5759 
5760                   ELSE
5761 
5762                     l_container_working_weight := GREATEST(g_shipment_line_rows(p_toplevel_lines.content_id).gross_weight,x_pricing_engine_rows(j).line_quantity +
5763                             WSH_WV_UTILS.convert_uom(p_toplevel_lines.weight_uom,
5764                             x_pricing_engine_rows(j).line_uom,
5765                             p_toplevel_lines.gross_weight,
5766                             0) );  -- Within same UOM class
5767 
5768                   END IF;
5769 
5770                 ELSE
5771 
5772                   IF p_toplevel_lines.weight_uom = x_pricing_engine_rows(j).line_uom THEN
5773 
5774                     l_container_working_weight := GREATEST(
5775                             WSH_WV_UTILS.convert_uom(g_shipment_line_rows(p_toplevel_lines.content_id).weight_uom_code,
5776                             x_pricing_engine_rows(j).line_uom,
5777                             g_shipment_line_rows(p_toplevel_lines.content_id).gross_weight,
5778                             0),x_pricing_engine_rows(j).line_quantity + p_toplevel_lines.gross_weight);
5779 
5780 
5781                   ELSE
5782 
5783                     l_container_working_weight := GREATEST(
5784                             WSH_WV_UTILS.convert_uom(g_shipment_line_rows(p_toplevel_lines.content_id).weight_uom_code,
5785                             x_pricing_engine_rows(j).line_uom,
5786                             g_shipment_line_rows(p_toplevel_lines.content_id).gross_weight,
5787                             0),x_pricing_engine_rows(j).line_quantity +
5788                             WSH_WV_UTILS.convert_uom(p_toplevel_lines.weight_uom,
5789                             x_pricing_engine_rows(j).line_uom,
5790                             p_toplevel_lines.gross_weight,
5791                             0));  -- Within same UOM class
5792 
5793                   END IF;
5794 
5795                 END IF;
5796 
5797                 x_pricing_engine_rows(j).line_quantity := l_container_working_weight;
5798 
5799                ELSE
5800 
5801                 -- uom conversion TODO
5802                 IF p_toplevel_lines.weight_uom = x_pricing_engine_rows(j).line_uom THEN
5803                    x_pricing_engine_rows(j).line_quantity := x_pricing_engine_rows(j).line_quantity + p_toplevel_lines.gross_weight ;
5804                 ELSE
5805                    x_pricing_engine_rows(j).line_quantity := x_pricing_engine_rows(j).line_quantity +
5806                             WSH_WV_UTILS.convert_uom(p_toplevel_lines.weight_uom,
5807                             x_pricing_engine_rows(j).line_uom,
5808                             p_toplevel_lines.gross_weight,
5809                             0);  -- Within same UOM class
5810 
5811                 END IF;
5812                END IF;
5813 
5814             ELSIF x_pricing_engine_rows(j).basis = G_VOLUME_BASIS THEN
5815 
5816                IF nvl(g_shipment_line_rows(p_toplevel_lines.content_id).volume,0) <> 0 THEN
5817 
5818                -- uom conversion TODO ?
5819                 IF g_shipment_line_rows(p_toplevel_lines.content_id).volume_uom_code = x_pricing_engine_rows(j).line_uom THEN
5820 
5821                   l_container_working_volume := GREATEST(g_shipment_line_rows(p_toplevel_lines.content_id).volume,x_pricing_engine_rows(j).line_quantity);
5822 
5823                 ELSE
5824 
5825                   l_container_working_volume := GREATEST(
5826                             WSH_WV_UTILS.convert_uom(g_shipment_line_rows(p_toplevel_lines.content_id).volume_uom_code,
5827                             x_pricing_engine_rows(j).line_uom,
5828                             g_shipment_line_rows(p_toplevel_lines.content_id).volume,
5829                             0),x_pricing_engine_rows(j).line_quantity);
5830 
5831                 END IF;
5832 
5833                 x_pricing_engine_rows(j).line_quantity := l_container_working_volume;
5834 
5835                ELSE   --  For Volume basis we consider either container volume or if it is not there
5836                       --  sum of the rolled up lines' volume
5837                       --  Rolled up lines' volume can't be added to container's unit volume in this case
5838 
5839                 NULL;
5840 
5841                END IF;
5842             END IF;
5843             x_pricing_engine_rows(j).basis := NULL;
5844          END IF;
5845          --x_pricing_engine_rows(j).basis := NULL;
5846 
5847       -- }
5848       END IF;
5849       FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Created engine row '||j||' with quantity : '||x_pricing_engine_rows(j).line_quantity||x_pricing_engine_rows(j).line_uom);
5850 
5851       EXIT WHEN j = x_pricing_engine_rows.LAST;
5852     j := x_pricing_engine_rows.NEXT(j);
5853    -- }
5854    END LOOP;
5855    -- }
5856    ELSE
5857    -- {
5858       FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Could not create any engine row for Container : '||p_toplevel_lines.content_id);
5859       raise FTE_FREIGHT_PRICING_UTIL.g_no_enginerow_created;
5860    -- }
5861    END IF;
5862    FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'create_new_instance');
5863 
5864 EXCEPTION
5865    WHEN FTE_FREIGHT_PRICING_UTIL.g_no_enginerow_created THEN
5866         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
5867         FTE_FREIGHT_PRICING_UTIL.set_exception('create_new_instance',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_no_enginerow_created');
5868         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'create_new_instance');
5869    WHEN others THEN
5870         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
5871         FTE_FREIGHT_PRICING_UTIL.set_exception('create_new_instance',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
5872         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
5873         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'create_new_instance');
5874 END create_new_instance;
5875 
5876 --      This procedure should be called to add a pattern to a matched instance
5877 --      The calling procedure takes care of creating pattern_row and modifying dual_instance_row
5878 --      This procedure might need to create new engine rows and associated attribute rows
5879 --      for any new category in case of 'WITHIN' and for new basis and new category in existing basis
5880 --      in case of ACROSS
5881 --      It is called for a top level container for which a matching instance has already been found
5882 --      Can be called for both Single-commodity and multi-commodity (ie. for all patterns)
5883 
5884 PROCEDURE add_to_instance (
5885         p_container_flag          IN             VARCHAR2  DEFAULT 'Y', -- new for loose item
5886         p_rolled_up_lines         IN             rolledup_line_tab_type,
5887         p_matching_instance_index IN             NUMBER,
5888         p_aggregation             IN             VARCHAR2,
5889         p_objective               IN             VARCHAR2,
5890         x_pricing_engine_rows     IN OUT NOCOPY  pricing_engine_input_tab_type,
5891         x_pricing_attribute_rows  IN OUT NOCOPY  pricing_attribute_tab_type,
5892         x_return_status           OUT NOCOPY             VARCHAR2 )
5893 IS
5894         l_unmatched_categories   basis_categ_tab_type;
5895         l_unmatched_basis        quantity_tab_type;
5896         l_unmatched_bascateg     basis_categ_tab_type;
5897         l_unmatched_categ        quantity_basis_tab_type;
5898         l_basis_sum              quantity_tab_type;
5899         l_hash_string                    VARCHAR2(50);
5900         l_hash_value                     NUMBER;
5901         l_engine_categ           quantity_tab_type;
5902         l_engine_basis           quantity_tab_type;
5903         l_engine_bas_categ       basis_categ_tab_type;
5904         i                        NUMBER:=0;
5905         j                        NUMBER:=0;
5906         k                        NUMBER:=0;
5907         l                        NUMBER:=0;
5908         m                        NUMBER:=0;
5909         n                        NUMBER:=0;
5910         l_input_index            NUMBER;
5911         l_attribute_index        NUMBER;
5912 
5913         -- to fix bug 2739329
5914         l_consumed_rollup_det    wsh_util_core.id_tab_type;
5915 
5916     l_log_level     NUMBER := FTE_FREIGHT_PRICING_UTIL.G_DBG;
5917 
5918 BEGIN
5919 
5920    x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
5921    FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
5922    FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,'add_to_instance','start');
5923 
5924    FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,
5925                             'Parameters :');
5926    FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,
5927                             '    p_container_flag = '||p_container_flag);
5928    FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,
5929                             '    p_matching_instance_index = '||p_matching_instance_index);
5930    FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,
5931                             '    x_pricing_engine_rows.COUNT = '||x_pricing_engine_rows.COUNT);
5932    FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,
5933                             '    p_aggregation = '||p_aggregation);
5934 
5935    i := x_pricing_engine_rows.FIRST;
5936    LOOP
5937    -- {
5938         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG, '>>> 1 ');
5939 
5940     -- IF x_pricing_engine_rows(i).loose_item_id IS NULL THEN  --  Search/ADD only for containers
5941     -- IF (( p_container_flag = 'Y' AND x_pricing_engine_rows(i).loose_item_id IS NULL)
5942     --     OR (p_container_flag = 'N' AND x_pricing_engine_rows(i).loose_item_id IS NOT NULL)) THEN  --  Search/ADD only for containers, or only for loose items
5943     --IF (( p_container_flag = 'Y' AND x_pricing_engine_rows(i).loose_item_flag = 'N')
5944       --  OR (p_container_flag = 'N' AND x_pricing_engine_rows(i).loose_item_flag = 'Y' )) THEN  --  Search/ADD only for containers, or only for loose items
5945        -- don't mix loose items and containers
5946     -- {
5947       IF x_pricing_engine_rows(i).instance_index = p_matching_instance_index THEN
5948       -- {
5949          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Adding to instance index : '||p_matching_instance_index);
5950          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,
5951                               'x_pricing_engine_rows=> i = '||i);
5952          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,
5953                               'x_pricing_engine_rows=> category_id = '||x_pricing_engine_rows(i).category_id);
5954 
5955             IF p_aggregation = 'WITHIN' THEN
5956                   FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG, '>>> 2 ');
5957                -- To store unique list of category ids for matching engine rows
5958                IF NOT l_engine_categ.EXISTS(x_pricing_engine_rows(i).category_id) THEN
5959                   FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG, '>>> 3 ');
5960                   l_engine_categ(x_pricing_engine_rows(i).category_id).quantity := x_pricing_engine_rows(i).line_quantity;
5961                   l_engine_categ(x_pricing_engine_rows(i).category_id).uom := x_pricing_engine_rows(i).line_uom;
5962                END IF;
5963             ELSIF p_aggregation = 'ACROSS' THEN
5964 
5965                IF NOT l_engine_basis.EXISTS(x_pricing_engine_rows(i).basis) THEN
5966                   l_engine_basis(x_pricing_engine_rows(i).basis).quantity := x_pricing_engine_rows(i).line_quantity;
5967                   l_engine_basis(x_pricing_engine_rows(i).basis).uom := x_pricing_engine_rows(i).line_uom;
5968                END IF;
5969 
5970                -- Is it required for Pricing Objective = NULL
5971                FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'Across - creating hash');
5972                l_hash_string := CONCAT(TO_CHAR(x_pricing_engine_rows(i).basis),TO_CHAR(x_pricing_engine_rows(i).category_id));
5973                l_hash_value := dbms_utility.get_hash_value(
5974                                         name => l_hash_string,
5975                                         base => g_hash_base,
5976                                         hash_size =>g_hash_size );
5977 
5978                IF NOT l_engine_bas_categ.EXISTS(l_hash_value) THEN
5979                   l_engine_bas_categ(l_hash_value).basis := x_pricing_engine_rows(i).basis;
5980                   l_engine_bas_categ(l_hash_value).category_id := x_pricing_engine_rows(i).category_id;
5981                END IF;
5982             END IF;
5983 
5984          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG, '>>> 4 ');
5985 
5986          j := p_rolled_up_lines.FIRST;
5987          LOOP
5988          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG, '>>> 5 ');
5989          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,
5990                                            'p_rolled_up_lines=> j ='||j);
5991          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,
5992                                       'p_rolled_up_lines=> category_id ='||p_rolled_up_lines(j).category_id);
5993 
5994             IF p_aggregation = 'WITHIN' THEN
5995                --  Need to add quantities to the correct category
5996                FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG, '>>> 6 ');
5997 
5998                IF x_pricing_engine_rows(i).category_id = p_rolled_up_lines(j).category_id THEN
5999                   FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG, '>>> 7 ');
6000                   IF l_unmatched_categ.EXISTS(p_rolled_up_lines(j).category_id) THEN
6001                      l_unmatched_categ.DELETE(p_rolled_up_lines(j).category_id);
6002                   END IF;
6003                   IF p_rolled_up_lines(j).line_uom <> x_pricing_engine_rows(i).line_uom THEN
6004                      FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG, '>>> 8 ');
6005                      FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'Within matching category uom conversion');
6006 
6007                      x_pricing_engine_rows(i).line_quantity := x_pricing_engine_rows(i).line_quantity +
6008                                                      WSH_WV_UTILS.convert_uom(p_rolled_up_lines(j).line_uom,
6009                                                      x_pricing_engine_rows(i).line_uom,
6010                                                      p_rolled_up_lines(j).line_quantity,
6011                                                      0);  -- Within same UOM class
6012                   ELSE
6013                      FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG, '>>> 8 ');
6014                      x_pricing_engine_rows(i).line_quantity := x_pricing_engine_rows(i).line_quantity +
6015                                                                p_rolled_up_lines(j).line_quantity;
6016                   END IF;
6017                   FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,
6018                             'x_pricing_engine_rows=>line_quantity='||x_pricing_engine_rows(i).line_quantity);
6019                ELSE  --   Populate new categories table
6020                      FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG, '>>> 9 ');
6021                   --IF NOT l_unmatched_categ.EXISTS(p_rolled_up_lines(j).category_id) THEN
6022                   IF (NOT l_engine_categ.EXISTS(p_rolled_up_lines(j).category_id)) AND (NOT l_unmatched_categ.EXISTS(p_rolled_up_lines(j).category_id)) THEN
6023                      FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG, '>>> 10 ');
6024                      l_unmatched_categ(p_rolled_up_lines(j).category_id).basis := p_rolled_up_lines(j).rate_basis;
6025                      l_unmatched_categ(p_rolled_up_lines(j).category_id).quantity := p_rolled_up_lines(j).line_quantity;
6026                      l_unmatched_categ(p_rolled_up_lines(j).category_id).uom := p_rolled_up_lines(j).line_uom;
6027                      -- begin fix bug 2739329
6028                      -- everytime an entry is created in l_unmatched_categ, keep track of rollup lines
6029                      -- so that we don't sum the same delivery detail again and again
6030                      l_consumed_rollup_det(p_rolled_up_lines(j).delivery_detail_id) := p_rolled_up_lines(j).delivery_detail_id;
6031                      -- end fix
6032 
6033                   ELSE -- Sum up quantity within the new category
6034                      FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG, '>>> 11 ');
6035 
6036                    -- begin fix bug 2739329
6037                    IF (NOT l_consumed_rollup_det.EXISTS(p_rolled_up_lines(j).delivery_detail_id) ) THEN
6038                    -- end fix
6039                     IF l_unmatched_categ.EXISTS(p_rolled_up_lines(j).category_id) THEN
6040                      FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG, '>>> 12 ');
6041                      IF p_rolled_up_lines(j).line_uom <> l_unmatched_categ(p_rolled_up_lines(j).category_id).uom THEN
6042                         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG, '>>> 13 ');
6043                         FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'Within new category uom conversion');
6044 
6045                         l_unmatched_categ(p_rolled_up_lines(j).category_id).quantity :=
6046                                           l_unmatched_categ(p_rolled_up_lines(j).category_id).quantity +
6047                                           WSH_WV_UTILS.convert_uom(p_rolled_up_lines(j).line_uom,
6048                                           l_unmatched_categ(p_rolled_up_lines(j).category_id).uom,
6049                                           p_rolled_up_lines(j).line_quantity,
6050                                           0);  -- Within same UOM class
6051                      ELSE
6052                         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG, '>>> 13 ');
6053                         l_unmatched_categ(p_rolled_up_lines(j).category_id).quantity :=
6054                                           l_unmatched_categ(p_rolled_up_lines(j).category_id).quantity +
6055                                           p_rolled_up_lines(j).line_quantity;
6056                      END IF;
6057 
6058                     END IF;
6059                    -- begin fix bug 2739329
6060                    END IF;
6061                    -- end fix
6062 
6063                   END IF;
6064                END IF;
6065             ELSE -- p_aggregation = 'ACROSS'
6066                  -- Add quantities within same basis
6067                  -- If there is no pricing objective send only one line per basis
6068                    FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG, '>>> 14 ');
6069 
6070          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Engine row category : '||x_pricing_engine_rows(i).category_id);
6071          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'rolledup line category : '||p_rolled_up_lines(j).category_id);
6072          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Engine row basis : '||x_pricing_engine_rows(i).basis);
6073          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'rolledup line basis : '||p_rolled_up_lines(j).rate_basis);
6074 
6075                l_hash_string := CONCAT(TO_CHAR(p_rolled_up_lines(j).rate_basis),TO_CHAR(p_rolled_up_lines(j).category_id));
6076                l_hash_value := dbms_utility.get_hash_value(
6077                                         name => l_hash_string,
6078                                         base => g_hash_base,
6079                                         hash_size =>g_hash_size );
6080 
6081                IF x_pricing_engine_rows(i).basis = p_rolled_up_lines(j).rate_basis THEN
6082                -- Problem if there is NULL basis in engine row
6083 
6084                  IF l_unmatched_basis.EXISTS(p_rolled_up_lines(j).rate_basis) THEN
6085                      l_unmatched_basis.DELETE(p_rolled_up_lines(j).rate_basis);
6086                  END IF;
6087 
6088                  -- Might need to create new engine rows if new categories (within the same basis) come up
6089                  -- Only if pricing objective is not null
6090 
6091                  IF x_pricing_engine_rows(i).category_id IS NOT NULL THEN
6092                   IF x_pricing_engine_rows(i).category_id <> p_rolled_up_lines(j).category_id AND
6093                      p_objective IS NOT NULL THEN
6094 
6095                      --IF NOT l_unmatched_categories.EXISTS(p_rolled_up_lines(j).category_id) THEN
6096                      IF (NOT l_engine_bas_categ.EXISTS(l_hash_value)) AND (NOT l_unmatched_categories.EXISTS(p_rolled_up_lines(j).category_id)) THEN
6097 
6098          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Adding unmatched category : '||p_rolled_up_lines(j).category_id);
6099 
6100                         l_unmatched_categories(p_rolled_up_lines(j).category_id).category_id := p_rolled_up_lines(j).category_id;
6101                         l_unmatched_categories(p_rolled_up_lines(j).category_id).basis := x_pricing_engine_rows(i).basis;
6102                      END IF;
6103                   ELSE
6104                      IF l_unmatched_categories.EXISTS(p_rolled_up_lines(j).category_id) THEN
6105          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Deleting from unmatched category : '||p_rolled_up_lines(j).category_id);
6106                         l_unmatched_categories.DELETE(p_rolled_up_lines(j).category_id);
6107                      END IF;
6108                   END IF;
6109                  END IF;
6110 
6111                  IF p_rolled_up_lines(j).line_uom <> x_pricing_engine_rows(i).line_uom THEN
6112                      FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'Within matching basis uom conversion');
6113 
6114                      x_pricing_engine_rows(i).line_quantity := x_pricing_engine_rows(i).line_quantity +
6115                                                      WSH_WV_UTILS.convert_uom(p_rolled_up_lines(j).line_uom,
6116                                                      x_pricing_engine_rows(i).line_uom,
6117                                                      p_rolled_up_lines(j).line_quantity,
6118                                                      0);  -- Within same UOM class
6119                  ELSE
6120                      x_pricing_engine_rows(i).line_quantity := x_pricing_engine_rows(i).line_quantity +
6121                                                                p_rolled_up_lines(j).line_quantity;
6122                  END IF;
6123                ELSE  --   Populate new basis table
6124 
6125                   --IF NOT l_unmatched_basis.EXISTS(p_rolled_up_lines(j).rate_basis) THEN
6126                   IF (NOT l_engine_basis.EXISTS(p_rolled_up_lines(j).rate_basis)) AND (NOT l_unmatched_basis.EXISTS(p_rolled_up_lines(j).rate_basis)) THEN
6127 
6128                     IF l_unmatched_basis.EXISTS(p_rolled_up_lines(j).rate_basis) THEN
6129                      l_unmatched_basis(p_rolled_up_lines(j).rate_basis).quantity := p_rolled_up_lines(j).line_quantity;
6130                      l_unmatched_basis(p_rolled_up_lines(j).rate_basis).uom := p_rolled_up_lines(j).line_uom;
6131                     END IF;
6132                   ELSE -- Sum up quantity within the new basis
6133                   -- Might need to create new engine rows if new categories (within this new basis) come up
6134                   -- Only if pricing objective is not null
6135 
6136                     IF l_unmatched_basis.EXISTS(p_rolled_up_lines(j).rate_basis) THEN
6137                      --IF NOT l_unmatched_bascateg.EXISTS(p_rolled_up_lines(j).category_id) AND
6138                      IF NOT l_unmatched_bascateg.EXISTS(l_hash_value) AND
6139                         p_objective IS NOT NULL THEN
6140                         -- It could have been okay to index the following on category_id as well
6141                         -- because more than one different bases can never
6142                         -- have any common categories
6143                         -- We are using l_hash_value to index to be on the safer side
6144 
6145                         l_unmatched_bascateg(l_hash_value).category_id := p_rolled_up_lines(j).category_id;
6146                         l_unmatched_bascateg(l_hash_value).basis := p_rolled_up_lines(j).rate_basis;
6147                      END IF;
6148 
6149                      IF p_rolled_up_lines(j).line_uom <> l_unmatched_basis(p_rolled_up_lines(j).rate_basis).uom THEN
6150                         FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'Within new basis uom conversion');
6151 
6152                         l_unmatched_basis(p_rolled_up_lines(j).rate_basis).quantity :=
6153                                           l_unmatched_basis(p_rolled_up_lines(j).rate_basis).quantity +
6154                                           WSH_WV_UTILS.convert_uom(p_rolled_up_lines(j).line_uom,
6155                                           l_unmatched_basis(p_rolled_up_lines(j).rate_basis).uom,
6156                                           p_rolled_up_lines(j).line_quantity,
6157                                           0);  -- Within same UOM class
6158                      ELSE
6159                         l_unmatched_basis(p_rolled_up_lines(j).rate_basis).quantity :=
6160                                           l_unmatched_basis(p_rolled_up_lines(j).rate_basis).quantity +
6161                                           p_rolled_up_lines(j).line_quantity;
6162                      END IF;
6163                     END IF;
6164                   END IF;
6165                END IF;
6166 
6167             END IF;
6168             FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG, '>>> 15 ');
6169 
6170             EXIT WHEN j = p_rolled_up_lines.LAST;
6171             j := p_rolled_up_lines.NEXT(j);
6172          END LOOP;
6173          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG, '>>> 16 ');
6174 
6175          -- ACROSS : Handling new categories within existing basis
6176          IF l_unmatched_categories.COUNT > 0 AND NOT l_basis_sum.EXISTS(x_pricing_engine_rows(i).basis) THEN
6177             l_basis_sum(x_pricing_engine_rows(i).basis).quantity := x_pricing_engine_rows(i).line_quantity;
6178             l_basis_sum(x_pricing_engine_rows(i).basis).uom := x_pricing_engine_rows(i).line_uom;
6179          END IF;
6180 
6181       -- }
6182       END IF;
6183     -- }
6184     --END IF;
6185 
6186     EXIT WHEN i = x_pricing_engine_rows.LAST;
6187     i := x_pricing_engine_rows.NEXT(i);
6188    -- }
6189    END LOOP;
6190 
6191    FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG, '>>> 17 ');
6192    -- ACROSS : Handling new categories within existing basis
6193    IF l_unmatched_categories.COUNT > 0 AND p_aggregation = 'ACROSS' THEN
6194       k := l_unmatched_categories.FIRST;
6195       LOOP
6196 
6197          l_input_index := x_pricing_engine_rows.COUNT + 1;
6198          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Creating engine row : '||l_input_index||' with category id : '||l_unmatched_categories(k).category_id);
6199          x_pricing_engine_rows(l_input_index).input_index := l_input_index;
6200          x_pricing_engine_rows(l_input_index).instance_index := p_matching_instance_index;
6201          x_pricing_engine_rows(l_input_index).category_id := l_unmatched_categories(k).category_id;
6202          x_pricing_engine_rows(l_input_index).basis := l_unmatched_categories(k).basis;
6203          x_pricing_engine_rows(l_input_index).line_quantity := l_basis_sum(l_unmatched_categories(k).basis).quantity;
6204          x_pricing_engine_rows(l_input_index).line_uom := l_basis_sum(l_unmatched_categories(k).basis).uom;
6205          -- new code for loose items
6206          IF (p_container_flag = 'N') THEN
6207             x_pricing_engine_rows(l_input_index).loose_item_flag := 'Y';
6208          END IF;
6209 
6210          l_attribute_index := x_pricing_attribute_rows.COUNT + 1;
6211          x_pricing_attribute_rows(l_attribute_index).attribute_index := l_attribute_index;
6212          x_pricing_attribute_rows(l_attribute_index).input_index     := l_input_index;
6213          x_pricing_attribute_rows(l_attribute_index).attribute_name  := 'CATEGORY_ID';
6214          x_pricing_attribute_rows(l_attribute_index).attribute_value := TO_CHAR(l_unmatched_categories(k).category_id);
6215 
6216 
6217          EXIT WHEN k = l_unmatched_categories.LAST;
6218          k := l_unmatched_categories.NEXT(k);
6219       END LOOP;
6220    END IF;
6221 
6222    FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG, '>>> 18 ');
6223    -- WITHIN : Handling new categories
6224    IF l_unmatched_categ.COUNT > 0 AND p_aggregation = 'WITHIN' THEN
6225       FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG, '>>> 19 ');
6226       l := l_unmatched_categ.FIRST;
6227       LOOP
6228 
6229          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG, '>>> 20 ');
6230          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,
6231                                             'l_unmatched_categ => l=category_id='||l);
6232          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,
6233                                             'l_unmatched_categ=>quantity='||l_unmatched_categ(l).quantity);
6234          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,
6235                                             'l_unmatched_categ=>uom='||l_unmatched_categ(l).uom);
6236          l_input_index := x_pricing_engine_rows.COUNT + 1;
6237          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Creating engine row : '||l_input_index);
6238          x_pricing_engine_rows(l_input_index).input_index := l_input_index;
6239          x_pricing_engine_rows(l_input_index).instance_index := p_matching_instance_index;
6240          x_pricing_engine_rows(l_input_index).category_id := l;
6241          --x_pricing_engine_rows(l_input_index).basis := l_unmatched_categories(k).basis;
6242          -- Need to put the correct category id
6243          -- l_unmatched_categ rectype needs to include basis also
6244          x_pricing_engine_rows(l_input_index).basis := l_unmatched_categ(l).basis;
6245          x_pricing_engine_rows(l_input_index).line_quantity := l_unmatched_categ(l).quantity;
6246          x_pricing_engine_rows(l_input_index).line_uom := l_unmatched_categ(l).uom;
6247          -- new code for loose items
6248          IF (p_container_flag = 'N') THEN
6249             x_pricing_engine_rows(l_input_index).loose_item_flag := 'Y';
6250          END IF;
6251          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG, '>>> 21 ');
6252 
6253          l_attribute_index := x_pricing_attribute_rows.COUNT + 1;
6254          x_pricing_attribute_rows(l_attribute_index).attribute_index := l_attribute_index;
6255          x_pricing_attribute_rows(l_attribute_index).input_index     := l_input_index;
6256          x_pricing_attribute_rows(l_attribute_index).attribute_name  := 'CATEGORY_ID';
6257          x_pricing_attribute_rows(l_attribute_index).attribute_value := TO_CHAR(l);
6258 
6259 
6260          EXIT WHEN l = l_unmatched_categ.LAST;
6261          l := l_unmatched_categ.NEXT(l);
6262       END LOOP;
6263    END IF;
6264    FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG, '>>> 22 ');
6265 
6266    -- ACROSS : Handling new basis
6267    IF l_unmatched_basis.COUNT > 0 AND p_aggregation = 'ACROSS' THEN
6268       m := l_unmatched_basis.FIRST;
6269       LOOP
6270 
6271        IF l_unmatched_bascateg.COUNT > 0 THEN
6272       -- ACROSS : Handling individual categories in the new basis
6273          n := l_unmatched_bascateg.FIRST;
6274          LOOP
6275 
6276             l_input_index := x_pricing_engine_rows.COUNT + 1;
6277             FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Creating engine row : '||l_input_index||' with basis : '||m);
6278             x_pricing_engine_rows(l_input_index).input_index := l_input_index;
6279             x_pricing_engine_rows(l_input_index).instance_index := p_matching_instance_index;
6280             --x_pricing_engine_rows(l_input_index).category_id := n;
6281             x_pricing_engine_rows(l_input_index).category_id := l_unmatched_bascateg(n).category_id;
6282             x_pricing_engine_rows(l_input_index).basis := m;
6283             x_pricing_engine_rows(l_input_index).line_quantity := l_unmatched_basis(m).quantity;
6284             x_pricing_engine_rows(l_input_index).line_uom := l_unmatched_basis(m).uom;
6285             -- new code for loose items
6286             IF (p_container_flag = 'N') THEN
6287                x_pricing_engine_rows(l_input_index).loose_item_flag := 'Y';
6288             END IF;
6289 
6290             l_attribute_index := x_pricing_attribute_rows.COUNT + 1;
6291             x_pricing_attribute_rows(l_attribute_index).attribute_index := l_attribute_index;
6292             x_pricing_attribute_rows(l_attribute_index).input_index     := l_input_index;
6293             x_pricing_attribute_rows(l_attribute_index).attribute_name  := 'CATEGORY_ID';
6294             --x_pricing_attribute_rows(l_attribute_index).attribute_value := TO_CHAR(n);
6295             x_pricing_attribute_rows(l_attribute_index).attribute_value := TO_CHAR(l_unmatched_bascateg(n).category_id);
6296 
6297             EXIT WHEN n = l_unmatched_bascateg.LAST;
6298             n := l_unmatched_bascateg.NEXT(n);
6299          END LOOP;
6300        ELSE
6301             l_input_index := x_pricing_engine_rows.COUNT + 1;
6302             FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Creating engine row : '||l_input_index);
6303             x_pricing_engine_rows(l_input_index).input_index := l_input_index;
6304             x_pricing_engine_rows(l_input_index).instance_index := p_matching_instance_index;
6305             x_pricing_engine_rows(l_input_index).basis := m;
6306             x_pricing_engine_rows(l_input_index).line_quantity := l_unmatched_basis(m).quantity;
6307             x_pricing_engine_rows(l_input_index).line_uom := l_unmatched_basis(m).uom;
6308             -- new code for loose items
6309             IF (p_container_flag = 'N') THEN
6310                x_pricing_engine_rows(l_input_index).loose_item_flag := 'Y';
6311             END IF;
6312 
6313        END IF;
6314 
6315        /*
6316        IF l_unmatched_basis.COUNT = 1 THEN
6317             x_pricing_engine_rows(l_input_index).basis := NULL;
6318        END IF;
6319        */
6320 
6321        EXIT WHEN m = l_unmatched_basis.LAST;
6322        m := l_unmatched_basis.NEXT(m);
6323       END LOOP;
6324    END IF;
6325    FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'add_to_instance');
6326 
6327 EXCEPTION
6328    WHEN others THEN
6329         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
6330         FTE_FREIGHT_PRICING_UTIL.set_exception('add_to_instance',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
6331         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
6332         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'add_to_instance');
6333 END add_to_instance;
6334 
6335 --      This procedure looks up the delivery lines in each of the input content rows and
6336 --      based on the commodity/freight class and pricing basis determines pattern for each
6337 --      It then acknowledges all the patterns and looks up pricing dual from the preferences
6338 --      table for each of them. It consolidates dual instances if possible and formulates input lines
6339 --      For mixed commodity patterns considers pricing objective
6340 --      Looks up delivery detail isnfo from g_shipment_line_rows
6341 
6342 PROCEDURE process_shipment_pattern (
6343         p_classification_code     IN     VARCHAR2,       --  Is this right datatype ?
6344         p_lane_basis              IN     VARCHAR2,
6345         p_lane_id                 IN     NUMBER,
6346         p_carrier_id              IN     NUMBER,
6347         p_service_code            IN     VARCHAR2,
6348         p_shpmnt_toplevel_rows    IN OUT NOCOPY  shpmnt_content_tab_type,
6349         p_shpmnt_toplevel_charges IN     addl_services_tab_type, -- Top level requested additional services
6350         x_pricing_dual_instances  OUT NOCOPY     pricing_dual_instance_tab_type,
6351         x_pricing_engine_rows     OUT NOCOPY     pricing_engine_input_tab_type,
6352         x_pattern_rows            OUT NOCOPY     top_level_pattern_tab_type,
6353         x_pricing_attribute_rows  OUT NOCOPY     pricing_attribute_tab_type,  --  Probably not required/required for line level attributes like category/hazard/container_type ?
6354         x_return_status           OUT NOCOPY     VARCHAR2 )
6355 IS
6356 
6357         i                     NUMBER:=0;
6358         j                     NUMBER:=0;
6359         k                     NUMBER:=0;
6360         l                     NUMBER:=0;
6361         m                     NUMBER:=0;
6362         l_prev_categ          NUMBER:=NULL;
6363         l_prev_basis          NUMBER:=NULL;
6364         l_num_basis           NUMBER:=NULL;
6365         l_basis               VARCHAR2(30):=NULL;
6366         l_wt_basis_count      NUMBER:=0;
6367         l_vol_basis_count     NUMBER:=0;
6368         l_cont_basis_count    NUMBER:=0;
6369         l_pattern_no          NUMBER:=0;
6370         l_pattern_name        VARCHAR2(30);
6371         l_services_hash       VARCHAR2(100):=NULL;
6372         l_lane_function       VARCHAR2(30);
6373         l_grouping_level      VARCHAR2(30);
6374         l_aggregation         VARCHAR2(30);
6375         l_pricing_objective   VARCHAR2(30);
6376         l_mixed_categ         VARCHAR2(1):='N';
6377         l_mixed_basis         VARCHAR2(1):='N';
6378         l_return_status       VARCHAR2(1);
6379         l_pattern_index       NUMBER:=0;
6380         l_count_pattern       NUMBER:=0;
6381         l_instance_count      NUMBER:=0;
6382         l_input_index         NUMBER:=0;
6383         l_attribute_index     NUMBER:=0;
6384         l_category_id         NUMBER:=0;
6385         l_instance_index      NUMBER:=0;
6386         l_matched_instance_index         NUMBER:=0;
6387         l_curr_engine_row_count          NUMBER:=0;
6388         l_curr_attribute_count           NUMBER:=0;
6389         l_rolledup_lines                 rolledup_line_tab_type;
6390         l_rolledup_category_rows         WSH_UTIL_CORE.id_tab_type;
6391         l_rolledup_category_basis        WSH_UTIL_CORE.id_tab_type;
6392 
6393         l_rolledup_rec              rolledup_line_rec_type;
6394 
6395     l_log_level     NUMBER := FTE_FREIGHT_PRICING_UTIL.G_INF;
6396 
6397 BEGIN
6398  -- {
6399 
6400    x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
6401    FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
6402    FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,'process_shipment_pattern','start');
6403 
6404   FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,'Inside process_shipment_pattern .Before initialization');
6405 
6406 
6407 
6408 
6409    FTE_FREIGHT_PRICING_SPECIAL.initialize(
6410                    p_lane_id         => p_lane_id,
6411                    x_lane_function   => l_lane_function,
6412                    x_return_status   => l_return_status);
6413 
6414    IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
6415       IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
6416          raise FTE_FREIGHT_PRICING_UTIL.g_initialize_failed;
6417       END IF;
6418    ELSE -- What happens if there is an empty container ?
6419       FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,'Parameters and Rules for lane : '||p_lane_id||' has been looked up');
6420       FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,'Lane Function : '||l_lane_function);
6421    END IF;
6422 
6423    g_rolledup_lines.DELETE;
6424    i := p_shpmnt_toplevel_rows.FIRST;  -- Catch empty delivery exception
6425    LOOP
6426    -- {
6427       l_wt_basis_count := 0 ;
6428       l_vol_basis_count := 0 ;
6429       l_cont_basis_count := 0 ;
6430       l_prev_categ := 0;
6431       l_prev_basis := 0;
6432       l_matched_instance_index := 0;
6433       l_mixed_categ := 'N';
6434       l_mixed_basis := 'N';
6435       l_grouping_level := NULL;
6436       l_aggregation := NULL;
6437       l_pricing_objective := NULL;
6438       l_services_hash := NULL;
6439 
6440       l_rolledup_category_rows.DELETE;
6441       l_rolledup_category_basis.DELETE;
6442 
6443       l_curr_engine_row_count := x_pricing_engine_rows.COUNT;
6444       l_curr_attribute_count  := x_pricing_attribute_rows.COUNT;
6445 
6446       IF ((p_shpmnt_toplevel_rows(i).container_flag = 'Y') OR (p_shpmnt_toplevel_rows(i).container_flag = 'C')) THEN
6447       -- {
6448          l_rolledup_lines.DELETE;
6449 
6450          rollup_container_hierarchy(
6451                 p_container_id         =>  p_shpmnt_toplevel_rows(i).content_id,
6452                 p_classification_code  =>  p_classification_code,
6453                 p_lane_basis           =>  p_lane_basis,
6454                 p_lane_id              =>  p_lane_id,
6455                 x_rolledup_lines       =>  l_rolledup_lines,
6456                 x_return_status        =>  l_return_status);
6457 
6458                 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
6459                         IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
6460                            FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'Container '||p_shpmnt_toplevel_rows(i).content_id);
6461                            raise FTE_FREIGHT_PRICING_UTIL.g_rollup_container_failed;
6462                         END IF;
6463                 ELSE -- What happens if there is an empty container ?
6464                         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,'Container '||p_shpmnt_toplevel_rows(i).content_id||' has '||l_rolledup_lines.COUNT||' rolled up lines');
6465                 END IF;
6466 
6467          IF l_rolledup_lines.COUNT = 0 THEN
6468             goto nextpass;
6469          END IF;
6470 
6471          j := l_rolledup_lines.FIRST;
6472          LOOP
6473          -- {
6474            l_rolledup_lines(j).master_container_id := p_shpmnt_toplevel_rows(i).content_id;
6475            g_rolledup_lines(j).master_container_id := p_shpmnt_toplevel_rows(i).content_id;
6476 
6477            IF nvl(l_rolledup_lines(j).line_quantity,0) = 0 THEN
6478 
6479               FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,' Rolled up line : '||j||' has line quantity = 0');
6480               raise FTE_FREIGHT_PRICING_UTIL.g_invalid_line_quantity;
6481 
6482            END IF;
6483 
6484            IF l_rolledup_lines(j).rate_basis = G_WEIGHT_BASIS THEN
6485               l_wt_basis_count := l_wt_basis_count + 1;
6486            ELSIF l_rolledup_lines(j).rate_basis = G_VOLUME_BASIS THEN
6487               l_vol_basis_count := l_vol_basis_count + 1;
6488            ELSIF l_rolledup_lines(j).rate_basis = G_CONTAINER_BASIS THEN
6489               l_cont_basis_count := l_cont_basis_count + 1;
6490            END IF;
6491 
6492 
6493            IF j <> l_rolledup_lines.FIRST THEN
6494            -- {
6495 
6496             IF l_rolledup_lines(j).category_id <> l_prev_categ THEN
6497               l_mixed_categ := 'Y';
6498               l_prev_categ := l_rolledup_lines(j).category_id;
6499               IF NOT l_rolledup_category_rows.EXISTS(l_rolledup_lines(j).category_id) THEN
6500                  l_rolledup_category_rows(l_rolledup_lines(j).category_id) := l_rolledup_lines(j).category_id;
6501               END IF;
6502               -- To be used for searching instances
6503             END IF;
6504 
6505             IF l_rolledup_lines(j).rate_basis <> l_prev_basis THEN
6506               l_mixed_basis := 'Y';
6507               l_prev_basis := l_rolledup_lines(j).rate_basis;
6508               IF NOT l_rolledup_category_basis.EXISTS(l_rolledup_lines(j).rate_basis) THEN
6509                  l_rolledup_category_basis(l_rolledup_lines(j).rate_basis) := l_rolledup_lines(j).rate_basis;
6510               END IF;
6511             END IF;
6512 
6513             -- }
6514            ELSE  --  First pass
6515            -- {
6516 
6517             l_rolledup_category_rows(l_rolledup_lines(j).category_id) := l_rolledup_lines(j).category_id;
6518             l_rolledup_category_basis(l_rolledup_lines(j).rate_basis) := l_rolledup_lines(j).rate_basis;
6519             l_prev_categ := l_rolledup_lines(j).category_id;
6520             l_prev_basis := l_rolledup_lines(j).rate_basis;
6521 
6522            -- }
6523            END IF;
6524 
6525 
6526            EXIT WHEN j = l_rolledup_lines.LAST;
6527            j := l_rolledup_lines.NEXT(j);
6528 
6529          -- }
6530          END LOOP;
6531 
6532          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Before Applying Dimensional Weight');
6533 
6534          --  Apply dimensional weight to the applicable l_rolledup_lines here per top level container
6535 
6536          FTE_FREIGHT_PRICING_SPECIAL.apply_dimensional_weight (
6537             p_lane_id              =>    p_lane_id,
6538             p_carrier_id           =>    p_carrier_id,
6539             p_service_code         =>    p_service_code,
6540             p_top_level_rec        =>    p_shpmnt_toplevel_rows(i),
6541             p_rolledup_rows        =>    l_rolledup_lines,
6542             x_return_status        =>    l_return_status );
6543 
6544          IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
6545             IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
6546                raise FTE_FREIGHT_PRICING_UTIL.g_dimensional_weight_failed;
6547             END IF;
6548          END IF;
6549 
6550          --  Process l_rolledup_lines here per top level container
6551          --  Identify the package pattern
6552          --  Determine value of l_pattern_name conforming to fte_prc_parameter_defaults.PARAMETER_SUB_TYPE
6553          --  looking at l_mixed_categ, l_mixed_basis,l_wt_basis_count,l_cont_basis_count,l_vol_basis_count
6554 
6555          IF l_mixed_categ = 'N' THEN   --  Single commodity will have l_mixed_basis = 'N'
6556             IF l_cont_basis_count > 0 THEN
6557                l_pattern_no := G_PATTERN_1;
6558                l_pattern_name := G_PATTERN_1_NAME;
6559             ELSIF l_wt_basis_count > 0 THEN
6560                l_pattern_no := G_PATTERN_2;
6561                l_pattern_name := G_PATTERN_2_NAME;
6562             ELSIF l_vol_basis_count > 0 THEN
6563                l_pattern_no := G_PATTERN_3;
6564                l_pattern_name := G_PATTERN_3_NAME;
6565             END IF;
6566          ELSE    --  Mixed commodity
6567             IF l_mixed_basis = 'N' THEN    --  Same basis
6568                 IF l_cont_basis_count > 0 THEN
6569                    l_pattern_no := G_PATTERN_4;
6570                    l_pattern_name := G_PATTERN_4_NAME;
6571                 ELSIF l_wt_basis_count > 0 THEN
6572                    l_pattern_no := G_PATTERN_5;
6573                    l_pattern_name := G_PATTERN_5_NAME;
6574                 ELSIF l_vol_basis_count > 0 THEN
6575                    l_pattern_no := G_PATTERN_6;
6576                    l_pattern_name := G_PATTERN_6_NAME;
6577                 END IF;
6578             ELSE                           --  Mixed basis
6579                 IF l_cont_basis_count > 0 THEN
6580                    l_pattern_no := G_PATTERN_7;
6581                    l_pattern_name := G_PATTERN_7_NAME;
6582                 ELSE
6583                    l_pattern_no := G_PATTERN_8;
6584                    l_pattern_name := G_PATTERN_8_NAME;
6585                 END IF;
6586             END IF;
6587          END IF;
6588 
6589          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Done identifying pattern');
6590          --  How do you identify Parcel  here ?  Not required to identify
6591 
6592          --  Look up FTE pricing preferences table to find out the pricing dual for that pattern
6593 
6594          l_grouping_level := FTE_FREIGHT_PRICING_SPECIAL.g_lane_rules_tab(l_pattern_no).grouping_level;
6595          l_aggregation := FTE_FREIGHT_PRICING_SPECIAL.g_lane_rules_tab(l_pattern_no).commodity_aggregation;
6596          l_pricing_objective := FTE_FREIGHT_PRICING_SPECIAL.g_lane_rules_tab(l_pattern_no).pricing_objective;
6597 
6598          -- What happens if grouping level or/and commodity_aggregation is null Exception ?
6599 
6600          --   Need to create services_hash here
6601          --   The freight_cost_type_id s come as an ordered list of integers
6602          --   which can be concatenated to be used for across pattern comparison purpose
6603 
6604          IF p_shpmnt_toplevel_charges.COUNT > 0 THEN
6605          -- {
6606          k := p_shpmnt_toplevel_charges.FIRST;
6607 
6608          LOOP
6609          -- {
6610             IF p_shpmnt_toplevel_charges(k).content_id = p_shpmnt_toplevel_rows(i).content_id THEN
6611                l_services_hash := CONCAT(l_services_hash,TO_CHAR(p_shpmnt_toplevel_charges(k).freight_cost_type_id));
6612             END IF;
6613 
6614             EXIT WHEN k = p_shpmnt_toplevel_charges.LAST;
6615             k := p_shpmnt_toplevel_charges.NEXT(k);
6616 
6617          -- }
6618          END LOOP;
6619          -- }
6620          END IF;
6621 
6622          --  See if already the same dual exists with (same commodity type for Sh-Wi ) a grouping rule = shipment.
6623          --  If yes, consolidate this one to that. If no, create a new pricing dual instance
6624 
6625          l_pattern_index := l_pattern_index + 1;
6626 
6627          --  Create a new record into x_pattern_rows here
6628 
6629          x_pattern_rows(l_pattern_index).pattern_index := l_pattern_index;
6630          x_pattern_rows(l_pattern_index).content_id := p_shpmnt_toplevel_rows(i).content_id;
6631          x_pattern_rows(l_pattern_index).pattern_no := l_pattern_no;
6632          x_pattern_rows(l_pattern_index).services_hash := l_services_hash;
6633 
6634          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Done initializing pattern row');
6635          IF l_grouping_level = 'CONTAINER' THEN
6636          -- {
6637 
6638              l_count_pattern := 1;
6639              create_new_instance (
6640                    p_rolled_up_lines         =>     l_rolledup_lines,
6641                    --p_toplevel_line_id        =>     p_shpmnt_toplevel_rows(i).content_id,
6642                    p_toplevel_lines        =>     p_shpmnt_toplevel_rows(i),
6643                    p_grouping_level          =>     l_grouping_level,
6644                    p_aggregation             =>     l_aggregation,
6645                    p_objective               =>     l_pricing_objective,
6646                    p_instance_count          =>     x_pricing_dual_instances.COUNT,
6647                    x_pricing_engine_rows     =>     x_pricing_engine_rows,
6648                    x_pricing_attribute_rows  =>     x_pricing_attribute_rows,
6649                    x_return_status           =>     l_return_status );
6650 
6651              IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
6652                 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
6653                     FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'create_instance for container '||p_shpmnt_toplevel_rows(i).content_id);
6654                     raise FTE_FREIGHT_PRICING_UTIL.g_create_instance_failed;
6655                 END IF;
6656              ELSE -- What happens if no new instance is created ? Exception ?
6657                   -- already handled inside the called procedure
6658                 FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Instance created for container '||p_shpmnt_toplevel_rows(i).content_id);
6659              END IF;
6660 
6661              --  Create a new record into x_pricing_dual_instances here
6662              l_instance_index := x_pricing_dual_instances.COUNT + 1;
6663              x_pattern_rows(l_pattern_index).instance_index := l_instance_index;
6664 
6665              x_pricing_dual_instances(l_instance_index).instance_index := l_instance_index;
6666              x_pricing_dual_instances(l_instance_index).pattern_no     := l_pattern_no;
6667              x_pricing_dual_instances(l_instance_index).services_hash  := l_services_hash;
6668              x_pricing_dual_instances(l_instance_index).grouping_level := l_grouping_level;
6669              x_pricing_dual_instances(l_instance_index).aggregation    := l_aggregation;
6670              x_pricing_dual_instances(l_instance_index).objective      := l_pricing_objective;
6671              x_pricing_dual_instances(l_instance_index).count_pattern  := l_count_pattern;   --  Need to be incremented and initialized appropriately
6672 
6673 
6674           -- }
6675          ELSIF l_grouping_level ='SHIPMENT' THEN    --  Grouping level = shipment
6676          -- {
6677 
6678 
6679             -- Now search for matching patterns
6680             -- Pass in x_pricing_dual_instances,x_pricing_engine_rows,l_pattern,l_grouping_level,
6681             -- l_aggregation,l_pricing_objective,l_rolledup_category_rows
6682             -- and additional services hash for current pattern (at the top line level)
6683             -- Get back matching instance_index (if matches), -100 if does not match
6684 
6685            IF l_cont_basis_count = 0 THEN
6686            -- {
6687 
6688             l_instance_count := x_pricing_dual_instances.COUNT;
6689 
6690             IF l_instance_count > 0 THEN
6691             -- {
6692 
6693              --  Need to search here
6694 
6695              search_matching_instance (
6696                 --p_rolledup_category_rows  =>     l_rolledup_category_rows,
6697                 --p_rolledup_category_basis =>     l_rolledup_category_basis,
6698                 p_pattern_no              =>     l_pattern_no,      -- Created here
6699                 p_grouping_level          =>     l_grouping_level,
6700                 p_aggregation             =>     l_aggregation,
6701                 p_objective               =>     l_pricing_objective,
6702                 p_toplevel_charges_hash   =>     l_services_hash, -- Created here from p_shpmnt_toplevel_charges
6703                 p_pricing_dual_instances  =>     x_pricing_dual_instances,
6704                 --p_pricing_engine_rows     =>     x_pricing_engine_rows,
6705                 x_matched_instance_index  =>     l_matched_instance_index,  --  -100 if does not match
6706                 x_return_status           =>     l_return_status );
6707 
6708              IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
6709                 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
6710                     FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'search for container '||p_shpmnt_toplevel_rows(i).content_id);
6711                     raise FTE_FREIGHT_PRICING_UTIL.g_search_instance_failed;
6712                 END IF;
6713              ELSE
6714                 FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Matched Instance '||l_matched_instance_index||' found for container '||p_shpmnt_toplevel_rows(i).content_id);
6715              END IF;
6716 
6717             -- }
6718             END IF;
6719 
6720            -- }  -- l_cont_basis_count = 0
6721            END IF;
6722 
6723            IF l_cont_basis_count > 0
6724            OR (l_cont_basis_count = 0 AND l_instance_count = 0)
6725            OR (l_cont_basis_count = 0 AND l_matched_instance_index = -100)  THEN
6726                 --  Create new instance and engine row here
6727 
6728              l_count_pattern := 1;
6729              create_new_instance (
6730                    p_rolled_up_lines         =>     l_rolledup_lines,
6731                    --p_toplevel_line_id        =>     p_shpmnt_toplevel_rows(i).content_id,
6732                    p_toplevel_lines        =>     p_shpmnt_toplevel_rows(i),
6733                    p_grouping_level          =>     l_grouping_level,
6734                    p_aggregation             =>     l_aggregation,
6735                    p_objective               =>     l_pricing_objective,
6736                    p_instance_count          =>     x_pricing_dual_instances.COUNT,
6737                    x_pricing_engine_rows     =>     x_pricing_engine_rows,
6738                    x_pricing_attribute_rows  =>     x_pricing_attribute_rows,
6739                    x_return_status           =>     l_return_status );
6740 
6741              IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
6742                 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
6743                     FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'create_instance for container '||p_shpmnt_toplevel_rows(i).content_id);
6744                     raise FTE_FREIGHT_PRICING_UTIL.g_create_instance_failed;
6745                 END IF;
6746              ELSE -- What happens if no new instance is created ? Exception ?
6747                   -- already handled inside the called procedure
6748                 FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Instance created for container '||p_shpmnt_toplevel_rows(i).content_id);
6749              END IF;
6750 
6751               --  Create a new record into x_pricing_dual_instances here
6752 
6753              l_instance_index := x_pricing_dual_instances.COUNT + 1;
6754              x_pattern_rows(l_pattern_index).instance_index := l_instance_index;
6755 
6756              x_pricing_dual_instances(l_instance_index).instance_index := l_instance_index;
6757              x_pricing_dual_instances(l_instance_index).pattern_no     := l_pattern_no;
6758              x_pricing_dual_instances(l_instance_index).services_hash  := l_services_hash;
6759              x_pricing_dual_instances(l_instance_index).grouping_level := l_grouping_level;
6760              x_pricing_dual_instances(l_instance_index).aggregation    := l_aggregation;
6761              x_pricing_dual_instances(l_instance_index).objective      := l_pricing_objective;
6762              x_pricing_dual_instances(l_instance_index).count_pattern  := l_count_pattern;   --  Need to be incremented and initialized appropriately
6763 
6764            ELSE  --   Found a matching instance
6765 
6766               --  Add to the matching instance l_matched_instance_index
6767 
6768              l_count_pattern := x_pricing_dual_instances(l_matched_instance_index).count_pattern + 1;
6769              add_to_instance (
6770                    p_rolled_up_lines         =>     l_rolledup_lines,
6771                    p_matching_instance_index =>     l_matched_instance_index,
6772                    p_aggregation             =>     l_aggregation,
6773                    p_objective               =>     l_pricing_objective,
6774                    x_pricing_engine_rows     =>     x_pricing_engine_rows,
6775                    x_pricing_attribute_rows  =>     x_pricing_attribute_rows,
6776                    x_return_status           =>     l_return_status );
6777 
6778              IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
6779                 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
6780                     FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'add_to_instance for container '||p_shpmnt_toplevel_rows(i).content_id);
6781                     raise FTE_FREIGHT_PRICING_UTIL.g_add_to_instance_failed;
6782                 END IF;
6783              ELSE
6784                 FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Container '||p_shpmnt_toplevel_rows(i).content_id||' added to instance '||l_matched_instance_index);
6785              END IF;
6786 
6787               --  Modify x_pricing_dual_instances(l_matched_instance_index) here
6788              l_instance_index := l_matched_instance_index;
6789              x_pattern_rows(l_pattern_index).instance_index := l_instance_index;
6790 
6791              x_pricing_dual_instances(l_instance_index).count_pattern  := l_count_pattern;
6792 
6793            END IF;
6794           -- }
6795           END IF;  -- grouping level
6796 
6797       -- }
6798       ELSE   -- shipment top level loose item
6799              -- new code to use patterns for loose items
6800       -- {
6801              -- look up basis for current top level row (loose item)
6802              -- assign pattern_no based on basis
6803              -- create new pattern row
6804              -- find out grouping level and aggregation level
6805              -- if grouping level = ITEM
6806              --    create new instance
6807              -- else    -- if grouping_level = SHIPMENT
6808              --    if instance_count > 0
6809              --          search for matching instance
6810              --    end if
6811              --    if instance_count = 0 or no match found
6812              --          create new instance
6813              --    else
6814              --          add to instance
6815              --    end if
6816              --  end if
6817 
6818 
6819                 FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'For loose item :'|| p_shpmnt_toplevel_rows(i).content_id);
6820 
6821              l_rolledup_rec.delivery_detail_id := null;
6822              l_rolledup_rec.container_id       := null;
6823              l_rolledup_rec.category_id        := null;
6824              l_rolledup_rec.rate_basis         := null;
6825              l_rolledup_rec.line_quantity      := null;
6826              l_rolledup_rec.line_uom           := null;
6827 
6828              -- find basis
6829 
6830              l_rolledup_lines.DELETE;  -- bug 2779306
6831              rollup_loose_item (
6832                  p_loose_item_id           => p_shpmnt_toplevel_rows(i).content_id,
6833                  p_classification_code     => p_classification_code,
6834                  p_lane_basis              => p_lane_basis,
6835                  p_lane_id                 => p_lane_id,
6836                  x_rolledup_rec            => l_rolledup_rec,
6837                  x_return_status           => l_return_status );
6838 
6839 
6840                 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
6841                         IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
6842                            FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'Loose Item '||p_shpmnt_toplevel_rows(i).content_id);
6843                            raise FTE_FREIGHT_PRICING_UTIL.g_rollup_container_failed;
6844                         END IF;
6845                 END IF;
6846 
6847            l_rolledup_rec.master_container_id := p_shpmnt_toplevel_rows(i).content_id;
6848            g_rolledup_lines(p_shpmnt_toplevel_rows(i).content_id).master_container_id := p_shpmnt_toplevel_rows(i).content_id;
6849 
6850                 FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'rollup_rec ->');
6851                 FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'       delivery_detail_id = '||
6852                 l_rolledup_rec.delivery_detail_id||'   container_id='||l_rolledup_rec.container_id||' category_id = '||l_rolledup_rec.category_id
6853           ||' rate_basis = '||l_rolledup_rec.rate_basis||' qty='||l_rolledup_rec.line_quantity||' '||l_rolledup_rec.line_uom);
6854 
6855               IF (nvl(l_rolledup_rec.line_quantity,0) = 0) THEN
6856                   FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,' Rolled up line has line quantity = 0');
6857                   raise FTE_FREIGHT_PRICING_UTIL.g_invalid_line_quantity;
6858               END IF;
6859 
6860              IF (l_rolledup_rec.rate_basis = G_WEIGHT_BASIS) THEN
6861                  l_pattern_no   := G_PATTERN_9;
6862                  l_pattern_name := G_PATTERN_9_NAME;
6863              ELSIF (l_rolledup_rec.rate_basis = G_VOLUME_BASIS) THEN
6864                  l_pattern_no   := G_PATTERN_10;
6865                  l_pattern_name := G_PATTERN_10_NAME;
6866              ELSE
6867                  raise FTE_FREIGHT_PRICING_UTIL.g_invalid_basis;
6868              END IF;
6869 
6870          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Done identifying pattern: '||l_pattern_no);
6871 
6872          l_pattern_index := l_pattern_index + 1;
6873 
6874          --  Create a new record into x_pattern_rows here
6875 
6876          x_pattern_rows(l_pattern_index).pattern_index := l_pattern_index;
6877          x_pattern_rows(l_pattern_index).content_id := p_shpmnt_toplevel_rows(i).content_id;
6878          x_pattern_rows(l_pattern_index).pattern_no := l_pattern_no;
6879          x_pattern_rows(l_pattern_index).services_hash := null;
6880 
6881          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Done initializing pattern row');
6882 
6883          --  Look up FTE pricing preferences table to find out the pricing dual for that pattern
6884 
6885          l_grouping_level   := FTE_FREIGHT_PRICING_SPECIAL.g_lane_rules_tab(l_pattern_no).grouping_level;
6886          l_aggregation      := FTE_FREIGHT_PRICING_SPECIAL.g_lane_rules_tab(l_pattern_no).commodity_aggregation;
6887          -- l_pricing_objective := FTE_FREIGHT_PRICING_SPECIAL.g_lane_rules_tab(l_pattern_no).pricing_objective;
6888          l_pricing_objective := NULL;
6889 
6890          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Done getting pricing dual');
6891          l_rolledup_lines(1) := l_rolledup_rec;
6892 
6893          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'l_rolledup_lines.COUNT = '||l_rolledup_lines.COUNT);
6894 
6895          IF l_grouping_level = 'ITEM' THEN
6896          -- {
6897 
6898              l_count_pattern := 1;
6899              create_new_instance (
6900                    p_rolled_up_lines         =>     l_rolledup_lines,
6901                    --p_toplevel_line_id        =>     p_shpmnt_toplevel_rows(i).content_id,
6902                    p_toplevel_lines        =>     p_shpmnt_toplevel_rows(i),
6903                    p_grouping_level          =>     l_grouping_level,
6904                    p_aggregation             =>     l_aggregation,
6905                    p_objective               =>     l_pricing_objective,
6906                    p_instance_count          =>     x_pricing_dual_instances.COUNT,
6907                    x_pricing_engine_rows     =>     x_pricing_engine_rows,
6908                    x_pricing_attribute_rows  =>     x_pricing_attribute_rows,
6909                    x_return_status           =>     l_return_status );
6910 
6911              IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
6912                 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
6913                     FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'create_instance for loose item '||p_shpmnt_toplevel_rows(i).content_id);
6914                     raise FTE_FREIGHT_PRICING_UTIL.g_create_instance_failed;
6915                 END IF;
6916              ELSE -- What happens if no new instance is created ? Exception ?
6917                   -- already handled inside the called procedure
6918                 FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Instance created for loose item '||p_shpmnt_toplevel_rows(i).content_id);
6919              END IF;
6920 
6921              --  Create a new record into x_pricing_dual_instances here
6922              l_instance_index := x_pricing_dual_instances.COUNT + 1;
6923              x_pattern_rows(l_pattern_index).instance_index := l_instance_index;
6924 
6925              x_pricing_dual_instances(l_instance_index).instance_index := l_instance_index;
6926              x_pricing_dual_instances(l_instance_index).pattern_no     := l_pattern_no;
6927              x_pricing_dual_instances(l_instance_index).services_hash  := null;
6928              x_pricing_dual_instances(l_instance_index).grouping_level := l_grouping_level;
6929              x_pricing_dual_instances(l_instance_index).aggregation    := l_aggregation;
6930              x_pricing_dual_instances(l_instance_index).objective      := l_pricing_objective;
6931              x_pricing_dual_instances(l_instance_index).count_pattern  := l_count_pattern;   --  Need to be incremented and initialized appropriately
6932              x_pricing_dual_instances(l_instance_index).loose_item_flag := 'Y';
6933              -- FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'instance_index = '||l_instance_index||' loose_item_flag ='||x_pricing_dual_instances(l_instance_index).loose_item_flag);
6934 
6935 
6936           -- }
6937          ELSE         -- Grouping level = 'SHIPMENT'  (Loose Items only)
6938           -- {
6939 
6940               -- should we be looking only at loose item instances? or this will be handled by
6941               -- search matching instances?
6942               l_instance_count := x_pricing_dual_instances.COUNT;
6943 
6944             IF l_instance_count > 0 THEN
6945             -- {
6946 
6947              --  Need to search here
6948 
6949              search_matching_instance (
6950                 p_pattern_no              =>     l_pattern_no,      -- Created here
6951                 p_grouping_level          =>     l_grouping_level,
6952                 p_aggregation             =>     l_aggregation,
6953                 p_objective               =>     l_pricing_objective,
6954                 p_toplevel_charges_hash   =>     null, -- Created here from p_shpmnt_toplevel_charges
6955                 p_pricing_dual_instances  =>     x_pricing_dual_instances,
6956                 x_matched_instance_index  =>     l_matched_instance_index,  --  -100 if does not match
6957                 x_return_status           =>     l_return_status );
6958 
6959              IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
6960                 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
6961                     FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'search for loose item '||p_shpmnt_toplevel_rows(i).content_id);
6962                     raise FTE_FREIGHT_PRICING_UTIL.g_search_instance_failed;
6963                 END IF;
6964              ELSE
6965                 FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Matched Instance '||l_matched_instance_index||' found for loose item '||p_shpmnt_toplevel_rows(i).content_id);
6966              END IF;
6967 
6968             -- }
6969             END IF;
6970 
6971             IF ( l_instance_count = 0 OR l_matched_instance_index = -100)  THEN
6972             -- {
6973 
6974              l_count_pattern := 1;
6975              create_new_instance (
6976                    p_rolled_up_lines         =>     l_rolledup_lines,
6977                    p_toplevel_lines          =>     p_shpmnt_toplevel_rows(i),
6978                    p_grouping_level          =>     l_grouping_level,
6979                    p_aggregation             =>     l_aggregation,
6980                    p_objective               =>     l_pricing_objective,
6981                    p_instance_count          =>     x_pricing_dual_instances.COUNT,
6982                    x_pricing_engine_rows     =>     x_pricing_engine_rows,
6983                    x_pricing_attribute_rows  =>     x_pricing_attribute_rows,
6984                    x_return_status           =>     l_return_status );
6985 
6986              IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
6987                 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
6988                     FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'create_instance for loose item '||p_shpmnt_toplevel_rows(i).content_id);
6989                     raise FTE_FREIGHT_PRICING_UTIL.g_create_instance_failed;
6990                 END IF;
6991              ELSE -- What happens if no new instance is created ? Exception ?
6992                   -- already handled inside the called procedure
6993                 FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Instance created for loose item '||p_shpmnt_toplevel_rows(i).content_id);
6994              END IF;
6995 
6996               --  Create a new record into x_pricing_dual_instances here
6997 
6998              l_instance_index := x_pricing_dual_instances.COUNT + 1;
6999              x_pattern_rows(l_pattern_index).instance_index := l_instance_index;
7000 
7001              x_pricing_dual_instances(l_instance_index).instance_index := l_instance_index;
7002              x_pricing_dual_instances(l_instance_index).pattern_no     := l_pattern_no;
7003              x_pricing_dual_instances(l_instance_index).services_hash  := l_services_hash;
7004              x_pricing_dual_instances(l_instance_index).grouping_level := l_grouping_level;
7005              x_pricing_dual_instances(l_instance_index).aggregation    := l_aggregation;
7006              x_pricing_dual_instances(l_instance_index).objective      := l_pricing_objective;
7007              x_pricing_dual_instances(l_instance_index).count_pattern  := l_count_pattern;   --  Need to be incremented and initialized appropriately
7008              x_pricing_dual_instances(l_instance_index).loose_item_flag := 'Y';
7009              -- FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'instance_index = '||l_instance_index||' loose_item_flag ='||x_pricing_dual_instances(l_instance_index).loose_item_flag);
7010 
7011             -- }
7012            ELSE
7013             -- {
7014               -- match found
7015               --  Add to the matching instance l_matched_instance_index
7016 
7017              l_count_pattern := x_pricing_dual_instances(l_matched_instance_index).count_pattern + 1;
7018              -- new method --
7019              add_to_instance (
7020                    p_container_flag          =>     p_shpmnt_toplevel_rows(i).container_flag,
7021                    p_rolled_up_lines         =>     l_rolledup_lines,
7022                    p_matching_instance_index =>     l_matched_instance_index,
7023                    p_aggregation             =>     l_aggregation,
7024                    p_objective               =>     l_pricing_objective,
7025                    x_pricing_engine_rows     =>     x_pricing_engine_rows,
7026                    x_pricing_attribute_rows  =>     x_pricing_attribute_rows,
7027                    x_return_status           =>     l_return_status );
7028 
7029              IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
7030                 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
7031                     FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'add_to_instance for loose item '||p_shpmnt_toplevel_rows(i).content_id);
7032                     raise FTE_FREIGHT_PRICING_UTIL.g_add_to_instance_failed;
7033                 END IF;
7034              ELSE
7035                 FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Loose Item '||p_shpmnt_toplevel_rows(i).content_id||' added to instance '||l_matched_instance_index);
7036              END IF;
7037 
7038               --  Modify x_pricing_dual_instances(l_matched_instance_index) here
7039              l_instance_index := l_matched_instance_index;
7040              x_pattern_rows(l_pattern_index).instance_index := l_instance_index;
7041 
7042              x_pricing_dual_instances(l_instance_index).count_pattern  := l_count_pattern;
7043              -- FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'instance_index = '||l_instance_index||' loose_item_flag ='||x_pricing_dual_instances(l_instance_index).loose_item_flag);
7044 
7045             -- }
7046            END IF;
7047 
7048           -- }
7049          END IF;  -- grouping level
7050 
7051 
7052       -- }    -- container_flag
7053       END IF;
7054 
7055       IF x_pricing_engine_rows.COUNT > l_curr_engine_row_count THEN
7056       -- {
7057       l_attribute_index := l_curr_attribute_count;
7058       m := l_curr_engine_row_count + 1;
7059       LOOP
7060 
7061        IF p_shpmnt_toplevel_charges.COUNT > 0 THEN
7062        l := p_shpmnt_toplevel_charges.FIRST;
7063        LOOP
7064 
7065          IF p_shpmnt_toplevel_charges(l).content_id = p_shpmnt_toplevel_rows(i).content_id THEN
7066 
7067            l_attribute_index := l_attribute_index + 1;
7068            x_pricing_attribute_rows(l_attribute_index).attribute_index := l_attribute_index;
7069            x_pricing_attribute_rows(l_attribute_index).input_index     := x_pricing_engine_rows(m).input_index;
7070            x_pricing_attribute_rows(l_attribute_index).attribute_name  := 'ADDITIONAL_CHARGE';
7071            x_pricing_attribute_rows(l_attribute_index).attribute_value := p_shpmnt_toplevel_charges(l).freight_cost_type_code;
7072 
7073          END IF;
7074 
7075          EXIT WHEN l = p_shpmnt_toplevel_charges.LAST;
7076          l := p_shpmnt_toplevel_charges.NEXT(l);
7077        END LOOP;
7078        -- }
7079        END IF;
7080 
7081        EXIT WHEN m = x_pricing_engine_rows.LAST;
7082        m := x_pricing_engine_rows.NEXT(m);
7083       END LOOP;
7084       END IF;
7085 
7086       <<nextpass>>
7087 
7088       EXIT WHEN i = p_shpmnt_toplevel_rows.LAST;
7089       i := p_shpmnt_toplevel_rows.NEXT(i);
7090 
7091    -- }
7092    END LOOP;
7093 
7094   FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'l_lane_function='||l_lane_function);
7095   FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'p_classification_code='||p_classification_code);
7096 
7097   IF l_lane_function = 'LTL' and p_classification_code = 'FC' THEN
7098 
7099    print_rolledup_lines (
7100         p_rolledup_lines          =>   g_rolledup_lines,
7101         x_return_status           =>   l_return_status );
7102 
7103    print_engine_rows (
7104         p_engine_rows             =>    x_pricing_engine_rows,
7105         x_return_status           =>    l_return_status );
7106 
7107     FTE_FREIGHT_PRICING_SPECIAL.distribute_LTL_container_wt(
7108         p_top_level_rows          => 	p_shpmnt_toplevel_rows,
7109         x_pricing_engine_rows     =>    x_pricing_engine_rows,
7110         x_return_status           =>    l_return_status );
7111 
7112     IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS
7113 	and l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
7114       RAISE FND_API.G_EXC_ERROR;
7115     END IF;
7116 
7117   END IF; --l_lane_function = 'LTL' and p_classification_code = 'FC'
7118 
7119    FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'process_shipment_pattern');
7120 
7121 EXCEPTION
7122    WHEN FND_API.G_EXC_ERROR THEN
7123         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
7124         FTE_FREIGHT_PRICING_UTIL.set_exception('process_shipment_pattern',FTE_FREIGHT_PRICING_UTIL.G_ERR,'FND_API.G_EXC_ERROR');
7125         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'process_shipment_pattern');
7126    WHEN FTE_FREIGHT_PRICING_UTIL.g_initialize_failed THEN
7127         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
7128         FTE_FREIGHT_PRICING_UTIL.set_exception('process_shipment_pattern',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_initialize_failed');
7129         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'process_shipment_pattern');
7130    WHEN FTE_FREIGHT_PRICING_UTIL.g_rollup_container_failed THEN
7131         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
7132         FTE_FREIGHT_PRICING_UTIL.set_exception('process_shipment_pattern',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_rollup_container_failed');
7133         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'process_shipment_pattern');
7134    WHEN FTE_FREIGHT_PRICING_UTIL.g_invalid_line_quantity THEN
7135         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
7136         FTE_FREIGHT_PRICING_UTIL.set_exception('process_shipment_pattern',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_invalid_line_quantity');
7137         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'process_shipment_pattern');
7138    WHEN FTE_FREIGHT_PRICING_UTIL.g_dimensional_weight_failed THEN
7139         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
7140         FTE_FREIGHT_PRICING_UTIL.set_exception('process_shipment_pattern',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_dimensional_weight_failed');
7141         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'process_shipment_pattern');
7142    WHEN FTE_FREIGHT_PRICING_UTIL.g_create_instance_failed THEN
7143         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
7144         FTE_FREIGHT_PRICING_UTIL.set_exception('process_shipment_pattern',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_create_instance_failed');
7145         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'process_shipment_pattern');
7146    WHEN FTE_FREIGHT_PRICING_UTIL.g_search_instance_failed THEN
7147         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
7148         FTE_FREIGHT_PRICING_UTIL.set_exception('process_shipment_pattern',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_search_instance_failed');
7149         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'process_shipment_pattern');
7150    WHEN FTE_FREIGHT_PRICING_UTIL.g_add_to_instance_failed THEN
7151         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
7152         FTE_FREIGHT_PRICING_UTIL.set_exception('process_shipment_pattern',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_add_to_instance_failed');
7153         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'process_shipment_pattern');
7154    WHEN FTE_FREIGHT_PRICING_UTIL.g_category_not_found THEN
7155         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
7156         FTE_FREIGHT_PRICING_UTIL.set_exception('process_shipment_pattern',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_category_not_found');
7157         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'process_shipment_pattern');
7158    WHEN FTE_FREIGHT_PRICING_UTIL.g_invalid_basis THEN
7159         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
7160         FTE_FREIGHT_PRICING_UTIL.set_exception('process_shipment_pattern',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_invalid_basis');
7161         --FTE_FREIGHT_PRICING_UTIL.print_debug('basis_not_found ');
7162         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'basis_not_found ');
7163         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'process_shipment_pattern');
7164    WHEN FTE_FREIGHT_PRICING_UTIL.g_loose_item_wrong_basis THEN
7165         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
7166         FTE_FREIGHT_PRICING_UTIL.set_exception('process_shipment_pattern',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_loose_item_wrong_basis');
7167         --FTE_FREIGHT_PRICING_UTIL.print_debug('Loose item can not have container basis');
7168         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Loose item can not have container basis');
7169         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'process_shipment_pattern');
7170    WHEN others THEN
7171         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
7172         FTE_FREIGHT_PRICING_UTIL.set_exception('process_shipment_pattern',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
7173         --FTE_FREIGHT_PRICING_UTIL.print_debug('Unexpected Error : '||SQLCODE||' : '||SQLERRM);
7174         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
7175         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'process_shipment_pattern');
7176 
7177 -- }
7178 END process_shipment_pattern;
7179 
7180 PROCEDURE get_currency_code (
7181           p_carrier_id      IN   NUMBER,
7182           x_currency_code   OUT NOCOPY   wsh_carriers.currency_code%TYPE,
7183           x_return_status   OUT NOCOPY   VARCHAR2)
7184 IS
7185 
7186     CURSOR c_get_currency IS
7187     SELECT currency_code
7188     FROM   wsh_carriers
7189     WHERE  carrier_id = p_carrier_id;
7190 
7191     --l_currency_code     wsh_carriers.currency_code%TYPE;
7192 
7193     l_log_level     NUMBER := FTE_FREIGHT_PRICING_UTIL.G_DBG;
7194 
7195 BEGIN
7196 
7197     x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
7198     FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
7199     FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,'get_currency_code','start');
7200 
7201     OPEN c_get_currency;
7202     FETCH c_get_currency INTO x_currency_code;
7203     IF c_get_currency%NOTFOUND THEN
7204        raise FTE_FREIGHT_PRICING_UTIL.g_no_currency_found;
7205        CLOSE c_get_currency;
7206     END IF;
7207     CLOSE c_get_currency;
7208 
7209     --RETURN l_currency_code;
7210     FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'get_currency_code');
7211 
7212 EXCEPTION
7213    WHEN FTE_FREIGHT_PRICING_UTIL.g_no_currency_found THEN
7214         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
7215         FTE_FREIGHT_PRICING_UTIL.set_exception('get_currency_code',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_no_currency_found');
7216         --FTE_FREIGHT_PRICING_UTIL.print_debug('currency_not_found ');
7217         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'currency_not_found ');
7218         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'get_currency_code');
7219    WHEN others THEN
7220         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
7221         FTE_FREIGHT_PRICING_UTIL.set_exception('get_currency_code',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
7222         --FTE_FREIGHT_PRICING_UTIL.print_debug('Unexpected Error : '||SQLCODE||' : '||SQLERRM);
7223         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
7224         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'get_currency_code');
7225 END get_currency_code;
7226 
7227 -- shipment_rating will be called by
7228 --	WSH-LCSS (FTE_FREIGHT_RATING_DLVY_GRP.Rate_Delivery)
7229 --  and OM-LCSS, (FTE_FREIGHT_RATING_PUB.Get_Freight_Costs)
7230 --  and OM-DisplayChoices (FTE_FREIGHT_RATING_PUB.Get_Services)
7231 --
7232 -- shipment_rating rate shipments in g_shipment_line_rows on p_lane_id and p_service_type
7233 -- if p_mode_of_transport = 'TRUCK' it calls tl_shipment_pricing
7234 -- otherwise it calls shipment_pricing
7235 -- shipment_rating always returns rates in pl/sql table
7236 --
7237 PROCEDURE shipment_rating (
7238         p_lane_id                 	IN     	   NUMBER,
7239         p_service_type            	IN         VARCHAR2,
7240         p_mode_of_transport		IN	   VARCHAR2,
7241         p_ship_date               	IN     	   DATE  DEFAULT sysdate,
7242         p_arrival_date            	IN     	   DATE  DEFAULT sysdate,
7243         p_currency_code                 IN         VARCHAR2 DEFAULT NULL,
7244         x_summary_lanesched_price      	OUT NOCOPY NUMBER,
7245         x_summary_lanesched_price_uom	OUT NOCOPY VARCHAR2,
7246         x_freight_cost_temp_price  	OUT NOCOPY Freight_Cost_Temp_Tab_Type,
7247         x_freight_cost_temp_charge 	OUT NOCOPY Freight_Cost_Temp_Tab_Type,
7248         x_return_status           	OUT NOCOPY VARCHAR2,
7249         x_msg_count               	OUT NOCOPY NUMBER,
7250         x_msg_data                	OUT NOCOPY VARCHAR2 )
7251 IS
7252   l_log_level             NUMBER := FTE_FREIGHT_PRICING_UTIL.G_LOG;
7253   l_api_name              CONSTANT VARCHAR2(30)   := 'SHIPMENT_RATING';
7254   l_return_status         VARCHAR2(1);
7255   l_msg_count             NUMBER := 0;
7256   l_msg_data              VARCHAR2(240);
7257   l_first_level_rows  	  shpmnt_content_tab_type;
7258   l_first_level_charges   addl_services_tab_type;
7259 BEGIN
7260   x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
7261 
7262   FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
7263   FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,l_api_name);
7264 
7265   FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'p_lane_id='||p_lane_id);
7266   FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'p_service_type='||p_service_type);
7267   FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'p_mode_of_transport='||p_mode_of_transport);
7268   FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'p_ship_date='||p_ship_date);
7269   FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'p_arrival_date='||p_arrival_date);
7270 
7271   FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'flatten shipment... ');
7272 
7273         flatten_shipment (
7274             x_first_level_rows        =>    l_first_level_rows,
7275             x_return_status           =>    l_return_status );
7276 
7277         IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS and
7278            l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
7279                raise FTE_FREIGHT_PRICING_UTIL.g_flatten_shipment_failed;
7280         ELSE
7281            FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level, 'No. of top level lines 7 : '||l_first_level_rows.COUNT);
7282            IF l_first_level_rows.COUNT = 0 THEN
7283                raise FTE_FREIGHT_PRICING_UTIL.g_flatten_shipment_failed;
7284            END IF;
7285         END IF;
7286 
7287     FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'p_currency_code='|| p_currency_code);
7288     FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'call shipment_pricing... ');
7289     shipment_pricing (
7290         p_lane_id 			=> p_lane_id,
7291         p_service_type			=> p_service_type,
7292         p_ship_date			=> p_ship_date,
7293         p_arrival_date			=> p_arrival_date,
7294         p_shpmnt_toplevel_rows    	=> l_first_level_rows,
7295         p_shpmnt_toplevel_charges 	=> l_first_level_charges,
7296         p_save_flag               	=> 'P',
7297         p_currency_code                 => p_currency_code,
7298         x_summary_lanesched_price      	=> x_summary_lanesched_price,
7299         x_summary_lanesched_price_uom  	=> x_summary_lanesched_price_uom,
7300         x_freight_cost_temp_price      	=> x_freight_cost_temp_price,
7301         x_freight_cost_temp_charge     	=> x_freight_cost_temp_charge,
7302         x_return_status           	=> l_return_status ) ;
7303 
7304         IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS and
7305            l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
7306                raise FTE_FREIGHT_PRICING_UTIL.g_shipment_pricing_failed;
7307         END IF;
7308 
7309   FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,l_api_name);
7310 
7311 EXCEPTION
7312    WHEN FTE_FREIGHT_PRICING_UTIL.g_shipment_pricing_failed THEN
7313         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
7314         FTE_FREIGHT_PRICING_UTIL.set_exception(l_api_name,FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_shipment_pricing_failed');
7315         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,l_api_name);
7316    WHEN FTE_FREIGHT_PRICING_UTIL.g_flatten_shipment_failed THEN
7317         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
7318         FTE_FREIGHT_PRICING_UTIL.set_exception(l_api_name,FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_flatten_shipment_failed');
7319         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,l_api_name);
7320    WHEN others THEN
7321         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
7322         FTE_FREIGHT_PRICING_UTIL.set_exception(l_api_name,FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
7323         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
7324         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,l_api_name);
7325 END shipment_rating;
7326 
7327 
7328 --      This procedure is the basic shipment freight charge calculation API
7329 --      Takes a lane id/schedule id  or WSH trip id
7330 --      It processes each input shipment content line to identify their patterns
7331 --      and to construct input lines to send to the QP engine using the Pricing preferences
7332 --      Uses process_shipment_pattern to construct inputs to QP engine line and attribute line
7333 --      This API also calls out post-processing APIs and saves to
7334 --      WSH_FREIGHT_COSTS or FTE_FREIGHT_COSTS_TEMP depending on p_save_flag values ('T' or 'M')
7335 --      Looks up delivery detail info from g_shipment_line_rows
7336 
7337 PROCEDURE shipment_pricing (
7338         p_lane_id                 IN     NUMBER DEFAULT NULL,
7339         p_schedule_id             IN     NUMBER DEFAULT NULL,
7340         p_segment_id              IN     NUMBER DEFAULT NULL,-- Input either Lane/schedule or the trip segment
7341         p_service_type            IN     VARCHAR2 DEFAULT NULL, -- service type is required with lane/schedule
7342         p_ship_date               IN     DATE  DEFAULT sysdate, -- VVP (09/30/02)
7343         p_arrival_date            IN     DATE  DEFAULT sysdate, -- VVP (09/30/02)
7344         --p_shpmnt_toplevel_rows    IN OUT NOCOPY  shpmnt_content_tab_type,
7345         p_shpmnt_toplevel_rows    IN     shpmnt_content_tab_type, /* bug# 2501240 -VVP */
7346         p_shpmnt_toplevel_charges IN     addl_services_tab_type, -- Top level requested additional services
7347 --      p_shpmnt_charges          IN     shpmnt_charges_tab_type,  --  Not supported in Phase I
7348         p_save_flag               IN     VARCHAR2, -- Whether to save to TEMP table or MAIN table
7349         p_request_id              IN     NUMBER DEFAULT NULL, -- Required only in case of saving to TEMP table
7350         p_currency_code           IN     VARCHAR2 DEFAULT NULL,
7351         x_summary_lanesched_price      OUT NOCOPY     NUMBER,   -- Only in case of 'T'
7352         x_summary_lanesched_price_uom  OUT NOCOPY     VARCHAR2,
7353         x_freight_cost_temp_price  OUT NOCOPY     Freight_Cost_Temp_Tab_Type,
7354         x_freight_cost_temp_charge OUT NOCOPY     Freight_Cost_Temp_Tab_Type,
7355         x_return_status           OUT NOCOPY     VARCHAR2 )
7356 IS
7357 
7358         CURSOR c_get_lane_info(c_lane_id IN NUMBER) IS
7359         SELECT fl.lane_id,fl.carrier_id,flrc.list_header_id pricelist_id,
7360                fl.mode_of_transportation_code,fl.origin_id,fl.destination_id,
7361                fl.basis,fl.commodity_catg_id,fl.service_type_code,fl.comm_fc_class_code
7362         FROM   fte_lanes fl, fte_lane_rate_charts flrc
7363         WHERE  fl.lane_id = c_lane_id
7364     	AND    fl.lane_id = flrc.lane_id
7365 	AND    (flrc.start_date_active is null OR flrc.start_date_active <= p_ship_date)
7366 	AND    (flrc.end_date_active is null OR flrc.end_date_active > p_ship_date);
7367 
7368         CURSOR c_get_lane_info_from_trip(c_wsh_trip_id IN NUMBER) IS
7369         SELECT fl.lane_id,fl.carrier_id,flrc.list_header_id pricelist_id,
7370                fl.mode_of_transportation_code,fl.origin_id,fl.destination_id,
7371                fl.basis,fl.commodity_catg_id,fl.service_type_code,fl.comm_fc_class_code
7372         FROM   fte_lanes fl, wsh_trips wt, fte_lane_rate_charts flrc
7373         WHERE  fl.lane_id = wt.lane_id
7374         AND    wt.trip_id = c_wsh_trip_id
7375     	AND    fl.lane_id = flrc.lane_id
7376 	AND    (flrc.start_date_active is null OR flrc.start_date_active <= p_ship_date)
7377 	AND    (flrc.end_date_active is null OR flrc.end_date_active > p_ship_date);
7378 
7379         CURSOR c_get_lane_info_from_schedule(c_schedule_id IN NUMBER) IS
7380         SELECT fl.lane_id,fl.carrier_id,flrc.list_header_id pricelist_id,
7381                fl.mode_of_transportation_code,fl.origin_id,fl.destination_id,
7382                fl.basis,fl.commodity_catg_id,fl.service_type_code,fl.comm_fc_class_code
7383         FROM   fte_lanes fl, fte_schedules fs, fte_lane_rate_charts flrc
7384         WHERE  fl.lane_id = fs.lane_id
7385         AND    fs.schedules_id = c_schedule_id
7386     	AND    fl.lane_id = flrc.lane_id
7387 	AND    (flrc.start_date_active is null OR flrc.start_date_active <= p_ship_date)
7388 	AND    (flrc.end_date_active is null OR flrc.end_date_active > p_ship_date);
7389 
7390         CURSOR c_get_service_type(c_wsh_trip_id IN NUMBER) IS
7391         SELECT service_level
7392         FROM   wsh_trips
7393         WHERE  trip_id = c_wsh_trip_id;
7394 
7395         i                                    NUMBER:=0;
7396         j                                    NUMBER:=0;
7397         k                                    NUMBER:=0;
7398         l                                    NUMBER:=0;
7399         m                                    NUMBER:=0;
7400         n                                    NUMBER:=0;
7401         o                                    NUMBER:=0;
7402         l_return_status                      VARCHAR2(1);
7403         l_service_type                       VARCHAR2(60);
7404         l_currency_code                      VARCHAR2(30);
7405 
7406         l_lane_info                          lane_info_rec_type;
7407         l_pricing_dual_instances             pricing_dual_instance_tab_type;
7408         l_pricing_engine_rows                pricing_engine_input_tab_type;
7409         l_pattern_rows                       top_level_pattern_tab_type;
7410         l_pricing_attribute_rows             pricing_attribute_tab_type;
7411         l_pricing_control_rec                pricing_control_input_rec_type;
7412         l_pricing_qualifier                  fte_qual_rec_type;
7413         l_pricing_engine_output_lines        QP_PREQ_GRP.LINE_TBL_TYPE;
7414         l_qp_output_line_details             QP_PREQ_GRP.LINE_DETAIL_TBL_TYPE;
7415         l_freight_cost_main_price            Freight_Cost_Main_Tab_Type;
7416         l_freight_cost_main_charge           Freight_Cost_Main_Tab_Type;
7417         l_freight_cost_temp_price            Freight_Cost_Temp_Tab_Type;
7418         l_freight_cost_temp_charge           Freight_Cost_Temp_Tab_Type;
7419         l_fc_main_update_rows                Freight_Cost_Main_Tab_Type;
7420         l_freight_cost_id                    NUMBER;
7421         l_freight_cost_main_ids              WSH_UTIL_CORE.id_tab_type;
7422         l_freight_cost_temp_ids              WSH_UTIL_CORE.id_tab_type;
7423         l_freight_cost_temp_id               NUMBER;
7424         l_rowid                              VARCHAR2(30);
7425         l_rowids                             WSH_UTIL_CORE.column_tab_type;
7426         l_temp_row_count                     NUMBER;
7427         l_return_status_text                 VARCHAR2(240);
7428 
7429         l_shpmnt_toplevel_rows              shpmnt_content_tab_type;
7430         p                                    NUMBER:=0;
7431 
7432         l_log_level     NUMBER := FTE_FREIGHT_PRICING_UTIL.G_LOG;
7433 
7434 BEGIN
7435 
7436    x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
7437    FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
7438    FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,'shipment_pricing','start');
7439 
7440    FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'p_lane_id='||p_lane_id);
7441    FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'p_schedule_id='||p_schedule_id);
7442    FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'p_segment_id='||p_segment_id);
7443    FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'p_service_type='||p_service_type);
7444    FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'p_ship_date='||p_ship_date);
7445    FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'p_arrival_date='||p_arrival_date);
7446    FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'p_save_flag='||p_save_flag);
7447    FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'p_request_id='||p_request_id);
7448 
7449    -- Calls process_shipment_pattern and gets back l_pricing_engine_rows and l_pricing_attribute_rows
7450    -- Modifies l_pricing_attribute_rows to add more rows to it
7451    -- Calls call_qp_engine passing in l_pricing_engine_rows,l_pricing_attribute_rows and l_pricing_qualifier
7452    -- Gets back l_pricing_engine_output_lines and l_qp_output_line_details
7453    -- Processes these two tables together with l_pricing_dual_instances and g_shipment_line_rows
7454    -- Prepares records to go to WSH_FREIGHT_COST main/temp table
7455 
7456 
7457    g_effectivity_dates.date_from     := p_ship_date;
7458    g_effectivity_dates.date_to       := p_arrival_date;
7459 
7460    IF p_lane_id IS NULL AND p_segment_id IS NULL AND p_schedule_id IS NULL THEN
7461 
7462       raise FTE_FREIGHT_PRICING_UTIL.g_no_lanesched_seg;
7463 
7464    ELSIF p_lane_id IS NULL AND p_schedule_id IS NULL THEN
7465 
7466       OPEN c_get_lane_info_from_trip(p_segment_id);
7467       FETCH c_get_lane_info_from_trip INTO l_lane_info;
7468       IF c_get_lane_info_from_trip%NOTFOUND THEN
7469          CLOSE c_get_lane_info_from_trip;
7470          raise FTE_FREIGHT_PRICING_UTIL.g_no_lane_info;
7471       END IF;
7472       CLOSE c_get_lane_info_from_trip;
7473 
7474       OPEN c_get_service_type(p_segment_id);
7475       FETCH c_get_service_type INTO l_service_type;
7476       -- Is this required TODO
7477       IF c_get_service_type%NOTFOUND THEN
7478          CLOSE c_get_service_type;
7479          raise FTE_FREIGHT_PRICING_UTIL.g_no_segment_service_type;
7480       END IF;
7481       CLOSE c_get_service_type;
7482 
7483    ELSIF p_segment_id IS NULL AND p_schedule_id IS NULL THEN
7484 
7485       OPEN c_get_lane_info(p_lane_id);
7486       FETCH c_get_lane_info INTO l_lane_info;
7487       IF c_get_lane_info%NOTFOUND THEN
7488          CLOSE c_get_lane_info;
7489          raise FTE_FREIGHT_PRICING_UTIL.g_no_lane_info;
7490       END IF;
7491       CLOSE c_get_lane_info;
7492 
7493       l_service_type := p_service_type;
7494 
7495    ELSIF p_segment_id IS NULL AND p_lane_id IS NULL THEN
7496 
7497       OPEN c_get_lane_info_from_schedule(p_schedule_id);
7498       FETCH c_get_lane_info_from_schedule INTO l_lane_info;
7499       IF c_get_lane_info_from_schedule%NOTFOUND THEN
7500          CLOSE c_get_lane_info_from_schedule;
7501          raise FTE_FREIGHT_PRICING_UTIL.g_no_lane_info;
7502       END IF;
7503       CLOSE c_get_lane_info_from_schedule;
7504 
7505       l_service_type := p_service_type;
7506 
7507    END IF;
7508 
7509    FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'l_lane_info.lane_id='||l_lane_info.lane_id);
7510    FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'l_lane_info.pricelist_id='||l_lane_info.pricelist_id);
7511    FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'l_service_type='||l_service_type);
7512 
7513    -- Modified for 12i for multi currency support. Get the currency code in the begining
7514    -- to use everywhere.
7515 
7516    IF p_currency_code IS NULL THEN
7517             get_currency_code(
7518             p_carrier_id      =>   l_lane_info.carrier_id,
7519             x_currency_code   =>   l_currency_code,
7520             x_return_status   =>   l_return_status );  -- New API
7521 
7522            IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
7523              IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
7524                    FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'get_currency_code ');
7525                    raise FTE_FREIGHT_PRICING_UTIL.g_currency_code_failed;
7526               END IF;
7527            ELSE
7528             FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Currency code for carrier '||l_lane_info.carrier_id||' is : '||l_currency_code);
7529            END IF;
7530    ELSE
7531         l_currency_code := p_currency_code;
7532    END IF;
7533 
7534    FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,' Currency Code is = ' || l_currency_code);
7535 
7536    FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,' Rate Basis is =' || l_lane_info.basis);
7537 
7538    IF l_lane_info.basis = 'CONTAINER_ALL' THEN
7539 
7540      l_lane_info.service_type_code := l_service_type;
7541 
7542      FTE_FREIGHT_PRICING_SPECIAL.rate_container_all(
7543         p_lane_info			=> l_lane_info,
7544         p_top_level_rows          	=> p_shpmnt_toplevel_rows,
7545         p_save_flag               	=> p_save_flag,
7546         p_currency_code             => l_currency_code,
7547         x_freight_cost_main_price  	=> l_freight_cost_main_price,
7548         x_freight_cost_temp_price  	=> l_freight_cost_temp_price,
7549         x_freight_cost_main_charge 	=> l_freight_cost_main_charge,
7550         x_freight_cost_temp_charge 	=> l_freight_cost_temp_charge,
7551         x_fc_main_update_rows     	=> l_fc_main_update_rows,
7552         x_summary_lanesched_price  	=> x_summary_lanesched_price,
7553         x_summary_lanesched_price_uom 	=> x_summary_lanesched_price_uom,
7554         x_return_status           =>    l_return_status ) ;
7555 
7556          IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS
7557         and l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
7558           RAISE FND_API.G_EXC_ERROR;
7559          END IF;
7560 
7561    ELSE -- l_lane_info.basis <> 'CONTAINER_ALL'
7562 
7563        -- copy p_shpmnt_toplevel_rows to local l_shpmnt_toplevel_rows
7564        p := p_shpmnt_toplevel_rows.FIRST;
7565        IF p is NOT NULL THEN
7566        LOOP
7567           l_shpmnt_toplevel_rows(p) := p_shpmnt_toplevel_rows(p);
7568           EXIT WHEN p = p_shpmnt_toplevel_rows.LAST;
7569           p := p_shpmnt_toplevel_rows.NEXT(p);
7570        END LOOP;
7571        END IF;
7572 
7573 
7574        FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,' After copying top level rows ' );
7575 
7576     FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Service Type Code::=' || l_lane_info.service_type_code);
7577 
7578        process_shipment_pattern (
7579             p_classification_code     =>    l_lane_info.classification_code,
7580             p_lane_basis              =>    l_lane_info.basis,
7581             p_lane_id                 =>    l_lane_info.lane_id,
7582             p_carrier_id              =>    l_lane_info.carrier_id,
7583             p_service_code            =>    l_lane_info.service_type_code,
7584             --p_shpmnt_toplevel_rows    =>    p_shpmnt_toplevel_rows,
7585             p_shpmnt_toplevel_rows    =>    l_shpmnt_toplevel_rows,
7586             p_shpmnt_toplevel_charges =>    p_shpmnt_toplevel_charges,
7587             x_pricing_dual_instances  =>    l_pricing_dual_instances,
7588             x_pricing_engine_rows     =>    l_pricing_engine_rows,
7589             x_pattern_rows            =>    l_pattern_rows,
7590             x_pricing_attribute_rows  =>    l_pricing_attribute_rows,
7591             x_return_status           =>    l_return_status );
7592 
7593 
7594        FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,' After process_shipment_pattern ' );
7595 
7596        IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
7597           IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
7598               FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'process_shipment_pattern ');
7599               raise FTE_FREIGHT_PRICING_UTIL.g_shipment_pattern_failed;
7600           END IF;
7601        ELSE -- What happens if no new instance is created ? Exception ?
7602             -- already handled inside the called procedure
7603           FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,l_pricing_engine_rows.COUNT ||'engine rows created');
7604        END IF;
7605 
7606        IF FTE_FREIGHT_PRICING_SPECIAL.g_special_flags.lane_function = 'FLAT'
7607         AND FTE_FREIGHT_PRICING_SPECIAL.g_special_flags.flat_containerwt_flag = 'Y' THEN
7608 
7609          l_lane_info.service_type_code := l_service_type;
7610 
7611           FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,'Inside FlatRate');
7612 
7613          FTE_FREIGHT_PRICING_SPECIAL.process_shipment_flatrate(
7614         p_lane_info			=> l_lane_info,
7615             p_top_level_rows          	=> l_shpmnt_toplevel_rows,
7616             p_save_flag               	=> p_save_flag,
7617             p_currency_code             => l_currency_code,
7618             x_freight_cost_main_price  	=> l_freight_cost_main_price,
7619             x_freight_cost_temp_price  	=> l_freight_cost_temp_price,
7620             x_freight_cost_main_charge 	=> l_freight_cost_main_charge,
7621             x_freight_cost_temp_charge 	=> l_freight_cost_temp_charge,
7622             x_fc_main_update_rows     	=> l_fc_main_update_rows,
7623             x_summary_lanesched_price  	=> x_summary_lanesched_price,
7624             x_summary_lanesched_price_uom 	=> x_summary_lanesched_price_uom,
7625             x_return_status           =>    l_return_status ) ;
7626 
7627          IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS
7628         and l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
7629           RAISE FND_API.G_EXC_ERROR;
7630          END IF;
7631 
7632        ELSE
7633 
7634           FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,'Not in FlatRate');
7635            l_pricing_control_rec.pricing_event_num := G_LINE_EVENT_NUM;
7636            l_pricing_control_rec.currency_code     := l_currency_code;
7637            l_pricing_control_rec.lane_id           := l_lane_info.lane_id;
7638            l_pricing_control_rec.price_list_id     := l_lane_info.pricelist_id;
7639            l_pricing_control_rec.party_id          := l_lane_info.carrier_id;
7640 
7641            i := l_pricing_engine_rows.FIRST;
7642            j := l_pricing_attribute_rows.COUNT;
7643            LOOP
7644 
7645           j := j + 1;
7646              l_pricing_attribute_rows(j).attribute_index := j;
7647              l_pricing_attribute_rows(j).input_index     := l_pricing_engine_rows(i).input_index;
7648              l_pricing_attribute_rows(j).attribute_name  := 'ORIGIN_ZONE';
7649              l_pricing_attribute_rows(j).attribute_value := TO_CHAR(l_lane_info.origin_id);
7650           j := j + 1;
7651              l_pricing_attribute_rows(j).attribute_index := j;
7652              l_pricing_attribute_rows(j).input_index     := l_pricing_engine_rows(i).input_index;
7653              l_pricing_attribute_rows(j).attribute_name  := 'DESTINATION_ZONE';
7654              l_pricing_attribute_rows(j).attribute_value := TO_CHAR(l_lane_info.destination_id);
7655 
7656           IF l_service_type IS NOT NULL THEN
7657 
7658           j := j + 1;
7659              l_pricing_attribute_rows(j).attribute_index := j;
7660              l_pricing_attribute_rows(j).input_index     := l_pricing_engine_rows(i).input_index;
7661              l_pricing_attribute_rows(j).attribute_name  := 'SERVICE_TYPE';  --  Is it required always
7662              l_pricing_attribute_rows(j).attribute_value := l_service_type;
7663 
7664           END IF;
7665 
7666           -- logistics:total_quantity and volume:total_quantity are special cases,
7667           -- Assuming category, container_type,additional_services
7668           -- and hazard_code
7669           -- come from process_shipment_pattern
7670 
7671           EXIT WHEN i = l_pricing_engine_rows.LAST;
7672           i := l_pricing_engine_rows.NEXT(i);
7673 
7674        END LOOP;
7675 
7676       -- Print engine input details
7677 
7678        print_rolledup_lines (
7679             p_rolledup_lines          =>   g_rolledup_lines,
7680             x_return_status           =>   l_return_status );
7681 
7682        print_top_level_detail (
7683             --p_first_level_rows        =>    p_shpmnt_toplevel_rows,
7684             p_first_level_rows        =>    l_shpmnt_toplevel_rows,
7685             x_return_status           =>    l_return_status );
7686 
7687        print_top_level_pattern (
7688             p_pattern_rows            =>    l_pattern_rows,
7689             x_return_status           =>    l_return_status );
7690 
7691        print_dual_instances (
7692             p_dual_instances          =>    l_pricing_dual_instances,
7693             x_return_status           =>    l_return_status );
7694 
7695        print_engine_rows (
7696             p_engine_rows             =>    l_pricing_engine_rows,
7697             x_return_status           =>    l_return_status );
7698 
7699        print_attribute_rows (
7700             p_attribute_rows          =>    l_pricing_attribute_rows,
7701             x_return_status           =>    l_return_status );
7702 
7703       -- First prototype breakpoint
7704 
7705      FTE_FREIGHT_PRICING_SPECIAL.process_special_conditions(
7706             p_pricing_control_rec     =>     l_pricing_control_rec,
7707             --p_top_level_rows          =>     p_shpmnt_toplevel_rows,
7708             p_top_level_rows          =>     l_shpmnt_toplevel_rows,
7709             p_pattern_rows            =>     l_pattern_rows,
7710             p_pricing_dual_instances  =>     l_pricing_dual_instances,
7711             x_pricing_engine_rows     =>     l_pricing_engine_rows,
7712             x_pricing_attribute_rows  =>     l_pricing_attribute_rows ,
7713             x_qp_output_line_rows     =>     l_pricing_engine_output_lines,  -- line_index = input_index
7714             x_qp_output_detail_rows   =>     l_qp_output_line_details,
7715             x_return_status           =>     l_return_status );
7716 
7717        IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
7718           IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
7719               FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'process_special_conditions ');
7720               raise FTE_FREIGHT_PRICING_UTIL.g_special_conditions_failed;
7721           END IF;
7722        ELSE -- What happens if no QP output lines come back ? Exception ?
7723             -- already handled inside the called procedure
7724           FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,l_pricing_engine_output_lines.COUNT ||' QP output lines resulted ');
7725        END IF;
7726 
7727        print_qp_output_lines (
7728             p_engine_output_line             =>    l_pricing_engine_output_lines,
7729             p_engine_output_detail           =>    l_qp_output_line_details,
7730             p_return_status                  =>    l_return_status_text ,
7731             x_return_status                  =>    l_return_status );
7732 
7733        process_qp_output (
7734             p_qp_output_line_rows     =>    l_pricing_engine_output_lines,  -- line_index = input_index
7735             p_qp_output_detail_rows   =>    l_qp_output_line_details,
7736             p_pricing_engine_input    =>    l_pricing_engine_rows,
7737             p_pricing_dual_instances  =>    l_pricing_dual_instances,
7738             p_pattern_rows            =>    l_pattern_rows,
7739             --p_shpmnt_toplevel_rows    =>    p_shpmnt_toplevel_rows,      -- Indexed on delivery_detail_id
7740             p_shpmnt_toplevel_rows    =>    l_shpmnt_toplevel_rows,      -- Indexed on delivery_detail_id
7741             p_save_flag               =>    p_save_flag, -- Whether to save to TEMP table or MAIN table
7742             p_rate_basis              =>    l_lane_info.basis,
7743             x_freight_cost_main_price  =>   l_freight_cost_main_price,
7744             x_freight_cost_temp_price  =>   l_freight_cost_temp_price,
7745             x_freight_cost_main_charge =>   l_freight_cost_main_charge,
7746             x_freight_cost_temp_charge =>   l_freight_cost_temp_charge,
7747             x_fc_main_update_rows     =>    l_fc_main_update_rows,  -- For update of SUMMARY records
7748             x_summary_lanesched_price  =>    x_summary_lanesched_price,   -- Only in case of 'T'
7749             x_summary_lanesched_price_uom => x_summary_lanesched_price_uom,
7750             x_return_status           =>    l_return_status ) ;
7751 
7752        IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
7753           IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
7754               FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'process_qp_output');
7755               raise FTE_FREIGHT_PRICING_UTIL.g_process_qp_output_failed;
7756           END IF;
7757        ELSE -- What happens if no new fc records created ? Exception ?
7758             -- already handled inside the called procedure ?
7759           -- IF p_save_flag = 'T' THEN   --  Means  either lane/schedule has been passed in
7760           IF p_save_flag <> 'M' THEN   --  VVP (OM Est change)
7761              FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,l_freight_cost_temp_price.COUNT ||' FC temp price records resulted ');
7762              FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,l_freight_cost_temp_charge.COUNT ||' FC temp charge records resulted ');
7763           ELSIF p_save_flag = 'M' THEN   --  Means  either lane/schedule has been passed in
7764              FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,l_freight_cost_main_price.COUNT ||' FC main price records resulted ');
7765              FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,l_freight_cost_main_charge.COUNT ||' FC main charge records resulted ');
7766           END IF;
7767        END IF;
7768 
7769        END IF;  -- l_is_shipment_flatrate = 'N'
7770 
7771    END IF; -- l_lane_info.basis <> 'CONTAINER_ALL'
7772 
7773 
7774   --MDC Allocation
7775 
7776    Handle_MDC(
7777         p_save_flag=>p_save_flag,
7778         x_freight_cost_main_price  =>   l_freight_cost_main_price,
7779         x_freight_cost_temp_price  =>   l_freight_cost_temp_price,
7780         x_freight_cost_main_charge =>   l_freight_cost_main_charge,
7781         x_freight_cost_temp_charge =>   l_freight_cost_temp_charge,
7782         x_fc_main_update_rows     =>    l_fc_main_update_rows,  -- For update of SUMMARY records
7783         x_return_status           =>    l_return_status ) ;
7784 
7785    IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
7786       IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
7787           raise FTE_FREIGHT_PRICING_UTIL.g_MDC_handle_MDC;
7788       END IF;
7789    END IF;
7790 
7791 
7792    IF p_save_flag = 'M' THEN
7793 
7794    FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,'CHARGE');
7795    print_fc_main_rows (
7796         p_fc_main_rows            =>   l_freight_cost_main_charge,
7797         x_return_status           =>   l_return_status );
7798 
7799    FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,'BASE PRICE');
7800    print_fc_main_rows (
7801         p_fc_main_rows            =>   l_freight_cost_main_price,
7802         x_return_status           =>   l_return_status );
7803 
7804    ELSE
7805 
7806    FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,'CHARGE');
7807    print_fc_temp_rows (
7808         p_fc_temp_rows            =>   l_freight_cost_temp_charge,
7809         x_return_status           =>   l_return_status );
7810 
7811    FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,'BASE PRICE');
7812    print_fc_temp_rows (
7813         p_fc_temp_rows            =>   l_freight_cost_temp_price,
7814         x_return_status           =>   l_return_status );
7815 
7816    END IF;
7817 
7818 
7819    -- Insert one row at a time and get back the freight cost id
7820    -- create a table indexed on delivery detail id which stores the freight cost ids for the base price lines
7821    -- This table will then be used to populate applied_to_charge id for the charge record
7822 
7823    IF p_save_flag = 'T' THEN   --  Means  either lane/schedule has been passed in
7824 
7825       k := l_freight_cost_temp_price.FIRST;
7826       IF k is NOT NULL THEN
7827       LOOP
7828          l_freight_cost_temp_price(k).creation_date := SYSDATE;
7829          l_freight_cost_temp_price(k).created_by    := FND_GLOBAL.USER_ID;
7830          l_freight_cost_temp_price(k).last_update_date    := sysdate;
7831          l_freight_cost_temp_price(k).last_updated_by    := FND_GLOBAL.USER_ID;
7832          l_freight_cost_temp_price(k).last_update_login    := FND_GLOBAL.LOGIN_ID;
7833          l_freight_cost_temp_price(k).comparison_request_id := p_request_id;
7834 
7835          IF p_schedule_id IS NULL THEN
7836            l_freight_cost_temp_price(k).lane_id             := p_lane_id;   -- Need to insert schedule_id/lane_id
7837          ELSIF p_lane_id IS NULL THEN
7838            l_freight_cost_temp_price(k).schedule_id         := p_schedule_id;
7839          END IF;
7840 
7841          l_freight_cost_temp_price(k).moved_to_main_flag    := 'N';
7842          -- added for bug2741467
7843          l_freight_cost_temp_price(k).service_type_code     := l_service_type;
7844 
7845 
7846          -- pack J enhancement for FPA --
7847          IF ( l_freight_cost_temp_price(k).delivery_detail_id IS NOT NULL
7848               AND g_rolledup_lines.EXISTS(l_freight_cost_temp_price(k).delivery_detail_id)
7849               AND g_rolledup_lines(l_freight_cost_temp_price(k).delivery_detail_id).category_id
7850                    <> g_default_category_id )
7851          THEN
7852                l_freight_cost_temp_price(k).commodity_category_id
7853                  := g_rolledup_lines(l_freight_cost_temp_price(k).delivery_detail_id).category_id;
7854                FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,
7855                   'delivery_detail_id='||l_freight_cost_temp_price(k).delivery_detail_id
7856                    ||' commodity_category_id ='||l_freight_cost_temp_price(k).commodity_category_id);
7857          END IF;
7858 
7859 
7860 
7861    FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,'Reprinting BASE PRICE');
7862    print_fc_temp_rows (
7863         p_fc_temp_rows            =>   l_freight_cost_temp_price,
7864         x_return_status           =>   l_return_status );
7865 
7866 
7867 
7868          Create_Freight_Cost_Temp(
7869             p_freight_cost_temp_info =>  l_freight_cost_temp_price(k),
7870             x_freight_cost_temp_id   =>  l_freight_cost_temp_id,
7871             x_return_status          =>  l_return_status);
7872 
7873          IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
7874             IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
7875                 FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'Create_Freight_Cost_Temp Price');
7876                 raise FTE_FREIGHT_PRICING_UTIL.g_create_fc_temp_failed;
7877             END IF;
7878          END IF;
7879 
7880          IF l_freight_cost_temp_price(k).line_type_code <> 'SUMMARY' THEN
7881             l_freight_cost_temp_ids(l_freight_cost_temp_price(k).delivery_detail_id) := l_freight_cost_temp_id;
7882          END IF;
7883 
7884          EXIT WHEN k=l_freight_cost_temp_price.LAST;
7885          k := l_freight_cost_temp_price.NEXT(k);
7886       END LOOP;
7887       ELSE
7888          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,'No Temp fc base price record got created');
7889       END IF;
7890 
7891       n := l_freight_cost_temp_charge.FIRST;
7892       IF n IS NOT NULL THEN
7893       LOOP
7894          l_freight_cost_temp_charge(n).creation_date := SYSDATE;
7895          l_freight_cost_temp_charge(n).created_by    := FND_GLOBAL.USER_ID;
7896          l_freight_cost_temp_charge(n).last_update_date    := sysdate;
7897          l_freight_cost_temp_charge(n).last_updated_by    := FND_GLOBAL.USER_ID;
7898          l_freight_cost_temp_charge(n).last_update_login    := FND_GLOBAL.LOGIN_ID;
7899          l_freight_cost_temp_charge(n).comparison_request_id := p_request_id;
7900 
7901          IF p_schedule_id IS NULL THEN
7902            l_freight_cost_temp_charge(n).lane_id             := p_lane_id;   -- Need to insert schedule_id/lane_id
7903          ELSIF p_lane_id IS NULL THEN
7904            l_freight_cost_temp_charge(n).schedule_id         := p_schedule_id;
7905          END IF;
7906 
7907          l_freight_cost_temp_charge(n).applied_to_charge_id  := l_freight_cost_temp_ids(l_freight_cost_temp_charge(n).delivery_detail_id);
7908          l_freight_cost_temp_charge(n).moved_to_main_flag    := 'N';
7909          -- added for bug2741467
7910          l_freight_cost_temp_charge(n).service_type_code     := l_service_type;
7911 
7912          -- pack J enhancement for FPA --
7913          IF ( l_freight_cost_temp_charge(n).delivery_detail_id IS NOT NULL
7914               AND g_rolledup_lines.EXISTS(l_freight_cost_temp_charge(n).delivery_detail_id)
7915               AND g_rolledup_lines(l_freight_cost_temp_charge(n).delivery_detail_id).category_id
7916                    <> g_default_category_id )
7917          THEN
7918                l_freight_cost_temp_charge(n).commodity_category_id
7919                  := g_rolledup_lines(l_freight_cost_temp_charge(n).delivery_detail_id).category_id;
7920                FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,
7921                   'delivery_detail_id='||l_freight_cost_temp_charge(n).delivery_detail_id
7922                    ||' commodity_category_id ='||l_freight_cost_temp_charge(n).commodity_category_id);
7923          END IF;
7924 
7925 
7926          Create_Freight_Cost_Temp(
7927             p_freight_cost_temp_info =>  l_freight_cost_temp_charge(n),
7928             x_freight_cost_temp_id   =>  l_freight_cost_temp_id,
7929             x_return_status          =>  l_return_status);
7930 
7931          IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
7932             IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
7933                 FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'Create_Freight_Cost_Temp Charge');
7934                 raise FTE_FREIGHT_PRICING_UTIL.g_create_fc_temp_failed;
7935             END IF;
7936          END IF;
7937 
7938          EXIT WHEN n=l_freight_cost_temp_charge.LAST;
7939          n := l_freight_cost_temp_charge.NEXT(n);
7940       END LOOP;
7941       ELSE
7942          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,'No Temp fc charge record got created');
7943       END IF;
7944 
7945    ELSIF p_save_flag = 'M' THEN
7946 
7947       l := l_fc_main_update_rows.FIRST;
7948       IF l IS NOT NULL THEN
7949       LOOP
7950          -- For now
7951          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Update row delivery leg id : '||l_fc_main_update_rows(l).delivery_leg_id);
7952 
7953          l_fc_main_update_rows(l).last_update_date := sysdate;
7954          l_fc_main_update_rows(l).last_updated_by := FND_GLOBAL.USER_ID;
7955          l_fc_main_update_rows(l).last_update_login := FND_GLOBAL.LOGIN_ID;
7956       WSH_FREIGHT_COSTS_PVT.Update_Freight_Cost(
7957          p_rowid                  =>  l_rowid,
7958          p_freight_cost_info      =>  l_fc_main_update_rows(l),
7959          x_return_status          =>  l_return_status);
7960 
7961          IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
7962             IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
7963                 FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'Update_Freight_Cost');
7964                 raise FTE_FREIGHT_PRICING_UTIL.g_update_freight_cost_failed;
7965             ELSE
7966                 FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_WRN,'Update_Freight_Cost returned warning ');
7967             END IF;
7968          END IF;
7969 
7970          EXIT WHEN l=l_fc_main_update_rows.LAST;
7971          l := l_fc_main_update_rows.NEXT(l);
7972       END LOOP;
7973       FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Done Update_Freight_Cost ');
7974       ELSE
7975          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,'No Main fc update record got created');
7976       END IF;
7977 
7978       m := l_freight_cost_main_price.FIRST;
7979       IF m IS NOT NULL THEN
7980       LOOP
7981          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Create base price delivery detail id : '||l_freight_cost_main_price(m).delivery_detail_id);
7982          l_freight_cost_main_price(m).creation_date := SYSDATE;
7983          l_freight_cost_main_price(m).created_by    := FND_GLOBAL.USER_ID;
7984          l_freight_cost_main_price(m).last_update_date    := sysdate;
7985          l_freight_cost_main_price(m).last_updated_by    := FND_GLOBAL.USER_ID;
7986          l_freight_cost_main_price(m).last_update_login    := FND_GLOBAL.LOGIN_ID;
7987 
7988          -- pack J enhancement for FPA --
7989          IF ( l_freight_cost_main_price(m).delivery_detail_id IS NOT NULL
7990               AND g_rolledup_lines.EXISTS(l_freight_cost_main_price(m).delivery_detail_id)
7991               AND g_rolledup_lines(l_freight_cost_main_price(m).delivery_detail_id).category_id
7992                    <> g_default_category_id )
7993          THEN
7994                l_freight_cost_main_price(m).commodity_category_id
7995                  := g_rolledup_lines(l_freight_cost_main_price(m).delivery_detail_id).category_id;
7996                FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,
7997                   'delivery_detail_id='||l_freight_cost_main_price(m).delivery_detail_id
7998                    ||' commodity_category_id ='||l_freight_cost_main_price(m).commodity_category_id);
7999          END IF;
8000 
8001       WSH_FREIGHT_COSTS_PVT.Create_Freight_Cost(
8002          p_freight_cost_info      =>  l_freight_cost_main_price(m),
8003          x_rowid                  =>  l_rowid,
8004          x_freight_cost_id        =>  l_freight_cost_id,
8005          x_return_status          =>  l_return_status);
8006 
8007          IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
8008             IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
8009                 FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'Create_Freight_Cost Main Price');
8010                 raise FTE_FREIGHT_PRICING_UTIL.g_create_freight_cost_failed;
8011             END IF;
8012          END IF;
8013 
8014          IF l_freight_cost_main_price(m).line_type_code <> 'SUMMARY' THEN
8015             l_freight_cost_main_ids(l_freight_cost_main_price(m).delivery_detail_id) := l_freight_cost_id;
8016          END IF;
8017 
8018          EXIT WHEN m=l_freight_cost_main_price.LAST;
8019          m := l_freight_cost_main_price.NEXT(m);
8020       END LOOP;
8021       ELSE
8022          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,'No Main fc base price record got created');
8023       END IF;
8024 
8025       o := l_freight_cost_main_charge.FIRST;
8026       IF o IS NOT NULL THEN
8027       LOOP
8028          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Create charge delivery detail id : '||l_freight_cost_main_charge(o).delivery_detail_id);
8029          l_freight_cost_main_charge(o).creation_date := SYSDATE;
8030          l_freight_cost_main_charge(o).created_by    := FND_GLOBAL.USER_ID;
8031          l_freight_cost_main_charge(o).last_update_date    := sysdate;
8032          l_freight_cost_main_charge(o).last_updated_by    := FND_GLOBAL.USER_ID;
8033          l_freight_cost_main_charge(o).last_update_login    := FND_GLOBAL.LOGIN_ID;
8034          l_freight_cost_main_charge(o).applied_to_charge_id  := l_freight_cost_main_ids(l_freight_cost_main_charge(o).delivery_detail_id); -- For a delivery detail there is only one base price to which any charge gets applied to
8035 
8036          -- pack J enhancement for FPA --
8037          IF ( l_freight_cost_main_charge(o).delivery_detail_id IS NOT NULL
8038               AND g_rolledup_lines.EXISTS(l_freight_cost_main_charge(o).delivery_detail_id)
8039               AND g_rolledup_lines(l_freight_cost_main_charge(o).delivery_detail_id).category_id
8040                    <> g_default_category_id )
8041          THEN
8042                l_freight_cost_main_charge(o).commodity_category_id
8043                  := g_rolledup_lines(l_freight_cost_main_charge(o).delivery_detail_id).category_id;
8044                FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,
8045                   'delivery_detail_id='||l_freight_cost_main_charge(o).delivery_detail_id
8046                    ||' commodity_category_id ='||l_freight_cost_main_charge(o).commodity_category_id);
8047          END IF;
8048 
8049       WSH_FREIGHT_COSTS_PVT.Create_Freight_Cost(
8050          p_freight_cost_info      =>  l_freight_cost_main_charge(o),
8051          x_rowid                  =>  l_rowid,
8052          x_freight_cost_id        =>  l_freight_cost_id,
8053          x_return_status          =>  l_return_status);
8054 
8055          IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
8056             IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
8057                 FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'Create_Freight_Cost Main Charge');
8058                 raise FTE_FREIGHT_PRICING_UTIL.g_create_freight_cost_failed;
8059             END IF;
8060          END IF;
8061 
8062          EXIT WHEN o=l_freight_cost_main_charge.LAST;
8063          o := l_freight_cost_main_charge.NEXT(o);
8064       END LOOP;
8065       ELSE
8066          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,'No Main fc charge record got created');
8067       END IF;
8068 
8069    ELSIF  p_save_flag = 'P' THEN   -- pl/sql table (OM est)
8070 
8071       k := l_freight_cost_temp_price.FIRST;
8072       IF k is NOT NULL THEN
8073       LOOP
8074          -- pack J enhancement for FPA --
8075          IF ( l_freight_cost_temp_price(k).delivery_detail_id IS NOT NULL
8076               AND g_rolledup_lines.EXISTS(l_freight_cost_temp_price(k).delivery_detail_id)
8077               AND g_rolledup_lines(l_freight_cost_temp_price(k).delivery_detail_id).category_id
8078                    <> g_default_category_id )
8079          THEN
8080                l_freight_cost_temp_price(k).commodity_category_id
8081                  := g_rolledup_lines(l_freight_cost_temp_price(k).delivery_detail_id).category_id;
8082                FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,
8083                   'delivery_detail_id='||l_freight_cost_temp_price(k).delivery_detail_id
8084                    ||' commodity_category_id ='||l_freight_cost_temp_price(k).commodity_category_id);
8085          END IF;
8086 
8087          EXIT WHEN k=l_freight_cost_temp_price.LAST;
8088          k := l_freight_cost_temp_price.NEXT(k);
8089       END LOOP;
8090       ELSE
8091          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,'No Temp fc base price record got created');
8092       END IF;
8093 
8094       n := l_freight_cost_temp_charge.FIRST;
8095       IF n IS NOT NULL THEN
8096       LOOP
8097          -- pack J enhancement for FPA --
8098          IF ( l_freight_cost_temp_charge(n).delivery_detail_id IS NOT NULL
8099               AND g_rolledup_lines.EXISTS(l_freight_cost_temp_charge(n).delivery_detail_id)
8100               AND g_rolledup_lines(l_freight_cost_temp_charge(n).delivery_detail_id).category_id
8101                    <> g_default_category_id )
8102          THEN
8103                l_freight_cost_temp_charge(n).commodity_category_id
8104                  := g_rolledup_lines(l_freight_cost_temp_charge(n).delivery_detail_id).category_id;
8105                FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,
8106                   'delivery_detail_id='||l_freight_cost_temp_charge(n).delivery_detail_id
8107                    ||' commodity_category_id ='||l_freight_cost_temp_charge(n).commodity_category_id);
8108          END IF;
8109 
8110          EXIT WHEN n=l_freight_cost_temp_charge.LAST;
8111          n := l_freight_cost_temp_charge.NEXT(n);
8112       END LOOP;
8113       ELSE
8114          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,'No Temp fc charge record got created');
8115       END IF;
8116 
8117    END IF;
8118 
8119    x_freight_cost_temp_price := l_freight_cost_temp_price;
8120    x_freight_cost_temp_charge := l_freight_cost_temp_charge;
8121 
8122    FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_pricing');
8123 
8124 EXCEPTION
8125    WHEN FND_API.G_EXC_ERROR THEN
8126         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8127         FTE_FREIGHT_PRICING_UTIL.set_exception('process_shipment_pattern',FTE_FREIGHT_PRICING_UTIL.G_ERR,'FND_API.G_EXC_ERROR');
8128         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_pricing');
8129 
8130 
8131 
8132    WHEN FTE_FREIGHT_PRICING_UTIL.g_MDC_handle_MDC THEN
8133         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8134         FTE_FREIGHT_PRICING_UTIL.set_exception('shipment_pricing',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_MDC_handle_MDC');
8135         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_pricing');
8136 
8137    WHEN FTE_FREIGHT_PRICING_UTIL.g_no_lanesched_seg THEN
8138         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8139         FTE_FREIGHT_PRICING_UTIL.set_exception('shipment_pricing',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_no_lanesched_seg');
8140         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_pricing');
8141    WHEN FTE_FREIGHT_PRICING_UTIL.g_no_lane_info THEN
8142         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8143         FTE_FREIGHT_PRICING_UTIL.set_exception('shipment_pricing',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_no_lane_info');
8144         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_pricing');
8145    WHEN FTE_FREIGHT_PRICING_UTIL.g_no_segment_service_type THEN
8146         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8147         FTE_FREIGHT_PRICING_UTIL.set_exception('shipment_pricing',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_no_segment_service_type');
8148         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_pricing');
8149    WHEN FTE_FREIGHT_PRICING_UTIL.g_currency_code_failed THEN
8150         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8151         FTE_FREIGHT_PRICING_UTIL.set_exception('shipment_pricing',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_currency_code_failed');
8152         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_pricing');
8153    WHEN FTE_FREIGHT_PRICING_UTIL.g_shipment_pattern_failed THEN
8154         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8155         FTE_FREIGHT_PRICING_UTIL.set_exception('shipment_pricing',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_shipment_pattern_failed');
8156         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_pricing');
8157    WHEN FTE_FREIGHT_PRICING_UTIL.g_special_conditions_failed THEN
8158         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8159         FTE_FREIGHT_PRICING_UTIL.set_exception('shipment_pricing',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_special_conditions_failed');
8160         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_pricing');
8161    WHEN FTE_FREIGHT_PRICING_UTIL.g_process_qp_output_failed THEN
8162         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8163         FTE_FREIGHT_PRICING_UTIL.set_exception('shipment_pricing',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_process_qp_output_failed');
8164         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_pricing');
8165    WHEN FTE_FREIGHT_PRICING_UTIL.g_create_fc_temp_failed THEN
8166         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8167         FTE_FREIGHT_PRICING_UTIL.set_exception('shipment_pricing',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_create_fc_temp_failed');
8168         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_pricing');
8169    WHEN FTE_FREIGHT_PRICING_UTIL.g_update_freight_cost_failed THEN
8170         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8171         FTE_FREIGHT_PRICING_UTIL.set_exception('shipment_pricing',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_update_freight_cost_failed');
8172         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_pricing');
8173    WHEN FTE_FREIGHT_PRICING_UTIL.g_create_freight_cost_failed THEN
8174         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8175         FTE_FREIGHT_PRICING_UTIL.set_exception('shipment_pricing',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_create_freight_cost_failed');
8176         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_pricing');
8177    WHEN others THEN
8178         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
8179         FTE_FREIGHT_PRICING_UTIL.set_exception('shipment_pricing',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
8180         --FTE_FREIGHT_PRICING_UTIL.print_debug('Unexpected Error : '||SQLCODE||' : '||SQLERRM);
8181         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
8182         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_pricing');
8183 
8184 END shipment_pricing;
8185 
8186 --      This procedure looks up the delivery lines in g_shipment_line_rows and
8187 --      creates a table of delivery lines after flattening out the hierarchy to
8188 --      only one level under the delivery
8189 
8190 PROCEDURE flatten_shipment (
8191         p_delivery_leg_id         IN     NUMBER DEFAULT NULL,    --  Not required
8192         x_first_level_rows        OUT NOCOPY     shpmnt_content_tab_type, -- Will get indexed on delivery_detail_id
8193         x_return_status           OUT NOCOPY     VARCHAR2 )
8194 IS
8195    CURSOR c_get_msi_attribs(c_inv_item_id IN NUMBER) IS
8196    SELECT unit_length,unit_width,unit_height,dimension_uom_code,
8197           unit_weight,weight_uom_code,unit_volume,volume_uom_code
8198    FROM   mtl_system_items
8199    WHERE  inventory_item_id = c_inv_item_id;
8200 
8201  -- Bug 2980373 (Front port from 115.27.1158.2) --
8202    CURSOR c_get_def_uoms (c_organization_id IN NUMBER) IS
8203    SELECT uomw.uom_code weight_uom, uomv.uom_code volume_uom
8204    FROM   mtl_units_of_measure uomw,
8205           mtl_units_of_measure uomv,
8206           wsh_shipping_parameters wsp
8207    WHERE  wsp.weight_uom_class = uomw.uom_class
8208    AND    wsp.volume_uom_class = uomv.uom_class
8209    AND    uomw.base_uom_flag='Y'
8210    AND    uomv.base_uom_flag='Y'
8211    AND    wsp.organization_id = c_organization_id;
8212 
8213    i                          NUMBER;
8214    l_msi_attrib_rec           c_get_msi_attribs%rowtype;
8215 
8216     l_log_level     NUMBER := FTE_FREIGHT_PRICING_UTIL.G_DBG;
8217 
8218 BEGIN
8219    x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
8220    FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
8221    FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,'flatten_shipment','start');
8222 
8223    FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'g_shipment_line_rows COUNT : '||g_shipment_line_rows.COUNT);
8224 
8225    i := g_shipment_line_rows.FIRST;
8226    LOOP
8227 
8228       -- Bug 2980373 (front port) --
8229       -- clear out record before every iteration
8230       l_msi_attrib_rec.unit_weight := null;
8231       l_msi_attrib_rec.weight_uom_code := null;
8232       l_msi_attrib_rec.unit_volume := null;
8233       l_msi_attrib_rec.volume_uom_code := null;
8234       l_msi_attrib_rec.dimension_uom_code := null;
8235       l_msi_attrib_rec.unit_length := null;
8236       l_msi_attrib_rec.unit_width := null;
8237       l_msi_attrib_rec.unit_height := null;
8238 
8239 
8240       FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Delivery leg Id : '||g_shipment_line_rows(i).delivery_leg_id);
8241 
8242       IF (p_delivery_leg_id IS NOT NULL) AND (g_shipment_line_rows(i).delivery_leg_id <> p_delivery_leg_id) THEN
8243          goto nextpass;
8244       END IF;
8245 
8246       FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Delivery leg Id : '||g_shipment_line_rows(i).delivery_leg_id);
8247       FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Delivery Detail Id : '||g_shipment_line_rows(i).delivery_detail_id);
8248 
8249       -- inventory_item_id can be null on delivery details for various reasons :
8250       -- 1) FTE J estimate rate
8251       -- 2) FTE J one-time items (OKE, inbound)
8252       -- 3) WMS containers (logical groupings) - bug 2980373
8253 
8254       IF g_shipment_line_rows(i).parent_delivery_detail_id IS NULL THEN    -- Top level delivery line
8255          x_first_level_rows(i).content_id := g_shipment_line_rows(i).delivery_detail_id;
8256          x_first_level_rows(i).delivery_leg_id := g_shipment_line_rows(i).delivery_leg_id;
8257          x_first_level_rows(i).container_type_code := g_shipment_line_rows(i).container_type_code;
8258          x_first_level_rows(i).wdd_weight_uom_code := g_shipment_line_rows(i).weight_uom_code;
8259          x_first_level_rows(i).wdd_volume_uom_code := g_shipment_line_rows(i).volume_uom_code;
8260          x_first_level_rows(i).wdd_net_weight 	   := g_shipment_line_rows(i).net_weight;
8261          x_first_level_rows(i).wdd_gross_weight    := g_shipment_line_rows(i).gross_weight;
8262          x_first_level_rows(i).wdd_volume 	   := g_shipment_line_rows(i).volume;
8263 
8264 	IF g_shipment_line_rows(i).gross_weight is NULL
8265 		or g_shipment_line_rows(i).net_weight is NULL THEN
8266           x_first_level_rows(i).wdd_tare_weight := 0;
8267 	ELSIF g_shipment_line_rows(i).gross_weight <= g_shipment_line_rows(i).net_weight THEN
8268           x_first_level_rows(i).wdd_tare_weight := 0;
8269 	ELSE
8270           x_first_level_rows(i).wdd_tare_weight :=
8271 	    g_shipment_line_rows(i).gross_weight - g_shipment_line_rows(i).net_weight;
8272 	END IF;
8273 
8274         -- branching added to handle null inventory_item_id
8275          IF (g_shipment_line_rows(i).inventory_item_id IS NOT NULL ) THEN
8276             OPEN c_get_msi_attribs(g_shipment_line_rows(i).inventory_item_id);
8277             FETCH c_get_msi_attribs INTO l_msi_attrib_rec;
8278             CLOSE c_get_msi_attribs;
8279             IF (l_msi_attrib_rec.unit_weight is null) THEN
8280               FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Warning : Item weight is null ');
8281             END IF;
8282          ELSE
8283             FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Inventory_item_id is null');
8284          END IF;
8285 
8286          -- Following fields are obtained from msi
8287          x_first_level_rows(i).dim_uom := l_msi_attrib_rec.dimension_uom_code;
8288          x_first_level_rows(i).length := l_msi_attrib_rec.unit_length;
8289          x_first_level_rows(i).width := l_msi_attrib_rec.unit_width;
8290          x_first_level_rows(i).height := l_msi_attrib_rec.unit_height;
8291 
8292          IF g_shipment_line_rows(i).container_flag = 'N' THEN -- Loose item
8293 
8294            x_first_level_rows(i).container_flag := 'N';
8295            --x_first_level_rows(i).gross_weight := g_shipment_line_rows(i).gross_weight;
8296            x_first_level_rows(i).gross_weight := nvl(g_shipment_line_rows(i).net_weight,g_shipment_line_rows(i).gross_weight);
8297            x_first_level_rows(i).weight_uom := g_shipment_line_rows(i).weight_uom_code;
8298            x_first_level_rows(i).volume := g_shipment_line_rows(i).volume;
8299            x_first_level_rows(i).volume_uom := g_shipment_line_rows(i).volume_uom_code;
8300 
8301          ELSE  --  Top level container
8302 
8303            x_first_level_rows(i).container_flag := 'Y';
8304            IF (g_shipment_line_rows(i).inventory_item_id IS NOT NULL ) THEN
8305              x_first_level_rows(i).gross_weight := l_msi_attrib_rec.unit_weight;  -- Container Item's unit weight
8306              x_first_level_rows(i).weight_uom := l_msi_attrib_rec.weight_uom_code;
8307              x_first_level_rows(i).volume := l_msi_attrib_rec.unit_volume;
8308              x_first_level_rows(i).volume_uom := l_msi_attrib_rec.volume_uom_code;
8309            ELSE
8310              -- Bug 2980373 (front port) --
8311              -- get default uoms for the organization and set weight/volume to 0
8312              OPEN c_get_def_uoms (g_shipment_line_rows(i).organization_id);
8313              FETCH c_get_def_uoms INTO l_msi_attrib_rec.weight_uom_code,
8314                                        l_msi_attrib_rec.volume_uom_code;
8315              CLOSE c_get_def_uoms;
8316 
8317              IF (l_msi_attrib_rec.weight_uom_code IS NULL
8318                  OR l_msi_attrib_rec.weight_uom_code IS NULL ) THEN
8319                  FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Warning : Shipping parameters - default weight / volume class missing');
8320              END IF;
8321              x_first_level_rows(i).gross_weight := 0;
8322              x_first_level_rows(i).weight_uom := l_msi_attrib_rec.weight_uom_code;
8323              x_first_level_rows(i).volume := 0;
8324              x_first_level_rows(i).volume_uom := l_msi_attrib_rec.volume_uom_code;
8325            END IF;
8326 
8327          END IF;
8328 
8329       END IF;
8330 
8331       <<nextpass>>
8332 
8333         EXIT WHEN i=g_shipment_line_rows.LAST;
8334         i := g_shipment_line_rows.NEXT(i);
8335 
8336    END LOOP;
8337    FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Exit loop ');
8338    FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'flatten_shipment');
8339 
8340 EXCEPTION
8341    WHEN others THEN
8342         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
8343         FTE_FREIGHT_PRICING_UTIL.set_exception('flatten_shipment',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
8344         --FTE_FREIGHT_PRICING_UTIL.print_debug('Unexpected Error : '||SQLCODE||' : '||SQLERRM);
8345         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
8346         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'flatten_shipment');
8347 END flatten_shipment;
8348 
8349 PROCEDURE get_top_level_charges (
8350         p_first_level_rows        IN    shpmnt_content_tab_type, -- Will get indexed on delivery_detail_id
8351         x_shpmnt_toplevel_charges OUT NOCOPY    addl_services_tab_type, -- Top level additional services
8352         x_return_status           OUT NOCOPY    VARCHAR2 )
8353 IS
8354    CURSOR c_get_services(c_delivery_detail_id IN NUMBER) IS
8355    SELECT DISTINCT wfct.freight_cost_type_code,wfct.freight_cost_type_id
8356    FROM   wsh_freight_cost_types     wfct,
8357           wsh_freight_costs          wfc
8358    WHERE  wfc.delivery_detail_id   = c_delivery_detail_id
8359    AND    wfc.charge_source_code   = 'REQUESTED'
8360    AND    wfc.freight_cost_type_id = wfct.freight_cost_type_id;
8361 
8362    i                         NUMBER:=0;
8363    l_service_line_index      NUMBER:=0;
8364    l_freight_cost_type_id    NUMBER:=0;
8365    l_freight_cost_type_code  VARCHAR2(200);
8366 
8367     l_log_level     NUMBER := FTE_FREIGHT_PRICING_UTIL.G_DBG;
8368 
8369 BEGIN
8370 
8371    x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
8372    FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
8373    FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,'get_top_level_charges','start');
8374 
8375    i := p_first_level_rows.FIRST;
8376    LOOP
8377 
8378       OPEN c_get_services(p_first_level_rows(i).content_id);
8379       LOOP
8380          FETCH c_get_services INTO l_freight_cost_type_code,l_freight_cost_type_id;
8381          EXIT  WHEN c_get_services%NOTFOUND;
8382 
8383          l_service_line_index := l_service_line_index + 1;
8384          x_shpmnt_toplevel_charges(l_service_line_index).service_line_index := l_service_line_index;
8385          x_shpmnt_toplevel_charges(l_service_line_index).content_id := p_first_level_rows(i).content_id;
8386          x_shpmnt_toplevel_charges(l_service_line_index).freight_cost_type_code := l_freight_cost_type_code;
8387          x_shpmnt_toplevel_charges(l_service_line_index).freight_cost_type_id := l_freight_cost_type_id;
8388 
8389       END LOOP;
8390       CLOSE c_get_services;
8391 
8392       EXIT WHEN i=p_first_level_rows.LAST;
8393       i := p_first_level_rows.NEXT(i);
8394    END LOOP;
8395    FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'get_top_level_charges');
8396 
8397 EXCEPTION
8398    WHEN others THEN
8399         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
8400         FTE_FREIGHT_PRICING_UTIL.set_exception('get_top_level_charges',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
8401         --FTE_FREIGHT_PRICING_UTIL.print_debug('Unexpected Error : '||SQLCODE||' : '||SQLERRM);
8402         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
8403         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'get_top_level_charges');
8404 END get_top_level_charges;
8405 
8406 -- Public Procedures
8407 
8408 FUNCTION is_consolidated (
8409         p_segment_id              IN     NUMBER ) RETURN BOOLEAN
8410 IS
8411     -- CURSOR c_get_consolidate_flag IS
8412     -- SELECT nvl(consolidation_allowed,'N')
8413     -- FROM   wsh_trips
8414     -- WHERE  trip_id = p_segment_id;
8415 
8416   CURSOR c_get_lane_function IS
8417   SELECT nvl(value_from, 'NONE')
8418   FROM wsh_trips a, fte_prc_parameters b
8419   WHERE a.trip_id = p_segment_id
8420   AND   a.lane_id = b.lane_id
8421   AND   b.parameter_id = 1;
8422 
8423     l_consolidation_allowed    VARCHAR2(1);
8424     --Bug 12964037: Removed referring FTE.
8425     l_lane_function	FTE_PRC_PARAMETERS.VALUE_FROM%TYPE;
8426     l_log_level     NUMBER := FTE_FREIGHT_PRICING_UTIL.G_DBG;
8427 
8428 BEGIN
8429 
8430     FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
8431     FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,'is_consolidated','start');
8432 
8433     -- OPEN c_get_consolidate_flag;
8434     -- FETCH c_get_consolidate_flag INTO l_consolidation_allowed;
8435     -- CLOSE c_get_consolidate_flag;
8436 
8437     -- IF l_consolidation_allowed = 'Y' THEN
8438     -- FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'is_consolidated');
8439     --    RETURN TRUE;
8440     -- ELSE
8441     -- FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'is_consolidated');
8442     --    RETURN FALSE;
8443     -- END IF;
8444 
8445     -- *** FTE J --
8446     -- Always return TRUE
8447     -- original code to look at trips commented out
8448 
8449     -- J+ delivery flat rating
8450 
8451     OPEN c_get_lane_function;
8452     FETCH c_get_lane_function INTO l_lane_function;
8453     CLOSE c_get_lane_function;
8454 
8455     IF l_lane_function = 'FLAT' THEN
8456       FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'is_consolidated');
8457       RETURN FALSE;
8458     ELSE
8459       FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'is_consolidated');
8460       RETURN TRUE;
8461     END IF;
8462 EXCEPTION
8463    WHEN others THEN
8464         --x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
8465         FTE_FREIGHT_PRICING_UTIL.set_exception('is_consolidated',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
8466         --FTE_FREIGHT_PRICING_UTIL.print_debug('Unexpected Error : '||SQLCODE||' : '||SQLERRM);
8467         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
8468         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'is_consolidated');
8469 END  is_consolidated;
8470 
8471 FUNCTION get_segment_from_dleg (
8472         p_delivery_leg_id         IN     NUMBER ) RETURN NUMBER
8473 IS
8474     CURSOR c_get_segment IS
8475     SELECT wt.trip_id
8476     FROM   wsh_trips wt,
8477            wsh_delivery_legs  wdl,
8478            wsh_trip_stops wts1,
8479            wsh_trip_stops wts2
8480     WHERE  wts1.stop_id = wdl.pick_up_stop_id
8481     AND    wts2.stop_id = wdl.drop_off_stop_id
8482     AND    wts1.trip_id = wt.trip_id
8483     and    wts2.trip_id = wt.trip_id
8484     AND    wdl.delivery_leg_id = p_delivery_leg_id;
8485 
8486     l_segment_id    NUMBER;
8487 
8488     l_log_level     NUMBER := FTE_FREIGHT_PRICING_UTIL.G_DBG;
8489 
8490 BEGIN
8491 
8492     FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
8493     FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,'get_segment_from_dleg','start');
8494     OPEN c_get_segment;
8495     FETCH c_get_segment INTO l_segment_id;
8496     CLOSE c_get_segment;
8497 
8498     FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'get_segment_from_dleg');
8499     RETURN l_segment_id;
8500 
8501 EXCEPTION
8502    WHEN others THEN
8503         --x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
8504         FTE_FREIGHT_PRICING_UTIL.set_exception('get_segment_from_dleg',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
8505         --FTE_FREIGHT_PRICING_UTIL.print_debug('Unexpected Error : '||SQLCODE||' : '||SQLERRM);
8506         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
8507         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'get_segment_from_dleg');
8508 END get_segment_from_dleg;
8509 
8510 FUNCTION get_delivery_from_dleg (
8511         p_delivery_leg_id         IN     NUMBER ) RETURN NUMBER
8512 IS
8513     CURSOR c_get_delivery IS
8514     SELECT delivery_id
8515     FROM   wsh_delivery_legs
8516     WHERE  delivery_leg_id = p_delivery_leg_id;
8517 
8518     l_delivery_id    NUMBER;
8519 
8520     l_log_level     NUMBER := FTE_FREIGHT_PRICING_UTIL.G_DBG;
8521 
8522 BEGIN
8523 
8524     FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
8525     FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,'get_delivery_from_dleg','start');
8526 
8527     OPEN c_get_delivery;
8528     FETCH c_get_delivery INTO l_delivery_id;
8529     CLOSE c_get_delivery;
8530 
8531     FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'get_delivery_from_dleg');
8532     RETURN l_delivery_id;
8533 
8534 EXCEPTION
8535    WHEN others THEN
8536         --x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
8537         FTE_FREIGHT_PRICING_UTIL.set_exception('get_delivery_from_dleg',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
8538         --FTE_FREIGHT_PRICING_UTIL.print_debug('Unexpected Error : '||SQLCODE||' : '||SQLERRM);
8539         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
8540         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'get_delivery_from_dleg');
8541 END get_delivery_from_dleg;
8542 
8543 FUNCTION get_fc_id_from_dleg (
8544         p_delivery_leg_id         IN     NUMBER ) RETURN NUMBER
8545 IS
8546 
8547     CURSOR c_get_freight_cost_id IS
8548     SELECT freight_cost_id
8549     FROM   wsh_freight_costs
8550     WHERE  delivery_leg_id = p_delivery_leg_id
8551     AND delivery_detail_id IS NULL
8552     AND    line_type_code  = 'SUMMARY';
8553 
8554     l_freight_cost_id    NUMBER;
8555 
8556     l_log_level     NUMBER := FTE_FREIGHT_PRICING_UTIL.G_DBG;
8557 
8558 BEGIN
8559 
8560     FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
8561     FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,'get_fc_id_from_dleg','start');
8562 
8563 
8564     FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'DLEG ID:'||p_delivery_leg_id);
8565 
8566     OPEN c_get_freight_cost_id;
8567     FETCH c_get_freight_cost_id INTO l_freight_cost_id;
8568     CLOSE c_get_freight_cost_id;
8569 
8570     FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'FC ID:'||l_freight_cost_id);
8571 
8572     FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'get_fc_id_from_dleg');
8573     RETURN l_freight_cost_id;
8574 
8575 EXCEPTION
8576    WHEN others THEN
8577         --x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
8578         FTE_FREIGHT_PRICING_UTIL.set_exception('get_fc_id_from_dleg',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
8579         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
8580         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'get_fc_id_from_dleg');
8581 END get_fc_id_from_dleg;
8582 
8583 PROCEDURE delete_invalid_fc_recs (
8584      p_segment_id      IN  NUMBER DEFAULT NULL,
8585      p_delivery_leg_id IN  NUMBER DEFAULT NULL,
8586      x_return_status   OUT NOCOPY  VARCHAR2 )
8587 IS
8588 
8589     l_log_level     NUMBER := FTE_FREIGHT_PRICING_UTIL.G_DBG;
8590 
8591 
8592 
8593     CURSOR c_lock_wfc_1(c_segment_id NUMBER)
8594     IS
8595 
8596 	SELECT wfc.freight_cost_id
8597 	FROM wsh_freight_costs wfc,
8598 	     wsh_delivery_legs dl ,
8599 	     wsh_trip_stops s
8600 	WHERE wfc.delivery_leg_id = dl.delivery_leg_id
8601 	      and dl.pick_up_stop_id=s.stop_id
8602 	      and s.trip_id=c_segment_id
8603 	      and wfc.charge_source_code='PRICING_ENGINE'
8604 	FOR UPDATE OF wfc.freight_cost_id NOWAIT;
8605 
8606     CURSOR c_lock_wfc_2(c_delivery_leg_id NUMBER)
8607     IS
8608     SELECT wfc.freight_cost_id
8609     FROM wsh_freight_costs wfc
8610     WHERE  wfc.delivery_leg_id = c_delivery_leg_id
8611     AND    charge_source_code = 'PRICING_ENGINE'
8612     FOR UPDATE NOWAIT;
8613 
8614 
8615     l_wfc_detail_ids DBMS_UTILITY.NUMBER_ARRAY;
8616     l_wfc_dleg_ids DBMS_UTILITY.NUMBER_ARRAY;
8617 
8618 
8619 BEGIN
8620 
8621    x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
8622    FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
8623    FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,'delete_invalid_fc_recs','start');
8624 
8625    -- Here determine if a trip has been passed or a delivery leg
8626 
8627    IF p_segment_id IS NULL AND p_delivery_leg_id IS NULL THEN
8628 
8629       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8630       FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'delete_invalid_fc_recs');
8631       RETURN;
8632 
8633    ELSIF p_delivery_leg_id IS NULL THEN
8634 
8635        OPEN c_lock_wfc_1(p_segment_id);
8636        FETCH c_lock_wfc_1 BULK COLLECT INTO l_wfc_detail_ids;
8637        CLOSE c_lock_wfc_1;
8638 
8639 	IF (l_wfc_detail_ids.FIRST IS NOT NULL)
8640 	THEN
8641 
8642 		FORALL i IN l_wfc_detail_ids.FIRST..l_wfc_detail_ids.LAST
8643 		       DELETE
8644 		       FROM   wsh_freight_costs wfc
8645 		       WHERE  wfc.freight_cost_id = l_wfc_detail_ids(i)
8646 		       AND    (line_type_code <> 'SUMMARY'
8647 			      OR (line_type_code = 'SUMMARY' AND delivery_detail_id IS NOT NULL));
8648 
8649 		FORALL i IN l_wfc_detail_ids.FIRST..l_wfc_detail_ids.LAST
8650 
8651 		       UPDATE wsh_freight_costs wfc
8652 		       SET  unit_amount=NULL,
8653 			    total_amount=NULL,
8654 			    currency_code=NULL
8655 		       WHERE  wfc.freight_cost_id=l_wfc_detail_ids(i)
8656 		       AND    line_type_code = 'SUMMARY'
8657 		       AND    delivery_detail_id IS NULL;
8658 
8659 	END IF;
8660 
8661    ELSIF p_segment_id IS NULL THEN
8662 
8663        OPEN c_lock_wfc_2(p_delivery_leg_id);
8664        FETCH c_lock_wfc_2 BULK COLLECT INTO l_wfc_dleg_ids;
8665        CLOSE c_lock_wfc_2;
8666 
8667 	IF ( l_wfc_dleg_ids.FIRST IS NOT NULL)
8668 	THEN
8669 
8670 		FORALL i IN l_wfc_dleg_ids.FIRST..l_wfc_dleg_ids.LAST
8671 		       DELETE
8672 		       FROM   wsh_freight_costs wfc
8673 		       WHERE  wfc.freight_cost_id=l_wfc_dleg_ids(i)
8674 		       AND    (line_type_code <> 'SUMMARY'
8675 			      OR (line_type_code = 'SUMMARY' AND delivery_detail_id IS NOT NULL));
8676 
8677 
8678 		FORALL i IN l_wfc_dleg_ids.FIRST..l_wfc_dleg_ids.LAST
8679 		       UPDATE wsh_freight_costs wfc
8680 		       SET  unit_amount=NULL,
8681 			    total_amount=NULL,
8682 			    currency_code=NULL
8683 		       WHERE   wfc.freight_cost_id=l_wfc_dleg_ids(i)
8684 		       AND  line_type_code = 'SUMMARY'
8685 		       AND  delivery_detail_id IS NULL;
8686 
8687 
8688 
8689 	END IF;
8690 
8691 
8692 
8693    END IF;
8694    FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'delete_invalid_fc_recs');
8695 
8696 EXCEPTION
8697    WHEN others THEN
8698         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
8699         FTE_FREIGHT_PRICING_UTIL.set_exception('delete_invalid_fc_recs',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
8700         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
8701         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'delete_invalid_fc_recs');
8702 END delete_invalid_fc_recs;
8703 
8704 PROCEDURE unmark_reprice_required (
8705      p_segment_id      IN  NUMBER DEFAULT NULL,
8706      p_delivery_leg_id IN  NUMBER DEFAULT NULL,
8707      x_return_status   OUT NOCOPY  VARCHAR2 )
8708 IS
8709 
8710     l_log_level     NUMBER := FTE_FREIGHT_PRICING_UTIL.G_DBG;
8711 
8712 BEGIN
8713 
8714    x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
8715    FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
8716    FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,'unmark_reprice_required','start');
8717 
8718    -- Here determine if a trip has been passed or a delivery leg
8719 
8720    IF p_segment_id IS NULL AND p_delivery_leg_id IS NULL THEN
8721 
8722       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8723       FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'unmark_reprice_required');
8724       RETURN;
8725 
8726    ELSIF p_delivery_leg_id IS NULL THEN
8727 
8728        UPDATE wsh_delivery_legs
8729        SET    reprice_required = 'N'
8730        WHERE  delivery_leg_id IN (
8731               SELECT wdl.delivery_leg_id
8732               FROM   wsh_delivery_legs wdl,
8733                      wsh_trips         wt,
8734                      wsh_trip_stops    wts1,
8735                      wsh_trip_stops    wts2
8736               WHERE  wt.trip_id     = wts1.trip_id
8737               AND    wt.trip_id     = wts2.trip_id
8738               AND    wts1.stop_id   = wdl.pick_up_stop_id
8739               AND    wts2.stop_id   = wdl.drop_off_stop_id
8740               AND    wt.trip_id     = p_segment_id );
8741 
8742    ELSIF p_segment_id IS NULL THEN
8743 
8744        UPDATE wsh_delivery_legs
8745        SET    reprice_required = 'N'
8746        WHERE  delivery_leg_id = p_delivery_leg_id;
8747 
8748    END IF;
8749    FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'unmark_reprice_required');
8750 
8751 EXCEPTION
8752    WHEN others THEN
8753         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
8754         FTE_FREIGHT_PRICING_UTIL.set_exception('unmark_reprice_required',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
8755         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
8756         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'unmark_reprice_required');
8757 END unmark_reprice_required;
8758 
8759 PROCEDURE shipment_price_consolidate (
8760         p_delivery_leg_id         IN     NUMBER DEFAULT NULL,    --  Gets either Dleg or wsh trip
8761         p_segment_id              IN     NUMBER DEFAULT NULL,
8762         p_check_reprice_flag      IN     VARCHAR2 DEFAULT 'N',
8763         x_return_status           OUT NOCOPY     VARCHAR2 )
8764 IS
8765 
8766    CURSOR c_delivery_from_trip(c_trip_id IN NUMBER) IS
8767    Select wdd.delivery_detail_id,
8768           wda.delivery_id,
8769           wdl.delivery_leg_id,
8770           nvl(wdl.reprice_required,'N') as reprice_required,  --  Added AG 05/10
8771           wda.parent_delivery_detail_id,
8772           wdd.customer_id             ,
8773           wdd.sold_to_contact_id    ,
8774           wdd.inventory_item_id    ,
8775           wdd.item_description    ,
8776           wdd.hazard_class_id    ,
8777           wdd.country_of_origin ,
8778           wdd.classification   ,
8779           wdd.requested_quantity             ,
8780           wdd.requested_quantity_uom        ,
8781           wdd.master_container_item_id     ,
8782           wdd.detail_container_item_id    ,
8783           wdd.customer_item_id           ,
8784           wdd.net_weight                ,
8785           wdd.organization_id          ,
8786           wdd.container_flag          ,
8787           wdd.container_type_code    ,
8788           wdd.container_name        ,
8789           wdd.fill_percent         ,
8790           wdd.gross_weight        ,
8791           wdd.currency_code     ,
8792           wdd.freight_class_cat_id        ,
8793           wdd.commodity_code_cat_id      ,
8794           wdd.weight_uom_code           ,
8795           wdd.volume                   ,
8796           wdd.volume_uom_code         ,
8797           wdd.tp_attribute_category  ,
8798           wdd.tp_attribute1         ,
8799           wdd.tp_attribute2        ,
8800           wdd.tp_attribute3       ,
8801           wdd.tp_attribute4                        ,
8802           wdd.tp_attribute5                       ,
8803           wdd.tp_attribute6                      ,
8804           wdd.tp_attribute7                     ,
8805           wdd.tp_attribute8                    ,
8806           wdd.tp_attribute9                   ,
8807           wdd.tp_attribute10                 ,
8808           wdd.tp_attribute11                ,
8809           wdd.tp_attribute12               ,
8810           wdd.tp_attribute13              ,
8811           wdd.tp_attribute14             ,
8812           wdd.tp_attribute15            ,
8813           wdd.attribute_category       ,
8814           wdd.attribute1              ,
8815           wdd.attribute2             ,
8816           wdd.attribute3            ,
8817           wdd.attribute4           ,
8818           wdd.attribute5          ,
8819           wdd.attribute6         ,
8820           wdd.attribute7        ,
8821           wdd.attribute8       ,
8822           wdd.attribute9      ,
8823           wdd.attribute10    ,
8824           wdd.attribute11   ,
8825           wdd.attribute12  ,
8826           wdd.attribute13 ,
8827           wdd.attribute14,
8828           wdd.attribute15,
8829           'FTE',           -- source_type
8830           NULL,            -- source_line_id
8831           NULL,            -- source_header_id
8832           NULL,            -- source_consolidation_id
8833           NULL,            -- ship_date
8834           NULL,             -- arrival_date
8835           NULL,             -- comm_category_id
8836 	  wda.type,
8837 	  wda.parent_delivery_id,
8838 	  wdl.parent_delivery_leg_id
8839    from   wsh_delivery_details wdd, wsh_delivery_assignments wda,
8840 	  wsh_new_deliveries wd,
8841           wsh_delivery_legs wdl, wsh_trip_stops wts1, wsh_trip_stops wts2,wsh_trips wt
8842    where  wdd.delivery_detail_id = wda.delivery_detail_id
8843    and    wda.delivery_id        = wdl.delivery_id
8844    and    wdl.delivery_id 	 = wd.delivery_id
8845    and    wdl.pick_up_stop_id    = wts1.stop_id
8846    and    wdl.drop_off_stop_id   = wts2.stop_id
8847    --and    wdl.reprice_required = 'Y'          -- Not required AG 05/10
8848    and    wts1.trip_id           = wt.trip_id
8849    and    wts2.trip_id           = wt.trip_id
8850    and      (wda.type IS null  OR wda.type <> 'O')--MDC
8851    and    wt.trip_id             = c_trip_id;
8852 
8853    CURSOR c_delivery_leg(c_delivery_leg_id IN NUMBER) IS
8854    Select wdd.delivery_detail_id,
8855           wda.delivery_id,
8856           wdl.delivery_leg_id,
8857           nvl(wdl.reprice_required,'N') as reprice_required,  --  Added AG 05/10
8858           wda.parent_delivery_detail_id,
8859           wdd.customer_id             ,
8860           wdd.sold_to_contact_id    ,
8861           wdd.inventory_item_id    ,
8862           wdd.item_description    ,
8863           wdd.hazard_class_id    ,
8864           wdd.country_of_origin ,
8865           wdd.classification   ,
8866           wdd.requested_quantity             ,
8867           wdd.requested_quantity_uom        ,
8868           wdd.master_container_item_id     ,
8869           wdd.detail_container_item_id    ,
8870           wdd.customer_item_id           ,
8871           wdd.net_weight                ,
8872           wdd.organization_id          ,
8873           wdd.container_flag          ,
8874           wdd.container_type_code    ,
8875           wdd.container_name        ,
8876           wdd.fill_percent         ,
8877           wdd.gross_weight        ,
8878           wdd.currency_code     ,
8879           wdd.freight_class_cat_id        ,
8880           wdd.commodity_code_cat_id      ,
8881           wdd.weight_uom_code           ,
8882           wdd.volume                   ,
8883           wdd.volume_uom_code         ,
8884           wdd.tp_attribute_category  ,
8885           wdd.tp_attribute1         ,
8886           wdd.tp_attribute2        ,
8887           wdd.tp_attribute3       ,
8888           wdd.tp_attribute4                        ,
8889           wdd.tp_attribute5                       ,
8890           wdd.tp_attribute6                      ,
8891           wdd.tp_attribute7                     ,
8892           wdd.tp_attribute8                    ,
8893           wdd.tp_attribute9                   ,
8894           wdd.tp_attribute10                 ,
8895           wdd.tp_attribute11                ,
8896           wdd.tp_attribute12               ,
8897           wdd.tp_attribute13              ,
8898           wdd.tp_attribute14             ,
8899           wdd.tp_attribute15            ,
8900           wdd.attribute_category       ,
8901           wdd.attribute1              ,
8902           wdd.attribute2             ,
8903           wdd.attribute3            ,
8904           wdd.attribute4           ,
8905           wdd.attribute5          ,
8906           wdd.attribute6         ,
8907           wdd.attribute7        ,
8908           wdd.attribute8       ,
8909           wdd.attribute9      ,
8910           wdd.attribute10    ,
8911           wdd.attribute11   ,
8912           wdd.attribute12  ,
8913           wdd.attribute13 ,
8914           wdd.attribute14,
8915           wdd.attribute15,
8916           'FTE',           -- source_type
8917           NULL,            -- source_line_id
8918           NULL,            -- source_header_id
8919           NULL,            -- source_consolidation_id
8920           NULL,            -- ship_date
8921           NULL,            -- arrival_date
8922           NULL,            -- comm_category_id
8923 	  wda.type,
8924 	  wda.parent_delivery_id,
8925 	  wdl.parent_delivery_leg_id
8926    from   wsh_delivery_details wdd, wsh_delivery_assignments wda, wsh_delivery_legs wdl,
8927 	  wsh_new_deliveries wd
8928    where  wdd.delivery_detail_id = wda.delivery_detail_id
8929    and    wda.delivery_id        = wdl.delivery_id
8930    and    wdl.delivery_id 	 = wd.delivery_id
8931    and    ((wdl.reprice_required = 'Y' AND p_check_reprice_flag = 'Y') OR (p_check_reprice_flag = 'N'))
8932    and      (wda.type IS null  OR wda.type <> 'O')--MDC
8933    and    wdl.delivery_leg_id    = c_delivery_leg_id;
8934 
8935    CURSOR c_trip_first_stop(c_trip_id NUMBER)
8936    IS
8937    SELECT planned_departure_date
8938    FROM    wsh_trip_stops
8939    WHERE  trip_id = c_trip_id
8940    AND	  stop_sequence_number =
8941    (SELECT min(stop_sequence_number)
8942     FROM wsh_trip_stops
8943     WHERE trip_id = c_trip_id);
8944 
8945    CURSOR c_trip_last_stop(c_trip_id NUMBER)
8946    IS
8947    SELECT planned_arrival_date
8948    FROM    wsh_trip_stops
8949    WHERE  trip_id = c_trip_id
8950    AND	  stop_sequence_number =
8951    (SELECT max(stop_sequence_number)
8952     FROM wsh_trip_stops
8953     WHERE trip_id = c_trip_id);
8954 --
8955    l_return_status     VARCHAR2(1);
8956       l_return_code             NUMBER;
8957    l_delvy_det_rec     shipment_line_rec_type;
8958    l_dlvy              WSH_UTIL_CORE.id_tab_type;
8959    l_first_level_rows  shpmnt_content_tab_type;
8960    l_first_level_charges  addl_services_tab_type;
8961 
8962    l_dummy_summary     NUMBER;
8963    l_dummy_summary_uom VARCHAR2(40);
8964    l_segment_id        NUMBER;
8965    l_reprice_reqd_count NUMBER:=0;
8966    l_delivery_id       NUMBER;
8967    i                   NUMBER;
8968    j                   NUMBER;
8969    l_dummy_fc_temp_price     Freight_Cost_Temp_Tab_Type;
8970    l_dummy_fc_temp_charge     Freight_Cost_Temp_Tab_Type;
8971 
8972       l_initial_pickup_date		DATE;
8973       l_ultimate_dropoff_date		DATE;
8974 
8975     l_log_level     NUMBER := FTE_FREIGHT_PRICING_UTIL.G_LOG;
8976 
8977 BEGIN
8978 
8979    x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
8980    FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
8981    FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,'shipment_price_consolidate','start');
8982 
8983    FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'p_delivery_leg_id='||p_delivery_leg_id);
8984    FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'p_segment_id='||p_segment_id);
8985    FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'p_check_reprice_flag='||p_check_reprice_flag);
8986 
8987    IF p_segment_id IS NULL AND p_delivery_leg_id IS NULL THEN
8988 
8989       raise FTE_FREIGHT_PRICING_UTIL.g_noleg_segment;
8990 
8991    ELSIF p_segment_id IS NOT NULL THEN
8992       validate_nontl_trip(
8993 	p_trip_id 	=> p_segment_id,
8994 	x_return_code => l_return_code);
8995 
8996       IF l_return_code = G_RC_ERROR THEN
8997 	RAISE FND_API.G_EXC_ERROR;
8998       ELSIF (l_return_code = G_RC_REPRICE_NOT_REQUIRED
8999 	     OR l_return_code = G_RC_NOT_RATE_FREIGHT_TERM
9000 	     OR l_return_code = G_RC_NOT_RATE_MANIFESTING) THEN
9001         x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
9002 	raise g_finished_warning;
9003       END IF;
9004    ELSE
9005 
9006     OPEN c_get_delivery_id(p_delivery_leg_id);
9007     FETCH c_get_delivery_id INTO l_delivery_id;
9008     CLOSE c_get_delivery_id;
9009 
9010       validate_delivery(
9011 	p_delivery_id 	=> l_delivery_id,
9012 	x_return_code => l_return_code);
9013 
9014       IF l_return_code = G_RC_ERROR THEN
9015 	RAISE FND_API.G_EXC_ERROR;
9016       ELSIF (l_return_code = G_RC_REPRICE_NOT_REQUIRED
9017 	     OR l_return_code = G_RC_NOT_RATE_FREIGHT_TERM
9018 	     OR l_return_code = G_RC_NOT_RATE_MANIFESTING) THEN
9019         x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
9020 	raise g_finished_warning;
9021       END IF;
9022    END IF;
9023 
9024    g_shipment_line_rows.DELETE;
9025 
9026    SAVEPOINT before_pricing;
9027 
9028    -- Here determine if a trip has been passed or a delivery leg
9029 
9030    IF p_segment_id IS NOT NULL THEN
9031 
9032     IF p_check_reprice_flag = 'Y' THEN
9033 
9034     OPEN c_count_reprice_reqd(p_segment_id);
9035     FETCH c_count_reprice_reqd INTO l_reprice_reqd_count;
9036     CLOSE c_count_reprice_reqd;
9037 
9038     END IF;
9039 
9040     IF (p_check_reprice_flag = 'Y' AND l_reprice_reqd_count > 0) OR
9041        p_check_reprice_flag = 'N' THEN
9042 
9043       OPEN c_delivery_from_trip(p_segment_id);
9044 
9045       LOOP
9046          FETCH c_delivery_from_trip INTO l_delvy_det_rec;
9047          EXIT WHEN c_delivery_from_trip%NOTFOUND;
9048          g_shipment_line_rows(l_delvy_det_rec.delivery_detail_id) := l_delvy_det_rec;
9049       END LOOP;
9050       IF c_delivery_from_trip%ROWCOUNT = 0 THEN
9051          CLOSE c_delivery_from_trip;
9052          --raise FTE_FREIGHT_PRICING_UTIL.g_pricing_not_required;
9053          raise FTE_FREIGHT_PRICING_UTIL.g_empty_delivery;
9054          --raise others;  --  Should not happen ie. unexpected error
9055       ELSE
9056          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Matching number of delivery lines : '||c_delivery_from_trip%ROWCOUNT);
9057       END IF;
9058 
9059       CLOSE c_delivery_from_trip;
9060 
9061 
9062       IF is_consolidated(p_segment_id) THEN     --  New API
9063          -- If atleast one delivery leg for this segment has reprice required flag = 'Y'
9064          -- then all the delivery legs need to be repriced irrespective of their flags
9065 
9066          -- Need to delete existing freight cost records
9067          -- for all delivery legs in this trip segment
9068 
9069       delete_invalid_fc_recs (
9070              p_segment_id      =>  p_segment_id,
9071              x_return_status   =>  l_return_status ) ;
9072 
9073       IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9074          IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
9075              ROLLBACK to before_pricing;
9076              FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'segment:delete_invalid_fc_recs ');
9077              raise FTE_FREIGHT_PRICING_UTIL.g_delete_invalid_fc_failed;
9078          END IF;
9079       ELSE
9080          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,p_segment_id||' : Existing freight cost records deleted ');
9081       END IF;
9082 
9083          flatten_shipment (
9084             x_first_level_rows        =>    l_first_level_rows,
9085             x_return_status           =>    l_return_status );
9086 
9087         IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9088            IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
9089                FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'segment:Consolidate=Y:flatten_shipment ');
9090                ROLLBACK to before_pricing;
9091                raise FTE_FREIGHT_PRICING_UTIL.g_flatten_shipment_failed;
9092            END IF;
9093         ELSE -- What happens if no first level rows are created
9094              -- raise FTE_FREIGHT_PRICING_UTIL.g_an exception
9095            -- Should never happen AG 05/10
9096            IF l_first_level_rows.COUNT = 0 THEN
9097               ROLLBACK to before_pricing;
9098               raise FTE_FREIGHT_PRICING_UTIL.g_empty_delivery;
9099            END IF;
9100            FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'No. of top level lines 2 : '||l_first_level_rows.COUNT);
9101         END IF;
9102 
9103          -- Scoped out for patch H
9104          /*
9105          get_top_level_charges (
9106             p_first_level_rows        =>    l_first_level_rows,
9107             x_shpmnt_toplevel_charges =>    l_first_level_charges,
9108             x_return_status           =>    l_return_status );
9109          */
9110 
9111       	OPEN c_trip_first_stop(p_segment_id);
9112       	FETCH c_trip_first_stop INTO l_initial_pickup_date;
9113       	CLOSE c_trip_first_stop;
9114 
9115       	OPEN c_trip_last_stop(p_segment_id);
9116       	FETCH c_trip_last_stop INTO l_ultimate_dropoff_date;
9117       	CLOSE c_trip_last_stop;
9118 
9119          shipment_pricing (
9120             p_segment_id              =>    p_segment_id,-- Input either Lane or the trip segment
9121             p_shpmnt_toplevel_rows    =>    l_first_level_rows,
9122             p_shpmnt_toplevel_charges =>    l_first_level_charges,
9123 	    p_ship_date		      =>    l_initial_pickup_date,
9124 	    p_arrival_date	      =>    l_ultimate_dropoff_date,
9125             p_save_flag               =>    'M', -- Whether to save to TEMP table or MAIN table
9126             x_summary_lanesched_price      => l_dummy_summary,
9127             x_summary_lanesched_price_uom  => l_dummy_summary_uom,
9128             x_freight_cost_temp_price      => l_dummy_fc_temp_price,
9129             x_freight_cost_temp_charge     => l_dummy_fc_temp_charge,
9130             x_return_status           =>    l_return_status ) ;
9131 
9132         IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9133            IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
9134                ROLLBACK to before_pricing;
9135                FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'segment:Consolidate=Y:shipment_pricing ');
9136                raise FTE_FREIGHT_PRICING_UTIL.g_shipment_pricing_failed;
9137            END IF;
9138         ELSE -- What happens if no first level rows are created
9139            FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'Shipment pricing successful ');
9140         END IF;
9141 
9142       -- Here the reprice required flag for all the delivery legs for this segment should be marked as 'N'
9143       unmark_reprice_required (
9144              p_segment_id      =>  p_segment_id,
9145              x_return_status   =>  l_return_status ) ;
9146 
9147       IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9148          IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
9149              ROLLBACK to before_pricing;
9150              FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'segment:unmark_reprice_required ');
9151              raise FTE_FREIGHT_PRICING_UTIL.g_unmark_reprice_req_failed;
9152          END IF;
9153       ELSE -- What happens if no first level rows are created
9154          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,p_segment_id||' : reprice required flag unmarked ');
9155       END IF;
9156 
9157       ELSE  --  Need to call separately for each different delivery leg in the segment
9158             --  if it's reprice_required flag = 'Y'
9159          i := g_shipment_line_rows.FIRST;
9160          LOOP
9161             IF NOT l_dlvy.EXISTS(g_shipment_line_rows(i).delivery_leg_id) THEN
9162                -- If the delivery leg has reprice required flag = 'Y'
9163                --IF g_shipment_line_rows(i).reprice_required = 'Y' THEN
9164 
9165                IF (p_check_reprice_flag = 'Y' AND g_shipment_line_rows(i).reprice_required = 'Y') OR
9166                   p_check_reprice_flag = 'N' THEN
9167 
9168          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,'Adding delivery leg id :'||g_shipment_line_rows(i).delivery_leg_id||' to l_dlvy');
9169                   l_dlvy(g_shipment_line_rows(i).delivery_leg_id) := g_shipment_line_rows(i).delivery_leg_id;
9170                END IF;
9171             END IF;
9172             EXIT WHEN i=g_shipment_line_rows.LAST;
9173             i := g_shipment_line_rows.NEXT(i);
9174 
9175          END LOOP;
9176 
9177          IF l_dlvy.COUNT > 0 THEN
9178          j := l_dlvy.FIRST;
9179          LOOP
9180 
9181             l_first_level_rows.delete;
9182             l_first_level_charges.delete;
9183 
9184             FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,l_dlvy(j)||' : First level lines initialized ');
9185 
9186          -- Need to delete existing freight cost records
9187          -- for this delivery leg
9188 
9189          delete_invalid_fc_recs (
9190              p_delivery_leg_id =>  l_dlvy(j),
9191              x_return_status   =>  l_return_status ) ;
9192 
9193          IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9194             IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
9195                 ROLLBACK to before_pricing;
9196                 FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'dleg:consolidate:N:delete_invalid_fc_recs ');
9197                 raise FTE_FREIGHT_PRICING_UTIL.g_delete_invalid_fc_failed;
9198             END IF;
9199          ELSE
9200             FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,l_dlvy(j)||' : Existing freight cost records deleted ');
9201          END IF;
9202 
9203                flatten_shipment (
9204                   p_delivery_leg_id         =>    l_dlvy(j),
9205                   x_first_level_rows        =>    l_first_level_rows,
9206                   x_return_status           =>    l_return_status );
9207 
9208                IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9209                      IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
9210                          FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'segment:Consolidate=N:flatten_shipment ');
9211                          ROLLBACK to before_pricing;
9212                          raise FTE_FREIGHT_PRICING_UTIL.g_flatten_shipment_failed;
9213                      END IF;
9214                ELSE -- What happens if no first level rows are created
9215                        -- raise FTE_FREIGHT_PRICING_UTIL.g_an exception
9216                        -- Should not ever happen AG 05/10
9217                      IF l_first_level_rows.COUNT = 0 THEN
9218                         ROLLBACK to before_pricing;
9219                         raise FTE_FREIGHT_PRICING_UTIL.g_empty_delivery;
9220                      END IF;
9221                      FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'No. of top level lines 3 : '||l_first_level_rows.COUNT);
9222                END IF;
9223 
9224                /*
9225                get_top_level_charges (
9226                   p_first_level_rows        =>    l_first_level_rows,
9227                   x_shpmnt_toplevel_charges =>    l_first_level_charges,
9228                   x_return_status           =>    l_return_status );
9229                */
9230 
9231                shipment_pricing (
9232                   p_segment_id              =>    p_segment_id,-- Input either Lane or the trip segment
9233                   p_shpmnt_toplevel_rows    =>    l_first_level_rows,
9234                   p_shpmnt_toplevel_charges =>    l_first_level_charges,
9235                   p_save_flag               =>    'M', -- Whether to save to TEMP table or MAIN table
9236                   x_summary_lanesched_price      => l_dummy_summary,
9237                   x_summary_lanesched_price_uom  => l_dummy_summary_uom,
9238                   x_freight_cost_temp_price      => l_dummy_fc_temp_price,
9239                   x_freight_cost_temp_charge     => l_dummy_fc_temp_charge,
9240                   x_return_status           =>    l_return_status ) ;
9241 
9242               IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9243                  IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
9244                      ROLLBACK to before_pricing;
9245                      FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'segment:Consolidate=N:shipment_pricing ');
9246                      raise FTE_FREIGHT_PRICING_UTIL.g_shipment_pricing_failed;
9247                  END IF;
9248               ELSE -- What happens if no first level rows are created
9249                  FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'Shipment pricing successful ');
9250               END IF;
9251 
9252            -- Here the reprice required flag for this delivery leg should be marked as 'N'
9253            unmark_reprice_required (
9254                   p_delivery_leg_id =>  l_dlvy(j),
9255                   x_return_status   =>  l_return_status ) ;
9256 
9257            IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9258               IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
9259                   ROLLBACK to before_pricing;
9260                   FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'dleg:consolidate:N:unmark_reprice_required ');
9261                   raise FTE_FREIGHT_PRICING_UTIL.g_unmark_reprice_req_failed;
9262               END IF;
9263            ELSE
9264               FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,l_dlvy(j)||' : reprice required flag unmarked ');
9265            END IF;
9266 
9267             EXIT WHEN j=l_dlvy.LAST;
9268             j := l_dlvy.NEXT(j);
9269 
9270          END LOOP;
9271          ELSE
9272             -- Even though reprice_required count > 0
9273             -- No g_shipment_line_rows got created with reprice_required = 'Y'
9274             -- which can arise out of the concerning delivery leg being empty
9275             raise FTE_FREIGHT_PRICING_UTIL.g_empty_delivery;
9276          END IF;
9277 
9278       END IF;
9279 
9280     ELSE
9281        raise FTE_FREIGHT_PRICING_UTIL.g_pricing_not_required;
9282     END IF; -- reprice required count > 0
9283 
9284    ELSIF p_delivery_leg_id IS NOT NULL THEN
9285 
9286       l_segment_id := get_segment_from_dleg(p_delivery_leg_id);   --  New API
9287 
9288       IF is_consolidated(l_segment_id) THEN
9289 
9290        IF p_check_reprice_flag = 'Y' THEN
9291 
9292         OPEN c_count_reprice_reqd(l_segment_id);
9293         FETCH c_count_reprice_reqd INTO l_reprice_reqd_count;
9294         CLOSE c_count_reprice_reqd;
9295 
9296        END IF;
9297 
9298         IF (p_check_reprice_flag = 'Y' AND l_reprice_reqd_count > 0) OR
9299            p_check_reprice_flag = 'N' THEN
9300 
9301         --IF l_reprice_reqd_count > 0 THEN
9302 
9303          OPEN c_delivery_from_trip(l_segment_id);
9304 
9305          LOOP
9306             FETCH c_delivery_from_trip INTO l_delvy_det_rec;
9307             EXIT WHEN c_delivery_from_trip%NOTFOUND;
9308             g_shipment_line_rows(l_delvy_det_rec.delivery_detail_id) := l_delvy_det_rec;
9309          END LOOP;
9310          IF c_delivery_from_trip%ROWCOUNT = 0 THEN
9311             CLOSE c_delivery_from_trip;
9312             raise FTE_FREIGHT_PRICING_UTIL.g_empty_delivery;
9313             --raise FTE_FREIGHT_PRICING_UTIL.g_pricing_not_required;
9314          ELSE
9315             FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Matching number of delivery lines : '||c_delivery_from_trip%ROWCOUNT);
9316          END IF;
9317 
9318          CLOSE c_delivery_from_trip;
9319 
9320          -- Need to delete existing freight cost records
9321          -- for all delivery legs in this trip segment
9322 
9323       delete_invalid_fc_recs (
9324              p_segment_id      =>  l_segment_id,
9325              x_return_status   =>  l_return_status ) ;
9326 
9327       IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9328          IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
9329              ROLLBACK to before_pricing;
9330              FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'dleg:consolidate:Y:delete_invalid_fc_recs ');
9331              raise FTE_FREIGHT_PRICING_UTIL.g_delete_invalid_fc_failed;
9332          END IF;
9333       ELSE
9334          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,l_segment_id||' : Existing freight cost records deleted ');
9335       END IF;
9336 
9337          flatten_shipment (
9338             x_first_level_rows        =>    l_first_level_rows,
9339             x_return_status           =>    l_return_status );
9340 
9341         IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9342            IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
9343                FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'dleg:Consolidate=Y:flatten_shipment ');
9344                ROLLBACK to before_pricing;
9345                raise FTE_FREIGHT_PRICING_UTIL.g_flatten_shipment_failed;
9346            END IF;
9347         ELSE -- What happens if no first level rows are created
9348              -- raise FTE_FREIGHT_PRICING_UTIL.g_an exception
9349            -- Should never happen AG 5/10
9350            IF l_first_level_rows.COUNT = 0 THEN
9351               ROLLBACK to before_pricing;
9352               raise FTE_FREIGHT_PRICING_UTIL.g_empty_delivery;
9353            END IF;
9354            FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'No. of top level lines 4 : '||l_first_level_rows.COUNT);
9355         END IF;
9356 
9357          /*
9358          get_top_level_charges (
9359             p_first_level_rows        =>    l_first_level_rows,
9360             x_shpmnt_toplevel_charges =>    l_first_level_charges,
9361             x_return_status           =>    l_return_status );
9362          */
9363 
9364       	OPEN c_trip_first_stop(l_segment_id);
9365       	FETCH c_trip_first_stop INTO l_initial_pickup_date;
9366       	CLOSE c_trip_first_stop;
9367 
9368       	OPEN c_trip_last_stop(l_segment_id);
9369       	FETCH c_trip_last_stop INTO l_ultimate_dropoff_date;
9370       	CLOSE c_trip_last_stop;
9371 
9372          shipment_pricing (
9373             p_segment_id              =>    l_segment_id,-- Input either Lane or the trip segment
9374             p_shpmnt_toplevel_rows    =>    l_first_level_rows,
9375             p_shpmnt_toplevel_charges =>    l_first_level_charges,
9376 	    p_ship_date		      =>    l_initial_pickup_date,
9377 	    p_arrival_date	      =>    l_ultimate_dropoff_date,
9378             p_save_flag               =>    'M', -- Whether to save to TEMP table or MAIN table
9379             x_summary_lanesched_price      => l_dummy_summary,
9380             x_summary_lanesched_price_uom  => l_dummy_summary_uom,
9381             x_freight_cost_temp_price      => l_dummy_fc_temp_price,
9382             x_freight_cost_temp_charge     => l_dummy_fc_temp_charge,
9383             x_return_status           =>    l_return_status ) ;
9384 
9385          IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9386               IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
9387                      ROLLBACK to before_pricing;
9388                      FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'dleg:Consolidate=Y:shipment_pricing ');
9389                      raise FTE_FREIGHT_PRICING_UTIL.g_shipment_pricing_failed;
9390               END IF;
9391          ELSE -- What happens if no first level rows are created
9392               FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'Shipment pricing successful ');
9393          END IF;
9394 
9395             -- Here the reprice required flag for all the delivery legs for this segment should be marked as 'N'
9396          unmark_reprice_required (
9397                    p_segment_id      =>  l_segment_id,
9398                    x_return_status   =>  l_return_status ) ;
9399 
9400          IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9401              IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
9402                    ROLLBACK to before_pricing;
9403                    FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'dleg:consolidate:Y:unmark_reprice_required ');
9404                    raise FTE_FREIGHT_PRICING_UTIL.g_unmark_reprice_req_failed;
9405              END IF;
9406          ELSE -- What happens if no first level rows are created
9407              FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,l_segment_id||' : reprice required flag unmarked ');
9408          END IF;
9409 
9410        ELSE
9411           raise FTE_FREIGHT_PRICING_UTIL.g_pricing_not_required;
9412        END IF; -- reprice required count > 0
9413 
9414       ELSE
9415 
9416          OPEN c_delivery_leg(p_delivery_leg_id);
9417 
9418          LOOP
9419             FETCH c_delivery_leg INTO l_delvy_det_rec;
9420             EXIT WHEN c_delivery_leg%NOTFOUND;
9421             g_shipment_line_rows(l_delvy_det_rec.delivery_detail_id) := l_delvy_det_rec;
9422          END LOOP;
9423          IF c_delivery_leg%ROWCOUNT = 0 THEN
9424             CLOSE c_delivery_leg;
9425             ROLLBACK to before_pricing;
9426             raise FTE_FREIGHT_PRICING_UTIL.g_pricing_not_required;
9427          ELSE
9428             FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Matching number of delivery lines : '||c_delivery_leg%ROWCOUNT);
9429          END IF;
9430 
9431          CLOSE c_delivery_leg;
9432 
9433          -- Need to delete existing freight cost records
9434          -- for this delivery leg
9435 
9436          delete_invalid_fc_recs (
9437              p_delivery_leg_id =>  p_delivery_leg_id,
9438              x_return_status   =>  l_return_status ) ;
9439 
9440          IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9441             IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
9442                 ROLLBACK to before_pricing;
9443                 FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'dleg:consolidate:N:delete_invalid_fc_recs ');
9444                 raise FTE_FREIGHT_PRICING_UTIL.g_delete_invalid_fc_failed;
9445             END IF;
9446          ELSE
9447             FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,p_delivery_leg_id||' : Existing freight cost records deleted ');
9448          END IF;
9449 
9450          flatten_shipment (
9451 --          p_delivery_leg_id         =>    p_delivery_leg_id,    --  Not required
9452             x_first_level_rows        =>    l_first_level_rows,
9453             x_return_status           =>    l_return_status );
9454 
9455         IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9456            IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
9457                FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'dleg:Consolidate=N:flatten_shipment ');
9458                ROLLBACK to before_pricing;
9459                raise FTE_FREIGHT_PRICING_UTIL.g_flatten_shipment_failed;
9460            END IF;
9461         ELSE -- What happens if no first level rows are created
9462              -- raise FTE_FREIGHT_PRICING_UTIL.g_an exception
9463            -- Should never happen AG 5/10
9464            IF l_first_level_rows.COUNT = 0 THEN
9465               ROLLBACK to before_pricing;
9466               raise FTE_FREIGHT_PRICING_UTIL.g_empty_delivery;
9467            END IF;
9468            FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'No. of top level lines 5: '||l_first_level_rows.COUNT);
9469         END IF;
9470 
9471          /*
9472          get_top_level_charges (
9473             p_first_level_rows        =>    l_first_level_rows,
9474             x_shpmnt_toplevel_charges =>    l_first_level_charges,
9475             x_return_status           =>    l_return_status );
9476          */
9477 
9478          shipment_pricing (
9479             p_segment_id              =>    l_segment_id,-- Input either Lane or the trip segment
9480             p_shpmnt_toplevel_rows    =>    l_first_level_rows,
9481             p_shpmnt_toplevel_charges =>    l_first_level_charges,
9482             p_save_flag               =>    'M', -- Whether to save to TEMP table or MAIN table
9483             x_summary_lanesched_price      => l_dummy_summary,
9484             x_summary_lanesched_price_uom  => l_dummy_summary_uom,
9485             x_freight_cost_temp_price      => l_dummy_fc_temp_price,
9486             x_freight_cost_temp_charge     => l_dummy_fc_temp_charge,
9487             x_return_status           =>    l_return_status ) ;
9488 
9489              IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9490                 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
9491                     ROLLBACK to before_pricing;
9492                     FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'dleg:Consolidate=N:shipment_pricing ');
9493                     raise FTE_FREIGHT_PRICING_UTIL.g_shipment_pricing_failed;
9494                 END IF;
9495              ELSE -- What happens if no first level rows are created
9496                 FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'Shipment pricing successful ');
9497              END IF;
9498 
9499            -- Here the reprice required flag for this delivery leg should be marked as 'N'
9500            unmark_reprice_required (
9501                   p_delivery_leg_id =>  p_delivery_leg_id,
9502                   x_return_status   =>  l_return_status ) ;
9503 
9504            IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9505               IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
9506                   ROLLBACK to before_pricing;
9507                   FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'dleg:consolidate:N:unmark_reprice_required ');
9508                   raise FTE_FREIGHT_PRICING_UTIL.g_unmark_reprice_req_failed;
9509               END IF;
9510            ELSE -- What happens if no first level rows are created
9511               FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,p_delivery_leg_id||' : reprice required flag unmarked ');
9512            END IF;
9513 
9514       END IF;
9515 
9516    END IF;
9517    --FTE_FREIGHT_PRICING_UTIL.close_logs;
9518    FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_price_consolidate');
9519 
9520 EXCEPTION
9521    WHEN g_finished_warning THEN
9522         x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
9523         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_price_consolidate');
9524    WHEN FND_API.G_EXC_ERROR THEN
9525         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9526         FTE_FREIGHT_PRICING_UTIL.set_exception('shipment_price_consolidate',FTE_FREIGHT_PRICING_UTIL.G_ERR,'FND_API.G_EXC_ERROR');
9527         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_price_consolidate');
9528    WHEN FTE_FREIGHT_PRICING_UTIL.g_noleg_segment THEN
9529         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9530         FTE_FREIGHT_PRICING_UTIL.set_exception('shipment_price_consolidate',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_noleg_segment');
9531         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_price_consolidate');
9532    WHEN FTE_FREIGHT_PRICING_UTIL.g_pricing_not_required THEN
9533         x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
9534         FTE_FREIGHT_PRICING_UTIL.set_exception('shipment_price_consolidate',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_pricing_not_required');
9535         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_price_consolidate');
9536    WHEN FTE_FREIGHT_PRICING_UTIL.g_flatten_shipment_failed THEN
9537         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9538         FTE_FREIGHT_PRICING_UTIL.set_exception('shipment_price_consolidate',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_flatten_shipment_failed');
9539         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_price_consolidate');
9540    WHEN FTE_FREIGHT_PRICING_UTIL.g_empty_delivery THEN
9541         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9542         FTE_FREIGHT_PRICING_UTIL.set_exception('shipment_price_consolidate',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_empty_delivery');
9543         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_price_consolidate');
9544    WHEN FTE_FREIGHT_PRICING_UTIL.g_shipment_pricing_failed THEN
9545         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9546         FTE_FREIGHT_PRICING_UTIL.set_exception('shipment_price_consolidate',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_shipment_pricing_failed');
9547         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_price_consolidate');
9548    WHEN FTE_FREIGHT_PRICING_UTIL.g_unmark_reprice_req_failed THEN
9549         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9550         FTE_FREIGHT_PRICING_UTIL.set_exception('shipment_price_consolidate',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_unmark_reprice_req_failed');
9551         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_price_consolidate');
9552    WHEN FTE_FREIGHT_PRICING_UTIL.g_delete_invalid_fc_failed THEN
9553         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9554         FTE_FREIGHT_PRICING_UTIL.set_exception('shipment_price_consolidate',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_delete_invalid_fc_failed');
9555         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_price_consolidate');
9556    WHEN others THEN
9557         ROLLBACK to before_pricing;
9558         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
9559         FTE_FREIGHT_PRICING_UTIL.set_exception('shipment_price_consolidate',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
9560         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
9561         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_price_consolidate');
9562 
9563 END shipment_price_consolidate;
9564 
9565 PROCEDURE shipment_price_consolidate (
9566         p_init_msg_list           IN     VARCHAR2 DEFAULT fnd_api.g_true,
9567         p_in_attributes           IN     FtePricingInRecType,
9568         x_return_status           OUT NOCOPY     VARCHAR2,
9569         x_msg_count               OUT NOCOPY     NUMBER,
9570         x_msg_data                OUT NOCOPY     VARCHAR2 )
9571 IS
9572 
9573         l_return_status    VARCHAR2(1);
9574 
9575     l_trip_id NUMBER;
9576     l_mode VARCHAR2(30);
9577     l_output_tab FTE_FREIGHT_PRICING.Freight_Cost_Temp_Tab_Type;
9578     l_log_level     NUMBER := FTE_FREIGHT_PRICING_UTIL.G_LOG;
9579 
9580 BEGIN
9581 
9582    x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
9583 
9584     -- Initialize message list if p_init_msg_list is set to TRUE.
9585     IF FND_API.to_Boolean( p_init_msg_list ) THEN
9586 
9587    FTE_FREIGHT_PRICING_UTIL.initialize_logging( p_init_msg_list  => p_init_msg_list,
9588                                                 x_return_status  => l_return_status );
9589 
9590    IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9591        IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
9592             x_return_status  :=  l_return_status;
9593             RETURN;
9594        END IF;
9595    ELSE
9596        FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Initialize Logging successful ');
9597    END IF;
9598 
9599     END IF;
9600 
9601    FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
9602    FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,'shipment_price_consolidate_standard','start');
9603 
9604 
9605 	l_trip_id:=NULL;
9606 	l_mode:=NULL;
9607 
9608 
9609    	IF(p_in_attributes.segment_id IS NOT NULL)
9610    	THEN
9611 
9612 		Get_Trip_Mode(
9613 			p_trip_id=>p_in_attributes.segment_id,
9614 			p_dleg_id=>NULL,
9615 			x_trip_id=>l_trip_id,
9616 			x_mode_of_transport=>l_mode,
9617 			x_return_status=>l_return_status);
9618 
9619 		IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS
9620 		THEN
9621 		       IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING
9622 		       THEN
9623 			  raise FTE_FREIGHT_PRICING_UTIL.g_get_trip_mode_fail;
9624 		       END IF;
9625 		END IF;
9626 	ELSIF(p_in_attributes.delivery_leg_id IS NOT NULL)
9627 	THEN
9628 
9629 		Get_Trip_Mode(
9630 			p_trip_id=>NULL,
9631 			p_dleg_id=>p_in_attributes.delivery_leg_id,
9632 			x_trip_id=>l_trip_id,
9633 			x_mode_of_transport=>l_mode,
9634 			x_return_status=>l_return_status);
9635 
9636 		IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS
9637 		THEN
9638 		       IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING
9639 		       THEN
9640 			  raise FTE_FREIGHT_PRICING_UTIL.g_get_trip_mode_fail;
9641 		       END IF;
9642 		END IF;
9643 
9644 
9645 	END IF;
9646 
9647 	IF ((l_mode IS NOT NULL) AND (l_mode='TRUCK'))
9648 	THEN
9649 		FTE_TL_RATING.TL_Rate_Trip (
9650 		   p_trip_id=>l_trip_id ,
9651 		   p_output_type=>'M',
9652 		   p_check_reprice_flag=>'Y',
9653 		   x_output_cost_tab=>l_output_tab,
9654 		   x_return_status=>l_return_status);
9655 
9656 		IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS
9657 		THEN
9658 		       IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING
9659 		       THEN
9660 			  raise FTE_FREIGHT_PRICING_UTIL.g_tl_rate_trip_fail;
9661 		       END IF;
9662 		END IF;
9663 
9664 
9665 
9666 	ELSE
9667 
9668 
9669 
9670 	   shipment_price_consolidate (
9671 		   p_delivery_leg_id         =>     p_in_attributes.delivery_leg_id,
9672 		   p_segment_id              =>     p_in_attributes.segment_id,
9673 		   p_check_reprice_flag      =>     'Y',
9674 		   x_return_status           =>     l_return_status );
9675 
9676 	   IF l_return_status = WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9677 	       FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'Shipment price consolidate successful ');
9678 	   ELSIF l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING THEN
9679 		  x_return_status := l_return_status;
9680 	       FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'Shipment price consolidate successful with warning ');
9681 	   ELSE
9682 		  raise FTE_FREIGHT_PRICING_UTIL.g_price_consolidate_failed;
9683 	   END IF;
9684 	 END IF;
9685 
9686    -- Standard call to get message count and if count is 1,
9687    -- get message info.
9688    FND_MSG_PUB.Count_And_Get (
9689      p_count         =>      x_msg_count,
9690      p_data          =>      x_msg_data );
9691 
9692    FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_price_consolidate_standard');
9693     IF FND_API.to_Boolean( p_init_msg_list ) THEN
9694    FTE_FREIGHT_PRICING_UTIL.close_logs;
9695     END IF;
9696 
9697 EXCEPTION
9698 
9699    WHEN FTE_FREIGHT_PRICING_UTIL.g_get_trip_mode_fail THEN
9700         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9701         FTE_FREIGHT_PRICING_UTIL.set_exit_exception('shipment_price_consolidate_standard','g_get_trip_mode_fail');
9702         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_price_consolidate_standard');
9703     IF FND_API.to_Boolean( p_init_msg_list ) THEN
9704         FTE_FREIGHT_PRICING_UTIL.close_logs;
9705     END IF;
9706 
9707 
9708    WHEN FTE_FREIGHT_PRICING_UTIL.g_tl_rate_trip_fail THEN
9709         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9710         FTE_FREIGHT_PRICING_UTIL.set_exit_exception('shipment_price_consolidate_standard','g_tl_rate_trip_fail');
9711         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_price_consolidate_standard');
9712     IF FND_API.to_Boolean( p_init_msg_list ) THEN
9713         FTE_FREIGHT_PRICING_UTIL.close_logs;
9714     END IF;
9715 
9716 
9717    WHEN FTE_FREIGHT_PRICING_UTIL.g_price_consolidate_failed THEN
9718         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9719         FTE_FREIGHT_PRICING_UTIL.set_exit_exception('shipment_price_consolidate_standard','g_price_consolidate_failed');
9720         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_price_consolidate_standard');
9721     IF FND_API.to_Boolean( p_init_msg_list ) THEN
9722         FTE_FREIGHT_PRICING_UTIL.close_logs;
9723     END IF;
9724    WHEN others THEN
9725         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
9726         FTE_FREIGHT_PRICING_UTIL.set_exit_exception('shipment_price_consolidate_standard','g_others');
9727         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
9728         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_price_consolidate_standard');
9729     IF FND_API.to_Boolean( p_init_msg_list ) THEN
9730         FTE_FREIGHT_PRICING_UTIL.close_logs;
9731     END IF;
9732 END shipment_price_consolidate;
9733 
9734 PROCEDURE shipment_price_compare (
9735         p_init_msg_list           IN     VARCHAR2 DEFAULT fnd_api.g_true,
9736         p_delivery_id             IN     NUMBER,
9737         -- JDBC Thin driver can not support PL/SQL tables having one column (OCI driver supports) types
9738         -- thats why we are goint with this clumsy way of comma separated list
9739         p_lane_rows               IN     VARCHAR2 DEFAULT NULL,
9740         p_schedule_rows           IN     VARCHAR2 DEFAULT NULL,
9741         p_service_lane            IN     VARCHAR2 DEFAULT NULL,
9742         p_service_sched           IN     VARCHAR2 DEFAULT NULL,
9743         p_dep_date                IN     DATE DEFAULT sysdate,
9744         p_arr_date                IN     DATE DEFAULT sysdate,
9745         x_summary_lane_price      OUT NOCOPY     VARCHAR2,
9746         x_summary_lane_price_uom  OUT NOCOPY     VARCHAR2,
9747         x_summary_sched_price     OUT NOCOPY     VARCHAR2,
9748         x_summary_sched_price_uom OUT NOCOPY     VARCHAR2,
9749         x_request_id              OUT NOCOPY     NUMBER,
9750         x_return_status           OUT NOCOPY     VARCHAR2 )
9751 IS
9752 
9753 
9754 BEGIN
9755 
9756 	NULL;
9757 
9758 END shipment_price_compare;
9759 
9760 PROCEDURE shipment_reprice (
9761         errbuf                OUT NOCOPY  VARCHAR2,
9762         retcode               OUT NOCOPY  VARCHAR2,
9763         p_fte_trip_id         IN     NUMBER DEFAULT NULL, -- Input only ONE of the following FOUR
9764         p_segment_id          IN     NUMBER DEFAULT NULL,
9765         p_delivery_id         IN     NUMBER DEFAULT NULL,
9766         p_delivery_leg_id     IN     NUMBER DEFAULT NULL )
9767 IS
9768 
9769         l_return_status         VARCHAR2(1);
9770         l_status                VARCHAR2(10);
9771         l_temp                  BOOLEAN;
9772 
9773     l_log_level     NUMBER := FTE_FREIGHT_PRICING_UTIL.G_LOG;
9774 
9775 BEGIN
9776    FTE_FREIGHT_PRICING_UTIL.initialize_logging(p_debug_mode  => 'CONC',
9777                                                x_return_status => l_return_status );
9778 
9779    FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
9780    FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,'shipment_reprice_conc','start');
9781 
9782    shipment_reprice2 (
9783         p_fte_trip_id         =>     p_fte_trip_id,
9784         p_segment_id          =>     p_segment_id,
9785         p_delivery_id         =>     p_delivery_id,
9786         p_delivery_leg_id     =>     p_delivery_leg_id,
9787         x_return_status       =>     l_return_status );
9788 
9789   IF l_return_status = WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9790         l_status := 'NORMAL';
9791         errbuf := 'Shipment Reprice is completed successfully';
9792         retcode := '0';
9793   ELSIF l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING THEN
9794         l_status := 'WARNING';
9795         errbuf := 'Shipment Reprice is completed with warning';
9796         retcode := '1';
9797   ELSE
9798         l_status := 'ERROR';
9799         errbuf := 'Shipment Reprice is completed with error';
9800         retcode := '2';
9801   END IF;
9802 
9803   l_temp := FND_CONCURRENT.SET_COMPLETION_STATUS(l_status,'');
9804   FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_reprice_conc');
9805 
9806 EXCEPTION
9807   WHEN OTHERS THEN
9808         l_temp := FND_CONCURRENT.SET_COMPLETION_STATUS('ERROR','');
9809         errbuf := 'Shipment Reprice is completed with an Unexpected error';
9810         retcode := '2';
9811         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_reprice_conc');
9812 
9813 END shipment_reprice;
9814 
9815 PROCEDURE shipment_reprice2 (
9816         p_init_prc_log	      IN     VARCHAR2 DEFAULT 'Y',
9817         p_fte_trip_id         IN     NUMBER DEFAULT NULL,
9818         p_segment_id          IN     NUMBER DEFAULT NULL,
9819         p_delivery_id         IN     NUMBER DEFAULT NULL,
9820         p_delivery_leg_id     IN     NUMBER DEFAULT NULL,
9821         x_return_status       OUT NOCOPY     VARCHAR2 )
9822 IS
9823         l_segment_id       NUMBER;
9824         l_delivery_leg_id  NUMBER;
9825         l_return_status    VARCHAR2(1);
9826 /*
9827  CURSOR c_segment_from_fte_trip IS
9828  SELECT fwt.wsh_trip_id
9829  FROM   fte_trips ft, fte_wsh_trips fwt
9830  WHERE  ft.fte_trip_id = fwt.fte_trip_id
9831  AND    ft.fte_trip_id = p_fte_trip_id;
9832 */
9833  CURSOR c_delivery_leg_from_dlvy IS
9834  SELECT delivery_leg_id
9835  FROM   wsh_delivery_legs
9836  WHERE  delivery_id = p_delivery_id;
9837 
9838 
9839  l_output_tab FTE_FREIGHT_PRICING.Freight_Cost_Temp_Tab_Type;
9840  l_mode VARCHAR2(30);
9841  l_trip_id NUMBER;
9842 
9843     l_log_level     NUMBER := FTE_FREIGHT_PRICING_UTIL.G_LOG;
9844 
9845 BEGIN
9846 
9847    x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
9848 
9849   IF p_init_prc_log = 'Y' THEN
9850    FTE_FREIGHT_PRICING_UTIL.initialize_logging(x_return_status => l_return_status);
9851 
9852    IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9853        IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
9854             x_return_status  :=  l_return_status;
9855             RETURN;
9856        END IF;
9857    ELSE
9858        FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Initialize Logging successful ');
9859    END IF;
9860   END IF;
9861    FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
9862    FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,'shipment_reprice2','start');
9863 
9864    FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Input : FTE Trip Id - '||p_fte_trip_id||' Trip Segment Id -'||p_segment_id||' Delivery Id - '||p_delivery_id||' Delivery Leg Id - '||p_delivery_leg_id);
9865 
9866    IF p_fte_trip_id IS NULL AND p_segment_id IS NULL AND p_delivery_id IS NULL AND p_delivery_leg_id IS NULL
9867    THEN
9868       raise FTE_FREIGHT_PRICING_UTIL.g_no_input;
9869    ELSIF p_segment_id IS NOT NULL THEN
9870 
9871 	Get_Trip_Mode(
9872 		p_trip_id=>p_segment_id,
9873 		p_dleg_id=>NULL,
9874 		x_trip_id=>l_trip_id,
9875 		x_mode_of_transport=>l_mode,
9876 		x_return_status=>l_return_status);
9877 
9878         IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS
9879         THEN
9880                IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING
9881                THEN
9882               raise FTE_FREIGHT_PRICING_UTIL.g_get_trip_mode_fail;
9883                END IF;
9884         END IF;
9885 
9886 	IF ((l_mode IS NOT NULL) AND (l_mode='TRUCK'))
9887 	THEN
9888 		FTE_TL_RATING.TL_Rate_Trip (
9889 		   p_trip_id=>p_segment_id ,
9890 		   p_output_type=>'M',
9891 		   p_check_reprice_flag=>'N',
9892 		   x_output_cost_tab=>l_output_tab,
9893 		   x_return_status=>l_return_status);
9894 
9895 		IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS
9896 		THEN
9897 		       IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING
9898 		       THEN
9899 			  raise FTE_FREIGHT_PRICING_UTIL.g_tl_rate_trip_fail;
9900 		       END IF;
9901 		END IF;
9902 
9903 
9904 
9905 	ELSE
9906 
9907 	      	shipment_price_consolidate (
9908 			p_segment_id              =>     p_segment_id,
9909 			x_return_status           =>     l_return_status );
9910 
9911 		IF l_return_status = WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9912 		   FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'Shipment price consolidate successful for segment : '||p_segment_id);
9913 		ELSIF l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING THEN
9914 		  x_return_status := l_return_status;
9915 		   FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'Shipment price consolidate successful with warning for segment : '||p_segment_id);
9916 		ELSE
9917 		       FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'segment: '||p_segment_id||' shipment_price_consolidate ');
9918 		       raise FTE_FREIGHT_PRICING_UTIL.g_price_consolidate_failed;
9919 		END IF;
9920 
9921 
9922 	END IF;
9923 
9924 
9925 
9926    ELSIF p_delivery_id IS NOT NULL THEN
9927    --  Need to call for all delivery legs belonging to this delivery
9928 
9929       OPEN c_delivery_leg_from_dlvy;
9930       LOOP
9931          FETCH c_delivery_leg_from_dlvy INTO l_delivery_leg_id;
9932          EXIT WHEN c_delivery_leg_from_dlvy%NOTFOUND;
9933 
9934 
9935 
9936 	Get_Trip_Mode(
9937 		p_trip_id=>NULL,
9938 		p_dleg_id=>l_delivery_leg_id,
9939 		x_trip_id=>l_trip_id,
9940 		x_mode_of_transport=>l_mode,
9941 		x_return_status=>l_return_status);
9942 
9943 	IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS
9944 	THEN
9945 	       IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING
9946 	       THEN
9947 		  raise FTE_FREIGHT_PRICING_UTIL.g_get_trip_mode_fail;
9948 	       END IF;
9949 	END IF;
9950 
9951 	IF ((l_mode IS NOT NULL) AND (l_mode='TRUCK'))
9952 	THEN
9953 		FTE_TL_RATING.TL_Rate_Trip (
9954 		   p_trip_id=>l_trip_id ,
9955 		   p_output_type=>'M',
9956 		   p_check_reprice_flag=>'N',
9957 		   x_output_cost_tab=>l_output_tab,
9958 		   x_return_status=>l_return_status);
9959 
9960 		IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS
9961 		THEN
9962 		       IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING
9963 		       THEN
9964 			  raise FTE_FREIGHT_PRICING_UTIL.g_tl_rate_trip_fail;
9965 		       END IF;
9966 		END IF;
9967 
9968 
9969 
9970 	ELSE
9971 
9972 
9973 		 shipment_price_consolidate (
9974 		   p_delivery_leg_id         =>     l_delivery_leg_id,
9975 		   x_return_status           =>     l_return_status );
9976 
9977 		IF l_return_status = WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9978 		   FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'Shipment price consolidate successful for delivery leg : '||l_delivery_leg_id);
9979 		ELSIF l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING THEN
9980 		  x_return_status := l_return_status;
9981 		   FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'Shipment price consolidate successful for segment : '||p_segment_id);
9982 		ELSE
9983 		       FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'Delivery leg: '||l_delivery_leg_id||' shipment_price_consolidate ');
9984 		       raise FTE_FREIGHT_PRICING_UTIL.g_price_consolidate_failed;
9985 		END IF;
9986 	END IF;
9987 
9988       END LOOP;
9989       CLOSE c_delivery_leg_from_dlvy;
9990 
9991    ELSIF p_delivery_leg_id IS NOT NULL THEN
9992 
9993 	Get_Trip_Mode(
9994 		p_trip_id=>NULL,
9995 		p_dleg_id=>p_delivery_leg_id,
9996 		x_trip_id=>l_trip_id,
9997 		x_mode_of_transport=>l_mode,
9998 		x_return_status=>l_return_status);
9999 
10000 	IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS
10001 	THEN
10002 	       IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING
10003 	       THEN
10004 		  raise FTE_FREIGHT_PRICING_UTIL.g_get_trip_mode_fail;
10005 	       END IF;
10006 	END IF;
10007 
10008 	IF ((l_mode IS NOT NULL) AND (l_mode='TRUCK'))
10009 	THEN
10010 		FTE_TL_RATING.TL_Rate_Trip (
10011 		   p_trip_id=>l_trip_id ,
10012 		   p_output_type=>'M',
10013 		   p_check_reprice_flag=>'N',
10014 		   x_output_cost_tab=>l_output_tab,
10015 		   x_return_status=>l_return_status);
10016 
10017 		IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS
10018 		THEN
10019 		       IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING
10020 		       THEN
10021 			  raise FTE_FREIGHT_PRICING_UTIL.g_tl_rate_trip_fail;
10022 		       END IF;
10023 		END IF;
10024 
10025 
10026     ELSE
10027 
10028 	      shipment_price_consolidate (
10029 		p_delivery_leg_id         =>     p_delivery_leg_id,
10030 		x_return_status           =>     l_return_status );
10031 
10032 		IF l_return_status = WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
10033 		   FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'Shipment price consolidate successful for delivery leg : '||p_delivery_leg_id);
10034 		ELSIF l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING THEN
10035 		  x_return_status := l_return_status;
10036 		ELSE
10037 		       FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'delivery leg: '||p_delivery_leg_id||' shipment_price_consolidate ');
10038 		       raise FTE_FREIGHT_PRICING_UTIL.g_price_consolidate_failed;
10039 		END IF;
10040 	END IF;
10041 
10042    END IF;
10043    FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_reprice2');
10044   IF p_init_prc_log = 'Y' THEN
10045    FTE_FREIGHT_PRICING_UTIL.close_logs;
10046   END IF;
10047 
10048 EXCEPTION
10049    WHEN FTE_FREIGHT_PRICING_UTIL.g_no_input THEN
10050         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
10051         FTE_FREIGHT_PRICING_UTIL.set_exception('shipment_reprice2',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_no_input');
10052         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_reprice2');
10053   IF p_init_prc_log = 'Y' THEN
10054         FTE_FREIGHT_PRICING_UTIL.close_logs;
10055   END IF;
10056 
10057    WHEN FTE_FREIGHT_PRICING_UTIL.g_get_trip_mode_fail THEN
10058         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
10059         FTE_FREIGHT_PRICING_UTIL.set_exception('shipment_reprice2',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_get_trip_mode_fail');
10060         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_reprice2');
10061   IF p_init_prc_log = 'Y' THEN
10062         FTE_FREIGHT_PRICING_UTIL.close_logs;
10063   END IF;
10064 
10065    WHEN FTE_FREIGHT_PRICING_UTIL.g_tl_rate_trip_fail THEN
10066         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
10067         FTE_FREIGHT_PRICING_UTIL.set_exception('shipment_reprice2',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_tl_rate_trip_fail');
10068         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_reprice2');
10069   IF p_init_prc_log = 'Y' THEN
10070         FTE_FREIGHT_PRICING_UTIL.close_logs;
10071   END IF;
10072 
10073 
10074    WHEN FTE_FREIGHT_PRICING_UTIL.g_price_consolidate_failed THEN
10075         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
10076         FTE_FREIGHT_PRICING_UTIL.set_exception('shipment_reprice2',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_price_consolidate_failed');
10077         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_reprice2');
10078   IF p_init_prc_log = 'Y' THEN
10079         FTE_FREIGHT_PRICING_UTIL.close_logs;
10080   END IF;
10081 
10082    WHEN others THEN
10083         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
10084         FTE_FREIGHT_PRICING_UTIL.set_exception('shipment_reprice2',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
10085         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
10086         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_reprice2');
10087   IF p_init_prc_log = 'Y' THEN
10088         FTE_FREIGHT_PRICING_UTIL.close_logs;
10089   END IF;
10090 END shipment_reprice2;
10091 
10092 
10093 --PROCEDURE validate_rerate_delivery(p_delv_list IN FTE_ID_TAB_TYPE,
10094 
10095 -- Added for R12 to get Delivery Legs for all the deliveries.
10096 -- This is added to allow multi leg rating in case of rerating.
10097 -- In addition to this , this delivery needs to find out all the
10098 -- delivery legs for it's child deliveries in case it's console delivery.
10099 
10100 PROCEDURE  get_delivery_legs(
10101             p_deliveries_list IN  FTE_ID_TAB_TYPE,
10102             x_delivery_legs   OUT NOCOPY DELIVERY_LEG_TAB_TYPE,
10103             x_return_status   OUT NOCOPY  VARCHAR2)
10104 IS
10105 
10106     l_log_level     NUMBER := FTE_FREIGHT_PRICING_UTIL.G_LOG;
10107     l_delvy_tab     DELIVERY_LEG_TAB_TYPE;
10108     l_delv_leg_rec  delivery_leg_rec_type;
10109     i               NUMBER := 0;
10110     l_index         NUMBER := 0;
10111 
10112     CURSOR c_get_delivery_legs_detail(c_delivery_id IN NUMBER) IS
10113     SELECT wdl.delivery_id,delivery_leg_id,wnd.name
10114     FROM   wsh_delivery_legs wdl, wsh_new_deliveries wnd
10115     WHERE  wdl.delivery_id= c_delivery_id
10116     AND    wnd.delivery_id = wdl.delivery_id;
10117 
10118 BEGIN
10119 
10120   FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
10121   FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,'get_delivery_legs','start');
10122 
10123   FOR i in p_deliveries_list.FIRST..p_deliveries_list.LAST LOOP
10124     FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'looping through Delivery ids in get_delivery_legs... ');
10125     OPEN c_get_delivery_legs_detail(p_deliveries_list(i));
10126     LOOP
10127         FETCH c_get_delivery_legs_detail INTO l_delv_leg_rec;
10128         EXIT WHEN c_get_delivery_legs_detail%NOTFOUND;
10129         l_index := l_index +1;
10130         FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'l_delv_leg_rec.delivery_leg_id. ' ||l_delv_leg_rec.delivery_leg_id );
10131         --l_delvy_tab(l_delv_leg_rec.delivery_leg_id) := l_delv_leg_rec;
10132         l_delvy_tab(l_index) := l_delv_leg_rec;
10133     END LOOP;
10134     FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'Total Leg Count for Delivery. ' || p_deliveries_list(i) || ' is '|| l_delvy_tab.COUNT );
10135     CLOSE c_get_delivery_legs_detail ;
10136   END LOOP;
10137 
10138   FOR i IN l_delvy_tab.FIRST..l_delvy_tab.LAST LOOP
10139       FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,' Leg  is='|| l_delvy_tab(i).delivery_leg_id);
10140   END LOOP;
10141 
10142   FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'Out of loop for Delivery ids in get_delivery_legs... ');
10143 
10144   x_delivery_legs := l_delvy_tab;
10145 
10146 EXCEPTION
10147    WHEN others THEN
10148         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
10149         FTE_FREIGHT_PRICING_UTIL.set_exception('get_delivery_legs',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
10150         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
10151         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'get_delivery_legs');
10152 END get_delivery_legs;
10153 
10154 -- Internal procedure to get distinct trip_ids for a given
10155 -- delivery legs table.
10156 -- Added for R12. Used in rerate_shipment_online.
10157 
10158 PROCEDURE get_distinct_trip_ids( p_dleg_list IN FTE_ID_TAB_TYPE,
10159                                  x_trip_ids  OUT NOCOPY DELIVERY_TRIP_TAB_TYPE,
10160                                  x_all_trips OUT NOCOPY DELIVERY_TRIP_TAB_TYPE,
10161                                  x_return_status OUT NOCOPY VARCHAR2)
10162 
10163 IS
10164 
10165     CURSOR c_get_distinct_trip_ids(c_dleg_id IN VARCHAR2) IS
10166     SELECT DISTINCT  wdl.delivery_id,wts1.trip_id ,wdl.delivery_leg_id,wnd.name
10167     FROM  wsh_delivery_legs wdl ,
10168           wsh_trip_stops wts1,
10169           wsh_trip_stops wts2,
10170           wsh_trips      wt,
10171           wsh_new_deliveries wnd
10172     WHERE wdl.pick_up_stop_id  = wts1.stop_id
10173     AND   wdl.drop_off_stop_id = wts2.stop_id
10174     AND   wdl.delivery_leg_id  = c_dleg_id
10175     AND   wt.trip_id           = wts1.trip_id
10176     AND   wnd.delivery_id      = wdl.delivery_id;
10177 
10178     i               NUMBER := 0;
10179     l_dleg_ids      VARCHAR2(32767);
10180     l_trip_ids      VARCHAR2(32767);
10181     l_log_level     NUMBER := FTE_FREIGHT_PRICING_UTIL.G_LOG;
10182     l_api_name      CONSTANT VARCHAR2(30)   := 'get_distinct_trip_ids';
10183     l_trip_id       NUMBER;
10184     l_is_first      BOOLEAN := TRUE ;
10185     --l_del_trip_tab  DELIVERY_TRIP_TAB_TYPE;
10186     l_del_trip_rec  DELIVERY_TRIP_REC_TYPE;
10187     j               NUMBER  := 0;
10188     trip_exists     BOOLEAN := FALSE;
10189     l_trip_index    NUMBER  := 0;
10190 
10191 BEGIN
10192 
10193     FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
10194     FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,l_api_name);
10195     --x_trip_ids := FTE_ID_TAB_TYPE();
10196 
10197     FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,p_dleg_list.COUNT);
10198 
10199     FOR i IN p_dleg_list.FIRST..p_dleg_list.COUNT LOOP
10200         OPEN c_get_distinct_trip_ids(p_dleg_list(i));
10201         FETCH c_get_distinct_trip_ids INTO l_del_trip_rec;
10202         FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'After Fetch');
10203         -- Only store unique trips in trips table.
10204         IF x_trip_ids.COUNT > 0 THEN
10205             FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'x_trip_ids.COUNT > 0');
10206             FOR j IN x_trip_ids.FIRST..x_trip_ids.COUNT LOOP
10207                 FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'x_trip_ids(j).trip_id = ' || x_trip_ids(j).trip_id);
10208                 FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'l_del_trip_rec.trip_id = ' || l_del_trip_rec.trip_id);
10209                 IF x_trip_ids(j).trip_id  = l_del_trip_rec.trip_id THEN
10210                     trip_exists := true;
10211                     EXIT WHEN trip_exists;
10212                     -- break the loop
10213                 ELSE
10214                     trip_exists := false;
10215                 END IF;
10216             END LOOP;
10217         END IF;
10218 FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'After Unique trip loop ');
10219 --FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'trip_exists = ' || to_char(trip_exists));
10220 
10221          IF NOT trip_exists then
10222             l_trip_index := l_trip_index +1;
10223             x_trip_ids(l_trip_index) := l_del_trip_rec;
10224          END IF;
10225 
10226          x_all_trips(i) := l_del_trip_rec;
10227 
10228         CLOSE c_get_distinct_trip_ids;
10229     END LOOP;
10230 
10231     FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'Trip Ids Count=' || x_trip_ids.COUNT);
10232     FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'get_distinct_trip_ids');
10233 
10234 
10235 EXCEPTION
10236   WHEN others THEN
10237         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
10238         FTE_FREIGHT_PRICING_UTIL.set_exception('get_distinct_trip_ids',FTE_FREIGHT_PRICING_UTIL.G_ERR,'get distinct trips failed');
10239         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'get_distinct_trip_ids');
10240 END get_distinct_trip_ids;
10241 
10242  --This API is written for R12. It does the following validation
10243  -- 1) Delivery type is Outbound/Internal Orders and status is Open
10244  -- 2) Or Delivery type is Inbound/Drop Ship
10245  -- If a delivery  doesnt meet this criteria, it;s removed from the deliveries list
10246  -- which need rerating
10247  -- For Deliveries which fail validation a new message is written in log file.
10248 
10249 PROCEDURE    validate_delv_for_rerating
10250                     ( p_deliveries_list IN FTE_ID_TAB_TYPE,
10251                       x_deliveries_list OUT NOCOPY FTE_ID_TAB_TYPE
10252                      )
10253 
10254 IS
10255 
10256     l_new_delv_list         FTE_ID_TAB_TYPE;
10257     l_api_name              CONSTANT VARCHAR2(30)   := 'validate_delv_for_rerating';
10258     l_log_level             NUMBER := FTE_FREIGHT_PRICING_UTIL.G_LOG;
10259     i                       NUMBER := 0;
10260     l_var                   VARCHAR2(1);
10261 
10262     CURSOR check_delivery_type (c_delivery_id IN NUMBER)
10263     IS
10264     SELECT 'X' FROM WSH_NEW_DELIVERIES
10265     WHERE ( shipment_direction IN ('O','IO') AND status_code = 'OP')
10266     OR    (  shipment_direction IN ('D','I') )
10267     AND delivery_id = c_delivery_id ;
10268 
10269 BEGIN
10270     FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
10271     FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,l_api_name);
10272     l_new_delv_list := FTE_ID_TAB_TYPE();
10273 
10274    FOR i IN p_deliveries_list.FIRST..p_deliveries_list.LAST
10275    LOOP
10276        OPEN check_delivery_type(p_deliveries_list(i));
10277        FETCH check_delivery_type INTO l_var;
10278        IF check_delivery_type%NOTFOUND THEN
10279             FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'Delv='|| p_deliveries_list(i) || ' doesnt meet criteria of direction 0/IO with Status OP OR Direction D/I');
10280         ELSE
10281             l_new_delv_list.EXTEND;
10282             l_new_delv_list(i) := p_deliveries_list(i);
10283         END IF;
10284         CLOSE check_delivery_type;
10285    END LOOP;
10286 
10287    x_deliveries_list := l_new_delv_list;
10288 
10289 EXCEPTION
10290 
10291     WHEN OTHERS THEN
10292         FTE_FREIGHT_PRICING_UTIL.set_exception('validate_delv_for_rerating',FTE_FREIGHT_PRICING_UTIL.G_ERR,'validate_delv_for_rerating failed');
10293         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'validate_delv_for_rerating');
10294 
10295 END validate_delv_for_rerating;
10296 
10297 --This API is written for R12. It does the following validation
10298 -- 1) Delivery leg has a rate
10299 -- If a delivery leg doesnt have existing rates, it removes it from
10300 -- the list of dlegs which need to be rerated.
10301 -- For Dlegs which fail validation a new message is written in log file.
10302 PROCEDURE     validate_delivery_legs(p_dlegs_list IN FTE_ID_TAB_TYPE,
10303                                      x_dleg_list  OUT NOCOPY FTE_ID_TAB_TYPE,
10304                                      x_failed_dleg_list OUT NOCOPY FTE_ID_TAB_TYPE,
10305                                      x_return_status OUT NOCOPY VARCHAR2
10306                                      )
10307 
10308 IS
10309     l_new_dleg_list         FTE_ID_TAB_TYPE;
10310     l_failed_dleg_list      FTE_ID_TAB_TYPE;
10311     l_api_name              CONSTANT VARCHAR2(30)   := 'validate_delivery_legs';
10312     l_log_level             NUMBER := FTE_FREIGHT_PRICING_UTIL.G_LOG;
10313     i                       NUMBER := 0;
10314     l_var                   NUMBER;--VARCHAR2(1);
10315     dleg_rates_not_found    EXCEPTION;
10316 
10317 
10318     CURSOR check_freight_cost_exist (c_delivery_leg_id IN NUMBER)
10319     IS
10320     SELECT total_amount FROM wsh_freight_costs
10321     WHERE line_type_code='SUMMARY'
10322     AND delivery_detail_id is null
10323     AND freight_cost_type_id is not null
10324     AND delivery_leg_id= c_delivery_leg_id;
10325 
10326 BEGIN
10327     FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
10328     FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,l_api_name);
10329     l_new_dleg_list := FTE_ID_TAB_TYPE();
10330     l_failed_dleg_list := FTE_ID_TAB_TYPE();
10331 
10332    FOR i IN p_dlegs_list.FIRST..p_dlegs_list.LAST
10333    LOOP
10334        OPEN check_freight_cost_exist(p_dlegs_list(i));
10335        FETCH check_freight_cost_exist INTO l_var;
10336        IF check_freight_cost_exist%NOTFOUND THEN
10337             FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,' No existing rates found for dleg='|| p_dlegs_list(i) || ' Required for rerating ');
10338             l_failed_dleg_list.EXTEND;
10339             l_failed_dleg_list(l_failed_dleg_list.LAST) := p_dlegs_list(i);
10340         ELSIF  l_var IS NULL THEN
10341             FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,' Total amt. Null for dleg='|| p_dlegs_list(i) || ' Required for rerating ');
10342             l_failed_dleg_list.EXTEND;
10343             l_failed_dleg_list(l_failed_dleg_list.LAST) := p_dlegs_list(i);
10344         ELSE
10345             FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,' Existing rates found for dleg='|| p_dlegs_list(i) || ' Required for rerating ');
10346             l_new_dleg_list.EXTEND;
10347             l_new_dleg_list(l_new_dleg_list.LAST) := p_dlegs_list(i);
10348         END IF;
10349         CLOSE check_freight_cost_exist;
10350    END LOOP;
10351 
10352    x_dleg_list := l_new_dleg_list;
10353    x_failed_dleg_list := l_failed_dleg_list;
10354 
10355    FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'validate_delivery_legs');
10356 
10357 
10358 EXCEPTION
10359 
10360     --WHEN dleg_rates_not_found THEN
10361       --  x_return_status :=  WSH_UTIL_CORE.G_RET_STS_ERROR;
10362       --  FTE_FREIGHT_PRICING_UTIL.set_exception('validate_delivery_legs',FTE_FREIGHT_PRICING_UTIL.G_ERR,'dleg_rates_not_found');
10363       --  FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'validate_delivery_legs');
10364     WHEN OTHERS THEN
10365         FTE_FREIGHT_PRICING_UTIL.set_exception('validate_delivery_legs',FTE_FREIGHT_PRICING_UTIL.G_ERR,'validate_delivery_legs failed');
10366         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
10367         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'validate_delivery_legs');
10368 END validate_delivery_legs;
10369 
10370 
10371 PROCEDURE    validate_trips(p_trip_id_list IN WSH_UTIL_CORE.id_tab_type,
10372                             x_failed_trips_list OUT NOCOPY WSH_UTIL_CORE.id_tab_type,
10373                             x_success_trips_list OUT NOCOPY WSH_UTIL_CORE.id_tab_type,
10374                             x_closed_trips_list  OUT NOCOPY WSH_UTIL_CORE.id_tab_type)
10375 
10376 IS
10377 
10378    CURSOR c_trip_info(c_trip_id NUMBER)
10379    IS
10380    SELECT wt.trip_id,
10381       wt.name,
10382       wt.planned_flag,
10383       wt.status_code,
10384       wt.carrier_id,
10385       wt.ship_method_code,
10386       wt.service_level,
10387       wt.mode_of_transport,
10388       wt.consolidation_allowed,
10389       wt.lane_id,
10390       wt.schedule_id,
10391       wt.load_tender_status
10392    FROM   wsh_trips wt
10393    WHERE  wt.trip_id = c_trip_id;
10394 
10395    CURSOR c_get_trip_direction(c_trip_id NUMBER)
10396    IS
10397    SELECT shipments_type_flag
10398    FROM   wsh_trips
10399    WHERE  trip_id = c_trip_id;
10400 
10401    l_trip_info trip_info_rec;
10402    i                NUMBER;
10403    l_fail_index     NUMBER := 0;
10404    l_success_index  NUMBER := 0;
10405    l_closed_index   NUMBER := 0;
10406    l_api_name       CONSTANT VARCHAR2(30)   := 'validate_trips';
10407    l_log_level      NUMBER := FTE_FREIGHT_PRICING_UTIL.G_LOG;
10408    l_trip_direction VARCHAR2(30);
10409    l_valid_trip     VARCHAR2(1) := 'Y';
10410 
10411 BEGIN
10412     FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
10413     FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,l_api_name);
10414 
10415     FOR i IN p_trip_id_list.FIRST..p_trip_id_list.LAST
10416     LOOP
10417         OPEN c_trip_info(p_trip_id_list(i));
10418         FETCH c_trip_info INTO l_trip_info;
10419         CLOSE c_trip_info;
10420 
10421        FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,' Trip Id is ='|| p_trip_id_list(i));
10422        FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'Trip status  is ='|| l_trip_info.status_code);
10423 
10424         -- In CASE OF closed trips, only allow re-rating of
10425         -- Inbound or Mixed trips. Do not allow rerating of
10426         -- closed outbound trips.
10427         IF l_trip_info.status_code = 'CL' THEN
10428             OPEN c_get_trip_direction(p_trip_id_list(i));
10429             FETCH c_get_trip_direction INTO l_trip_direction;
10430             CLOSE c_get_trip_direction;
10431             FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'l_trip_direction ='|| l_trip_direction);
10432             IF (l_trip_direction = 'O' ) OR (l_trip_direction IS NULL) THEN
10433                 l_valid_trip := 'N';
10434             ELSE
10435                 l_valid_trip := 'Y';
10436             END IF;
10437         END IF;
10438 
10439         IF l_valid_trip = 'Y' THEN
10440 
10441             IF l_trip_info.carrier_id is null OR l_trip_info.mode_of_transport is null
10442              OR l_trip_info.service_level is null  THEN
10443                  FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'should have full ship method to rerate a trip !!! Trip Id ='|| p_trip_id_list(i));
10444                  l_fail_index := l_fail_index + 1;
10445                  x_failed_trips_list(l_fail_index) := p_trip_id_list(i);
10446              ELSE
10447                  FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'Trip has full ship method  !!! Trip Id ='|| p_trip_id_list(i));
10448                  l_success_index := l_success_index + 1;
10449                  x_success_trips_list(l_success_index) := p_trip_id_list(i);
10450              END IF;
10451         ELSE
10452              FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'Trip Direction/Status combination is not elegible for rarating ');
10453              l_closed_index := l_closed_index + 1;
10454              x_closed_trips_list(l_closed_index) := p_trip_id_list(i);
10455         END IF;
10456     END LOOP;
10457 
10458    FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'Failed Trips = '|| x_failed_trips_list.COUNT);
10459    FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'Success Trips = '|| x_success_trips_list.COUNT);
10460 
10461    FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,l_api_name);
10462 
10463 EXCEPTION
10464 
10465     WHEN OTHERS THEN
10466         FTE_FREIGHT_PRICING_UTIL.set_exception(l_api_name,FTE_FREIGHT_PRICING_UTIL.G_ERR,'validate_trips failed');
10467         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,l_api_name);
10468 
10469 END validate_trips;
10470 -- This API is called directly from DWB
10471 -- Modified the signature for 12i. p_delivery_leg_list can contain list of Delivery Ids or Delivery Legs
10472 -- Based on p_deliveries_list_type , it'll call different rating modules.
10473 -- In R12 behavior of rerating will change as in case of a delivery/dleg , with more
10474 -- delivery legs on the same trip we'll call rerating of the complete trip.
10475 -- So in case of rerating Trip level rating will be called always instead of individual delivery leg
10476 
10477 PROCEDURE rerate_shipment_online(
10478             p_api_version		IN  NUMBER DEFAULT 1.0,
10479             p_init_msg_list		IN  VARCHAR2 DEFAULT FND_API.G_FALSE,
10480             p_commit                IN  VARCHAR2 DEFAULT FND_API.G_FALSE,
10481             p_deliveries_list    IN  FTE_ID_TAB_TYPE,
10482             p_delivery_name_list	IN  FTE_NAME_TAB_TYPE,
10483             p_deliveries_list_type IN VARCHAR2 ,  -- This will have 'DEL' for Delivery IDs or 'DLEG' for Delivery Leg Ids.
10484             x_success_list		OUT NOCOPY  FTE_ID_TAB_TYPE,
10485             x_warning_list		OUT NOCOPY  FTE_ID_TAB_TYPE,
10486             x_fail_list		OUT NOCOPY  FTE_ID_TAB_TYPE,
10487             x_return_status         OUT NOCOPY  VARCHAR2,
10488             x_msg_count	        OUT NOCOPY  NUMBER,
10489             x_msg_data        OUT NOCOPY  VARCHAR2)
10490 IS
10491   l_dleg_list_empty     EXCEPTION;
10492   l_del_name_mismatch   EXCEPTION;
10493   l_delv_list_empty     EXCEPTION;
10494   l_trip_rating_failed  EXCEPTION;
10495   l_dleg_validation_failed EXCEPTION;
10496   l_delivery_validation_failed EXCEPTION;
10497 
10498   l_log_level               NUMBER := FTE_FREIGHT_PRICING_UTIL.G_LOG;
10499   l_api_version             CONSTANT NUMBER := 1.0;
10500   l_api_name                CONSTANT VARCHAR2(30)   := 'rerate_shipment_online';
10501   --l_return_status         VARCHAR2(1);
10502   l_msg_count               NUMBER := 0;
10503   l_msg_data                VARCHAR2(32767);
10504   l_fail_delivery_name_list VARCHAR2(32767);
10505   l_warn_delivery_name_list VARCHAR2(32767);
10506   i                         NUMBER;
10507   l_failed_leg_list         FTE_ID_TAB_TYPE;
10508   l_success_leg_list        FTE_ID_TAB_TYPE;
10509   l_warning_leg_list        FTE_ID_TAB_TYPE;
10510   l_dleg_list               FTE_ID_TAB_TYPE;
10511   --l_trip_ids              FTE_ID_TAB_TYPE;
10512   l_new_deliveries_list     FTE_ID_TAB_TYPE;
10513   l_new_dleg_list           FTE_ID_TAB_TYPE;
10514   l_delv_legs               DELIVERY_LEG_TAB_TYPE;
10515   l_index                   NUMBER := 0;
10516   l_trip_id                 NUMBER;
10517   l_failed_list             FTE_ID_TAB_TYPE;
10518   l_success_list            FTE_ID_TAB_TYPE;
10519   l_warning_list            FTE_ID_TAB_TYPE;
10520   l_trip_ids                DELIVERY_TRIP_TAB_TYPE;
10521   j                         NUMBER;
10522   l_all_trips               DELIVERY_TRIP_TAB_TYPE;
10523   j1                        NUMBER;
10524   l_service_failed          VARCHAR2(1) ;
10525   l_service_failed_delv_ids VARCHAR2(32767);
10526   l_closed_trips_delv_ids   VARCHAR2(32767);
10527   l_fail_val_dleg_list      FTE_ID_TAB_TYPE;
10528   l_action_params           FTE_TRIP_RATING_GRP.action_param_rec;
10529   l_trip_id_list            WSH_UTIL_CORE.id_tab_type;
10530   l_failed_trips            WSH_UTIL_CORE.id_tab_type;
10531   l_success_trips           WSH_UTIL_CORE.id_tab_type;
10532   l_temp_trips_tab          WSH_UTIL_CORE.id_tab_type;
10533   l_closed_trips            WSH_UTIL_CORE.id_tab_type;
10534   l_number_of_warnings      NUMBER;
10535   l_number_of_errors        NUMBER;
10536   l_return_status           VARCHAR2(32767);
10537   l_no_rates_delv_ids       VARCHAR2(32767);
10538   l_status                  VARCHAR2(30);
10539   l_message		    VARCHAR2(32767);
10540   l_delv_with_multlegs_names    VARCHAR2(32767);
10541   l_delv_srv_failed_names       VARCHAR2(32767);
10542   l_close_trdelv_name_list VARCHAR2(32767);
10543 
10544   CURSOR c_get_status_meaning
10545   IS
10546   SELECT meaning
10547   FROM   wsh_lookups
10548   WHERE  lookup_code = 'CL'
10549   AND    lookup_type = 'TRIP_STATUS';
10550 
10551 
10552 
10553 
10554 BEGIN
10555     SAVEPOINT  rerate_shipment_online;
10556 --
10557     -- Standard call to check for call compatibility.
10558     IF NOT FND_API.Compatible_API_Call
10559                          (
10560                            l_api_version,
10561                            p_api_version,
10562                            l_api_name,
10563                            G_PKG_NAME
10564                           )
10565     THEN
10566 	        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10567     END IF;
10568 
10569 
10570     -- Initialize message list if p_init_msg_list is set to TRUE.
10571   IF FND_API.to_Boolean( p_init_msg_list )
10572      THEN
10573         FND_MSG_PUB.initialize;
10574   END IF;
10575 
10576   x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
10577 
10578    FTE_FREIGHT_PRICING_UTIL.initialize_logging(x_return_status => l_return_status);
10579 
10580    IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
10581        IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
10582             x_return_status  :=  l_return_status;
10583             RETURN;
10584        END IF;
10585    ELSE
10586        FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'Initialize Logging successful ');
10587    END IF;
10588 
10589   FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
10590   FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,l_api_name);
10591 
10592   FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'p_api_version='||p_api_version);
10593   FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'p_init_msg_list='||p_init_msg_list);
10594   FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'p_commit='||p_commit);
10595   FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'p_deliveries_list_type='||p_deliveries_list_type);
10596   FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'p_deliveries_name_list.count='||p_delivery_name_list.count);
10597 
10598 
10599   IF p_deliveries_list.COUNT <= 0 THEN
10600     IF p_deliveries_list_type = 'DEL' THEN
10601         raise l_delv_list_empty;
10602     ELSE
10603         raise l_dleg_list_empty;
10604     END IF;
10605   END IF;
10606 
10607 
10608   IF p_deliveries_list.COUNT <> p_delivery_name_list.COUNT THEN
10609     raise l_del_name_mismatch;
10610   END IF;
10611 
10612   -- If deliveries are passed for re-rating.
10613   -- get all the delivery legs for those deliveries. Done for R12
10614 
10615     l_dleg_list := FTE_ID_TAB_TYPE();
10616     l_failed_list := FTE_ID_TAB_TYPE();
10617     l_success_list := FTE_ID_TAB_TYPE();
10618     l_warning_list := FTE_ID_TAB_TYPE();
10619 
10620 
10621     IF  p_deliveries_list_type = 'DEL' THEN
10622 
10623         validate_delv_for_rerating( p_deliveries_list => p_deliveries_list,
10624                                     x_deliveries_list => l_new_deliveries_list
10625                                   );
10626         get_delivery_legs( p_deliveries_list    => l_new_deliveries_list,
10627                            x_delivery_legs      => l_delv_legs,
10628                            x_return_status      => x_return_status);
10629 
10630         FOR l_index IN p_deliveries_list.FIRST..p_deliveries_list.LAST LOOP
10631            IF ( hasMultipleLegs(p_deliveries_list(l_index)) = 'Y') THEN
10632                IF l_delv_with_multlegs_names IS NOT NULL THEN
10633                     l_delv_with_multlegs_names := l_delv_with_multlegs_names ||' '|| p_delivery_name_list(l_index);
10634                ELSE
10635                     l_delv_with_multlegs_names := p_delivery_name_list(l_index);
10636                END IF;
10637                l_warning_list.EXTEND;
10638                l_warning_list(l_warning_list.LAST) := p_deliveries_list(l_index);
10639            END IF;
10640         END LOOP;
10641         FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'l_delv_legs.count=' || l_delv_legs.count);
10642         l_index := 0;
10643         FOR l_index IN l_delv_legs.FIRST..l_delv_legs.LAST LOOP
10644             FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'l_index=' || l_index);
10645             FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'l_delv_legs(l_index).delivery_leg_id' || l_delv_legs(l_index).delivery_leg_id);
10646             l_dleg_list.EXTEND;
10647             l_dleg_list(l_dleg_list.LAST) := l_delv_legs(l_index).delivery_leg_id;
10648         END LOOP;
10649     ELSE
10650         For l_index IN p_deliveries_list.FIRST..p_deliveries_list.LAST
10651         LOOP
10652            l_dleg_list.EXTEND;
10653            l_dleg_list(l_dleg_list.LAST) := p_deliveries_list(l_index);
10654         END LOOP;
10655     END IF;
10656 
10657 
10658     validate_delivery_legs(p_dlegs_list => l_dleg_list,
10659                            x_dleg_list  => l_new_dleg_list,
10660                            x_failed_dleg_list => l_fail_val_dleg_list,
10661                            x_return_status => x_return_status
10662                           );
10663 
10664     -- Get distinct trips from these delivery legs so that
10665     -- rating is not performed for same trips multiple times
10666     -- Add validation failed delivery legs also to failed list
10667     -- And raise Exception
10668     FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,' No rates failed list::= '||l_fail_val_dleg_list.COUNT);
10669 
10670     FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,' Total Delivery Legs list l_delv_legs::= '||l_delv_legs.COUNT);
10671 
10672     l_index := 0;
10673 
10674     IF  l_fail_val_dleg_list.COUNT > 0 THEN
10675         FOR j1 IN l_fail_val_dleg_list.FIRST..l_fail_val_dleg_list.LAST LOOP
10676             IF p_deliveries_list_type = 'DEL' THEN
10677                 FOR l_index IN l_delv_legs.FIRST..l_delv_legs.LAST LOOP
10678                     IF l_delv_legs(l_index).delivery_leg_id = l_fail_val_dleg_list(j1) THEN
10679                           FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'Failed Delivery Name :='||l_delv_legs(l_index).delivery_name);
10680                           IF l_fail_delivery_name_list IS NOT NULL THEN
10681                              l_fail_delivery_name_list := l_delv_legs(l_index).delivery_name;
10682                           ELSE
10683                              l_fail_delivery_name_list := l_fail_delivery_name_list ||' '||l_delv_legs(l_index).delivery_name;
10684                           END IF;
10685                     END IF;
10686                 END LOOP;
10687             ELSE
10688                 FOR l_index IN l_dleg_list.FIRST..l_dleg_list.LAST LOOP
10689                     IF l_dleg_list(l_index) = l_fail_val_dleg_list(j1) THEN
10690                           FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'Failed Delivery Name :='||p_delivery_name_list(l_index));
10691                           IF l_fail_delivery_name_list IS NOT NULL THEN
10692                              l_fail_delivery_name_list := p_delivery_name_list(l_index);
10693                           ELSE
10694                              l_fail_delivery_name_list := l_fail_delivery_name_list ||' '||p_delivery_name_list(l_index);
10695                           END IF;
10696                     END IF;
10697                 END LOOP;
10698             END IF;
10699         END LOOP;
10700         FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,' No rates failed list::= '||l_no_rates_delv_ids);
10701         FND_MESSAGE.SET_NAME('FTE','FTE_PRC_RERATE_NORATES');
10702         FND_MESSAGE.SET_TOKEN('DEL_NAMES',l_fail_delivery_name_list);
10703         --FND_MESSAGE.SET_TOKEN('LOGFILE',FTE_FREIGHT_PRICING_UTIL.get_log_file_name());
10704         FND_MSG_PUB.ADD;
10705         raise l_delivery_validation_failed;
10706     END IF;
10707 
10708 
10709 
10710     IF (l_new_dleg_list IS NOT NULL ) OR (l_new_dleg_list.COUNT > 0 )
10711     THEN
10712         get_distinct_trip_ids( p_dleg_list => l_new_dleg_list,
10713                                x_trip_ids => l_trip_ids ,
10714                                x_all_trips => l_all_trips,
10715                                x_return_status => x_return_status) ;
10716         l_index := 0;
10717         -- Call Trip rating for all the trips.
10718         j := 1;
10719         FOR l_index IN l_trip_ids.FIRST..l_trip_ids.LAST LOOP
10720             l_trip_id_list (j) := l_trip_ids(l_index).trip_id;
10721             j := j+1;
10722         END LOOP;
10723         validate_trips(p_trip_id_list => l_trip_id_list,
10724                        x_failed_trips_list => l_failed_trips,
10725                        x_success_trips_list => l_success_trips,
10726                        x_closed_trips_list => l_closed_trips);
10727         -- For trips which failed to validate for full ship_method
10728         -- Get the deliveries/Dlegs and add them to failed list.
10729         j := 0;
10730         IF l_failed_trips.COUNT > 0 THEN
10731             FOR j IN l_failed_trips.FIRST..l_failed_trips.LAST LOOP
10732                 FOR j1 IN l_failed_trips.FIRST..l_failed_trips.LAST LOOP
10733                     IF l_all_trips(j1).trip_id = l_failed_trips(j) THEN
10734                         --IF l_service_failed_delv_ids is null THEN
10735                         --    l_service_failed_delv_ids := l_all_trips(j1).delivery_id;
10736                         --ELSE
10737                         --   l_service_failed_delv_ids := l_service_failed_delv_ids ||' '||l_all_trips(j1).delivery_id;
10738                         --END IF;
10739                         l_failed_list.EXTEND;
10740                         IF p_deliveries_list_type = 'DEL' THEN
10741                             l_failed_list(l_failed_list.LAST) := l_all_trips(j1).delivery_id;
10742                         ELSE
10743                             l_failed_list(l_failed_list.LAST) := l_all_trips(j1).delivery_leg_id;
10744                         END IF;
10745                         IF l_delv_srv_failed_names IS NOT NULL THEN
10746                             l_delv_srv_failed_names := l_all_trips(j1).delivery_name;
10747                         ELSE
10748                             l_delv_srv_failed_names := l_delv_srv_failed_names ||' '||l_all_trips(j1).delivery_name;
10749                         END IF;
10750                     END IF;
10751                 END LOOP;
10752             END LOOP;
10753     END IF;
10754 
10755 
10756     -- Handle Closed trips information for Error Messages and Warning.
10757     -- Trips which failed to validate for status/direction
10758     -- Get the deliveries/Dlegs and add them to failed list.
10759     j := 0;
10760     j1 := 0;
10761     IF l_closed_trips.COUNT > 0 THEN
10762 
10763         OPEN c_get_status_meaning;
10764         FETCH c_get_status_meaning INTO l_status;
10765         CLOSE c_get_status_meaning;
10766         FOR j IN l_closed_trips.FIRST..l_closed_trips.LAST LOOP
10767             FOR j1 IN l_all_trips.FIRST..l_all_trips.LAST LOOP
10768                 IF l_all_trips(j1).trip_id = l_closed_trips(j) THEN
10769                     --IF l_closed_trips_delv_ids is null THEN
10770                     --    l_closed_trips_delv_ids := l_all_trips(j1).delivery_id;
10771                     --ELSE
10772                     --    l_closed_trips_delv_ids := l_closed_trips_delv_ids ||' '||l_all_trips(j1).delivery_id;
10773                     --END IF;
10774                     l_failed_list.EXTEND;
10775                     IF p_deliveries_list_type = 'DEL' THEN
10776                         l_failed_list(l_failed_list.LAST) := l_all_trips(j1).delivery_id;
10777                     ELSE
10778                         l_failed_list(l_failed_list.LAST) := l_all_trips(j1).delivery_leg_id;
10779                     END IF;
10780                     IF l_close_trdelv_name_list IS NOT NULL THEN
10781                        l_close_trdelv_name_list := l_all_trips(j1).delivery_name;
10782                     ELSE
10783                        l_close_trdelv_name_list := l_close_trdelv_name_list ||' '||l_all_trips(j1).delivery_name;
10784                     END IF;
10785                 END IF;
10786             END LOOP;
10787         END LOOP;
10788     END IF;
10789 
10790     FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'Failed Service Deliveries= '||l_service_failed_delv_ids);
10791 
10792 
10793 
10794 l_index := 0;
10795 
10796     IF l_success_trips.COUNT > 0 THEN
10797         FOR l_index IN l_success_trips.FIRST..l_success_trips.LAST LOOP
10798             l_action_params.caller :=  'FTE';
10799             l_action_params.event  := 'RE-RATING';
10800             l_action_params.action := 'RATE';
10801             l_temp_trips_tab(1)    := l_success_trips(l_index);
10802             l_action_params.trip_id_list := l_temp_trips_tab;
10803 
10804             FTE_TRIP_RATING_GRP.Rate_Trip
10805             (
10806                  p_api_version              => 1.0,
10807                  p_init_msg_list            => FND_API.G_FALSE,
10808                  p_action_params            => l_action_params,
10809                  p_commit                   => FND_API.G_FALSE,
10810                  p_init_prc_log             => 'N',
10811                  x_return_status            => l_return_status,
10812                  x_msg_count                => l_msg_count,
10813                  x_msg_data                 => l_msg_data
10814              );
10815             j1 := 0;
10816             IF l_return_status = WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
10817                FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'Trip Re-Rating successful for trip_id : '||l_trip_ids(l_index).trip_id);
10818                 FOR j1 IN l_all_trips.FIRST..l_all_trips.LAST LOOP
10819                   IF l_all_trips(j1).trip_id = l_trip_ids(l_index).trip_id THEN
10820                       l_success_list.EXTEND;
10821                       IF p_deliveries_list_type = 'DEL' THEN
10822                           l_success_list(l_success_list.LAST) := l_all_trips(j1).delivery_id;
10823                       ELSE
10824                           l_success_list(l_success_list.LAST) := l_all_trips(j1).delivery_leg_id;
10825                       END IF;
10826                   END IF;
10827                 END LOOP;
10828              ELSIF l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING THEN
10829                 FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'Trip Re-Rating with Warnings for trip_id : '||l_trip_ids(l_index).trip_id);
10830                 x_return_status := l_return_status;
10831 
10832                 FND_MSG_PUB.Count_And_Get
10833                 (
10834                    p_count  => l_msg_count,
10835                    p_data  =>  l_message,
10836                    p_encoded => FND_API.G_FALSE
10837                 );
10838                 FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'Warning : '||l_message);
10839                 FOR j1 IN l_all_trips.FIRST..l_all_trips.LAST LOOP
10840                   IF l_all_trips(j1).trip_id = l_trip_ids(l_index).trip_id THEN
10841                      IF l_warn_delivery_name_list is null THEN
10842                           l_warn_delivery_name_list := l_all_trips(j1).delivery_id;
10843                       ELSE
10844                           l_warn_delivery_name_list := l_warn_delivery_name_list ||' '||l_all_trips(j1).delivery_id;
10845                       END IF;
10846                       l_warning_list.EXTEND;
10847                       IF p_deliveries_list_type = 'DEL' THEN
10848                         l_warning_list(l_warning_list.LAST) := l_all_trips(j1).delivery_id;
10849                       ELSE
10850                         l_warning_list(l_warning_list.LAST) := l_all_trips(j1).delivery_leg_id;
10851                       END IF;
10852                   END IF;
10853                 END LOOP;
10854              ELSE
10855                 FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'trip id: '|| l_trip_ids(l_index).trip_id || ' rate_trip2 ');
10856                 x_return_status := l_return_status;
10857                 FND_MSG_PUB.Count_And_Get
10858                 (
10859                    p_count  => l_msg_count,
10860                    p_data  =>  l_message,
10861                    p_encoded => FND_API.G_FALSE
10862                 );
10863                 FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'Error : '||l_message);
10864                 FOR j1 IN l_all_trips.FIRST..l_all_trips.LAST LOOP
10865                   IF l_all_trips(j1).trip_id = l_trip_ids(l_index).trip_id THEN
10866                     IF l_fail_delivery_name_list is null THEN
10867                           l_fail_delivery_name_list := l_all_trips(j1).delivery_id;
10868                       ELSE
10869                           l_fail_delivery_name_list := l_fail_delivery_name_list ||' '||l_all_trips(j1).delivery_id;
10870                       END IF;
10871                       l_failed_list.EXTEND;
10872                       IF p_deliveries_list_type = 'DEL' THEN
10873                           l_failed_list(l_failed_list.LAST) := l_all_trips(j1).delivery_id;
10874                       ELSE
10875                           l_failed_list(l_failed_list.LAST) := l_all_trips(j1).delivery_leg_id;
10876                       END IF;
10877                   END IF;
10878                 END LOOP;
10879              END IF;
10880         END LOOP; -- End Loop for l_trip_ids. Trip rating.
10881     END IF;
10882 
10883     FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'l_trip_ids.COUNT=' || l_trip_ids.COUNT);
10884     FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'l_failed_list.COUNT='|| l_failed_list.COUNT);
10885     FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'l_warning_list.COUNT='|| l_warning_list.COUNT);
10886     FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'l_success_list.COUNT='|| l_success_list.COUNT);
10887 
10888     FND_MSG_PUB.Delete_Msg ( p_msg_index => null);
10889 
10890     IF l_success_list.COUNT > 0 THEN
10891         IF l_success_list.COUNT = l_dleg_list.COUNT THEN
10892         x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
10893         END IF;
10894     END IF;
10895 
10896     IF l_warning_list.COUNT > 0 THEN
10897         x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
10898         IF l_delv_with_multlegs_names IS NOT NULL THEN
10899             FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,' Delv with MulipleLegs::= '||l_delv_with_multlegs_names);
10900             FND_MESSAGE.SET_NAME('FTE','FTE_PRC_RERATE_MULTILEG_WARN');
10901             FND_MESSAGE.SET_TOKEN('DEL_NAMES',l_delv_with_multlegs_names);
10902             FND_MSG_PUB.ADD;
10903         END IF;
10904         FND_MESSAGE.SET_NAME('FTE','FTE_PRC_RERATE_SHIPMENT_WARNIN');
10905         FND_MESSAGE.SET_TOKEN('DEL_NAMES',l_warn_delivery_name_list);
10906         FND_MESSAGE.SET_TOKEN('LOGFILE',FTE_FREIGHT_PRICING_UTIL.get_log_file_name());
10907         FND_MSG_PUB.ADD;
10908     END IF;
10909 
10910 
10911      IF l_failed_list.COUNT >0 THEN
10912         IF l_delv_srv_failed_names IS NOT NULL THEN
10913             FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'Service failed list::= '||l_delv_srv_failed_names);
10914             FND_MESSAGE.SET_NAME('FTE','FTE_PRC_RERATE_SERVICE_FAILED');
10915             FND_MESSAGE.SET_TOKEN('DEL_NAMES',l_delv_srv_failed_names);
10916             --FND_MESSAGE.SET_TOKEN('LOGFILE',FTE_FREIGHT_PRICING_UTIL.get_log_file_name());
10917             FND_MSG_PUB.ADD;
10918         END IF;
10919         IF l_closed_trips_delv_ids IS NOT NULL THEN
10920             FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'Deliveries with Closed Trips list::= '||l_close_trdelv_name_list);
10921             FND_MESSAGE.SET_NAME('FTE','FTE_MLS_CANNOT_UPD_RATE');
10922             FND_MESSAGE.SET_TOKEN('DELIVERY_NAME',l_close_trdelv_name_list);
10923             FND_MESSAGE.SET_TOKEN('DELIVERY_STATUS',l_status);
10924             --FND_MESSAGE.SET_TOKEN('LOGFILE',FTE_FREIGHT_PRICING_UTIL.get_log_file_name());
10925             FND_MSG_PUB.ADD;
10926         END IF;
10927         IF l_fail_delivery_name_list IS NOT NULL THEN
10928             FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,' failed list::= '||l_fail_delivery_name_list);
10929             FND_MESSAGE.SET_NAME('FTE','FTE_PRC_RERATE_SHIPMENT_FAIL');
10930             FND_MESSAGE.SET_TOKEN('DEL_NAMES',l_fail_delivery_name_list);
10931             FND_MESSAGE.SET_TOKEN('LOGFILE',FTE_FREIGHT_PRICING_UTIL.get_log_file_name());
10932             FND_MSG_PUB.ADD;
10933         END IF;
10934         IF  l_success_list.COUNT > 0 OR l_warning_list.COUNT > 0 THEN
10935             x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
10936         ELSE
10937             x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
10938         END IF;
10939      END IF;
10940      FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'x_return_status='||x_return_status);
10941 
10942   x_success_list := l_success_list;
10943   x_warning_list := l_warning_list;
10944   x_fail_list :=    l_failed_list;
10945 ELSE
10946     RAISE l_dleg_validation_failed;
10947 END IF;
10948 
10949 
10950    IF FND_API.To_Boolean( p_commit ) THEN
10951 
10952       COMMIT WORK;
10953 
10954   END IF;
10955 
10956 	FND_MSG_PUB.Count_And_Get
10957 	  (
10958 	     p_count  => x_msg_count,
10959 	     p_data  =>  x_msg_data,
10960 	     p_encoded => FND_API.G_FALSE
10961 	  );
10962 
10963 
10964 
10965   FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'Msg Count'||x_msg_count||' Msg data:'||x_msg_data);
10966 
10967   FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,l_api_name);
10968         FTE_FREIGHT_PRICING_UTIL.close_logs;
10969 
10970 EXCEPTION
10971    WHEN  l_delivery_validation_failed THEN
10972     ROLLBACK TO rerate_shipment_online;
10973         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
10974     --FND_MSG_PUB.Count_And_Get
10975 	--  (
10976 	--     p_count  => x_msg_count,
10977 	--     p_data  =>  x_msg_data,
10978 	--     p_encoded => FND_API.G_FALSE
10979 	--  );
10980     --    FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'msg count is ='||x_msg_count);
10981     --    FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'msg data is ='||x_msg_data);
10982         FTE_FREIGHT_PRICING_UTIL.set_exit_exception(l_api_name,'l_delivery_validation_failed');
10983         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,l_api_name);
10984         FTE_FREIGHT_PRICING_UTIL.close_logs;
10985    WHEN l_dleg_list_empty THEN
10986 	ROLLBACK TO rerate_shipment_online;
10987         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
10988 	FND_MSG_PUB.Count_And_Get
10989 	  (
10990 	     p_count  => x_msg_count,
10991 	     p_data  =>  x_msg_data,
10992 	     p_encoded => FND_API.G_FALSE
10993 	  );
10994         FTE_FREIGHT_PRICING_UTIL.set_exit_exception(l_api_name,'l_dleg_list_empty');
10995         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,l_api_name);
10996         FTE_FREIGHT_PRICING_UTIL.close_logs;
10997 
10998     WHEN l_delv_list_empty THEN
10999 	ROLLBACK TO rerate_shipment_online;
11000         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11001 	FND_MSG_PUB.Count_And_Get
11002 	  (
11003 	     p_count  => x_msg_count,
11004 	     p_data  =>  x_msg_data,
11005 	     p_encoded => FND_API.G_FALSE
11006 	  );
11007         FTE_FREIGHT_PRICING_UTIL.set_exit_exception(l_api_name,'l_delv_list_empty');
11008         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,l_api_name);
11009         FTE_FREIGHT_PRICING_UTIL.close_logs;
11010 
11011    WHEN l_del_name_mismatch THEN
11012 	ROLLBACK TO rerate_shipment_online;
11013         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11014 	FND_MSG_PUB.Count_And_Get
11015 	  (
11016 	     p_count  => x_msg_count,
11017 	     p_data  =>  x_msg_data,
11018 	     p_encoded => FND_API.G_FALSE
11019 	  );
11020         FTE_FREIGHT_PRICING_UTIL.set_exit_exception(l_api_name,'l_del_name_mismatch');
11021         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,l_api_name);
11022         FTE_FREIGHT_PRICING_UTIL.close_logs;
11023    WHEN l_dleg_validation_failed THEN
11024    	ROLLBACK TO rerate_shipment_online;
11025         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11026         FND_MSG_PUB.Count_And_Get
11027 	  (
11028 	     p_count  => x_msg_count,
11029 	     p_data  =>  x_msg_data,
11030 	     p_encoded => FND_API.G_FALSE
11031 	  );
11032         FTE_FREIGHT_PRICING_UTIL.set_exception('shipment_reprice2',FTE_FREIGHT_PRICING_UTIL.G_ERR,'l_dleg_validation_failed');
11033         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_reprice2');
11034         FTE_FREIGHT_PRICING_UTIL.close_logs;
11035    WHEN l_trip_rating_failed THEN
11036         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11037         FND_MSG_PUB.Count_And_Get
11038 	  (
11039 	     p_count  => x_msg_count,
11040 	     p_data  =>  x_msg_data,
11041 	     p_encoded => FND_API.G_FALSE
11042 	  );
11043         FTE_FREIGHT_PRICING_UTIL.set_exception('shipment_reprice2',FTE_FREIGHT_PRICING_UTIL.G_ERR,'l_delivery_leg_rating_failed');
11044         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_reprice2');
11045         FTE_FREIGHT_PRICING_UTIL.close_logs;
11046    WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
11047         ROLLBACK TO rerate_shipment_online;
11048         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11049 	FND_MSG_PUB.Count_And_Get
11050 	  (
11051 	     p_count  => x_msg_count,
11052 	     p_data  =>  x_msg_data,
11053 	     p_encoded => FND_API.G_FALSE
11054 	  );
11055 
11056         FTE_FREIGHT_PRICING_UTIL.set_exit_exception(l_api_name,'FND_API.G_EXC_UNEXPECTED_ERROR');
11057         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,l_api_name);
11058         FTE_FREIGHT_PRICING_UTIL.close_logs;
11059    WHEN others THEN
11060 	ROLLBACK TO rerate_shipment_online;
11061         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
11062 	FND_MSG_PUB.Count_And_Get
11063 	  (
11064 	     p_count  => x_msg_count,
11065 	     p_data  =>  x_msg_data,
11066 	     p_encoded => FND_API.G_FALSE
11067 	  );
11068         FTE_FREIGHT_PRICING_UTIL.set_exit_exception(l_api_name,'g_others');
11069         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
11070         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,l_api_name);
11071         FTE_FREIGHT_PRICING_UTIL.close_logs;
11072 END rerate_shipment_online;
11073 
11074 
11075 PROCEDURE delete_fc_temp_pvt (
11076         p_request_id              IN     NUMBER,     -- Comparison Request ID to move to main
11077         p_initialized             IN     BOOLEAN DEFAULT TRUE,
11078         p_lane_id                 IN     NUMBER DEFAULT NULL,
11079         p_schedule_id             IN     NUMBER DEFAULT NULL,
11080         x_return_status           OUT NOCOPY     VARCHAR2)
11081 IS
11082 
11083   l_return_status                   VARCHAR2(1);
11084   l_log_level                       NUMBER := FTE_FREIGHT_PRICING_UTIL.G_DBG;
11085 
11086 BEGIN
11087 
11088    x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
11089    IF p_initialized THEN
11090       FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
11091       FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,'delete_fc_temp_pvt','start');
11092    END IF;
11093 
11094    DELETE
11095    FROM   fte_freight_costs_temp
11096    WHERE  comparison_request_id = p_request_id
11097    --AND    nvl(lane_id,-9999) <> nvl(p_lane_id,-19999)
11098    AND    nvl(lane_id,-9999) <> nvl(decode(p_schedule_id,NULL,p_lane_id,NULL),-19999)
11099    AND    nvl(schedule_id,-9999) <> nvl(p_schedule_id,-19999);
11100 
11101    IF p_initialized THEN
11102       FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'delete_fc_temp_pvt');
11103    END IF;
11104 
11105 EXCEPTION
11106    WHEN others THEN
11107       x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
11108       IF p_initialized THEN
11109         FTE_FREIGHT_PRICING_UTIL.set_exception('delete_fc_temp_pvt',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
11110         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
11111         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'delete_fc_temp_pvt');
11112       END IF;
11113 END delete_fc_temp_pvt;
11114 
11115 -- 	This API is called by Rate_Delivery of LCSS project
11116 -- 	To move freight costs from pl/sql table to wsh_freight_costs
11117 -- 	for non-TL rates, dleg_id is not populated in freight_cost_temp
11118 
11119 PROCEDURE Move_fc_temp_to_main (
11120         p_delivery_leg_id          IN     NUMBER,
11121         p_freight_cost_temp_price  IN     Freight_Cost_Temp_Tab_Type,
11122         p_freight_cost_temp_charge IN     Freight_Cost_Temp_Tab_Type,
11123         x_return_status           OUT NOCOPY     VARCHAR2)
11124 IS
11125   l_log_level             NUMBER := FTE_FREIGHT_PRICING_UTIL.G_LOG;
11126   l_api_name              CONSTANT VARCHAR2(30)   := 'MOVE_FC_TEMP_TO_MAIN';
11127   l_return_status         VARCHAR2(1);
11128   l_msg_count             NUMBER := 0;
11129   l_msg_data              VARCHAR2(240);
11130 
11131   l_empty_main_row           WSH_FREIGHT_COSTS_PVT.Freight_Cost_Rec_Type;
11132   l_freight_cost_main_row           WSH_FREIGHT_COSTS_PVT.Freight_Cost_Rec_Type;
11133   l_freight_cost_main_charge        WSH_FREIGHT_COSTS_PVT.Freight_Cost_Rec_Type;
11134   l_price_fc_ids                    WSH_UTIL_CORE.id_tab_type;
11135   l_rowid                           VARCHAR2(30);
11136   l_update_rowid                    VARCHAR2(30);
11137   l_freight_cost_id                 NUMBER;
11138 
11139 BEGIN
11140   x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
11141 
11142   FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
11143   FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,l_api_name);
11144 
11145   FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'p_delivery_leg_id='||p_delivery_leg_id);
11146 
11147   FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'p_freight_cost_temp_price.COUNT=' || p_freight_cost_temp_price.COUNT );
11148 
11149    IF (p_delivery_leg_id IS NULL) THEN
11150       raise FTE_FREIGHT_PRICING_UTIL.g_no_lanesched_seg;
11151    END IF;
11152 
11153   --IF p_freight_cost_temp_price.COUNT = 0 THEN
11154   --    raise FTE_FREIGHT_PRICING_UTIL.g_no_temp_fc_to_move;
11155   --END IF;
11156 
11157    SAVEPOINT before_fc_creation;
11158 
11159   FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'looping through p_freight_cost_temp_price...');
11160   IF p_freight_cost_temp_price.COUNT > 0 THEN
11161 
11162   FOR i in p_freight_cost_temp_price.FIRST..p_freight_cost_temp_price.LAST LOOP
11163     FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'i='||i);
11164 
11165     FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'p_freight_cost_temp_price(i).TOTAL_AMOUNT=' ||   p_freight_cost_temp_price(i).TOTAL_AMOUNT);
11166 
11167     FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'p_freight_cost_temp_price(i).BILLABLE_QUANTITY=' ||   p_freight_cost_temp_price(i).BILLABLE_QUANTITY);
11168 
11169     FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'p_freight_cost_temp_price(i).UNIT_AMOUNT=' ||   p_freight_cost_temp_price(i).UNIT_AMOUNT);
11170 
11171       --ensures no spill overs from earlier rows
11172       l_freight_cost_main_row:=l_empty_main_row;
11173 
11174       l_freight_cost_main_row.FREIGHT_COST_TYPE_ID := p_freight_cost_temp_price(i).FREIGHT_COST_TYPE_ID;
11175       l_freight_cost_main_row.UNIT_AMOUNT          := p_freight_cost_temp_price(i).UNIT_AMOUNT;
11176       l_freight_cost_main_row.UOM                  := p_freight_cost_temp_price(i).UOM;
11177       l_freight_cost_main_row.QUANTITY             := p_freight_cost_temp_price(i).QUANTITY;
11178       l_freight_cost_main_row.TOTAL_AMOUNT         := p_freight_cost_temp_price(i).TOTAL_AMOUNT;
11179       l_freight_cost_main_row.CURRENCY_CODE        := p_freight_cost_temp_price(i).CURRENCY_CODE;
11180       l_freight_cost_main_row.DELIVERY_ID          := p_freight_cost_temp_price(i).DELIVERY_ID;
11181 
11182       IF (p_freight_cost_temp_price(i).DELIVERY_LEG_ID IS NULL)
11183       THEN
11184 
11185 	l_freight_cost_main_row.DELIVERY_LEG_ID      := p_delivery_leg_id;
11186       ELSE
11187 	l_freight_cost_main_row.DELIVERY_LEG_ID      := p_freight_cost_temp_price(i).DELIVERY_LEG_ID;
11188       END IF;
11189 
11190       l_freight_cost_main_row.DELIVERY_DETAIL_ID   := p_freight_cost_temp_price(i).DELIVERY_DETAIL_ID;
11191       --l_freight_cost_main_row.FREIGHT_CODE         := p_freight_cost_temp_price(i).FREIGHT_CODE;
11192       l_freight_cost_main_row.LINE_TYPE_CODE       := p_freight_cost_temp_price(i).LINE_TYPE_CODE;
11193       l_freight_cost_main_row.CHARGE_UNIT_VALUE    := p_freight_cost_temp_price(i).CHARGE_UNIT_VALUE;
11194       l_freight_cost_main_row.CHARGE_SOURCE_CODE   := p_freight_cost_temp_price(i).CHARGE_SOURCE_CODE;
11195       --l_freight_cost_main_row.ESTIMATED_FLAG        := p_freight_cost_temp_price(i).ESTIMATED_FLAG;
11196       l_freight_cost_main_row.ESTIMATED_FLAG       := 'Y';
11197       l_freight_cost_main_row.LAST_UPDATE_DATE     := SYSDATE;
11198       l_freight_cost_main_row.LAST_UPDATED_BY      := FND_GLOBAL.USER_ID;
11199       l_freight_cost_main_row.LAST_UPDATE_LOGIN    := FND_GLOBAL.LOGIN_ID;
11200       l_freight_cost_main_row.PROGRAM_APPLICATION_ID := FND_GLOBAL.PROG_APPL_ID;
11201       l_freight_cost_main_row.BILLABLE_UOM          := p_freight_cost_temp_price(i).BILLABLE_UOM;
11202       l_freight_cost_main_row.BILLABLE_BASIS          := p_freight_cost_temp_price(i).BILLABLE_BASIS;
11203       l_freight_cost_main_row.BILLABLE_QUANTITY          := p_freight_cost_temp_price(i).BILLABLE_QUANTITY;
11204       --l_freight_cost_main_row.PROGRAM_ID           := FND_GLOBAL.CONC_PROGRAM_ID;
11205       --l_freight_cost_main_row.PROGRAM_UPDATE_DATE  := SYSDATE;
11206 
11207           -- pack J Enhancement for FPA
11208       l_freight_cost_main_row.COMMODITY_CATEGORY_ID
11209                := p_freight_cost_temp_price(i).COMMODITY_CATEGORY_ID;
11210     FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,
11211        '(FPA)l_freight_cost_main_row.COMMODITY_CATEGORY_ID='||l_freight_cost_main_row.COMMODITY_CATEGORY_ID);
11212 
11213     FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'l_freight_cost_main_row.line_type_code='||l_freight_cost_main_row.line_type_code);
11214     FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'l_freight_cost_main_row.delivery_detail_id='||l_freight_cost_main_row.delivery_detail_id);
11215     FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'l_freight_cost_main_row.delivery_leg_id='||l_freight_cost_main_row.delivery_leg_id);
11216 
11217       IF l_freight_cost_main_row.line_type_code = 'SUMMARY'
11218              AND l_freight_cost_main_row.delivery_detail_id IS NULL
11219 	     AND l_freight_cost_main_row.delivery_leg_id is not null THEN
11220 
11221          -- To update the delivery leg summary row
11222          -- Get the delivery leg id as input and get the freight cost id for that
11223          -- The lane level summary amount becomes the delivery leg level summary amount
11224 
11225          l_freight_cost_main_row.FREIGHT_COST_ID      := get_fc_id_from_dleg(l_freight_cost_main_row.delivery_leg_id);
11226          l_freight_cost_main_row.DELIVERY_LEG_ID      := l_freight_cost_main_row.delivery_leg_id;
11227 
11228          FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'l_freight_cost_main_row.FREIGHT_COST_ID='||l_freight_cost_main_row.FREIGHT_COST_ID);
11229 
11230          FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'Calling WSH_FREIGHT_COSTS_PVT.Update_Freight_Cost...');
11231          WSH_FREIGHT_COSTS_PVT.Update_Freight_Cost(
11232           p_rowid                  =>  l_update_rowid,
11233           p_freight_cost_info      =>  l_freight_cost_main_row,
11234           x_return_status          =>  l_return_status);
11235 
11236          IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
11237             IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
11238                 ROLLBACK to before_fc_creation;
11239                 raise FTE_FREIGHT_PRICING_UTIL.g_update_freight_cost_failed;
11240             END IF;
11241          END IF;
11242          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'After Update_Freight_Cost ');
11243 
11244       ELSE
11245 
11246          l_freight_cost_main_row.CREATION_DATE        := SYSDATE;
11247          l_freight_cost_main_row.CREATED_BY           := FND_GLOBAL.USER_ID;
11248 
11249          FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'Calling WSH_FREIGHT_COSTS_PVT.Create_Freight_Cost...');
11250          WSH_FREIGHT_COSTS_PVT.Create_Freight_Cost(
11251           p_freight_cost_info      =>  l_freight_cost_main_row,
11252           x_rowid                  =>  l_rowid,
11253           x_freight_cost_id        =>  l_freight_cost_id,
11254           x_return_status          =>  l_return_status);
11255 
11256          IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
11257             IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
11258                 ROLLBACK to before_fc_creation;
11259                 FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'Base price');
11260                 raise FTE_FREIGHT_PRICING_UTIL.g_create_freight_cost_failed;
11261             END IF;
11262          END IF;
11263          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'After Create_Freight_Cost id : '||l_freight_cost_id);
11264 
11265       END IF;
11266 
11267    END LOOP; -- p_freight_cost_temp_price loop
11268   END IF;
11269 
11270   FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'looping through p_freight_cost_temp_charge...');
11271   IF p_freight_cost_temp_charge.COUNT > 0 THEN
11272   FOR i in p_freight_cost_temp_charge.FIRST..p_freight_cost_temp_charge.LAST LOOP
11273     FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'i='||i);
11274 
11275       --ensures no spill overs from earlier rows
11276       l_freight_cost_main_charge:=l_empty_main_row;
11277 
11278       l_freight_cost_main_charge.FREIGHT_COST_TYPE_ID := p_freight_cost_temp_charge(i).FREIGHT_COST_TYPE_ID;
11279       l_freight_cost_main_charge.UNIT_AMOUNT          := p_freight_cost_temp_charge(i).UNIT_AMOUNT;
11280       l_freight_cost_main_charge.UOM                  := p_freight_cost_temp_charge(i).UOM;
11281       l_freight_cost_main_charge.QUANTITY             := p_freight_cost_temp_charge(i).QUANTITY;
11282       l_freight_cost_main_charge.TOTAL_AMOUNT         := p_freight_cost_temp_charge(i).TOTAL_AMOUNT;
11283       l_freight_cost_main_charge.CURRENCY_CODE        := p_freight_cost_temp_charge(i).CURRENCY_CODE;
11284       l_freight_cost_main_charge.DELIVERY_ID          := p_freight_cost_temp_charge(i).DELIVERY_ID;
11285 
11286       IF (p_freight_cost_temp_charge(i).DELIVERY_LEG_ID IS NULL)
11287       THEN
11288 
11289 	      l_freight_cost_main_charge.DELIVERY_LEG_ID      := p_delivery_leg_id;
11290       ELSE
11291 	      l_freight_cost_main_charge.DELIVERY_LEG_ID      := p_freight_cost_temp_charge(i).DELIVERY_LEG_ID;
11292       END IF;
11293       l_freight_cost_main_charge.DELIVERY_DETAIL_ID   := p_freight_cost_temp_charge(i).DELIVERY_DETAIL_ID;
11294       --l_freight_cost_main_charge.FREIGHT_CODE         := p_freight_cost_temp_charge(i).FREIGHT_CODE;
11295       l_freight_cost_main_charge.LINE_TYPE_CODE       := p_freight_cost_temp_charge(i).LINE_TYPE_CODE;
11296       l_freight_cost_main_charge.CHARGE_UNIT_VALUE    := p_freight_cost_temp_charge(i).CHARGE_UNIT_VALUE;
11297       l_freight_cost_main_charge.CHARGE_SOURCE_CODE   := p_freight_cost_temp_charge(i).CHARGE_SOURCE_CODE;
11298       --l_freight_cost_main_charge.ESTIMATED_FLAG        := p_freight_cost_temp_charge(i).ESTIMATED_FLAG;
11299       l_freight_cost_main_charge.ESTIMATED_FLAG       := 'Y';
11300       l_freight_cost_main_charge.CREATION_DATE        := SYSDATE;
11301       l_freight_cost_main_charge.CREATED_BY           := FND_GLOBAL.USER_ID;
11302       l_freight_cost_main_charge.LAST_UPDATE_DATE     := SYSDATE;
11303       l_freight_cost_main_charge.LAST_UPDATED_BY      := FND_GLOBAL.USER_ID;
11304       l_freight_cost_main_charge.LAST_UPDATE_LOGIN    := FND_GLOBAL.LOGIN_ID;
11305       l_freight_cost_main_charge.PROGRAM_APPLICATION_ID := FND_GLOBAL.PROG_APPL_ID;
11306       l_freight_cost_main_row.BILLABLE_UOM            := p_freight_cost_temp_charge(i).BILLABLE_UOM;
11307       l_freight_cost_main_row.BILLABLE_BASIS          := p_freight_cost_temp_charge(i).BILLABLE_BASIS;
11308       l_freight_cost_main_row.BILLABLE_QUANTITY       := p_freight_cost_temp_charge(i).BILLABLE_QUANTITY;
11309 
11310       --l_freight_cost_main_charge.PROGRAM_ID           := FND_GLOBAL.CONC_PROGRAM_ID;
11311       --l_freight_cost_main_charge.PROGRAM_UPDATE_DATE  := SYSDATE;
11312 
11313           -- pack J Enhancement for FPA
11314       l_freight_cost_main_charge.COMMODITY_CATEGORY_ID
11315                := p_freight_cost_temp_charge(i).COMMODITY_CATEGORY_ID;
11316       FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,
11317        '(FPA)l_freight_cost_main_charge.COMMODITY_CATEGORY_ID='||l_freight_cost_main_charge.COMMODITY_CATEGORY_ID);
11318 
11319          WSH_FREIGHT_COSTS_PVT.Create_Freight_Cost(
11320           p_freight_cost_info      =>  l_freight_cost_main_charge,
11321           x_rowid                  =>  l_rowid,
11322           x_freight_cost_id        =>  l_freight_cost_id,
11323           x_return_status          =>  l_return_status);
11324 
11325          IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
11326             IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
11327                 ROLLBACK to before_fc_creation;
11328                 FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'Charge');
11329                 raise FTE_FREIGHT_PRICING_UTIL.g_create_freight_cost_failed;
11330             END IF;
11331          END IF;
11332          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'After Create_Freight_Cost id : '||l_freight_cost_id);
11333 
11334    END LOOP; -- p_freight_cost_temp_charge loop
11335   END IF;
11336 
11337    FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,l_api_name);
11338 
11339 EXCEPTION
11340    WHEN FTE_FREIGHT_PRICING_UTIL.g_no_temp_fc_to_move THEN
11341         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11342         FTE_FREIGHT_PRICING_UTIL.set_exception(l_api_name,FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_no_temp_fc_to_move');
11343         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,l_api_name);
11344    WHEN FTE_FREIGHT_PRICING_UTIL.g_create_freight_cost_failed THEN
11345         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11346         FTE_FREIGHT_PRICING_UTIL.set_exception(l_api_name,FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_create_freight_cost_failed');
11347         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,l_api_name);
11348    WHEN FTE_FREIGHT_PRICING_UTIL.g_update_freight_cost_failed THEN
11349         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11350         FTE_FREIGHT_PRICING_UTIL.set_exception(l_api_name,FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_update_freight_cost_failed');
11351         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,l_api_name);
11352    WHEN others THEN
11353         ROLLBACK to before_fc_creation;
11354         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
11355         FTE_FREIGHT_PRICING_UTIL.set_exception(l_api_name,FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
11356         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
11357         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,l_api_name);
11358 END;
11359 
11360 -- 	This API is called by Rate_Delivery of LCSS project
11361 -- 	To move freight costs from pl/sql table to wsh_freight_costs
11362 -- 	for TL rates, tl cost allocation will populate dleg_id in freight_cost_temp
11363 
11364 PROCEDURE Move_fc_temp_to_main (
11365         p_freight_cost_temp  IN     Freight_Cost_Temp_Tab_Type,
11366         x_return_status           OUT NOCOPY     VARCHAR2)
11367 IS
11368   l_log_level             NUMBER := FTE_FREIGHT_PRICING_UTIL.G_LOG;
11369   l_api_name              CONSTANT VARCHAR2(30)   := 'MOVE_FC_TEMP_TO_MAIN';
11370   l_return_status         VARCHAR2(1);
11371   l_msg_count             NUMBER := 0;
11372   l_msg_data              VARCHAR2(240);
11373   l_empty_main_row WSH_FREIGHT_COSTS_PVT.Freight_Cost_Rec_Type;
11374   l_freight_cost_main_row           WSH_FREIGHT_COSTS_PVT.Freight_Cost_Rec_Type;
11375   l_rowid                           VARCHAR2(30);
11376   l_update_rowid                    VARCHAR2(30);
11377   l_freight_cost_id                 NUMBER;
11378 
11379 BEGIN
11380   x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
11381 
11382   FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
11383   FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,l_api_name);
11384 
11385 --  IF p_freight_cost_temp.COUNT = 0 THEN
11386 --      raise FTE_FREIGHT_PRICING_UTIL.g_no_temp_fc_to_move;
11387 --  END IF;
11388 
11389    SAVEPOINT before_fc_creation;
11390 
11391   FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'looping through p_freight_cost_temp...');
11392   IF p_freight_cost_temp.COUNT > 0 THEN
11393   FOR i in p_freight_cost_temp.FIRST..p_freight_cost_temp.LAST LOOP
11394     FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'i='||i);
11395 
11396       --ensures no spill overs from earlier rows
11397       l_freight_cost_main_row:=l_empty_main_row;
11398 
11399 
11400       l_freight_cost_main_row.FREIGHT_COST_TYPE_ID := p_freight_cost_temp(i).FREIGHT_COST_TYPE_ID;
11401       l_freight_cost_main_row.UNIT_AMOUNT          := p_freight_cost_temp(i).UNIT_AMOUNT;
11402       l_freight_cost_main_row.UOM                  := p_freight_cost_temp(i).UOM;
11403       l_freight_cost_main_row.QUANTITY             := p_freight_cost_temp(i).QUANTITY;
11404       l_freight_cost_main_row.TOTAL_AMOUNT         := p_freight_cost_temp(i).TOTAL_AMOUNT;
11405       l_freight_cost_main_row.CURRENCY_CODE        := p_freight_cost_temp(i).CURRENCY_CODE;
11406       l_freight_cost_main_row.TRIP_ID          	   := p_freight_cost_temp(i).TRIP_ID;
11407       l_freight_cost_main_row.STOP_ID              := p_freight_cost_temp(i).STOP_ID;
11408       l_freight_cost_main_row.DELIVERY_ID          := p_freight_cost_temp(i).DELIVERY_ID;
11409       l_freight_cost_main_row.DELIVERY_LEG_ID      := p_freight_cost_temp(i).DELIVERY_LEG_ID;
11410       l_freight_cost_main_row.DELIVERY_DETAIL_ID   := p_freight_cost_temp(i).DELIVERY_DETAIL_ID;
11411       --l_freight_cost_main_row.FREIGHT_CODE         := p_freight_cost_temp(i).FREIGHT_CODE;
11412       l_freight_cost_main_row.LINE_TYPE_CODE       := p_freight_cost_temp(i).LINE_TYPE_CODE;
11413       l_freight_cost_main_row.CHARGE_UNIT_VALUE    := p_freight_cost_temp(i).CHARGE_UNIT_VALUE;
11414       l_freight_cost_main_row.CHARGE_SOURCE_CODE   := p_freight_cost_temp(i).CHARGE_SOURCE_CODE;
11415       --l_freight_cost_main_row.ESTIMATED_FLAG        := p_freight_cost_temp(i).ESTIMATED_FLAG;
11416       l_freight_cost_main_row.ESTIMATED_FLAG       := 'Y';
11417       l_freight_cost_main_row.LAST_UPDATE_DATE     := SYSDATE;
11418       l_freight_cost_main_row.LAST_UPDATED_BY      := FND_GLOBAL.USER_ID;
11419       l_freight_cost_main_row.LAST_UPDATE_LOGIN    := FND_GLOBAL.LOGIN_ID;
11420       l_freight_cost_main_row.PROGRAM_APPLICATION_ID := FND_GLOBAL.PROG_APPL_ID;
11421       --l_freight_cost_main_row.PROGRAM_ID           := FND_GLOBAL.CONC_PROGRAM_ID;
11422       --l_freight_cost_main_row.PROGRAM_UPDATE_DATE  := SYSDATE;
11423 
11424           -- pack J Enhancement for FPA
11425       l_freight_cost_main_row.COMMODITY_CATEGORY_ID
11426                := p_freight_cost_temp(i).COMMODITY_CATEGORY_ID;
11427     FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,
11428        '(FPA)l_freight_cost_main_row.COMMODITY_CATEGORY_ID='||l_freight_cost_main_row.COMMODITY_CATEGORY_ID);
11429 
11430     FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'l_freight_cost_main_row.line_type_code='||l_freight_cost_main_row.line_type_code);
11431     FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'l_freight_cost_main_row.delivery_detail_id='||l_freight_cost_main_row.delivery_detail_id);
11432     FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'l_freight_cost_main_row.delivery_leg_id='||l_freight_cost_main_row.delivery_leg_id);
11433 
11434       IF l_freight_cost_main_row.line_type_code = 'SUMMARY'
11435              AND l_freight_cost_main_row.delivery_detail_id IS NULL
11436 	     AND l_freight_cost_main_row.delivery_leg_id is not null THEN
11437 
11438          -- To update the delivery leg summary row
11439          -- Get the delivery leg id as input and get the freight cost id for that
11440          -- The lane level summary amount becomes the delivery leg level summary amount
11441 
11442          l_freight_cost_main_row.FREIGHT_COST_ID      := get_fc_id_from_dleg(l_freight_cost_main_row.delivery_leg_id);
11443 
11444          FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'l_freight_cost_main_row.FREIGHT_COST_ID='||l_freight_cost_main_row.FREIGHT_COST_ID);
11445 
11446          FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'Calling WSH_FREIGHT_COSTS_PVT.Update_Freight_Cost...');
11447          WSH_FREIGHT_COSTS_PVT.Update_Freight_Cost(
11448           p_rowid                  =>  l_update_rowid,
11449           p_freight_cost_info      =>  l_freight_cost_main_row,
11450           x_return_status          =>  l_return_status);
11451 
11452          IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
11453             IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
11454                 ROLLBACK to before_fc_creation;
11455                 raise FTE_FREIGHT_PRICING_UTIL.g_update_freight_cost_failed;
11456             END IF;
11457          END IF;
11458          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'After Update_Freight_Cost ');
11459 
11460       ELSE
11461 
11462          l_freight_cost_main_row.CREATION_DATE        := SYSDATE;
11463          l_freight_cost_main_row.CREATED_BY           := FND_GLOBAL.USER_ID;
11464 
11465          FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'Calling WSH_FREIGHT_COSTS_PVT.Create_Freight_Cost...');
11466          WSH_FREIGHT_COSTS_PVT.Create_Freight_Cost(
11467           p_freight_cost_info      =>  l_freight_cost_main_row,
11468           x_rowid                  =>  l_rowid,
11469           x_freight_cost_id        =>  l_freight_cost_id,
11470           x_return_status          =>  l_return_status);
11471 
11472          IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
11473             IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
11474                 ROLLBACK to before_fc_creation;
11475                 FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'Base price');
11476                 raise FTE_FREIGHT_PRICING_UTIL.g_create_freight_cost_failed;
11477             END IF;
11478          END IF;
11479          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'After Create_Freight_Cost id : '||l_freight_cost_id);
11480 
11481       END IF;
11482 
11483    END LOOP; -- p_freight_cost_temp_price loop
11484   END IF;
11485 
11486    FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,l_api_name);
11487 
11488 EXCEPTION
11489    WHEN FTE_FREIGHT_PRICING_UTIL.g_no_temp_fc_to_move THEN
11490         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11491         FTE_FREIGHT_PRICING_UTIL.set_exception(l_api_name,FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_no_temp_fc_to_move');
11492         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,l_api_name);
11493    WHEN FTE_FREIGHT_PRICING_UTIL.g_create_freight_cost_failed THEN
11494         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11495         FTE_FREIGHT_PRICING_UTIL.set_exception(l_api_name,FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_create_freight_cost_failed');
11496         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,l_api_name);
11497    WHEN FTE_FREIGHT_PRICING_UTIL.g_update_freight_cost_failed THEN
11498         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11499         FTE_FREIGHT_PRICING_UTIL.set_exception(l_api_name,FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_update_freight_cost_failed');
11500         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,l_api_name);
11501    WHEN others THEN
11502         ROLLBACK to before_fc_creation;
11503         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
11504         FTE_FREIGHT_PRICING_UTIL.set_exception(l_api_name,FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
11505         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
11506         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,l_api_name);
11507 END;
11508 
11509 -- todo take care of applied_to_charge_id
11510 PROCEDURE Move_fc_temp_to_main (
11511         p_init_msg_list           IN     VARCHAR2 DEFAULT fnd_api.g_true,
11512 	p_init_prc_log	          IN     VARCHAR2 DEFAULT 'Y',
11513         p_request_id              IN     NUMBER,     -- Comparison Request ID to move to main
11514         p_delivery_leg_id         IN     NUMBER,
11515         p_lane_id                 IN     NUMBER DEFAULT NULL,
11516         p_schedule_id             IN     NUMBER DEFAULT NULL,
11517         p_service_type_code       IN     VARCHAR2 DEFAULT NULL,
11518         x_return_status           OUT NOCOPY     VARCHAR2)
11519 IS
11520 
11521   -- bug : 2763791 : added p_service_type_code
11522 
11523   CURSOR c_move_fc_temp IS
11524   SELECT *
11525   FROM   FTE_FREIGHT_COSTS_TEMP
11526   WHERE  comparison_request_id = p_request_id
11527   --AND    nvl(lane_id,-9999) = nvl(p_lane_id,-9999)
11528   AND    nvl(lane_id,-9999) = nvl(decode(p_schedule_id,NULL,p_lane_id,NULL),-9999)
11529   AND    nvl(schedule_id,-9999) = nvl(p_schedule_id,-9999)
11530   AND    moved_to_main_flag = 'N'
11531   AND    nvl(service_type_code,'X') = nvl(p_service_type_code,'X')
11532   AND    line_type_code NOT IN ('CHARGE','DISCOUNT');
11533 
11534   CURSOR c_move_fc_temp_charge IS
11535   SELECT *
11536   FROM   FTE_FREIGHT_COSTS_TEMP
11537   WHERE  comparison_request_id = p_request_id
11538   --AND    nvl(lane_id,-9999) = nvl(p_lane_id,-9999)
11539   AND    nvl(lane_id,-9999) = nvl(decode(p_schedule_id,NULL,p_lane_id,NULL),-9999)
11540   AND    nvl(schedule_id,-9999) = nvl(p_schedule_id,-9999)
11541   AND    moved_to_main_flag = 'N'
11542   AND    nvl(service_type_code,'X') = nvl(p_service_type_code,'X')
11543   AND    line_type_code IN ('CHARGE','DISCOUNT');
11544 
11545 
11546 CURSOR c_get_lane_mode(c_lane_id IN NUMBER)
11547 IS
11548 SELECT  mode_of_transportation_code
11549 FROM    fte_lanes
11550 WHERE   lane_id = c_lane_id;
11551 
11552 
11553 CURSOR c_get_sched_mode(c_schedule_id IN NUMBER)
11554 IS
11555 SELECT  mode_of_transportation_code
11556 FROM    fte_lanes l, fte_schedules s
11557 WHERE   l.lane_id = s.lane_id
11558 AND     s.schedules_id = c_schedule_id;
11559 
11560   l_mode	VARCHAR2(30);
11561   l_freight_cost_temp_row           c_move_fc_temp%ROWTYPE;
11562   l_empty_main_row WSH_FREIGHT_COSTS_PVT.Freight_Cost_Rec_Type;
11563   l_freight_cost_main_row           WSH_FREIGHT_COSTS_PVT.Freight_Cost_Rec_Type;
11564   l_freight_cost_temp_charge        c_move_fc_temp_charge%ROWTYPE;
11565   l_freight_cost_main_charge        WSH_FREIGHT_COSTS_PVT.Freight_Cost_Rec_Type;
11566   l_price_fc_ids                    WSH_UTIL_CORE.id_tab_type;
11567   l_rowid                           VARCHAR2(30);
11568   l_update_rowid                    VARCHAR2(30);
11569   l_freight_cost_id                 NUMBER;
11570   l_return_status                   VARCHAR2(1);
11571 
11572     l_log_level     NUMBER := FTE_FREIGHT_PRICING_UTIL.G_DBG;
11573 
11574 BEGIN
11575 
11576    x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
11577    IF (p_init_prc_log = 'Y') THEN
11578      FTE_FREIGHT_PRICING_UTIL.initialize_logging( p_init_msg_list  => p_init_msg_list,
11579                                                 x_return_status => l_return_status );
11580    END IF;
11581 
11582    IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
11583        IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
11584             x_return_status  :=  l_return_status;
11585             RETURN;
11586        END IF;
11587    ELSE
11588        FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Initialize Logging successful ');
11589    END IF;
11590    FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
11591    FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,'Move_fc_temp_to_main','start');
11592 
11593    FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Input : Request Id - '||p_request_id||' Delivery Leg Id - '||p_delivery_leg_id||' Lane id - '||p_lane_id||' Schedule Id - '||p_schedule_id
11594 ||' Service type - '||p_service_type_code );
11595 
11596    IF (p_delivery_leg_id IS NULL) OR (p_lane_id IS NULL AND p_schedule_id IS NULL) OR (p_request_id IS NULL)THEN
11597       raise FTE_FREIGHT_PRICING_UTIL.g_no_lanesched_seg;
11598    END IF;
11599 
11600    SAVEPOINT before_fc_creation;
11601 
11602    l_mode:=NULL;
11603    IF (p_schedule_id IS NOT NULL)
11604    THEN
11605    	OPEN c_get_sched_mode(p_schedule_id);
11606    	FETCH c_get_sched_mode INTO l_mode;
11607    	CLOSE c_get_sched_mode;
11608    ELSE
11609 
11610    	OPEN c_get_lane_mode(p_lane_id);
11611    	FETCH c_get_lane_mode INTO l_mode;
11612    	CLOSE c_get_lane_mode;
11613 
11614    END IF;
11615 
11616 
11617    IF ((l_mode IS NOT NULL) AND (l_mode='TRUCK'))
11618    THEN
11619 
11620    	FTE_TL_RATING.Move_Dlv_Records_To_Main(
11621 		p_dleg_id=>p_delivery_leg_id,
11622 		p_lane_id=>p_lane_id,
11623 		p_schedule_id=>p_schedule_id,
11624 		p_comparison_request_id=>p_request_id,
11625 		x_return_status=>l_return_status);
11626 
11627 	 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
11628 	    IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
11629 		raise FTE_FREIGHT_PRICING_UTIL.g_tl_move_dlv_rec_fail;
11630 	    END IF;
11631 	END IF;
11632 
11633 
11634 
11635 
11636    ELSE
11637 
11638 
11639 	   OPEN c_move_fc_temp;
11640 	   LOOP
11641 	      FETCH c_move_fc_temp INTO l_freight_cost_temp_row;
11642 	      EXIT WHEN c_move_fc_temp%NOTFOUND;
11643 
11644 	      --ensures no spill overs from earlier rows
11645 	      l_freight_cost_main_row:=l_empty_main_row;
11646 
11647 
11648 	      -- When does estimated flag get updated ?
11649 
11650 	      l_freight_cost_main_row.FREIGHT_COST_TYPE_ID := l_freight_cost_temp_row.FREIGHT_COST_TYPE_ID;
11651 	      l_freight_cost_main_row.UNIT_AMOUNT          := l_freight_cost_temp_row.UNIT_AMOUNT;
11652 	      l_freight_cost_main_row.UOM                  := l_freight_cost_temp_row.UOM;
11653 	      l_freight_cost_main_row.QUANTITY             := l_freight_cost_temp_row.QUANTITY;
11654 	      l_freight_cost_main_row.TOTAL_AMOUNT         := l_freight_cost_temp_row.TOTAL_AMOUNT;
11655 	      l_freight_cost_main_row.CURRENCY_CODE        := l_freight_cost_temp_row.CURRENCY_CODE;
11656 	      l_freight_cost_main_row.DELIVERY_ID          := l_freight_cost_temp_row.DELIVERY_ID;
11657 
11658 	      IF (l_freight_cost_temp_row.DELIVERY_LEG_ID IS NULL)
11659 	      THEN
11660 		      l_freight_cost_main_row.DELIVERY_LEG_ID      := p_delivery_leg_id;
11661 	      ELSE
11662 		      l_freight_cost_main_row.DELIVERY_LEG_ID      := l_freight_cost_temp_row.DELIVERY_LEG_ID;
11663 	      END IF;
11664 	      l_freight_cost_main_row.DELIVERY_DETAIL_ID   := l_freight_cost_temp_row.DELIVERY_DETAIL_ID;
11665 	      --l_freight_cost_main_row.FREIGHT_CODE         := l_freight_cost_temp_row.FREIGHT_CODE;
11666 	      l_freight_cost_main_row.LINE_TYPE_CODE       := l_freight_cost_temp_row.LINE_TYPE_CODE;
11667 	      l_freight_cost_main_row.CHARGE_UNIT_VALUE    := l_freight_cost_temp_row.CHARGE_UNIT_VALUE;
11668 	      l_freight_cost_main_row.CHARGE_SOURCE_CODE   := l_freight_cost_temp_row.CHARGE_SOURCE_CODE;
11669 	      --l_freight_cost_main_row.ESTIMATED_FLAG        := l_freight_cost_temp_row.ESTIMATED_FLAG;
11670 	      l_freight_cost_main_row.ESTIMATED_FLAG       := 'Y';
11671 	      l_freight_cost_main_row.LAST_UPDATE_DATE     := SYSDATE;
11672 	      l_freight_cost_main_row.LAST_UPDATED_BY      := FND_GLOBAL.USER_ID;
11673 	      l_freight_cost_main_row.LAST_UPDATE_LOGIN    := FND_GLOBAL.LOGIN_ID;
11674 	      l_freight_cost_main_row.PROGRAM_APPLICATION_ID := FND_GLOBAL.PROG_APPL_ID;
11675           -- Added for R12
11676           l_freight_cost_main_row.BILLABLE_QUANTITY    := l_freight_cost_temp_row.BILLABLE_QUANTITY;
11677           l_freight_cost_main_row.BILLABLE_UOM         := l_freight_cost_temp_row.BILLABLE_UOM;
11678           l_freight_cost_main_row.BILLABLE_BASIS       := l_freight_cost_temp_row.BILLABLE_BASIS;
11679 
11680 	      --l_freight_cost_main_row.PROGRAM_ID           := FND_GLOBAL.CONC_PROGRAM_ID;
11681 	      --l_freight_cost_main_row.PROGRAM_UPDATE_DATE  := SYSDATE;
11682 
11683 		  -- pack J Enhancement for FPA
11684 	      l_freight_cost_main_row.COMMODITY_CATEGORY_ID
11685 		       := l_freight_cost_temp_row.COMMODITY_CATEGORY_ID;
11686 	    FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,
11687 	       '(FPA)l_freight_cost_main_row.COMMODITY_CATEGORY_ID='||l_freight_cost_main_row.COMMODITY_CATEGORY_ID);
11688 
11689 	      IF l_freight_cost_main_row.line_type_code <> 'SUMMARY'
11690 		 OR (l_freight_cost_main_row.line_type_code = 'SUMMARY'
11691 		     AND l_freight_cost_main_row.delivery_detail_id IS NOT NULL) THEN
11692 
11693 		 l_freight_cost_main_row.CREATION_DATE        := SYSDATE;
11694 		 l_freight_cost_main_row.CREATED_BY           := FND_GLOBAL.USER_ID;
11695 
11696 		 WSH_FREIGHT_COSTS_PVT.Create_Freight_Cost(
11697 		  p_freight_cost_info      =>  l_freight_cost_main_row,
11698 		  x_rowid                  =>  l_rowid,
11699 		  x_freight_cost_id        =>  l_freight_cost_id,
11700 		  x_return_status          =>  l_return_status);
11701 
11702 		 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
11703 		    IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
11704 			ROLLBACK to before_fc_creation;
11705 			FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'Base price');
11706 			raise FTE_FREIGHT_PRICING_UTIL.g_create_freight_cost_failed;
11707 		    END IF;
11708 		 END IF;
11709 		 FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'After Create_Freight_Cost id : '||l_freight_cost_id);
11710 
11711 		 IF l_freight_cost_main_row.line_type_code <> 'SUMMARY' THEN
11712 		    l_price_fc_ids(l_freight_cost_main_row.delivery_detail_id) := l_freight_cost_id;
11713 		 END IF;
11714 
11715 
11716 	      ELSE
11717 		 -- To update the delivery leg summary row
11718 		 -- Get the delivery leg id as input and get the freight cost id for that
11719 		 -- The lane level summary amount becomes the delivery leg level summary amount
11720 
11721 		 l_freight_cost_main_row.FREIGHT_COST_ID      := get_fc_id_from_dleg(l_freight_cost_main_row.DELIVERY_LEG_ID);
11722 		 --l_freight_cost_main_row.DELIVERY_LEG_ID      := p_delivery_leg_id;
11723 
11724 		 WSH_FREIGHT_COSTS_PVT.Update_Freight_Cost(
11725 		  p_rowid                  =>  l_update_rowid,
11726 		  p_freight_cost_info      =>  l_freight_cost_main_row,
11727 		  x_return_status          =>  l_return_status);
11728 
11729 		 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
11730 		    IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
11731 			ROLLBACK to before_fc_creation;
11732 			raise FTE_FREIGHT_PRICING_UTIL.g_update_freight_cost_failed;
11733 		    END IF;
11734 		 END IF;
11735 		 FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'After Update_Freight_Cost ');
11736 
11737 	      END IF;
11738 
11739 
11740 	   END LOOP;
11741 --	   IF c_move_fc_temp%ROWCOUNT = 0 THEN
11742 --	      raise FTE_FREIGHT_PRICING_UTIL.g_no_temp_fc_to_move;
11743 --	   END IF;
11744 
11745 	   OPEN c_move_fc_temp_charge;
11746 	   LOOP
11747 	      FETCH c_move_fc_temp_charge INTO l_freight_cost_temp_charge;
11748 	      EXIT WHEN c_move_fc_temp_charge%NOTFOUND;
11749 
11750 	      --ensures no spill overs from earlier rows
11751 	      l_freight_cost_main_charge:=l_empty_main_row;
11752 
11753 	      l_freight_cost_main_charge.FREIGHT_COST_TYPE_ID := l_freight_cost_temp_charge.FREIGHT_COST_TYPE_ID;
11754 	      l_freight_cost_main_charge.UNIT_AMOUNT          := l_freight_cost_temp_charge.UNIT_AMOUNT;
11755 	      l_freight_cost_main_charge.UOM                  := l_freight_cost_temp_charge.UOM;
11756 	      l_freight_cost_main_charge.QUANTITY             := l_freight_cost_temp_charge.QUANTITY;
11757 	      l_freight_cost_main_charge.TOTAL_AMOUNT         := l_freight_cost_temp_charge.TOTAL_AMOUNT;
11758 	      l_freight_cost_main_charge.CURRENCY_CODE        := l_freight_cost_temp_charge.CURRENCY_CODE;
11759 	      l_freight_cost_main_charge.DELIVERY_ID          := l_freight_cost_temp_charge.DELIVERY_ID;
11760 
11761 	      IF (l_freight_cost_temp_charge.DELIVERY_LEG_ID IS NULL)
11762 	      THEN
11763 
11764 		l_freight_cost_main_charge.DELIVERY_LEG_ID      := p_delivery_leg_id;
11765 	      ELSE
11766 		l_freight_cost_main_charge.DELIVERY_LEG_ID      := l_freight_cost_temp_charge.DELIVERY_LEG_ID;
11767 	      END IF;
11768 
11769 	      l_freight_cost_main_charge.DELIVERY_DETAIL_ID   := l_freight_cost_temp_charge.DELIVERY_DETAIL_ID;
11770 	      --l_freight_cost_main_charge.FREIGHT_CODE         := l_freight_cost_temp_charge.FREIGHT_CODE;
11771 	      l_freight_cost_main_charge.LINE_TYPE_CODE       := l_freight_cost_temp_charge.LINE_TYPE_CODE;
11772 	      l_freight_cost_main_charge.CHARGE_UNIT_VALUE    := l_freight_cost_temp_charge.CHARGE_UNIT_VALUE;
11773 	      l_freight_cost_main_charge.CHARGE_SOURCE_CODE   := l_freight_cost_temp_charge.CHARGE_SOURCE_CODE;
11774 	      --l_freight_cost_main_charge.ESTIMATED_FLAG        := l_freight_cost_temp_charge.ESTIMATED_FLAG;
11775 	      l_freight_cost_main_charge.ESTIMATED_FLAG       := 'Y';
11776 	      l_freight_cost_main_charge.CREATION_DATE        := SYSDATE;
11777 	      l_freight_cost_main_charge.CREATED_BY           := FND_GLOBAL.USER_ID;
11778 	      l_freight_cost_main_charge.LAST_UPDATE_DATE     := SYSDATE;
11779 	      l_freight_cost_main_charge.LAST_UPDATED_BY      := FND_GLOBAL.USER_ID;
11780 	      l_freight_cost_main_charge.LAST_UPDATE_LOGIN    := FND_GLOBAL.LOGIN_ID;
11781 	      l_freight_cost_main_charge.PROGRAM_APPLICATION_ID := FND_GLOBAL.PROG_APPL_ID;
11782 	      --l_freight_cost_main_charge.PROGRAM_ID           := FND_GLOBAL.CONC_PROGRAM_ID;
11783 	      --l_freight_cost_main_charge.PROGRAM_UPDATE_DATE  := SYSDATE;
11784 
11785 
11786 
11787 		  -- pack J Enhancement for FPA
11788 	      l_freight_cost_main_charge.COMMODITY_CATEGORY_ID
11789 		       := l_freight_cost_temp_charge.COMMODITY_CATEGORY_ID;
11790 	    FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,
11791 	       '(FPA)l_freight_cost_main_charge.COMMODITY_CATEGORY_ID='||l_freight_cost_main_charge.COMMODITY_CATEGORY_ID);
11792 
11793 	      l_freight_cost_main_charge.applied_to_charge_id := l_price_fc_ids(l_freight_cost_main_charge.delivery_detail_id);
11794 
11795 		 WSH_FREIGHT_COSTS_PVT.Create_Freight_Cost(
11796 		  p_freight_cost_info      =>  l_freight_cost_main_charge,
11797 		  x_rowid                  =>  l_rowid,
11798 		  x_freight_cost_id        =>  l_freight_cost_id,
11799 		  x_return_status          =>  l_return_status);
11800 
11801 		 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
11802 		    IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
11803 			ROLLBACK to before_fc_creation;
11804 			FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'Charge');
11805 			raise FTE_FREIGHT_PRICING_UTIL.g_create_freight_cost_failed;
11806 		    END IF;
11807 		 END IF;
11808 		 FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'After Create_Freight_Cost id : '||l_freight_cost_id);
11809 
11810 	   END LOOP;
11811 
11812 	   BEGIN  -- anonymous block to make sure transaction goes through even if the
11813 		  -- enclosed update statement fails
11814 
11815 	   UPDATE fte_freight_costs_temp
11816 	   SET    moved_to_main_flag = 'Y'
11817 	   WHERE  comparison_request_id = p_request_id
11818 	   --AND    nvl(lane_id,-9999) = nvl(p_lane_id,-9999)
11819 	   AND    nvl(lane_id,-9999) = nvl(decode(p_schedule_id,NULL,p_lane_id,NULL),-9999)
11820 	   AND    nvl(schedule_id,-9999) = nvl(p_schedule_id,-9999)
11821 	   AND    nvl(service_type_code,'X') = nvl(p_service_type_code,'X')
11822 	   AND    moved_to_main_flag = 'N';
11823 
11824 	   EXCEPTION
11825 	     WHEN others THEN
11826 		  FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Updating freight_costs_temp moved_to_main_flag failed');
11827 		  null;
11828 	   END;
11829 
11830 	   delete_fc_temp_pvt (
11831 		p_request_id              =>     p_request_id,     -- Comparison Request ID to move to main
11832 		p_lane_id                 =>     p_lane_id,
11833 		p_schedule_id             =>     p_schedule_id,
11834 		x_return_status           =>     l_return_status);
11835 
11836 	   IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
11837 	       IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
11838 		  FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'delete_fc_temp failed ');
11839 		  raise FTE_FREIGHT_PRICING_UTIL.g_delete_fc_temp_failed;
11840 	       END IF;
11841 	   ELSE
11842 	       FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'delete_fc_temp successful ');
11843 	   END IF;
11844 
11845    END IF;
11846 
11847    FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'Move_fc_temp_to_main');
11848    IF (p_init_prc_log = 'Y') THEN
11849    FTE_FREIGHT_PRICING_UTIL.close_logs;
11850    END IF;
11851 
11852 EXCEPTION
11853 
11854    WHEN FTE_FREIGHT_PRICING_UTIL.g_tl_move_dlv_rec_fail THEN
11855    	ROLLBACK to before_fc_creation;
11856         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11857         FTE_FREIGHT_PRICING_UTIL.set_exit_exception('Move_fc_temp_to_main','g_tl_move_dlv_rec_fail');
11858         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'Move_fc_temp_to_main');
11859         IF (p_init_prc_log = 'Y') THEN
11860         FTE_FREIGHT_PRICING_UTIL.close_logs;
11861         END IF;
11862 
11863    WHEN FTE_FREIGHT_PRICING_UTIL.g_no_lanesched_seg THEN
11864         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11865         FTE_FREIGHT_PRICING_UTIL.set_exit_exception('Move_fc_temp_to_main','g_no_lanesched_seg');
11866         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'Move_fc_temp_to_main');
11867         IF (p_init_prc_log = 'Y') THEN
11868         FTE_FREIGHT_PRICING_UTIL.close_logs;
11869         END IF;
11870    WHEN FTE_FREIGHT_PRICING_UTIL.g_no_temp_fc_to_move THEN
11871         --ROLLBACK to before_fc_creation;
11872         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11873         FTE_FREIGHT_PRICING_UTIL.set_exit_exception('Move_fc_temp_to_main','g_no_temp_fc_to_move');
11874         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'Move_fc_temp_to_main');
11875         IF (p_init_prc_log = 'Y') THEN
11876         FTE_FREIGHT_PRICING_UTIL.close_logs;
11877         END IF;
11878    WHEN FTE_FREIGHT_PRICING_UTIL.g_create_freight_cost_failed THEN
11879         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11880         FTE_FREIGHT_PRICING_UTIL.set_exit_exception('Move_fc_temp_to_main','g_create_freight_cost_failed');
11881         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'Move_fc_temp_to_main');
11882         IF (p_init_prc_log = 'Y') THEN
11883         FTE_FREIGHT_PRICING_UTIL.close_logs;
11884         END IF;
11885    WHEN FTE_FREIGHT_PRICING_UTIL.g_update_freight_cost_failed THEN
11886         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11887         FTE_FREIGHT_PRICING_UTIL.set_exit_exception('Move_fc_temp_to_main','g_update_freight_cost_failed');
11888         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'Move_fc_temp_to_main');
11889         IF (p_init_prc_log = 'Y') THEN
11890         FTE_FREIGHT_PRICING_UTIL.close_logs;
11891         END IF;
11892    WHEN FTE_FREIGHT_PRICING_UTIL.g_delete_fc_temp_failed THEN
11893         x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
11894         FTE_FREIGHT_PRICING_UTIL.set_exit_exception('Move_fc_temp_to_main','g_delete_fc_temp_failed');
11895         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'Move_fc_temp_to_main');
11896         IF (p_init_prc_log = 'Y') THEN
11897         FTE_FREIGHT_PRICING_UTIL.close_logs;
11898         END IF;
11899    WHEN others THEN
11900         ROLLBACK to before_fc_creation;
11901         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
11902         FTE_FREIGHT_PRICING_UTIL.set_exit_exception('Move_fc_temp_to_main','g_others');
11903         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
11904         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'Move_fc_temp_to_main');
11905         IF (p_init_prc_log = 'Y') THEN
11906         FTE_FREIGHT_PRICING_UTIL.close_logs;
11907         END IF;
11908 END Move_fc_temp_to_main;
11909 
11910 
11911 PROCEDURE Move_fc_temp_to_main (
11912         p_init_msg_list           IN     VARCHAR2 DEFAULT fnd_api.g_true,
11913 	p_init_prc_log	          IN     VARCHAR2 DEFAULT 'Y',
11914         p_request_id              IN     NUMBER,     -- Comparison Request ID to move to main
11915         p_trip_id         	  IN     NUMBER,
11916         p_lane_id                 IN     NUMBER DEFAULT NULL,
11917         p_schedule_id             IN     NUMBER DEFAULT NULL,
11918         p_service_type_code       IN     VARCHAR2 DEFAULT NULL,
11919         x_return_status           OUT NOCOPY     VARCHAR2)
11920 
11921 IS
11922 
11923   -- bug : 2763791 : added p_service_type_code
11924 
11925   CURSOR c_move_fc_temp IS
11926   SELECT *
11927   FROM   FTE_FREIGHT_COSTS_TEMP
11928   WHERE  comparison_request_id = p_request_id
11929   --AND    nvl(lane_id,-9999) = nvl(p_lane_id,-9999)
11930   AND    nvl(lane_id,-9999) = nvl(decode(p_schedule_id,NULL,p_lane_id,NULL),-9999)
11931   AND    nvl(schedule_id,-9999) = nvl(p_schedule_id,-9999)
11932   AND    moved_to_main_flag = 'N'
11933   AND    nvl(service_type_code,'X') = nvl(p_service_type_code,'X')
11934   AND    line_type_code NOT IN ('CHARGE','DISCOUNT');
11935 
11936   CURSOR c_move_fc_temp_charge IS
11937   SELECT *
11938   FROM   FTE_FREIGHT_COSTS_TEMP
11939   WHERE  comparison_request_id = p_request_id
11940   --AND    nvl(lane_id,-9999) = nvl(p_lane_id,-9999)
11941   AND    nvl(lane_id,-9999) = nvl(decode(p_schedule_id,NULL,p_lane_id,NULL),-9999)
11942   AND    nvl(schedule_id,-9999) = nvl(p_schedule_id,-9999)
11943   AND    moved_to_main_flag = 'N'
11944   AND    nvl(service_type_code,'X') = nvl(p_service_type_code,'X')
11945   AND    line_type_code IN ('CHARGE','DISCOUNT');
11946 
11947 
11948 CURSOR c_get_dlegs_from_trip(c_trip_id IN NUMBER) IS
11949         SELECT  dl.delivery_leg_id,dl.delivery_id
11950         FROM    wsh_delivery_legs dl ,
11951                 wsh_trip_stops s
11952         WHERE   dl.pick_up_stop_id = s.stop_id
11953                 and s.trip_id=c_trip_id;
11954 
11955   l_empty_main_row WSH_FREIGHT_COSTS_PVT.Freight_Cost_Rec_Type;
11956   l_freight_cost_temp_row           c_move_fc_temp%ROWTYPE;
11957   l_freight_cost_main_row           WSH_FREIGHT_COSTS_PVT.Freight_Cost_Rec_Type;
11958   l_freight_cost_temp_charge        c_move_fc_temp_charge%ROWTYPE;
11959   l_freight_cost_main_charge        WSH_FREIGHT_COSTS_PVT.Freight_Cost_Rec_Type;
11960   l_price_fc_ids                    WSH_UTIL_CORE.id_tab_type;
11961   l_rowid                           VARCHAR2(30);
11962   l_update_rowid                    VARCHAR2(30);
11963   l_dleg_ids         		    DBMS_UTILITY.NUMBER_ARRAY;
11964   l_delivery_id			    NUMBER;
11965   l_dleg_id			    NUMBER;
11966   l_init_msg_list                   VARCHAR2(30) :=FND_API.G_FALSE;
11967   l_freight_cost_id                 NUMBER;
11968   l_return_status                   VARCHAR2(1);
11969 
11970     l_log_level     NUMBER := FTE_FREIGHT_PRICING_UTIL.G_DBG;
11971 
11972 BEGIN
11973 
11974    x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
11975    IF (p_init_prc_log = 'Y') THEN
11976      FTE_FREIGHT_PRICING_UTIL.initialize_logging( p_init_msg_list  => p_init_msg_list,
11977                                                 x_return_status => l_return_status );
11978    END IF;
11979 
11980    IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
11981        IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
11982             x_return_status  :=  l_return_status;
11983             RETURN;
11984        END IF;
11985    ELSE
11986        FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Initialize Logging successful ');
11987    END IF;
11988    FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
11989    FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,'Move_fc_temp_to_main','start');
11990 
11991    FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Input : Request Id - '||p_request_id||' Trip Id - '||p_trip_id||' Lane id - '||p_lane_id||' Schedule Id - '||p_schedule_id
11992 ||' Service type - '||p_service_type_code );
11993 
11994    IF (p_trip_id IS NULL) OR (p_lane_id IS NULL AND p_schedule_id IS NULL) THEN
11995       raise FTE_FREIGHT_PRICING_UTIL.g_no_lanesched_seg;
11996    END IF;
11997 
11998 
11999    --Gather mapping from delivery to dleg id. Since this is for a single trip
12000    --There is only one dleg for a delivery
12001    l_delivery_id:=NULL;
12002    l_dleg_id:=NULL;
12003    l_dleg_ids.delete;
12004 
12005    OPEN c_get_dlegs_from_trip(p_trip_id);
12006    FETCH c_get_dlegs_from_trip INTO l_dleg_id,l_delivery_id;
12007    WHILE(c_get_dlegs_from_trip%FOUND)
12008    LOOP
12009    	IF ((l_dleg_id IS NOT NULL) AND (l_delivery_id IS NOT NULL))
12010    	THEN
12011 
12012    		l_dleg_ids(l_delivery_id):=l_dleg_id;
12013 
12014    	ELSE
12015    		FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Null dleg/delivery '||l_dleg_id||' '||l_delivery_id);
12016 
12017    	END IF;
12018 
12019    	FETCH c_get_dlegs_from_trip INTO l_dleg_id,l_delivery_id;
12020 
12021    END LOOP;
12022    CLOSE c_get_dlegs_from_trip;
12023 
12024 
12025    SAVEPOINT before_fc_creation;
12026 
12027    OPEN c_move_fc_temp;
12028    LOOP
12029       FETCH c_move_fc_temp INTO l_freight_cost_temp_row;
12030       EXIT WHEN c_move_fc_temp%NOTFOUND;
12031 
12032       --ensures no spill overs from earlier rows
12033       l_freight_cost_main_row:=l_empty_main_row;
12034 
12035 
12036       -- When does estimated flag get updated ?
12037 
12038       l_freight_cost_main_row.FREIGHT_COST_TYPE_ID := l_freight_cost_temp_row.FREIGHT_COST_TYPE_ID;
12039       l_freight_cost_main_row.UNIT_AMOUNT          := l_freight_cost_temp_row.UNIT_AMOUNT;
12040       l_freight_cost_main_row.UOM                  := l_freight_cost_temp_row.UOM;
12041       l_freight_cost_main_row.QUANTITY             := l_freight_cost_temp_row.QUANTITY;
12042       l_freight_cost_main_row.TOTAL_AMOUNT         := l_freight_cost_temp_row.TOTAL_AMOUNT;
12043       l_freight_cost_main_row.CURRENCY_CODE        := l_freight_cost_temp_row.CURRENCY_CODE;
12044       l_freight_cost_main_row.DELIVERY_ID          := l_freight_cost_temp_row.DELIVERY_ID;
12045 
12046       l_freight_cost_main_row.FREIGHT_COST_ID:=NULL;-- To avoid this from bein retained from earlier
12047 
12048       IF (l_freight_cost_temp_row.DELIVERY_LEG_ID IS NULL)
12049       THEN
12050 
12051 	      IF ((l_freight_cost_main_row.DELIVERY_ID IS NOT NULL)
12052 		AND (l_dleg_ids.EXISTS(l_freight_cost_main_row.DELIVERY_ID)))
12053 	      THEN
12054 
12055 		l_freight_cost_main_row.DELIVERY_LEG_ID      := l_dleg_ids(l_freight_cost_main_row.DELIVERY_ID);
12056 
12057 	      ELSE
12058 		FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'No dleg for delivery '||l_freight_cost_main_row.DELIVERY_ID);
12059 		ROLLBACK to before_fc_creation;
12060 		raise FTE_FREIGHT_PRICING_UTIL.g_no_lanesched_seg;
12061 	      END IF;
12062 
12063       ELSE
12064 		l_freight_cost_main_row.DELIVERY_LEG_ID      := l_freight_cost_temp_row.DELIVERY_LEG_ID;
12065       END IF;
12066 
12067       l_freight_cost_main_row.DELIVERY_DETAIL_ID   := l_freight_cost_temp_row.DELIVERY_DETAIL_ID;
12068       --l_freight_cost_main_row.FREIGHT_CODE         := l_freight_cost_temp_row.FREIGHT_CODE;
12069       l_freight_cost_main_row.LINE_TYPE_CODE       := l_freight_cost_temp_row.LINE_TYPE_CODE;
12070       l_freight_cost_main_row.CHARGE_UNIT_VALUE    := l_freight_cost_temp_row.CHARGE_UNIT_VALUE;
12071       l_freight_cost_main_row.CHARGE_SOURCE_CODE   := l_freight_cost_temp_row.CHARGE_SOURCE_CODE;
12072       --l_freight_cost_main_row.ESTIMATED_FLAG        := l_freight_cost_temp_row.ESTIMATED_FLAG;
12073       l_freight_cost_main_row.ESTIMATED_FLAG       := 'Y';
12074       l_freight_cost_main_row.LAST_UPDATE_DATE     := SYSDATE;
12075       l_freight_cost_main_row.LAST_UPDATED_BY      := FND_GLOBAL.USER_ID;
12076       l_freight_cost_main_row.LAST_UPDATE_LOGIN    := FND_GLOBAL.LOGIN_ID;
12077       l_freight_cost_main_row.PROGRAM_APPLICATION_ID := FND_GLOBAL.PROG_APPL_ID;
12078       --l_freight_cost_main_row.PROGRAM_ID           := FND_GLOBAL.CONC_PROGRAM_ID;
12079       --l_freight_cost_main_row.PROGRAM_UPDATE_DATE  := SYSDATE;
12080 
12081       -- Added for R12
12082       l_freight_cost_main_row.BILLABLE_QUANTITY    := l_freight_cost_temp_row.BILLABLE_QUANTITY;
12083       l_freight_cost_main_row.BILLABLE_UOM         := l_freight_cost_temp_row.BILLABLE_UOM;
12084       l_freight_cost_main_row.BILLABLE_BASIS       := l_freight_cost_temp_row.BILLABLE_BASIS;
12085 
12086           -- pack J Enhancement for FPA
12087       l_freight_cost_main_row.COMMODITY_CATEGORY_ID
12088                := l_freight_cost_temp_row.COMMODITY_CATEGORY_ID;
12089     FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,
12090        '(FPA)l_freight_cost_main_row.COMMODITY_CATEGORY_ID='||l_freight_cost_main_row.COMMODITY_CATEGORY_ID);
12091 
12092       IF l_freight_cost_main_row.line_type_code <> 'SUMMARY'
12093          OR (l_freight_cost_main_row.line_type_code = 'SUMMARY'
12094              AND l_freight_cost_main_row.delivery_detail_id IS NOT NULL) THEN
12095 
12096          l_freight_cost_main_row.CREATION_DATE        := SYSDATE;
12097          l_freight_cost_main_row.CREATED_BY           := FND_GLOBAL.USER_ID;
12098 
12099          WSH_FREIGHT_COSTS_PVT.Create_Freight_Cost(
12100           p_freight_cost_info      =>  l_freight_cost_main_row,
12101           x_rowid                  =>  l_rowid,
12102           x_freight_cost_id        =>  l_freight_cost_id,
12103           x_return_status          =>  l_return_status);
12104 
12105          IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
12106             IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
12107                 ROLLBACK to before_fc_creation;
12108                 FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'Base price');
12109                 raise FTE_FREIGHT_PRICING_UTIL.g_create_freight_cost_failed;
12110             END IF;
12111          END IF;
12112          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'After Create_Freight_Cost id : '||l_freight_cost_id);
12113 
12114          IF l_freight_cost_main_row.line_type_code <> 'SUMMARY' THEN
12115             l_price_fc_ids(l_freight_cost_main_row.delivery_detail_id) := l_freight_cost_id;
12116          END IF;
12117 
12118 
12119       ELSE
12120          -- To update the delivery leg summary row
12121          -- Get the delivery leg id as input and get the freight cost id for that
12122          -- The lane level summary amount becomes the delivery leg level summary amount
12123 
12124          l_freight_cost_main_row.FREIGHT_COST_ID      := get_fc_id_from_dleg(l_freight_cost_main_row.DELIVERY_LEG_ID);
12125 
12126 
12127          WSH_FREIGHT_COSTS_PVT.Update_Freight_Cost(
12128           p_rowid                  =>  l_update_rowid,
12129           p_freight_cost_info      =>  l_freight_cost_main_row,
12130           x_return_status          =>  l_return_status);
12131 
12132          IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
12133             IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
12134                 ROLLBACK to before_fc_creation;
12135                 raise FTE_FREIGHT_PRICING_UTIL.g_update_freight_cost_failed;
12136             END IF;
12137          END IF;
12138          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'After Update_Freight_Cost ');
12139 
12140       END IF;
12141 
12142 
12143    END LOOP;
12144 --   IF c_move_fc_temp%ROWCOUNT = 0 THEN
12145 --      raise FTE_FREIGHT_PRICING_UTIL.g_no_temp_fc_to_move;
12146 --   END IF;
12147    CLOSE c_move_fc_temp;
12148 
12149    OPEN c_move_fc_temp_charge;
12150    LOOP
12151       FETCH c_move_fc_temp_charge INTO l_freight_cost_temp_charge;
12152       EXIT WHEN c_move_fc_temp_charge%NOTFOUND;
12153 
12154       --ensures no spill overs from earlier rows
12155       l_freight_cost_main_charge:=l_empty_main_row;
12156 
12157 
12158       l_freight_cost_main_charge.FREIGHT_COST_TYPE_ID := l_freight_cost_temp_charge.FREIGHT_COST_TYPE_ID;
12159       l_freight_cost_main_charge.UNIT_AMOUNT          := l_freight_cost_temp_charge.UNIT_AMOUNT;
12160       l_freight_cost_main_charge.UOM                  := l_freight_cost_temp_charge.UOM;
12161       l_freight_cost_main_charge.QUANTITY             := l_freight_cost_temp_charge.QUANTITY;
12162       l_freight_cost_main_charge.TOTAL_AMOUNT         := l_freight_cost_temp_charge.TOTAL_AMOUNT;
12163       l_freight_cost_main_charge.CURRENCY_CODE        := l_freight_cost_temp_charge.CURRENCY_CODE;
12164       l_freight_cost_main_charge.DELIVERY_ID          := l_freight_cost_temp_charge.DELIVERY_ID;
12165 
12166       l_freight_cost_main_row.FREIGHT_COST_ID:=NULL;-- To avoid this from bein retained from earlier
12167 
12168       IF(l_freight_cost_temp_charge.DELIVERY_LEG_ID IS NULL)
12169       THEN
12170 
12171 
12172 	      IF ((l_freight_cost_main_charge.DELIVERY_ID IS NOT NULL)
12173 		AND (l_dleg_ids.EXISTS(l_freight_cost_main_charge.DELIVERY_ID)))
12174 	      THEN
12175 
12176 		l_freight_cost_main_charge.DELIVERY_LEG_ID      := l_dleg_ids(l_freight_cost_main_charge.DELIVERY_ID);
12177 
12178 	      ELSE
12179 
12180 		FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'No dleg for delivery '||l_freight_cost_main_charge.DELIVERY_ID);
12181 
12182 	      END IF;
12183 
12184         ELSE
12185 		l_freight_cost_main_charge.DELIVERY_LEG_ID      :=l_freight_cost_temp_charge.DELIVERY_LEG_ID;
12186 	END IF;
12187 
12188 	l_freight_cost_main_charge.DELIVERY_DETAIL_ID   := l_freight_cost_temp_charge.DELIVERY_DETAIL_ID;
12189       --l_freight_cost_main_charge.FREIGHT_CODE         := l_freight_cost_temp_charge.FREIGHT_CODE;
12190       l_freight_cost_main_charge.LINE_TYPE_CODE       := l_freight_cost_temp_charge.LINE_TYPE_CODE;
12191       l_freight_cost_main_charge.CHARGE_UNIT_VALUE    := l_freight_cost_temp_charge.CHARGE_UNIT_VALUE;
12192       l_freight_cost_main_charge.CHARGE_SOURCE_CODE   := l_freight_cost_temp_charge.CHARGE_SOURCE_CODE;
12193       --l_freight_cost_main_charge.ESTIMATED_FLAG        := l_freight_cost_temp_charge.ESTIMATED_FLAG;
12194       l_freight_cost_main_charge.ESTIMATED_FLAG       := 'Y';
12195       l_freight_cost_main_charge.CREATION_DATE        := SYSDATE;
12196       l_freight_cost_main_charge.CREATED_BY           := FND_GLOBAL.USER_ID;
12197       l_freight_cost_main_charge.LAST_UPDATE_DATE     := SYSDATE;
12198       l_freight_cost_main_charge.LAST_UPDATED_BY      := FND_GLOBAL.USER_ID;
12199       l_freight_cost_main_charge.LAST_UPDATE_LOGIN    := FND_GLOBAL.LOGIN_ID;
12200       l_freight_cost_main_charge.PROGRAM_APPLICATION_ID := FND_GLOBAL.PROG_APPL_ID;
12201       --l_freight_cost_main_charge.PROGRAM_ID           := FND_GLOBAL.CONC_PROGRAM_ID;
12202       --l_freight_cost_main_charge.PROGRAM_UPDATE_DATE  := SYSDATE;
12203 
12204 
12205           -- pack J Enhancement for FPA
12206       l_freight_cost_main_charge.COMMODITY_CATEGORY_ID
12207                := l_freight_cost_temp_charge.COMMODITY_CATEGORY_ID;
12208     FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,
12209        '(FPA)l_freight_cost_main_charge.COMMODITY_CATEGORY_ID='||l_freight_cost_main_charge.COMMODITY_CATEGORY_ID);
12210 
12211       l_freight_cost_main_charge.applied_to_charge_id := l_price_fc_ids(l_freight_cost_main_charge.delivery_detail_id);
12212 
12213          WSH_FREIGHT_COSTS_PVT.Create_Freight_Cost(
12214           p_freight_cost_info      =>  l_freight_cost_main_charge,
12215           x_rowid                  =>  l_rowid,
12216           x_freight_cost_id        =>  l_freight_cost_id,
12217           x_return_status          =>  l_return_status);
12218 
12219          IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
12220             IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
12221                 ROLLBACK to before_fc_creation;
12222                 FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'Charge');
12223                 raise FTE_FREIGHT_PRICING_UTIL.g_create_freight_cost_failed;
12224             END IF;
12225          END IF;
12226          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'After Create_Freight_Cost id : '||l_freight_cost_id);
12227 
12228    END LOOP;
12229    CLOSE c_move_fc_temp_charge;
12230 
12231    BEGIN  -- anonymous block to make sure transaction goes through even if the
12232           -- enclosed update statement fails
12233 
12234    UPDATE fte_freight_costs_temp
12235    SET    moved_to_main_flag = 'Y'
12236    WHERE  comparison_request_id = p_request_id
12237    --AND    nvl(lane_id,-9999) = nvl(p_lane_id,-9999)
12238    AND    nvl(lane_id,-9999) = nvl(decode(p_schedule_id,NULL,p_lane_id,NULL),-9999)
12239    AND    nvl(schedule_id,-9999) = nvl(p_schedule_id,-9999)
12240    AND    nvl(service_type_code,'X') = nvl(p_service_type_code,'X')
12241    AND    moved_to_main_flag = 'N';
12242 
12243    EXCEPTION
12244      WHEN others THEN
12245           FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Updating freight_costs_temp moved_to_main_flag failed');
12246           null;
12247    END;
12248 
12249    delete_fc_temp_pvt (
12250         p_request_id              =>     p_request_id,     -- Comparison Request ID to move to main
12251         p_lane_id                 =>     p_lane_id,
12252         p_schedule_id             =>     p_schedule_id,
12253         x_return_status           =>     l_return_status);
12254 
12255    IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
12256        IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
12257           FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'delete_fc_temp failed ');
12258           raise FTE_FREIGHT_PRICING_UTIL.g_delete_fc_temp_failed;
12259        END IF;
12260    ELSE
12261        FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'delete_fc_temp successful ');
12262    END IF;
12263 
12264    FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'Move_fc_temp_to_main');
12265    IF (p_init_prc_log = 'Y') THEN
12266    FTE_FREIGHT_PRICING_UTIL.close_logs;
12267    END IF;
12268 
12269 EXCEPTION
12270    WHEN FTE_FREIGHT_PRICING_UTIL.g_no_lanesched_seg THEN
12271         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
12272         FTE_FREIGHT_PRICING_UTIL.set_exit_exception('Move_fc_temp_to_main','g_no_lanesched_seg');
12273         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'Move_fc_temp_to_main');
12274         IF (p_init_prc_log = 'Y') THEN
12275         FTE_FREIGHT_PRICING_UTIL.close_logs;
12276         END IF;
12277    WHEN FTE_FREIGHT_PRICING_UTIL.g_no_temp_fc_to_move THEN
12278         --ROLLBACK to before_fc_creation;
12279         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
12280         FTE_FREIGHT_PRICING_UTIL.set_exit_exception('Move_fc_temp_to_main','g_no_temp_fc_to_move');
12281         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'Move_fc_temp_to_main');
12282         IF (p_init_prc_log = 'Y') THEN
12283         FTE_FREIGHT_PRICING_UTIL.close_logs;
12284         END IF;
12285    WHEN FTE_FREIGHT_PRICING_UTIL.g_create_freight_cost_failed THEN
12286         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
12287         FTE_FREIGHT_PRICING_UTIL.set_exit_exception('Move_fc_temp_to_main','g_create_freight_cost_failed');
12288         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'Move_fc_temp_to_main');
12289         IF (p_init_prc_log = 'Y') THEN
12290         FTE_FREIGHT_PRICING_UTIL.close_logs;
12291         END IF;
12292    WHEN FTE_FREIGHT_PRICING_UTIL.g_update_freight_cost_failed THEN
12293         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
12294         FTE_FREIGHT_PRICING_UTIL.set_exit_exception('Move_fc_temp_to_main','g_update_freight_cost_failed');
12295         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'Move_fc_temp_to_main');
12296         IF (p_init_prc_log = 'Y') THEN
12297         FTE_FREIGHT_PRICING_UTIL.close_logs;
12298         END IF;
12299    WHEN FTE_FREIGHT_PRICING_UTIL.g_delete_fc_temp_failed THEN
12300         x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
12301         FTE_FREIGHT_PRICING_UTIL.set_exit_exception('Move_fc_temp_to_main','g_delete_fc_temp_failed');
12302         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'Move_fc_temp_to_main');
12303         IF (p_init_prc_log = 'Y') THEN
12304         FTE_FREIGHT_PRICING_UTIL.close_logs;
12305         END IF;
12306    WHEN others THEN
12307         ROLLBACK to before_fc_creation;
12308         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
12309         FTE_FREIGHT_PRICING_UTIL.set_exit_exception('Move_fc_temp_to_main','g_others');
12310         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
12311         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'Move_fc_temp_to_main');
12312         IF (p_init_prc_log = 'Y') THEN
12313         FTE_FREIGHT_PRICING_UTIL.close_logs;
12314         END IF;
12315 END Move_fc_temp_to_main;
12316 
12317 
12318 PROCEDURE delete_fc_temp (
12319         p_init_msg_list           IN     VARCHAR2 DEFAULT fnd_api.g_true,
12320         p_request_id              IN     NUMBER,     -- Comparison Request ID to move to main
12321         x_return_status           OUT NOCOPY     VARCHAR2)
12322 IS
12323 
12324   l_initialized                     BOOLEAN := TRUE;
12325   l_return_status                   VARCHAR2(1);
12326   l_log_level                       NUMBER := FTE_FREIGHT_PRICING_UTIL.G_DBG;
12327 
12328   PRAGMA AUTONOMOUS_TRANSACTION;
12329 
12330 BEGIN
12331    SAVEPOINT DELETE_FC_TEMP;
12332 
12333    x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
12334 
12335    FTE_FREIGHT_PRICING_UTIL.initialize_logging( p_init_msg_list  => p_init_msg_list,
12336                                                 x_return_status => l_return_status );
12337 
12338    IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
12339        IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
12340             l_initialized    :=  FALSE;
12341             x_return_status  :=  WSH_UTIL_CORE.G_RET_STS_WARNING;
12342        END IF;
12343    ELSE
12344        FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Initialize Logging successful ');
12345        FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
12346        FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,'delete_fc_temp','start');
12347        FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Input : Request Id - '||p_request_id);
12348    END IF;
12349 
12350    delete_fc_temp_pvt (
12351         p_request_id              =>     p_request_id,     -- Comparison Request ID to move to main
12352         p_initialized             =>     l_initialized,
12353         x_return_status           =>     l_return_status);
12354 
12355    IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
12356        IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
12357           IF l_initialized THEN
12358              FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'delete_fc_temp failed ');
12359           END IF;
12360           ROLLBACK TO DELETE_FC_TEMP;
12361           x_return_status  :=  WSH_UTIL_CORE.G_RET_STS_WARNING;
12362        END IF;
12363    ELSE
12364        IF l_initialized THEN
12365           FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'delete_fc_temp successful ');
12366        END IF;
12367        COMMIT;
12368    END IF;
12369 
12370    IF l_initialized THEN
12371       FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'delete_fc_temp');
12372       FTE_FREIGHT_PRICING_UTIL.close_logs;
12373    END IF;
12374 
12375 EXCEPTION
12376 
12377    WHEN others THEN
12378         x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
12379         IF l_initialized THEN
12380              FTE_FREIGHT_PRICING_UTIL.set_exit_exception('delete_fc_temp','g_others');
12381              FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
12382              FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'delete_fc_temp');
12383              FTE_FREIGHT_PRICING_UTIL.close_logs;
12384         END IF;
12385 END delete_fc_temp;
12386 
12387 
12388 --
12389 -- API: SHIPMENT_PRICE_COMPARE_PVT
12390 --      Internal api for price comparison for LTL and PARCEL
12391 --      Can accept delivery or trip. Can generate its own comparison request id
12392 --      or can be passed in.
12393 --      Not to be called from outside rating
12394 --      Does not initialize the log file
12395 --      Introduced for pack J
12396 --
12397 --      Parameters :
12398 --          p_delivery_id        -> Input either delivery_id or trip_id (not both)
12399 --          p_trip_id            -> Input either delivery_id or trip_id (not both)
12400 --          p_lane_id_tab        -> table of lane ids
12401 --          p_schedule_id_tab    -> table of schedule ids
12402 --          Note : p_lane_id_tab and p_schedule_id_tab can have overlapping indices
12403 --                 For this API both tables are assumed to be independent of each
12404 --                 other
12405 --          p_dep_date           -> departure date
12406 --          p_arr_date           -> arrival date
12407 --          x_sum_lane_price_tab        ->
12408 --          x_sum_lane_price_curr_tab   ->
12409 --          x_sum_sched_price_tab       ->
12410 --          x_sum_sched_price_curr_tab  ->
12411 --          x_request_id              -> Can generate its own id if not passed in
12412 --          x_return_status           -> return status
12413 --
12414 
12415 PROCEDURE shipment_price_compare_pvt (
12416         p_delivery_id             IN     NUMBER DEFAULT NULL,
12417         p_trip_id                 IN     NUMBER DEFAULT NULL,
12418         p_lane_id_tab             IN     WSH_UTIL_CORE.id_tab_type,
12419         p_sched_id_tab            IN     WSH_UTIL_CORE.id_tab_type,
12420         p_service_lane_tab        IN     WSH_UTIL_CORE.Column_Tab_Type,
12421         p_service_sched_tab       IN     WSH_UTIL_CORE.Column_Tab_Type,
12422         p_dep_date                IN     DATE DEFAULT sysdate,
12423         p_arr_date                IN     DATE DEFAULT sysdate,
12424         x_sum_lane_price_tab      OUT    NOCOPY  WSH_UTIL_CORE.id_tab_type,
12425         x_sum_lane_price_curr_tab OUT    NOCOPY  WSH_UTIL_CORE.Column_tab_type,
12426         x_sum_sched_price_tab      OUT   NOCOPY  WSH_UTIL_CORE.id_tab_type,
12427         x_sum_sched_price_curr_tab OUT   NOCOPY  WSH_UTIL_CORE.Column_tab_type,
12428         x_request_id              IN OUT NOCOPY     NUMBER,
12429         x_return_status           OUT    NOCOPY     VARCHAR2 )
12430 IS
12431 
12432    CURSOR c_delivery(c_delivery_id IN NUMBER) IS
12433    Select wdd.delivery_detail_id,
12434           wda.delivery_id,
12435           NULL,   --  No delivery leg here
12436           NULL,   --  No reprice_required flag here
12437           wda.parent_delivery_detail_id,
12438           wdd.customer_id             ,
12439           wdd.sold_to_contact_id    ,
12440           wdd.inventory_item_id    ,
12441           wdd.item_description    ,
12442           wdd.hazard_class_id    ,
12443           wdd.country_of_origin ,
12444           wdd.classification   ,
12445           wdd.requested_quantity             ,
12446           wdd.requested_quantity_uom        ,
12447           wdd.master_container_item_id     ,
12448           wdd.detail_container_item_id    ,
12449           wdd.customer_item_id           ,
12450           wdd.net_weight                ,
12451           wdd.organization_id          ,
12452           wdd.container_flag          ,
12453           wdd.container_type_code    ,
12454           wdd.container_name        ,
12455           wdd.fill_percent         ,
12456           wdd.gross_weight        ,
12457           wdd.currency_code     ,
12458           wdd.freight_class_cat_id        ,
12459           wdd.commodity_code_cat_id      ,
12460           wdd.weight_uom_code           ,
12461           wdd.volume                   ,
12462           wdd.volume_uom_code         ,
12463           wdd.tp_attribute_category  ,
12464           wdd.tp_attribute1         ,
12465           wdd.tp_attribute2        ,
12466           wdd.tp_attribute3       ,
12467           wdd.tp_attribute4                        ,
12468           wdd.tp_attribute5                       ,
12469           wdd.tp_attribute6                      ,
12470           wdd.tp_attribute7                     ,
12471           wdd.tp_attribute8                    ,
12472           wdd.tp_attribute9                   ,
12473           wdd.tp_attribute10                 ,
12474           wdd.tp_attribute11                ,
12475           wdd.tp_attribute12               ,
12476           wdd.tp_attribute13              ,
12477           wdd.tp_attribute14             ,
12478           wdd.tp_attribute15            ,
12479           wdd.attribute_category       ,
12480           wdd.attribute1              ,
12481           wdd.attribute2             ,
12482           wdd.attribute3            ,
12483           wdd.attribute4           ,
12484           wdd.attribute5          ,
12485           wdd.attribute6         ,
12486           wdd.attribute7        ,
12487           wdd.attribute8       ,
12488           wdd.attribute9      ,
12489           wdd.attribute10    ,
12490           wdd.attribute11   ,
12491           wdd.attribute12  ,
12492           wdd.attribute13 ,
12493           wdd.attribute14,
12494           wdd.attribute15,
12495           'FTE',           -- source_type
12496           NULL,            -- source_line_id
12497           NULL,            -- source_header_id
12498           NULL,            -- source_consolidation_id
12499           NULL,            -- ship_date
12500           NULL,            -- arrival_date
12501           NULL,             -- comm_category_id
12502 	  wda.type,
12503 	  wda.parent_delivery_id,
12504 	  NULL--wdl.parent_delivery_leg_id
12505    from   wsh_delivery_details wdd, wsh_delivery_assignments wda,
12506 	  wsh_new_deliveries wd
12507    where  wdd.delivery_detail_id = wda.delivery_detail_id
12508    and    wda.delivery_id        = c_delivery_id
12509    and      (wda.type IS null  OR wda.type <> 'O')--MDC
12510    and    wda.delivery_id 	 = wd.delivery_id;
12511 
12512    CURSOR c_delivery_from_trip(c_trip_id IN NUMBER) IS
12513    Select wdd.delivery_detail_id,
12514           wda.delivery_id,
12515           wdl.delivery_leg_id,
12516           nvl(wdl.reprice_required,'N') as reprice_required,  --  Added AG 05/10
12517           wda.parent_delivery_detail_id,
12518           wdd.customer_id             ,
12519           wdd.sold_to_contact_id    ,
12520           wdd.inventory_item_id    ,
12521           wdd.item_description    ,
12522           wdd.hazard_class_id    ,
12523           wdd.country_of_origin ,
12524           wdd.classification   ,
12525           wdd.requested_quantity             ,
12526           wdd.requested_quantity_uom        ,
12527           wdd.master_container_item_id     ,
12528           wdd.detail_container_item_id    ,
12529           wdd.customer_item_id           ,
12530           wdd.net_weight                ,
12531           wdd.organization_id          ,
12532           wdd.container_flag          ,
12533           wdd.container_type_code    ,
12534           wdd.container_name        ,
12535           wdd.fill_percent         ,
12536           wdd.gross_weight        ,
12537           wdd.currency_code     ,
12538           wdd.freight_class_cat_id        ,
12539           wdd.commodity_code_cat_id      ,
12540           wdd.weight_uom_code           ,
12541           wdd.volume                   ,
12542           wdd.volume_uom_code         ,
12543           wdd.tp_attribute_category  ,
12544           wdd.tp_attribute1         ,
12545           wdd.tp_attribute2        ,
12546           wdd.tp_attribute3       ,
12547           wdd.tp_attribute4                        ,
12548           wdd.tp_attribute5                       ,
12549           wdd.tp_attribute6                      ,
12550           wdd.tp_attribute7                     ,
12551           wdd.tp_attribute8                    ,
12552           wdd.tp_attribute9                   ,
12553           wdd.tp_attribute10                 ,
12554           wdd.tp_attribute11                ,
12555           wdd.tp_attribute12               ,
12556           wdd.tp_attribute13              ,
12557           wdd.tp_attribute14             ,
12558           wdd.tp_attribute15            ,
12559           wdd.attribute_category       ,
12560           wdd.attribute1              ,
12561           wdd.attribute2             ,
12562           wdd.attribute3            ,
12563           wdd.attribute4           ,
12564           wdd.attribute5          ,
12565           wdd.attribute6         ,
12566           wdd.attribute7        ,
12567           wdd.attribute8       ,
12568           wdd.attribute9      ,
12569           wdd.attribute10    ,
12570           wdd.attribute11   ,
12571           wdd.attribute12  ,
12572           wdd.attribute13 ,
12573           wdd.attribute14,
12574           wdd.attribute15,
12575           'FTE',           -- source_type
12576           NULL,            -- source_line_id
12577           NULL,            -- source_header_id
12578           NULL,            -- source_consolidation_id
12579           NULL,            -- ship_date
12580           NULL,            -- arrival_date
12581           NULL,             -- comm_category_id
12582 	  wda.type,
12583 	  wda.parent_delivery_id,
12584 	  wdl.parent_delivery_leg_id
12585    from   wsh_delivery_details wdd, wsh_delivery_assignments wda,
12586 	  wsh_new_deliveries wd,
12587           wsh_delivery_legs wdl, wsh_trip_stops wts1, wsh_trip_stops wts2,wsh_trips wt
12588    where  wdd.delivery_detail_id = wda.delivery_detail_id
12589    and    wda.delivery_id        = wdl.delivery_id
12590    and    wdl.delivery_id 	 = wd.delivery_id
12591    and    wdl.pick_up_stop_id    = wts1.stop_id
12592    and    wdl.drop_off_stop_id   = wts2.stop_id
12593    and    wts1.trip_id           = wt.trip_id
12594    and    wts2.trip_id           = wt.trip_id
12595    and      (wda.type IS null  OR wda.type <> 'O')--MDC
12596    and    wt.trip_id             = c_trip_id;
12597 
12598 
12599    CURSOR c_get_req_id IS
12600    SELECT fte_pricing_comp_request_s.nextval
12601    FROM   sys.dual;
12602 
12603    CURSOR c_get_carrier_for_lane(c_lane_id IN NUMBER) IS
12604    SELECT carrier_id
12605    FROM fte_lanes
12606    WHERE lane_id = c_lane_id;
12607 
12608    l_return_status                   VARCHAR2(1);
12609    l_return_code             NUMBER;
12610    l_delvy_det_rec                   shipment_line_rec_type;
12611    l_first_level_rows                shpmnt_content_tab_type;
12612    l_first_level_charges             addl_services_tab_type;
12613    l_request_id                      NUMBER:=0;
12614    l_lane_summary                    NUMBER:=0;
12615    l_lane_summary_uom                VARCHAR2(40);
12616    l_sched_summary                   NUMBER:=0;
12617    l_sched_summary_uom               VARCHAR2(40);
12618    l_lane_num                        VARCHAR2(100);
12619    l_sched_num                       VARCHAR2(100);
12620    i                                 NUMBER:=0;
12621    j                                 NUMBER:=0;
12622    l_dummy_fc_temp_price             Freight_Cost_Temp_Tab_Type;
12623    l_dummy_fc_temp_charge            Freight_Cost_Temp_Tab_Type;
12624    l_currency_code                   VARCHAR2(10);
12625    l_carrier_id                     NUMBER;
12626 
12627    l_log_level    NUMBER := FTE_FREIGHT_PRICING_UTIL.G_LOG;
12628 
12629 
12630 BEGIN
12631 
12632    SAVEPOINT SHIPMENT_PRICE_COMPARE_PVT;
12633 
12634    x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
12635 
12636    FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
12637    FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,'shipment_price_compare_pvt','start');
12638 
12639    FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'p_delivery_id ='||p_delivery_id);
12640    FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'p_trip_id     ='||p_trip_id);
12641    FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'p_lane_id_tab.COUNT ='||p_lane_id_tab.COUNT);
12642    FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'p_sched_id_tab.COUNT ='||p_sched_id_tab.COUNT);
12643    FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'p_dep_date    ='||p_dep_date);
12644    FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'p_arr_date    ='||p_arr_date);
12645    FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'x_request_id ='||x_request_id);
12646 
12647    IF p_trip_id IS NOT NULL THEN
12648       validate_nontl_trip(
12649 	p_trip_id 	=> p_trip_id,
12650 	x_return_code => l_return_code);
12651 
12652       IF l_return_code = G_RC_ERROR THEN
12653 	RAISE FND_API.G_EXC_ERROR;
12654       ELSIF (l_return_code = G_RC_REPRICE_NOT_REQUIRED
12655 	     OR l_return_code = G_RC_NOT_RATE_FREIGHT_TERM
12656 	     OR l_return_code = G_RC_NOT_RATE_MANIFESTING) THEN
12657         x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
12658 	raise g_finished_warning;
12659       END IF;
12660 
12661 
12662 
12663    ELSIF p_delivery_id IS NOT NULL THEN
12664 
12665       validate_delivery(
12666 	p_delivery_id 	=> p_delivery_id,
12667 	x_return_code => l_return_code);
12668 
12669       IF l_return_code = G_RC_ERROR THEN
12670 	RAISE FND_API.G_EXC_ERROR;
12671       ELSIF (l_return_code = G_RC_REPRICE_NOT_REQUIRED
12672 	     OR l_return_code = G_RC_NOT_RATE_FREIGHT_TERM
12673 	     OR l_return_code = G_RC_NOT_RATE_MANIFESTING) THEN
12674         x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
12675 	raise g_finished_warning;
12676       END IF;
12677    END IF;
12678 
12679       IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
12680           IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
12681              raise FTE_FREIGHT_PRICING_UTIL.g_currency_code_failed;
12682           END IF;
12683       END IF;
12684 
12685 
12686 
12687 
12688    -- Important : must delete global table
12689    g_shipment_line_rows.DELETE;
12690 
12691    --  Generate comparison request_id here and populate it into l_request_id
12692 
12693    IF (x_request_id IS NULL OR x_request_id = 0) THEN
12694 
12695       OPEN c_get_req_id;
12696       FETCH c_get_req_id INTO l_request_id;
12697       CLOSE c_get_req_id;
12698 
12699       x_request_id := l_request_id;
12700 
12701    ELSE
12702       l_request_id := x_request_id;
12703 
12704    END IF;
12705 
12706    fte_freight_pricing_util.print_msg(p_msg => 'Comparison request_id is ' || l_request_id);
12707 
12708    IF (p_delivery_id IS NOT NULL) THEN
12709 
12710       OPEN c_delivery(p_delivery_id);
12711 
12712       LOOP
12713       FETCH c_delivery INTO l_delvy_det_rec;
12714          EXIT WHEN c_delivery%NOTFOUND;
12715          g_shipment_line_rows(l_delvy_det_rec.delivery_detail_id) := l_delvy_det_rec;
12716       END LOOP;
12717 
12718       IF c_delivery%ROWCOUNT = 0 THEN
12719          CLOSE c_delivery;
12720          raise FTE_FREIGHT_PRICING_UTIL.g_empty_delivery;
12721       ELSE
12722          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Matching number of delivery lines : '||c_delivery%ROWCOUNT);
12723       END IF;
12724 
12725       CLOSE c_delivery;
12726 
12727    ELSIF (p_trip_id IS NOT NULL) THEN
12728 
12729       OPEN c_delivery_from_trip(p_trip_id);
12730 
12731       LOOP
12732          FETCH c_delivery_from_trip INTO l_delvy_det_rec;
12733          EXIT WHEN c_delivery_from_trip%NOTFOUND;
12734          g_shipment_line_rows(l_delvy_det_rec.delivery_detail_id) := l_delvy_det_rec;
12735       END LOOP;
12736 
12737       IF c_delivery_from_trip%ROWCOUNT = 0 THEN
12738          CLOSE c_delivery_from_trip;
12739          raise FTE_FREIGHT_PRICING_UTIL.g_empty_delivery;
12740       ELSE
12741          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Matching number of delivery lines : '||c_delivery_from_trip%ROWCOUNT);
12742       END IF;
12743 
12744       CLOSE c_delivery_from_trip;
12745 
12746    ELSE
12747          raise FTE_FREIGHT_PRICING_UTIL.g_invalid_parameters;
12748    END IF;
12749 
12750 
12751    flatten_shipment (
12752      x_first_level_rows        =>    l_first_level_rows,
12753      x_return_status           =>    l_return_status );
12754 
12755    IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
12756       IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
12757          raise FTE_FREIGHT_PRICING_UTIL.g_flatten_shipment_failed;
12758       END IF;
12759    ELSE
12760       IF l_first_level_rows.COUNT = 0 THEN
12761           raise FTE_FREIGHT_PRICING_UTIL.g_empty_delivery;
12762       END IF;
12763       FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'No. of top level lines 6 : '||l_first_level_rows.COUNT);
12764    END IF;
12765 
12766 
12767    IF (p_lane_id_tab.COUNT > 0) THEN
12768 
12769        IF p_lane_id_tab.COUNT <> p_service_lane_tab.COUNT THEN
12770             ROLLBACK TO SHIPMENT_PRICE_COMPARE_PVT;
12771             raise FTE_FREIGHT_PRICING_UTIL.g_missing_service_type;
12772        END IF;
12773 
12774        i := p_lane_id_tab.FIRST;
12775        LOOP
12776 
12777        OPEN c_get_carrier_for_lane(p_lane_id_tab(i));
12778        FETCH c_get_carrier_for_lane INTO l_carrier_id;
12779        CLOSE c_get_carrier_for_lane;
12780 
12781     IF p_trip_id IS NOT NULL THEN
12782          FTE_FREIGHT_PRICING_UTIL.get_currency_code
12783             (
12784                 p_trip_id => p_trip_id,
12785                 p_carrier_id => l_carrier_id,
12786                 x_currency_code   =>   l_currency_code,
12787                 x_return_status   =>   l_return_status
12788             );
12789     ELSE
12790           FTE_FREIGHT_PRICING_UTIL.get_currency_code
12791          (
12792              p_delivery_id => p_delivery_id,
12793              p_carrier_id => l_carrier_id,
12794              x_currency_code   =>   l_currency_code,
12795              x_return_status   =>   l_return_status
12796          );
12797 
12798     END IF;
12799 
12800          shipment_pricing (
12801             p_lane_id                 =>    p_lane_id_tab(i),
12802             p_service_type            =>    p_service_lane_tab(i),
12803                                               -- service type is required with lane/schedule
12804             p_ship_date               =>    p_dep_date,
12805             p_arrival_date            =>    p_arr_date,
12806             p_shpmnt_toplevel_rows    =>    l_first_level_rows,
12807             p_shpmnt_toplevel_charges =>    l_first_level_charges,
12808             p_save_flag               =>    'T',
12809             p_request_id              =>    l_request_id,
12810             p_currency_code           =>    l_currency_code,
12811             x_summary_lanesched_price      => l_lane_summary,
12812             x_summary_lanesched_price_uom  => l_lane_summary_uom,
12813             x_freight_cost_temp_price      => l_dummy_fc_temp_price,
12814             x_freight_cost_temp_charge     => l_dummy_fc_temp_charge,
12815             x_return_status           =>    l_return_status ) ;
12816 
12817             FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'After shipment_pricing - p_lane_id = '||p_lane_id_tab(i));
12818          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'l_return_status='||l_return_status);
12819             IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
12820                 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
12821                    x_sum_lane_price_tab(i) := -1;
12822                    x_sum_lane_price_curr_tab(i) := 'NULL';
12823                    FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'lane: '||p_lane_id_tab(i)||' shipment_pricing ');
12824                    x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
12825                 END IF;
12826              ELSE
12827                 FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'Shipment pricing successful for lane : '||p_lane_id_tab(i));
12828 
12829                 x_sum_lane_price_tab(i)      := nvl(l_lane_summary,0);
12830                 x_sum_lane_price_curr_tab(i) := l_lane_summary_uom;
12831 
12832              END IF;
12833 
12834        EXIT WHEN i = p_lane_id_tab.LAST;
12835          i := p_lane_id_tab.NEXT(i);
12836        END LOOP;
12837 
12838    END IF;
12839 
12840 
12841    IF (p_sched_id_tab.COUNT > 0) THEN
12842 
12843        IF p_sched_id_tab.COUNT <> p_service_sched_tab.COUNT THEN
12844             ROLLBACK TO SHIPMENT_PRICE_COMPARE_PVT;
12845             raise FTE_FREIGHT_PRICING_UTIL.g_missing_service_type;
12846        END IF;
12847 
12848        i := p_sched_id_tab.FIRST;
12849        LOOP
12850 
12851          shipment_pricing (
12852             p_schedule_id             =>    p_sched_id_tab(i),
12853             p_service_type            =>    p_service_sched_tab(i),
12854                                               -- service type is required with lane/schedule
12855             p_ship_date               =>    p_dep_date,
12856             p_arrival_date            =>    p_arr_date,
12857             p_shpmnt_toplevel_rows    =>    l_first_level_rows,
12858             p_shpmnt_toplevel_charges =>    l_first_level_charges,
12859             p_save_flag               =>    'T',
12860             p_request_id              =>    l_request_id,
12861             x_summary_lanesched_price      => l_sched_summary,
12862             x_summary_lanesched_price_uom  => l_sched_summary_uom,
12863             x_freight_cost_temp_price      => l_dummy_fc_temp_price,
12864             x_freight_cost_temp_charge     => l_dummy_fc_temp_charge,
12865             x_return_status           =>    l_return_status ) ;
12866 
12867             IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
12868                 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
12869                    x_sum_sched_price_tab(i) := -1;
12870                    x_sum_sched_price_curr_tab(i) := 'NULL';
12871                    FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'sched: '||p_sched_id_tab(i)||' shipment_pricing ');
12872                    x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
12873                 END IF;
12874              ELSE
12875                 FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'Shipment pricing successful for sched : '||p_sched_id_tab(i));
12876 
12877                 x_sum_sched_price_tab(i)      := nvl(l_sched_summary,0);
12878                 x_sum_sched_price_curr_tab(i) := l_sched_summary_uom;
12879 
12880              END IF;
12881 
12882        EXIT WHEN i = p_sched_id_tab.LAST;
12883          i := p_sched_id_tab.NEXT(i);
12884        END LOOP;
12885 
12886    END IF;
12887 
12888    x_request_id := l_request_id;
12889 
12890    FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_price_compare_pvt');
12891 
12892 EXCEPTION
12893    WHEN g_finished_warning THEN
12894         x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
12895         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_price_compare_pvt');
12896    WHEN FND_API.G_EXC_ERROR THEN
12897         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
12898         FTE_FREIGHT_PRICING_UTIL.set_exception('shipment_price_compare_pvt',FTE_FREIGHT_PRICING_UTIL.G_ERR,'FND_API.G_EXC_ERROR');
12899         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_price_compare_pvt');
12900    WHEN FTE_FREIGHT_PRICING_UTIL.g_delivery_not_found THEN
12901         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
12902         FTE_FREIGHT_PRICING_UTIL.set_exception('shipment_price_compare_pvt',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_delivery_not_found');
12903         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_price_compare_pvt');
12904    WHEN FTE_FREIGHT_PRICING_UTIL.g_flatten_shipment_failed THEN
12905         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
12906         FTE_FREIGHT_PRICING_UTIL.set_exception('shipment_price_compare_pvt',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_flatten_shipment_failed');
12907         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_price_compare_pvt');
12908    WHEN FTE_FREIGHT_PRICING_UTIL.g_empty_delivery THEN
12909         x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
12910         FTE_FREIGHT_PRICING_UTIL.set_exception('shipment_price_compare_pvt',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_empty_delivery');
12911         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_price_compare_pvt');
12912    WHEN FTE_FREIGHT_PRICING_UTIL.g_missing_service_type THEN
12913         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
12914         FTE_FREIGHT_PRICING_UTIL.set_exception('shipment_price_compare_pvt',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_missing_service_type');
12915         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_price_compare_pvt');
12916    WHEN FTE_FREIGHT_PRICING_UTIL.g_shipment_pricing_failed THEN
12917         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
12918         FTE_FREIGHT_PRICING_UTIL.set_exception('shipment_price_compare_pvt',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_shipment_pricing_failed');
12919         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_price_compare_pvt');
12920    WHEN others THEN
12921         ROLLBACK TO SHIPMENT_PRICE_COMPARE_PVT;
12922         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
12923         FTE_FREIGHT_PRICING_UTIL.set_exception('shipment_price_compare_pvt',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
12924         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
12925         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_price_compare_pvt');
12926 
12927 END shipment_price_compare_pvt;
12928 
12929 
12930 PROCEDURE FPA_total_commodity_weight(
12931                            p_init_msg_list IN  VARCHAR2 DEFAULT fnd_api.g_true,
12932                            p_delivery_id   IN  NUMBER,
12933                            x_total_comm_wt   OUT NOCOPY NUMBER,
12934                            x_wt_uom        OUT NOCOPY VARCHAR2,
12935                            x_return_status OUT NOCOPY VARCHAR2,
12936                            x_msg_count     OUT NOCOPY NUMBER,
12937                            x_msg_data      OUT NOCOPY VARCHAR2 )
12938 IS
12939 
12940     l_return_status    VARCHAR2(1);
12941     l_log_level     NUMBER := FTE_FREIGHT_PRICING_UTIL.G_LOG;
12942 
12943    CURSOR c_delivery_details(c_delivery_id IN NUMBER) IS
12944    SELECT wdd.delivery_detail_id,
12945           wdd.gross_weight        ,
12946           wdd.weight_uom_code
12947    from   wsh_delivery_details wdd, wsh_delivery_assignments wda
12948    where  wdd.delivery_detail_id = wda.delivery_detail_id
12949    and    wdd.container_flag = 'N'
12950    and      (wda.type IS null  OR wda.type <> 'O')--MDC
12951    and    wda.delivery_id        = c_delivery_id;
12952 
12953    CURSOR c_delivery_wt_uom(c_delivery_id IN NUMBER) IS
12954    SELECT weight_uom_code
12955    FROM   wsh_new_deliveries
12956    WHERE  delivery_id = c_delivery_id;
12957 
12958    l_target_wt_uom   VARCHAR2(30);
12959    l_cum_wt          NUMBER;
12960    l_temp_wt         NUMBER;
12961 
12962 BEGIN
12963 
12964    x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
12965 
12966     -- Initialize message list if p_init_msg_list is set to TRUE.
12967 
12968    FTE_FREIGHT_PRICING_UTIL.initialize_logging( p_init_msg_list  => p_init_msg_list,
12969                                                 x_return_status  => l_return_status );
12970 
12971    IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
12972        IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
12973             x_return_status  :=  l_return_status;
12974             RETURN;
12975        END IF;
12976    ELSE
12977        FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Initialize Logging successful ');
12978    END IF;
12979 
12980 
12981    FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
12982    FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,'FPA_total_commodity_weight','start');
12983 
12984    OPEN c_delivery_wt_uom(p_delivery_id);
12985    FETCH c_delivery_wt_uom INTO l_target_wt_uom;
12986    CLOSE c_delivery_wt_uom;
12987 
12988    IF (l_target_wt_uom IS NULL) THEN
12989      raise fte_freight_pricing_util.g_weight_uom_not_found;
12990    END IF;
12991 
12992    FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'l_target_wt_uom='||l_target_wt_uom);
12993 
12994    l_cum_wt :=0;
12995 
12996    FOR c_det_rec IN c_delivery_details(p_delivery_id) LOOP
12997 
12998      IF (c_det_rec.gross_weight IS NULL OR c_det_rec.weight_uom_code IS NULL) THEN
12999        FTE_FREIGHT_PRICING_UTIL.setmsg (p_api =>'FPA_total_commodity_weight',
13000                                          p_exc =>'g_tl_dtl_no_gross_weight',
13001                                          p_msg_name =>'FTE_INVALID_DEL_DET_WT',
13002                                          p_delivery_detail_id =>c_det_rec.delivery_detail_id);
13003        raise fte_freight_pricing_util.g_tl_dtl_no_gross_weight;
13004      END IF;
13005 
13006      IF (c_det_rec.weight_uom_code <> l_target_wt_uom) THEN
13007             l_temp_wt :=  WSH_WV_UTILS.convert_uom(c_det_rec.weight_uom_code,
13008                                        l_target_wt_uom,
13009                                        c_det_rec.gross_weight,
13010                                        0);  -- Within same UOM class
13011 
13012         l_cum_wt := l_cum_wt + l_temp_wt;
13013      ELSE
13014         l_cum_wt := l_cum_wt + c_det_rec.gross_weight;
13015      END IF;
13016 
13017    END LOOP;
13018 
13019    FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'l_cum_wt='||l_cum_wt);
13020    x_total_comm_wt := l_cum_wt;
13021    x_wt_uom := l_target_wt_uom;
13022 
13023    -- Standard call to get message count and if count is 1,
13024    -- get message info.
13025    FND_MSG_PUB.Count_And_Get (
13026      p_count         =>      x_msg_count,
13027      p_data          =>      x_msg_data );
13028 
13029    FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'FPA_total_commodity_weight');
13030    FTE_FREIGHT_PRICING_UTIL.close_logs;
13031 
13032 EXCEPTION
13033    WHEN FTE_FREIGHT_PRICING_UTIL.g_tl_dtl_no_gross_weight THEN
13034         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
13035         FTE_FREIGHT_PRICING_UTIL.set_exit_exception('FPA_total_commodity_weight','g_tl_dtl_no_gross_weight');
13036         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'FPA_total_commodity_weight');
13037         FTE_FREIGHT_PRICING_UTIL.close_logs;
13038    WHEN FTE_FREIGHT_PRICING_UTIL.g_weight_uom_not_found THEN
13039         FTE_FREIGHT_PRICING_UTIL.setmsg (p_api =>'FPA_total_commodity_weight',
13040                                          p_exc =>'g_tl_dtl_no_gross_weight',
13041                                          p_msg_name =>'FTE_INVALID_DEL_WT_UOM',
13042                                          p_delivery_id =>p_delivery_id);
13043         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
13044         FTE_FREIGHT_PRICING_UTIL.set_exit_exception('FPA_total_commodity_weight','g_weight_uom_not_found');
13045         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'FPA_total_commodity_weight');
13046         FTE_FREIGHT_PRICING_UTIL.close_logs;
13047    WHEN others THEN
13048         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
13049         FTE_FREIGHT_PRICING_UTIL.set_exit_exception('FPA_total_commodity_weight','g_others');
13050         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
13051         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'FPA_total_commodity_weight');
13052         FTE_FREIGHT_PRICING_UTIL.close_logs;
13053 END FPA_total_commodity_weight;
13054 
13055 
13056 
13057 
13058 --      This API is called from the Multi-leg UI for price comparison across lanes/schedules
13059 --      It stores frieght cost details in WSH_FREIGHT_COSTS_TEMP table for all the lanes
13060 --      for display purpose.
13061 --      It returns PL/SQL tables (dense) of summary price in the same sequence as the input
13062 --      Calls shipment hierarchy flattening API
13063 
13064 PROCEDURE shipment_price_compare (
13065 	p_init_msg_list           IN     VARCHAR2 DEFAULT fnd_api.g_true,
13066 	p_init_prc_log	        IN  VARCHAR2 DEFAULT 'Y',
13067 	p_delivery_id             IN     NUMBER,
13068 	p_trip_id		IN 	NUMBER,
13069 	p_lane_sched_id_tab        IN  FTE_ID_TAB_TYPE, -- lane_ids or schedule_ids
13070 	p_lane_sched_tab           IN  FTE_CODE_TAB_TYPE, -- 'L' or 'S'  (Lane or Schedule)
13071 	p_mode_tab                 IN  FTE_CODE_TAB_TYPE,
13072 	p_service_type_tab         IN  FTE_CODE_TAB_TYPE,
13073 	p_vehicle_type_tab           IN  FTE_ID_TAB_TYPE,
13074 	p_dep_date                IN     DATE DEFAULT sysdate,
13075 	p_arr_date                IN     DATE DEFAULT sysdate,
13076 	p_pickup_location_id IN NUMBER,
13077 	p_dropoff_location_id IN NUMBER,
13078 	x_lane_sched_id_tab        OUT  NOCOPY FTE_ID_TAB_TYPE, -- lane_ids or schedule_ids
13079 	x_lane_sched_tab           OUT  NOCOPY FTE_CODE_TAB_TYPE, -- 'L' or 'S'  (Lane or Schedule)
13080 	x_vehicle_type_tab    OUT  NOCOPY FTE_ID_TAB_TYPE,--Vehicle Type ID
13081 	x_mode_tab                 OUT  NOCOPY FTE_CODE_TAB_TYPE,
13082 	x_service_type_tab         OUT NOCOPY FTE_CODE_TAB_TYPE,
13083 	x_sum_rate_tab             OUT NOCOPY FTE_ID_TAB_TYPE,
13084 	x_sum_rate_curr_tab        OUT NOCOPY FTE_CODE_TAB_TYPE,
13085 	x_request_id              OUT NOCOPY     NUMBER,     -- One request ID per comparison request
13086 	x_return_status           OUT NOCOPY     VARCHAR2 )
13087 IS
13088 
13089 
13090 CURSOR c_get_req_id IS
13091 SELECT fte_pricing_comp_request_s.nextval
13092 FROM   sys.dual;
13093 
13094 
13095 
13096    l_return_status                   VARCHAR2(1);
13097    l_request_id            NUMBER;
13098    i                       NUMBER;
13099    j                       NUMBER;
13100    k			   NUMBER;
13101    l			   NUMBER;
13102    s			   NUMBER;
13103 
13104 
13105    l_lane_id_tab             WSH_UTIL_CORE.id_tab_type;
13106    l_sched_id_tab            WSH_UTIL_CORE.id_tab_type;
13107    l_service_lane_tab        WSH_UTIL_CORE.Column_Tab_Type;
13108    l_service_sched_tab       WSH_UTIL_CORE.Column_Tab_Type;
13109 
13110    l_sum_lane_price_tab      WSH_UTIL_CORE.id_tab_type;
13111    l_sum_lane_price_curr_tab WSH_UTIL_CORE.Column_tab_type;
13112    l_sum_sched_price_tab     WSH_UTIL_CORE.id_tab_type;
13113    l_sum_sched_price_curr_tab WSH_UTIL_CORE.Column_tab_type;
13114 
13115 l_tl_lane_rows         dbms_utility.number_array;
13116 l_tl_schedule_rows     dbms_utility.number_array;
13117 l_tl_vehicle_rows      dbms_utility.number_array;
13118 l_tl_lane_sched_sum_rows   dbms_utility.number_array;
13119 l_tl_lane_sched_curr_rows  dbms_utility.name_array;
13120 l_tl_xref           dbms_utility.number_array;
13121 
13122 l_exploded_lane_rows         dbms_utility.number_array;
13123 l_exploded_schedule_rows     dbms_utility.number_array;
13124 l_exploded_vehicle_rows      dbms_utility.number_array;
13125 l_exploded_ref_rows      dbms_utility.number_array;
13126 
13127 l_output_count NUMBER;
13128 l_ref NUMBER;
13129 l_warn_flag VARCHAR2(1);
13130 l_tl_ref dbms_utility.number_array;
13131 l_lane_xref dbms_utility.number_array;
13132 l_sched_xref dbms_utility.number_array;
13133 
13134     l_log_level     NUMBER := FTE_FREIGHT_PRICING_UTIL.G_LOG;
13135 
13136    l_ret_stat               VARCHAR2(1);  -- used only for returning log file name
13137 
13138    PRAGMA AUTONOMOUS_TRANSACTION;
13139 
13140 BEGIN
13141 
13142    SAVEPOINT SHIPMENT_PRICE_COMPARE;
13143 
13144    x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
13145 
13146    IF(p_init_prc_log='Y')
13147    THEN
13148 
13149 
13150 
13151 
13152 	   FTE_FREIGHT_PRICING_UTIL.initialize_logging( p_init_msg_list  => p_init_msg_list,
13153 							x_return_status  => l_return_status );
13154 
13155 	   IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
13156 	       IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
13157 		    x_return_status  :=  l_return_status;
13158 		    RETURN;
13159 	       END IF;
13160 	   ELSE
13161 	       FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Initialize Logging successful ');
13162 	   END IF;
13163 
13164    END IF;
13165 
13166    FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
13167    FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,'shipment_price_compare','start');
13168 
13169    FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'p_delivery_id='||p_delivery_id);
13170 
13171 
13172    l_warn_flag := 'N';
13173 
13174    j:=1;
13175    k:=1;
13176    l:=1;
13177    i:=p_lane_sched_tab.FIRST;
13178    WHILE( i IS NOT NULL)
13179    LOOP
13180    	IF((p_lane_sched_tab(i)='L') AND (p_mode_tab(i) IS NOT NULL) AND (p_mode_tab(i)='TRUCK'))
13181    	THEN
13182    		l_tl_lane_rows(j):=p_lane_sched_id_tab(i);
13183    		l_tl_schedule_rows(j):=NULL;
13184    		l_tl_vehicle_rows(j):=p_vehicle_type_tab(i);
13185    		l_tl_ref(j):=i;
13186    		j:=j+1;
13187 
13188 
13189    	ELSIF((p_lane_sched_tab(i)='S') AND (p_mode_tab(i) IS NOT NULL) AND (p_mode_tab(i)='TRUCK'))
13190    	THEN
13191 
13192 		l_tl_lane_rows(j):=NULL;
13193 		l_tl_schedule_rows(j):=p_lane_sched_id_tab(i);
13194 		l_tl_vehicle_rows(j):=p_vehicle_type_tab(i);
13195 		l_tl_ref(j):=i;
13196 		j:=j+1;
13197 
13198 
13199    	ELSIF(p_lane_sched_tab(i)='L')
13200    	THEN
13201 
13202                l_lane_id_tab(k)       := p_lane_sched_id_tab(i);
13203                l_service_lane_tab(k)  := p_service_type_tab(i);
13204                l_lane_xref(k)         := i; -- xref to input index
13205                k:=k+1;
13206 
13207 
13208    	ELSIF(p_lane_sched_tab(i)='S')
13209    	THEN
13210 
13211                l_sched_id_tab(l)       := p_lane_sched_id_tab(i);
13212                l_service_sched_tab(l)  := p_service_type_tab(i);
13213                l_sched_xref(l)         := i; -- xref to input index
13214                l:=l+1;
13215 
13216    	END IF;
13217 
13218    	i:=p_lane_sched_tab.NEXT(i);
13219    END LOOP;
13220 
13221 	OPEN c_get_req_id;
13222 	FETCH c_get_req_id INTO l_request_id;
13223 	CLOSE c_get_req_id;
13224 	x_request_id := l_request_id;
13225 
13226 
13227    -- Call new internal API
13228 
13229 
13230     shipment_price_compare_pvt (
13231         p_delivery_id             =>     p_delivery_id,
13232         p_trip_id                 =>     NULL,
13233         p_lane_id_tab             =>     l_lane_id_tab,
13234         p_sched_id_tab            =>     l_sched_id_tab,
13235         p_service_lane_tab        =>     l_service_lane_tab,
13236         p_service_sched_tab       =>     l_service_sched_tab,
13237         p_dep_date                =>     p_dep_date,
13238         p_arr_date                =>     p_arr_date,
13239         x_sum_lane_price_tab      =>     l_sum_lane_price_tab,
13240         x_sum_lane_price_curr_tab =>     l_sum_lane_price_curr_tab,
13241         x_sum_sched_price_tab     =>     l_sum_sched_price_tab,
13242         x_sum_sched_price_curr_tab =>    l_sum_sched_price_curr_tab,
13243         x_request_id              =>     l_request_id,
13244         x_return_status           =>     l_return_status );
13245 
13246      x_request_id   := l_request_id;
13247 
13248 	 FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'l_return_status='||l_return_status);
13249 
13250 	 IF (l_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR ) THEN
13251 		  raise fte_freight_pricing_util.g_unexp_err;
13252 	 ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR ) THEN
13253 		  --raise fte_freight_pricing_util.g_ship_prc_compare_fail;
13254 		  --In case of expected errors in shipment_price_compare_pvt
13255 		  ---Allow this procedure to continue to TL if necessary
13256 		  x_return_status := l_return_status;
13257 		  l_warn_flag := 'Y';
13258 
13259 	 ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING ) THEN
13260 
13261 		  x_return_status := l_return_status;
13262 		  l_warn_flag := 'Y';
13263 	 END IF;
13264 
13265 
13266 
13267       	IF (l_tl_lane_rows.COUNT > 0)
13268       	THEN
13269 
13270 		--Delivery validation is already handled by shipment_price_compare_pvt
13271 
13272 
13273        		FTE_TL_RATING.Get_Vehicles_For_LaneSchedules(
13274 			p_trip_id	=>NULL,
13275 			p_lane_rows	=>l_tl_lane_rows,
13276 			p_schedule_rows =>l_tl_schedule_rows,
13277 			p_vehicle_rows	=>l_tl_vehicle_rows,
13278 			x_vehicle_rows  =>l_exploded_vehicle_rows,
13279 			x_lane_rows 	=>l_exploded_lane_rows,
13280 			x_schedule_rows =>l_exploded_schedule_rows,
13281 			x_ref_rows	=>l_exploded_ref_rows,
13282 			x_return_status =>l_return_status);
13283 
13284 	      	IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS
13285 	      	THEN
13286 		 	IF l_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR
13287 		 	THEN
13288 		    		raise FTE_FREIGHT_PRICING_UTIL.g_unexp_err;
13289 	      		END IF;
13290 	      	END IF;
13291 
13292 
13293 
13294 
13295 
13296       		FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'>>6');
13297 
13298 		FTE_TL_RATING.TL_DELIVERY_PRICE_COMPARE(
13299 			p_wsh_delivery_id=>p_delivery_id,
13300 			p_lane_rows=>l_exploded_lane_rows,
13301 			p_schedule_rows=>l_exploded_schedule_rows,
13302 			p_vehicle_rows=>l_exploded_vehicle_rows,
13303 			p_dep_date=>p_dep_date,
13304 			p_arr_date=>p_arr_date,
13305 			p_pickup_location_id=>p_pickup_location_id,
13306 			p_dropoff_location_id=>p_dropoff_location_id,
13307 			x_request_id=>l_request_id,
13308 			x_lane_sched_sum_rows=>l_tl_lane_sched_sum_rows,
13309 			x_lane_sched_curr_rows=>l_tl_lane_sched_curr_rows,
13310 			x_return_status=>l_return_status);
13311 
13312 
13313               -- Error checking here
13314               -- For now only unexpected errors returned cause this procedure to fail
13315               -- However, we can go more granular, and fail even on certain
13316               -- errors caused in the child procedures
13317 
13318 	      FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'>>l_return_status='||l_return_status);
13319 		      IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS
13320 		      THEN
13321 			 IF l_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR
13322 			 THEN
13323 			    raise FTE_FREIGHT_PRICING_UTIL.g_unexp_err;
13324 			 ELSE
13325 			  --In case of expected errors
13326 			  ---Allow this procedure to continue if necessary
13327 				l_warn_flag := 'Y';
13328 		         END IF;
13329 		       END IF;
13330 	      FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'>>l_tl_lane_sched_sum_rows.COUNT='||l_tl_lane_sched_sum_rows.COUNT);
13331 
13332 
13333 	END IF;
13334 
13335 
13336 ---Recombine results
13337 
13338 
13339 
13340 
13341 
13342       l_output_count:=p_lane_sched_id_tab.COUNT;
13343       IF (l_tl_lane_rows.COUNT > 0)
13344       THEN
13345       	l_output_count:=l_output_count+ l_exploded_ref_rows.COUNT-l_tl_lane_rows.COUNT;
13346       END IF;
13347 
13348       -- initialize output nested tables
13349       IF (p_lane_sched_id_tab.COUNT > 0 )
13350       THEN
13351 
13352       	      FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Init op tables');
13353 
13354 	      x_sum_rate_tab := FTE_ID_TAB_TYPE(0);
13355 	      x_sum_rate_curr_tab := FTE_CODE_TAB_TYPE('NULL');
13356 	      -- init all elements  the tables with 0 and 'NULL' resp.
13357 
13358 	      x_lane_sched_id_tab:=FTE_ID_TAB_TYPE(0);
13359 	      x_lane_sched_tab:=FTE_CODE_TAB_TYPE('NULL');
13360 	      x_vehicle_type_tab:=FTE_ID_TAB_TYPE(0);
13361 	      x_mode_tab:=FTE_CODE_TAB_TYPE('NULL');
13362 	      x_service_type_tab:=FTE_CODE_TAB_TYPE('NULL');
13363 
13364 
13365 	      x_sum_rate_tab.EXTEND(l_output_count-1,1);
13366 	      x_sum_rate_curr_tab.EXTEND(l_output_count-1,1);
13367 
13368 	      x_lane_sched_id_tab.EXTEND(l_output_count-1,1);
13369 	      x_lane_sched_tab.EXTEND(l_output_count-1,1);
13370 	      x_vehicle_type_tab.EXTEND(l_output_count-1,1);
13371 	      x_mode_tab.EXTEND(l_output_count-1,1);
13372 	      x_service_type_tab.EXTEND(l_output_count-1,1);
13373 
13374 	      FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Init op tables End');
13375 
13376       END IF;
13377 
13378 
13379 
13380       L :=l_sum_lane_price_tab.FIRST;
13381       S:=l_sum_sched_price_tab.FIRST;
13382       j:=l_tl_lane_rows.FIRST;
13383       i:=p_lane_sched_id_tab.FIRST;
13384       k:=x_sum_rate_tab.FIRST;
13385       l_ref:=l_exploded_ref_rows.FIRST;
13386 
13387       WHILE(k<=l_output_count)
13388       LOOP
13389 	FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Op index:'||k);
13390 
13391          IF (p_mode_tab(i) <> 'TRUCK' )
13392          THEN
13393            IF (p_lane_sched_tab(i) = 'L')
13394            THEN
13395 
13396                FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Non TL Lane:');
13397                IF ((l_sum_lane_price_tab.EXISTS(L)) AND (l_sum_lane_price_curr_tab.EXISTS(L)))
13398 	       THEN
13399 		       x_sum_rate_tab(k)      := l_sum_lane_price_tab(L);
13400 		       x_sum_rate_curr_tab(k) := l_sum_lane_price_curr_tab(L);
13401 	       END IF;
13402 
13403 	       x_lane_sched_id_tab(k):=p_lane_sched_id_tab(i);
13404 	       x_lane_sched_tab(k):=p_lane_sched_tab(i);
13405 	       x_vehicle_type_tab(k):=p_vehicle_type_tab(i);
13406 	       x_mode_tab(k):=p_mode_tab(i);
13407 	       x_service_type_tab(k):=p_service_type_tab(i);
13408 
13409 
13410                L := L + 1;
13411                k:=k+1;
13412 
13413                FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Non TL Lane ENd:');
13414 
13415            ELSIF (p_lane_sched_tab(i) = 'S')
13416            THEN
13417 
13418                FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Non TL Schedule:');
13419 
13420                IF ((l_sum_sched_price_tab.EXISTS(S)) AND (l_sum_sched_price_curr_tab.EXISTS(S)))
13421 	       THEN
13422 
13423 		       x_sum_rate_tab(k)      := l_sum_sched_price_tab(S);
13424 		       x_sum_rate_curr_tab(k) := l_sum_sched_price_curr_tab(S);
13425 	       END IF;
13426 
13427 	       x_lane_sched_id_tab(k):=p_lane_sched_id_tab(i);
13428 	       x_lane_sched_tab(k):=p_lane_sched_tab(i);
13429 	       x_vehicle_type_tab(k):=p_vehicle_type_tab(i);
13430 	       x_mode_tab(k):=p_mode_tab(i);
13431 	       x_service_type_tab(k):=p_service_type_tab(i);
13432 
13433 
13434 
13435                S := S + 1;
13436                k:=k+1;
13437 
13438                FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Non TL Schedule End:');
13439 
13440            END IF;
13441 
13442          ELSIF (p_mode_tab(i) = 'TRUCK' )
13443          THEN
13444 
13445               FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'TL :');
13446               FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'l_ref'||l_ref);
13447               FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'j'||j);
13448               FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'l_exploded_ref_rows count'||l_exploded_ref_rows.COUNT);
13449 
13450 	       WHILE(l_exploded_ref_rows.EXISTS(l_ref) AND l_exploded_ref_rows(l_ref)=j)
13451 	       LOOP
13452 
13453 		      FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'l_exploded_ref_rows(l_ref)'||l_exploded_ref_rows(l_ref));
13454 
13455 		      --FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'l_tl_lane_sched_sum_rows(l_ref)'||l_tl_lane_sched_sum_rows(l_ref));
13456 
13457 	       	       FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'TL 1:');
13458 	       	       x_sum_rate_tab(k):=-1;
13459 		       IF (l_tl_lane_sched_sum_rows.EXISTS(l_ref))
13460 		       THEN
13461 			x_sum_rate_tab(k)       := nvl(l_tl_lane_sched_sum_rows(l_ref),-1);
13462 		       END IF;
13463 
13464 		       FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'TL 2:');
13465 		       x_sum_rate_curr_tab(k):='NULL';
13466 		       IF(l_tl_lane_sched_curr_rows.EXISTS(l_ref))
13467 		       THEN
13468 			x_sum_rate_curr_tab(k)  := nvl(l_tl_lane_sched_curr_rows(l_ref),'NULL');
13469 		       END IF;
13470 		       FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'TL 3:');
13471 
13472 		       x_lane_sched_id_tab(k):=p_lane_sched_id_tab(i);
13473 		       FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'TL 4:');
13474 		       x_lane_sched_tab(k):=p_lane_sched_tab(i);
13475 		       FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'TL 5:');
13476 		       IF (l_exploded_vehicle_rows.EXISTS(l_ref))
13477 		       THEN
13478 			x_vehicle_type_tab(k):=l_exploded_vehicle_rows(l_ref);
13479 		       END IF;
13480 		       FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'TL 6:');
13481 		       x_mode_tab(k):=p_mode_tab(i);
13482 		       FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'TL 7:');
13483 		       x_service_type_tab(k):=p_service_type_tab(i);
13484 		       FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'TL 8:');
13485 
13486                   --FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,
13487                   --' '||l_ref||'-'||i||'-'||l_lane_sched_sum_rows(l_ref)||'-'||l_lane_sched_curr_rows(l_ref));
13488 
13489 
13490 		       k:=k+1;
13491 
13492 		       l_ref:=l_ref+1;
13493 	       END LOOP;
13494 
13495 	   j := j + 1;
13496 
13497 	   FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'TL End:');
13498 
13499 	 END IF;
13500 
13501 
13502       	i:=i+1;
13503       END LOOP;
13504 
13505 
13506 
13507       IF (x_sum_rate_tab.COUNT > 0) THEN
13508 	      FOR i IN x_sum_rate_tab.FIRST .. x_sum_rate_tab.LAST
13509 	      LOOP
13510 		      FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,
13511 		       ' '||x_lane_sched_id_tab(i)||' '||x_lane_sched_tab(i)||' '||x_mode_tab(i)||' '||x_service_type_tab(i)||' '
13512 		     ||x_vehicle_type_tab(i)||' '||x_sum_rate_tab(i)||' '||x_sum_rate_curr_tab(i) );
13513 	      END LOOP;
13514       END IF;
13515 
13516 
13517 	FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'warn flag'||l_warn_flag);
13518 
13519 	 IF (l_warn_flag = 'Y' ) THEN
13520 		   -- bug 2762257
13521 		   FTE_FREIGHT_PRICING_UTIL.set_price_comp_exit_warn;
13522 		   --Added to ensure return status is warning if l_warn_flag=Y
13523 		   x_return_status :=WSH_UTIL_CORE.G_RET_STS_WARNING;
13524 	 END IF;
13525 
13526 	FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'DBg.2');
13527 	 x_request_id := l_request_id;
13528 FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'DBg.3');
13529 
13530    COMMIT;  --  Commit Autonomous transaction
13531 
13532    FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'DBg.4');
13533    FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_price_compare');
13534    IF(p_init_prc_log='Y')
13535    THEN
13536 	FTE_FREIGHT_PRICING_UTIL.close_logs;
13537    END IF;
13538 
13539 
13540 
13541 
13542 EXCEPTION
13543 
13544 
13545 
13546    WHEN FTE_FREIGHT_PRICING_UTIL.g_ship_prc_compare_fail THEN
13547         ROLLBACK; -- TO SHIPMENT_PRICE_COMPARE;
13548         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
13549         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_price_compare');
13550 	IF(p_init_prc_log='Y')
13551 	THEN
13552 		FTE_FREIGHT_PRICING_UTIL.close_logs;
13553 	END IF;
13554 
13555 
13556    WHEN FTE_FREIGHT_PRICING_UTIL.g_unexp_err THEN
13557         ROLLBACK; -- TO SHIPMENT_PRICE_COMPARE;
13558         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
13559         FTE_FREIGHT_PRICING_UTIL.set_exit_exception('shipment_price_compare','g_others');
13560         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_price_compare');
13561 	IF(p_init_prc_log='Y')
13562 	THEN
13563 		FTE_FREIGHT_PRICING_UTIL.close_logs;
13564 	END IF;
13565 
13566    WHEN others THEN
13567         ROLLBACK; -- TO SHIPMENT_PRICE_COMPARE;
13568         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
13569         FTE_FREIGHT_PRICING_UTIL.set_exit_exception('shipment_price_compare','g_others');
13570         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
13571         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_price_compare');
13572 	IF(p_init_prc_log='Y')
13573 	THEN
13574 		FTE_FREIGHT_PRICING_UTIL.close_logs;
13575 	END IF;
13576 
13577 
13578 END shipment_price_compare;
13579 
13580 
13581 END FTE_FREIGHT_PRICING;
13582