DBA Data[Home] [Help]

PACKAGE BODY: APPS.FTE_FREIGHT_PRICING

Source


1 PACKAGE BODY FTE_FREIGHT_PRICING as
2 /* $Header: FTEFRPRB.pls 120.23 2005/12/02 09:53:05 mechawla 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');
408         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
405 
406 EXCEPTION
407    WHEN FTE_FREIGHT_PRICING_UTIL.g_tl_weight_uom_conv_fail THEN
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
540 	       END IF;
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;
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
668 					l_child_dtl_temp_rec:=x_freight_cost_temp_charge(i);
665 
666 					l_dtl_fraction:=l_fractions(j);
667 
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,
817 l_existing_dlegs DBMS_UTILITY.NUMBER_ARRAY;
814 	x_return_status           OUT NOCOPY     VARCHAR2) IS
815 i	NUMBER;
816 l_parent_dleg_summaries 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
972         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
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');
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');
1177         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
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');
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',
1309 
1306 	   p_charge_subtype_code  => 'SUMMARY',
1307 	   x_freight_cost_type_id  =>  l_freight_cost_type_id,
1308 	   x_return_status  =>  l_return_status);
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
1381         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'Create_LPN_Summary');
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);
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';
1526 	IF(l_consol_LPN_rated.COUNT > 0)
1523 
1524 	END IF;
1525 
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
1658 
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;
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')
1809 			IF((l_child_dlegs.COUNT > 0)AND (l_parent_dlegs.COUNT >0))
1806 			--AND (l_parent_dlegs.COUNT >0) AND (l_parent_dlegs_rated='N'))
1807 
1808 			--Always recalculate parent dleg summaries
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 
1948        CLOSE c_get_def_category;
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;
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;
2094 			  p_api			=> l_api_name,
2091     CLOSE c_check_del_manifesting;
2092     IF ( l_count > 0 ) THEN
2093       FTE_FREIGHT_PRICING_UTIL.setmsg(
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');
2225 --
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;
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,
2350                 p_freight_cost_temp_info.last_updated_by,
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,
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);
2464         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'l_wsh_amount='||l_wsh_amount);
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);
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');
2569         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
2566 
2567 EXCEPTION
2568    WHEN others THEN
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;
2681          l_basis_charge                NUMBER:=0;
2678          l_basis_price                 NUMBER:=0;
2679          l_category_charge             NUMBER:=0;
2680          l_container_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 
2784                IF p_save_flag = 'M' THEN  --  Populate appropriate columns
2781                -- Take care of the fc rows
2782                 l_main_price_index       := l_curr_fc_count + 1;
2783 
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
2880 
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);
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 
2966                    -- no need for summary records for loose items
2963                    END IF;
2964 
2965                    -- new code 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 
3063                       p_line_type_code => 'FTECHARGE',
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(
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
3173             ELSE
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);
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,
3275                                p_save_flag     =>  p_save_flag,
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,
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,
3355                                x_return_status =>  l_return_status);
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
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
3442 
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
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
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;
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
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;
3640 END prepare_fc_records;
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');
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 
3719                     raise FTE_FREIGHT_PRICING_UTIL.g_delete_qpline_failed;
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 ');
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
3827 
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
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
3911              IF p_save_flag = 'M' THEN
3908            n := l_in_between_cont_prv_cnt + 1;
3909            IF n IS NOT NULL THEN
3910            LOOP
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);
4011 
4008             x_freight_cost_main_price(l_main_price_index).currency_code := l_container_summary(l).currency_code;
4009 
4010        ELSE
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,
4111         x_fc_main_update_rows     OUT NOCOPY     Freight_Cost_Main_Tab_Type,  -- For update of SUMMARY records
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,
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
4218                      ELSE
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;
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
4312       ELSE
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;
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 
4407 
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
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);
4506         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'x_summary_lanesched_price='||round(l_temp_amt,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;
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);
4613    END LOOP;
4610 
4611       EXIT WHEN i=p_rolledup_lines.LAST;
4612       i := p_rolledup_lines.NEXT(i);
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 
4732  LOOP
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
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
4834 
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);
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);
4943 	  'MOVED_TO_MAIN_FLAG='||p_fc_temp_rows(i).MOVED_TO_MAIN_FLAG);
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,
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 : '
5053                     FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_LOG,
5050                         || g_shipment_line_rows(i).delivery_detail_id);
5051                     g_shipment_line_rows(i).comm_category_id := l_category_id;
5052                  ELSE
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;
5140 
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;
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
5236                  IF (l_category_id IS NOT NULL) THEN
5233                  -- FTE J one-time items --
5234                  l_category_id := get_default_category(p_classification_code=>p_classification_code);
5235 
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;
5347         FTE_FREIGHT_PRICING_UTIL.set_exception('rollup_loose_item',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_rollup_container_failed');
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;
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) :=
5435 
5432                                     p_pricing_dual_instances(i).instance_index;
5433             END IF;
5434          END IF;
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;
5548          x_pricing_engine_rows(l_input_index).line_quantity := p_rolled_up_lines(i).line_quantity;
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
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;
5642 
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);
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
5748          IF p_objective IS NULL AND p_grouping_level = 'CONTAINER' THEN
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 
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;
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);
5855    -- }
5856    ELSE
5857    -- {
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);
5955             IF p_aggregation = 'WITHIN' THEN
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 
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
6033                   ELSE -- Sum up quantity within the new category
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 
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,
6119                  ELSE
6116                                                      x_pricing_engine_rows(i).line_uom,
6117                                                      p_rolled_up_lines(j).line_quantity,
6118                                                      0);  -- Within same UOM class
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
6210          l_attribute_index := x_pricing_attribute_rows.COUNT + 1;
6207             x_pricing_engine_rows(l_input_index).loose_item_flag := 'Y';
6208          END IF;
6209 
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;
6305             x_pricing_engine_rows(l_input_index).basis := m;
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;
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,
6415       IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
6412                    x_return_status   => l_return_status);
6413 
6414    IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS 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          -- }
6533 
6530          END LOOP;
6531 
6532          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Before Applying Dimensional Weight');
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,
6644                    p_aggregation             =>     l_aggregation,
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,
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,
6739                    x_return_status           =>     l_return_status );
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,
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,
6837                  x_return_status           => l_return_status );
6834                  p_lane_basis              => p_lane_basis,
6835                  p_lane_id                 => p_lane_id,
6836                  x_rolledup_rec            => l_rolledup_rec,
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;
6930              x_pricing_dual_instances(l_instance_index).objective      := l_pricing_objective;
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;
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 
7020                    p_container_flag          =>     p_shpmnt_toplevel_rows(i).container_flag,
7017              l_count_pattern := x_pricing_dual_instances(l_matched_instance_index).count_pattern + 1;
7018              -- new method --
7019              add_to_instance (
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
7134    WHEN FTE_FREIGHT_PRICING_UTIL.g_invalid_line_quantity 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');
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;
7224         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'get_currency_code');
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);
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;
7325 END shipment_rating;
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);
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;
7413         l_pricing_engine_output_lines        QP_PREQ_GRP.LINE_TBL_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;
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
7526               END IF;
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;
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 
7630          END IF;
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;
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,
7739             --p_shpmnt_toplevel_rows    =>    p_shpmnt_toplevel_rows,      -- Indexed on delivery_detail_id
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,
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
7840 
7837          ELSIF p_lane_id IS NULL THEN
7838            l_freight_cost_temp_price(k).schedule_id         := p_schedule_id;
7839          END IF;
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');
7946 
7943       END IF;
7944 
7945    ELSIF p_save_flag = 'M' THEN
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
8046                    ||' commodity_category_id ='||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
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;
8150         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
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 
8245 
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;
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
8344         --FTE_FREIGHT_PRICING_UTIL.print_debug('Unexpected Error : '||SQLCODE||' : '||SQLERRM);
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');
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     l_lane_function	FTE.FTE_PRC_PARAMETERS.VALUE_FROM%TYPE;
8425     l_log_level     NUMBER := FTE_FREIGHT_PRICING_UTIL.G_DBG;
8426 
8427 BEGIN
8428 
8429     FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
8430     FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,'is_consolidated','start');
8431 
8432     -- OPEN c_get_consolidate_flag;
8433     -- FETCH c_get_consolidate_flag INTO l_consolidation_allowed;
8434     -- CLOSE c_get_consolidate_flag;
8435 
8436     -- IF l_consolidation_allowed = 'Y' THEN
8437     -- FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'is_consolidated');
8438     --    RETURN TRUE;
8439     -- ELSE
8440     -- FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'is_consolidated');
8441     --    RETURN FALSE;
8442     -- END IF;
8443 
8444     -- *** FTE J --
8445     -- Always return TRUE
8446     -- original code to look at trips commented out
8447 
8448     -- J+ delivery flat rating
8449 
8450     OPEN c_get_lane_function;
8451     FETCH c_get_lane_function INTO l_lane_function;
8452     CLOSE c_get_lane_function;
8453 
8454     IF l_lane_function = 'FLAT' THEN
8455       FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'is_consolidated');
8456       RETURN FALSE;
8457     ELSE
8458       FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'is_consolidated');
8459       RETURN TRUE;
8460     END IF;
8461 EXCEPTION
8462    WHEN others THEN
8463         --x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
8464         FTE_FREIGHT_PRICING_UTIL.set_exception('is_consolidated',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
8465         --FTE_FREIGHT_PRICING_UTIL.print_debug('Unexpected Error : '||SQLCODE||' : '||SQLERRM);
8469 
8466         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
8467         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'is_consolidated');
8468 END  is_consolidated;
8470 FUNCTION get_segment_from_dleg (
8471         p_delivery_leg_id         IN     NUMBER ) RETURN NUMBER
8472 IS
8473     CURSOR c_get_segment IS
8474     SELECT wt.trip_id
8475     FROM   wsh_trips wt,
8476            wsh_delivery_legs  wdl,
8477            wsh_trip_stops wts1,
8478            wsh_trip_stops wts2
8479     WHERE  wts1.stop_id = wdl.pick_up_stop_id
8480     AND    wts2.stop_id = wdl.drop_off_stop_id
8481     AND    wts1.trip_id = wt.trip_id
8482     and    wts2.trip_id = wt.trip_id
8483     AND    wdl.delivery_leg_id = p_delivery_leg_id;
8484 
8485     l_segment_id    NUMBER;
8486 
8487     l_log_level     NUMBER := FTE_FREIGHT_PRICING_UTIL.G_DBG;
8488 
8489 BEGIN
8490 
8491     FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
8492     FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,'get_segment_from_dleg','start');
8493     OPEN c_get_segment;
8494     FETCH c_get_segment INTO l_segment_id;
8495     CLOSE c_get_segment;
8496 
8497     FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'get_segment_from_dleg');
8498     RETURN l_segment_id;
8499 
8500 EXCEPTION
8501    WHEN others THEN
8502         --x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
8503         FTE_FREIGHT_PRICING_UTIL.set_exception('get_segment_from_dleg',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
8504         --FTE_FREIGHT_PRICING_UTIL.print_debug('Unexpected Error : '||SQLCODE||' : '||SQLERRM);
8505         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
8506         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'get_segment_from_dleg');
8507 END get_segment_from_dleg;
8508 
8509 FUNCTION get_delivery_from_dleg (
8510         p_delivery_leg_id         IN     NUMBER ) RETURN NUMBER
8511 IS
8512     CURSOR c_get_delivery IS
8513     SELECT delivery_id
8514     FROM   wsh_delivery_legs
8515     WHERE  delivery_leg_id = p_delivery_leg_id;
8516 
8517     l_delivery_id    NUMBER;
8518 
8519     l_log_level     NUMBER := FTE_FREIGHT_PRICING_UTIL.G_DBG;
8520 
8521 BEGIN
8522 
8523     FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
8524     FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,'get_delivery_from_dleg','start');
8525 
8526     OPEN c_get_delivery;
8527     FETCH c_get_delivery INTO l_delivery_id;
8528     CLOSE c_get_delivery;
8529 
8530     FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'get_delivery_from_dleg');
8531     RETURN l_delivery_id;
8532 
8533 EXCEPTION
8534    WHEN others THEN
8535         --x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
8536         FTE_FREIGHT_PRICING_UTIL.set_exception('get_delivery_from_dleg',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
8537         --FTE_FREIGHT_PRICING_UTIL.print_debug('Unexpected Error : '||SQLCODE||' : '||SQLERRM);
8538         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
8539         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'get_delivery_from_dleg');
8540 END get_delivery_from_dleg;
8541 
8542 FUNCTION get_fc_id_from_dleg (
8543         p_delivery_leg_id         IN     NUMBER ) RETURN NUMBER
8544 IS
8545 
8546     CURSOR c_get_freight_cost_id IS
8547     SELECT freight_cost_id
8548     FROM   wsh_freight_costs
8549     WHERE  delivery_leg_id = p_delivery_leg_id
8550     AND delivery_detail_id IS NULL
8551     AND    line_type_code  = 'SUMMARY';
8552 
8553     l_freight_cost_id    NUMBER;
8554 
8555     l_log_level     NUMBER := FTE_FREIGHT_PRICING_UTIL.G_DBG;
8556 
8557 BEGIN
8558 
8559     FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
8560     FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,'get_fc_id_from_dleg','start');
8561 
8562 
8563     FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'DLEG ID:'||p_delivery_leg_id);
8564 
8565     OPEN c_get_freight_cost_id;
8566     FETCH c_get_freight_cost_id INTO l_freight_cost_id;
8567     CLOSE c_get_freight_cost_id;
8568 
8569     FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'FC ID:'||l_freight_cost_id);
8570 
8571     FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'get_fc_id_from_dleg');
8572     RETURN l_freight_cost_id;
8573 
8574 EXCEPTION
8575    WHEN others THEN
8576         --x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
8577         FTE_FREIGHT_PRICING_UTIL.set_exception('get_fc_id_from_dleg',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
8578         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
8579         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'get_fc_id_from_dleg');
8580 END get_fc_id_from_dleg;
8581 
8582 PROCEDURE delete_invalid_fc_recs (
8583      p_segment_id      IN  NUMBER DEFAULT NULL,
8584      p_delivery_leg_id IN  NUMBER DEFAULT NULL,
8585      x_return_status   OUT NOCOPY  VARCHAR2 )
8586 IS
8587 
8588     l_log_level     NUMBER := FTE_FREIGHT_PRICING_UTIL.G_DBG;
8589 
8590 
8591 
8592     CURSOR c_lock_wfc_1(c_segment_id NUMBER)
8593     IS
8594 
8595 	SELECT wfc.freight_cost_id
8596 	FROM wsh_freight_costs wfc,
8597 	     wsh_delivery_legs dl ,
8598 	     wsh_trip_stops s
8599 	WHERE wfc.delivery_leg_id = dl.delivery_leg_id
8600 	      and dl.pick_up_stop_id=s.stop_id
8601 	      and s.trip_id=c_segment_id
8605     CURSOR c_lock_wfc_2(c_delivery_leg_id NUMBER)
8602 	      and wfc.charge_source_code='PRICING_ENGINE'
8603 	FOR UPDATE OF wfc.freight_cost_id NOWAIT;
8604 
8606     IS
8607     SELECT wfc.freight_cost_id
8608     FROM wsh_freight_costs wfc
8609     WHERE  wfc.delivery_leg_id = c_delivery_leg_id
8610     AND    charge_source_code = 'PRICING_ENGINE'
8611     FOR UPDATE NOWAIT;
8612 
8613 
8614     l_wfc_detail_ids DBMS_UTILITY.NUMBER_ARRAY;
8615     l_wfc_dleg_ids DBMS_UTILITY.NUMBER_ARRAY;
8616 
8617 
8618 BEGIN
8619 
8620    x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
8621    FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
8622    FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,'delete_invalid_fc_recs','start');
8623 
8624    -- Here determine if a trip has been passed or a delivery leg
8625 
8626    IF p_segment_id IS NULL AND p_delivery_leg_id IS NULL THEN
8627 
8628       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8629       FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'delete_invalid_fc_recs');
8630       RETURN;
8631 
8632    ELSIF p_delivery_leg_id IS NULL THEN
8633 
8634        OPEN c_lock_wfc_1(p_segment_id);
8635        FETCH c_lock_wfc_1 BULK COLLECT INTO l_wfc_detail_ids;
8636        CLOSE c_lock_wfc_1;
8637 
8638 	IF (l_wfc_detail_ids.FIRST IS NOT NULL)
8639 	THEN
8640 
8641 		FORALL i IN l_wfc_detail_ids.FIRST..l_wfc_detail_ids.LAST
8642 		       DELETE
8643 		       FROM   wsh_freight_costs wfc
8644 		       WHERE  wfc.freight_cost_id = l_wfc_detail_ids(i)
8645 		       AND    (line_type_code <> 'SUMMARY'
8646 			      OR (line_type_code = 'SUMMARY' AND delivery_detail_id IS NOT NULL));
8647 
8648 		FORALL i IN l_wfc_detail_ids.FIRST..l_wfc_detail_ids.LAST
8649 
8650 		       UPDATE wsh_freight_costs wfc
8651 		       SET  unit_amount=NULL,
8652 			    total_amount=NULL,
8653 			    currency_code=NULL
8654 		       WHERE  wfc.freight_cost_id=l_wfc_detail_ids(i)
8655 		       AND    line_type_code = 'SUMMARY'
8656 		       AND    delivery_detail_id IS NULL;
8657 
8658 	END IF;
8659 
8660    ELSIF p_segment_id IS NULL THEN
8661 
8662        OPEN c_lock_wfc_2(p_delivery_leg_id);
8663        FETCH c_lock_wfc_2 BULK COLLECT INTO l_wfc_dleg_ids;
8664        CLOSE c_lock_wfc_2;
8665 
8666 	IF ( l_wfc_dleg_ids.FIRST IS NOT NULL)
8667 	THEN
8668 
8669 		FORALL i IN l_wfc_dleg_ids.FIRST..l_wfc_dleg_ids.LAST
8670 		       DELETE
8671 		       FROM   wsh_freight_costs wfc
8672 		       WHERE  wfc.freight_cost_id=l_wfc_dleg_ids(i)
8673 		       AND    (line_type_code <> 'SUMMARY'
8674 			      OR (line_type_code = 'SUMMARY' AND delivery_detail_id IS NOT NULL));
8675 
8676 
8677 		FORALL i IN l_wfc_dleg_ids.FIRST..l_wfc_dleg_ids.LAST
8678 		       UPDATE wsh_freight_costs wfc
8679 		       SET  unit_amount=NULL,
8680 			    total_amount=NULL,
8681 			    currency_code=NULL
8682 		       WHERE   wfc.freight_cost_id=l_wfc_dleg_ids(i)
8683 		       AND  line_type_code = 'SUMMARY'
8684 		       AND  delivery_detail_id IS NULL;
8685 
8686 
8687 
8688 	END IF;
8689 
8690 
8691 
8692    END IF;
8693    FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'delete_invalid_fc_recs');
8694 
8695 EXCEPTION
8696    WHEN others THEN
8697         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
8698         FTE_FREIGHT_PRICING_UTIL.set_exception('delete_invalid_fc_recs',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
8699         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
8700         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'delete_invalid_fc_recs');
8701 END delete_invalid_fc_recs;
8702 
8703 PROCEDURE unmark_reprice_required (
8704      p_segment_id      IN  NUMBER DEFAULT NULL,
8705      p_delivery_leg_id IN  NUMBER DEFAULT NULL,
8706      x_return_status   OUT NOCOPY  VARCHAR2 )
8707 IS
8708 
8709     l_log_level     NUMBER := FTE_FREIGHT_PRICING_UTIL.G_DBG;
8710 
8711 BEGIN
8712 
8713    x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
8714    FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
8715    FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,'unmark_reprice_required','start');
8716 
8717    -- Here determine if a trip has been passed or a delivery leg
8718 
8719    IF p_segment_id IS NULL AND p_delivery_leg_id IS NULL THEN
8720 
8721       x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
8722       FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'unmark_reprice_required');
8723       RETURN;
8724 
8725    ELSIF p_delivery_leg_id IS NULL THEN
8726 
8727        UPDATE wsh_delivery_legs
8728        SET    reprice_required = 'N'
8729        WHERE  delivery_leg_id IN (
8730               SELECT wdl.delivery_leg_id
8731               FROM   wsh_delivery_legs wdl,
8732                      wsh_trips         wt,
8733                      wsh_trip_stops    wts1,
8734                      wsh_trip_stops    wts2
8735               WHERE  wt.trip_id     = wts1.trip_id
8736               AND    wt.trip_id     = wts2.trip_id
8737               AND    wts1.stop_id   = wdl.pick_up_stop_id
8738               AND    wts2.stop_id   = wdl.drop_off_stop_id
8739               AND    wt.trip_id     = p_segment_id );
8740 
8741    ELSIF p_segment_id IS NULL THEN
8742 
8743        UPDATE wsh_delivery_legs
8744        SET    reprice_required = 'N'
8745        WHERE  delivery_leg_id = p_delivery_leg_id;
8746 
8747    END IF;
8751    WHEN others THEN
8748    FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'unmark_reprice_required');
8749 
8750 EXCEPTION
8752         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
8753         FTE_FREIGHT_PRICING_UTIL.set_exception('unmark_reprice_required',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
8754         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
8755         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'unmark_reprice_required');
8756 END unmark_reprice_required;
8757 
8758 PROCEDURE shipment_price_consolidate (
8759         p_delivery_leg_id         IN     NUMBER DEFAULT NULL,    --  Gets either Dleg or wsh trip
8760         p_segment_id              IN     NUMBER DEFAULT NULL,
8761         p_check_reprice_flag      IN     VARCHAR2 DEFAULT 'N',
8762         x_return_status           OUT NOCOPY     VARCHAR2 )
8763 IS
8764 
8765    CURSOR c_delivery_from_trip(c_trip_id IN NUMBER) IS
8766    Select wdd.delivery_detail_id,
8767           wda.delivery_id,
8768           wdl.delivery_leg_id,
8769           nvl(wdl.reprice_required,'N') as reprice_required,  --  Added AG 05/10
8770           wda.parent_delivery_detail_id,
8771           wdd.customer_id             ,
8772           wdd.sold_to_contact_id    ,
8773           wdd.inventory_item_id    ,
8774           wdd.item_description    ,
8775           wdd.hazard_class_id    ,
8776           wdd.country_of_origin ,
8777           wdd.classification   ,
8778           wdd.requested_quantity             ,
8779           wdd.requested_quantity_uom        ,
8780           wdd.master_container_item_id     ,
8781           wdd.detail_container_item_id    ,
8782           wdd.customer_item_id           ,
8783           wdd.net_weight                ,
8784           wdd.organization_id          ,
8785           wdd.container_flag          ,
8786           wdd.container_type_code    ,
8787           wdd.container_name        ,
8788           wdd.fill_percent         ,
8789           wdd.gross_weight        ,
8790           wdd.currency_code     ,
8791           wdd.freight_class_cat_id        ,
8792           wdd.commodity_code_cat_id      ,
8793           wdd.weight_uom_code           ,
8794           wdd.volume                   ,
8795           wdd.volume_uom_code         ,
8796           wdd.tp_attribute_category  ,
8797           wdd.tp_attribute1         ,
8798           wdd.tp_attribute2        ,
8799           wdd.tp_attribute3       ,
8800           wdd.tp_attribute4                        ,
8801           wdd.tp_attribute5                       ,
8802           wdd.tp_attribute6                      ,
8803           wdd.tp_attribute7                     ,
8804           wdd.tp_attribute8                    ,
8805           wdd.tp_attribute9                   ,
8806           wdd.tp_attribute10                 ,
8807           wdd.tp_attribute11                ,
8808           wdd.tp_attribute12               ,
8809           wdd.tp_attribute13              ,
8810           wdd.tp_attribute14             ,
8811           wdd.tp_attribute15            ,
8812           wdd.attribute_category       ,
8813           wdd.attribute1              ,
8814           wdd.attribute2             ,
8815           wdd.attribute3            ,
8816           wdd.attribute4           ,
8817           wdd.attribute5          ,
8818           wdd.attribute6         ,
8819           wdd.attribute7        ,
8820           wdd.attribute8       ,
8821           wdd.attribute9      ,
8822           wdd.attribute10    ,
8823           wdd.attribute11   ,
8824           wdd.attribute12  ,
8825           wdd.attribute13 ,
8826           wdd.attribute14,
8827           wdd.attribute15,
8828           'FTE',           -- source_type
8829           NULL,            -- source_line_id
8830           NULL,            -- source_header_id
8831           NULL,            -- source_consolidation_id
8832           NULL,            -- ship_date
8833           NULL,             -- arrival_date
8834           NULL,             -- comm_category_id
8835 	  wda.type,
8836 	  wda.parent_delivery_id,
8837 	  wdl.parent_delivery_leg_id
8838    from   wsh_delivery_details wdd, wsh_delivery_assignments wda,
8839 	  wsh_new_deliveries wd,
8840           wsh_delivery_legs wdl, wsh_trip_stops wts1, wsh_trip_stops wts2,wsh_trips wt
8841    where  wdd.delivery_detail_id = wda.delivery_detail_id
8842    and    wda.delivery_id        = wdl.delivery_id
8843    and    wdl.delivery_id 	 = wd.delivery_id
8844    and    wdl.pick_up_stop_id    = wts1.stop_id
8845    and    wdl.drop_off_stop_id   = wts2.stop_id
8846    --and    wdl.reprice_required = 'Y'          -- Not required AG 05/10
8847    and    wts1.trip_id           = wt.trip_id
8848    and    wts2.trip_id           = wt.trip_id
8849    and      (wda.type IS null  OR wda.type <> 'O')--MDC
8850    and    wt.trip_id             = c_trip_id;
8851 
8852    CURSOR c_delivery_leg(c_delivery_leg_id IN NUMBER) IS
8853    Select wdd.delivery_detail_id,
8854           wda.delivery_id,
8855           wdl.delivery_leg_id,
8856           nvl(wdl.reprice_required,'N') as reprice_required,  --  Added AG 05/10
8857           wda.parent_delivery_detail_id,
8858           wdd.customer_id             ,
8859           wdd.sold_to_contact_id    ,
8860           wdd.inventory_item_id    ,
8861           wdd.item_description    ,
8862           wdd.hazard_class_id    ,
8863           wdd.country_of_origin ,
8864           wdd.classification   ,
8865           wdd.requested_quantity             ,
8869           wdd.customer_item_id           ,
8866           wdd.requested_quantity_uom        ,
8867           wdd.master_container_item_id     ,
8868           wdd.detail_container_item_id    ,
8870           wdd.net_weight                ,
8871           wdd.organization_id          ,
8872           wdd.container_flag          ,
8873           wdd.container_type_code    ,
8874           wdd.container_name        ,
8875           wdd.fill_percent         ,
8876           wdd.gross_weight        ,
8877           wdd.currency_code     ,
8878           wdd.freight_class_cat_id        ,
8879           wdd.commodity_code_cat_id      ,
8880           wdd.weight_uom_code           ,
8881           wdd.volume                   ,
8882           wdd.volume_uom_code         ,
8883           wdd.tp_attribute_category  ,
8884           wdd.tp_attribute1         ,
8885           wdd.tp_attribute2        ,
8886           wdd.tp_attribute3       ,
8887           wdd.tp_attribute4                        ,
8888           wdd.tp_attribute5                       ,
8889           wdd.tp_attribute6                      ,
8890           wdd.tp_attribute7                     ,
8891           wdd.tp_attribute8                    ,
8892           wdd.tp_attribute9                   ,
8893           wdd.tp_attribute10                 ,
8894           wdd.tp_attribute11                ,
8895           wdd.tp_attribute12               ,
8896           wdd.tp_attribute13              ,
8897           wdd.tp_attribute14             ,
8898           wdd.tp_attribute15            ,
8899           wdd.attribute_category       ,
8900           wdd.attribute1              ,
8901           wdd.attribute2             ,
8902           wdd.attribute3            ,
8903           wdd.attribute4           ,
8904           wdd.attribute5          ,
8905           wdd.attribute6         ,
8906           wdd.attribute7        ,
8907           wdd.attribute8       ,
8908           wdd.attribute9      ,
8909           wdd.attribute10    ,
8910           wdd.attribute11   ,
8911           wdd.attribute12  ,
8912           wdd.attribute13 ,
8913           wdd.attribute14,
8914           wdd.attribute15,
8915           'FTE',           -- source_type
8916           NULL,            -- source_line_id
8917           NULL,            -- source_header_id
8918           NULL,            -- source_consolidation_id
8919           NULL,            -- ship_date
8920           NULL,            -- arrival_date
8921           NULL,            -- comm_category_id
8922 	  wda.type,
8923 	  wda.parent_delivery_id,
8924 	  wdl.parent_delivery_leg_id
8925    from   wsh_delivery_details wdd, wsh_delivery_assignments wda, wsh_delivery_legs wdl,
8926 	  wsh_new_deliveries wd
8927    where  wdd.delivery_detail_id = wda.delivery_detail_id
8928    and    wda.delivery_id        = wdl.delivery_id
8929    and    wdl.delivery_id 	 = wd.delivery_id
8930    and    ((wdl.reprice_required = 'Y' AND p_check_reprice_flag = 'Y') OR (p_check_reprice_flag = 'N'))
8931    and      (wda.type IS null  OR wda.type <> 'O')--MDC
8932    and    wdl.delivery_leg_id    = c_delivery_leg_id;
8933 
8934    CURSOR c_trip_first_stop(c_trip_id NUMBER)
8935    IS
8936    SELECT planned_departure_date
8937    FROM    wsh_trip_stops
8938    WHERE  trip_id = c_trip_id
8939    AND	  stop_sequence_number =
8940    (SELECT min(stop_sequence_number)
8941     FROM wsh_trip_stops
8942     WHERE trip_id = c_trip_id);
8943 
8944    CURSOR c_trip_last_stop(c_trip_id NUMBER)
8945    IS
8946    SELECT planned_arrival_date
8947    FROM    wsh_trip_stops
8948    WHERE  trip_id = c_trip_id
8949    AND	  stop_sequence_number =
8950    (SELECT max(stop_sequence_number)
8951     FROM wsh_trip_stops
8952     WHERE trip_id = c_trip_id);
8953 --
8954    l_return_status     VARCHAR2(1);
8955       l_return_code             NUMBER;
8956    l_delvy_det_rec     shipment_line_rec_type;
8957    l_dlvy              WSH_UTIL_CORE.id_tab_type;
8958    l_first_level_rows  shpmnt_content_tab_type;
8959    l_first_level_charges  addl_services_tab_type;
8960 
8961    l_dummy_summary     NUMBER;
8962    l_dummy_summary_uom VARCHAR2(40);
8963    l_segment_id        NUMBER;
8964    l_reprice_reqd_count NUMBER:=0;
8965    l_delivery_id       NUMBER;
8966    i                   NUMBER;
8967    j                   NUMBER;
8968    l_dummy_fc_temp_price     Freight_Cost_Temp_Tab_Type;
8969    l_dummy_fc_temp_charge     Freight_Cost_Temp_Tab_Type;
8970 
8971       l_initial_pickup_date		DATE;
8972       l_ultimate_dropoff_date		DATE;
8973 
8974     l_log_level     NUMBER := FTE_FREIGHT_PRICING_UTIL.G_LOG;
8975 
8976 BEGIN
8977 
8978    x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
8979    FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
8980    FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,'shipment_price_consolidate','start');
8981 
8982    FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'p_delivery_leg_id='||p_delivery_leg_id);
8983    FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'p_segment_id='||p_segment_id);
8984    FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'p_check_reprice_flag='||p_check_reprice_flag);
8985 
8986    IF p_segment_id IS NULL AND p_delivery_leg_id IS NULL THEN
8987 
8988       raise FTE_FREIGHT_PRICING_UTIL.g_noleg_segment;
8989 
8990    ELSIF p_segment_id IS NOT NULL THEN
8991       validate_nontl_trip(
8992 	p_trip_id 	=> p_segment_id,
8993 	x_return_code => l_return_code);
8994 
8995       IF l_return_code = G_RC_ERROR THEN
8999 	     OR l_return_code = G_RC_NOT_RATE_MANIFESTING) THEN
8996 	RAISE FND_API.G_EXC_ERROR;
8997       ELSIF (l_return_code = G_RC_REPRICE_NOT_REQUIRED
8998 	     OR l_return_code = G_RC_NOT_RATE_FREIGHT_TERM
9000         x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
9001 	raise g_finished_warning;
9002       END IF;
9003    ELSE
9004 
9005     OPEN c_get_delivery_id(p_delivery_leg_id);
9006     FETCH c_get_delivery_id INTO l_delivery_id;
9007     CLOSE c_get_delivery_id;
9008 
9009       validate_delivery(
9010 	p_delivery_id 	=> l_delivery_id,
9011 	x_return_code => l_return_code);
9012 
9013       IF l_return_code = G_RC_ERROR THEN
9014 	RAISE FND_API.G_EXC_ERROR;
9015       ELSIF (l_return_code = G_RC_REPRICE_NOT_REQUIRED
9016 	     OR l_return_code = G_RC_NOT_RATE_FREIGHT_TERM
9017 	     OR l_return_code = G_RC_NOT_RATE_MANIFESTING) THEN
9018         x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
9019 	raise g_finished_warning;
9020       END IF;
9021    END IF;
9022 
9023    g_shipment_line_rows.DELETE;
9024 
9025    SAVEPOINT before_pricing;
9026 
9027    -- Here determine if a trip has been passed or a delivery leg
9028 
9029    IF p_segment_id IS NOT NULL THEN
9030 
9031     IF p_check_reprice_flag = 'Y' THEN
9032 
9033     OPEN c_count_reprice_reqd(p_segment_id);
9034     FETCH c_count_reprice_reqd INTO l_reprice_reqd_count;
9035     CLOSE c_count_reprice_reqd;
9036 
9037     END IF;
9038 
9039     IF (p_check_reprice_flag = 'Y' AND l_reprice_reqd_count > 0) OR
9040        p_check_reprice_flag = 'N' THEN
9041 
9042       OPEN c_delivery_from_trip(p_segment_id);
9043 
9044       LOOP
9045          FETCH c_delivery_from_trip INTO l_delvy_det_rec;
9046          EXIT WHEN c_delivery_from_trip%NOTFOUND;
9047          g_shipment_line_rows(l_delvy_det_rec.delivery_detail_id) := l_delvy_det_rec;
9048       END LOOP;
9049       IF c_delivery_from_trip%ROWCOUNT = 0 THEN
9050          CLOSE c_delivery_from_trip;
9051          --raise FTE_FREIGHT_PRICING_UTIL.g_pricing_not_required;
9052          raise FTE_FREIGHT_PRICING_UTIL.g_empty_delivery;
9053          --raise others;  --  Should not happen ie. unexpected error
9054       ELSE
9055          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Matching number of delivery lines : '||c_delivery_from_trip%ROWCOUNT);
9056       END IF;
9057 
9058       CLOSE c_delivery_from_trip;
9059 
9060 
9061       IF is_consolidated(p_segment_id) THEN     --  New API
9062          -- If atleast one delivery leg for this segment has reprice required flag = 'Y'
9063          -- then all the delivery legs need to be repriced irrespective of their flags
9064 
9065          -- Need to delete existing freight cost records
9066          -- for all delivery legs in this trip segment
9067 
9068       delete_invalid_fc_recs (
9069              p_segment_id      =>  p_segment_id,
9070              x_return_status   =>  l_return_status ) ;
9071 
9072       IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9073          IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
9074              ROLLBACK to before_pricing;
9075              FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'segment:delete_invalid_fc_recs ');
9076              raise FTE_FREIGHT_PRICING_UTIL.g_delete_invalid_fc_failed;
9077          END IF;
9078       ELSE
9079          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,p_segment_id||' : Existing freight cost records deleted ');
9080       END IF;
9081 
9082          flatten_shipment (
9083             x_first_level_rows        =>    l_first_level_rows,
9084             x_return_status           =>    l_return_status );
9085 
9086         IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9087            IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
9088                FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'segment:Consolidate=Y:flatten_shipment ');
9089                ROLLBACK to before_pricing;
9090                raise FTE_FREIGHT_PRICING_UTIL.g_flatten_shipment_failed;
9091            END IF;
9092         ELSE -- What happens if no first level rows are created
9093              -- raise FTE_FREIGHT_PRICING_UTIL.g_an exception
9094            -- Should never happen AG 05/10
9095            IF l_first_level_rows.COUNT = 0 THEN
9096               ROLLBACK to before_pricing;
9097               raise FTE_FREIGHT_PRICING_UTIL.g_empty_delivery;
9098            END IF;
9099            FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'No. of top level lines 2 : '||l_first_level_rows.COUNT);
9100         END IF;
9101 
9102          -- Scoped out for patch H
9103          /*
9104          get_top_level_charges (
9105             p_first_level_rows        =>    l_first_level_rows,
9106             x_shpmnt_toplevel_charges =>    l_first_level_charges,
9107             x_return_status           =>    l_return_status );
9108          */
9109 
9110       	OPEN c_trip_first_stop(p_segment_id);
9111       	FETCH c_trip_first_stop INTO l_initial_pickup_date;
9112       	CLOSE c_trip_first_stop;
9113 
9114       	OPEN c_trip_last_stop(p_segment_id);
9115       	FETCH c_trip_last_stop INTO l_ultimate_dropoff_date;
9116       	CLOSE c_trip_last_stop;
9117 
9118          shipment_pricing (
9119             p_segment_id              =>    p_segment_id,-- Input either Lane or the trip segment
9120             p_shpmnt_toplevel_rows    =>    l_first_level_rows,
9121             p_shpmnt_toplevel_charges =>    l_first_level_charges,
9122 	    p_ship_date		      =>    l_initial_pickup_date,
9126             x_summary_lanesched_price_uom  => l_dummy_summary_uom,
9123 	    p_arrival_date	      =>    l_ultimate_dropoff_date,
9124             p_save_flag               =>    'M', -- Whether to save to TEMP table or MAIN table
9125             x_summary_lanesched_price      => l_dummy_summary,
9127             x_freight_cost_temp_price      => l_dummy_fc_temp_price,
9128             x_freight_cost_temp_charge     => l_dummy_fc_temp_charge,
9129             x_return_status           =>    l_return_status ) ;
9130 
9131         IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9132            IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
9133                ROLLBACK to before_pricing;
9134                FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'segment:Consolidate=Y:shipment_pricing ');
9135                raise FTE_FREIGHT_PRICING_UTIL.g_shipment_pricing_failed;
9136            END IF;
9137         ELSE -- What happens if no first level rows are created
9138            FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'Shipment pricing successful ');
9139         END IF;
9140 
9141       -- Here the reprice required flag for all the delivery legs for this segment should be marked as 'N'
9142       unmark_reprice_required (
9143              p_segment_id      =>  p_segment_id,
9144              x_return_status   =>  l_return_status ) ;
9145 
9146       IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9147          IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
9148              ROLLBACK to before_pricing;
9149              FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'segment:unmark_reprice_required ');
9150              raise FTE_FREIGHT_PRICING_UTIL.g_unmark_reprice_req_failed;
9151          END IF;
9152       ELSE -- What happens if no first level rows are created
9153          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,p_segment_id||' : reprice required flag unmarked ');
9154       END IF;
9155 
9156       ELSE  --  Need to call separately for each different delivery leg in the segment
9157             --  if it's reprice_required flag = 'Y'
9158          i := g_shipment_line_rows.FIRST;
9159          LOOP
9160             IF NOT l_dlvy.EXISTS(g_shipment_line_rows(i).delivery_leg_id) THEN
9161                -- If the delivery leg has reprice required flag = 'Y'
9162                --IF g_shipment_line_rows(i).reprice_required = 'Y' THEN
9163 
9164                IF (p_check_reprice_flag = 'Y' AND g_shipment_line_rows(i).reprice_required = 'Y') OR
9165                   p_check_reprice_flag = 'N' THEN
9166 
9167          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');
9168                   l_dlvy(g_shipment_line_rows(i).delivery_leg_id) := g_shipment_line_rows(i).delivery_leg_id;
9169                END IF;
9170             END IF;
9171             EXIT WHEN i=g_shipment_line_rows.LAST;
9172             i := g_shipment_line_rows.NEXT(i);
9173 
9174          END LOOP;
9175 
9176          IF l_dlvy.COUNT > 0 THEN
9177          j := l_dlvy.FIRST;
9178          LOOP
9179 
9180             l_first_level_rows.delete;
9181             l_first_level_charges.delete;
9182 
9183             FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,l_dlvy(j)||' : First level lines initialized ');
9184 
9185          -- Need to delete existing freight cost records
9186          -- for this delivery leg
9187 
9188          delete_invalid_fc_recs (
9189              p_delivery_leg_id =>  l_dlvy(j),
9190              x_return_status   =>  l_return_status ) ;
9191 
9192          IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9193             IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
9194                 ROLLBACK to before_pricing;
9195                 FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'dleg:consolidate:N:delete_invalid_fc_recs ');
9196                 raise FTE_FREIGHT_PRICING_UTIL.g_delete_invalid_fc_failed;
9197             END IF;
9198          ELSE
9199             FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,l_dlvy(j)||' : Existing freight cost records deleted ');
9200          END IF;
9201 
9202                flatten_shipment (
9203                   p_delivery_leg_id         =>    l_dlvy(j),
9204                   x_first_level_rows        =>    l_first_level_rows,
9205                   x_return_status           =>    l_return_status );
9206 
9207                IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9208                      IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
9209                          FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'segment:Consolidate=N:flatten_shipment ');
9210                          ROLLBACK to before_pricing;
9211                          raise FTE_FREIGHT_PRICING_UTIL.g_flatten_shipment_failed;
9212                      END IF;
9213                ELSE -- What happens if no first level rows are created
9214                        -- raise FTE_FREIGHT_PRICING_UTIL.g_an exception
9215                        -- Should not ever happen AG 05/10
9216                      IF l_first_level_rows.COUNT = 0 THEN
9217                         ROLLBACK to before_pricing;
9218                         raise FTE_FREIGHT_PRICING_UTIL.g_empty_delivery;
9219                      END IF;
9220                      FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'No. of top level lines 3 : '||l_first_level_rows.COUNT);
9221                END IF;
9222 
9223                /*
9227                   x_return_status           =>    l_return_status );
9224                get_top_level_charges (
9225                   p_first_level_rows        =>    l_first_level_rows,
9226                   x_shpmnt_toplevel_charges =>    l_first_level_charges,
9228                */
9229 
9230                shipment_pricing (
9231                   p_segment_id              =>    p_segment_id,-- Input either Lane or the trip segment
9232                   p_shpmnt_toplevel_rows    =>    l_first_level_rows,
9233                   p_shpmnt_toplevel_charges =>    l_first_level_charges,
9234                   p_save_flag               =>    'M', -- Whether to save to TEMP table or MAIN table
9235                   x_summary_lanesched_price      => l_dummy_summary,
9236                   x_summary_lanesched_price_uom  => l_dummy_summary_uom,
9237                   x_freight_cost_temp_price      => l_dummy_fc_temp_price,
9238                   x_freight_cost_temp_charge     => l_dummy_fc_temp_charge,
9239                   x_return_status           =>    l_return_status ) ;
9240 
9241               IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9242                  IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
9243                      ROLLBACK to before_pricing;
9244                      FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'segment:Consolidate=N:shipment_pricing ');
9245                      raise FTE_FREIGHT_PRICING_UTIL.g_shipment_pricing_failed;
9246                  END IF;
9247               ELSE -- What happens if no first level rows are created
9248                  FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'Shipment pricing successful ');
9249               END IF;
9250 
9251            -- Here the reprice required flag for this delivery leg should be marked as 'N'
9252            unmark_reprice_required (
9253                   p_delivery_leg_id =>  l_dlvy(j),
9254                   x_return_status   =>  l_return_status ) ;
9255 
9256            IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9257               IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
9258                   ROLLBACK to before_pricing;
9259                   FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'dleg:consolidate:N:unmark_reprice_required ');
9260                   raise FTE_FREIGHT_PRICING_UTIL.g_unmark_reprice_req_failed;
9261               END IF;
9262            ELSE
9263               FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,l_dlvy(j)||' : reprice required flag unmarked ');
9264            END IF;
9265 
9266             EXIT WHEN j=l_dlvy.LAST;
9267             j := l_dlvy.NEXT(j);
9268 
9269          END LOOP;
9270          ELSE
9271             -- Even though reprice_required count > 0
9272             -- No g_shipment_line_rows got created with reprice_required = 'Y'
9273             -- which can arise out of the concerning delivery leg being empty
9274             raise FTE_FREIGHT_PRICING_UTIL.g_empty_delivery;
9275          END IF;
9276 
9277       END IF;
9278 
9279     ELSE
9280        raise FTE_FREIGHT_PRICING_UTIL.g_pricing_not_required;
9281     END IF; -- reprice required count > 0
9282 
9283    ELSIF p_delivery_leg_id IS NOT NULL THEN
9284 
9285       l_segment_id := get_segment_from_dleg(p_delivery_leg_id);   --  New API
9286 
9287       IF is_consolidated(l_segment_id) THEN
9288 
9289        IF p_check_reprice_flag = 'Y' THEN
9290 
9291         OPEN c_count_reprice_reqd(l_segment_id);
9292         FETCH c_count_reprice_reqd INTO l_reprice_reqd_count;
9293         CLOSE c_count_reprice_reqd;
9294 
9295        END IF;
9296 
9297         IF (p_check_reprice_flag = 'Y' AND l_reprice_reqd_count > 0) OR
9298            p_check_reprice_flag = 'N' THEN
9299 
9300         --IF l_reprice_reqd_count > 0 THEN
9301 
9302          OPEN c_delivery_from_trip(l_segment_id);
9303 
9304          LOOP
9305             FETCH c_delivery_from_trip INTO l_delvy_det_rec;
9306             EXIT WHEN c_delivery_from_trip%NOTFOUND;
9307             g_shipment_line_rows(l_delvy_det_rec.delivery_detail_id) := l_delvy_det_rec;
9308          END LOOP;
9309          IF c_delivery_from_trip%ROWCOUNT = 0 THEN
9310             CLOSE c_delivery_from_trip;
9311             raise FTE_FREIGHT_PRICING_UTIL.g_empty_delivery;
9312             --raise FTE_FREIGHT_PRICING_UTIL.g_pricing_not_required;
9313          ELSE
9314             FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Matching number of delivery lines : '||c_delivery_from_trip%ROWCOUNT);
9315          END IF;
9316 
9317          CLOSE c_delivery_from_trip;
9318 
9319          -- Need to delete existing freight cost records
9320          -- for all delivery legs in this trip segment
9321 
9322       delete_invalid_fc_recs (
9323              p_segment_id      =>  l_segment_id,
9324              x_return_status   =>  l_return_status ) ;
9325 
9326       IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9327          IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
9328              ROLLBACK to before_pricing;
9329              FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'dleg:consolidate:Y:delete_invalid_fc_recs ');
9330              raise FTE_FREIGHT_PRICING_UTIL.g_delete_invalid_fc_failed;
9331          END IF;
9332       ELSE
9333          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,l_segment_id||' : Existing freight cost records deleted ');
9334       END IF;
9335 
9336          flatten_shipment (
9340         IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9337             x_first_level_rows        =>    l_first_level_rows,
9338             x_return_status           =>    l_return_status );
9339 
9341            IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
9342                FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'dleg:Consolidate=Y:flatten_shipment ');
9343                ROLLBACK to before_pricing;
9344                raise FTE_FREIGHT_PRICING_UTIL.g_flatten_shipment_failed;
9345            END IF;
9346         ELSE -- What happens if no first level rows are created
9347              -- raise FTE_FREIGHT_PRICING_UTIL.g_an exception
9348            -- Should never happen AG 5/10
9349            IF l_first_level_rows.COUNT = 0 THEN
9350               ROLLBACK to before_pricing;
9351               raise FTE_FREIGHT_PRICING_UTIL.g_empty_delivery;
9352            END IF;
9353            FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'No. of top level lines 4 : '||l_first_level_rows.COUNT);
9354         END IF;
9355 
9356          /*
9357          get_top_level_charges (
9358             p_first_level_rows        =>    l_first_level_rows,
9359             x_shpmnt_toplevel_charges =>    l_first_level_charges,
9360             x_return_status           =>    l_return_status );
9361          */
9362 
9363       	OPEN c_trip_first_stop(l_segment_id);
9364       	FETCH c_trip_first_stop INTO l_initial_pickup_date;
9365       	CLOSE c_trip_first_stop;
9366 
9367       	OPEN c_trip_last_stop(l_segment_id);
9368       	FETCH c_trip_last_stop INTO l_ultimate_dropoff_date;
9369       	CLOSE c_trip_last_stop;
9370 
9371          shipment_pricing (
9372             p_segment_id              =>    l_segment_id,-- Input either Lane or the trip segment
9373             p_shpmnt_toplevel_rows    =>    l_first_level_rows,
9374             p_shpmnt_toplevel_charges =>    l_first_level_charges,
9375 	    p_ship_date		      =>    l_initial_pickup_date,
9376 	    p_arrival_date	      =>    l_ultimate_dropoff_date,
9377             p_save_flag               =>    'M', -- Whether to save to TEMP table or MAIN table
9378             x_summary_lanesched_price      => l_dummy_summary,
9379             x_summary_lanesched_price_uom  => l_dummy_summary_uom,
9380             x_freight_cost_temp_price      => l_dummy_fc_temp_price,
9381             x_freight_cost_temp_charge     => l_dummy_fc_temp_charge,
9382             x_return_status           =>    l_return_status ) ;
9383 
9384          IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9385               IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
9386                      ROLLBACK to before_pricing;
9387                      FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'dleg:Consolidate=Y:shipment_pricing ');
9388                      raise FTE_FREIGHT_PRICING_UTIL.g_shipment_pricing_failed;
9389               END IF;
9390          ELSE -- What happens if no first level rows are created
9391               FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'Shipment pricing successful ');
9392          END IF;
9393 
9394             -- Here the reprice required flag for all the delivery legs for this segment should be marked as 'N'
9395          unmark_reprice_required (
9396                    p_segment_id      =>  l_segment_id,
9397                    x_return_status   =>  l_return_status ) ;
9398 
9399          IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9400              IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
9401                    ROLLBACK to before_pricing;
9402                    FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'dleg:consolidate:Y:unmark_reprice_required ');
9403                    raise FTE_FREIGHT_PRICING_UTIL.g_unmark_reprice_req_failed;
9404              END IF;
9405          ELSE -- What happens if no first level rows are created
9406              FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,l_segment_id||' : reprice required flag unmarked ');
9407          END IF;
9408 
9409        ELSE
9410           raise FTE_FREIGHT_PRICING_UTIL.g_pricing_not_required;
9411        END IF; -- reprice required count > 0
9412 
9413       ELSE
9414 
9415          OPEN c_delivery_leg(p_delivery_leg_id);
9416 
9417          LOOP
9418             FETCH c_delivery_leg INTO l_delvy_det_rec;
9419             EXIT WHEN c_delivery_leg%NOTFOUND;
9420             g_shipment_line_rows(l_delvy_det_rec.delivery_detail_id) := l_delvy_det_rec;
9421          END LOOP;
9422          IF c_delivery_leg%ROWCOUNT = 0 THEN
9423             CLOSE c_delivery_leg;
9424             ROLLBACK to before_pricing;
9425             raise FTE_FREIGHT_PRICING_UTIL.g_pricing_not_required;
9426          ELSE
9427             FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Matching number of delivery lines : '||c_delivery_leg%ROWCOUNT);
9428          END IF;
9429 
9430          CLOSE c_delivery_leg;
9431 
9432          -- Need to delete existing freight cost records
9433          -- for this delivery leg
9434 
9435          delete_invalid_fc_recs (
9436              p_delivery_leg_id =>  p_delivery_leg_id,
9437              x_return_status   =>  l_return_status ) ;
9438 
9439          IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9440             IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
9441                 ROLLBACK to before_pricing;
9442                 FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'dleg:consolidate:N:delete_invalid_fc_recs ');
9443                 raise FTE_FREIGHT_PRICING_UTIL.g_delete_invalid_fc_failed;
9447          END IF;
9444             END IF;
9445          ELSE
9446             FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,p_delivery_leg_id||' : Existing freight cost records deleted ');
9448 
9449          flatten_shipment (
9450 --          p_delivery_leg_id         =>    p_delivery_leg_id,    --  Not required
9451             x_first_level_rows        =>    l_first_level_rows,
9452             x_return_status           =>    l_return_status );
9453 
9454         IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9455            IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
9456                FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'dleg:Consolidate=N:flatten_shipment ');
9457                ROLLBACK to before_pricing;
9458                raise FTE_FREIGHT_PRICING_UTIL.g_flatten_shipment_failed;
9459            END IF;
9460         ELSE -- What happens if no first level rows are created
9461              -- raise FTE_FREIGHT_PRICING_UTIL.g_an exception
9462            -- Should never happen AG 5/10
9463            IF l_first_level_rows.COUNT = 0 THEN
9464               ROLLBACK to before_pricing;
9465               raise FTE_FREIGHT_PRICING_UTIL.g_empty_delivery;
9466            END IF;
9467            FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'No. of top level lines 5: '||l_first_level_rows.COUNT);
9468         END IF;
9469 
9470          /*
9471          get_top_level_charges (
9472             p_first_level_rows        =>    l_first_level_rows,
9473             x_shpmnt_toplevel_charges =>    l_first_level_charges,
9474             x_return_status           =>    l_return_status );
9475          */
9476 
9477          shipment_pricing (
9478             p_segment_id              =>    l_segment_id,-- Input either Lane or the trip segment
9479             p_shpmnt_toplevel_rows    =>    l_first_level_rows,
9480             p_shpmnt_toplevel_charges =>    l_first_level_charges,
9481             p_save_flag               =>    'M', -- Whether to save to TEMP table or MAIN table
9482             x_summary_lanesched_price      => l_dummy_summary,
9483             x_summary_lanesched_price_uom  => l_dummy_summary_uom,
9484             x_freight_cost_temp_price      => l_dummy_fc_temp_price,
9485             x_freight_cost_temp_charge     => l_dummy_fc_temp_charge,
9486             x_return_status           =>    l_return_status ) ;
9487 
9488              IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9489                 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
9490                     ROLLBACK to before_pricing;
9491                     FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'dleg:Consolidate=N:shipment_pricing ');
9492                     raise FTE_FREIGHT_PRICING_UTIL.g_shipment_pricing_failed;
9493                 END IF;
9494              ELSE -- What happens if no first level rows are created
9495                 FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'Shipment pricing successful ');
9496              END IF;
9497 
9498            -- Here the reprice required flag for this delivery leg should be marked as 'N'
9499            unmark_reprice_required (
9500                   p_delivery_leg_id =>  p_delivery_leg_id,
9501                   x_return_status   =>  l_return_status ) ;
9502 
9503            IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9504               IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
9505                   ROLLBACK to before_pricing;
9506                   FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'dleg:consolidate:N:unmark_reprice_required ');
9507                   raise FTE_FREIGHT_PRICING_UTIL.g_unmark_reprice_req_failed;
9508               END IF;
9509            ELSE -- What happens if no first level rows are created
9510               FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_INF,p_delivery_leg_id||' : reprice required flag unmarked ');
9511            END IF;
9512 
9513       END IF;
9514 
9515    END IF;
9516    --FTE_FREIGHT_PRICING_UTIL.close_logs;
9517    FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_price_consolidate');
9518 
9519 EXCEPTION
9520    WHEN g_finished_warning THEN
9521         x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
9522         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_price_consolidate');
9523    WHEN FND_API.G_EXC_ERROR THEN
9524         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9525         FTE_FREIGHT_PRICING_UTIL.set_exception('shipment_price_consolidate',FTE_FREIGHT_PRICING_UTIL.G_ERR,'FND_API.G_EXC_ERROR');
9526         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_price_consolidate');
9527    WHEN FTE_FREIGHT_PRICING_UTIL.g_noleg_segment THEN
9528         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9529         FTE_FREIGHT_PRICING_UTIL.set_exception('shipment_price_consolidate',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_noleg_segment');
9530         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_price_consolidate');
9531    WHEN FTE_FREIGHT_PRICING_UTIL.g_pricing_not_required THEN
9532         x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
9533         FTE_FREIGHT_PRICING_UTIL.set_exception('shipment_price_consolidate',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_pricing_not_required');
9534         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_price_consolidate');
9535    WHEN FTE_FREIGHT_PRICING_UTIL.g_flatten_shipment_failed THEN
9536         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9537         FTE_FREIGHT_PRICING_UTIL.set_exception('shipment_price_consolidate',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_flatten_shipment_failed');
9538         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_price_consolidate');
9542         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_price_consolidate');
9539    WHEN FTE_FREIGHT_PRICING_UTIL.g_empty_delivery THEN
9540         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9541         FTE_FREIGHT_PRICING_UTIL.set_exception('shipment_price_consolidate',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_empty_delivery');
9543    WHEN FTE_FREIGHT_PRICING_UTIL.g_shipment_pricing_failed THEN
9544         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9545         FTE_FREIGHT_PRICING_UTIL.set_exception('shipment_price_consolidate',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_shipment_pricing_failed');
9546         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_price_consolidate');
9547    WHEN FTE_FREIGHT_PRICING_UTIL.g_unmark_reprice_req_failed THEN
9548         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9549         FTE_FREIGHT_PRICING_UTIL.set_exception('shipment_price_consolidate',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_unmark_reprice_req_failed');
9550         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_price_consolidate');
9551    WHEN FTE_FREIGHT_PRICING_UTIL.g_delete_invalid_fc_failed THEN
9552         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9553         FTE_FREIGHT_PRICING_UTIL.set_exception('shipment_price_consolidate',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_delete_invalid_fc_failed');
9554         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_price_consolidate');
9555    WHEN others THEN
9556         ROLLBACK to before_pricing;
9557         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
9558         FTE_FREIGHT_PRICING_UTIL.set_exception('shipment_price_consolidate',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
9559         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
9560         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_price_consolidate');
9561 
9562 END shipment_price_consolidate;
9563 
9564 PROCEDURE shipment_price_consolidate (
9565         p_init_msg_list           IN     VARCHAR2 DEFAULT fnd_api.g_true,
9566         p_in_attributes           IN     FtePricingInRecType,
9567         x_return_status           OUT NOCOPY     VARCHAR2,
9568         x_msg_count               OUT NOCOPY     NUMBER,
9569         x_msg_data                OUT NOCOPY     VARCHAR2 )
9570 IS
9571 
9572         l_return_status    VARCHAR2(1);
9573 
9574     l_trip_id NUMBER;
9575     l_mode VARCHAR2(30);
9576     l_output_tab FTE_FREIGHT_PRICING.Freight_Cost_Temp_Tab_Type;
9577     l_log_level     NUMBER := FTE_FREIGHT_PRICING_UTIL.G_LOG;
9578 
9579 BEGIN
9580 
9581    x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
9582 
9583     -- Initialize message list if p_init_msg_list is set to TRUE.
9584     IF FND_API.to_Boolean( p_init_msg_list ) THEN
9585 
9586    FTE_FREIGHT_PRICING_UTIL.initialize_logging( p_init_msg_list  => p_init_msg_list,
9587                                                 x_return_status  => l_return_status );
9588 
9589    IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9590        IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
9591             x_return_status  :=  l_return_status;
9592             RETURN;
9593        END IF;
9594    ELSE
9595        FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Initialize Logging successful ');
9596    END IF;
9597 
9598     END IF;
9599 
9600    FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
9601    FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,'shipment_price_consolidate_standard','start');
9602 
9603 
9604 	l_trip_id:=NULL;
9605 	l_mode:=NULL;
9606 
9607 
9608    	IF(p_in_attributes.segment_id IS NOT NULL)
9609    	THEN
9610 
9611 		Get_Trip_Mode(
9612 			p_trip_id=>p_in_attributes.segment_id,
9613 			p_dleg_id=>NULL,
9614 			x_trip_id=>l_trip_id,
9615 			x_mode_of_transport=>l_mode,
9616 			x_return_status=>l_return_status);
9617 
9618 		IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS
9619 		THEN
9620 		       IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING
9621 		       THEN
9622 			  raise FTE_FREIGHT_PRICING_UTIL.g_get_trip_mode_fail;
9623 		       END IF;
9624 		END IF;
9625 	ELSIF(p_in_attributes.delivery_leg_id IS NOT NULL)
9626 	THEN
9627 
9628 		Get_Trip_Mode(
9629 			p_trip_id=>NULL,
9630 			p_dleg_id=>p_in_attributes.delivery_leg_id,
9631 			x_trip_id=>l_trip_id,
9632 			x_mode_of_transport=>l_mode,
9633 			x_return_status=>l_return_status);
9634 
9635 		IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS
9636 		THEN
9637 		       IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING
9638 		       THEN
9639 			  raise FTE_FREIGHT_PRICING_UTIL.g_get_trip_mode_fail;
9640 		       END IF;
9641 		END IF;
9642 
9643 
9644 	END IF;
9645 
9646 	IF ((l_mode IS NOT NULL) AND (l_mode='TRUCK'))
9647 	THEN
9648 		FTE_TL_RATING.TL_Rate_Trip (
9649 		   p_trip_id=>l_trip_id ,
9650 		   p_output_type=>'M',
9651 		   p_check_reprice_flag=>'Y',
9652 		   x_output_cost_tab=>l_output_tab,
9653 		   x_return_status=>l_return_status);
9654 
9655 		IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS
9656 		THEN
9657 		       IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING
9658 		       THEN
9659 			  raise FTE_FREIGHT_PRICING_UTIL.g_tl_rate_trip_fail;
9660 		       END IF;
9661 		END IF;
9662 
9663 
9664 
9665 	ELSE
9666 
9667 
9668 
9672 		   p_check_reprice_flag      =>     'Y',
9669 	   shipment_price_consolidate (
9670 		   p_delivery_leg_id         =>     p_in_attributes.delivery_leg_id,
9671 		   p_segment_id              =>     p_in_attributes.segment_id,
9673 		   x_return_status           =>     l_return_status );
9674 
9675 	   IF l_return_status = WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9676 	       FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'Shipment price consolidate successful ');
9677 	   ELSIF l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING THEN
9678 		  x_return_status := l_return_status;
9679 	       FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'Shipment price consolidate successful with warning ');
9680 	   ELSE
9681 		  raise FTE_FREIGHT_PRICING_UTIL.g_price_consolidate_failed;
9682 	   END IF;
9683 	 END IF;
9684 
9685    -- Standard call to get message count and if count is 1,
9686    -- get message info.
9687    FND_MSG_PUB.Count_And_Get (
9688      p_count         =>      x_msg_count,
9689      p_data          =>      x_msg_data );
9690 
9691    FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_price_consolidate_standard');
9692     IF FND_API.to_Boolean( p_init_msg_list ) THEN
9693    FTE_FREIGHT_PRICING_UTIL.close_logs;
9694     END IF;
9695 
9696 EXCEPTION
9697 
9698    WHEN FTE_FREIGHT_PRICING_UTIL.g_get_trip_mode_fail THEN
9699         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9700         FTE_FREIGHT_PRICING_UTIL.set_exit_exception('shipment_price_consolidate_standard','g_get_trip_mode_fail');
9701         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_price_consolidate_standard');
9702     IF FND_API.to_Boolean( p_init_msg_list ) THEN
9703         FTE_FREIGHT_PRICING_UTIL.close_logs;
9704     END IF;
9705 
9706 
9707    WHEN FTE_FREIGHT_PRICING_UTIL.g_tl_rate_trip_fail THEN
9708         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9709         FTE_FREIGHT_PRICING_UTIL.set_exit_exception('shipment_price_consolidate_standard','g_tl_rate_trip_fail');
9713     END IF;
9710         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_price_consolidate_standard');
9711     IF FND_API.to_Boolean( p_init_msg_list ) THEN
9712         FTE_FREIGHT_PRICING_UTIL.close_logs;
9714 
9715 
9716    WHEN FTE_FREIGHT_PRICING_UTIL.g_price_consolidate_failed THEN
9717         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
9718         FTE_FREIGHT_PRICING_UTIL.set_exit_exception('shipment_price_consolidate_standard','g_price_consolidate_failed');
9719         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_price_consolidate_standard');
9720     IF FND_API.to_Boolean( p_init_msg_list ) THEN
9721         FTE_FREIGHT_PRICING_UTIL.close_logs;
9722     END IF;
9723    WHEN others THEN
9724         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
9725         FTE_FREIGHT_PRICING_UTIL.set_exit_exception('shipment_price_consolidate_standard','g_others');
9726         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
9727         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_price_consolidate_standard');
9728     IF FND_API.to_Boolean( p_init_msg_list ) THEN
9729         FTE_FREIGHT_PRICING_UTIL.close_logs;
9730     END IF;
9731 END shipment_price_consolidate;
9732 
9733 PROCEDURE shipment_price_compare (
9734         p_init_msg_list           IN     VARCHAR2 DEFAULT fnd_api.g_true,
9735         p_delivery_id             IN     NUMBER,
9736         -- JDBC Thin driver can not support PL/SQL tables having one column (OCI driver supports) types
9737         -- thats why we are goint with this clumsy way of comma separated list
9738         p_lane_rows               IN     VARCHAR2 DEFAULT NULL,
9739         p_schedule_rows           IN     VARCHAR2 DEFAULT NULL,
9740         p_service_lane            IN     VARCHAR2 DEFAULT NULL,
9741         p_service_sched           IN     VARCHAR2 DEFAULT NULL,
9742         p_dep_date                IN     DATE DEFAULT sysdate,
9743         p_arr_date                IN     DATE DEFAULT sysdate,
9744         x_summary_lane_price      OUT NOCOPY     VARCHAR2,
9745         x_summary_lane_price_uom  OUT NOCOPY     VARCHAR2,
9746         x_summary_sched_price     OUT NOCOPY     VARCHAR2,
9747         x_summary_sched_price_uom OUT NOCOPY     VARCHAR2,
9748         x_request_id              OUT NOCOPY     NUMBER,
9749         x_return_status           OUT NOCOPY     VARCHAR2 )
9750 IS
9751 
9752 
9753 BEGIN
9754 
9755 	NULL;
9756 
9757 END shipment_price_compare;
9758 
9759 PROCEDURE shipment_reprice (
9760         errbuf                OUT NOCOPY  VARCHAR2,
9761         retcode               OUT NOCOPY  VARCHAR2,
9762         p_fte_trip_id         IN     NUMBER DEFAULT NULL, -- Input only ONE of the following FOUR
9763         p_segment_id          IN     NUMBER DEFAULT NULL,
9764         p_delivery_id         IN     NUMBER DEFAULT NULL,
9765         p_delivery_leg_id     IN     NUMBER DEFAULT NULL )
9766 IS
9767 
9768         l_return_status         VARCHAR2(1);
9769         l_status                VARCHAR2(10);
9770         l_temp                  BOOLEAN;
9771 
9772     l_log_level     NUMBER := FTE_FREIGHT_PRICING_UTIL.G_LOG;
9773 
9774 BEGIN
9775    FTE_FREIGHT_PRICING_UTIL.initialize_logging(p_debug_mode  => 'CONC',
9776                                                x_return_status => l_return_status );
9777 
9778    FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
9779    FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,'shipment_reprice_conc','start');
9780 
9781    shipment_reprice2 (
9782         p_fte_trip_id         =>     p_fte_trip_id,
9783         p_segment_id          =>     p_segment_id,
9784         p_delivery_id         =>     p_delivery_id,
9785         p_delivery_leg_id     =>     p_delivery_leg_id,
9786         x_return_status       =>     l_return_status );
9787 
9788   IF l_return_status = WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9789         l_status := 'NORMAL';
9790         errbuf := 'Shipment Reprice is completed successfully';
9791         retcode := '0';
9792   ELSIF l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING THEN
9793         l_status := 'WARNING';
9794         errbuf := 'Shipment Reprice is completed with warning';
9795         retcode := '1';
9796   ELSE
9797         l_status := 'ERROR';
9798         errbuf := 'Shipment Reprice is completed with error';
9799         retcode := '2';
9800   END IF;
9801 
9802   l_temp := FND_CONCURRENT.SET_COMPLETION_STATUS(l_status,'');
9803   FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_reprice_conc');
9804 
9805 EXCEPTION
9806   WHEN OTHERS THEN
9807         l_temp := FND_CONCURRENT.SET_COMPLETION_STATUS('ERROR','');
9808         errbuf := 'Shipment Reprice is completed with an Unexpected error';
9809         retcode := '2';
9810         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_reprice_conc');
9811 
9812 END shipment_reprice;
9813 
9814 PROCEDURE shipment_reprice2 (
9815         p_init_prc_log	      IN     VARCHAR2 DEFAULT 'Y',
9816         p_fte_trip_id         IN     NUMBER DEFAULT NULL,
9817         p_segment_id          IN     NUMBER DEFAULT NULL,
9818         p_delivery_id         IN     NUMBER DEFAULT NULL,
9819         p_delivery_leg_id     IN     NUMBER DEFAULT NULL,
9820         x_return_status       OUT NOCOPY     VARCHAR2 )
9821 IS
9822         l_segment_id       NUMBER;
9823         l_delivery_leg_id  NUMBER;
9824         l_return_status    VARCHAR2(1);
9825 /*
9826  CURSOR c_segment_from_fte_trip IS
9827  SELECT fwt.wsh_trip_id
9828  FROM   fte_trips ft, fte_wsh_trips fwt
9829  WHERE  ft.fte_trip_id = fwt.fte_trip_id
9830  AND    ft.fte_trip_id = p_fte_trip_id;
9831 */
9832  CURSOR c_delivery_leg_from_dlvy IS
9833  SELECT delivery_leg_id
9834  FROM   wsh_delivery_legs
9835  WHERE  delivery_id = p_delivery_id;
9836 
9837 
9838  l_output_tab FTE_FREIGHT_PRICING.Freight_Cost_Temp_Tab_Type;
9842     l_log_level     NUMBER := FTE_FREIGHT_PRICING_UTIL.G_LOG;
9839  l_mode VARCHAR2(30);
9840  l_trip_id NUMBER;
9841 
9843 
9844 BEGIN
9845 
9846    x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
9847 
9848   IF p_init_prc_log = 'Y' THEN
9849    FTE_FREIGHT_PRICING_UTIL.initialize_logging(x_return_status => l_return_status);
9850 
9851    IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9852        IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
9853             x_return_status  :=  l_return_status;
9854             RETURN;
9855        END IF;
9856    ELSE
9857        FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Initialize Logging successful ');
9858    END IF;
9859   END IF;
9860    FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
9861    FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,'shipment_reprice2','start');
9862 
9863    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);
9864 
9865    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
9866    THEN
9867       raise FTE_FREIGHT_PRICING_UTIL.g_no_input;
9868    ELSIF p_segment_id IS NOT NULL THEN
9869 
9870 	Get_Trip_Mode(
9871 		p_trip_id=>p_segment_id,
9872 		p_dleg_id=>NULL,
9873 		x_trip_id=>l_trip_id,
9874 		x_mode_of_transport=>l_mode,
9875 		x_return_status=>l_return_status);
9876 
9877         IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS
9878         THEN
9879                IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING
9880                THEN
9881               raise FTE_FREIGHT_PRICING_UTIL.g_get_trip_mode_fail;
9882                END IF;
9883         END IF;
9884 
9885 	IF ((l_mode IS NOT NULL) AND (l_mode='TRUCK'))
9886 	THEN
9887 		FTE_TL_RATING.TL_Rate_Trip (
9888 		   p_trip_id=>p_segment_id ,
9889 		   p_output_type=>'M',
9890 		   p_check_reprice_flag=>'N',
9891 		   x_output_cost_tab=>l_output_tab,
9892 		   x_return_status=>l_return_status);
9893 
9894 		IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS
9895 		THEN
9896 		       IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING
9897 		       THEN
9898 			  raise FTE_FREIGHT_PRICING_UTIL.g_tl_rate_trip_fail;
9899 		       END IF;
9900 		END IF;
9901 
9902 
9903 
9904 	ELSE
9905 
9906 	      	shipment_price_consolidate (
9907 			p_segment_id              =>     p_segment_id,
9908 			x_return_status           =>     l_return_status );
9909 
9910 		IF l_return_status = WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9911 		   FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'Shipment price consolidate successful for segment : '||p_segment_id);
9912 		ELSIF l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING THEN
9913 		  x_return_status := l_return_status;
9914 		   FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'Shipment price consolidate successful with warning for segment : '||p_segment_id);
9915 		ELSE
9916 		       FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'segment: '||p_segment_id||' shipment_price_consolidate ');
9917 		       raise FTE_FREIGHT_PRICING_UTIL.g_price_consolidate_failed;
9918 		END IF;
9919 
9920 
9921 	END IF;
9922 
9923 
9924 
9925    ELSIF p_delivery_id IS NOT NULL THEN
9926    --  Need to call for all delivery legs belonging to this delivery
9927 
9928       OPEN c_delivery_leg_from_dlvy;
9929       LOOP
9930          FETCH c_delivery_leg_from_dlvy INTO l_delivery_leg_id;
9931          EXIT WHEN c_delivery_leg_from_dlvy%NOTFOUND;
9932 
9933 
9934 
9935 	Get_Trip_Mode(
9936 		p_trip_id=>NULL,
9937 		p_dleg_id=>l_delivery_leg_id,
9938 		x_trip_id=>l_trip_id,
9939 		x_mode_of_transport=>l_mode,
9940 		x_return_status=>l_return_status);
9941 
9942 	IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS
9943 	THEN
9944 	       IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING
9945 	       THEN
9946 		  raise FTE_FREIGHT_PRICING_UTIL.g_get_trip_mode_fail;
9947 	       END IF;
9948 	END IF;
9949 
9950 	IF ((l_mode IS NOT NULL) AND (l_mode='TRUCK'))
9951 	THEN
9952 		FTE_TL_RATING.TL_Rate_Trip (
9953 		   p_trip_id=>l_trip_id ,
9954 		   p_output_type=>'M',
9955 		   p_check_reprice_flag=>'N',
9956 		   x_output_cost_tab=>l_output_tab,
9957 		   x_return_status=>l_return_status);
9958 
9959 		IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS
9960 		THEN
9961 		       IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING
9962 		       THEN
9963 			  raise FTE_FREIGHT_PRICING_UTIL.g_tl_rate_trip_fail;
9964 		       END IF;
9965 		END IF;
9966 
9967 
9968 
9969 	ELSE
9970 
9971 
9972 		 shipment_price_consolidate (
9973 		   p_delivery_leg_id         =>     l_delivery_leg_id,
9974 		   x_return_status           =>     l_return_status );
9975 
9976 		IF l_return_status = WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
9977 		   FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'Shipment price consolidate successful for delivery leg : '||l_delivery_leg_id);
9978 		ELSIF l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING THEN
9979 		  x_return_status := l_return_status;
9980 		   FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'Shipment price consolidate successful for segment : '||p_segment_id);
9981 		ELSE
9982 		       FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'Delivery leg: '||l_delivery_leg_id||' shipment_price_consolidate ');
9983 		       raise FTE_FREIGHT_PRICING_UTIL.g_price_consolidate_failed;
9984 		END IF;
9985 	END IF;
9986 
9987       END LOOP;
9988       CLOSE c_delivery_leg_from_dlvy;
9989 
9990    ELSIF p_delivery_leg_id IS NOT NULL THEN
9991 
9992 	Get_Trip_Mode(
9993 		p_trip_id=>NULL,
9997 		x_return_status=>l_return_status);
9994 		p_dleg_id=>p_delivery_leg_id,
9995 		x_trip_id=>l_trip_id,
9996 		x_mode_of_transport=>l_mode,
9998 
9999 	IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS
10000 	THEN
10001 	       IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING
10002 	       THEN
10003 		  raise FTE_FREIGHT_PRICING_UTIL.g_get_trip_mode_fail;
10004 	       END IF;
10005 	END IF;
10006 
10007 	IF ((l_mode IS NOT NULL) AND (l_mode='TRUCK'))
10008 	THEN
10009 		FTE_TL_RATING.TL_Rate_Trip (
10010 		   p_trip_id=>l_trip_id ,
10011 		   p_output_type=>'M',
10012 		   p_check_reprice_flag=>'N',
10013 		   x_output_cost_tab=>l_output_tab,
10014 		   x_return_status=>l_return_status);
10015 
10016 		IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS
10017 		THEN
10018 		       IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING
10019 		       THEN
10020 			  raise FTE_FREIGHT_PRICING_UTIL.g_tl_rate_trip_fail;
10021 		       END IF;
10022 		END IF;
10023 
10024 
10025     ELSE
10026 
10027 	      shipment_price_consolidate (
10028 		p_delivery_leg_id         =>     p_delivery_leg_id,
10029 		x_return_status           =>     l_return_status );
10030 
10031 		IF l_return_status = WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
10032 		   FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'Shipment price consolidate successful for delivery leg : '||p_delivery_leg_id);
10033 		ELSIF l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING THEN
10034 		  x_return_status := l_return_status;
10035 		ELSE
10036 		       FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'delivery leg: '||p_delivery_leg_id||' shipment_price_consolidate ');
10037 		       raise FTE_FREIGHT_PRICING_UTIL.g_price_consolidate_failed;
10038 		END IF;
10039 	END IF;
10040 
10041    END IF;
10042    FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_reprice2');
10043   IF p_init_prc_log = 'Y' THEN
10044    FTE_FREIGHT_PRICING_UTIL.close_logs;
10045   END IF;
10046 
10047 EXCEPTION
10048    WHEN FTE_FREIGHT_PRICING_UTIL.g_no_input THEN
10049         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
10050         FTE_FREIGHT_PRICING_UTIL.set_exception('shipment_reprice2',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_no_input');
10051         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_reprice2');
10052   IF p_init_prc_log = 'Y' THEN
10053         FTE_FREIGHT_PRICING_UTIL.close_logs;
10054   END IF;
10055 
10056    WHEN FTE_FREIGHT_PRICING_UTIL.g_get_trip_mode_fail THEN
10057         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
10058         FTE_FREIGHT_PRICING_UTIL.set_exception('shipment_reprice2',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_get_trip_mode_fail');
10059         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_reprice2');
10060   IF p_init_prc_log = 'Y' THEN
10061         FTE_FREIGHT_PRICING_UTIL.close_logs;
10062   END IF;
10063 
10064    WHEN FTE_FREIGHT_PRICING_UTIL.g_tl_rate_trip_fail THEN
10065         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
10066         FTE_FREIGHT_PRICING_UTIL.set_exception('shipment_reprice2',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_tl_rate_trip_fail');
10067         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_reprice2');
10068   IF p_init_prc_log = 'Y' THEN
10069         FTE_FREIGHT_PRICING_UTIL.close_logs;
10070   END IF;
10071 
10072 
10073    WHEN FTE_FREIGHT_PRICING_UTIL.g_price_consolidate_failed THEN
10074         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
10075         FTE_FREIGHT_PRICING_UTIL.set_exception('shipment_reprice2',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_price_consolidate_failed');
10076         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_reprice2');
10077   IF p_init_prc_log = 'Y' THEN
10078         FTE_FREIGHT_PRICING_UTIL.close_logs;
10079   END IF;
10080 
10081    WHEN others THEN
10082         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
10083         FTE_FREIGHT_PRICING_UTIL.set_exception('shipment_reprice2',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
10084         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
10085         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_reprice2');
10086   IF p_init_prc_log = 'Y' THEN
10087         FTE_FREIGHT_PRICING_UTIL.close_logs;
10088   END IF;
10089 END shipment_reprice2;
10090 
10091 
10092 --PROCEDURE validate_rerate_delivery(p_delv_list IN FTE_ID_TAB_TYPE,
10093 
10094 -- Added for R12 to get Delivery Legs for all the deliveries.
10095 -- This is added to allow multi leg rating in case of rerating.
10096 -- In addition to this , this delivery needs to find out all the
10097 -- delivery legs for it's child deliveries in case it's console delivery.
10098 
10099 PROCEDURE  get_delivery_legs(
10100             p_deliveries_list IN  FTE_ID_TAB_TYPE,
10101             x_delivery_legs   OUT NOCOPY DELIVERY_LEG_TAB_TYPE,
10102             x_return_status   OUT NOCOPY  VARCHAR2)
10103 IS
10104 
10105     l_log_level     NUMBER := FTE_FREIGHT_PRICING_UTIL.G_LOG;
10106     l_delvy_tab     DELIVERY_LEG_TAB_TYPE;
10107     l_delv_leg_rec  delivery_leg_rec_type;
10108     i               NUMBER := 0;
10109     l_index         NUMBER := 0;
10110 
10111     CURSOR c_get_delivery_legs_detail(c_delivery_id IN NUMBER) IS
10112     SELECT wdl.delivery_id,delivery_leg_id,wnd.name
10113     FROM   wsh_delivery_legs wdl, wsh_new_deliveries wnd
10114     WHERE  wdl.delivery_id= c_delivery_id
10115     AND    wnd.delivery_id = wdl.delivery_id;
10116 
10117 BEGIN
10118 
10119   FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
10120   FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,'get_delivery_legs','start');
10121 
10122   FOR i in p_deliveries_list.FIRST..p_deliveries_list.LAST LOOP
10123     FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'looping through Delivery ids in get_delivery_legs... ');
10124     OPEN c_get_delivery_legs_detail(p_deliveries_list(i));
10125     LOOP
10129         FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'l_delv_leg_rec.delivery_leg_id. ' ||l_delv_leg_rec.delivery_leg_id );
10126         FETCH c_get_delivery_legs_detail INTO l_delv_leg_rec;
10127         EXIT WHEN c_get_delivery_legs_detail%NOTFOUND;
10128         l_index := l_index +1;
10130         --l_delvy_tab(l_delv_leg_rec.delivery_leg_id) := l_delv_leg_rec;
10131         l_delvy_tab(l_index) := l_delv_leg_rec;
10132     END LOOP;
10133     FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'Total Leg Count for Delivery. ' || p_deliveries_list(i) || ' is '|| l_delvy_tab.COUNT );
10134     CLOSE c_get_delivery_legs_detail ;
10135   END LOOP;
10136 
10137   FOR i IN l_delvy_tab.FIRST..l_delvy_tab.LAST LOOP
10138       FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,' Leg  is='|| l_delvy_tab(i).delivery_leg_id);
10139   END LOOP;
10140 
10141   FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'Out of loop for Delivery ids in get_delivery_legs... ');
10142 
10143   x_delivery_legs := l_delvy_tab;
10144 
10145 EXCEPTION
10146    WHEN others THEN
10147         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
10148         FTE_FREIGHT_PRICING_UTIL.set_exception('get_delivery_legs',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
10149         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
10150         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'get_delivery_legs');
10151 END get_delivery_legs;
10152 
10153 -- Internal procedure to get distinct trip_ids for a given
10154 -- delivery legs table.
10155 -- Added for R12. Used in rerate_shipment_online.
10156 
10157 PROCEDURE get_distinct_trip_ids( p_dleg_list IN FTE_ID_TAB_TYPE,
10158                                  x_trip_ids  OUT NOCOPY DELIVERY_TRIP_TAB_TYPE,
10159                                  x_all_trips OUT NOCOPY DELIVERY_TRIP_TAB_TYPE,
10160                                  x_return_status OUT NOCOPY VARCHAR2)
10161 
10162 IS
10163 
10164     CURSOR c_get_distinct_trip_ids(c_dleg_id IN VARCHAR2) IS
10165     SELECT DISTINCT  wdl.delivery_id,wts1.trip_id ,wdl.delivery_leg_id,wnd.name
10166     FROM  wsh_delivery_legs wdl ,
10167           wsh_trip_stops wts1,
10168           wsh_trip_stops wts2,
10169           wsh_trips      wt,
10170           wsh_new_deliveries wnd
10171     WHERE wdl.pick_up_stop_id  = wts1.stop_id
10172     AND   wdl.drop_off_stop_id = wts2.stop_id
10173     AND   wdl.delivery_leg_id  = c_dleg_id
10174     AND   wt.trip_id           = wts1.trip_id
10175     AND   wnd.delivery_id      = wdl.delivery_id;
10176 
10177     i               NUMBER := 0;
10178     l_dleg_ids      VARCHAR2(32767);
10179     l_trip_ids      VARCHAR2(32767);
10180     l_log_level     NUMBER := FTE_FREIGHT_PRICING_UTIL.G_LOG;
10181     l_api_name      CONSTANT VARCHAR2(30)   := 'get_distinct_trip_ids';
10182     l_trip_id       NUMBER;
10183     l_is_first      BOOLEAN := TRUE ;
10184     --l_del_trip_tab  DELIVERY_TRIP_TAB_TYPE;
10185     l_del_trip_rec  DELIVERY_TRIP_REC_TYPE;
10186     j               NUMBER  := 0;
10187     trip_exists     BOOLEAN := FALSE;
10188     l_trip_index    NUMBER  := 0;
10189 
10190 BEGIN
10191 
10192     FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
10193     FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,l_api_name);
10194     --x_trip_ids := FTE_ID_TAB_TYPE();
10195 
10196     FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,p_dleg_list.COUNT);
10197 
10198     FOR i IN p_dleg_list.FIRST..p_dleg_list.COUNT LOOP
10199         OPEN c_get_distinct_trip_ids(p_dleg_list(i));
10200         FETCH c_get_distinct_trip_ids INTO l_del_trip_rec;
10201         FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'After Fetch');
10202         -- Only store unique trips in trips table.
10203         IF x_trip_ids.COUNT > 0 THEN
10204             FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'x_trip_ids.COUNT > 0');
10205             FOR j IN x_trip_ids.FIRST..x_trip_ids.COUNT LOOP
10206                 FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'x_trip_ids(j).trip_id = ' || x_trip_ids(j).trip_id);
10207                 FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'l_del_trip_rec.trip_id = ' || l_del_trip_rec.trip_id);
10208                 IF x_trip_ids(j).trip_id  = l_del_trip_rec.trip_id THEN
10209                     trip_exists := true;
10210                     EXIT WHEN trip_exists;
10211                     -- break the loop
10212                 ELSE
10213                     trip_exists := false;
10214                 END IF;
10215             END LOOP;
10216         END IF;
10217 FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'After Unique trip loop ');
10218 --FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'trip_exists = ' || to_char(trip_exists));
10219 
10220          IF NOT trip_exists then
10221             l_trip_index := l_trip_index +1;
10222             x_trip_ids(l_trip_index) := l_del_trip_rec;
10223          END IF;
10224 
10225          x_all_trips(i) := l_del_trip_rec;
10226 
10227         CLOSE c_get_distinct_trip_ids;
10228     END LOOP;
10229 
10230     FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'Trip Ids Count=' || x_trip_ids.COUNT);
10231     FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'get_distinct_trip_ids');
10232 
10233 
10234 EXCEPTION
10235   WHEN others THEN
10236         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
10237         FTE_FREIGHT_PRICING_UTIL.set_exception('get_distinct_trip_ids',FTE_FREIGHT_PRICING_UTIL.G_ERR,'get distinct trips failed');
10238         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'get_distinct_trip_ids');
10239 END get_distinct_trip_ids;
10240 
10241  --This API is written for R12. It does the following validation
10242  -- 1) Delivery type is Outbound/Internal Orders and status is Open
10243  -- 2) Or Delivery type is Inbound/Drop Ship
10244  -- If a delivery  doesnt meet this criteria, it;s removed from the deliveries list
10245  -- which need rerating
10246  -- For Deliveries which fail validation a new message is written in log file.
10250                       x_deliveries_list OUT NOCOPY FTE_ID_TAB_TYPE
10247 
10248 PROCEDURE    validate_delv_for_rerating
10249                     ( p_deliveries_list IN FTE_ID_TAB_TYPE,
10251                      )
10252 
10253 IS
10254 
10255     l_new_delv_list         FTE_ID_TAB_TYPE;
10256     l_api_name              CONSTANT VARCHAR2(30)   := 'validate_delv_for_rerating';
10257     l_log_level             NUMBER := FTE_FREIGHT_PRICING_UTIL.G_LOG;
10258     i                       NUMBER := 0;
10259     l_var                   VARCHAR2(1);
10260 
10261     CURSOR check_delivery_type (c_delivery_id IN NUMBER)
10262     IS
10263     SELECT 'X' FROM WSH_NEW_DELIVERIES
10264     WHERE ( shipment_direction IN ('O','IO') AND status_code = 'OP')
10265     OR    (  shipment_direction IN ('D','I') )
10266     AND delivery_id = c_delivery_id ;
10267 
10268 BEGIN
10269     FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
10270     FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,l_api_name);
10271     l_new_delv_list := FTE_ID_TAB_TYPE();
10272 
10273    FOR i IN p_deliveries_list.FIRST..p_deliveries_list.LAST
10274    LOOP
10275        OPEN check_delivery_type(p_deliveries_list(i));
10276        FETCH check_delivery_type INTO l_var;
10277        IF check_delivery_type%NOTFOUND THEN
10278             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');
10279         ELSE
10280             l_new_delv_list.EXTEND;
10281             l_new_delv_list(i) := p_deliveries_list(i);
10282         END IF;
10283         CLOSE check_delivery_type;
10284    END LOOP;
10285 
10286    x_deliveries_list := l_new_delv_list;
10287 
10288 EXCEPTION
10289 
10290     WHEN OTHERS THEN
10291         FTE_FREIGHT_PRICING_UTIL.set_exception('validate_delv_for_rerating',FTE_FREIGHT_PRICING_UTIL.G_ERR,'validate_delv_for_rerating failed');
10292         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'validate_delv_for_rerating');
10293 
10294 END validate_delv_for_rerating;
10295 
10296 --This API is written for R12. It does the following validation
10297 -- 1) Delivery leg has a rate
10298 -- If a delivery leg doesnt have existing rates, it removes it from
10299 -- the list of dlegs which need to be rerated.
10300 -- For Dlegs which fail validation a new message is written in log file.
10301 PROCEDURE     validate_delivery_legs(p_dlegs_list IN FTE_ID_TAB_TYPE,
10302                                      x_dleg_list  OUT NOCOPY FTE_ID_TAB_TYPE,
10303                                      x_failed_dleg_list OUT NOCOPY FTE_ID_TAB_TYPE,
10304                                      x_return_status OUT NOCOPY VARCHAR2
10305                                      )
10306 
10307 IS
10308     l_new_dleg_list         FTE_ID_TAB_TYPE;
10309     l_failed_dleg_list      FTE_ID_TAB_TYPE;
10310     l_api_name              CONSTANT VARCHAR2(30)   := 'validate_delivery_legs';
10311     l_log_level             NUMBER := FTE_FREIGHT_PRICING_UTIL.G_LOG;
10312     i                       NUMBER := 0;
10313     l_var                   NUMBER;--VARCHAR2(1);
10314     dleg_rates_not_found    EXCEPTION;
10315 
10316 
10317     CURSOR check_freight_cost_exist (c_delivery_leg_id IN NUMBER)
10318     IS
10319     SELECT total_amount FROM wsh_freight_costs
10320     WHERE line_type_code='SUMMARY'
10321     AND delivery_detail_id is null
10322     AND freight_cost_type_id is not null
10323     AND delivery_leg_id= c_delivery_leg_id;
10324 
10325 BEGIN
10326     FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
10327     FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,l_api_name);
10328     l_new_dleg_list := FTE_ID_TAB_TYPE();
10329     l_failed_dleg_list := FTE_ID_TAB_TYPE();
10330 
10331    FOR i IN p_dlegs_list.FIRST..p_dlegs_list.LAST
10332    LOOP
10333        OPEN check_freight_cost_exist(p_dlegs_list(i));
10334        FETCH check_freight_cost_exist INTO l_var;
10335        IF check_freight_cost_exist%NOTFOUND THEN
10336             FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,' No existing rates found for dleg='|| p_dlegs_list(i) || ' Required for rerating ');
10337             l_failed_dleg_list.EXTEND;
10338             l_failed_dleg_list(l_failed_dleg_list.LAST) := p_dlegs_list(i);
10339         ELSIF  l_var IS NULL THEN
10340             FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,' Total amt. Null for dleg='|| p_dlegs_list(i) || ' Required for rerating ');
10341             l_failed_dleg_list.EXTEND;
10342             l_failed_dleg_list(l_failed_dleg_list.LAST) := p_dlegs_list(i);
10343         ELSE
10344             FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,' Existing rates found for dleg='|| p_dlegs_list(i) || ' Required for rerating ');
10345             l_new_dleg_list.EXTEND;
10346             l_new_dleg_list(l_new_dleg_list.LAST) := p_dlegs_list(i);
10347         END IF;
10348         CLOSE check_freight_cost_exist;
10349    END LOOP;
10350 
10351    x_dleg_list := l_new_dleg_list;
10352    x_failed_dleg_list := l_failed_dleg_list;
10353 
10354    FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'validate_delivery_legs');
10355 
10356 
10357 EXCEPTION
10358 
10359     --WHEN dleg_rates_not_found THEN
10360       --  x_return_status :=  WSH_UTIL_CORE.G_RET_STS_ERROR;
10361       --  FTE_FREIGHT_PRICING_UTIL.set_exception('validate_delivery_legs',FTE_FREIGHT_PRICING_UTIL.G_ERR,'dleg_rates_not_found');
10362       --  FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'validate_delivery_legs');
10363     WHEN OTHERS THEN
10364         FTE_FREIGHT_PRICING_UTIL.set_exception('validate_delivery_legs',FTE_FREIGHT_PRICING_UTIL.G_ERR,'validate_delivery_legs failed');
10365         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
10366         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'validate_delivery_legs');
10367 END validate_delivery_legs;
10368 
10369 
10373                             x_closed_trips_list  OUT NOCOPY WSH_UTIL_CORE.id_tab_type)
10370 PROCEDURE    validate_trips(p_trip_id_list IN WSH_UTIL_CORE.id_tab_type,
10371                             x_failed_trips_list OUT NOCOPY WSH_UTIL_CORE.id_tab_type,
10372                             x_success_trips_list OUT NOCOPY WSH_UTIL_CORE.id_tab_type,
10374 
10375 IS
10376 
10377    CURSOR c_trip_info(c_trip_id NUMBER)
10378    IS
10379    SELECT wt.trip_id,
10380       wt.name,
10381       wt.planned_flag,
10382       wt.status_code,
10383       wt.carrier_id,
10384       wt.ship_method_code,
10385       wt.service_level,
10386       wt.mode_of_transport,
10387       wt.consolidation_allowed,
10388       wt.lane_id,
10389       wt.schedule_id,
10390       wt.load_tender_status
10391    FROM   wsh_trips wt
10392    WHERE  wt.trip_id = c_trip_id;
10393 
10394    CURSOR c_get_trip_direction(c_trip_id NUMBER)
10395    IS
10396    SELECT shipments_type_flag
10397    FROM   wsh_trips
10398    WHERE  trip_id = c_trip_id;
10399 
10400    l_trip_info trip_info_rec;
10401    i                NUMBER;
10402    l_fail_index     NUMBER := 0;
10403    l_success_index  NUMBER := 0;
10404    l_closed_index   NUMBER := 0;
10405    l_api_name       CONSTANT VARCHAR2(30)   := 'validate_trips';
10406    l_log_level      NUMBER := FTE_FREIGHT_PRICING_UTIL.G_LOG;
10407    l_trip_direction VARCHAR2(30);
10408    l_valid_trip     VARCHAR2(1) := 'Y';
10409 
10410 BEGIN
10411     FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
10412     FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,l_api_name);
10413 
10414     FOR i IN p_trip_id_list.FIRST..p_trip_id_list.LAST
10415     LOOP
10416         OPEN c_trip_info(p_trip_id_list(i));
10417         FETCH c_trip_info INTO l_trip_info;
10418         CLOSE c_trip_info;
10419 
10420        FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,' Trip Id is ='|| p_trip_id_list(i));
10421        FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'Trip status  is ='|| l_trip_info.status_code);
10422 
10423         -- In CASE OF closed trips, only allow re-rating of
10424         -- Inbound or Mixed trips. Do not allow rerating of
10425         -- closed outbound trips.
10426         IF l_trip_info.status_code = 'CL' THEN
10427             OPEN c_get_trip_direction(p_trip_id_list(i));
10428             FETCH c_get_trip_direction INTO l_trip_direction;
10429             CLOSE c_get_trip_direction;
10430             FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'l_trip_direction ='|| l_trip_direction);
10431             IF (l_trip_direction = 'O' ) OR (l_trip_direction IS NULL) THEN
10432                 l_valid_trip := 'N';
10433             ELSE
10434                 l_valid_trip := 'Y';
10435             END IF;
10436         END IF;
10437 
10438         IF l_valid_trip = 'Y' THEN
10439 
10440             IF l_trip_info.carrier_id is null OR l_trip_info.mode_of_transport is null
10441              OR l_trip_info.service_level is null  THEN
10442                  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));
10443                  l_fail_index := l_fail_index + 1;
10444                  x_failed_trips_list(l_fail_index) := p_trip_id_list(i);
10445              ELSE
10446                  FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'Trip has full ship method  !!! Trip Id ='|| p_trip_id_list(i));
10447                  l_success_index := l_success_index + 1;
10448                  x_success_trips_list(l_success_index) := p_trip_id_list(i);
10449              END IF;
10450         ELSE
10451              FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'Trip Direction/Status combination is not elegible for rarating ');
10452              l_closed_index := l_closed_index + 1;
10453              x_closed_trips_list(l_closed_index) := p_trip_id_list(i);
10454         END IF;
10455     END LOOP;
10456 
10457    FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'Failed Trips = '|| x_failed_trips_list.COUNT);
10458    FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'Success Trips = '|| x_success_trips_list.COUNT);
10459 
10460    FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,l_api_name);
10461 
10462 EXCEPTION
10463 
10464     WHEN OTHERS THEN
10465         FTE_FREIGHT_PRICING_UTIL.set_exception(l_api_name,FTE_FREIGHT_PRICING_UTIL.G_ERR,'validate_trips failed');
10466         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,l_api_name);
10467 
10468 END validate_trips;
10469 -- This API is called directly from DWB
10470 -- Modified the signature for 12i. p_delivery_leg_list can contain list of Delivery Ids or Delivery Legs
10471 -- Based on p_deliveries_list_type , it'll call different rating modules.
10472 -- In R12 behavior of rerating will change as in case of a delivery/dleg , with more
10473 -- delivery legs on the same trip we'll call rerating of the complete trip.
10474 -- So in case of rerating Trip level rating will be called always instead of individual delivery leg
10475 
10476 PROCEDURE rerate_shipment_online(
10477             p_api_version		IN  NUMBER DEFAULT 1.0,
10478             p_init_msg_list		IN  VARCHAR2 DEFAULT FND_API.G_FALSE,
10479             p_commit                IN  VARCHAR2 DEFAULT FND_API.G_FALSE,
10480             p_deliveries_list    IN  FTE_ID_TAB_TYPE,
10481             p_delivery_name_list	IN  FTE_NAME_TAB_TYPE,
10482             p_deliveries_list_type IN VARCHAR2 ,  -- This will have 'DEL' for Delivery IDs or 'DLEG' for Delivery Leg Ids.
10483             x_success_list		OUT NOCOPY  FTE_ID_TAB_TYPE,
10484             x_warning_list		OUT NOCOPY  FTE_ID_TAB_TYPE,
10485             x_fail_list		OUT NOCOPY  FTE_ID_TAB_TYPE,
10486             x_return_status         OUT NOCOPY  VARCHAR2,
10487             x_msg_count	        OUT NOCOPY  NUMBER,
10488             x_msg_data        OUT NOCOPY  VARCHAR2)
10489 IS
10490   l_dleg_list_empty     EXCEPTION;
10491   l_del_name_mismatch   EXCEPTION;
10492   l_delv_list_empty     EXCEPTION;
10496 
10493   l_trip_rating_failed  EXCEPTION;
10494   l_dleg_validation_failed EXCEPTION;
10495   l_delivery_validation_failed EXCEPTION;
10497   l_log_level               NUMBER := FTE_FREIGHT_PRICING_UTIL.G_LOG;
10498   l_api_version             CONSTANT NUMBER := 1.0;
10499   l_api_name                CONSTANT VARCHAR2(30)   := 'rerate_shipment_online';
10500   --l_return_status         VARCHAR2(1);
10501   l_msg_count               NUMBER := 0;
10502   l_msg_data                VARCHAR2(32767);
10503   l_fail_delivery_name_list VARCHAR2(32767);
10504   l_warn_delivery_name_list VARCHAR2(32767);
10505   i                         NUMBER;
10506   l_failed_leg_list         FTE_ID_TAB_TYPE;
10507   l_success_leg_list        FTE_ID_TAB_TYPE;
10508   l_warning_leg_list        FTE_ID_TAB_TYPE;
10509   l_dleg_list               FTE_ID_TAB_TYPE;
10510   --l_trip_ids              FTE_ID_TAB_TYPE;
10511   l_new_deliveries_list     FTE_ID_TAB_TYPE;
10512   l_new_dleg_list           FTE_ID_TAB_TYPE;
10513   l_delv_legs               DELIVERY_LEG_TAB_TYPE;
10514   l_index                   NUMBER := 0;
10515   l_trip_id                 NUMBER;
10516   l_failed_list             FTE_ID_TAB_TYPE;
10517   l_success_list            FTE_ID_TAB_TYPE;
10518   l_warning_list            FTE_ID_TAB_TYPE;
10519   l_trip_ids                DELIVERY_TRIP_TAB_TYPE;
10520   j                         NUMBER;
10521   l_all_trips               DELIVERY_TRIP_TAB_TYPE;
10522   j1                        NUMBER;
10523   l_service_failed          VARCHAR2(1) ;
10524   l_service_failed_delv_ids VARCHAR2(32767);
10525   l_closed_trips_delv_ids   VARCHAR2(32767);
10526   l_fail_val_dleg_list      FTE_ID_TAB_TYPE;
10527   l_action_params           FTE_TRIP_RATING_GRP.action_param_rec;
10528   l_trip_id_list            WSH_UTIL_CORE.id_tab_type;
10529   l_failed_trips            WSH_UTIL_CORE.id_tab_type;
10530   l_success_trips           WSH_UTIL_CORE.id_tab_type;
10531   l_temp_trips_tab          WSH_UTIL_CORE.id_tab_type;
10532   l_closed_trips            WSH_UTIL_CORE.id_tab_type;
10533   l_number_of_warnings      NUMBER;
10534   l_number_of_errors        NUMBER;
10535   l_return_status           VARCHAR2(32767);
10536   l_no_rates_delv_ids       VARCHAR2(32767);
10537   l_status                  VARCHAR2(30);
10538   l_message		    VARCHAR2(32767);
10539   l_delv_with_multlegs_names    VARCHAR2(32767);
10540   l_delv_srv_failed_names       VARCHAR2(32767);
10541   l_close_trdelv_name_list VARCHAR2(32767);
10542 
10543   CURSOR c_get_status_meaning
10544   IS
10545   SELECT meaning
10546   FROM   wsh_lookups
10547   WHERE  lookup_code = 'CL'
10548   AND    lookup_type = 'TRIP_STATUS';
10549 
10550 
10551 
10552 
10553 BEGIN
10554     SAVEPOINT  rerate_shipment_online;
10555 --
10556     -- Standard call to check for call compatibility.
10557     IF NOT FND_API.Compatible_API_Call
10558                          (
10559                            l_api_version,
10560                            p_api_version,
10561                            l_api_name,
10562                            G_PKG_NAME
10563                           )
10564     THEN
10565 	        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10566     END IF;
10567 
10568 
10569     -- Initialize message list if p_init_msg_list is set to TRUE.
10570   IF FND_API.to_Boolean( p_init_msg_list )
10571      THEN
10572         FND_MSG_PUB.initialize;
10573   END IF;
10574 
10575   x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
10576 
10577    FTE_FREIGHT_PRICING_UTIL.initialize_logging(x_return_status => l_return_status);
10578 
10579    IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
10580        IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
10581             x_return_status  :=  l_return_status;
10582             RETURN;
10583        END IF;
10584    ELSE
10585        FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'Initialize Logging successful ');
10586    END IF;
10587 
10588   FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
10589   FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,l_api_name);
10590 
10591   FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'p_api_version='||p_api_version);
10592   FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'p_init_msg_list='||p_init_msg_list);
10593   FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'p_commit='||p_commit);
10594   FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'p_deliveries_list_type='||p_deliveries_list_type);
10595   FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'p_deliveries_name_list.count='||p_delivery_name_list.count);
10596 
10597 
10598   IF p_deliveries_list.COUNT <= 0 THEN
10599     IF p_deliveries_list_type = 'DEL' THEN
10600         raise l_delv_list_empty;
10601     ELSE
10602         raise l_dleg_list_empty;
10603     END IF;
10604   END IF;
10605 
10606 
10607   IF p_deliveries_list.COUNT <> p_delivery_name_list.COUNT THEN
10608     raise l_del_name_mismatch;
10609   END IF;
10610 
10611   -- If deliveries are passed for re-rating.
10612   -- get all the delivery legs for those deliveries. Done for R12
10613 
10614     l_dleg_list := FTE_ID_TAB_TYPE();
10615     l_failed_list := FTE_ID_TAB_TYPE();
10616     l_success_list := FTE_ID_TAB_TYPE();
10617     l_warning_list := FTE_ID_TAB_TYPE();
10618 
10619 
10620     IF  p_deliveries_list_type = 'DEL' THEN
10621 
10622         validate_delv_for_rerating( p_deliveries_list => p_deliveries_list,
10623                                     x_deliveries_list => l_new_deliveries_list
10624                                   );
10625         get_delivery_legs( p_deliveries_list    => l_new_deliveries_list,
10626                            x_delivery_legs      => l_delv_legs,
10627                            x_return_status      => x_return_status);
10628 
10629         FOR l_index IN p_deliveries_list.FIRST..p_deliveries_list.LAST LOOP
10633                ELSE
10630            IF ( hasMultipleLegs(p_deliveries_list(l_index)) = 'Y') THEN
10631                IF l_delv_with_multlegs_names IS NOT NULL THEN
10632                     l_delv_with_multlegs_names := l_delv_with_multlegs_names ||' '|| p_delivery_name_list(l_index);
10634                     l_delv_with_multlegs_names := p_delivery_name_list(l_index);
10635                END IF;
10636                l_warning_list.EXTEND;
10637                l_warning_list(l_warning_list.LAST) := p_deliveries_list(l_index);
10638            END IF;
10639         END LOOP;
10640         FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'l_delv_legs.count=' || l_delv_legs.count);
10641         l_index := 0;
10642         FOR l_index IN l_delv_legs.FIRST..l_delv_legs.LAST LOOP
10643             FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'l_index=' || l_index);
10644             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);
10645             l_dleg_list.EXTEND;
10646             l_dleg_list(l_dleg_list.LAST) := l_delv_legs(l_index).delivery_leg_id;
10647         END LOOP;
10648     ELSE
10649         For l_index IN p_deliveries_list.FIRST..p_deliveries_list.LAST
10650         LOOP
10651            l_dleg_list.EXTEND;
10652            l_dleg_list(l_dleg_list.LAST) := p_deliveries_list(l_index);
10653         END LOOP;
10654     END IF;
10655 
10656 
10657     validate_delivery_legs(p_dlegs_list => l_dleg_list,
10658                            x_dleg_list  => l_new_dleg_list,
10659                            x_failed_dleg_list => l_fail_val_dleg_list,
10660                            x_return_status => x_return_status
10661                           );
10662 
10663     -- Get distinct trips from these delivery legs so that
10664     -- rating is not performed for same trips multiple times
10665     -- Add validation failed delivery legs also to failed list
10666     -- And raise Exception
10667     FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,' No rates failed list::= '||l_fail_val_dleg_list.COUNT);
10668 
10669     FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,' Total Delivery Legs list l_delv_legs::= '||l_delv_legs.COUNT);
10670 
10671     l_index := 0;
10672 
10673     IF  l_fail_val_dleg_list.COUNT > 0 THEN
10674         FOR j1 IN l_fail_val_dleg_list.FIRST..l_fail_val_dleg_list.LAST LOOP
10675             IF p_deliveries_list_type = 'DEL' THEN
10676                 FOR l_index IN l_delv_legs.FIRST..l_delv_legs.LAST LOOP
10677                     IF l_delv_legs(l_index).delivery_leg_id = l_fail_val_dleg_list(j1) THEN
10678                           FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'Failed Delivery Name :='||l_delv_legs(l_index).delivery_name);
10679                           IF l_fail_delivery_name_list IS NOT NULL THEN
10680                              l_fail_delivery_name_list := l_delv_legs(l_index).delivery_name;
10681                           ELSE
10682                              l_fail_delivery_name_list := l_fail_delivery_name_list ||' '||l_delv_legs(l_index).delivery_name;
10683                           END IF;
10684                     END IF;
10685                 END LOOP;
10686             ELSE
10687                 FOR l_index IN l_dleg_list.FIRST..l_dleg_list.LAST LOOP
10688                     IF l_dleg_list(l_index) = l_fail_val_dleg_list(j1) THEN
10689                           FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'Failed Delivery Name :='||p_delivery_name_list(l_index));
10690                           IF l_fail_delivery_name_list IS NOT NULL THEN
10691                              l_fail_delivery_name_list := p_delivery_name_list(l_index);
10692                           ELSE
10693                              l_fail_delivery_name_list := l_fail_delivery_name_list ||' '||p_delivery_name_list(l_index);
10694                           END IF;
10695                     END IF;
10696                 END LOOP;
10697             END IF;
10698         END LOOP;
10699         FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,' No rates failed list::= '||l_no_rates_delv_ids);
10700         FND_MESSAGE.SET_NAME('FTE','FTE_PRC_RERATE_NORATES');
10701         FND_MESSAGE.SET_TOKEN('DEL_NAMES',l_fail_delivery_name_list);
10702         --FND_MESSAGE.SET_TOKEN('LOGFILE',FTE_FREIGHT_PRICING_UTIL.get_log_file_name());
10703         FND_MSG_PUB.ADD;
10704         raise l_delivery_validation_failed;
10705     END IF;
10706 
10707 
10708 
10709     IF (l_new_dleg_list IS NOT NULL ) OR (l_new_dleg_list.COUNT > 0 )
10710     THEN
10711         get_distinct_trip_ids( p_dleg_list => l_new_dleg_list,
10712                                x_trip_ids => l_trip_ids ,
10713                                x_all_trips => l_all_trips,
10714                                x_return_status => x_return_status) ;
10715         l_index := 0;
10716         -- Call Trip rating for all the trips.
10717         j := 1;
10718         FOR l_index IN l_trip_ids.FIRST..l_trip_ids.LAST LOOP
10719             l_trip_id_list (j) := l_trip_ids(l_index).trip_id;
10720             j := j+1;
10721         END LOOP;
10722         validate_trips(p_trip_id_list => l_trip_id_list,
10723                        x_failed_trips_list => l_failed_trips,
10724                        x_success_trips_list => l_success_trips,
10725                        x_closed_trips_list => l_closed_trips);
10726         -- For trips which failed to validate for full ship_method
10727         -- Get the deliveries/Dlegs and add them to failed list.
10728         j := 0;
10729         IF l_failed_trips.COUNT > 0 THEN
10730             FOR j IN l_failed_trips.FIRST..l_failed_trips.LAST LOOP
10731                 FOR j1 IN l_failed_trips.FIRST..l_failed_trips.LAST LOOP
10732                     IF l_all_trips(j1).trip_id = l_failed_trips(j) THEN
10733                         --IF l_service_failed_delv_ids is null THEN
10734                         --    l_service_failed_delv_ids := l_all_trips(j1).delivery_id;
10735                         --ELSE
10739                         IF p_deliveries_list_type = 'DEL' THEN
10736                         --   l_service_failed_delv_ids := l_service_failed_delv_ids ||' '||l_all_trips(j1).delivery_id;
10737                         --END IF;
10738                         l_failed_list.EXTEND;
10740                             l_failed_list(l_failed_list.LAST) := l_all_trips(j1).delivery_id;
10741                         ELSE
10742                             l_failed_list(l_failed_list.LAST) := l_all_trips(j1).delivery_leg_id;
10743                         END IF;
10744                         IF l_delv_srv_failed_names IS NOT NULL THEN
10745                             l_delv_srv_failed_names := l_all_trips(j1).delivery_name;
10746                         ELSE
10747                             l_delv_srv_failed_names := l_delv_srv_failed_names ||' '||l_all_trips(j1).delivery_name;
10748                         END IF;
10749                     END IF;
10750                 END LOOP;
10751             END LOOP;
10752     END IF;
10753 
10754 
10755     -- Handle Closed trips information for Error Messages and Warning.
10756     -- Trips which failed to validate for status/direction
10757     -- Get the deliveries/Dlegs and add them to failed list.
10758     j := 0;
10759     j1 := 0;
10760     IF l_closed_trips.COUNT > 0 THEN
10761 
10762         OPEN c_get_status_meaning;
10763         FETCH c_get_status_meaning INTO l_status;
10764         CLOSE c_get_status_meaning;
10765         FOR j IN l_closed_trips.FIRST..l_closed_trips.LAST LOOP
10766             FOR j1 IN l_all_trips.FIRST..l_all_trips.LAST LOOP
10767                 IF l_all_trips(j1).trip_id = l_closed_trips(j) THEN
10768                     --IF l_closed_trips_delv_ids is null THEN
10769                     --    l_closed_trips_delv_ids := l_all_trips(j1).delivery_id;
10770                     --ELSE
10771                     --    l_closed_trips_delv_ids := l_closed_trips_delv_ids ||' '||l_all_trips(j1).delivery_id;
10772                     --END IF;
10773                     l_failed_list.EXTEND;
10774                     IF p_deliveries_list_type = 'DEL' THEN
10775                         l_failed_list(l_failed_list.LAST) := l_all_trips(j1).delivery_id;
10776                     ELSE
10777                         l_failed_list(l_failed_list.LAST) := l_all_trips(j1).delivery_leg_id;
10778                     END IF;
10779                     IF l_close_trdelv_name_list IS NOT NULL THEN
10780                        l_close_trdelv_name_list := l_all_trips(j1).delivery_name;
10781                     ELSE
10782                        l_close_trdelv_name_list := l_close_trdelv_name_list ||' '||l_all_trips(j1).delivery_name;
10783                     END IF;
10784                 END IF;
10785             END LOOP;
10786         END LOOP;
10787     END IF;
10788 
10789     FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'Failed Service Deliveries= '||l_service_failed_delv_ids);
10790 
10791 
10792 
10793 l_index := 0;
10794 
10795     IF l_success_trips.COUNT > 0 THEN
10796         FOR l_index IN l_success_trips.FIRST..l_success_trips.LAST LOOP
10797             l_action_params.caller :=  'FTE';
10798             l_action_params.event  := 'RE-RATING';
10799             l_action_params.action := 'RATE';
10800             l_temp_trips_tab(1)    := l_success_trips(l_index);
10801             l_action_params.trip_id_list := l_temp_trips_tab;
10802 
10803             FTE_TRIP_RATING_GRP.Rate_Trip
10804             (
10805                  p_api_version              => 1.0,
10806                  p_init_msg_list            => FND_API.G_FALSE,
10807                  p_action_params            => l_action_params,
10808                  p_commit                   => FND_API.G_FALSE,
10809                  p_init_prc_log             => 'N',
10810                  x_return_status            => l_return_status,
10811                  x_msg_count                => l_msg_count,
10812                  x_msg_data                 => l_msg_data
10813              );
10814             j1 := 0;
10815             IF l_return_status = WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
10816                FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'Trip Re-Rating successful for trip_id : '||l_trip_ids(l_index).trip_id);
10817                 FOR j1 IN l_all_trips.FIRST..l_all_trips.LAST LOOP
10818                   IF l_all_trips(j1).trip_id = l_trip_ids(l_index).trip_id THEN
10819                       l_success_list.EXTEND;
10820                       IF p_deliveries_list_type = 'DEL' THEN
10821                           l_success_list(l_success_list.LAST) := l_all_trips(j1).delivery_id;
10822                       ELSE
10823                           l_success_list(l_success_list.LAST) := l_all_trips(j1).delivery_leg_id;
10824                       END IF;
10825                   END IF;
10826                 END LOOP;
10827              ELSIF l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING THEN
10828                 FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'Trip Re-Rating with Warnings for trip_id : '||l_trip_ids(l_index).trip_id);
10829                 x_return_status := l_return_status;
10830 
10831                 FND_MSG_PUB.Count_And_Get
10832                 (
10833                    p_count  => l_msg_count,
10834                    p_data  =>  l_message,
10835                    p_encoded => FND_API.G_FALSE
10836                 );
10837                 FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'Warning : '||l_message);
10838                 FOR j1 IN l_all_trips.FIRST..l_all_trips.LAST LOOP
10839                   IF l_all_trips(j1).trip_id = l_trip_ids(l_index).trip_id THEN
10840                      IF l_warn_delivery_name_list is null THEN
10841                           l_warn_delivery_name_list := l_all_trips(j1).delivery_id;
10842                       ELSE
10843                           l_warn_delivery_name_list := l_warn_delivery_name_list ||' '||l_all_trips(j1).delivery_id;
10844                       END IF;
10845                       l_warning_list.EXTEND;
10849                         l_warning_list(l_warning_list.LAST) := l_all_trips(j1).delivery_leg_id;
10846                       IF p_deliveries_list_type = 'DEL' THEN
10847                         l_warning_list(l_warning_list.LAST) := l_all_trips(j1).delivery_id;
10848                       ELSE
10850                       END IF;
10851                   END IF;
10852                 END LOOP;
10853              ELSE
10854                 FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'trip id: '|| l_trip_ids(l_index).trip_id || ' rate_trip2 ');
10855                 x_return_status := l_return_status;
10856                 FND_MSG_PUB.Count_And_Get
10857                 (
10858                    p_count  => l_msg_count,
10859                    p_data  =>  l_message,
10860                    p_encoded => FND_API.G_FALSE
10861                 );
10862                 FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'Error : '||l_message);
10863                 FOR j1 IN l_all_trips.FIRST..l_all_trips.LAST LOOP
10864                   IF l_all_trips(j1).trip_id = l_trip_ids(l_index).trip_id THEN
10865                     IF l_fail_delivery_name_list is null THEN
10866                           l_fail_delivery_name_list := l_all_trips(j1).delivery_id;
10867                       ELSE
10868                           l_fail_delivery_name_list := l_fail_delivery_name_list ||' '||l_all_trips(j1).delivery_id;
10869                       END IF;
10870                       l_failed_list.EXTEND;
10871                       IF p_deliveries_list_type = 'DEL' THEN
10872                           l_failed_list(l_failed_list.LAST) := l_all_trips(j1).delivery_id;
10873                       ELSE
10874                           l_failed_list(l_failed_list.LAST) := l_all_trips(j1).delivery_leg_id;
10875                       END IF;
10876                   END IF;
10877                 END LOOP;
10878              END IF;
10879         END LOOP; -- End Loop for l_trip_ids. Trip rating.
10880     END IF;
10881 
10882     FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'l_trip_ids.COUNT=' || l_trip_ids.COUNT);
10883     FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'l_failed_list.COUNT='|| l_failed_list.COUNT);
10884     FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'l_warning_list.COUNT='|| l_warning_list.COUNT);
10885     FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'l_success_list.COUNT='|| l_success_list.COUNT);
10886 
10887     FND_MSG_PUB.Delete_Msg ( p_msg_index => null);
10888 
10889     IF l_success_list.COUNT > 0 THEN
10890         IF l_success_list.COUNT = l_dleg_list.COUNT THEN
10891         x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
10892         END IF;
10893     END IF;
10894 
10895     IF l_warning_list.COUNT > 0 THEN
10896         x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
10897         IF l_delv_with_multlegs_names IS NOT NULL THEN
10898             FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,' Delv with MulipleLegs::= '||l_delv_with_multlegs_names);
10899             FND_MESSAGE.SET_NAME('FTE','FTE_PRC_RERATE_MULTILEG_WARN');
10900             FND_MESSAGE.SET_TOKEN('DEL_NAMES',l_delv_with_multlegs_names);
10901             FND_MSG_PUB.ADD;
10902         END IF;
10903         FND_MESSAGE.SET_NAME('FTE','FTE_PRC_RERATE_SHIPMENT_WARNIN');
10904         FND_MESSAGE.SET_TOKEN('DEL_NAMES',l_warn_delivery_name_list);
10905         FND_MESSAGE.SET_TOKEN('LOGFILE',FTE_FREIGHT_PRICING_UTIL.get_log_file_name());
10906         FND_MSG_PUB.ADD;
10907     END IF;
10908 
10909 
10910      IF l_failed_list.COUNT >0 THEN
10911         IF l_delv_srv_failed_names IS NOT NULL THEN
10912             FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'Service failed list::= '||l_delv_srv_failed_names);
10913             FND_MESSAGE.SET_NAME('FTE','FTE_PRC_RERATE_SERVICE_FAILED');
10914             FND_MESSAGE.SET_TOKEN('DEL_NAMES',l_delv_srv_failed_names);
10915             --FND_MESSAGE.SET_TOKEN('LOGFILE',FTE_FREIGHT_PRICING_UTIL.get_log_file_name());
10916             FND_MSG_PUB.ADD;
10917         END IF;
10918         IF l_closed_trips_delv_ids IS NOT NULL THEN
10919             FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'Deliveries with Closed Trips list::= '||l_close_trdelv_name_list);
10920             FND_MESSAGE.SET_NAME('FTE','FTE_MLS_CANNOT_UPD_RATE');
10921             FND_MESSAGE.SET_TOKEN('DELIVERY_NAME',l_close_trdelv_name_list);
10922             FND_MESSAGE.SET_TOKEN('DELIVERY_STATUS',l_status);
10923             --FND_MESSAGE.SET_TOKEN('LOGFILE',FTE_FREIGHT_PRICING_UTIL.get_log_file_name());
10924             FND_MSG_PUB.ADD;
10925         END IF;
10926         IF l_fail_delivery_name_list IS NOT NULL THEN
10927             FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,' failed list::= '||l_fail_delivery_name_list);
10928             FND_MESSAGE.SET_NAME('FTE','FTE_PRC_RERATE_SHIPMENT_FAIL');
10929             FND_MESSAGE.SET_TOKEN('DEL_NAMES',l_fail_delivery_name_list);
10930             FND_MESSAGE.SET_TOKEN('LOGFILE',FTE_FREIGHT_PRICING_UTIL.get_log_file_name());
10931             FND_MSG_PUB.ADD;
10932         END IF;
10933         IF  l_success_list.COUNT > 0 OR l_warning_list.COUNT > 0 THEN
10934             x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
10935         ELSE
10936             x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
10937         END IF;
10938      END IF;
10939      FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'x_return_status='||x_return_status);
10940 
10941   x_success_list := l_success_list;
10942   x_warning_list := l_warning_list;
10943   x_fail_list :=    l_failed_list;
10944 ELSE
10945     RAISE l_dleg_validation_failed;
10946 END IF;
10947 
10948 
10949    IF FND_API.To_Boolean( p_commit ) THEN
10950 
10951       COMMIT WORK;
10952 
10953   END IF;
10954 
10955 	FND_MSG_PUB.Count_And_Get
10956 	  (
10957 	     p_count  => x_msg_count,
10958 	     p_data  =>  x_msg_data,
10959 	     p_encoded => FND_API.G_FALSE
10960 	  );
10961 
10962 
10963 
10967         FTE_FREIGHT_PRICING_UTIL.close_logs;
10964   FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'Msg Count'||x_msg_count||' Msg data:'||x_msg_data);
10965 
10966   FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,l_api_name);
10968 
10969 EXCEPTION
10970    WHEN  l_delivery_validation_failed THEN
10971     ROLLBACK TO rerate_shipment_online;
10972         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
10973     --FND_MSG_PUB.Count_And_Get
10974 	--  (
10975 	--     p_count  => x_msg_count,
10976 	--     p_data  =>  x_msg_data,
10977 	--     p_encoded => FND_API.G_FALSE
10978 	--  );
10979     --    FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'msg count is ='||x_msg_count);
10980     --    FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'msg data is ='||x_msg_data);
10981         FTE_FREIGHT_PRICING_UTIL.set_exit_exception(l_api_name,'l_delivery_validation_failed');
10982         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,l_api_name);
10983         FTE_FREIGHT_PRICING_UTIL.close_logs;
10984    WHEN l_dleg_list_empty THEN
10985 	ROLLBACK TO rerate_shipment_online;
10986         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
10987 	FND_MSG_PUB.Count_And_Get
10988 	  (
10989 	     p_count  => x_msg_count,
10990 	     p_data  =>  x_msg_data,
10991 	     p_encoded => FND_API.G_FALSE
10992 	  );
10993         FTE_FREIGHT_PRICING_UTIL.set_exit_exception(l_api_name,'l_dleg_list_empty');
10994         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,l_api_name);
10995         FTE_FREIGHT_PRICING_UTIL.close_logs;
10996 
10997     WHEN l_delv_list_empty THEN
10998 	ROLLBACK TO rerate_shipment_online;
10999         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11000 	FND_MSG_PUB.Count_And_Get
11001 	  (
11002 	     p_count  => x_msg_count,
11003 	     p_data  =>  x_msg_data,
11004 	     p_encoded => FND_API.G_FALSE
11005 	  );
11006         FTE_FREIGHT_PRICING_UTIL.set_exit_exception(l_api_name,'l_delv_list_empty');
11007         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,l_api_name);
11008         FTE_FREIGHT_PRICING_UTIL.close_logs;
11009 
11010    WHEN l_del_name_mismatch THEN
11011 	ROLLBACK TO rerate_shipment_online;
11012         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11013 	FND_MSG_PUB.Count_And_Get
11014 	  (
11015 	     p_count  => x_msg_count,
11016 	     p_data  =>  x_msg_data,
11017 	     p_encoded => FND_API.G_FALSE
11018 	  );
11019         FTE_FREIGHT_PRICING_UTIL.set_exit_exception(l_api_name,'l_del_name_mismatch');
11020         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,l_api_name);
11021         FTE_FREIGHT_PRICING_UTIL.close_logs;
11022    WHEN l_dleg_validation_failed THEN
11023    	ROLLBACK TO rerate_shipment_online;
11024         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11025         FND_MSG_PUB.Count_And_Get
11026 	  (
11027 	     p_count  => x_msg_count,
11028 	     p_data  =>  x_msg_data,
11029 	     p_encoded => FND_API.G_FALSE
11030 	  );
11031         FTE_FREIGHT_PRICING_UTIL.set_exception('shipment_reprice2',FTE_FREIGHT_PRICING_UTIL.G_ERR,'l_dleg_validation_failed');
11032         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_reprice2');
11033         FTE_FREIGHT_PRICING_UTIL.close_logs;
11034    WHEN l_trip_rating_failed THEN
11035         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11036         FND_MSG_PUB.Count_And_Get
11037 	  (
11038 	     p_count  => x_msg_count,
11039 	     p_data  =>  x_msg_data,
11040 	     p_encoded => FND_API.G_FALSE
11041 	  );
11042         FTE_FREIGHT_PRICING_UTIL.set_exception('shipment_reprice2',FTE_FREIGHT_PRICING_UTIL.G_ERR,'l_delivery_leg_rating_failed');
11043         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_reprice2');
11044         FTE_FREIGHT_PRICING_UTIL.close_logs;
11045    WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
11046         ROLLBACK TO rerate_shipment_online;
11047         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11048 	FND_MSG_PUB.Count_And_Get
11049 	  (
11050 	     p_count  => x_msg_count,
11051 	     p_data  =>  x_msg_data,
11052 	     p_encoded => FND_API.G_FALSE
11053 	  );
11054 
11055         FTE_FREIGHT_PRICING_UTIL.set_exit_exception(l_api_name,'FND_API.G_EXC_UNEXPECTED_ERROR');
11056         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,l_api_name);
11057         FTE_FREIGHT_PRICING_UTIL.close_logs;
11058    WHEN others THEN
11059 	ROLLBACK TO rerate_shipment_online;
11060         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
11061 	FND_MSG_PUB.Count_And_Get
11062 	  (
11063 	     p_count  => x_msg_count,
11064 	     p_data  =>  x_msg_data,
11065 	     p_encoded => FND_API.G_FALSE
11066 	  );
11067         FTE_FREIGHT_PRICING_UTIL.set_exit_exception(l_api_name,'g_others');
11068         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
11069         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,l_api_name);
11070         FTE_FREIGHT_PRICING_UTIL.close_logs;
11071 END rerate_shipment_online;
11072 
11073 
11074 PROCEDURE delete_fc_temp_pvt (
11075         p_request_id              IN     NUMBER,     -- Comparison Request ID to move to main
11076         p_initialized             IN     BOOLEAN DEFAULT TRUE,
11077         p_lane_id                 IN     NUMBER DEFAULT NULL,
11078         p_schedule_id             IN     NUMBER DEFAULT NULL,
11079         x_return_status           OUT NOCOPY     VARCHAR2)
11080 IS
11081 
11082   l_return_status                   VARCHAR2(1);
11083   l_log_level                       NUMBER := FTE_FREIGHT_PRICING_UTIL.G_DBG;
11084 
11085 BEGIN
11086 
11087    x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
11088    IF p_initialized THEN
11089       FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
11090       FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,'delete_fc_temp_pvt','start');
11091    END IF;
11092 
11093    DELETE
11094    FROM   fte_freight_costs_temp
11098    AND    nvl(schedule_id,-9999) <> nvl(p_schedule_id,-19999);
11095    WHERE  comparison_request_id = p_request_id
11096    --AND    nvl(lane_id,-9999) <> nvl(p_lane_id,-19999)
11097    AND    nvl(lane_id,-9999) <> nvl(decode(p_schedule_id,NULL,p_lane_id,NULL),-19999)
11099 
11100    IF p_initialized THEN
11101       FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'delete_fc_temp_pvt');
11102    END IF;
11103 
11104 EXCEPTION
11105    WHEN others THEN
11106       x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
11107       IF p_initialized THEN
11108         FTE_FREIGHT_PRICING_UTIL.set_exception('delete_fc_temp_pvt',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
11109         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
11110         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'delete_fc_temp_pvt');
11111       END IF;
11112 END delete_fc_temp_pvt;
11113 
11114 -- 	This API is called by Rate_Delivery of LCSS project
11115 -- 	To move freight costs from pl/sql table to wsh_freight_costs
11116 -- 	for non-TL rates, dleg_id is not populated in freight_cost_temp
11117 
11118 PROCEDURE Move_fc_temp_to_main (
11119         p_delivery_leg_id          IN     NUMBER,
11120         p_freight_cost_temp_price  IN     Freight_Cost_Temp_Tab_Type,
11121         p_freight_cost_temp_charge IN     Freight_Cost_Temp_Tab_Type,
11122         x_return_status           OUT NOCOPY     VARCHAR2)
11123 IS
11124   l_log_level             NUMBER := FTE_FREIGHT_PRICING_UTIL.G_LOG;
11125   l_api_name              CONSTANT VARCHAR2(30)   := 'MOVE_FC_TEMP_TO_MAIN';
11126   l_return_status         VARCHAR2(1);
11127   l_msg_count             NUMBER := 0;
11128   l_msg_data              VARCHAR2(240);
11129 
11130   l_empty_main_row           WSH_FREIGHT_COSTS_PVT.Freight_Cost_Rec_Type;
11131   l_freight_cost_main_row           WSH_FREIGHT_COSTS_PVT.Freight_Cost_Rec_Type;
11132   l_freight_cost_main_charge        WSH_FREIGHT_COSTS_PVT.Freight_Cost_Rec_Type;
11133   l_price_fc_ids                    WSH_UTIL_CORE.id_tab_type;
11134   l_rowid                           VARCHAR2(30);
11135   l_update_rowid                    VARCHAR2(30);
11136   l_freight_cost_id                 NUMBER;
11137 
11138 BEGIN
11139   x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
11140 
11141   FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
11142   FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,l_api_name);
11143 
11144   FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'p_delivery_leg_id='||p_delivery_leg_id);
11145 
11146   FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'p_freight_cost_temp_price.COUNT=' || p_freight_cost_temp_price.COUNT );
11147 
11148    IF (p_delivery_leg_id IS NULL) THEN
11149       raise FTE_FREIGHT_PRICING_UTIL.g_no_lanesched_seg;
11150    END IF;
11151 
11152   --IF p_freight_cost_temp_price.COUNT = 0 THEN
11153   --    raise FTE_FREIGHT_PRICING_UTIL.g_no_temp_fc_to_move;
11154   --END IF;
11155 
11156    SAVEPOINT before_fc_creation;
11157 
11158   FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'looping through p_freight_cost_temp_price...');
11159   IF p_freight_cost_temp_price.COUNT > 0 THEN
11160 
11161   FOR i in p_freight_cost_temp_price.FIRST..p_freight_cost_temp_price.LAST LOOP
11162     FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'i='||i);
11163 
11164     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);
11165 
11166     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);
11167 
11168     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);
11169 
11170       --ensures no spill overs from earlier rows
11171       l_freight_cost_main_row:=l_empty_main_row;
11172 
11173       l_freight_cost_main_row.FREIGHT_COST_TYPE_ID := p_freight_cost_temp_price(i).FREIGHT_COST_TYPE_ID;
11174       l_freight_cost_main_row.UNIT_AMOUNT          := p_freight_cost_temp_price(i).UNIT_AMOUNT;
11175       l_freight_cost_main_row.UOM                  := p_freight_cost_temp_price(i).UOM;
11176       l_freight_cost_main_row.QUANTITY             := p_freight_cost_temp_price(i).QUANTITY;
11177       l_freight_cost_main_row.TOTAL_AMOUNT         := p_freight_cost_temp_price(i).TOTAL_AMOUNT;
11178       l_freight_cost_main_row.CURRENCY_CODE        := p_freight_cost_temp_price(i).CURRENCY_CODE;
11179       l_freight_cost_main_row.DELIVERY_ID          := p_freight_cost_temp_price(i).DELIVERY_ID;
11180 
11181       IF (p_freight_cost_temp_price(i).DELIVERY_LEG_ID IS NULL)
11182       THEN
11183 
11184 	l_freight_cost_main_row.DELIVERY_LEG_ID      := p_delivery_leg_id;
11185       ELSE
11186 	l_freight_cost_main_row.DELIVERY_LEG_ID      := p_freight_cost_temp_price(i).DELIVERY_LEG_ID;
11187       END IF;
11188 
11189       l_freight_cost_main_row.DELIVERY_DETAIL_ID   := p_freight_cost_temp_price(i).DELIVERY_DETAIL_ID;
11190       --l_freight_cost_main_row.FREIGHT_CODE         := p_freight_cost_temp_price(i).FREIGHT_CODE;
11191       l_freight_cost_main_row.LINE_TYPE_CODE       := p_freight_cost_temp_price(i).LINE_TYPE_CODE;
11192       l_freight_cost_main_row.CHARGE_UNIT_VALUE    := p_freight_cost_temp_price(i).CHARGE_UNIT_VALUE;
11193       l_freight_cost_main_row.CHARGE_SOURCE_CODE   := p_freight_cost_temp_price(i).CHARGE_SOURCE_CODE;
11194       --l_freight_cost_main_row.ESTIMATED_FLAG        := p_freight_cost_temp_price(i).ESTIMATED_FLAG;
11195       l_freight_cost_main_row.ESTIMATED_FLAG       := 'Y';
11196       l_freight_cost_main_row.LAST_UPDATE_DATE     := SYSDATE;
11197       l_freight_cost_main_row.LAST_UPDATED_BY      := FND_GLOBAL.USER_ID;
11198       l_freight_cost_main_row.LAST_UPDATE_LOGIN    := FND_GLOBAL.LOGIN_ID;
11199       l_freight_cost_main_row.PROGRAM_APPLICATION_ID := FND_GLOBAL.PROG_APPL_ID;
11200       l_freight_cost_main_row.BILLABLE_UOM          := p_freight_cost_temp_price(i).BILLABLE_UOM;
11204       --l_freight_cost_main_row.PROGRAM_UPDATE_DATE  := SYSDATE;
11201       l_freight_cost_main_row.BILLABLE_BASIS          := p_freight_cost_temp_price(i).BILLABLE_BASIS;
11202       l_freight_cost_main_row.BILLABLE_QUANTITY          := p_freight_cost_temp_price(i).BILLABLE_QUANTITY;
11203       --l_freight_cost_main_row.PROGRAM_ID           := FND_GLOBAL.CONC_PROGRAM_ID;
11205 
11206           -- pack J Enhancement for FPA
11207       l_freight_cost_main_row.COMMODITY_CATEGORY_ID
11208                := p_freight_cost_temp_price(i).COMMODITY_CATEGORY_ID;
11209     FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,
11210        '(FPA)l_freight_cost_main_row.COMMODITY_CATEGORY_ID='||l_freight_cost_main_row.COMMODITY_CATEGORY_ID);
11211 
11212     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);
11213     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);
11214     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);
11215 
11216       IF l_freight_cost_main_row.line_type_code = 'SUMMARY'
11217              AND l_freight_cost_main_row.delivery_detail_id IS NULL
11218 	     AND l_freight_cost_main_row.delivery_leg_id is not null THEN
11219 
11220          -- To update the delivery leg summary row
11221          -- Get the delivery leg id as input and get the freight cost id for that
11222          -- The lane level summary amount becomes the delivery leg level summary amount
11223 
11224          l_freight_cost_main_row.FREIGHT_COST_ID      := get_fc_id_from_dleg(l_freight_cost_main_row.delivery_leg_id);
11225          l_freight_cost_main_row.DELIVERY_LEG_ID      := l_freight_cost_main_row.delivery_leg_id;
11226 
11227          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);
11228 
11229          FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'Calling WSH_FREIGHT_COSTS_PVT.Update_Freight_Cost...');
11230          WSH_FREIGHT_COSTS_PVT.Update_Freight_Cost(
11231           p_rowid                  =>  l_update_rowid,
11232           p_freight_cost_info      =>  l_freight_cost_main_row,
11233           x_return_status          =>  l_return_status);
11234 
11235          IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
11236             IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
11237                 ROLLBACK to before_fc_creation;
11238                 raise FTE_FREIGHT_PRICING_UTIL.g_update_freight_cost_failed;
11239             END IF;
11240          END IF;
11241          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'After Update_Freight_Cost ');
11242 
11243       ELSE
11244 
11245          l_freight_cost_main_row.CREATION_DATE        := SYSDATE;
11246          l_freight_cost_main_row.CREATED_BY           := FND_GLOBAL.USER_ID;
11247 
11248          FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'Calling WSH_FREIGHT_COSTS_PVT.Create_Freight_Cost...');
11249          WSH_FREIGHT_COSTS_PVT.Create_Freight_Cost(
11250           p_freight_cost_info      =>  l_freight_cost_main_row,
11251           x_rowid                  =>  l_rowid,
11252           x_freight_cost_id        =>  l_freight_cost_id,
11253           x_return_status          =>  l_return_status);
11254 
11255          IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
11256             IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
11257                 ROLLBACK to before_fc_creation;
11258                 FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'Base price');
11259                 raise FTE_FREIGHT_PRICING_UTIL.g_create_freight_cost_failed;
11260             END IF;
11261          END IF;
11262          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'After Create_Freight_Cost id : '||l_freight_cost_id);
11263 
11264       END IF;
11265 
11266    END LOOP; -- p_freight_cost_temp_price loop
11267   END IF;
11268 
11269   FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'looping through p_freight_cost_temp_charge...');
11270   IF p_freight_cost_temp_charge.COUNT > 0 THEN
11271   FOR i in p_freight_cost_temp_charge.FIRST..p_freight_cost_temp_charge.LAST LOOP
11272     FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'i='||i);
11273 
11274       --ensures no spill overs from earlier rows
11275       l_freight_cost_main_charge:=l_empty_main_row;
11276 
11277       l_freight_cost_main_charge.FREIGHT_COST_TYPE_ID := p_freight_cost_temp_charge(i).FREIGHT_COST_TYPE_ID;
11278       l_freight_cost_main_charge.UNIT_AMOUNT          := p_freight_cost_temp_charge(i).UNIT_AMOUNT;
11279       l_freight_cost_main_charge.UOM                  := p_freight_cost_temp_charge(i).UOM;
11280       l_freight_cost_main_charge.QUANTITY             := p_freight_cost_temp_charge(i).QUANTITY;
11281       l_freight_cost_main_charge.TOTAL_AMOUNT         := p_freight_cost_temp_charge(i).TOTAL_AMOUNT;
11282       l_freight_cost_main_charge.CURRENCY_CODE        := p_freight_cost_temp_charge(i).CURRENCY_CODE;
11283       l_freight_cost_main_charge.DELIVERY_ID          := p_freight_cost_temp_charge(i).DELIVERY_ID;
11284 
11285       IF (p_freight_cost_temp_charge(i).DELIVERY_LEG_ID IS NULL)
11286       THEN
11287 
11288 	      l_freight_cost_main_charge.DELIVERY_LEG_ID      := p_delivery_leg_id;
11289       ELSE
11290 	      l_freight_cost_main_charge.DELIVERY_LEG_ID      := p_freight_cost_temp_charge(i).DELIVERY_LEG_ID;
11291       END IF;
11292       l_freight_cost_main_charge.DELIVERY_DETAIL_ID   := p_freight_cost_temp_charge(i).DELIVERY_DETAIL_ID;
11293       --l_freight_cost_main_charge.FREIGHT_CODE         := p_freight_cost_temp_charge(i).FREIGHT_CODE;
11294       l_freight_cost_main_charge.LINE_TYPE_CODE       := p_freight_cost_temp_charge(i).LINE_TYPE_CODE;
11295       l_freight_cost_main_charge.CHARGE_UNIT_VALUE    := p_freight_cost_temp_charge(i).CHARGE_UNIT_VALUE;
11296       l_freight_cost_main_charge.CHARGE_SOURCE_CODE   := p_freight_cost_temp_charge(i).CHARGE_SOURCE_CODE;
11300       l_freight_cost_main_charge.CREATED_BY           := FND_GLOBAL.USER_ID;
11297       --l_freight_cost_main_charge.ESTIMATED_FLAG        := p_freight_cost_temp_charge(i).ESTIMATED_FLAG;
11298       l_freight_cost_main_charge.ESTIMATED_FLAG       := 'Y';
11299       l_freight_cost_main_charge.CREATION_DATE        := SYSDATE;
11301       l_freight_cost_main_charge.LAST_UPDATE_DATE     := SYSDATE;
11302       l_freight_cost_main_charge.LAST_UPDATED_BY      := FND_GLOBAL.USER_ID;
11303       l_freight_cost_main_charge.LAST_UPDATE_LOGIN    := FND_GLOBAL.LOGIN_ID;
11304       l_freight_cost_main_charge.PROGRAM_APPLICATION_ID := FND_GLOBAL.PROG_APPL_ID;
11305       l_freight_cost_main_row.BILLABLE_UOM            := p_freight_cost_temp_charge(i).BILLABLE_UOM;
11306       l_freight_cost_main_row.BILLABLE_BASIS          := p_freight_cost_temp_charge(i).BILLABLE_BASIS;
11307       l_freight_cost_main_row.BILLABLE_QUANTITY       := p_freight_cost_temp_charge(i).BILLABLE_QUANTITY;
11308 
11309       --l_freight_cost_main_charge.PROGRAM_ID           := FND_GLOBAL.CONC_PROGRAM_ID;
11310       --l_freight_cost_main_charge.PROGRAM_UPDATE_DATE  := SYSDATE;
11311 
11312           -- pack J Enhancement for FPA
11313       l_freight_cost_main_charge.COMMODITY_CATEGORY_ID
11314                := p_freight_cost_temp_charge(i).COMMODITY_CATEGORY_ID;
11315       FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,
11316        '(FPA)l_freight_cost_main_charge.COMMODITY_CATEGORY_ID='||l_freight_cost_main_charge.COMMODITY_CATEGORY_ID);
11317 
11318          WSH_FREIGHT_COSTS_PVT.Create_Freight_Cost(
11319           p_freight_cost_info      =>  l_freight_cost_main_charge,
11320           x_rowid                  =>  l_rowid,
11321           x_freight_cost_id        =>  l_freight_cost_id,
11322           x_return_status          =>  l_return_status);
11323 
11324          IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
11325             IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
11326                 ROLLBACK to before_fc_creation;
11327                 FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'Charge');
11328                 raise FTE_FREIGHT_PRICING_UTIL.g_create_freight_cost_failed;
11329             END IF;
11330          END IF;
11331          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'After Create_Freight_Cost id : '||l_freight_cost_id);
11332 
11333    END LOOP; -- p_freight_cost_temp_charge loop
11334   END IF;
11335 
11336    FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,l_api_name);
11337 
11338 EXCEPTION
11339    WHEN FTE_FREIGHT_PRICING_UTIL.g_no_temp_fc_to_move THEN
11340         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11341         FTE_FREIGHT_PRICING_UTIL.set_exception(l_api_name,FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_no_temp_fc_to_move');
11342         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,l_api_name);
11343    WHEN FTE_FREIGHT_PRICING_UTIL.g_create_freight_cost_failed THEN
11344         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11345         FTE_FREIGHT_PRICING_UTIL.set_exception(l_api_name,FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_create_freight_cost_failed');
11346         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,l_api_name);
11347    WHEN FTE_FREIGHT_PRICING_UTIL.g_update_freight_cost_failed THEN
11348         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11349         FTE_FREIGHT_PRICING_UTIL.set_exception(l_api_name,FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_update_freight_cost_failed');
11350         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,l_api_name);
11351    WHEN others THEN
11352         ROLLBACK to before_fc_creation;
11353         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
11354         FTE_FREIGHT_PRICING_UTIL.set_exception(l_api_name,FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
11355         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
11356         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,l_api_name);
11357 END;
11358 
11359 -- 	This API is called by Rate_Delivery of LCSS project
11360 -- 	To move freight costs from pl/sql table to wsh_freight_costs
11361 -- 	for TL rates, tl cost allocation will populate dleg_id in freight_cost_temp
11362 
11363 PROCEDURE Move_fc_temp_to_main (
11364         p_freight_cost_temp  IN     Freight_Cost_Temp_Tab_Type,
11365         x_return_status           OUT NOCOPY     VARCHAR2)
11366 IS
11367   l_log_level             NUMBER := FTE_FREIGHT_PRICING_UTIL.G_LOG;
11368   l_api_name              CONSTANT VARCHAR2(30)   := 'MOVE_FC_TEMP_TO_MAIN';
11369   l_return_status         VARCHAR2(1);
11370   l_msg_count             NUMBER := 0;
11371   l_msg_data              VARCHAR2(240);
11372   l_empty_main_row WSH_FREIGHT_COSTS_PVT.Freight_Cost_Rec_Type;
11373   l_freight_cost_main_row           WSH_FREIGHT_COSTS_PVT.Freight_Cost_Rec_Type;
11374   l_rowid                           VARCHAR2(30);
11375   l_update_rowid                    VARCHAR2(30);
11376   l_freight_cost_id                 NUMBER;
11377 
11378 BEGIN
11379   x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
11380 
11381   FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
11382   FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,l_api_name);
11383 
11384 --  IF p_freight_cost_temp.COUNT = 0 THEN
11385 --      raise FTE_FREIGHT_PRICING_UTIL.g_no_temp_fc_to_move;
11386 --  END IF;
11387 
11388    SAVEPOINT before_fc_creation;
11389 
11390   FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'looping through p_freight_cost_temp...');
11391   IF p_freight_cost_temp.COUNT > 0 THEN
11392   FOR i in p_freight_cost_temp.FIRST..p_freight_cost_temp.LAST LOOP
11393     FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'i='||i);
11394 
11395       --ensures no spill overs from earlier rows
11396       l_freight_cost_main_row:=l_empty_main_row;
11397 
11398 
11399       l_freight_cost_main_row.FREIGHT_COST_TYPE_ID := p_freight_cost_temp(i).FREIGHT_COST_TYPE_ID;
11400       l_freight_cost_main_row.UNIT_AMOUNT          := p_freight_cost_temp(i).UNIT_AMOUNT;
11401       l_freight_cost_main_row.UOM                  := p_freight_cost_temp(i).UOM;
11405       l_freight_cost_main_row.TRIP_ID          	   := p_freight_cost_temp(i).TRIP_ID;
11402       l_freight_cost_main_row.QUANTITY             := p_freight_cost_temp(i).QUANTITY;
11403       l_freight_cost_main_row.TOTAL_AMOUNT         := p_freight_cost_temp(i).TOTAL_AMOUNT;
11404       l_freight_cost_main_row.CURRENCY_CODE        := p_freight_cost_temp(i).CURRENCY_CODE;
11406       l_freight_cost_main_row.STOP_ID              := p_freight_cost_temp(i).STOP_ID;
11407       l_freight_cost_main_row.DELIVERY_ID          := p_freight_cost_temp(i).DELIVERY_ID;
11408       l_freight_cost_main_row.DELIVERY_LEG_ID      := p_freight_cost_temp(i).DELIVERY_LEG_ID;
11409       l_freight_cost_main_row.DELIVERY_DETAIL_ID   := p_freight_cost_temp(i).DELIVERY_DETAIL_ID;
11410       --l_freight_cost_main_row.FREIGHT_CODE         := p_freight_cost_temp(i).FREIGHT_CODE;
11411       l_freight_cost_main_row.LINE_TYPE_CODE       := p_freight_cost_temp(i).LINE_TYPE_CODE;
11412       l_freight_cost_main_row.CHARGE_UNIT_VALUE    := p_freight_cost_temp(i).CHARGE_UNIT_VALUE;
11413       l_freight_cost_main_row.CHARGE_SOURCE_CODE   := p_freight_cost_temp(i).CHARGE_SOURCE_CODE;
11414       --l_freight_cost_main_row.ESTIMATED_FLAG        := p_freight_cost_temp(i).ESTIMATED_FLAG;
11415       l_freight_cost_main_row.ESTIMATED_FLAG       := 'Y';
11416       l_freight_cost_main_row.LAST_UPDATE_DATE     := SYSDATE;
11417       l_freight_cost_main_row.LAST_UPDATED_BY      := FND_GLOBAL.USER_ID;
11418       l_freight_cost_main_row.LAST_UPDATE_LOGIN    := FND_GLOBAL.LOGIN_ID;
11419       l_freight_cost_main_row.PROGRAM_APPLICATION_ID := FND_GLOBAL.PROG_APPL_ID;
11420       --l_freight_cost_main_row.PROGRAM_ID           := FND_GLOBAL.CONC_PROGRAM_ID;
11421       --l_freight_cost_main_row.PROGRAM_UPDATE_DATE  := SYSDATE;
11422 
11423           -- pack J Enhancement for FPA
11424       l_freight_cost_main_row.COMMODITY_CATEGORY_ID
11425                := p_freight_cost_temp(i).COMMODITY_CATEGORY_ID;
11426     FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,
11427        '(FPA)l_freight_cost_main_row.COMMODITY_CATEGORY_ID='||l_freight_cost_main_row.COMMODITY_CATEGORY_ID);
11428 
11429     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);
11430     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);
11431     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);
11432 
11433       IF l_freight_cost_main_row.line_type_code = 'SUMMARY'
11434              AND l_freight_cost_main_row.delivery_detail_id IS NULL
11435 	     AND l_freight_cost_main_row.delivery_leg_id is not null THEN
11436 
11437          -- To update the delivery leg summary row
11438          -- Get the delivery leg id as input and get the freight cost id for that
11439          -- The lane level summary amount becomes the delivery leg level summary amount
11440 
11441          l_freight_cost_main_row.FREIGHT_COST_ID      := get_fc_id_from_dleg(l_freight_cost_main_row.delivery_leg_id);
11442 
11443          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);
11444 
11445          FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'Calling WSH_FREIGHT_COSTS_PVT.Update_Freight_Cost...');
11446          WSH_FREIGHT_COSTS_PVT.Update_Freight_Cost(
11447           p_rowid                  =>  l_update_rowid,
11448           p_freight_cost_info      =>  l_freight_cost_main_row,
11449           x_return_status          =>  l_return_status);
11450 
11451          IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
11452             IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
11453                 ROLLBACK to before_fc_creation;
11454                 raise FTE_FREIGHT_PRICING_UTIL.g_update_freight_cost_failed;
11455             END IF;
11456          END IF;
11457          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'After Update_Freight_Cost ');
11458 
11459       ELSE
11460 
11461          l_freight_cost_main_row.CREATION_DATE        := SYSDATE;
11462          l_freight_cost_main_row.CREATED_BY           := FND_GLOBAL.USER_ID;
11463 
11464          FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,'Calling WSH_FREIGHT_COSTS_PVT.Create_Freight_Cost...');
11465          WSH_FREIGHT_COSTS_PVT.Create_Freight_Cost(
11466           p_freight_cost_info      =>  l_freight_cost_main_row,
11467           x_rowid                  =>  l_rowid,
11468           x_freight_cost_id        =>  l_freight_cost_id,
11469           x_return_status          =>  l_return_status);
11470 
11471          IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
11472             IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
11473                 ROLLBACK to before_fc_creation;
11474                 FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'Base price');
11475                 raise FTE_FREIGHT_PRICING_UTIL.g_create_freight_cost_failed;
11476             END IF;
11477          END IF;
11478          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'After Create_Freight_Cost id : '||l_freight_cost_id);
11479 
11480       END IF;
11481 
11482    END LOOP; -- p_freight_cost_temp_price loop
11483   END IF;
11484 
11485    FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,l_api_name);
11486 
11487 EXCEPTION
11488    WHEN FTE_FREIGHT_PRICING_UTIL.g_no_temp_fc_to_move THEN
11489         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11490         FTE_FREIGHT_PRICING_UTIL.set_exception(l_api_name,FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_no_temp_fc_to_move');
11491         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,l_api_name);
11492    WHEN FTE_FREIGHT_PRICING_UTIL.g_create_freight_cost_failed THEN
11493         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11494         FTE_FREIGHT_PRICING_UTIL.set_exception(l_api_name,FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_create_freight_cost_failed');
11495         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,l_api_name);
11496    WHEN FTE_FREIGHT_PRICING_UTIL.g_update_freight_cost_failed THEN
11500    WHEN others THEN
11497         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11498         FTE_FREIGHT_PRICING_UTIL.set_exception(l_api_name,FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_update_freight_cost_failed');
11499         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,l_api_name);
11501         ROLLBACK to before_fc_creation;
11502         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
11503         FTE_FREIGHT_PRICING_UTIL.set_exception(l_api_name,FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
11504         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
11505         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,l_api_name);
11506 END;
11507 
11508 -- todo take care of applied_to_charge_id
11509 PROCEDURE Move_fc_temp_to_main (
11510         p_init_msg_list           IN     VARCHAR2 DEFAULT fnd_api.g_true,
11511 	p_init_prc_log	          IN     VARCHAR2 DEFAULT 'Y',
11512         p_request_id              IN     NUMBER,     -- Comparison Request ID to move to main
11513         p_delivery_leg_id         IN     NUMBER,
11514         p_lane_id                 IN     NUMBER DEFAULT NULL,
11515         p_schedule_id             IN     NUMBER DEFAULT NULL,
11516         p_service_type_code       IN     VARCHAR2 DEFAULT NULL,
11517         x_return_status           OUT NOCOPY     VARCHAR2)
11518 IS
11519 
11520   -- bug : 2763791 : added p_service_type_code
11521 
11522   CURSOR c_move_fc_temp IS
11523   SELECT *
11524   FROM   FTE_FREIGHT_COSTS_TEMP
11525   WHERE  comparison_request_id = p_request_id
11526   --AND    nvl(lane_id,-9999) = nvl(p_lane_id,-9999)
11527   AND    nvl(lane_id,-9999) = nvl(decode(p_schedule_id,NULL,p_lane_id,NULL),-9999)
11528   AND    nvl(schedule_id,-9999) = nvl(p_schedule_id,-9999)
11529   AND    moved_to_main_flag = 'N'
11530   AND    nvl(service_type_code,'X') = nvl(p_service_type_code,'X')
11531   AND    line_type_code NOT IN ('CHARGE','DISCOUNT');
11532 
11533   CURSOR c_move_fc_temp_charge IS
11534   SELECT *
11535   FROM   FTE_FREIGHT_COSTS_TEMP
11536   WHERE  comparison_request_id = p_request_id
11537   --AND    nvl(lane_id,-9999) = nvl(p_lane_id,-9999)
11538   AND    nvl(lane_id,-9999) = nvl(decode(p_schedule_id,NULL,p_lane_id,NULL),-9999)
11539   AND    nvl(schedule_id,-9999) = nvl(p_schedule_id,-9999)
11540   AND    moved_to_main_flag = 'N'
11541   AND    nvl(service_type_code,'X') = nvl(p_service_type_code,'X')
11542   AND    line_type_code IN ('CHARGE','DISCOUNT');
11543 
11544 
11545 CURSOR c_get_lane_mode(c_lane_id IN NUMBER)
11546 IS
11547 SELECT  mode_of_transportation_code
11548 FROM    fte_lanes
11549 WHERE   lane_id = c_lane_id;
11550 
11551 
11552 CURSOR c_get_sched_mode(c_schedule_id IN NUMBER)
11553 IS
11554 SELECT  mode_of_transportation_code
11555 FROM    fte_lanes l, fte_schedules s
11556 WHERE   l.lane_id = s.lane_id
11557 AND     s.schedules_id = c_schedule_id;
11558 
11559   l_mode	VARCHAR2(30);
11560   l_freight_cost_temp_row           c_move_fc_temp%ROWTYPE;
11561   l_empty_main_row WSH_FREIGHT_COSTS_PVT.Freight_Cost_Rec_Type;
11562   l_freight_cost_main_row           WSH_FREIGHT_COSTS_PVT.Freight_Cost_Rec_Type;
11563   l_freight_cost_temp_charge        c_move_fc_temp_charge%ROWTYPE;
11564   l_freight_cost_main_charge        WSH_FREIGHT_COSTS_PVT.Freight_Cost_Rec_Type;
11565   l_price_fc_ids                    WSH_UTIL_CORE.id_tab_type;
11566   l_rowid                           VARCHAR2(30);
11567   l_update_rowid                    VARCHAR2(30);
11568   l_freight_cost_id                 NUMBER;
11569   l_return_status                   VARCHAR2(1);
11570 
11571     l_log_level     NUMBER := FTE_FREIGHT_PRICING_UTIL.G_DBG;
11572 
11573 BEGIN
11574 
11575    x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
11576    IF (p_init_prc_log = 'Y') THEN
11577      FTE_FREIGHT_PRICING_UTIL.initialize_logging( p_init_msg_list  => p_init_msg_list,
11578                                                 x_return_status => l_return_status );
11579    END IF;
11580 
11581    IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
11582        IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
11583             x_return_status  :=  l_return_status;
11584             RETURN;
11585        END IF;
11586    ELSE
11587        FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Initialize Logging successful ');
11588    END IF;
11589    FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
11590    FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,'Move_fc_temp_to_main','start');
11591 
11592    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
11593 ||' Service type - '||p_service_type_code );
11594 
11595    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
11596       raise FTE_FREIGHT_PRICING_UTIL.g_no_lanesched_seg;
11597    END IF;
11598 
11599    SAVEPOINT before_fc_creation;
11600 
11601    l_mode:=NULL;
11602    IF (p_schedule_id IS NOT NULL)
11603    THEN
11604    	OPEN c_get_sched_mode(p_schedule_id);
11605    	FETCH c_get_sched_mode INTO l_mode;
11606    	CLOSE c_get_sched_mode;
11607    ELSE
11608 
11609    	OPEN c_get_lane_mode(p_lane_id);
11610    	FETCH c_get_lane_mode INTO l_mode;
11611    	CLOSE c_get_lane_mode;
11612 
11613    END IF;
11614 
11615 
11616    IF ((l_mode IS NOT NULL) AND (l_mode='TRUCK'))
11617    THEN
11618 
11619    	FTE_TL_RATING.Move_Dlv_Records_To_Main(
11620 		p_dleg_id=>p_delivery_leg_id,
11621 		p_lane_id=>p_lane_id,
11622 		p_schedule_id=>p_schedule_id,
11623 		p_comparison_request_id=>p_request_id,
11624 		x_return_status=>l_return_status);
11625 
11626 	 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
11627 	    IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
11631 
11628 		raise FTE_FREIGHT_PRICING_UTIL.g_tl_move_dlv_rec_fail;
11629 	    END IF;
11630 	END IF;
11632 
11633 
11634 
11635    ELSE
11636 
11637 
11638 	   OPEN c_move_fc_temp;
11639 	   LOOP
11640 	      FETCH c_move_fc_temp INTO l_freight_cost_temp_row;
11641 	      EXIT WHEN c_move_fc_temp%NOTFOUND;
11642 
11643 	      --ensures no spill overs from earlier rows
11644 	      l_freight_cost_main_row:=l_empty_main_row;
11645 
11646 
11647 	      -- When does estimated flag get updated ?
11648 
11649 	      l_freight_cost_main_row.FREIGHT_COST_TYPE_ID := l_freight_cost_temp_row.FREIGHT_COST_TYPE_ID;
11650 	      l_freight_cost_main_row.UNIT_AMOUNT          := l_freight_cost_temp_row.UNIT_AMOUNT;
11651 	      l_freight_cost_main_row.UOM                  := l_freight_cost_temp_row.UOM;
11652 	      l_freight_cost_main_row.QUANTITY             := l_freight_cost_temp_row.QUANTITY;
11653 	      l_freight_cost_main_row.TOTAL_AMOUNT         := l_freight_cost_temp_row.TOTAL_AMOUNT;
11654 	      l_freight_cost_main_row.CURRENCY_CODE        := l_freight_cost_temp_row.CURRENCY_CODE;
11655 	      l_freight_cost_main_row.DELIVERY_ID          := l_freight_cost_temp_row.DELIVERY_ID;
11656 
11657 	      IF (l_freight_cost_temp_row.DELIVERY_LEG_ID IS NULL)
11658 	      THEN
11659 		      l_freight_cost_main_row.DELIVERY_LEG_ID      := p_delivery_leg_id;
11660 	      ELSE
11661 		      l_freight_cost_main_row.DELIVERY_LEG_ID      := l_freight_cost_temp_row.DELIVERY_LEG_ID;
11662 	      END IF;
11663 	      l_freight_cost_main_row.DELIVERY_DETAIL_ID   := l_freight_cost_temp_row.DELIVERY_DETAIL_ID;
11664 	      --l_freight_cost_main_row.FREIGHT_CODE         := l_freight_cost_temp_row.FREIGHT_CODE;
11665 	      l_freight_cost_main_row.LINE_TYPE_CODE       := l_freight_cost_temp_row.LINE_TYPE_CODE;
11666 	      l_freight_cost_main_row.CHARGE_UNIT_VALUE    := l_freight_cost_temp_row.CHARGE_UNIT_VALUE;
11667 	      l_freight_cost_main_row.CHARGE_SOURCE_CODE   := l_freight_cost_temp_row.CHARGE_SOURCE_CODE;
11668 	      --l_freight_cost_main_row.ESTIMATED_FLAG        := l_freight_cost_temp_row.ESTIMATED_FLAG;
11669 	      l_freight_cost_main_row.ESTIMATED_FLAG       := 'Y';
11670 	      l_freight_cost_main_row.LAST_UPDATE_DATE     := SYSDATE;
11671 	      l_freight_cost_main_row.LAST_UPDATED_BY      := FND_GLOBAL.USER_ID;
11672 	      l_freight_cost_main_row.LAST_UPDATE_LOGIN    := FND_GLOBAL.LOGIN_ID;
11673 	      l_freight_cost_main_row.PROGRAM_APPLICATION_ID := FND_GLOBAL.PROG_APPL_ID;
11674           -- Added for R12
11675           l_freight_cost_main_row.BILLABLE_QUANTITY    := l_freight_cost_temp_row.BILLABLE_QUANTITY;
11676           l_freight_cost_main_row.BILLABLE_UOM         := l_freight_cost_temp_row.BILLABLE_UOM;
11677           l_freight_cost_main_row.BILLABLE_BASIS       := l_freight_cost_temp_row.BILLABLE_BASIS;
11678 
11679 	      --l_freight_cost_main_row.PROGRAM_ID           := FND_GLOBAL.CONC_PROGRAM_ID;
11680 	      --l_freight_cost_main_row.PROGRAM_UPDATE_DATE  := SYSDATE;
11681 
11682 		  -- pack J Enhancement for FPA
11683 	      l_freight_cost_main_row.COMMODITY_CATEGORY_ID
11684 		       := l_freight_cost_temp_row.COMMODITY_CATEGORY_ID;
11688 	      IF l_freight_cost_main_row.line_type_code <> 'SUMMARY'
11685 	    FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,
11686 	       '(FPA)l_freight_cost_main_row.COMMODITY_CATEGORY_ID='||l_freight_cost_main_row.COMMODITY_CATEGORY_ID);
11687 
11692 		 l_freight_cost_main_row.CREATION_DATE        := SYSDATE;
11689 		 OR (l_freight_cost_main_row.line_type_code = 'SUMMARY'
11690 		     AND l_freight_cost_main_row.delivery_detail_id IS NOT NULL) THEN
11691 
11693 		 l_freight_cost_main_row.CREATED_BY           := FND_GLOBAL.USER_ID;
11694 
11695 		 WSH_FREIGHT_COSTS_PVT.Create_Freight_Cost(
11696 		  p_freight_cost_info      =>  l_freight_cost_main_row,
11697 		  x_rowid                  =>  l_rowid,
11698 		  x_freight_cost_id        =>  l_freight_cost_id,
11699 		  x_return_status          =>  l_return_status);
11700 
11701 		 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
11702 		    IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
11703 			ROLLBACK to before_fc_creation;
11704 			FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'Base price');
11705 			raise FTE_FREIGHT_PRICING_UTIL.g_create_freight_cost_failed;
11706 		    END IF;
11707 		 END IF;
11708 		 FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'After Create_Freight_Cost id : '||l_freight_cost_id);
11709 
11710 		 IF l_freight_cost_main_row.line_type_code <> 'SUMMARY' THEN
11711 		    l_price_fc_ids(l_freight_cost_main_row.delivery_detail_id) := l_freight_cost_id;
11712 		 END IF;
11713 
11714 
11715 	      ELSE
11716 		 -- To update the delivery leg summary row
11717 		 -- Get the delivery leg id as input and get the freight cost id for that
11718 		 -- The lane level summary amount becomes the delivery leg level summary amount
11719 
11720 		 l_freight_cost_main_row.FREIGHT_COST_ID      := get_fc_id_from_dleg(l_freight_cost_main_row.DELIVERY_LEG_ID);
11721 		 --l_freight_cost_main_row.DELIVERY_LEG_ID      := p_delivery_leg_id;
11722 
11723 		 WSH_FREIGHT_COSTS_PVT.Update_Freight_Cost(
11724 		  p_rowid                  =>  l_update_rowid,
11725 		  p_freight_cost_info      =>  l_freight_cost_main_row,
11726 		  x_return_status          =>  l_return_status);
11727 
11728 		 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
11729 		    IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
11730 			ROLLBACK to before_fc_creation;
11731 			raise FTE_FREIGHT_PRICING_UTIL.g_update_freight_cost_failed;
11732 		    END IF;
11733 		 END IF;
11734 		 FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'After Update_Freight_Cost ');
11735 
11736 	      END IF;
11737 
11738 
11739 	   END LOOP;
11740 --	   IF c_move_fc_temp%ROWCOUNT = 0 THEN
11741 --	      raise FTE_FREIGHT_PRICING_UTIL.g_no_temp_fc_to_move;
11742 --	   END IF;
11743 
11744 	   OPEN c_move_fc_temp_charge;
11745 	   LOOP
11746 	      FETCH c_move_fc_temp_charge INTO l_freight_cost_temp_charge;
11747 	      EXIT WHEN c_move_fc_temp_charge%NOTFOUND;
11748 
11749 	      --ensures no spill overs from earlier rows
11750 	      l_freight_cost_main_charge:=l_empty_main_row;
11751 
11752 	      l_freight_cost_main_charge.FREIGHT_COST_TYPE_ID := l_freight_cost_temp_charge.FREIGHT_COST_TYPE_ID;
11753 	      l_freight_cost_main_charge.UNIT_AMOUNT          := l_freight_cost_temp_charge.UNIT_AMOUNT;
11754 	      l_freight_cost_main_charge.UOM                  := l_freight_cost_temp_charge.UOM;
11755 	      l_freight_cost_main_charge.QUANTITY             := l_freight_cost_temp_charge.QUANTITY;
11756 	      l_freight_cost_main_charge.TOTAL_AMOUNT         := l_freight_cost_temp_charge.TOTAL_AMOUNT;
11757 	      l_freight_cost_main_charge.CURRENCY_CODE        := l_freight_cost_temp_charge.CURRENCY_CODE;
11758 	      l_freight_cost_main_charge.DELIVERY_ID          := l_freight_cost_temp_charge.DELIVERY_ID;
11759 
11760 	      IF (l_freight_cost_temp_charge.DELIVERY_LEG_ID IS NULL)
11761 	      THEN
11762 
11763 		l_freight_cost_main_charge.DELIVERY_LEG_ID      := p_delivery_leg_id;
11764 	      ELSE
11765 		l_freight_cost_main_charge.DELIVERY_LEG_ID      := l_freight_cost_temp_charge.DELIVERY_LEG_ID;
11766 	      END IF;
11767 
11768 	      l_freight_cost_main_charge.DELIVERY_DETAIL_ID   := l_freight_cost_temp_charge.DELIVERY_DETAIL_ID;
11769 	      --l_freight_cost_main_charge.FREIGHT_CODE         := l_freight_cost_temp_charge.FREIGHT_CODE;
11770 	      l_freight_cost_main_charge.LINE_TYPE_CODE       := l_freight_cost_temp_charge.LINE_TYPE_CODE;
11771 	      l_freight_cost_main_charge.CHARGE_UNIT_VALUE    := l_freight_cost_temp_charge.CHARGE_UNIT_VALUE;
11772 	      l_freight_cost_main_charge.CHARGE_SOURCE_CODE   := l_freight_cost_temp_charge.CHARGE_SOURCE_CODE;
11773 	      --l_freight_cost_main_charge.ESTIMATED_FLAG        := l_freight_cost_temp_charge.ESTIMATED_FLAG;
11774 	      l_freight_cost_main_charge.ESTIMATED_FLAG       := 'Y';
11775 	      l_freight_cost_main_charge.CREATION_DATE        := SYSDATE;
11776 	      l_freight_cost_main_charge.CREATED_BY           := FND_GLOBAL.USER_ID;
11777 	      l_freight_cost_main_charge.LAST_UPDATE_DATE     := SYSDATE;
11778 	      l_freight_cost_main_charge.LAST_UPDATED_BY      := FND_GLOBAL.USER_ID;
11779 	      l_freight_cost_main_charge.LAST_UPDATE_LOGIN    := FND_GLOBAL.LOGIN_ID;
11780 	      l_freight_cost_main_charge.PROGRAM_APPLICATION_ID := FND_GLOBAL.PROG_APPL_ID;
11781 	      --l_freight_cost_main_charge.PROGRAM_ID           := FND_GLOBAL.CONC_PROGRAM_ID;
11782 	      --l_freight_cost_main_charge.PROGRAM_UPDATE_DATE  := SYSDATE;
11783 
11784 
11785 
11786 		  -- pack J Enhancement for FPA
11787 	      l_freight_cost_main_charge.COMMODITY_CATEGORY_ID
11788 		       := l_freight_cost_temp_charge.COMMODITY_CATEGORY_ID;
11789 	    FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,
11790 	       '(FPA)l_freight_cost_main_charge.COMMODITY_CATEGORY_ID='||l_freight_cost_main_charge.COMMODITY_CATEGORY_ID);
11791 
11792 	      l_freight_cost_main_charge.applied_to_charge_id := l_price_fc_ids(l_freight_cost_main_charge.delivery_detail_id);
11793 
11794 		 WSH_FREIGHT_COSTS_PVT.Create_Freight_Cost(
11795 		  p_freight_cost_info      =>  l_freight_cost_main_charge,
11796 		  x_rowid                  =>  l_rowid,
11797 		  x_freight_cost_id        =>  l_freight_cost_id,
11798 		  x_return_status          =>  l_return_status);
11799 
11803 			FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'Charge');
11800 		 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
11801 		    IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
11802 			ROLLBACK to before_fc_creation;
11804 			raise FTE_FREIGHT_PRICING_UTIL.g_create_freight_cost_failed;
11805 		    END IF;
11806 		 END IF;
11807 		 FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'After Create_Freight_Cost id : '||l_freight_cost_id);
11808 
11809 	   END LOOP;
11810 
11811 	   BEGIN  -- anonymous block to make sure transaction goes through even if the
11812 		  -- enclosed update statement fails
11813 
11814 	   UPDATE fte_freight_costs_temp
11815 	   SET    moved_to_main_flag = 'Y'
11816 	   WHERE  comparison_request_id = p_request_id
11817 	   --AND    nvl(lane_id,-9999) = nvl(p_lane_id,-9999)
11818 	   AND    nvl(lane_id,-9999) = nvl(decode(p_schedule_id,NULL,p_lane_id,NULL),-9999)
11819 	   AND    nvl(schedule_id,-9999) = nvl(p_schedule_id,-9999)
11820 	   AND    nvl(service_type_code,'X') = nvl(p_service_type_code,'X')
11821 	   AND    moved_to_main_flag = 'N';
11822 
11823 	   EXCEPTION
11824 	     WHEN others THEN
11825 		  FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Updating freight_costs_temp moved_to_main_flag failed');
11826 		  null;
11827 	   END;
11828 
11829 	   delete_fc_temp_pvt (
11830 		p_request_id              =>     p_request_id,     -- Comparison Request ID to move to main
11831 		p_lane_id                 =>     p_lane_id,
11832 		p_schedule_id             =>     p_schedule_id,
11833 		x_return_status           =>     l_return_status);
11834 
11835 	   IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
11836 	       IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
11837 		  FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'delete_fc_temp failed ');
11838 		  raise FTE_FREIGHT_PRICING_UTIL.g_delete_fc_temp_failed;
11839 	       END IF;
11840 	   ELSE
11841 	       FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'delete_fc_temp successful ');
11842 	   END IF;
11843 
11844    END IF;
11845 
11846    FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'Move_fc_temp_to_main');
11847    IF (p_init_prc_log = 'Y') THEN
11848    FTE_FREIGHT_PRICING_UTIL.close_logs;
11849    END IF;
11850 
11851 EXCEPTION
11852 
11853    WHEN FTE_FREIGHT_PRICING_UTIL.g_tl_move_dlv_rec_fail THEN
11854    	ROLLBACK to before_fc_creation;
11855         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11856         FTE_FREIGHT_PRICING_UTIL.set_exit_exception('Move_fc_temp_to_main','g_tl_move_dlv_rec_fail');
11857         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'Move_fc_temp_to_main');
11858         IF (p_init_prc_log = 'Y') THEN
11859         FTE_FREIGHT_PRICING_UTIL.close_logs;
11860         END IF;
11861 
11862    WHEN FTE_FREIGHT_PRICING_UTIL.g_no_lanesched_seg THEN
11863         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11864         FTE_FREIGHT_PRICING_UTIL.set_exit_exception('Move_fc_temp_to_main','g_no_lanesched_seg');
11865         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'Move_fc_temp_to_main');
11866         IF (p_init_prc_log = 'Y') THEN
11867         FTE_FREIGHT_PRICING_UTIL.close_logs;
11868         END IF;
11869    WHEN FTE_FREIGHT_PRICING_UTIL.g_no_temp_fc_to_move THEN
11870         --ROLLBACK to before_fc_creation;
11871         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11872         FTE_FREIGHT_PRICING_UTIL.set_exit_exception('Move_fc_temp_to_main','g_no_temp_fc_to_move');
11873         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'Move_fc_temp_to_main');
11874         IF (p_init_prc_log = 'Y') THEN
11875         FTE_FREIGHT_PRICING_UTIL.close_logs;
11876         END IF;
11877    WHEN FTE_FREIGHT_PRICING_UTIL.g_create_freight_cost_failed THEN
11878         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11879         FTE_FREIGHT_PRICING_UTIL.set_exit_exception('Move_fc_temp_to_main','g_create_freight_cost_failed');
11880         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'Move_fc_temp_to_main');
11881         IF (p_init_prc_log = 'Y') THEN
11882         FTE_FREIGHT_PRICING_UTIL.close_logs;
11883         END IF;
11884    WHEN FTE_FREIGHT_PRICING_UTIL.g_update_freight_cost_failed THEN
11885         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
11886         FTE_FREIGHT_PRICING_UTIL.set_exit_exception('Move_fc_temp_to_main','g_update_freight_cost_failed');
11887         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'Move_fc_temp_to_main');
11888         IF (p_init_prc_log = 'Y') THEN
11889         FTE_FREIGHT_PRICING_UTIL.close_logs;
11890         END IF;
11891    WHEN FTE_FREIGHT_PRICING_UTIL.g_delete_fc_temp_failed THEN
11892         x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
11893         FTE_FREIGHT_PRICING_UTIL.set_exit_exception('Move_fc_temp_to_main','g_delete_fc_temp_failed');
11894         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'Move_fc_temp_to_main');
11895         IF (p_init_prc_log = 'Y') THEN
11896         FTE_FREIGHT_PRICING_UTIL.close_logs;
11897         END IF;
11898    WHEN others THEN
11899         ROLLBACK to before_fc_creation;
11900         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
11901         FTE_FREIGHT_PRICING_UTIL.set_exit_exception('Move_fc_temp_to_main','g_others');
11902         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
11903         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'Move_fc_temp_to_main');
11904         IF (p_init_prc_log = 'Y') THEN
11905         FTE_FREIGHT_PRICING_UTIL.close_logs;
11906         END IF;
11907 END Move_fc_temp_to_main;
11908 
11909 
11910 PROCEDURE Move_fc_temp_to_main (
11911         p_init_msg_list           IN     VARCHAR2 DEFAULT fnd_api.g_true,
11912 	p_init_prc_log	          IN     VARCHAR2 DEFAULT 'Y',
11913         p_request_id              IN     NUMBER,     -- Comparison Request ID to move to main
11914         p_trip_id         	  IN     NUMBER,
11918         x_return_status           OUT NOCOPY     VARCHAR2)
11915         p_lane_id                 IN     NUMBER DEFAULT NULL,
11916         p_schedule_id             IN     NUMBER DEFAULT NULL,
11917         p_service_type_code       IN     VARCHAR2 DEFAULT NULL,
11919 
11920 IS
11921 
11922   -- bug : 2763791 : added p_service_type_code
11923 
11924   CURSOR c_move_fc_temp IS
11925   SELECT *
11926   FROM   FTE_FREIGHT_COSTS_TEMP
11927   WHERE  comparison_request_id = p_request_id
11928   --AND    nvl(lane_id,-9999) = nvl(p_lane_id,-9999)
11929   AND    nvl(lane_id,-9999) = nvl(decode(p_schedule_id,NULL,p_lane_id,NULL),-9999)
11930   AND    nvl(schedule_id,-9999) = nvl(p_schedule_id,-9999)
11931   AND    moved_to_main_flag = 'N'
11932   AND    nvl(service_type_code,'X') = nvl(p_service_type_code,'X')
11933   AND    line_type_code NOT IN ('CHARGE','DISCOUNT');
11934 
11935   CURSOR c_move_fc_temp_charge IS
11936   SELECT *
11937   FROM   FTE_FREIGHT_COSTS_TEMP
11938   WHERE  comparison_request_id = p_request_id
11939   --AND    nvl(lane_id,-9999) = nvl(p_lane_id,-9999)
11940   AND    nvl(lane_id,-9999) = nvl(decode(p_schedule_id,NULL,p_lane_id,NULL),-9999)
11941   AND    nvl(schedule_id,-9999) = nvl(p_schedule_id,-9999)
11942   AND    moved_to_main_flag = 'N'
11943   AND    nvl(service_type_code,'X') = nvl(p_service_type_code,'X')
11944   AND    line_type_code IN ('CHARGE','DISCOUNT');
11945 
11946 
11947 CURSOR c_get_dlegs_from_trip(c_trip_id IN NUMBER) IS
11948         SELECT  dl.delivery_leg_id,dl.delivery_id
11949         FROM    wsh_delivery_legs dl ,
11950                 wsh_trip_stops s
11951         WHERE   dl.pick_up_stop_id = s.stop_id
11952                 and s.trip_id=c_trip_id;
11953 
11954   l_empty_main_row WSH_FREIGHT_COSTS_PVT.Freight_Cost_Rec_Type;
11955   l_freight_cost_temp_row           c_move_fc_temp%ROWTYPE;
11956   l_freight_cost_main_row           WSH_FREIGHT_COSTS_PVT.Freight_Cost_Rec_Type;
11957   l_freight_cost_temp_charge        c_move_fc_temp_charge%ROWTYPE;
11958   l_freight_cost_main_charge        WSH_FREIGHT_COSTS_PVT.Freight_Cost_Rec_Type;
11959   l_price_fc_ids                    WSH_UTIL_CORE.id_tab_type;
11960   l_rowid                           VARCHAR2(30);
11961   l_update_rowid                    VARCHAR2(30);
11962   l_dleg_ids         		    DBMS_UTILITY.NUMBER_ARRAY;
11963   l_delivery_id			    NUMBER;
11964   l_dleg_id			    NUMBER;
11965   l_init_msg_list                   VARCHAR2(30) :=FND_API.G_FALSE;
11966   l_freight_cost_id                 NUMBER;
11967   l_return_status                   VARCHAR2(1);
11968 
11969     l_log_level     NUMBER := FTE_FREIGHT_PRICING_UTIL.G_DBG;
11970 
11971 BEGIN
11972 
11973    x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
11974    IF (p_init_prc_log = 'Y') THEN
11975      FTE_FREIGHT_PRICING_UTIL.initialize_logging( p_init_msg_list  => p_init_msg_list,
11976                                                 x_return_status => l_return_status );
11977    END IF;
11978 
11979    IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
11980        IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
11981             x_return_status  :=  l_return_status;
11982             RETURN;
11983        END IF;
11984    ELSE
11985        FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Initialize Logging successful ');
11986    END IF;
11987    FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
11988    FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,'Move_fc_temp_to_main','start');
11989 
11990    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
11991 ||' Service type - '||p_service_type_code );
11992 
11993    IF (p_trip_id IS NULL) OR (p_lane_id IS NULL AND p_schedule_id IS NULL) THEN
11994       raise FTE_FREIGHT_PRICING_UTIL.g_no_lanesched_seg;
11995    END IF;
11996 
11997 
11998    --Gather mapping from delivery to dleg id. Since this is for a single trip
11999    --There is only one dleg for a delivery
12000    l_delivery_id:=NULL;
12001    l_dleg_id:=NULL;
12002    l_dleg_ids.delete;
12003 
12004    OPEN c_get_dlegs_from_trip(p_trip_id);
12005    FETCH c_get_dlegs_from_trip INTO l_dleg_id,l_delivery_id;
12006    WHILE(c_get_dlegs_from_trip%FOUND)
12007    LOOP
12008    	IF ((l_dleg_id IS NOT NULL) AND (l_delivery_id IS NOT NULL))
12009    	THEN
12010 
12011    		l_dleg_ids(l_delivery_id):=l_dleg_id;
12012 
12013    	ELSE
12014    		FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Null dleg/delivery '||l_dleg_id||' '||l_delivery_id);
12015 
12016    	END IF;
12017 
12018    	FETCH c_get_dlegs_from_trip INTO l_dleg_id,l_delivery_id;
12019 
12020    END LOOP;
12021    CLOSE c_get_dlegs_from_trip;
12022 
12023 
12024    SAVEPOINT before_fc_creation;
12025 
12026    OPEN c_move_fc_temp;
12027    LOOP
12028       FETCH c_move_fc_temp INTO l_freight_cost_temp_row;
12029       EXIT WHEN c_move_fc_temp%NOTFOUND;
12030 
12031       --ensures no spill overs from earlier rows
12032       l_freight_cost_main_row:=l_empty_main_row;
12033 
12034 
12035       -- When does estimated flag get updated ?
12036 
12037       l_freight_cost_main_row.FREIGHT_COST_TYPE_ID := l_freight_cost_temp_row.FREIGHT_COST_TYPE_ID;
12038       l_freight_cost_main_row.UNIT_AMOUNT          := l_freight_cost_temp_row.UNIT_AMOUNT;
12039       l_freight_cost_main_row.UOM                  := l_freight_cost_temp_row.UOM;
12040       l_freight_cost_main_row.QUANTITY             := l_freight_cost_temp_row.QUANTITY;
12041       l_freight_cost_main_row.TOTAL_AMOUNT         := l_freight_cost_temp_row.TOTAL_AMOUNT;
12042       l_freight_cost_main_row.CURRENCY_CODE        := l_freight_cost_temp_row.CURRENCY_CODE;
12043       l_freight_cost_main_row.DELIVERY_ID          := l_freight_cost_temp_row.DELIVERY_ID;
12044 
12048       THEN
12045       l_freight_cost_main_row.FREIGHT_COST_ID:=NULL;-- To avoid this from bein retained from earlier
12046 
12047       IF (l_freight_cost_temp_row.DELIVERY_LEG_ID IS NULL)
12049 
12050 	      IF ((l_freight_cost_main_row.DELIVERY_ID IS NOT NULL)
12051 		AND (l_dleg_ids.EXISTS(l_freight_cost_main_row.DELIVERY_ID)))
12052 	      THEN
12053 
12054 		l_freight_cost_main_row.DELIVERY_LEG_ID      := l_dleg_ids(l_freight_cost_main_row.DELIVERY_ID);
12055 
12056 	      ELSE
12057 		FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'No dleg for delivery '||l_freight_cost_main_row.DELIVERY_ID);
12058 		ROLLBACK to before_fc_creation;
12059 		raise FTE_FREIGHT_PRICING_UTIL.g_no_lanesched_seg;
12060 	      END IF;
12061 
12062       ELSE
12063 		l_freight_cost_main_row.DELIVERY_LEG_ID      := l_freight_cost_temp_row.DELIVERY_LEG_ID;
12064       END IF;
12065 
12066       l_freight_cost_main_row.DELIVERY_DETAIL_ID   := l_freight_cost_temp_row.DELIVERY_DETAIL_ID;
12067       --l_freight_cost_main_row.FREIGHT_CODE         := l_freight_cost_temp_row.FREIGHT_CODE;
12068       l_freight_cost_main_row.LINE_TYPE_CODE       := l_freight_cost_temp_row.LINE_TYPE_CODE;
12069       l_freight_cost_main_row.CHARGE_UNIT_VALUE    := l_freight_cost_temp_row.CHARGE_UNIT_VALUE;
12070       l_freight_cost_main_row.CHARGE_SOURCE_CODE   := l_freight_cost_temp_row.CHARGE_SOURCE_CODE;
12071       --l_freight_cost_main_row.ESTIMATED_FLAG        := l_freight_cost_temp_row.ESTIMATED_FLAG;
12072       l_freight_cost_main_row.ESTIMATED_FLAG       := 'Y';
12073       l_freight_cost_main_row.LAST_UPDATE_DATE     := SYSDATE;
12074       l_freight_cost_main_row.LAST_UPDATED_BY      := FND_GLOBAL.USER_ID;
12075       l_freight_cost_main_row.LAST_UPDATE_LOGIN    := FND_GLOBAL.LOGIN_ID;
12076       l_freight_cost_main_row.PROGRAM_APPLICATION_ID := FND_GLOBAL.PROG_APPL_ID;
12077       --l_freight_cost_main_row.PROGRAM_ID           := FND_GLOBAL.CONC_PROGRAM_ID;
12078       --l_freight_cost_main_row.PROGRAM_UPDATE_DATE  := SYSDATE;
12079 
12080       -- Added for R12
12081       l_freight_cost_main_row.BILLABLE_QUANTITY    := l_freight_cost_temp_row.BILLABLE_QUANTITY;
12082       l_freight_cost_main_row.BILLABLE_UOM         := l_freight_cost_temp_row.BILLABLE_UOM;
12083       l_freight_cost_main_row.BILLABLE_BASIS       := l_freight_cost_temp_row.BILLABLE_BASIS;
12084 
12085           -- pack J Enhancement for FPA
12086       l_freight_cost_main_row.COMMODITY_CATEGORY_ID
12087                := l_freight_cost_temp_row.COMMODITY_CATEGORY_ID;
12088     FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,
12089        '(FPA)l_freight_cost_main_row.COMMODITY_CATEGORY_ID='||l_freight_cost_main_row.COMMODITY_CATEGORY_ID);
12090 
12091       IF l_freight_cost_main_row.line_type_code <> 'SUMMARY'
12092          OR (l_freight_cost_main_row.line_type_code = 'SUMMARY'
12093              AND l_freight_cost_main_row.delivery_detail_id IS NOT NULL) THEN
12094 
12095          l_freight_cost_main_row.CREATION_DATE        := SYSDATE;
12096          l_freight_cost_main_row.CREATED_BY           := FND_GLOBAL.USER_ID;
12097 
12098          WSH_FREIGHT_COSTS_PVT.Create_Freight_Cost(
12099           p_freight_cost_info      =>  l_freight_cost_main_row,
12100           x_rowid                  =>  l_rowid,
12101           x_freight_cost_id        =>  l_freight_cost_id,
12102           x_return_status          =>  l_return_status);
12103 
12104          IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
12105             IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
12106                 ROLLBACK to before_fc_creation;
12107                 FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'Base price');
12108                 raise FTE_FREIGHT_PRICING_UTIL.g_create_freight_cost_failed;
12109             END IF;
12110          END IF;
12111          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'After Create_Freight_Cost id : '||l_freight_cost_id);
12112 
12113          IF l_freight_cost_main_row.line_type_code <> 'SUMMARY' THEN
12114             l_price_fc_ids(l_freight_cost_main_row.delivery_detail_id) := l_freight_cost_id;
12115          END IF;
12116 
12117 
12118       ELSE
12119          -- To update the delivery leg summary row
12120          -- Get the delivery leg id as input and get the freight cost id for that
12121          -- The lane level summary amount becomes the delivery leg level summary amount
12122 
12123          l_freight_cost_main_row.FREIGHT_COST_ID      := get_fc_id_from_dleg(l_freight_cost_main_row.DELIVERY_LEG_ID);
12124 
12125 
12126          WSH_FREIGHT_COSTS_PVT.Update_Freight_Cost(
12127           p_rowid                  =>  l_update_rowid,
12128           p_freight_cost_info      =>  l_freight_cost_main_row,
12129           x_return_status          =>  l_return_status);
12130 
12131          IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
12132             IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
12133                 ROLLBACK to before_fc_creation;
12134                 raise FTE_FREIGHT_PRICING_UTIL.g_update_freight_cost_failed;
12135             END IF;
12136          END IF;
12137          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'After Update_Freight_Cost ');
12138 
12139       END IF;
12140 
12141 
12142    END LOOP;
12143 --   IF c_move_fc_temp%ROWCOUNT = 0 THEN
12144 --      raise FTE_FREIGHT_PRICING_UTIL.g_no_temp_fc_to_move;
12145 --   END IF;
12146    CLOSE c_move_fc_temp;
12147 
12148    OPEN c_move_fc_temp_charge;
12149    LOOP
12150       FETCH c_move_fc_temp_charge INTO l_freight_cost_temp_charge;
12151       EXIT WHEN c_move_fc_temp_charge%NOTFOUND;
12152 
12153       --ensures no spill overs from earlier rows
12154       l_freight_cost_main_charge:=l_empty_main_row;
12155 
12156 
12157       l_freight_cost_main_charge.FREIGHT_COST_TYPE_ID := l_freight_cost_temp_charge.FREIGHT_COST_TYPE_ID;
12158       l_freight_cost_main_charge.UNIT_AMOUNT          := l_freight_cost_temp_charge.UNIT_AMOUNT;
12162       l_freight_cost_main_charge.CURRENCY_CODE        := l_freight_cost_temp_charge.CURRENCY_CODE;
12159       l_freight_cost_main_charge.UOM                  := l_freight_cost_temp_charge.UOM;
12160       l_freight_cost_main_charge.QUANTITY             := l_freight_cost_temp_charge.QUANTITY;
12161       l_freight_cost_main_charge.TOTAL_AMOUNT         := l_freight_cost_temp_charge.TOTAL_AMOUNT;
12163       l_freight_cost_main_charge.DELIVERY_ID          := l_freight_cost_temp_charge.DELIVERY_ID;
12164 
12165       l_freight_cost_main_row.FREIGHT_COST_ID:=NULL;-- To avoid this from bein retained from earlier
12166 
12167       IF(l_freight_cost_temp_charge.DELIVERY_LEG_ID IS NULL)
12168       THEN
12169 
12170 
12171 	      IF ((l_freight_cost_main_charge.DELIVERY_ID IS NOT NULL)
12172 		AND (l_dleg_ids.EXISTS(l_freight_cost_main_charge.DELIVERY_ID)))
12173 	      THEN
12174 
12175 		l_freight_cost_main_charge.DELIVERY_LEG_ID      := l_dleg_ids(l_freight_cost_main_charge.DELIVERY_ID);
12176 
12177 	      ELSE
12178 
12179 		FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'No dleg for delivery '||l_freight_cost_main_charge.DELIVERY_ID);
12180 
12181 	      END IF;
12182 
12183         ELSE
12184 		l_freight_cost_main_charge.DELIVERY_LEG_ID      :=l_freight_cost_temp_charge.DELIVERY_LEG_ID;
12185 	END IF;
12186 
12187 	l_freight_cost_main_charge.DELIVERY_DETAIL_ID   := l_freight_cost_temp_charge.DELIVERY_DETAIL_ID;
12188       --l_freight_cost_main_charge.FREIGHT_CODE         := l_freight_cost_temp_charge.FREIGHT_CODE;
12189       l_freight_cost_main_charge.LINE_TYPE_CODE       := l_freight_cost_temp_charge.LINE_TYPE_CODE;
12190       l_freight_cost_main_charge.CHARGE_UNIT_VALUE    := l_freight_cost_temp_charge.CHARGE_UNIT_VALUE;
12191       l_freight_cost_main_charge.CHARGE_SOURCE_CODE   := l_freight_cost_temp_charge.CHARGE_SOURCE_CODE;
12192       --l_freight_cost_main_charge.ESTIMATED_FLAG        := l_freight_cost_temp_charge.ESTIMATED_FLAG;
12193       l_freight_cost_main_charge.ESTIMATED_FLAG       := 'Y';
12194       l_freight_cost_main_charge.CREATION_DATE        := SYSDATE;
12195       l_freight_cost_main_charge.CREATED_BY           := FND_GLOBAL.USER_ID;
12196       l_freight_cost_main_charge.LAST_UPDATE_DATE     := SYSDATE;
12197       l_freight_cost_main_charge.LAST_UPDATED_BY      := FND_GLOBAL.USER_ID;
12198       l_freight_cost_main_charge.LAST_UPDATE_LOGIN    := FND_GLOBAL.LOGIN_ID;
12199       l_freight_cost_main_charge.PROGRAM_APPLICATION_ID := FND_GLOBAL.PROG_APPL_ID;
12200       --l_freight_cost_main_charge.PROGRAM_ID           := FND_GLOBAL.CONC_PROGRAM_ID;
12201       --l_freight_cost_main_charge.PROGRAM_UPDATE_DATE  := SYSDATE;
12202 
12203 
12204           -- pack J Enhancement for FPA
12205       l_freight_cost_main_charge.COMMODITY_CATEGORY_ID
12206                := l_freight_cost_temp_charge.COMMODITY_CATEGORY_ID;
12207     FTE_FREIGHT_PRICING_UTIL.print_msg(l_log_level,
12208        '(FPA)l_freight_cost_main_charge.COMMODITY_CATEGORY_ID='||l_freight_cost_main_charge.COMMODITY_CATEGORY_ID);
12209 
12210       l_freight_cost_main_charge.applied_to_charge_id := l_price_fc_ids(l_freight_cost_main_charge.delivery_detail_id);
12211 
12212          WSH_FREIGHT_COSTS_PVT.Create_Freight_Cost(
12213           p_freight_cost_info      =>  l_freight_cost_main_charge,
12214           x_rowid                  =>  l_rowid,
12215           x_freight_cost_id        =>  l_freight_cost_id,
12216           x_return_status          =>  l_return_status);
12217 
12218          IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
12219             IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
12220                 ROLLBACK to before_fc_creation;
12221                 FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'Charge');
12222                 raise FTE_FREIGHT_PRICING_UTIL.g_create_freight_cost_failed;
12223             END IF;
12224          END IF;
12225          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'After Create_Freight_Cost id : '||l_freight_cost_id);
12226 
12227    END LOOP;
12228    CLOSE c_move_fc_temp_charge;
12229 
12230    BEGIN  -- anonymous block to make sure transaction goes through even if the
12231           -- enclosed update statement fails
12232 
12233    UPDATE fte_freight_costs_temp
12234    SET    moved_to_main_flag = 'Y'
12235    WHERE  comparison_request_id = p_request_id
12236    --AND    nvl(lane_id,-9999) = nvl(p_lane_id,-9999)
12237    AND    nvl(lane_id,-9999) = nvl(decode(p_schedule_id,NULL,p_lane_id,NULL),-9999)
12238    AND    nvl(schedule_id,-9999) = nvl(p_schedule_id,-9999)
12239    AND    nvl(service_type_code,'X') = nvl(p_service_type_code,'X')
12240    AND    moved_to_main_flag = 'N';
12241 
12242    EXCEPTION
12243      WHEN others THEN
12244           FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Updating freight_costs_temp moved_to_main_flag failed');
12245           null;
12246    END;
12247 
12248    delete_fc_temp_pvt (
12249         p_request_id              =>     p_request_id,     -- Comparison Request ID to move to main
12250         p_lane_id                 =>     p_lane_id,
12251         p_schedule_id             =>     p_schedule_id,
12252         x_return_status           =>     l_return_status);
12253 
12254    IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
12255        IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
12256           FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'delete_fc_temp failed ');
12257           raise FTE_FREIGHT_PRICING_UTIL.g_delete_fc_temp_failed;
12258        END IF;
12259    ELSE
12260        FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'delete_fc_temp successful ');
12261    END IF;
12262 
12263    FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'Move_fc_temp_to_main');
12264    IF (p_init_prc_log = 'Y') THEN
12265    FTE_FREIGHT_PRICING_UTIL.close_logs;
12266    END IF;
12267 
12268 EXCEPTION
12269    WHEN FTE_FREIGHT_PRICING_UTIL.g_no_lanesched_seg THEN
12273         IF (p_init_prc_log = 'Y') THEN
12270         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
12271         FTE_FREIGHT_PRICING_UTIL.set_exit_exception('Move_fc_temp_to_main','g_no_lanesched_seg');
12272         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'Move_fc_temp_to_main');
12274         FTE_FREIGHT_PRICING_UTIL.close_logs;
12275         END IF;
12276    WHEN FTE_FREIGHT_PRICING_UTIL.g_no_temp_fc_to_move THEN
12277         --ROLLBACK to before_fc_creation;
12278         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
12279         FTE_FREIGHT_PRICING_UTIL.set_exit_exception('Move_fc_temp_to_main','g_no_temp_fc_to_move');
12280         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'Move_fc_temp_to_main');
12281         IF (p_init_prc_log = 'Y') THEN
12282         FTE_FREIGHT_PRICING_UTIL.close_logs;
12283         END IF;
12284    WHEN FTE_FREIGHT_PRICING_UTIL.g_create_freight_cost_failed THEN
12285         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
12286         FTE_FREIGHT_PRICING_UTIL.set_exit_exception('Move_fc_temp_to_main','g_create_freight_cost_failed');
12287         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'Move_fc_temp_to_main');
12288         IF (p_init_prc_log = 'Y') THEN
12289         FTE_FREIGHT_PRICING_UTIL.close_logs;
12290         END IF;
12291    WHEN FTE_FREIGHT_PRICING_UTIL.g_update_freight_cost_failed THEN
12292         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
12293         FTE_FREIGHT_PRICING_UTIL.set_exit_exception('Move_fc_temp_to_main','g_update_freight_cost_failed');
12294         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'Move_fc_temp_to_main');
12295         IF (p_init_prc_log = 'Y') THEN
12296         FTE_FREIGHT_PRICING_UTIL.close_logs;
12297         END IF;
12298    WHEN FTE_FREIGHT_PRICING_UTIL.g_delete_fc_temp_failed THEN
12299         x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
12300         FTE_FREIGHT_PRICING_UTIL.set_exit_exception('Move_fc_temp_to_main','g_delete_fc_temp_failed');
12301         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'Move_fc_temp_to_main');
12302         IF (p_init_prc_log = 'Y') THEN
12303         FTE_FREIGHT_PRICING_UTIL.close_logs;
12304         END IF;
12305    WHEN others THEN
12306         ROLLBACK to before_fc_creation;
12307         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
12308         FTE_FREIGHT_PRICING_UTIL.set_exit_exception('Move_fc_temp_to_main','g_others');
12309         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
12310         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'Move_fc_temp_to_main');
12311         IF (p_init_prc_log = 'Y') THEN
12312         FTE_FREIGHT_PRICING_UTIL.close_logs;
12313         END IF;
12314 END Move_fc_temp_to_main;
12315 
12316 
12317 PROCEDURE delete_fc_temp (
12318         p_init_msg_list           IN     VARCHAR2 DEFAULT fnd_api.g_true,
12319         p_request_id              IN     NUMBER,     -- Comparison Request ID to move to main
12320         x_return_status           OUT NOCOPY     VARCHAR2)
12321 IS
12322 
12323   l_initialized                     BOOLEAN := TRUE;
12324   l_return_status                   VARCHAR2(1);
12325   l_log_level                       NUMBER := FTE_FREIGHT_PRICING_UTIL.G_DBG;
12326 
12327   PRAGMA AUTONOMOUS_TRANSACTION;
12328 
12329 BEGIN
12330    SAVEPOINT DELETE_FC_TEMP;
12331 
12332    x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
12333 
12334    FTE_FREIGHT_PRICING_UTIL.initialize_logging( p_init_msg_list  => p_init_msg_list,
12335                                                 x_return_status => l_return_status );
12336 
12337    IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
12338        IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
12339             l_initialized    :=  FALSE;
12340             x_return_status  :=  WSH_UTIL_CORE.G_RET_STS_WARNING;
12341        END IF;
12342    ELSE
12343        FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Initialize Logging successful ');
12344        FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
12345        FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,'delete_fc_temp','start');
12346        FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Input : Request Id - '||p_request_id);
12347    END IF;
12348 
12349    delete_fc_temp_pvt (
12350         p_request_id              =>     p_request_id,     -- Comparison Request ID to move to main
12351         p_initialized             =>     l_initialized,
12352         x_return_status           =>     l_return_status);
12353 
12354    IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
12355        IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
12356           IF l_initialized THEN
12357              FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'delete_fc_temp failed ');
12358           END IF;
12359           ROLLBACK TO DELETE_FC_TEMP;
12360           x_return_status  :=  WSH_UTIL_CORE.G_RET_STS_WARNING;
12361        END IF;
12362    ELSE
12363        IF l_initialized THEN
12364           FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'delete_fc_temp successful ');
12365        END IF;
12366        COMMIT;
12367    END IF;
12368 
12369    IF l_initialized THEN
12370       FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'delete_fc_temp');
12371       FTE_FREIGHT_PRICING_UTIL.close_logs;
12372    END IF;
12373 
12374 EXCEPTION
12375 
12376    WHEN others THEN
12377         x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
12378         IF l_initialized THEN
12379              FTE_FREIGHT_PRICING_UTIL.set_exit_exception('delete_fc_temp','g_others');
12380              FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
12381              FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'delete_fc_temp');
12382              FTE_FREIGHT_PRICING_UTIL.close_logs;
12383         END IF;
12384 END delete_fc_temp;
12385 
12386 
12390 --      Can accept delivery or trip. Can generate its own comparison request id
12387 --
12388 -- API: SHIPMENT_PRICE_COMPARE_PVT
12389 --      Internal api for price comparison for LTL and PARCEL
12391 --      or can be passed in.
12392 --      Not to be called from outside rating
12393 --      Does not initialize the log file
12394 --      Introduced for pack J
12395 --
12396 --      Parameters :
12397 --          p_delivery_id        -> Input either delivery_id or trip_id (not both)
12398 --          p_trip_id            -> Input either delivery_id or trip_id (not both)
12399 --          p_lane_id_tab        -> table of lane ids
12400 --          p_schedule_id_tab    -> table of schedule ids
12401 --          Note : p_lane_id_tab and p_schedule_id_tab can have overlapping indices
12402 --                 For this API both tables are assumed to be independent of each
12403 --                 other
12404 --          p_dep_date           -> departure date
12405 --          p_arr_date           -> arrival date
12406 --          x_sum_lane_price_tab        ->
12407 --          x_sum_lane_price_curr_tab   ->
12408 --          x_sum_sched_price_tab       ->
12409 --          x_sum_sched_price_curr_tab  ->
12410 --          x_request_id              -> Can generate its own id if not passed in
12411 --          x_return_status           -> return status
12412 --
12413 
12414 PROCEDURE shipment_price_compare_pvt (
12415         p_delivery_id             IN     NUMBER DEFAULT NULL,
12416         p_trip_id                 IN     NUMBER DEFAULT NULL,
12417         p_lane_id_tab             IN     WSH_UTIL_CORE.id_tab_type,
12418         p_sched_id_tab            IN     WSH_UTIL_CORE.id_tab_type,
12419         p_service_lane_tab        IN     WSH_UTIL_CORE.Column_Tab_Type,
12420         p_service_sched_tab       IN     WSH_UTIL_CORE.Column_Tab_Type,
12421         p_dep_date                IN     DATE DEFAULT sysdate,
12422         p_arr_date                IN     DATE DEFAULT sysdate,
12423         x_sum_lane_price_tab      OUT    NOCOPY  WSH_UTIL_CORE.id_tab_type,
12424         x_sum_lane_price_curr_tab OUT    NOCOPY  WSH_UTIL_CORE.Column_tab_type,
12425         x_sum_sched_price_tab      OUT   NOCOPY  WSH_UTIL_CORE.id_tab_type,
12426         x_sum_sched_price_curr_tab OUT   NOCOPY  WSH_UTIL_CORE.Column_tab_type,
12427         x_request_id              IN OUT NOCOPY     NUMBER,
12428         x_return_status           OUT    NOCOPY     VARCHAR2 )
12429 IS
12430 
12431    CURSOR c_delivery(c_delivery_id IN NUMBER) IS
12432    Select wdd.delivery_detail_id,
12433           wda.delivery_id,
12434           NULL,   --  No delivery leg here
12435           NULL,   --  No reprice_required flag here
12436           wda.parent_delivery_detail_id,
12437           wdd.customer_id             ,
12438           wdd.sold_to_contact_id    ,
12439           wdd.inventory_item_id    ,
12440           wdd.item_description    ,
12441           wdd.hazard_class_id    ,
12442           wdd.country_of_origin ,
12443           wdd.classification   ,
12444           wdd.requested_quantity             ,
12445           wdd.requested_quantity_uom        ,
12446           wdd.master_container_item_id     ,
12447           wdd.detail_container_item_id    ,
12448           wdd.customer_item_id           ,
12449           wdd.net_weight                ,
12450           wdd.organization_id          ,
12451           wdd.container_flag          ,
12452           wdd.container_type_code    ,
12453           wdd.container_name        ,
12454           wdd.fill_percent         ,
12455           wdd.gross_weight        ,
12456           wdd.currency_code     ,
12457           wdd.freight_class_cat_id        ,
12458           wdd.commodity_code_cat_id      ,
12459           wdd.weight_uom_code           ,
12460           wdd.volume                   ,
12461           wdd.volume_uom_code         ,
12462           wdd.tp_attribute_category  ,
12463           wdd.tp_attribute1         ,
12464           wdd.tp_attribute2        ,
12465           wdd.tp_attribute3       ,
12466           wdd.tp_attribute4                        ,
12467           wdd.tp_attribute5                       ,
12468           wdd.tp_attribute6                      ,
12469           wdd.tp_attribute7                     ,
12470           wdd.tp_attribute8                    ,
12471           wdd.tp_attribute9                   ,
12472           wdd.tp_attribute10                 ,
12473           wdd.tp_attribute11                ,
12474           wdd.tp_attribute12               ,
12475           wdd.tp_attribute13              ,
12476           wdd.tp_attribute14             ,
12477           wdd.tp_attribute15            ,
12478           wdd.attribute_category       ,
12479           wdd.attribute1              ,
12480           wdd.attribute2             ,
12481           wdd.attribute3            ,
12482           wdd.attribute4           ,
12483           wdd.attribute5          ,
12484           wdd.attribute6         ,
12485           wdd.attribute7        ,
12486           wdd.attribute8       ,
12487           wdd.attribute9      ,
12488           wdd.attribute10    ,
12489           wdd.attribute11   ,
12490           wdd.attribute12  ,
12491           wdd.attribute13 ,
12492           wdd.attribute14,
12493           wdd.attribute15,
12494           'FTE',           -- source_type
12495           NULL,            -- source_line_id
12496           NULL,            -- source_header_id
12497           NULL,            -- source_consolidation_id
12498           NULL,            -- ship_date
12499           NULL,            -- arrival_date
12500           NULL,             -- comm_category_id
12501 	  wda.type,
12502 	  wda.parent_delivery_id,
12503 	  NULL--wdl.parent_delivery_leg_id
12504    from   wsh_delivery_details wdd, wsh_delivery_assignments wda,
12505 	  wsh_new_deliveries wd
12506    where  wdd.delivery_detail_id = wda.delivery_detail_id
12507    and    wda.delivery_id        = c_delivery_id
12511    CURSOR c_delivery_from_trip(c_trip_id IN NUMBER) IS
12508    and      (wda.type IS null  OR wda.type <> 'O')--MDC
12509    and    wda.delivery_id 	 = wd.delivery_id;
12510 
12512    Select wdd.delivery_detail_id,
12513           wda.delivery_id,
12514           wdl.delivery_leg_id,
12515           nvl(wdl.reprice_required,'N') as reprice_required,  --  Added AG 05/10
12516           wda.parent_delivery_detail_id,
12517           wdd.customer_id             ,
12518           wdd.sold_to_contact_id    ,
12519           wdd.inventory_item_id    ,
12520           wdd.item_description    ,
12521           wdd.hazard_class_id    ,
12522           wdd.country_of_origin ,
12523           wdd.classification   ,
12524           wdd.requested_quantity             ,
12525           wdd.requested_quantity_uom        ,
12526           wdd.master_container_item_id     ,
12527           wdd.detail_container_item_id    ,
12528           wdd.customer_item_id           ,
12529           wdd.net_weight                ,
12530           wdd.organization_id          ,
12531           wdd.container_flag          ,
12532           wdd.container_type_code    ,
12533           wdd.container_name        ,
12534           wdd.fill_percent         ,
12535           wdd.gross_weight        ,
12536           wdd.currency_code     ,
12537           wdd.freight_class_cat_id        ,
12538           wdd.commodity_code_cat_id      ,
12539           wdd.weight_uom_code           ,
12540           wdd.volume                   ,
12541           wdd.volume_uom_code         ,
12542           wdd.tp_attribute_category  ,
12543           wdd.tp_attribute1         ,
12544           wdd.tp_attribute2        ,
12545           wdd.tp_attribute3       ,
12546           wdd.tp_attribute4                        ,
12547           wdd.tp_attribute5                       ,
12548           wdd.tp_attribute6                      ,
12549           wdd.tp_attribute7                     ,
12550           wdd.tp_attribute8                    ,
12551           wdd.tp_attribute9                   ,
12552           wdd.tp_attribute10                 ,
12553           wdd.tp_attribute11                ,
12554           wdd.tp_attribute12               ,
12555           wdd.tp_attribute13              ,
12556           wdd.tp_attribute14             ,
12557           wdd.tp_attribute15            ,
12558           wdd.attribute_category       ,
12559           wdd.attribute1              ,
12560           wdd.attribute2             ,
12561           wdd.attribute3            ,
12562           wdd.attribute4           ,
12563           wdd.attribute5          ,
12564           wdd.attribute6         ,
12565           wdd.attribute7        ,
12566           wdd.attribute8       ,
12567           wdd.attribute9      ,
12568           wdd.attribute10    ,
12569           wdd.attribute11   ,
12570           wdd.attribute12  ,
12571           wdd.attribute13 ,
12572           wdd.attribute14,
12573           wdd.attribute15,
12574           'FTE',           -- source_type
12575           NULL,            -- source_line_id
12576           NULL,            -- source_header_id
12577           NULL,            -- source_consolidation_id
12578           NULL,            -- ship_date
12579           NULL,            -- arrival_date
12580           NULL,             -- comm_category_id
12581 	  wda.type,
12582 	  wda.parent_delivery_id,
12583 	  wdl.parent_delivery_leg_id
12584    from   wsh_delivery_details wdd, wsh_delivery_assignments wda,
12585 	  wsh_new_deliveries wd,
12586           wsh_delivery_legs wdl, wsh_trip_stops wts1, wsh_trip_stops wts2,wsh_trips wt
12587    where  wdd.delivery_detail_id = wda.delivery_detail_id
12588    and    wda.delivery_id        = wdl.delivery_id
12589    and    wdl.delivery_id 	 = wd.delivery_id
12590    and    wdl.pick_up_stop_id    = wts1.stop_id
12591    and    wdl.drop_off_stop_id   = wts2.stop_id
12592    and    wts1.trip_id           = wt.trip_id
12593    and    wts2.trip_id           = wt.trip_id
12594    and      (wda.type IS null  OR wda.type <> 'O')--MDC
12595    and    wt.trip_id             = c_trip_id;
12596 
12597 
12598    CURSOR c_get_req_id IS
12599    SELECT fte_pricing_comp_request_s.nextval
12600    FROM   sys.dual;
12601 
12602    CURSOR c_get_carrier_for_lane(c_lane_id IN NUMBER) IS
12603    SELECT carrier_id
12604    FROM fte_lanes
12605    WHERE lane_id = c_lane_id;
12606 
12607    l_return_status                   VARCHAR2(1);
12608    l_return_code             NUMBER;
12609    l_delvy_det_rec                   shipment_line_rec_type;
12610    l_first_level_rows                shpmnt_content_tab_type;
12611    l_first_level_charges             addl_services_tab_type;
12612    l_request_id                      NUMBER:=0;
12613    l_lane_summary                    NUMBER:=0;
12614    l_lane_summary_uom                VARCHAR2(40);
12615    l_sched_summary                   NUMBER:=0;
12616    l_sched_summary_uom               VARCHAR2(40);
12617    l_lane_num                        VARCHAR2(100);
12618    l_sched_num                       VARCHAR2(100);
12619    i                                 NUMBER:=0;
12620    j                                 NUMBER:=0;
12621    l_dummy_fc_temp_price             Freight_Cost_Temp_Tab_Type;
12622    l_dummy_fc_temp_charge            Freight_Cost_Temp_Tab_Type;
12623    l_currency_code                   VARCHAR2(10);
12624    l_carrier_id                     NUMBER;
12625 
12626    l_log_level    NUMBER := FTE_FREIGHT_PRICING_UTIL.G_LOG;
12627 
12628 
12629 BEGIN
12630 
12631    SAVEPOINT SHIPMENT_PRICE_COMPARE_PVT;
12632 
12633    x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
12634 
12635    FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
12636    FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,'shipment_price_compare_pvt','start');
12637 
12638    FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'p_delivery_id ='||p_delivery_id);
12642    FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'p_dep_date    ='||p_dep_date);
12639    FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'p_trip_id     ='||p_trip_id);
12640    FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'p_lane_id_tab.COUNT ='||p_lane_id_tab.COUNT);
12641    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_arr_date    ='||p_arr_date);
12644    FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'x_request_id ='||x_request_id);
12645 
12646    IF p_trip_id IS NOT NULL THEN
12650 
12647       validate_nontl_trip(
12648 	p_trip_id 	=> p_trip_id,
12649 	x_return_code => l_return_code);
12651       IF l_return_code = G_RC_ERROR THEN
12652 	RAISE FND_API.G_EXC_ERROR;
12653       ELSIF (l_return_code = G_RC_REPRICE_NOT_REQUIRED
12654 	     OR l_return_code = G_RC_NOT_RATE_FREIGHT_TERM
12655 	     OR l_return_code = G_RC_NOT_RATE_MANIFESTING) THEN
12656         x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
12657 	raise g_finished_warning;
12658       END IF;
12659 
12660 
12661 
12662    ELSIF p_delivery_id IS NOT NULL THEN
12663 
12664       validate_delivery(
12665 	p_delivery_id 	=> p_delivery_id,
12666 	x_return_code => l_return_code);
12667 
12668       IF l_return_code = G_RC_ERROR THEN
12669 	RAISE FND_API.G_EXC_ERROR;
12670       ELSIF (l_return_code = G_RC_REPRICE_NOT_REQUIRED
12671 	     OR l_return_code = G_RC_NOT_RATE_FREIGHT_TERM
12672 	     OR l_return_code = G_RC_NOT_RATE_MANIFESTING) THEN
12673         x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
12674 	raise g_finished_warning;
12675       END IF;
12676    END IF;
12677 
12678       IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
12679           IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
12680              raise FTE_FREIGHT_PRICING_UTIL.g_currency_code_failed;
12681           END IF;
12682       END IF;
12683 
12684 
12685 
12686 
12687    -- Important : must delete global table
12688    g_shipment_line_rows.DELETE;
12689 
12690    --  Generate comparison request_id here and populate it into l_request_id
12691 
12692    IF (x_request_id IS NULL OR x_request_id = 0) THEN
12693 
12694       OPEN c_get_req_id;
12695       FETCH c_get_req_id INTO l_request_id;
12696       CLOSE c_get_req_id;
12697 
12698       x_request_id := l_request_id;
12699 
12700    ELSE
12701       l_request_id := x_request_id;
12702 
12703    END IF;
12704 
12705    fte_freight_pricing_util.print_msg(p_msg => 'Comparison request_id is ' || l_request_id);
12706 
12707    IF (p_delivery_id IS NOT NULL) THEN
12708 
12709       OPEN c_delivery(p_delivery_id);
12710 
12711       LOOP
12712       FETCH c_delivery INTO l_delvy_det_rec;
12713          EXIT WHEN c_delivery%NOTFOUND;
12714          g_shipment_line_rows(l_delvy_det_rec.delivery_detail_id) := l_delvy_det_rec;
12715       END LOOP;
12716 
12717       IF c_delivery%ROWCOUNT = 0 THEN
12718          CLOSE c_delivery;
12719          raise FTE_FREIGHT_PRICING_UTIL.g_empty_delivery;
12720       ELSE
12721          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Matching number of delivery lines : '||c_delivery%ROWCOUNT);
12722       END IF;
12723 
12724       CLOSE c_delivery;
12725 
12726    ELSIF (p_trip_id IS NOT NULL) THEN
12727 
12728       OPEN c_delivery_from_trip(p_trip_id);
12729 
12730       LOOP
12731          FETCH c_delivery_from_trip INTO l_delvy_det_rec;
12732          EXIT WHEN c_delivery_from_trip%NOTFOUND;
12733          g_shipment_line_rows(l_delvy_det_rec.delivery_detail_id) := l_delvy_det_rec;
12734       END LOOP;
12735 
12736       IF c_delivery_from_trip%ROWCOUNT = 0 THEN
12737          CLOSE c_delivery_from_trip;
12738          raise FTE_FREIGHT_PRICING_UTIL.g_empty_delivery;
12739       ELSE
12740          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Matching number of delivery lines : '||c_delivery_from_trip%ROWCOUNT);
12741       END IF;
12742 
12743       CLOSE c_delivery_from_trip;
12744 
12745    ELSE
12746          raise FTE_FREIGHT_PRICING_UTIL.g_invalid_parameters;
12747    END IF;
12748 
12749 
12750    flatten_shipment (
12751      x_first_level_rows        =>    l_first_level_rows,
12752      x_return_status           =>    l_return_status );
12753 
12754    IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
12755       IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
12756          raise FTE_FREIGHT_PRICING_UTIL.g_flatten_shipment_failed;
12757       END IF;
12758    ELSE
12759       IF l_first_level_rows.COUNT = 0 THEN
12760           raise FTE_FREIGHT_PRICING_UTIL.g_empty_delivery;
12761       END IF;
12762       FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'No. of top level lines 6 : '||l_first_level_rows.COUNT);
12763    END IF;
12764 
12765 
12766    IF (p_lane_id_tab.COUNT > 0) THEN
12767 
12768        IF p_lane_id_tab.COUNT <> p_service_lane_tab.COUNT THEN
12769             ROLLBACK TO SHIPMENT_PRICE_COMPARE_PVT;
12770             raise FTE_FREIGHT_PRICING_UTIL.g_missing_service_type;
12771        END IF;
12772 
12773        i := p_lane_id_tab.FIRST;
12774        LOOP
12775 
12776        OPEN c_get_carrier_for_lane(p_lane_id_tab(i));
12777        FETCH c_get_carrier_for_lane INTO l_carrier_id;
12778        CLOSE c_get_carrier_for_lane;
12779 
12780     IF p_trip_id IS NOT NULL THEN
12781          FTE_FREIGHT_PRICING_UTIL.get_currency_code
12782             (
12783                 p_trip_id => p_trip_id,
12784                 p_carrier_id => l_carrier_id,
12785                 x_currency_code   =>   l_currency_code,
12786                 x_return_status   =>   l_return_status
12787             );
12788     ELSE
12789           FTE_FREIGHT_PRICING_UTIL.get_currency_code
12790          (
12791              p_delivery_id => p_delivery_id,
12792              p_carrier_id => l_carrier_id,
12793              x_currency_code   =>   l_currency_code,
12794              x_return_status   =>   l_return_status
12795          );
12796 
12797     END IF;
12798 
12799          shipment_pricing (
12800             p_lane_id                 =>    p_lane_id_tab(i),
12801             p_service_type            =>    p_service_lane_tab(i),
12802                                               -- service type is required with lane/schedule
12803             p_ship_date               =>    p_dep_date,
12804             p_arrival_date            =>    p_arr_date,
12805             p_shpmnt_toplevel_rows    =>    l_first_level_rows,
12806             p_shpmnt_toplevel_charges =>    l_first_level_charges,
12807             p_save_flag               =>    'T',
12808             p_request_id              =>    l_request_id,
12809             p_currency_code           =>    l_currency_code,
12810             x_summary_lanesched_price      => l_lane_summary,
12811             x_summary_lanesched_price_uom  => l_lane_summary_uom,
12812             x_freight_cost_temp_price      => l_dummy_fc_temp_price,
12813             x_freight_cost_temp_charge     => l_dummy_fc_temp_charge,
12814             x_return_status           =>    l_return_status ) ;
12815 
12816             FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'After shipment_pricing - p_lane_id = '||p_lane_id_tab(i));
12817          FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'l_return_status='||l_return_status);
12818             IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
12819                 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
12820                    x_sum_lane_price_tab(i) := -1;
12821                    x_sum_lane_price_curr_tab(i) := 'NULL';
12822                    FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'lane: '||p_lane_id_tab(i)||' shipment_pricing ');
12823                    x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
12827 
12824                 END IF;
12825              ELSE
12826                 FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'Shipment pricing successful for lane : '||p_lane_id_tab(i));
12828                 x_sum_lane_price_tab(i)      := nvl(l_lane_summary,0);
12829                 x_sum_lane_price_curr_tab(i) := l_lane_summary_uom;
12830 
12831              END IF;
12832 
12833        EXIT WHEN i = p_lane_id_tab.LAST;
12834          i := p_lane_id_tab.NEXT(i);
12835        END LOOP;
12836 
12837    END IF;
12838 
12839 
12840    IF (p_sched_id_tab.COUNT > 0) THEN
12841 
12842        IF p_sched_id_tab.COUNT <> p_service_sched_tab.COUNT THEN
12843             ROLLBACK TO SHIPMENT_PRICE_COMPARE_PVT;
12844             raise FTE_FREIGHT_PRICING_UTIL.g_missing_service_type;
12845        END IF;
12846 
12847        i := p_sched_id_tab.FIRST;
12848        LOOP
12849 
12850          shipment_pricing (
12851             p_schedule_id             =>    p_sched_id_tab(i),
12852             p_service_type            =>    p_service_sched_tab(i),
12853                                               -- service type is required with lane/schedule
12854             p_ship_date               =>    p_dep_date,
12855             p_arrival_date            =>    p_arr_date,
12856             p_shpmnt_toplevel_rows    =>    l_first_level_rows,
12857             p_shpmnt_toplevel_charges =>    l_first_level_charges,
12858             p_save_flag               =>    'T',
12859             p_request_id              =>    l_request_id,
12860             x_summary_lanesched_price      => l_sched_summary,
12861             x_summary_lanesched_price_uom  => l_sched_summary_uom,
12862             x_freight_cost_temp_price      => l_dummy_fc_temp_price,
12863             x_freight_cost_temp_charge     => l_dummy_fc_temp_charge,
12864             x_return_status           =>    l_return_status ) ;
12865 
12866             IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
12867                 IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
12868                    x_sum_sched_price_tab(i) := -1;
12869                    x_sum_sched_price_curr_tab(i) := 'NULL';
12870                    FTE_FREIGHT_PRICING_UTIL.set_location(p_loc => 'sched: '||p_sched_id_tab(i)||' shipment_pricing ');
12871                    x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
12872                 END IF;
12873              ELSE
12874                 FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'Shipment pricing successful for sched : '||p_sched_id_tab(i));
12875 
12876                 x_sum_sched_price_tab(i)      := nvl(l_sched_summary,0);
12877                 x_sum_sched_price_curr_tab(i) := l_sched_summary_uom;
12878 
12879              END IF;
12880 
12881        EXIT WHEN i = p_sched_id_tab.LAST;
12882          i := p_sched_id_tab.NEXT(i);
12883        END LOOP;
12884 
12885    END IF;
12886 
12887    x_request_id := l_request_id;
12888 
12889    FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_price_compare_pvt');
12890 
12891 EXCEPTION
12892    WHEN g_finished_warning THEN
12893         x_return_status := WSH_UTIL_CORE.G_RET_STS_WARNING;
12894         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_price_compare_pvt');
12895    WHEN FND_API.G_EXC_ERROR THEN
12896         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
12897         FTE_FREIGHT_PRICING_UTIL.set_exception('shipment_price_compare_pvt',FTE_FREIGHT_PRICING_UTIL.G_ERR,'FND_API.G_EXC_ERROR');
12898         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_price_compare_pvt');
12899    WHEN FTE_FREIGHT_PRICING_UTIL.g_delivery_not_found THEN
12900         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
12901         FTE_FREIGHT_PRICING_UTIL.set_exception('shipment_price_compare_pvt',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_delivery_not_found');
12902         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_price_compare_pvt');
12903    WHEN FTE_FREIGHT_PRICING_UTIL.g_flatten_shipment_failed THEN
12904         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
12905         FTE_FREIGHT_PRICING_UTIL.set_exception('shipment_price_compare_pvt',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_flatten_shipment_failed');
12906         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_price_compare_pvt');
12907    WHEN FTE_FREIGHT_PRICING_UTIL.g_empty_delivery THEN
12908         x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
12909         FTE_FREIGHT_PRICING_UTIL.set_exception('shipment_price_compare_pvt',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_empty_delivery');
12910         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_price_compare_pvt');
12911    WHEN FTE_FREIGHT_PRICING_UTIL.g_missing_service_type THEN
12912         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
12913         FTE_FREIGHT_PRICING_UTIL.set_exception('shipment_price_compare_pvt',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_missing_service_type');
12914         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_price_compare_pvt');
12915    WHEN FTE_FREIGHT_PRICING_UTIL.g_shipment_pricing_failed THEN
12916         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
12917         FTE_FREIGHT_PRICING_UTIL.set_exception('shipment_price_compare_pvt',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_shipment_pricing_failed');
12918         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_price_compare_pvt');
12919    WHEN others THEN
12920         ROLLBACK TO SHIPMENT_PRICE_COMPARE_PVT;
12921         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
12922         FTE_FREIGHT_PRICING_UTIL.set_exception('shipment_price_compare_pvt',FTE_FREIGHT_PRICING_UTIL.G_ERR,'g_others');
12923         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
12924         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_price_compare_pvt');
12925 
12926 END shipment_price_compare_pvt;
12927 
12928 
12929 PROCEDURE FPA_total_commodity_weight(
12930                            p_init_msg_list IN  VARCHAR2 DEFAULT fnd_api.g_true,
12931                            p_delivery_id   IN  NUMBER,
12935                            x_msg_count     OUT NOCOPY NUMBER,
12932                            x_total_comm_wt   OUT NOCOPY NUMBER,
12933                            x_wt_uom        OUT NOCOPY VARCHAR2,
12934                            x_return_status OUT NOCOPY VARCHAR2,
12936                            x_msg_data      OUT NOCOPY VARCHAR2 )
12937 IS
12938 
12939     l_return_status    VARCHAR2(1);
12940     l_log_level     NUMBER := FTE_FREIGHT_PRICING_UTIL.G_LOG;
12941 
12942    CURSOR c_delivery_details(c_delivery_id IN NUMBER) IS
12943    SELECT wdd.delivery_detail_id,
12944           wdd.gross_weight        ,
12945           wdd.weight_uom_code
12946    from   wsh_delivery_details wdd, wsh_delivery_assignments wda
12947    where  wdd.delivery_detail_id = wda.delivery_detail_id
12948    and    wdd.container_flag = 'N'
12949    and      (wda.type IS null  OR wda.type <> 'O')--MDC
12950    and    wda.delivery_id        = c_delivery_id;
12951 
12952    CURSOR c_delivery_wt_uom(c_delivery_id IN NUMBER) IS
12953    SELECT weight_uom_code
12954    FROM   wsh_new_deliveries
12955    WHERE  delivery_id = c_delivery_id;
12956 
12957    l_target_wt_uom   VARCHAR2(30);
12958    l_cum_wt          NUMBER;
12959    l_temp_wt         NUMBER;
12960 
12961 BEGIN
12962 
12963    x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
12964 
12965     -- Initialize message list if p_init_msg_list is set to TRUE.
12966 
12967    FTE_FREIGHT_PRICING_UTIL.initialize_logging( p_init_msg_list  => p_init_msg_list,
12968                                                 x_return_status  => l_return_status );
12969 
12970    IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
12971        IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
12972             x_return_status  :=  l_return_status;
12973             RETURN;
12974        END IF;
12975    ELSE
12976        FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Initialize Logging successful ');
12977    END IF;
12978 
12979 
12980    FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
12981    FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,'FPA_total_commodity_weight','start');
12982 
12983    OPEN c_delivery_wt_uom(p_delivery_id);
12984    FETCH c_delivery_wt_uom INTO l_target_wt_uom;
12985    CLOSE c_delivery_wt_uom;
12986 
12987    IF (l_target_wt_uom IS NULL) THEN
12988      raise fte_freight_pricing_util.g_weight_uom_not_found;
12989    END IF;
12990 
12991    FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'l_target_wt_uom='||l_target_wt_uom);
12992 
12993    l_cum_wt :=0;
12994 
12995    FOR c_det_rec IN c_delivery_details(p_delivery_id) LOOP
12996 
12997      IF (c_det_rec.gross_weight IS NULL OR c_det_rec.weight_uom_code IS NULL) THEN
12998        FTE_FREIGHT_PRICING_UTIL.setmsg (p_api =>'FPA_total_commodity_weight',
12999                                          p_exc =>'g_tl_dtl_no_gross_weight',
13000                                          p_msg_name =>'FTE_INVALID_DEL_DET_WT',
13001                                          p_delivery_detail_id =>c_det_rec.delivery_detail_id);
13002        raise fte_freight_pricing_util.g_tl_dtl_no_gross_weight;
13003      END IF;
13004 
13005      IF (c_det_rec.weight_uom_code <> l_target_wt_uom) THEN
13006             l_temp_wt :=  WSH_WV_UTILS.convert_uom(c_det_rec.weight_uom_code,
13007                                        l_target_wt_uom,
13008                                        c_det_rec.gross_weight,
13009                                        0);  -- Within same UOM class
13010 
13011         l_cum_wt := l_cum_wt + l_temp_wt;
13012      ELSE
13013         l_cum_wt := l_cum_wt + c_det_rec.gross_weight;
13014      END IF;
13015 
13016    END LOOP;
13017 
13018    FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'l_cum_wt='||l_cum_wt);
13019    x_total_comm_wt := l_cum_wt;
13020    x_wt_uom := l_target_wt_uom;
13021 
13022    -- Standard call to get message count and if count is 1,
13023    -- get message info.
13024    FND_MSG_PUB.Count_And_Get (
13025      p_count         =>      x_msg_count,
13026      p_data          =>      x_msg_data );
13027 
13028    FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'FPA_total_commodity_weight');
13029    FTE_FREIGHT_PRICING_UTIL.close_logs;
13030 
13031 EXCEPTION
13032    WHEN FTE_FREIGHT_PRICING_UTIL.g_tl_dtl_no_gross_weight THEN
13033         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
13034         FTE_FREIGHT_PRICING_UTIL.set_exit_exception('FPA_total_commodity_weight','g_tl_dtl_no_gross_weight');
13035         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'FPA_total_commodity_weight');
13036         FTE_FREIGHT_PRICING_UTIL.close_logs;
13037    WHEN FTE_FREIGHT_PRICING_UTIL.g_weight_uom_not_found THEN
13038         FTE_FREIGHT_PRICING_UTIL.setmsg (p_api =>'FPA_total_commodity_weight',
13039                                          p_exc =>'g_tl_dtl_no_gross_weight',
13040                                          p_msg_name =>'FTE_INVALID_DEL_WT_UOM',
13041                                          p_delivery_id =>p_delivery_id);
13042         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
13043         FTE_FREIGHT_PRICING_UTIL.set_exit_exception('FPA_total_commodity_weight','g_weight_uom_not_found');
13044         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'FPA_total_commodity_weight');
13045         FTE_FREIGHT_PRICING_UTIL.close_logs;
13046    WHEN others THEN
13047         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
13048         FTE_FREIGHT_PRICING_UTIL.set_exit_exception('FPA_total_commodity_weight','g_others');
13049         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
13050         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'FPA_total_commodity_weight');
13051         FTE_FREIGHT_PRICING_UTIL.close_logs;
13052 END FPA_total_commodity_weight;
13053 
13054 
13055 
13056 
13060 --      It returns PL/SQL tables (dense) of summary price in the same sequence as the input
13057 --      This API is called from the Multi-leg UI for price comparison across lanes/schedules
13058 --      It stores frieght cost details in WSH_FREIGHT_COSTS_TEMP table for all the lanes
13059 --      for display purpose.
13061 --      Calls shipment hierarchy flattening API
13062 
13063 PROCEDURE shipment_price_compare (
13064 	p_init_msg_list           IN     VARCHAR2 DEFAULT fnd_api.g_true,
13065 	p_init_prc_log	        IN  VARCHAR2 DEFAULT 'Y',
13066 	p_delivery_id             IN     NUMBER,
13067 	p_trip_id		IN 	NUMBER,
13068 	p_lane_sched_id_tab        IN  FTE_ID_TAB_TYPE, -- lane_ids or schedule_ids
13069 	p_lane_sched_tab           IN  FTE_CODE_TAB_TYPE, -- 'L' or 'S'  (Lane or Schedule)
13070 	p_mode_tab                 IN  FTE_CODE_TAB_TYPE,
13071 	p_service_type_tab         IN  FTE_CODE_TAB_TYPE,
13072 	p_vehicle_type_tab           IN  FTE_ID_TAB_TYPE,
13073 	p_dep_date                IN     DATE DEFAULT sysdate,
13074 	p_arr_date                IN     DATE DEFAULT sysdate,
13075 	p_pickup_location_id IN NUMBER,
13076 	p_dropoff_location_id IN NUMBER,
13077 	x_lane_sched_id_tab        OUT  NOCOPY FTE_ID_TAB_TYPE, -- lane_ids or schedule_ids
13078 	x_lane_sched_tab           OUT  NOCOPY FTE_CODE_TAB_TYPE, -- 'L' or 'S'  (Lane or Schedule)
13079 	x_vehicle_type_tab    OUT  NOCOPY FTE_ID_TAB_TYPE,--Vehicle Type ID
13080 	x_mode_tab                 OUT  NOCOPY FTE_CODE_TAB_TYPE,
13081 	x_service_type_tab         OUT NOCOPY FTE_CODE_TAB_TYPE,
13082 	x_sum_rate_tab             OUT NOCOPY FTE_ID_TAB_TYPE,
13083 	x_sum_rate_curr_tab        OUT NOCOPY FTE_CODE_TAB_TYPE,
13084 	x_request_id              OUT NOCOPY     NUMBER,     -- One request ID per comparison request
13085 	x_return_status           OUT NOCOPY     VARCHAR2 )
13086 IS
13087 
13088 
13089 CURSOR c_get_req_id IS
13090 SELECT fte_pricing_comp_request_s.nextval
13091 FROM   sys.dual;
13092 
13093 
13094 
13095    l_return_status                   VARCHAR2(1);
13096    l_request_id            NUMBER;
13097    i                       NUMBER;
13098    j                       NUMBER;
13099    k			   NUMBER;
13100    l			   NUMBER;
13101    s			   NUMBER;
13102 
13103 
13104    l_lane_id_tab             WSH_UTIL_CORE.id_tab_type;
13105    l_sched_id_tab            WSH_UTIL_CORE.id_tab_type;
13106    l_service_lane_tab        WSH_UTIL_CORE.Column_Tab_Type;
13107    l_service_sched_tab       WSH_UTIL_CORE.Column_Tab_Type;
13108 
13109    l_sum_lane_price_tab      WSH_UTIL_CORE.id_tab_type;
13110    l_sum_lane_price_curr_tab WSH_UTIL_CORE.Column_tab_type;
13111    l_sum_sched_price_tab     WSH_UTIL_CORE.id_tab_type;
13112    l_sum_sched_price_curr_tab WSH_UTIL_CORE.Column_tab_type;
13113 
13114 l_tl_lane_rows         dbms_utility.number_array;
13115 l_tl_schedule_rows     dbms_utility.number_array;
13116 l_tl_vehicle_rows      dbms_utility.number_array;
13117 l_tl_lane_sched_sum_rows   dbms_utility.number_array;
13118 l_tl_lane_sched_curr_rows  dbms_utility.name_array;
13119 l_tl_xref           dbms_utility.number_array;
13120 
13121 l_exploded_lane_rows         dbms_utility.number_array;
13122 l_exploded_schedule_rows     dbms_utility.number_array;
13123 l_exploded_vehicle_rows      dbms_utility.number_array;
13124 l_exploded_ref_rows      dbms_utility.number_array;
13125 
13126 l_output_count NUMBER;
13127 l_ref NUMBER;
13128 l_warn_flag VARCHAR2(1);
13129 l_tl_ref dbms_utility.number_array;
13130 l_lane_xref dbms_utility.number_array;
13131 l_sched_xref dbms_utility.number_array;
13132 
13133     l_log_level     NUMBER := FTE_FREIGHT_PRICING_UTIL.G_LOG;
13134 
13135    l_ret_stat               VARCHAR2(1);  -- used only for returning log file name
13136 
13137    PRAGMA AUTONOMOUS_TRANSACTION;
13138 
13139 BEGIN
13140 
13141    SAVEPOINT SHIPMENT_PRICE_COMPARE;
13142 
13143    x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
13144 
13145    IF(p_init_prc_log='Y')
13146    THEN
13147 
13148 
13149 
13150 
13151 	   FTE_FREIGHT_PRICING_UTIL.initialize_logging( p_init_msg_list  => p_init_msg_list,
13152 							x_return_status  => l_return_status );
13153 
13154 	   IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS THEN
13155 	       IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_WARNING THEN
13156 		    x_return_status  :=  l_return_status;
13157 		    RETURN;
13158 	       END IF;
13159 	   ELSE
13160 	       FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Initialize Logging successful ');
13161 	   END IF;
13162 
13163    END IF;
13164 
13165    FTE_FREIGHT_PRICING_UTIL.reset_dbg_vars;
13166    FTE_FREIGHT_PRICING_UTIL.set_method(l_log_level,'shipment_price_compare','start');
13167 
13168    FTE_FREIGHT_PRICING_UTIL.print_msg(p_msg => 'p_delivery_id='||p_delivery_id);
13169 
13170 
13171    l_warn_flag := 'N';
13172 
13173    j:=1;
13174    k:=1;
13175    l:=1;
13176    i:=p_lane_sched_tab.FIRST;
13177    WHILE( i IS NOT NULL)
13178    LOOP
13179    	IF((p_lane_sched_tab(i)='L') AND (p_mode_tab(i) IS NOT NULL) AND (p_mode_tab(i)='TRUCK'))
13180    	THEN
13181    		l_tl_lane_rows(j):=p_lane_sched_id_tab(i);
13182    		l_tl_schedule_rows(j):=NULL;
13183    		l_tl_vehicle_rows(j):=p_vehicle_type_tab(i);
13184    		l_tl_ref(j):=i;
13185    		j:=j+1;
13186 
13187 
13188    	ELSIF((p_lane_sched_tab(i)='S') AND (p_mode_tab(i) IS NOT NULL) AND (p_mode_tab(i)='TRUCK'))
13189    	THEN
13190 
13191 		l_tl_lane_rows(j):=NULL;
13192 		l_tl_schedule_rows(j):=p_lane_sched_id_tab(i);
13193 		l_tl_vehicle_rows(j):=p_vehicle_type_tab(i);
13194 		l_tl_ref(j):=i;
13195 		j:=j+1;
13196 
13197 
13198    	ELSIF(p_lane_sched_tab(i)='L')
13199    	THEN
13200 
13201                l_lane_id_tab(k)       := p_lane_sched_id_tab(i);
13205 
13202                l_service_lane_tab(k)  := p_service_type_tab(i);
13203                l_lane_xref(k)         := i; -- xref to input index
13204                k:=k+1;
13206 
13207    	ELSIF(p_lane_sched_tab(i)='S')
13208    	THEN
13209 
13210                l_sched_id_tab(l)       := p_lane_sched_id_tab(i);
13211                l_service_sched_tab(l)  := p_service_type_tab(i);
13212                l_sched_xref(l)         := i; -- xref to input index
13213                l:=l+1;
13214 
13215    	END IF;
13216 
13217    	i:=p_lane_sched_tab.NEXT(i);
13218    END LOOP;
13219 
13220 	OPEN c_get_req_id;
13221 	FETCH c_get_req_id INTO l_request_id;
13222 	CLOSE c_get_req_id;
13223 	x_request_id := l_request_id;
13224 
13225 
13226    -- Call new internal API
13227 
13228 
13229     shipment_price_compare_pvt (
13230         p_delivery_id             =>     p_delivery_id,
13231         p_trip_id                 =>     NULL,
13232         p_lane_id_tab             =>     l_lane_id_tab,
13233         p_sched_id_tab            =>     l_sched_id_tab,
13234         p_service_lane_tab        =>     l_service_lane_tab,
13235         p_service_sched_tab       =>     l_service_sched_tab,
13236         p_dep_date                =>     p_dep_date,
13237         p_arr_date                =>     p_arr_date,
13238         x_sum_lane_price_tab      =>     l_sum_lane_price_tab,
13239         x_sum_lane_price_curr_tab =>     l_sum_lane_price_curr_tab,
13240         x_sum_sched_price_tab     =>     l_sum_sched_price_tab,
13241         x_sum_sched_price_curr_tab =>    l_sum_sched_price_curr_tab,
13242         x_request_id              =>     l_request_id,
13243         x_return_status           =>     l_return_status );
13244 
13245      x_request_id   := l_request_id;
13246 
13247 	 FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'l_return_status='||l_return_status);
13248 
13249 	 IF (l_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR ) THEN
13250 		  raise fte_freight_pricing_util.g_unexp_err;
13251 	 ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_ERROR ) THEN
13252 		  --raise fte_freight_pricing_util.g_ship_prc_compare_fail;
13253 		  --In case of expected errors in shipment_price_compare_pvt
13254 		  ---Allow this procedure to continue to TL if necessary
13255 		  x_return_status := l_return_status;
13256 		  l_warn_flag := 'Y';
13257 
13258 	 ELSIF (l_return_status = WSH_UTIL_CORE.G_RET_STS_WARNING ) THEN
13259 
13260 		  x_return_status := l_return_status;
13261 		  l_warn_flag := 'Y';
13262 	 END IF;
13263 
13264 
13265 
13266       	IF (l_tl_lane_rows.COUNT > 0)
13267       	THEN
13268 
13269 		--Delivery validation is already handled by shipment_price_compare_pvt
13270 
13271 
13272        		FTE_TL_RATING.Get_Vehicles_For_LaneSchedules(
13273 			p_trip_id	=>NULL,
13274 			p_lane_rows	=>l_tl_lane_rows,
13275 			p_schedule_rows =>l_tl_schedule_rows,
13276 			p_vehicle_rows	=>l_tl_vehicle_rows,
13277 			x_vehicle_rows  =>l_exploded_vehicle_rows,
13278 			x_lane_rows 	=>l_exploded_lane_rows,
13279 			x_schedule_rows =>l_exploded_schedule_rows,
13280 			x_ref_rows	=>l_exploded_ref_rows,
13281 			x_return_status =>l_return_status);
13282 
13283 	      	IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS
13284 	      	THEN
13285 		 	IF l_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR
13286 		 	THEN
13287 		    		raise FTE_FREIGHT_PRICING_UTIL.g_unexp_err;
13288 	      		END IF;
13289 	      	END IF;
13290 
13291 
13292 
13293 
13294 
13295       		FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'>>6');
13296 
13297 		FTE_TL_RATING.TL_DELIVERY_PRICE_COMPARE(
13298 			p_wsh_delivery_id=>p_delivery_id,
13299 			p_lane_rows=>l_exploded_lane_rows,
13300 			p_schedule_rows=>l_exploded_schedule_rows,
13301 			p_vehicle_rows=>l_exploded_vehicle_rows,
13302 			p_dep_date=>p_dep_date,
13303 			p_arr_date=>p_arr_date,
13304 			p_pickup_location_id=>p_pickup_location_id,
13305 			p_dropoff_location_id=>p_dropoff_location_id,
13306 			x_request_id=>l_request_id,
13307 			x_lane_sched_sum_rows=>l_tl_lane_sched_sum_rows,
13308 			x_lane_sched_curr_rows=>l_tl_lane_sched_curr_rows,
13309 			x_return_status=>l_return_status);
13310 
13311 
13312               -- Error checking here
13313               -- For now only unexpected errors returned cause this procedure to fail
13314               -- However, we can go more granular, and fail even on certain
13315               -- errors caused in the child procedures
13316 
13317 	      FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'>>l_return_status='||l_return_status);
13318 		      IF l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS
13319 		      THEN
13320 			 IF l_return_status = WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR
13321 			 THEN
13322 			    raise FTE_FREIGHT_PRICING_UTIL.g_unexp_err;
13323 			 ELSE
13324 			  --In case of expected errors
13325 			  ---Allow this procedure to continue if necessary
13326 				l_warn_flag := 'Y';
13327 		         END IF;
13328 		       END IF;
13329 	      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);
13330 
13331 
13332 	END IF;
13333 
13334 
13335 ---Recombine results
13336 
13337 
13338 
13339 
13340 
13341       l_output_count:=p_lane_sched_id_tab.COUNT;
13342       IF (l_tl_lane_rows.COUNT > 0)
13343       THEN
13344       	l_output_count:=l_output_count+ l_exploded_ref_rows.COUNT-l_tl_lane_rows.COUNT;
13345       END IF;
13346 
13347       -- initialize output nested tables
13348       IF (p_lane_sched_id_tab.COUNT > 0 )
13349       THEN
13350 
13351       	      FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Init op tables');
13352 
13356 
13353 	      x_sum_rate_tab := FTE_ID_TAB_TYPE(0);
13354 	      x_sum_rate_curr_tab := FTE_CODE_TAB_TYPE('NULL');
13355 	      -- init all elements  the tables with 0 and 'NULL' resp.
13357 	      x_lane_sched_id_tab:=FTE_ID_TAB_TYPE(0);
13358 	      x_lane_sched_tab:=FTE_CODE_TAB_TYPE('NULL');
13359 	      x_vehicle_type_tab:=FTE_ID_TAB_TYPE(0);
13360 	      x_mode_tab:=FTE_CODE_TAB_TYPE('NULL');
13361 	      x_service_type_tab:=FTE_CODE_TAB_TYPE('NULL');
13362 
13363 
13364 	      x_sum_rate_tab.EXTEND(l_output_count-1,1);
13365 	      x_sum_rate_curr_tab.EXTEND(l_output_count-1,1);
13366 
13367 	      x_lane_sched_id_tab.EXTEND(l_output_count-1,1);
13368 	      x_lane_sched_tab.EXTEND(l_output_count-1,1);
13369 	      x_vehicle_type_tab.EXTEND(l_output_count-1,1);
13370 	      x_mode_tab.EXTEND(l_output_count-1,1);
13371 	      x_service_type_tab.EXTEND(l_output_count-1,1);
13372 
13373 	      FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Init op tables End');
13374 
13375       END IF;
13376 
13377 
13378 
13379       L :=l_sum_lane_price_tab.FIRST;
13380       S:=l_sum_sched_price_tab.FIRST;
13381       j:=l_tl_lane_rows.FIRST;
13382       i:=p_lane_sched_id_tab.FIRST;
13383       k:=x_sum_rate_tab.FIRST;
13384       l_ref:=l_exploded_ref_rows.FIRST;
13385 
13386       WHILE(k<=l_output_count)
13387       LOOP
13388 	FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Op index:'||k);
13389 
13390          IF (p_mode_tab(i) <> 'TRUCK' )
13391          THEN
13392            IF (p_lane_sched_tab(i) = 'L')
13393            THEN
13394 
13395                FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Non TL Lane:');
13396                IF ((l_sum_lane_price_tab.EXISTS(L)) AND (l_sum_lane_price_curr_tab.EXISTS(L)))
13397 	       THEN
13398 		       x_sum_rate_tab(k)      := l_sum_lane_price_tab(L);
13399 		       x_sum_rate_curr_tab(k) := l_sum_lane_price_curr_tab(L);
13400 	       END IF;
13401 
13402 	       x_lane_sched_id_tab(k):=p_lane_sched_id_tab(i);
13403 	       x_lane_sched_tab(k):=p_lane_sched_tab(i);
13404 	       x_vehicle_type_tab(k):=p_vehicle_type_tab(i);
13405 	       x_mode_tab(k):=p_mode_tab(i);
13406 	       x_service_type_tab(k):=p_service_type_tab(i);
13407 
13408 
13409                L := L + 1;
13410                k:=k+1;
13411 
13412                FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Non TL Lane ENd:');
13413 
13414            ELSIF (p_lane_sched_tab(i) = 'S')
13415            THEN
13416 
13417                FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Non TL Schedule:');
13418 
13419                IF ((l_sum_sched_price_tab.EXISTS(S)) AND (l_sum_sched_price_curr_tab.EXISTS(S)))
13420 	       THEN
13421 
13422 		       x_sum_rate_tab(k)      := l_sum_sched_price_tab(S);
13423 		       x_sum_rate_curr_tab(k) := l_sum_sched_price_curr_tab(S);
13424 	       END IF;
13425 
13426 	       x_lane_sched_id_tab(k):=p_lane_sched_id_tab(i);
13427 	       x_lane_sched_tab(k):=p_lane_sched_tab(i);
13428 	       x_vehicle_type_tab(k):=p_vehicle_type_tab(i);
13429 	       x_mode_tab(k):=p_mode_tab(i);
13430 	       x_service_type_tab(k):=p_service_type_tab(i);
13431 
13432 
13433 
13434                S := S + 1;
13435                k:=k+1;
13436 
13437                FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'Non TL Schedule End:');
13438 
13439            END IF;
13440 
13441          ELSIF (p_mode_tab(i) = 'TRUCK' )
13442          THEN
13443 
13444               FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'TL :');
13445               FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'l_ref'||l_ref);
13446               FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'j'||j);
13447               FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'l_exploded_ref_rows count'||l_exploded_ref_rows.COUNT);
13448 
13449 	       WHILE(l_exploded_ref_rows.EXISTS(l_ref) AND l_exploded_ref_rows(l_ref)=j)
13450 	       LOOP
13451 
13452 		      FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'l_exploded_ref_rows(l_ref)'||l_exploded_ref_rows(l_ref));
13453 
13454 		      --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));
13455 
13456 	       	       FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'TL 1:');
13457 	       	       x_sum_rate_tab(k):=-1;
13458 		       IF (l_tl_lane_sched_sum_rows.EXISTS(l_ref))
13459 		       THEN
13460 			x_sum_rate_tab(k)       := nvl(l_tl_lane_sched_sum_rows(l_ref),-1);
13461 		       END IF;
13462 
13463 		       FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'TL 2:');
13464 		       x_sum_rate_curr_tab(k):='NULL';
13465 		       IF(l_tl_lane_sched_curr_rows.EXISTS(l_ref))
13466 		       THEN
13467 			x_sum_rate_curr_tab(k)  := nvl(l_tl_lane_sched_curr_rows(l_ref),'NULL');
13468 		       END IF;
13469 		       FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'TL 3:');
13470 
13471 		       x_lane_sched_id_tab(k):=p_lane_sched_id_tab(i);
13472 		       FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'TL 4:');
13473 		       x_lane_sched_tab(k):=p_lane_sched_tab(i);
13474 		       FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'TL 5:');
13475 		       IF (l_exploded_vehicle_rows.EXISTS(l_ref))
13476 		       THEN
13477 			x_vehicle_type_tab(k):=l_exploded_vehicle_rows(l_ref);
13478 		       END IF;
13479 		       FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'TL 6:');
13480 		       x_mode_tab(k):=p_mode_tab(i);
13481 		       FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'TL 7:');
13482 		       x_service_type_tab(k):=p_service_type_tab(i);
13483 		       FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'TL 8:');
13484 
13485                   --FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,
13486                   --' '||l_ref||'-'||i||'-'||l_lane_sched_sum_rows(l_ref)||'-'||l_lane_sched_curr_rows(l_ref));
13487 
13488 
13489 		       k:=k+1;
13490 
13491 		       l_ref:=l_ref+1;
13492 	       END LOOP;
13493 
13494 	   j := j + 1;
13495 
13496 	   FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'TL End:');
13497 
13498 	 END IF;
13499 
13500 
13501       	i:=i+1;
13502       END LOOP;
13503 
13504 
13505 
13506       IF (x_sum_rate_tab.COUNT > 0) THEN
13507 	      FOR i IN x_sum_rate_tab.FIRST .. x_sum_rate_tab.LAST
13508 	      LOOP
13509 		      FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,
13510 		       ' '||x_lane_sched_id_tab(i)||' '||x_lane_sched_tab(i)||' '||x_mode_tab(i)||' '||x_service_type_tab(i)||' '
13511 		     ||x_vehicle_type_tab(i)||' '||x_sum_rate_tab(i)||' '||x_sum_rate_curr_tab(i) );
13512 	      END LOOP;
13513       END IF;
13514 
13515 
13516 	FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'warn flag'||l_warn_flag);
13517 
13518 	 IF (l_warn_flag = 'Y' ) THEN
13519 		   -- bug 2762257
13520 		   FTE_FREIGHT_PRICING_UTIL.set_price_comp_exit_warn;
13521 		   --Added to ensure return status is warning if l_warn_flag=Y
13522 		   x_return_status :=WSH_UTIL_CORE.G_RET_STS_WARNING;
13523 	 END IF;
13524 
13525 	FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'DBg.2');
13526 	 x_request_id := l_request_id;
13527 FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'DBg.3');
13528 
13529    COMMIT;  --  Commit Autonomous transaction
13530 
13531    FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_DBG,'DBg.4');
13532    FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_price_compare');
13533    IF(p_init_prc_log='Y')
13534    THEN
13535 	FTE_FREIGHT_PRICING_UTIL.close_logs;
13536    END IF;
13537 
13538 
13539 
13540 
13541 EXCEPTION
13542 
13543 
13544 
13545    WHEN FTE_FREIGHT_PRICING_UTIL.g_ship_prc_compare_fail THEN
13546         ROLLBACK; -- TO SHIPMENT_PRICE_COMPARE;
13547         x_return_status := WSH_UTIL_CORE.G_RET_STS_ERROR;
13548         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_price_compare');
13549 	IF(p_init_prc_log='Y')
13550 	THEN
13551 		FTE_FREIGHT_PRICING_UTIL.close_logs;
13552 	END IF;
13553 
13554 
13555    WHEN FTE_FREIGHT_PRICING_UTIL.g_unexp_err THEN
13556         ROLLBACK; -- TO SHIPMENT_PRICE_COMPARE;
13557         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
13558         FTE_FREIGHT_PRICING_UTIL.set_exit_exception('shipment_price_compare','g_others');
13559         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_price_compare');
13560 	IF(p_init_prc_log='Y')
13561 	THEN
13562 		FTE_FREIGHT_PRICING_UTIL.close_logs;
13563 	END IF;
13564 
13565    WHEN others THEN
13566         ROLLBACK; -- TO SHIPMENT_PRICE_COMPARE;
13567         x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR;
13568         FTE_FREIGHT_PRICING_UTIL.set_exit_exception('shipment_price_compare','g_others');
13569         FTE_FREIGHT_PRICING_UTIL.print_msg(FTE_FREIGHT_PRICING_UTIL.G_ERR,'Unexpected Error : '||SQLCODE||' : '||SQLERRM);
13570         FTE_FREIGHT_PRICING_UTIL.unset_method(l_log_level,'shipment_price_compare');
13571 	IF(p_init_prc_log='Y')
13572 	THEN
13573 		FTE_FREIGHT_PRICING_UTIL.close_logs;
13574 	END IF;
13575 
13576 
13577 END shipment_price_compare;
13578 
13579 
13580 END FTE_FREIGHT_PRICING;
13581