DBA Data[Home] [Help]

PACKAGE BODY: APPS.FTE_VALIDATION_PKG

Source


1 PACKAGE BODY FTE_VALIDATION_PKG AS
2 /* $Header: FTEVALDB.pls 120.10.12000000.2 2007/01/20 11:06:41 htnguyen ship $ */
3   -- -------------------------------------------------------------------------- --
4   --                                                                            --
5   -- NAME:        FTE_VALIDATION_PKG                                            --
6   -- TYPE:        PACKAGE BODY                                                  --
7   -- DESCRIPTION: Contains Rate Chart Validations for Bulk Loader purposes      --
8   --                                                                            --
9   -- PROCEDURES AND FUNCTIONS:							--
10   --		FUNCTIONS:	IS_VALID_PRICELIST				--
11   --				GET_COLUMN					--
12   --				GET_FREQ_CODE					--
13   --				CALCULATE_FREQ_ARRIVAL				--
14   --										--
15   --		PROCEDURES:	VALIDATE_DATE					--
16   --				ADD_ATTRIBUTE					--
17   --				VALIDATE_CURRENCY				--
18   --				VALIDATE_COLUMNS				--
19   --				VALIDATE_CARRIER				--
20   --				VALIDATE_LANE_NUMBER				--
21   --				VALIDATE_LINE_NUMBER				--
22   --				VALIDATE_ACTION					--
23   --				VALIDATE_UOM					--
24   --				VALIDATE_MODE_OF_TRANS				--
25   --				VALIDATE_CARRIER_SERVICE			--
26   --				VALIDATE_ZONE					--
27   --				VALIDATE_REGION					--
28   --				VALIDATE_RATING_ZONE_CHART			--
29   --				VALIDATE_RATING_SETUP				--
30   --				VALIDATE_ORIGIN					--
31   --				VALIDATE_DESTINATION				--
32   --				VALIDATE_LANE_RATE_CHART			--
33   --				VALIDATE_LANE_COMMODITY				--
34   --				VALIDATE_LANE_SERVICE_LEVEL			--
35   --				VALIDATE_SERVICE				--
36   --				VALIDATE_SERVICE_RATING_SETUP			--
37   --				VALIDATE_SCHEDULE				--
38   --				VALIDATE_SUBTYPE				--
39   --				VALIDATE_SERVICE_LEVEL				--
40   --				VALIDATE_RATE_CHART				--
41   --				VALIDATE_RATE_LINE				--
42   --				VALIDATE_RATE_BREAK				--
43   --                                                                            --
44   ----------------------------------------------------------------------------- --
45 
46   G_PKG_NAME    CONSTANT        VARCHAR2(50) := 'FTE_VALIDATION_PKG';
47   G_CURDATE     DATE := sysdate;
48 
49 
50   -----------------------------------------------------------------------------
51   -- PROCEDURE: VALIDATE_DATE
52   --
53   -- Purpose: validate a date format
54   --
55   -- IN Parameters
56   --    1. p_date:		date to be verified
57   --
58   -- Out Parameters
59   --    1. x_status:	status, -1 when no errors
60   --	2. x_error_msg:	error message if any
61   -----------------------------------------------------------------------------
62 
63   PROCEDURE VALIDATE_DATE(p_date		IN   OUT NOCOPY VARCHAR2,
64 			  p_line_number		IN   NUMBER,
65                           x_status              OUT  NOCOPY  NUMBER,
66 			  x_error_msg		OUT  NOCOPY  VARCHAR2) IS
67 
68   l_module_name      		CONSTANT VARCHAR2(100) := 'fte.plsql.' || G_PKG_NAME || '.VALIDATE_DATE';
69 
70   BEGIN
71     FTE_UTIL_PKG.ENTER_DEBUG(l_module_name);
72 
73     x_status := -1;
74 
75     IF (p_date IS NOT NULL) THEN
76       BEGIN
77         p_date := TO_DATE(p_date, FTE_BULKLOAD_PKG.G_DATE_FORMAT);
78       EXCEPTION
79         WHEN OTHERS THEN
80 	  BEGIN
81 	    p_date := TO_DATE(p_date, FTE_BULKLOAD_PKG.G_DATE_FORMAT3);
82 	  EXCEPTION
83 	    WHEN OTHERS THEN
84               x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name   => 'FTE_CAT_INCORRECT_DATE',
85 	  			  	          p_tokens => STRINGARRAY('DATE'),
86 					          p_values => STRINGARRAY(p_date));
87               FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
88                      		    	 p_msg	  	=> x_error_msg,
89                    		    	 p_category	=> 'D',
90 				    	 p_line_number	=> p_line_number);
91               FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
92               x_status := 1;
93               RETURN;
94           END;
95       END;
96 
97       IF (p_date IS NULL) THEN
98         x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name   => 'FTE_CAT_INCORRECT_DATE',
99 					    p_tokens => STRINGARRAY('DATE'),
100 					    p_values => STRINGARRAY(p_date));
101         FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
102                      		    p_msg	  	=> x_error_msg,
103                    		    p_category		=> 'D',
104 				    p_line_number	=> p_line_number);
105         FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
106         x_status := 1;
107         RETURN;
108       END IF;
109     END IF;
110     FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
111   EXCEPTION
112     WHEN OTHERS THEN
113       x_error_msg := sqlerrm;
114       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name => l_module_name,
115              			  p_msg   	=> sqlerrm,
116              			  p_category    => 'O',
117 	        		  p_line_number	=> p_line_number);
118       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
119       x_status := 1;
120       RETURN;
121   END VALIDATE_DATE;
122 
123   -----------------------------------------------------------------------------
124   -- PROCEDURE: ADD_ATTRIBUTE
125   --
126   -- Purpose: Store a pricing attribute in the temporary attribute tables for
127   --          later insertion into QP_INTERFACE_PRICING_ATTRIBS.
128   --
129   -- IN Parameters
130   --    1. p_pricing_attribute: The pricing attribute
131   --    2. p_attr_value_from: 	The value of the pricing attribute
132   --	3. p_attr_value_to:
133   --    4. p_line_number: 	The line number for this pricing attribute.
134   --	5. p_comp_operator:	comparison operator
135   --	6. p_qp_pricing_attrib_tbl:	pl/sql table for pricing attributes
136   --
137   -- Out Parameters
138   --    1. x_status:	status, -1 when no errors
139   --	2. x_error_msg:	error message if any
140   -----------------------------------------------------------------------------
141 
142   PROCEDURE ADD_ATTRIBUTE(p_pricing_attribute   IN   VARCHAR2,
143                           p_attr_value_from     IN   VARCHAR2,
144                           p_attr_value_to       IN   VARCHAR2,
145                           p_line_number         IN   VARCHAR2,
146                           p_context             IN   VARCHAR2,
147                           p_comp_operator       IN   VARCHAR2,
148 			  p_qp_pricing_attrib_tbl	IN OUT	NOCOPY FTE_RATE_CHART_PKG.qp_pricing_attrib_tbl,
149                           x_status              OUT  NOCOPY  NUMBER,
150 			  x_error_msg		OUT  NOCOPY  VARCHAR2) IS
151 
152   l_pricing_attr_datatype      	VARCHAR2(30);
153   l_comp_operator              	VARCHAR2(30);
154   l_pricing_attribute          	VARCHAR2(50);
155   l_pricing_attribute_value    	VARCHAR2(50);
156   l_count			NUMBER;
157   l_module_name      		CONSTANT VARCHAR2(100) := 'fte.plsql.' || G_PKG_NAME || '.ADD_ATTRIBUTE';
158 
159   BEGIN
160     FTE_UTIL_PKG.ENTER_DEBUG(l_module_name);
161 
162     IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
163       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Attribute', p_pricing_attribute);
164       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Value from', p_attr_value_from);
165       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Value to', p_attr_value_to);
166       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Line Number', p_line_number);
167       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Context', p_context);
168       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Comparison operator', p_comp_operator);
169     END IF;
170     x_status                 := -1;
171 
172     l_pricing_attr_datatype  := 'C';
173     l_comp_operator          := NULL;
174     l_pricing_attribute      := p_pricing_attribute;
175 
176     IF (p_comp_operator = 'BETWEEN') THEN
177       l_pricing_attr_datatype  := 'N';
178     END IF;
179 
180     -- change PARCEL_MULTIPIECE_FLAG to MULTIPIECE_FLAG
181     IF (p_pricing_attribute= 'PARCEL_MULTIPIECE_FLAG') THEN
182       l_pricing_attribute := 'MULTIPIECE_FLAG';
183     END IF;
184 
185     IF (p_pricing_attribute = 'COMMODITY_TYPE') OR (p_pricing_attribute = 'COMMODITY') THEN
186       l_pricing_attribute := 'COMMODITY';
187     END IF;
188 
189     IF (p_pricing_attribute = 'CONTAINER_TYPE' AND FTE_RATE_CHART_PKG.g_chart_type = 'FTE_RATE_CHART') THEN
190       l_pricing_attribute := 'CONTAINER_TYPE';
191     END IF;
192 
193     IF (p_pricing_attribute = 'VEHICLE') THEN
194       l_pricing_attr_datatype := 'N';
195     END IF;
196 
197     IF (p_pricing_attribute = 'ORIGIN_ZONE' OR  p_pricing_attribute = 'DESTINATION_ZONE' OR
198       p_pricing_attribute = 'COMMODITY'   OR  p_pricing_attribute = 'TOTAL_SHIPMENT_QUANTITY') THEN
199       l_pricing_attr_datatype := 'N';
200     END IF;
201 
202     IF (p_pricing_attribute = 'SERVICE_LEVEL') THEN
203       l_pricing_attribute := 'SERVICE_TYPE';
204     END IF;
205 
206     IF (p_comp_operator IS NULL) THEN
207       IF (p_attr_value_from IS NOT NULL AND p_attr_value_to IS NOT NULL) THEN
208         l_comp_operator := 'BETWEEN';
209         --assume here that the datatype is a number.
210         l_pricing_attr_datatype := 'N';
211       ELSIF (p_attr_value_from IS NOT NULL) THEN
212         l_comp_operator := '=';
213       END IF;
214     ELSE
215       l_comp_operator := p_comp_operator;
216     END IF;
217 
218     l_count := p_qp_pricing_attrib_tbl.COUNT+1;
219 
220     p_qp_pricing_attrib_tbl(l_count).PROCESS_ID               	:= FTE_RATE_CHART_PKG.G_Process_Id;
221     p_qp_pricing_attrib_tbl(l_count).PRODUCT_UOM_CODE         	:= FTE_RATE_CHART_PKG.G_Product_UOM;
222     p_qp_pricing_attrib_tbl(l_count).PRICING_ATTRIBUTE_DATATYPE := l_pricing_attr_datatype;
223     p_qp_pricing_attrib_tbl(l_count).ATTRIBUTE_GROUPING_NO      := 1;
224     p_qp_pricing_attrib_tbl(l_count).LIST_LINE_NO             	:= p_line_number;
225     p_qp_pricing_attrib_tbl(l_count).PRICING_ATTRIBUTE        	:= l_pricing_attribute;
226     p_qp_pricing_attrib_tbl(l_count).PRICING_ATTR_VALUE_FROM  	:= p_attr_value_from;
227     p_qp_pricing_attrib_tbl(l_count).PRICING_ATTR_VALUE_TO    	:= p_attr_value_to;
228     p_qp_pricing_attrib_tbl(l_count).COMPARISON_OPERATOR_CODE   := l_comp_operator;
229 
230     p_qp_pricing_attrib_tbl(l_count).PROCESS_TYPE             	:= 'SSH';
231     p_qp_pricing_attrib_tbl(l_count).INTERFACE_ACTION_CODE      := 'C';
232     p_qp_pricing_attrib_tbl(l_count).EXCLUDER_FLAG            	:= 'N';
233     p_qp_pricing_attrib_tbl(l_count).PRODUCT_ATTRIBUTE_CONTEXT  := 'ITEM';
234     p_qp_pricing_attrib_tbl(l_count).PRODUCT_ATTRIBUTE        	:= 'PRICING_ATTRIBUTE3';
235     p_qp_pricing_attrib_tbl(l_count).PRODUCT_ATTR_VALUE       	:= 'ALL';
236     p_qp_pricing_attrib_tbl(l_count).PRODUCT_ATTRIBUTE_DATATYPE := 'C';
237     p_qp_pricing_attrib_tbl(l_count).PRICING_ATTRIBUTE_CONTEXT  := p_context;
238 
239     FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
240   EXCEPTION
241     WHEN OTHERS THEN
242       x_error_msg := sqlerrm;
243       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name => l_module_name,
244              			  p_msg   	=> sqlerrm,
245              			  p_category    => 'O',
246 	        		  p_line_number	=> p_line_number);
247       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
248       x_status := 1;
249       RETURN;
250   END ADD_ATTRIBUTE;
251 
252 
253   -----------------------------------------------------------------------------
254   -- PROCEDURE VALIDATE_CURRENCY
255   --
256   -- Purpose: validate and cache the currency
257   --
258   -- IN Parameters
259   --    1. p_currency:	currency or currency code
260   --    2. p_line_number: 	The line number for this pricing attribute.
261   --
262   -- OUT parameters:
263   --	1. x_status:	error status, -1 if no errors
264   --	2. x_error_msg:	error message if any
265   -----------------------------------------------------------------------------
266   PROCEDURE VALIDATE_CURRENCY(p_currency	IN	VARCHAR2,
267                               p_carrier_id      IN      NUMBER,
268 			      p_line_number	IN	NUMBER,
269 			      x_status		OUT NOCOPY NUMBER,
270 			      x_error_msg	OUT NOCOPY VARCHAR2) IS
271   l_currency_code	VARCHAR2(45);
272   l_carrier_currency    VARCHAR2(45);
273   l_module_name      	CONSTANT VARCHAR2(100) := 'fte.plsql.' || G_PKG_NAME || '.VALIDATE_CURRENCY';
274   BEGIN
275     FTE_UTIL_PKG.ENTER_DEBUG(l_module_name);
276 
277     IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
278       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Currency', p_currency);
279       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Line number', p_line_number);
280     END IF;
281     x_status := -1;
282 
283     l_currency_code := FTE_UTIL_PKG.GET_FND_CURRENCY(p_currency, x_status, x_error_msg);
284 
285     IF (x_status <> -1 OR l_currency_code IS NULL) THEN
286       x_error_msg := FTE_UTIL_PKG.GET_MSG ('FTE_CURRENCY_NOT_FOUND');  -- new message
287       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name => l_module_name,
288                                   p_msg         => x_error_msg,
289                                   p_category    => 'D',
290                                   p_line_number => p_line_number);
291 
292       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
293       RETURN;
294     END IF;
295 
296     IF (p_carrier_id is not NULL) THEN
297       BEGIN
298        SELECT currency_code INTO l_carrier_currency
299        FROM   wsh_carriers
300        WHERE  carrier_id = p_carrier_id;
301 
302        EXCEPTION
303        WHEN NO_DATA_FOUND THEN
304          x_error_msg := Fte_Util_Pkg.Get_Msg(P_Name => 'FTE_SEL_INVALID_CARRIER');
305          FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name => l_module_name,
306                                     p_msg         => x_error_msg,
307                                     p_category    => 'D',
308                                     p_line_number => p_line_number);
309          x_status := 2;
310          FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
311          RETURN;
312       END;
313 
314       IF ((l_carrier_currency <> p_currency AND l_carrier_currency <> l_currency_code) OR l_carrier_currency IS NULL) THEN
315         x_error_msg := Fte_Util_Pkg.Get_Msg(P_Name => 'FTE_INVALID_CARRIER_CURRENCY');
316         FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name => l_module_name,
317                                     p_msg         => x_error_msg,
318                                     p_category    => 'D',
319                                     p_line_number => p_line_number);
320         x_status := 2;
321         FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
322         RETURN;
323       END IF;
324     END IF;
325     --cache
326     FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
327     RETURN;
328   EXCEPTION
329     WHEN OTHERS THEN
330       x_error_msg := sqlerrm;
331       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name => l_module_name,
332              			  p_msg   	=> sqlerrm,
333              			  p_category    => 'O',
334 	        		  p_line_number	=> p_line_number);
335       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
336       x_status := 1;
337       RETURN;
338   END VALIDATE_CURRENCY;
339 
340 
341   -----------------------------------------------------------------------------
342   -- FUNCTION ISNUM
343   --
344   -- Purpose: check if input is a number
345   --
346   -- IN Parameters
347   --    1. pstr:	input string
348   --
349   -- RETURNS
350   --  1 if input is a number, 0 if not
351   -----------------------------------------------------------------------------
352   FUNCTION isNum( pstr in varchar2 ) return number
353   is
354     x number;
355   BEGIN
356     x:= pstr;
357     return 1;
358   EXCEPTION
359     WHEN others THEN return 0;
360   END isNum;
361 
362   -----------------------------------------------------------------------------
363   -- FUNCTION GET_FREQ_CODE
364   --
365   -- Purpose: get the frequency code in varchar2
366   --
367   -- IN Parameters
368   --    1. p_frequency:	frequency string
369   --    2. p_line_number: 	The line number for this pricing attribute.
370   --
371   -- OUT parameters:
372   --	1. x_status:	error status, -1 if no errors
373   --	2. x_error_msg:	error message if any
374   --
375   -- RETURN:
376   --    the frequncy in numeric display
377   -----------------------------------------------------------------------------
378   FUNCTION GET_FREQ_CODE(p_frequency	IN	VARCHAR2,
379 			 p_line_number	IN	NUMBER,
380 			 x_status    	OUT NOCOPY  NUMBER,
381 			 x_error_msg 	OUT NOCOPY  VARCHAR2) RETURN VARCHAR2 IS
382 
383   l_freq	VARCHAR2(40) := UPPER(p_frequency);
384   l_result	VARCHAR2(7);
385 
386   l_module_name      	CONSTANT VARCHAR2(100) := 'fte.plsql.' || G_PKG_NAME || '.GET_FREQ_CODE';
387   BEGIN
388     FTE_UTIL_PKG.ENTER_DEBUG(l_module_name);
389 
390     IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
391       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Frequency', p_frequency);
392       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Line number', p_line_number);
393     END IF;
394     x_status := -1;
395 
396     IF (INSTR(l_freq, 'SUN') > 0) THEN
397       l_result := l_result || '1';
398     END IF;
399 
400     IF (INSTR(l_freq, 'MON') > 0) THEN
401       l_result := l_result || '2';
402     END IF;
403 
404     IF (INSTR(l_freq, 'TUE') > 0) THEN
405       l_result := l_result || '3';
406     END IF;
407 
408     IF (INSTR(l_freq, 'WED') > 0) THEN
409       l_result := l_result || '4';
410     END IF;
411 
412     IF (INSTR(l_freq, 'THU') > 0) THEN
413       l_result := l_result || '5';
414     END IF;
415 
416     IF (INSTR(l_freq, 'FRI') > 0) THEN
417       l_result := l_result || '6';
418     END IF;
419 
420     IF (INSTR(l_freq, 'SAT') > 0) THEN
421       l_result := l_result || '7';
422     END IF;
423     FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
424     RETURN l_result;
425   EXCEPTION
426     WHEN OTHERS THEN
427       x_error_msg := sqlerrm;
428       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name => l_module_name,
429              			  p_msg   	=> x_error_msg,
430              			  p_category    => 'O',
431 	        		  p_line_number	=> p_line_number);
432       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
433       x_status := 1;
434       RETURN NULL;
435   END GET_FREQ_CODE;
436 
437   -----------------------------------------------------------------------------
438   -- FUNCTION CALCULATE_FREQ_ARRIVAL
439   --
440   -- Purpose: calculate the frequency arrival date
441   --
442   -- IN Parameters
443   --    1. p_frequency:	frequency string
444   --	2. p_ind:	arrival date indicator
445   --    3. p_line_number: 	The line number for this pricing attribute.
446   --
447   -- OUT parameters:
448   --	1. x_status:	error status, -1 if no errors
449   --	2. x_error_msg:	error message if any
450   --
451   -- RETURN:
452   --    the frequncy arrival date in numeric display
453   -----------------------------------------------------------------------------
454   FUNCTION CALCULATE_FREQ_ARRIVAL(p_frequency	IN	VARCHAR2,
455 		 		  p_ind		IN	NUMBER,
456 				  p_line_number	IN	NUMBER,
457 				  x_status    	OUT NOCOPY  NUMBER,
458 				  x_error_msg 	OUT NOCOPY  VARCHAR2) RETURN VARCHAR2 IS
459   l_arrival	VARCHAR2(40);
460   l_ind		NUMBER;
461   l_day		NUMBER;
462   l_module_name      	CONSTANT VARCHAR2(100) := 'fte.plsql.' || G_PKG_NAME || '.CALCULATE_FREQ_ARRIVAL';
463   BEGIN
464     FTE_UTIL_PKG.ENTER_DEBUG(l_module_name);
465 
466     IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
467       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Frequency', p_frequency);
468       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Indicator', p_ind);
469       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Line number', p_line_number);
470     END IF;
471     x_status := -1;
472 
473     IF (p_ind <> 0) THEN
474       l_ind := MOD(p_ind, 7);
475     END IF;
476 
477     FOR i IN 1..LENGTH(p_frequency) LOOP
478       l_day := TO_NUMBER(SUBSTR(p_frequency, i, 1));
479       IF (MOD((l_day + l_ind), 7) = 0) THEN
480 	l_arrival := l_arrival || '7';
481       ELSE
482 	l_arrival := l_arrival || (MOD((l_day + l_ind), 7));
483       END IF;
484     END LOOP;
485     FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
486     RETURN l_arrival;
487   EXCEPTION
488     WHEN OTHERS THEN
489       x_error_msg := sqlerrm;
490       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name => l_module_name,
491              			  p_msg   	=> x_error_msg,
492              			  p_category    => 'O',
493 	        		  p_line_number	=> p_line_number);
494       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
495       x_status := 1;
496       RETURN NULL;
497   END CALCULATE_FREQ_ARRIVAL;
498 
499   -----------------------------------------------------------------------------
500   -- FUNCTION Validate_Rate_Type
501   --
502   -- Purpose  Set the rate type (operator) at the line level.
503   --
504   -- IN Parameters
505   --    1. p_rate_type:		The rate type to be validated.
506   --	2. p_line_number:	line number
507   --
508   -- OUT Parameters:
509   --	1. x_status:	error status, -1 if no errors
510   --	2. x_error_msg:	error message if any
511   --
512   -- RETURN:
513   --    the subtype, or null if it doesn't exist.
514   -----------------------------------------------------------------------------
515   FUNCTION Validate_Rate_Type (p_rate_type     	IN      VARCHAR2,
516 			       p_line_number	IN	NUMBER,
517 			       x_status    OUT NOCOPY  NUMBER,
518 			       x_error_msg OUT NOCOPY	VARCHAR2)
519   RETURN VARCHAR2 IS
520 
521   l_rate_type   VARCHAR2(100);
522   l_module_name      CONSTANT VARCHAR2(100) := 'fte.plsql.' || G_PKG_NAME || '.VALIDATE_RATE_TYPE';
523 
524   BEGIN
525     FTE_UTIL_PKG.ENTER_DEBUG(l_module_name);
526 
527     IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
528       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Rate type', p_rate_type);
529       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Line number', p_line_number);
530     END IF;
531     x_status := -1;
532     l_rate_type := UPPER(p_rate_type);
533 
534     IF (p_rate_type = 'FIXED') THEN
535       l_rate_type := 'BLOCK_PRICE';
536     ELSIF (p_rate_type = 'PER_UOM') THEN
537       l_rate_type := 'UNIT_PRICE';
538     ELSIF (p_rate_type = 'BLOCK_UNIT') THEN
539       --block unit always has breaks.
540       l_rate_type := 'BREAKUNIT_PRICE';
541     ELSIF (p_rate_type NOT IN ('LUMPSUM')) THEN
542       x_status := 2;
543       x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_RATE_TYPE_INVALID',
544 					  p_tokens	=> STRINGARRAY('TYPE'),
545 					  p_values	=> STRINGARRAY(p_rate_type));
546 
547       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name => l_module_name,
548                    		  p_msg   	=> x_error_msg,
549                    		  p_category    => 'D',
550 				  p_line_number	=> p_line_number);
551 
552     END IF;
553 
554     FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
555     return l_rate_type;
556   EXCEPTION
557     WHEN OTHERS THEN
558       x_error_msg := sqlerrm;
559       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name => l_module_name,
560              			  p_msg   	=> x_error_msg,
561              			  p_category    => 'O',
562 	        		  p_line_number	=> p_line_number);
563       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
564       x_status := 1;
565       RETURN NULL;
566   END Validate_Rate_Type;
567 
568   -----------------------------------------------------------------------------
569   -- FUNCTION Validate_Subtype
570   --
571   -- Purpose  Ensure that the subtype passed in the rate chart modifier is a valid
572   --          subtype.
573   --
574   -- IN Parameters
575   --    1. l_subtype   IN   VARCHAR2 : The subtype to be validated.
576   --	2. p_line_number:	line number
577   --
578   -- OUT Parameters:
579   --	1. x_status:	error status, -1 if no errors
580   --	2. x_error_msg:	error message if any
581   --
582   -- RETURN:
583   --    the subtype, or null if it doesn't exist.
584   -----------------------------------------------------------------------------
585 
586   FUNCTION Validate_Subtype(p_subtype   IN    VARCHAR2,
587 			    p_line_number	IN	NUMBER,
588 			    x_status    OUT NOCOPY  NUMBER,
589 			    x_error_msg OUT NOCOPY	VARCHAR2) RETURN VARCHAR2 IS
590 
591   l_subtype    VARCHAR2(30);
592 
593   l_module_name   CONSTANT VARCHAR2(100) := 'fte.plsql.' || G_PKG_NAME || '.VALIDATE_SUBTYPE';
594 
595   BEGIN
596     FTE_UTIL_PKG.ENTER_DEBUG(l_module_name);
597 
598     IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
599       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Subtype', p_subtype);
600       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Line number', p_line_number);
601     END IF;
602     x_status := -1;
603 
604     SELECT name INTO l_subtype
605     FROM   wsh_freight_cost_types
606     WHERE  freight_cost_type_code = 'FTECHARGE'
607     AND    name = upper(p_subtype);
608 
609     FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
610 
611     RETURN l_subtype;
612   EXCEPTION
613     WHEN NO_DATA_FOUND THEN
614       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
615       RETURN NULL;
616     WHEN OTHERS THEN
617       x_error_msg := sqlerrm;
618       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name => l_module_name,
619              			  p_msg   	=> x_error_msg,
620              			  p_category    => 'O',
621 	        		  p_line_number	=> p_line_number);
622       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
623       x_status := 1;
624       RETURN NULL;
625   END Validate_Subtype;
626 
627   -----------------------------------------------------------------------------
628   -- FUNCTION  Validate_Service_Level
629   --
630   -- Purpose    Validate that the carrier with id <p_carrier_id> has been set
631   --            up to handle the service level <p_service_level>
632   --
633   -- IN Parameters
634   --    1. p_carrier_id:  	The carrier id
635   --	2. p_carrier_name:	carrier name
636   --    3. p_service_level:	service level to validate
637   --	4. p_line_number:	line number
638   --
639   -- OUT Parameters
640   --	1. x_status:	error status, -1 if no errors
641   --	2. x_error_msg:	error message if any
642   --
643   -- Returns:
644   -- 	service code
645   -----------------------------------------------------------------------------
646   FUNCTION Validate_Service_Level (p_carrier_id    	IN  	NUMBER,
647                                    p_carrier_name  	IN  	VARCHAR2,
648                                    p_service_level 	IN  	VARCHAR2,
649                                    p_line_number	IN	NUMBER,
650 				   x_status        	OUT NOCOPY NUMBER,
651                                    x_error_msg     	OUT NOCOPY VARCHAR2)
652   RETURN VARCHAR2 IS
653 
654   l_temp_char    VARCHAR2(256);
655   l_service_code VARCHAR2(20);
656   l_carrier_id   NUMBER;
657   l_carrier_name VARCHAR2(100);
658   l_module_name  CONSTANT VARCHAR2(100) := 'fte.plsql.' || G_PKG_NAME || '.VALIDATE_SERVICE_LEVEL';
659 
660   BEGIN
661     FTE_UTIL_PKG.ENTER_DEBUG(l_module_name);
662 
663     IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
664       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Carrier ID', p_carrier_id);
665       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Carrier Name', p_carrier_name);
666       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Service Level', p_service_level);
667       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Line number', p_line_number);
668     END IF;
669     x_status := -1;
670 
671     IF (p_service_level IS NULL) THEN
672       x_error_msg := FTE_UTIL_PKG.GET_MSG(P_Name => 'FTE_CAT_NO_SERVICE');
673       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name => l_module_name,
674                    		  p_msg  	=> x_error_msg,
675                    		  p_category    => 'A',
676 				  p_line_number	=> p_line_number);
677       x_status := 1;
678       FTE_UTIL_PKG.Exit_Debug(l_module_name);
679       RETURN NULL;
680     END IF;
681 
682     l_service_code := FTE_UTIL_PKG.GET_LOOKUP_CODE('WSH_SERVICE_LEVELS', p_service_level);
683 
684     IF (l_service_code IS NULL) THEN
685       x_error_msg := FTE_UTIL_PKG.GET_MSG(P_Name => 'FTE_CAT_SERVICE_UNKNOWN',
686                                           P_Tokens => STRINGARRAY('SERVICE_TYPE'),
687 					  P_values => STRINGARRAY(p_service_level));
688       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name => l_module_name,
689                    		 p_msg	  => x_error_msg,
690                    		 p_category    => 'B',
691 				 p_line_number => p_line_number);
692       x_status := 1;
693       FTE_UTIL_PKG.Exit_Debug(l_module_name);
694       RETURN NULL;
695     END IF;
696 
697     IF (p_carrier_id IS NOT NULL) THEN
698       l_carrier_id := p_carrier_id;
699     ELSIF (p_carrier_name IS NOT NULL) THEN
700       l_carrier_id := FTE_UTIL_PKG.Get_Carrier_Id(p_carrier_name => p_carrier_name);
701 
702       IF (x_status <> -1) THEN
703         FTE_UTIL_PKG.Exit_Debug(l_module_name);
704         RETURN NULL;
705       END IF;
706     ELSE
707       FTE_UTIL_PKG.Exit_Debug(l_module_name);
708       RETURN l_service_code;
709     END IF;
710 
711     IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
712       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Service Code', l_service_code);
713     END IF;
714 
715     --Verify that the carrier has the correct service level
716     BEGIN
717       SELECT service_level INTO l_temp_char
718       FROM WSH_CARRIER_SERVICES
719       WHERE  carrier_id = l_carrier_id
720       AND service_level = l_service_code
721       AND enabled_flag = 'Y'
722       AND rownum = 1;
723     EXCEPTION
724       WHEN NO_DATA_FOUND THEN
725 	IF (p_carrier_name IS NULL) THEN
726 	  l_carrier_name := FTE_UTIL_PKG.GET_CARRIER_NAME(p_carrier_id);
727   	ELSE
728 	  l_carrier_name := p_carrier_name;
729 	END IF;
730 
731         x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name  	=> 'FTE_CARRIER_SERVICE_INVALID',
732 				    	     p_tokens	=> STRINGARRAY('SERVICE_LEVEL', 'CARRIER_NAME'),
733 				    	     p_values	=> STRINGARRAY(p_service_level, l_carrier_name));
734 
735         FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
736                    		    p_msg	  	=> x_error_msg,
737                    		    p_category    	=> 'D',
738 				    p_line_number	=> p_line_number);
739 
740         x_status := 2;
741         FTE_UTIL_PKG.Exit_Debug(l_module_name);
742         return null;
743     END;
744 
745     FTE_UTIL_PKG.Exit_Debug(l_module_name);
746     RETURN l_service_code;
747 
748   EXCEPTION
749     WHEN OTHERS THEN
750       x_error_msg := sqlerrm;
751       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name => l_module_name,
752              			  p_msg   	=> x_error_msg,
753              			  p_category    => 'O',
754 	        		  p_line_number	=> p_line_number);
755       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
756       x_status := 2;
757       RETURN NULL;
758   END Validate_Service_Level;
759 
760 
761   --------------------------------------------------------------------
762   -- PROCEDURE VALIDATE_NAME
763   --
764   -- Purpose: validate pricing parameter name
765   --
766   -- IN Parameter:
767   --	1. p_type:		'PARAMETER' or others
768   --	2. p_lane_function:	pricing lane function
769   --	3. p_subtype:		pricing subtype
770   --	4. p_name:		pricing parameter name
771   --	5. p_line_number:	line number
772   --
773   -- OUT Parameter:
774   --	1. p_deficit_wt:	deficit_wt flag
775   --
776   -- RETURNS:
777   --  parameter id
778   --------------------------------------------------------------------
779 
780   FUNCTION VALIDATE_NAME(p_type		IN 	VARCHAR2,
781 			 p_lane_function IN 	VARCHAR2,
782 			 p_subtype	IN 	VARCHAR2,
783 			 p_name		IN	VARCHAR2,
784                          p_line_number	IN	NUMBER,
785 			 p_deficit_wt	IN OUT 	NOCOPY BOOLEAN,
786 			 x_status	OUT NOCOPY NUMBER,
787 			 x_error_msg	OUT NOCOPY VARCHAR2) RETURN NUMBER IS
788   l_result	NUMBER;
789   l_module_name      CONSTANT VARCHAR2(100) := 'fte.plsql.' || G_PKG_NAME || '.VALIDATE_NAME';
790 
791   CURSOR GET_PARAMETER_ID1 (p_type IN VARCHAR2, p_subtype IN VARCHAR2, p_name IN VARCHAR2, p_lane_function IN VARCHAR2) IS
792     SELECT PARAMETER_ID
793       FROM FTE_PRC_PARAMETER_DEFAULTS
794      WHERE parameter_type = p_type
795        AND parameter_sub_type = p_subtype
796        AND parameter_name = p_name
797        AND lane_function in ('NONE', p_lane_function);
798 
799   CURSOR GET_PARAMETER_ID2 (p_type IN VARCHAR2, p_subtype IN VARCHAR2, p_name IN VARCHAR2, p_lane_function IN VARCHAR2) IS
800     SELECT PARAMETER_ID
801       FROM FTE_PRC_PARAMETER_DEFAULTS
802      WHERE parameter_type = p_type
803        AND parameter_sub_type = p_subtype
804        AND parameter_name = p_name
805        AND lane_function = p_lane_function;
806 
807   BEGIN
808     FTE_UTIL_PKG.ENTER_DEBUG(l_module_name);
809 
810     IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
811       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Type', p_type);
812       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Lane Function', p_lane_function);
813       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Subtype', p_subtype);
814       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Name', p_name);
815       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Line number', p_line_number);
816       IF (p_deficit_wt) THEN
817         FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Deficit Wt', 'TRUE');
818       ELSE
819         FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Deficit Wt', 'FALSE');
820       END IF;
821     END IF;
822     x_status := -1;
823 
824     IF (p_type = 'PARAMETER' AND (p_lane_function <> 'NONE')) THEN
825       OPEN GET_PARAMETER_ID1(p_type, p_subtype, p_name, p_lane_function);
826       FETCH GET_PARAMETER_ID1 INTO l_result;
827       CLOSE GET_PARAMETER_ID1;
828     ELSE
829       OPEN GET_PARAMETER_ID2(p_type, p_subtype, p_name, p_lane_function);
830       FETCH GET_PARAMETER_ID2 INTO l_result;
831       CLOSE GET_PARAMETER_ID2;
832     END IF;
833 
834     IF (p_type = 'PARAMETER' AND p_lane_function = 'LTL' AND p_subtype = 'DEFICIT_WT' AND p_name = 'WT_BERAK_POINT') THEN
835       p_deficit_wt := true;
836     END IF;
837 
838     FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
839     RETURN l_result;
840   EXCEPTION
841     WHEN OTHERS THEN
842       IF (GET_PARAMETER_ID1%ISOPEN) THEN
843 	CLOSE GET_PARAMETER_ID1;
844       END IF;
845       IF (GET_PARAMETER_ID2%ISOPEN) THEN
846 	CLOSE GET_PARAMETER_ID2;
847       END IF;
848       x_error_msg := sqlerrm;
849       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name => l_module_name,
850              			  p_msg   	=> x_error_msg,
851              			  p_category    => 'O',
852 	        		  p_line_number	=> p_line_number);
853       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
854       x_status := 2;
855       RETURN NULL;
856   END VALIDATE_NAME;
857 
858   ------------------------------------------------------------------
859   -- PROCEDURE VERIFY_LANE_BASIS
860   --
861   -- Purpose: verify if the lane has basis in lane level
862   --
863   -- IN parameters:
864   --	1. p_lane_id:	lane id
865   --	2. p_line_number:	line number
866   --
867   -- OUT parameters:
868   --	1. p_lane_tbl:	pl/sql table for lanes
869   --	2. x_status:	error status, -1 if no error
870   --	3. x_error_msg: error message if any
871   --
872   ------------------------------------------------------------------
873 
874   PROCEDURE VERIFY_LANE_BASIS(p_lane_id		IN	NUMBER,
875 			      p_lane_tbl	IN OUT NOCOPY 	FTE_LANE_PKG.lane_tbl,
876                               p_line_number	IN	NUMBER,
877 			      x_status		OUT NOCOPY NUMBER,
878 			      x_error_msg	OUT NOCOPY VARCHAR2) IS
879   l_basis  	VARCHAR2(100);
880   l_module_name      CONSTANT VARCHAR2(100) := 'fte.plsql.' || G_PKG_NAME || '.VALIDATE_LANE_BASIS';
881   BEGIN
882     FTE_UTIL_PKG.ENTER_DEBUG(l_module_name);
883 
884     IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
885       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Lane ID', p_lane_id);
886       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Line number', p_line_number);
887     END IF;
888     x_status := -1;
889 
890     SELECT basis
891       INTO l_basis
892       FROM fte_lanes
893      WHERE lane_id = p_lane_id;
894 
895     IF (l_basis IS NULL) THEN
896       p_lane_tbl(p_lane_tbl.COUNT).basis_flag := false;
897     ELSIF (l_basis = 'CONTAINER_ALL') THEN
898       p_lane_tbl(p_lane_tbl.COUNT).container_all_flag := true;
899     END IF;
900     FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
901 
902   EXCEPTION
903     WHEN OTHERS THEN
904       x_error_msg := sqlerrm;
905       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name => l_module_name,
906              			  p_msg   	=> x_error_msg,
907              			  p_category    => 'O',
908 	        		  p_line_number	=> p_line_number);
909       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
910       x_status := 2;
911       RETURN;
912   END VERIFY_LANE_BASIS;
913 
914   ------------------------------------------------------------------
915   -- FUNCTION VALIDATE_CARRIER_SERVICE
916   --
917   -- Purpose: validate if the carrier has the service level
918   --
919   -- IN parameters:
920   --	1. p_service_code:	serice code
921   --	2. p_lane_id:		lane id
922   -- 	3. p_carrier_id:	carrier id
923   --	4. p_mode:		mode of transportation
924   --	5. p_line_number:	line number
925   --
926   -- OUT parameters:
927   --	1. x_status:	error status, -1 if no error
928   --	2. x_error_msg: error message if any
929   --
930   -- RETURN true if the carrier has the serivce, else false
931   ------------------------------------------------------------------
932 
933   FUNCTION VALIDATE_CARRIER_SERVICE(p_service_code	IN	VARCHAR2,
934 				    p_lane_id		IN	NUMBER DEFAULT NULL,
935 				    p_carrier_id	IN	NUMBER,
936 				    p_mode		IN	VARCHAR2,
937 	                            p_line_number	IN	NUMBER,
938 				    x_status		OUT NOCOPY NUMBER,
939 				    x_error_msg		OUT NOCOPY VARCHAR2) RETURN BOOLEAN IS
940   l_result	VARCHAR2(10);
941   l_numfetch	NUMBER;
942   CURSOR GET_CARRIER_SERVICE (p_carrier_id	IN NUMBER, p_service_code IN VARCHAR2, p_mode IN VARCHAR2) IS
943     SELECT 'true'
944       FROM wsh_carrier_services s
945      WHERE s.carrier_id = p_carrier_id
946        AND s.mode_of_transport = p_mode
947        AND s.service_level = p_service_code
948        AND nvl(s.enabled_flag,'N') = 'Y';
949 
950   CURSOR GET_CARRIER_SERVICE2 (p_lane_id	IN NUMBER, p_service_code IN VARCHAR2) IS
951     SELECT 'true'
952       FROM wsh_carrier_services s, fte_lanes l
953      WHERE s.carrier_id = l.carrier_id
954        AND s.mode_of_transport=l.mode_of_transportation_code
955        AND l.lane_id = p_lane_id
956        AND s.service_level = p_service_code
957        AND nvl(s.enabled_flag,'N') = 'Y';
958 
959   l_module_name      CONSTANT VARCHAR2(100) := 'fte.plsql.' || G_PKG_NAME || '.VALIDATE_CARRIER_SERVICE';
960   BEGIN
961     FTE_UTIL_PKG.ENTER_DEBUG(l_module_name);
962 
963     IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
964       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Lane ID', p_lane_id);
965       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Carrier ID', p_carrier_id);
966       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Service code', p_service_code);
967       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Mode', p_mode);
968       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Line number', p_line_number);
969     END IF;
970     x_status := -1;
971 
972     IF (p_lane_id IS NULL) THEN
973       OPEN GET_CARRIER_SERVICE(p_carrier_id, p_service_code, p_mode);
974       FETCH GET_CARRIER_SERVICE INTO l_result;
975       l_numfetch := SQL%ROWCOUNT;
976       CLOSE GET_CARRIER_SERVICE;
977     ELSE
978       OPEN GET_CARRIER_SERVICE2(p_lane_id, p_service_code);
979       FETCH GET_CARRIER_SERVICE2 INTO l_result;
980       l_numfetch := SQL%ROWCOUNT;
981       CLOSE GET_CARRIER_SERVICE2;
982     END IF;
983 
984     IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
985       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Result', l_result);
986       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Num Fetch', l_numfetch);
987     END IF;
988 
989 
990     IF (l_numfetch = 0 OR l_result IS NULL) THEN
991       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
992       RETURN false;
993     ELSE
994       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
995       RETURN true;
996     END IF;
997   EXCEPTION
998     WHEN OTHERS THEN
999       IF (GET_CARRIER_SERVICE%ISOPEN) THEN
1000 	CLOSE GET_CARRIER_SERVICE;
1001       END IF;
1002       IF (GET_CARRIER_SERVICE2%ISOPEN) THEN
1003 	CLOSE GET_CARRIER_SERVICE2;
1004       END IF;
1005 
1006       x_error_msg := sqlerrm;
1007       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name => l_module_name,
1008              			  p_msg   	=> x_error_msg,
1009              			  p_category    => 'O',
1010 	        		  p_line_number	=> p_line_number);
1011       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
1012       x_status := 2;
1013       RETURN FALSE;
1014   END VALIDATE_CARRIER_SERVICE;
1015 
1016  ----------------------------------------------------------------------------
1017   -- FUNCTION IS_VALID_PRICELIST
1018   --
1019   -- Purpose: check if the list of pricelist names are valid
1020   --
1021   -- IN parameters:
1022   --	1. p_array:		array of the values for pricelists
1023   --	2. p_service_count:	number of service columns
1024   --	3. p_price_prefix:	price prefix for the pricelist
1025   --	4. p_carrier_id:	carrier id
1026   --	5. p_line_number:	line number
1027   --
1028   -- OUT parameters:
1029   --	1. x_status:	error status, -1 if no error
1030   --	2. x_error_msg: error message if any
1031   --
1032   -- Returns true/false
1033   ----------------------------------------------------------------------------
1034   FUNCTION IS_VALID_PRICELIST(p_array		IN	FTE_PARCEL_LOADER.service_array,
1035 			      p_service_count	IN	NUMBER,
1036 			      p_price_prefix	IN	VARCHAR2,
1037 			      p_carrier_id	IN	NUMBER,
1038 			      p_line_number	IN	NUMBER,
1039 			      x_status		OUT NOCOPY NUMBER,
1040 			      x_error_msg	OUT NOCOPY VARCHAR2) RETURN BOOLEAN IS
1041   l_temp 	VARCHAR2(50) := '%';
1042   l_result	NUMBER;
1043   l_module_name      CONSTANT VARCHAR2(100) := 'fte.plsql.' || G_PKG_NAME || '.IS_VALID_PRICELIST';
1044   BEGIN
1045     FTE_UTIL_PKG.ENTER_DEBUG(l_module_name);
1046 
1047     IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
1048       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Service count', p_service_count);
1049       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Price prefix', p_price_prefix);
1050       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Carrier ID', p_carrier_id);
1051       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Line number', p_line_number);
1052     END IF;
1053     x_status := -1;
1054 
1055     FOR i IN 1..p_service_count LOOP
1056       -- Search for Pricelist_id
1057       IF (p_array(i) IS NOT NULL) THEN
1058         l_result := FTE_RATE_CHART_PKG.GET_PRICELIST_ID(p_name	=> p_price_prefix || p_array(i),
1059 							p_carrier_id	=> p_carrier_id,
1060 							p_attribute1	=> l_temp);
1061 
1062 	IF (l_result = -1) THEN
1063 	  x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_PRICELIST_INVALID',
1064 	 				      p_tokens		=> STRINGARRAY('NAME'),
1065 					      p_values		=> STRINGARRAY(p_price_prefix || p_array(i)));
1066 
1067           FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name	=> l_module_name,
1068              			      p_msg	   	=> x_error_msg,
1069              			      p_category    	=> 'D',
1070 	        		      p_line_number	=> p_line_number);
1071 
1072           x_status := 2;
1073           FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
1074           RETURN FALSE;
1075         END IF;
1076       END IF;
1077     END LOOP;
1078 
1079     FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
1080     RETURN TRUE;
1081   EXCEPTION
1082     WHEN OTHERS THEN
1083       x_error_msg := sqlerrm;
1084       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name => l_module_name,
1085              			  p_msg   	=> x_error_msg,
1086              			  p_category    => 'O',
1087 	        		  p_line_number	=> p_line_number);
1088       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
1089       x_status := 2;
1090       RETURN FALSE;
1091   END IS_VALID_PRICELIST;
1092 
1093   ----------------------------------------------------------------------------
1094   -- FUNCTION GET_COLUMN
1095   --
1096   -- Purpose: check the stored in static columns
1097   --
1098   -- IN parameters:
1099   --	1. p_type:	type of the block which column is requested
1100   --
1101   -- Returns STRINGARRAY of the columns
1102   ----------------------------------------------------------------------------
1103   FUNCTION GET_COLUMN (p_type IN VARCHAR2) RETURN STRINGARRAY IS
1104   BEGIN
1105     IF (p_type = 'TL_BASE_RATES') THEN
1106       RETURN TL_BASE_RATES;
1107     ELSIF (p_type = 'SERVICE') THEN
1108       RETURN SERVICE;
1109     ELSIF (p_type = 'SERVICE_RATING_SETUP') THEN
1110       RETURN SERVICE_RATING_SETUP;
1111     ELSIF (p_type = 'SCHEDULE') THEN
1112       RETURN SCHEDULE;
1113     ELSIF (p_type = 'RATE_CHART') THEN
1114       RETURN RATE_CHART;
1115     ELSIF (p_type = 'RATE_LINE') THEN
1116       RETURN RATE_LINE;
1117     ELSIF (p_type = 'RATE_BREAK') THEN
1118       RETURN RATE_BREAK;
1119     ELSIF (p_type = 'RATING_ATTRIBUTE') THEN
1120       RETURN RATING_ATTRIBUTE;
1121     ELSIF (p_type = 'CHARGES_DISCOUNTS') THEN
1122       RETURN CHARGES_DISCOUNTS;
1123     ELSIF (p_type = 'CHARGES_DISCOUNTS_LINE') THEN
1124       RETURN CHARGES_DISCOUNTS_LINE;
1125     ELSIF (p_type = 'ADJUSTED_RATE_CHART') THEN
1126       RETURN ADJUSTED_RATE_CHART;
1127     ELSIF (p_type = 'RATING_ZONE_CHART') THEN
1128       RETURN RATING_ZONE_CHART;
1129     ELSIF (p_type = 'RATING_SETUP') THEN
1130       RETURN RATING_SETUP;
1131     ELSIF (p_type = 'TL_SERVICES') THEN
1132       RETURN TL_SERVICES;
1133     ELSIF (p_type = 'TL_SURCHARGES') THEN
1134       RETURN TL_SURCHARGES;
1135     ELSIF (p_type = 'FACILITY_CHARGES') THEN
1136       RETURN FACILITY_CHARGES;
1137     ELSIF (p_type = 'REGION') THEN
1138       RETURN REGION;
1139     ELSIF (p_type = 'ZONE') THEN
1140       RETURN ZONE;
1141     ELSIF (p_type = 'ORIGIN') THEN
1142       RETURN ORIGIN;
1143     ELSE
1144       RETURN NULL;
1145     END IF;
1146   END GET_COLUMN;
1147 
1148   ----------------------------------------------------------------------------
1149   -- PROCEDURE VALIDATE_COLUMNS
1150   --
1151   -- Purpose: check if the columns read is valid
1152   --
1153   -- IN parameters:
1154   --	1. p_keys:	columns STRINGARRAY
1155   --	2. p_type:	type of the block
1156   --	3. p_line_number:	line number
1157   --
1158   -- OUT parameters:
1159   --	1. x_status:		status, -1 if no error(1 wrong number, 2 wrong column, 3 no such type)
1160   --	2. x_error_msg:		error message if status <> -1
1161   ----------------------------------------------------------------------------
1162   PROCEDURE VALIDATE_COLUMNS (p_keys	    IN	FTE_BULKLOAD_PKG.block_header_tbl,
1163 			      p_type	    IN	VARCHAR2,
1164 			      p_line_number IN	NUMBER,
1165 			      x_status	    OUT NOCOPY	NUMBER,
1166 			      x_error_msg   OUT NOCOPY	VARCHAR2) IS
1167 
1168   l_module_name      CONSTANT VARCHAR2(100) := 'FTE.PLSQL.' || G_PKG_NAME || '.VALIDATE_COLUMNS';
1169   l_column	STRINGARRAY := STRINGARRAY();
1170   l_found 	BOOLEAN := false;
1171   BEGIN
1172     FTE_UTIL_PKG.ENTER_DEBUG(l_module_name);
1173 
1174     IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
1175       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Type', p_type);
1176       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Line number', p_line_number);
1177     END IF;
1178     x_status := -1;
1179 
1180     l_column  := GET_COLUMN(p_type);
1181 
1182     IF (l_column is NULL) THEN
1183       x_status := 3;
1184       x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_COLUMN_TYPE_INVALID');
1185       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name => l_module_name,
1186                    		  p_msg  	=> x_error_msg,
1187                    		  p_category    => 'D',
1188 				  p_line_number	=> p_line_number);
1189 
1190       FTE_UTIL_PKG.Exit_Debug(l_module_name);
1191       RETURN;
1192     END IF;
1193 
1194     FOR i IN 1..l_column.COUNT LOOP
1195       IF (NOT p_keys.EXISTS(l_column(i))) THEN
1196 	x_status := 2;
1197 	x_error_msg := FTE_UTIL_PKG.GET_MSG(P_Name 	=> 'FTE_MISSING_COLUMN',
1198 					    p_tokens 	=> STRINGARRAY('COLUMN', 'SECTION'),
1199         	                            p_values 	=> STRINGARRAY(l_column(i), p_type));
1200         FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
1201                    		   p_msg		=> x_error_msg,
1202                    		   p_category		=> 'D',
1203 				   p_line_number	=> p_line_number);
1204 
1205       ELSE
1206 	FTE_BULKLOAD_PKG.g_block_header_index(p_keys(l_column(i))) := null;
1207       END IF;
1208     END LOOP;
1209 
1210     IF (x_status <> -1) THEN
1211       FTE_UTIL_PKG.Exit_Debug(l_module_name);
1212       RETURN;
1213     END IF;
1214 
1215     FOR i IN 1..FTE_BULKLOAD_PKG.g_block_header_index.COUNT LOOP
1216       IF (FTE_BULKLOAD_PKG.g_block_header_index(i) IS NOT NULL) THEN
1217 	x_status := 2;
1218 	x_error_msg := FTE_UTIL_PKG.GET_MSG(P_Name => 'FTE_CAT_INVALID_COLUMN',
1219                                              P_Tokens => STRINGARRAY('COLUMN', 'SECTION'),
1220                                     	     p_values => STRINGARRAY(l_column(i), p_type));
1221 
1222         FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
1223                    		    p_msg		=> x_error_msg,
1224                    		    p_category		=> 'D',
1225 				    p_line_number	=> p_line_number);
1226       END IF;
1227     END LOOP;
1228 
1229     FTE_UTIL_PKG.Exit_Debug(l_module_name);
1230   EXCEPTION
1231     WHEN OTHERS THEN
1232       x_error_msg := sqlerrm;
1233       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name => l_module_name,
1234              			  p_msg   	=> x_error_msg,
1235              			  p_category    => 'O',
1236 	        		  p_line_number	=> p_line_number);
1237       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
1238       x_status := 1;
1239       RETURN;
1240   END VALIDATE_COLUMNS;
1241 
1242   ----------------------------------------------------------------------------
1243   -- PROCEDURE VALIDATE_CARRIER
1244   --
1245   -- Purpose: check if the carrier name is valid
1246   --
1247   -- IN parameters:
1248   --	1. p_carrier_name:	name of the carrier
1249   --	2. p_line_number:	line number
1250   --
1251   -- OUT parameters:
1252   --	1. p_carrier_id:	id of the carrier associated with carrier name
1253   --	2. x_status:		status, -1 if no error
1254   --	3. x_error_msg:		error message if status <> -1
1255   ----------------------------------------------------------------------------
1256   PROCEDURE VALIDATE_CARRIER(p_carrier_name	IN 		VARCHAR2,
1257 			     p_line_number	IN		NUMBER,
1258 			     p_carrier_id	OUT NOCOPY	NUMBER,
1259 			     x_status		OUT NOCOPY 	NUMBER,
1260 			     x_error_msg	OUT NOCOPY	VARCHAR2) IS
1261   l_module_name      CONSTANT VARCHAR2(100) := 'fte.plsql.' || G_PKG_NAME || '.VALIDATE_CARRIER';
1262   BEGIN
1263     FTE_UTIL_PKG.ENTER_DEBUG(l_module_name);
1264 
1265     IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
1266       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Carrier Name', p_carrier_name);
1267       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Line number', p_line_number);
1268     END IF;
1269     x_status := -1;
1270 
1271     p_carrier_id := -1;
1272     IF (p_carrier_name IS NOT NULL) THEN
1273       p_carrier_id := FTE_UTIL_PKG.GET_CARRIER_ID(p_carrier_name);
1274 
1275       IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
1276         FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Carrier ID', p_carrier_id);
1277       END IF;
1278       IF (p_carrier_id = -1) THEN
1279 	x_error_msg := FTE_UTIL_PKG.GET_MSG(P_Name     => 'FTE_CAT_CARRIER_INVALID',
1280 				    	     p_tokens 	=> STRINGARRAY('CARRIER_NAME'),
1281                                     	     p_values 	=> STRINGARRAY(p_carrier_name));
1282 
1283         FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
1284                    		    p_msg	  	=> x_error_msg,
1285                    		    p_category		=> 'C',
1286 				    p_line_number	=> p_line_number);
1287         FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
1288         x_status := 1;
1289 
1290 	RETURN;
1291       END IF;
1292     ELSE
1293       x_error_msg := FTE_UTIL_PKG.GET_MSG(P_Name     => 'FTE_CAT_CARRIER_MISSING');
1294       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
1295                    		  p_msg			=> x_error_msg,
1296                    		  p_category		=> 'A',
1297 				  p_line_number		=> p_line_number);
1298       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
1299       x_status := 1;
1300       RETURN;
1301     END IF;
1302     FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
1303   EXCEPTION
1304     WHEN OTHERS THEN
1305       x_error_msg := sqlerrm;
1306       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name => l_module_name,
1307              			  p_msg   	=> x_error_msg,
1308              			  p_category    => 'O',
1309 	        		  p_line_number	=> p_line_number);
1310       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
1311       x_status := 1;
1312       RETURN;
1313   END VALIDATE_CARRIER;
1314 
1315   ----------------------------------------------------------------------------
1316   -- PROCEDURE VALIDATE_LANE_NUMBER
1317   --
1318   -- Purpose: check if the lane number is valid
1319   --
1320   -- IN parameters:
1321   --	1. p_lane_number:	lane number value
1322   --	2. p_carrier_id:	carrier id
1323   --	3. p_line_number:	line number
1324   --
1325   -- OUT parameters:
1326   --	1. p_lane_id:		lane id of the lane number if exists in the table
1327   --	2. x_status:		status, -1 if no error
1328   --	3. x_error_msg:		error message if status <> -1
1329   ----------------------------------------------------------------------------
1330   PROCEDURE VALIDATE_LANE_NUMBER(p_lane_number	IN 	VARCHAR2,
1331 				 p_carrier_id	IN	NUMBER,
1332 				 p_line_number	IN	NUMBER,
1333 				 p_lane_id	OUT NOCOPY NUMBER,
1334 				 x_status	OUT NOCOPY NUMBER,
1335 				 x_error_msg	OUT NOCOPY VARCHAR2) IS
1336   l_module_name      CONSTANT VARCHAR2(100) := 'fte.plsql.' || G_PKG_NAME || '.VALIDATE_LANE_NUMBER';
1337   BEGIN
1338     FTE_UTIL_PKG.ENTER_DEBUG(l_module_name);
1339 
1340     IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
1341       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Lane Number', p_lane_number);
1342       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Carrier ID', p_carrier_id);
1343       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Line number', p_line_number);
1344     END IF;
1345     x_status := -1;
1346 
1347     IF (p_lane_number IS NULL) THEN
1348       x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_LANE_NUMBER_MISSING');
1349       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
1350                    		  p_msg  		=> x_error_msg,
1351                    		  p_category		=> 'A',
1352 				  p_line_number		=> p_line_number);
1353       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
1354       x_status := 1;
1355       RETURN;
1356     ELSIF (p_carrier_id <> -1) THEN
1357       -- Search for Lane Number in fte_lanes table
1358       -- Vijay: added clause to check if laneId is already populated
1359       p_lane_id := FTE_LANE_PKG.GET_LANE_ID(p_lane_number, p_carrier_id);
1360       IF (p_lane_id = -1) THEN
1361         x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_LANE_NUMBER_INVALID',
1362 					    p_tokens 		=> STRINGARRAY('SERVICE_NUMBER'),
1363                                 	    p_values 		=> STRINGARRAY(p_lane_number));
1364         FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
1365                    		    p_msg	  	=> x_error_msg,
1366                    		    p_category		=> 'C',
1367 				    p_line_number	=> p_line_number);
1368         FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
1369         x_status := 1;
1370 	RETURN;
1371       END IF;
1372     END IF;
1373     FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
1374   EXCEPTION
1375     WHEN OTHERS THEN
1376       x_error_msg := sqlerrm;
1377       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name => l_module_name,
1378              			  p_msg   	=> x_error_msg,
1379              			  p_category    => 'O',
1380 	        		  p_line_number	=> p_line_number);
1381       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
1382       x_status := 1;
1383       RETURN;
1384   END VALIDATE_LANE_NUMBER;
1385 
1386   ----------------------------------------------------------------------------
1387   -- PROCEDURE VALIDATE_ACTION
1388   --
1389   -- Purpose: check if the action is valid
1390   --
1391   -- IN parameters:
1392   --	1. p_action:		action value
1393   --	2. p_type:		block type
1394   --	3. p_line_number:	line number
1395   --
1396   -- OUT parameters:
1397   --	1. x_status:		status, -1 if no error
1398   --	2. x_error_msg:		error message if status <> -1
1399   ----------------------------------------------------------------------------
1400   PROCEDURE VALIDATE_ACTION(p_action		IN OUT 	NOCOPY VARCHAR2,
1401 			    p_type		IN	VARCHAR2,
1402 			    p_line_number	IN	NUMBER,
1403 			    x_status		OUT NOCOPY NUMBER,
1404 			    x_error_msg		OUT NOCOPY VARCHAR2) IS
1405   l_module_name      CONSTANT VARCHAR2(100) := 'fte.plsql.' || G_PKG_NAME || '.VALIDATE_ACTION';
1406   BEGIN
1407     FTE_UTIL_PKG.ENTER_DEBUG(l_module_name);
1408 
1409     IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
1410       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Action', p_action);
1411       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Type', p_type);
1412       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Line number', p_line_number);
1413     END IF;
1414     x_status := -1;
1415 
1416     IF (p_action IS NULL) THEN
1417       x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_ACTION_MISSING');
1418       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
1419                    		  p_msg  		=> x_error_msg,
1420                    		  p_category		=> 'A',
1421 				  p_line_number		=> p_line_number);
1422       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
1423       x_status := 1;
1424       RETURN;
1425     ELSE
1426       p_action := UPPER(p_action);
1427       IF (p_type = 'ZONE' AND p_action <> 'ADD') THEN
1428         x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_ACTION_INVALID_ZONE',
1429 					    p_tokens 		=> STRINGARRAY('ACTION'),
1430                 	                    p_values 		=> STRINGARRAY(p_action));
1431         FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
1432                    		    p_msg	  	=> x_error_msg,
1433                    		    p_category		=> 'D',
1434 				    p_line_number	=> p_line_number);
1435         FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
1436         x_status := 1;
1437 	RETURN;
1438       END IF;
1439 
1440       IF (p_type = 'REGION' AND p_action <> 'ADD') THEN
1441         x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_ACTION_INVALID_REGION',
1442 					    p_tokens 		=> STRINGARRAY('ACTION'),
1443         	                            p_values 		=> STRINGARRAY(p_action));
1444         FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
1445                    		    p_msg	  	=> x_error_msg,
1446                    		    p_category		=> 'D',
1447 				    p_line_number	=> p_line_number);
1448         FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
1449         x_status := 1;
1450 	RETURN;
1451       END IF;
1452 
1453       IF (p_type = 'TL_SERVICES' AND p_action = 'SYNC') THEN
1454         x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_ACTION_INVALID');
1455         FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
1456                    		    p_msg	  	=> x_error_msg,
1457                    		    p_category		=> 'D',
1458 				    p_line_number	=> p_line_number);
1459         FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
1460         x_status := 1;
1461 	RETURN;
1462       END IF;
1463 
1464       IF (p_type IN ('SERVICE_RATING_SETUP', 'TL_SERVICES', 'LANE_SERVICE')
1465 	  AND p_action NOT IN ('SYNC', 'DELETE', 'ADD', 'UPDATE')) THEN
1466         x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_ACTION_INVALID');
1467         FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
1468                    		    p_msg	  	=> x_error_msg,
1469                    		    p_category		=> 'D',
1470 				    p_line_number	=> p_line_number);
1471         FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
1472         x_status := 1;
1473 	RETURN;
1474       END IF;
1475 
1476       IF (p_type = 'SCHEDULE' AND p_action NOT IN ('SYNC', 'DELETE', 'ADD')) THEN
1477         x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_ACTION_INVALID');
1478         FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
1479                    		    p_msg	  	=> x_error_msg,
1480                    		    p_category		=> 'D',
1481 				    p_line_number	=> p_line_number);
1482         FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
1483         x_status := 1;
1484 	RETURN;
1485       END IF;
1486 
1487       IF (p_type = 'LANE_COMMODITY_TYPE' AND p_action NOT IN ('ADD', 'DELETE')) THEN
1488         x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_COMM_TYPES_INV_ACT');
1489         FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
1490                    		    p_msg	  	=> x_error_msg,
1491                    		    p_category		=> 'D',
1492 				    p_line_number	=> p_line_number);
1493         FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
1494         x_status := 1;
1495 	RETURN;
1496       END IF;
1497 
1498       IF (p_type = 'LANE_SERVICE_LEVEL' AND p_action NOT IN ('ADD', 'DELETE')) THEN
1499         x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_SERV_TYPES_INV_ACT');
1500         FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
1501                    		    p_msg	  	=> x_error_msg,
1502                    		    p_category		=> 'D',
1503 				    p_line_number	=> p_line_number);
1504         FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
1505         x_status := 1;
1506 	RETURN;
1507       END IF;
1508 
1509       IF (p_type = 'LANE_RATE_CHART' AND p_action NOT IN ('ADD', 'DELETE')) THEN
1510         x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_FIELD_RATE_CHART_INV_ACT');
1511         FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
1512                    		    p_msg	  	=> x_error_msg,
1513                    		    p_category		=> 'D',
1514 				    p_line_number	=> p_line_number);
1515         FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
1516         x_status := 1;
1517 	RETURN;
1518       END IF;
1519 
1520       IF (p_type = 'RATE_CHART' AND p_action NOT IN ('ADD', 'UPDATE', 'DELETE', 'APPEND')) THEN
1521         x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_ACTION_INVALID');
1522         FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
1523                    		    p_msg	  	=> x_error_msg,
1524                    		    p_category		=> 'D',
1525 				    p_line_number	=> p_line_number);
1526         FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
1527         x_status := 1;
1528 	RETURN;
1529       END IF;
1530 
1531       IF (p_type IN ('RATE_LINE', 'TL_SURCHARGES') AND p_action NOT IN ('ADD', 'UPDATE', 'DELETE')) THEN
1532         x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_ACTION_INVALID');
1533         FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
1534                    		    p_msg	  	=> x_error_msg,
1535                    		    p_category		=> 'D',
1536 				    p_line_number	=> p_line_number);
1537         FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
1538         x_status := 1;
1539 	RETURN;
1540       END IF;
1541 
1542       IF (p_type IN ('RATING_ATTRIBUTE', 'RATE_BREAK') AND p_action NOT IN ('ADD', 'UPDATE')) THEN
1543         x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_ACTION_INVALID');
1544         FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
1545                    		    p_msg	  	=> x_error_msg,
1546                    		    p_category		=> 'D',
1547 				    p_line_number	=> p_line_number);
1548         FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
1549         x_status := 1;
1550 	RETURN;
1551       END IF;
1552 
1553       IF (p_type IN ('ADJUSTED_RATE_CHART', 'QUALIFIER') AND p_action <> 'ADD') THEN
1554         x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_ACTION_INVALID');
1555         FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
1556                    		    p_msg	  	=> x_error_msg,
1557                    		    p_category		=> 'D',
1558 				    p_line_number	=> p_line_number);
1559         FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
1560         x_status := 1;
1561 	RETURN;
1562       END IF;
1563     END IF;
1564     FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
1565   EXCEPTION
1566     WHEN OTHERS THEN
1567       x_error_msg := sqlerrm;
1568       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name => l_module_name,
1569              			  p_msg   	=> x_error_msg,
1570              			  p_category    => 'O',
1571 	        		  p_line_number	=> p_line_number);
1572       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
1573       x_status := 1;
1574       RETURN;
1575   END VALIDATE_ACTION;
1576 
1577   ----------------------------------------------------------------------------
1578   -- PROCEDURE VALIDATE_UOM
1579   --
1580   -- Purpose: check if the uom is valid
1581   --
1582   -- IN parameters:
1583   --	1. p_uom:		uom value
1584   --	2. p_class:		uom class
1585   --	3. p_line_number:	line number
1586   --
1587   -- OUT parameters:
1588   --	1. p_uom_code:		the uom code for the uom name
1589   --	2. x_status:		status, -1 if no error
1590   --	3. x_error_msg:		error message if status <> -1
1591   ----------------------------------------------------------------------------
1592   PROCEDURE VALIDATE_UOM(p_uom		IN	VARCHAR2,
1593 			 p_class	IN	VARCHAR2,
1594 			 p_line_number	IN	NUMBER,
1595 			 p_uom_code	OUT NOCOPY VARCHAR2,
1596 			 x_status	OUT NOCOPY NUMBER,
1597 			 x_error_msg	OUT NOCOPY VARCHAR2) IS
1598   l_module_name      CONSTANT VARCHAR2(100) := 'fte.plsql.' || G_PKG_NAME || '.VALIDATE_UOM';
1599   BEGIN
1600     FTE_UTIL_PKG.ENTER_DEBUG(l_module_name);
1601 
1602     IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
1603       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'UOM', p_uom);
1604       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Class', p_class);
1605       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Line number', p_line_number);
1606     END IF;
1607     x_status := -1;
1608 
1609     p_uom_code := FTE_UTIL_PKG.GET_UOM_CODE(p_uom, p_class);
1610     IF (p_uom_code IS NULL) THEN
1611       IF (p_class IS NULL) THEN
1612         x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_UOM_INVALID',
1613 					    p_tokens 		=> STRINGARRAY('UOM'),
1614         	                            p_values 		=> STRINGARRAY(p_uom));
1615         FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
1616                    		    p_msg	  	=> x_error_msg,
1617                    		    p_category		=> 'B',
1618 				    p_line_number	=> p_line_number);
1619         FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
1620         x_status := 1;
1621 	RETURN;
1622       ELSIF (p_class = 'Weight') THEN
1623         x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_WT_UOM_INVALID',
1624 					    p_tokens 		=> STRINGARRAY('UOM'),
1625                         	            p_values 		=> STRINGARRAY(p_uom));
1626         FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
1627                    		    p_msg	  	=> x_error_msg,
1628                    		    p_category		=> 'A',
1629 				    p_line_number	=> p_line_number);
1630         FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
1631         x_status := 1;
1632 	RETURN;
1633       ELSIF (p_class = 'Volume') THEN
1634         x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_VOL_UOM_INVALID',
1635 					    p_tokens 		=> STRINGARRAY('UOM'),
1636         	                            p_values 		=> STRINGARRAY(p_uom));
1637         FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
1638                    		    p_msg	  	=> x_error_msg,
1639                    		    p_category		=> 'A',
1640 				    p_line_number	=> p_line_number);
1641         FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
1642         x_status := 1;
1643 	RETURN;
1644       ELSIF (p_class = 'Length') THEN
1645         x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_DIM_UOM_INVALID',
1646 					    p_tokens 		=> STRINGARRAY('UOM'),
1647         	                            p_values 		=>STRINGARRAY(p_uom));
1648         FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
1649                    		    p_msg	  	=> x_error_msg,
1650                    		    p_category		=> 'A',
1651 				    p_line_number	=> p_line_number);
1652         FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
1653         x_status := 1;
1654 	RETURN;
1655       ELSIF (p_class = 'Time') THEN
1656         x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_UOM_INVALID',
1657 					    p_tokens 		=> STRINGARRAY('UOM'),
1658         	                            p_values 		=> STRINGARRAY(p_uom));
1659         FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
1660                    		    p_msg	  	=> x_error_msg,
1661                    		    p_category		=> 'B',
1662 				    p_line_number	=> p_line_number);
1663         FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
1664         x_status := 1;
1665 	RETURN;
1666       END IF;
1667     END IF;
1668     FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
1669   EXCEPTION
1670     WHEN OTHERS THEN
1671       x_error_msg := sqlerrm;
1672       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name => l_module_name,
1673              			  p_msg   	=> x_error_msg,
1674              			  p_category    => 'O',
1675 	        		  p_line_number	=> p_line_number);
1676       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
1677       x_status := 1;
1678       RETURN;
1679   END VALIDATE_UOM;
1680 
1681   ----------------------------------------------------------------------------
1682   -- PROCEDURE VALIDATE_MODE_OF_TRANS
1683   --
1684   -- Purpose: check if the mode of transportation is valid
1685   --
1686   -- IN parameters:
1687   --	1. p_mode:		mode of transportation value
1688   --	2. p_line_number:	line number
1689   --	3. p_carrier_id:	carrier id
1690   --
1691   -- OUT parameters:
1692   --	1. p_mode_code:		the mode of transportation code
1693   --	2. x_status:		status, -1 if no error
1694   --	3. x_error_msg:		error message if status <> -1
1695   ----------------------------------------------------------------------------
1696   PROCEDURE VALIDATE_MODE_OF_TRANS(p_mode		IN	VARCHAR2,
1697 			 	   p_line_number	IN	NUMBER,
1698 				   p_carrier_id		IN	NUMBER,
1699 			 	   p_mode_code		OUT NOCOPY VARCHAR2,
1700 			 	   x_status		OUT NOCOPY NUMBER,
1701 			 	   x_error_msg		OUT NOCOPY VARCHAR2) IS
1702 
1703   CURSOR GET_CARRIER_MODE (p_carrier_id IN NUMBER, p_mode IN VARCHAR2) IS
1704     SELECT mode_of_transport
1705       FROM wsh_carrier_services
1706      WHERE carrier_id = p_carrier_id
1707        AND mode_of_transport = p_mode
1708        AND nvl(enabled_flag,'N') = 'Y';
1709 
1710   l_mode	VARCHAR2(50);
1711 
1712   l_module_name      CONSTANT VARCHAR2(100) := 'fte.plsql.' || G_PKG_NAME || '.VALIDATE_MODE_OF_TRANS';
1713   BEGIN
1714     FTE_UTIL_PKG.ENTER_DEBUG(l_module_name);
1715 
1716     IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
1717       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Mode', p_mode);
1718       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Carrier ID', p_carrier_id);
1719       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Line number', p_line_number);
1720     END IF;
1721     x_status := -1;
1722 
1723     IF (p_mode IS NULL) THEN
1724       x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_MODE_OF_TRANS_MISSING');
1725       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name => l_module_name,
1726                    		  p_msg  	=> x_error_msg,
1727                    		  p_category	=> 'A',
1728 				  p_line_number	=> p_line_number);
1729       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
1730       x_status := 1;
1731       RETURN;
1732     ELSE
1733       p_mode_code := FTE_UTIL_PKG.GET_LOOKUP_CODE('WSH_MODE_OF_TRANSPORT', p_mode);
1734       IF (p_mode_code IS NOT NULL) THEN
1735         OPEN GET_CARRIER_MODE(p_carrier_id, p_mode_code);
1736 	FETCH GET_CARRIER_MODE INTO l_mode;
1737 	CLOSE GET_CARRIER_MODE;
1738 	IF (l_mode IS NOT NULL) THEN
1739           FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
1740           RETURN;
1741 	ELSE
1742           x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CARRIER_MODE_INVALID',
1743 					      p_tokens		=> STRINGARRAY('MODE'),
1744 					      p_values		=> STRINGARRAY(p_mode));
1745           FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
1746                    		      p_msg	  	=> x_error_msg,
1747                    		      p_category	=> 'D',
1748 				      p_line_number	=> p_line_number);
1749           FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
1750           x_status := 1;
1751 	  RETURN;
1752 	END IF;
1753       ELSE
1754         x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_MODE_OF_TRANS_INVALID',
1755 					    p_tokens		=> STRINGARRAY('MODE'),
1756 					    p_values		=> STRINGARRAY(p_mode));
1757         FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
1758                    		    p_msg	  	=> x_error_msg,
1759                    		    p_category		=> 'D',
1760 				    p_line_number	=> p_line_number);
1761         FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
1762         x_status := 1;
1763 	RETURN;
1764       END IF;
1765     END IF;
1766     FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
1767   EXCEPTION
1768     WHEN OTHERS THEN
1769       IF (GET_CARRIER_MODE%ISOPEN) THEN
1770 	CLOSE GET_CARRIER_MODE;
1771       END IF;
1772       x_error_msg := sqlerrm;
1773       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name => l_module_name,
1774              			  p_msg   	=> x_error_msg,
1775              			  p_category    => 'O',
1776 	        		  p_line_number	=> p_line_number);
1777       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
1778       x_status := 1;
1779       RETURN;
1780   END VALIDATE_MODE_OF_TRANS;
1781 
1782   ----------------------------------------------------------------------------
1783   -- PROCEDURE VALIDATE_RATING_ZONE_CHART
1784   --
1785   -- Purpose: does validation for one line in rating zone chart block
1786   --
1787   -- IN parameters:
1788   --	1. p_values:	  pl/sql table of the rating zone chart line
1789   --	2. p_line_number: line number of current line
1790   --
1791   -- OUT parameters:
1792   --	1. p_chart_info: 	a STRINGARRAY that contains name_prefix, mode_of_trans, carrier_name,
1793   --				carrier_id, price_prefix, view_flag, start_date, and end_date
1794   --	2. x_status:		status of the processing, -1 means no error
1795   --	3. x_error_msg:		error message if any.
1796   ----------------------------------------------------------------------------
1797   PROCEDURE VALIDATE_RATING_ZONE_CHART(p_values		IN		FTE_BULKLOAD_PKG.data_values_tbl,
1798 				       p_line_number	IN		NUMBER,
1799 				       p_chart_info	OUT NOCOPY	STRINGARRAY,
1800 				       x_status		OUT NOCOPY	NUMBER,
1801 				       x_error_msg	OUT NOCOPY	VARCHAR2) IS
1802 
1803   l_name_prefix		VARCHAR2(200);
1804   l_mode_of_trans	VARCHAR2(200);
1805   l_carrier_name	VARCHAR2(200);
1806   l_price_prefix	VARCHAR2(200);
1807   l_view_flag		VARCHAR2(10);
1808   l_start_date		VARCHAR2(100);
1809   l_end_date		VARCHAR2(100);
1810   l_carrier_id		NUMBER := NULL;
1811   l_mode_code		VARCHAR2(100);
1812 
1813   l_module_name      CONSTANT VARCHAR2(100) := 'fte.plsql.' || G_PKG_NAME || '.VALIDATE_RATING_ZONE_CHART';
1814   BEGIN
1815     FTE_UTIL_PKG.ENTER_DEBUG(l_module_name);
1816 
1817     x_status := -1;
1818 
1819     l_name_prefix 	:= FTE_UTIL_PKG.GET_DATA('NAME_PREFIX', p_values);
1820     l_mode_of_trans 	:= FTE_UTIL_PKG.GET_DATA('MODE_OF_TRANSPORTATION', p_values);
1821     l_carrier_name 	:= FTE_UTIL_PKG.GET_DATA('CARRIER_NAME', p_values);
1822     l_price_prefix 	:= FTE_UTIL_PKG.GET_DATA('RATE_CHART_PREFIX', p_values);
1823     l_view_flag   	:= FTE_UTIL_PKG.GET_DATA('RATE_CHART_VIEW_FLAG', p_values);
1824     l_start_date   	:= FTE_UTIL_PKG.GET_DATA('START_DATE', p_values);
1825     l_end_date     	:= FTE_UTIL_PKG.GET_DATA('END_DATE', p_values);
1826 
1827     IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
1828       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Name prefix', l_name_prefix );
1829       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Mode of transportation', l_mode_of_trans);
1830       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Carrier name', l_carrier_name );
1831       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Rate chart prefix', l_price_prefix );
1832       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Rate chart view flag', l_view_flag );
1833       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Start date', l_start_date );
1834       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'End date', l_end_date );
1835       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Line number', p_line_number);
1836     END IF;
1837 
1838     -- carrier name validation
1839     VALIDATE_CARRIER(p_carrier_name	=> l_carrier_name,
1840 		     p_line_number	=> p_line_number,
1841 		     p_carrier_id	=> l_carrier_id,
1842 		     x_status		=> x_status,
1843 		     x_error_msg	=> x_error_msg);
1844 
1845     IF (x_status <> -1) THEN
1846       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
1847       RETURN;
1848     END IF;
1849 
1850     -- Mode of Transportation
1851     -- modeOfTrans = "Multi-Modal";
1852     VALIDATE_MODE_OF_TRANS(p_mode	=> l_mode_of_trans,
1853 			   p_line_number	=> p_line_number,
1854 			   p_carrier_id	=> l_carrier_id,
1855 			   p_mode_code	=> l_mode_code,
1856 			   x_status	=> x_status,
1857 			   x_error_msg	=> x_error_msg);
1858 
1859     IF (x_status <> -1) THEN
1860       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
1861       RETURN;
1862     END IF;
1863 
1864     IF (l_view_flag IS NULL) THEN
1865       l_view_flag := 'N';
1866     ELSIF (l_view_flag NOT IN ('Y', 'N')) THEN
1867       x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_PRICELIST_VIEW_INVALID',
1868 					  p_tokens	=> STRINGARRAY('FLAG'),
1869 					  p_values	=> STRINGARRAY(l_view_flag));
1870       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name => l_module_name,
1871                    		  p_msg 	=> x_error_msg,
1872                    		  p_category	=> 'D',
1873 				  p_line_number	=> p_line_number);
1874       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
1875       x_status := 1;
1876       RETURN;
1877     END IF;
1878 
1879     -- Validation for START_DATE
1880 
1881     VALIDATE_DATE(p_date => l_start_date,
1882 		  p_line_number => p_line_number,
1883 		  x_status => x_status,
1884 		  x_error_msg => x_error_msg);
1885 
1886     IF (x_status <> -1) THEN
1887       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
1888       RETURN;
1889     END IF;
1890 
1891     -- Validation for END_DATE
1892 
1893     VALIDATE_DATE(p_date => l_end_date,
1894 		  p_line_number => p_line_number,
1895 		  x_status => x_status,
1896 		  x_error_msg => x_error_msg);
1897 
1898     IF (x_status <> -1) THEN
1899       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
1900       RETURN;
1901     END IF;
1902 
1903     --VALIDATE_EFFECTIVE_DATE
1904 
1905     p_chart_info := STRINGARRAY(l_name_prefix, l_mode_of_trans, '', l_carrier_name,
1906             			l_price_prefix, l_view_flag, l_carrier_id,
1907             			l_start_date, l_end_date);
1908     FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
1909   EXCEPTION
1910     WHEN OTHERS THEN
1911       x_error_msg := sqlerrm;
1912       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name => l_module_name,
1913              			  p_msg   	=> x_error_msg,
1914              			  p_category    => 'O',
1915 	        		  p_line_number	=> p_line_number);
1916       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
1917       x_status := 1;
1918       RETURN;
1919   END VALIDATE_RATING_ZONE_CHART;
1920 
1921   ----------------------------------------------------------------------------
1922   -- PROCEDURE VALIDATE_RATING_SETUP
1923   --
1924   -- Purpose: does validation for one line in rating setup block
1925   --
1926   -- IN parameters:
1927   --	1. p_values:	pl/sql table of rating setup line
1928   --	2. p_line_number: line number of current line
1929   --
1930   -- OUT parameters:
1931   --	1. p_setup_info:	table of service information
1932   --	2. p_last_service_type:	last line's service type
1933   --	3. x_status:		status of the processing, -1 means no error
1934   --	4. x_error_msg:		error message if any.
1935   ----------------------------------------------------------------------------
1936   PROCEDURE VALIDATE_RATING_SETUP(p_values		IN		FTE_BULKLOAD_PKG.data_values_tbl,
1937 				  p_line_number		IN		NUMBER,
1938 				  p_setup_info		IN OUT NOCOPY	FTE_BULKLOAD_PKG.array_tbl,
1939 				  p_last_service_type	IN OUT NOCOPY	VARCHAR2,
1940 				  x_status		OUT NOCOPY	NUMBER,
1941 				  x_error_msg		OUT NOCOPY	VARCHAR2) IS
1942 
1943   l_service_type	VARCHAR2(200);
1944   l_type		VARCHAR2(200);
1945   l_subtype		VARCHAR2(200);
1946   l_name		VARCHAR2(200);
1947   l_value_from		VARCHAR2(200);
1948   l_value_to		VARCHAR2(200);
1949   l_uom			VARCHAR2(100);
1950   l_currency		VARCHAR2(100);
1951   l_count		NUMBER;
1952   l_service		VARCHAR2(100);
1953 
1954   l_module_name      CONSTANT VARCHAR2(100) := 'fte.plsql.' || G_PKG_NAME || '.VALIDATE_RATING_SETUP';
1955   BEGIN
1956     FTE_UTIL_PKG.ENTER_DEBUG(l_module_name);
1957 
1958     x_status := -1;
1959 
1960     l_service_type	:= FTE_UTIL_PKG.GET_DATA('SERVICE_LEVEL', p_values);
1961     l_type		:= FTE_UTIL_PKG.GET_DATA('TYPE', p_values);
1962     l_subtype		:= FTE_UTIL_PKG.GET_DATA('SUBTYPE', p_values);
1963     l_name		:= FTE_UTIL_PKG.GET_DATA('NAME', p_values);
1964     l_value_from	:= FTE_UTIL_PKG.GET_DATA('VALUE_FROM', p_values);
1965     l_value_to		:= FTE_UTIL_PKG.GET_DATA('VALUE_TO', p_values);
1966     l_uom		:= FTE_UTIL_PKG.GET_DATA('UOM', p_values);
1967     l_currency		:= FTE_UTIL_PKG.GET_DATA('CURRENCY', p_values);
1968 
1969     IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
1970       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Service Level', l_service_type);
1971       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Type', l_type);
1972       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Subtype', l_subtype);
1973       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Name', l_name);
1974       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Value from', l_value_from);
1975       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Value to', l_value_to);
1976       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Uom', l_uom);
1977       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Currency', l_currency);
1978       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Line number', p_line_number);
1979     END IF;
1980 
1981     l_service := Validate_Service_Level (p_carrier_id		=> NULL,
1982                             		 p_carrier_name		=> NULL,
1983                             		 p_service_level 	=> l_service_type,
1984                             		 p_line_number		=> p_line_number,
1985                   			 x_status 		=> x_status,
1986                             		 x_error_msg 		=> x_error_msg);
1987 
1988     IF (x_status <> -1) THEN
1989       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
1990       RETURN;
1991     END IF;
1992 
1993     l_count := p_setup_info.COUNT+1;
1994     IF (p_last_service_type IS NULL OR (p_last_service_type IS NOT NULL AND l_service_type <> p_last_service_type)) THEN
1995       p_setup_info(l_count) := STRINGARRAY(l_service_type, l_type, l_subtype, l_name,
1996 						      l_value_from, l_value_to, l_uom, l_currency);
1997     ELSE
1998       p_setup_info(l_count) := STRINGARRAY('', l_type, l_subtype, l_name,
1999 						      l_value_from, l_value_to, l_uom, l_currency);
2000     END IF;
2001 
2002     p_last_service_type := l_service_type;
2003 
2004     FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
2005   EXCEPTION
2006     WHEN OTHERS THEN
2007       x_error_msg := sqlerrm;
2008       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name => l_module_name,
2009              			  p_msg   	=> x_error_msg,
2010              			  p_category    => 'O',
2011 	        		  p_line_number	=> p_line_number);
2012       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
2013       x_status := 1;
2014       RETURN;
2015   END VALIDATE_RATING_SETUP;
2016 
2017   ----------------------------------------------------------------------------
2018   -- PROCEDURE VALIDATE_ORIGIN
2019   --
2020   -- Purpose: does validation for one line in origin block
2021   --
2022   -- IN parameters:
2023   --	1. p_values:	pl/sql table of origin line
2024   --	2. p_line_number: line number of current line
2025   --
2026   -- OUT parameters:
2027   --	1. p_origin:		STRINGARRAY of origin_postal, origin_country, origin_state, and origin_city
2028   --	2. x_status:		status of the processing, -1 means no error
2029   --	3. x_error_msg:		error message if any.
2030   ----------------------------------------------------------------------------
2031   PROCEDURE VALIDATE_ORIGIN(p_values		IN		FTE_BULKLOAD_PKG.data_values_tbl,
2032 			    p_line_number	IN		NUMBER,
2033 			    p_origin		OUT NOCOPY	STRINGARRAY,
2034 			    x_status		OUT NOCOPY	NUMBER,
2035 			    x_error_msg		OUT NOCOPY	VARCHAR2) IS
2036 
2037   l_origin_postal	VARCHAR2(200);
2038   l_origin_country	VARCHAR2(200);
2039   l_origin_state	VARCHAR2(200);
2040   l_origin_city		VARCHAR2(200);
2041 
2042   l_module_name      CONSTANT VARCHAR2(100) := 'fte.plsql.' || G_PKG_NAME || '.VALIDATE_ORIGIN';
2043   BEGIN
2044     FTE_UTIL_PKG.ENTER_DEBUG(l_module_name);
2045 
2046     x_status := -1;
2047 
2048     l_origin_postal	:= FTE_UTIL_PKG.GET_DATA('POSTAL_CODE_RANGE', p_values);
2049     l_origin_country	:= FTE_UTIL_PKG.GET_DATA('COUNTRY', p_values);
2050     l_origin_state	:= FTE_UTIL_PKG.GET_DATA('STATE', p_values);
2051     l_origin_city	:= FTE_UTIL_PKG.GET_DATA('CITY', p_values);
2052 
2053     IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
2054       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Country', l_origin_country);
2055       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'State', l_origin_state);
2056       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'City', l_origin_city);
2057       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Postal', l_origin_postal);
2058       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Line number', p_line_number);
2059     END IF;
2060 
2061     IF (l_origin_country IS NULL) THEN
2062       l_origin_country := 'US';
2063     END IF;
2064 
2065     IF (l_origin_postal IS NULL) THEN
2066       x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_POSTAL_MISSING');
2067       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name => l_module_name,
2068                    		  p_msg  	=> x_error_msg,
2069                    		  p_category	=> 'A',
2070 				  p_line_number	=> p_line_number);
2071       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
2072       x_status := 1;
2073       RETURN;
2074     END IF;
2075 
2076     p_origin := STRINGARRAY(l_origin_postal, l_origin_country, l_origin_state, l_origin_city);
2077 
2078     FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
2079   EXCEPTION
2080     WHEN OTHERS THEN
2081       x_error_msg := sqlerrm;
2082       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name => l_module_name,
2083              			  p_msg   	=> x_error_msg,
2084              			  p_category    => 'O',
2085 	        		  p_line_number	=> p_line_number);
2086       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
2087       x_status := 1;
2088       RETURN;
2089   END VALIDATE_ORIGIN;
2090 
2091   ----------------------------------------------------------------------------
2092   -- PROCEDURE VALIDATE_DESTINATION
2093   --
2094   -- Purpose: does validation for one line in destination block
2095   --
2096   -- IN parameters:
2097   --	1. p_values:		pl/sql table of destination line
2098   --	2. p_line_number: 	line number of current line
2099   --	3. p_price_prefix:	price prefix
2100   --	4. p_carrier_id:	carrier id
2101   --	5. p_origin_zone:	pl/sql table of origin zone info
2102   --	6. p_service_count:	number of service columns
2103   --	7. p_services:		service column names
2104   --
2105   -- OUT parameters:
2106   --	1. p_dest:		STRINGARRAY of dest_postal, dest_country, dest_state, and dest_city
2107   --	2. x_status:		status of the processing, -1 means no error
2108   --	3. x_error_msg:		error message if any.
2109   ----------------------------------------------------------------------------
2110   PROCEDURE VALIDATE_DESTINATION(p_values		IN OUT	NOCOPY	FTE_BULKLOAD_PKG.data_values_tbl,
2111 				 p_line_number		IN		NUMBER,
2112 				 p_price_prefix		IN		VARCHAR2,
2113 				 p_carrier_id		IN		NUMBER,
2114 				 p_origin_zone		IN		FTE_BULKLOAD_PKG.data_values_tbl,
2115 				 p_service_count	IN OUT NOCOPY	NUMBER,
2116 				 p_services		IN OUT NOCOPY	FTE_PARCEL_LOADER.service_array,
2117 				 p_dest			OUT NOCOPY	STRINGARRAY,
2118 				 x_status		OUT NOCOPY	NUMBER,
2119 				 x_error_msg		OUT NOCOPY	VARCHAR2) IS
2120 
2121   l_service_value	VARCHAR2(200);
2122   l_array		FTE_PARCEL_LOADER.service_array := FTE_PARCEL_LOADER.service_array();
2123   l_dest_postal		VARCHAR2(200);
2124   l_dest_country	VARCHAR2(200);
2125   l_dest_state		VARCHAR2(200);
2126   l_dest_city		VARCHAR2(200);
2127   l_result		BOOLEAN := FALSE;
2128 
2129   l_module_name      CONSTANT VARCHAR2(100) := 'fte.plsql.' || G_PKG_NAME || '.VALIDATE_DESTINATION';
2130   BEGIN
2131     FTE_UTIL_PKG.ENTER_DEBUG(l_module_name);
2132 
2133     x_status := -1;
2134 
2135     --checking the service columns
2136     --replace invalid PricelistNames with empty string("")
2137     --UPS has -, [1], [2], [3]
2138     --Fedex has *, NA
2139     FOR i IN 1..p_service_count LOOP
2140       l_service_value := p_values(FTE_BULKLOAD_PKG.g_block_header_index(p_services(i)));
2141       IF (l_service_value IS NULL OR l_service_value IN ('-', '*', 'NA')
2142 	  OR ((INSTR(l_service_value, '[') > 0) AND (INSTR(l_service_value, ']') > 0)
2143 	  AND (INSTR(l_service_value, ']') > INSTR(l_service_value, '[')))) THEN
2144         p_values(FTE_BULKLOAD_PKG.g_block_header_index(p_services(i))) := '';
2145       END IF;
2146       l_array.EXTEND;
2147       l_array(i) := l_service_value;
2148     END LOOP;
2149 
2150     l_result := IS_VALID_PRICELIST(p_array		=> l_array,
2151 			           p_service_count	=> p_service_count,
2152 			           p_price_prefix	=> p_price_prefix,
2153 			           p_carrier_id		=> p_carrier_id,
2154 			           p_line_number	=> p_line_number,
2155 			           x_status		=> x_status,
2156 			           x_error_msg		=> x_error_msg);
2157 
2158     IF (x_status <> -1 OR NOT l_result) THEN
2159       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
2160       RETURN;
2161     END IF;
2162 
2163     l_dest_postal	:= FTE_UTIL_PKG.GET_DATA('POSTAL_CODE_RANGE', p_values);
2164     l_dest_country	:= FTE_UTIL_PKG.GET_DATA('COUNTRY', p_values);
2165     l_dest_state	:= FTE_UTIL_PKG.GET_DATA('STATE', p_values);
2166     l_dest_city		:= FTE_UTIL_PKG.GET_DATA('CITY', p_values);
2167 
2168     IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
2169       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Country', l_dest_country);
2170       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'State', l_dest_state);
2171       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'City', l_dest_city);
2172       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Postal', l_dest_postal);
2173       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Line number', p_line_number);
2174     END IF;
2175 
2176     IF (l_dest_country IS NULL) THEN
2177       l_dest_country := p_origin_zone(FTE_VALIDATION_PKG.ZONE(3));
2178     END IF;
2179 
2180     IF (l_dest_state IS NULL) THEN
2181       l_dest_state := p_origin_zone(FTE_VALIDATION_PKG.ZONE(4));
2182     END IF;
2183 
2184     IF (l_dest_city IS NULL) THEN
2185       l_dest_city := p_origin_zone(FTE_VALIDATION_PKG.ZONE(5));
2186     END IF;
2187 
2188     IF (l_dest_postal IS NULL) THEN
2189       x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_POSTAL_MISSING');
2190       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name => l_module_name,
2191                    		  p_msg  	=> x_error_msg,
2192                    		  p_category	=> 'A',
2193 				  p_line_number	=> p_line_number);
2194       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
2195       x_status := 1;
2196       RETURN;
2197     END IF;
2198 
2199     p_dest := STRINGARRAY(l_dest_postal, l_dest_country, l_dest_state, l_dest_city);
2200 
2201     FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
2202   EXCEPTION
2203     WHEN OTHERS THEN
2204       x_error_msg := sqlerrm;
2205       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name => l_module_name,
2206              			  p_msg   	=> x_error_msg,
2207              			  p_category    => 'O',
2208 	        		  p_line_number	=> p_line_number);
2209       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
2210       x_status := 1;
2211       RETURN;
2212   END VALIDATE_DESTINATION;
2213 
2214   ----------------------------------------------------------------------------
2215   -- PROCEDURE VALIDATE_LANE_RATE_CHART
2216   --
2217   -- Purpose: does validation for a rate chart line in service block
2218   --
2219   -- IN parameters:
2220   --	1. p_values:		pl/sql table of lane's rate chart line
2221   --	2. p_line_number: 	line number of current line
2222   --	3. p_action:		action value of the line
2223   --  	4. p_lane_tbl:		pl/sql table for lanes
2224   --
2225   -- OUT parameters:
2226   --	1. p_lane_rate_chart_tbl: pl/sql table for lane rate charts
2227   --	2. x_status:		status of the processing, -1 means no error
2228   --	3. x_error_msg:		error message if any.
2229   ----------------------------------------------------------------------------
2230   PROCEDURE VALIDATE_LANE_RATE_CHART(p_values		   IN		FTE_BULKLOAD_PKG.data_values_tbl,
2231 			  	     p_line_number	   IN		NUMBER,
2232 				     p_action		   IN		VARCHAR2,
2233 				     p_lane_tbl		   IN		FTE_LANE_PKG.lane_tbl,
2234 				     p_lane_rate_chart_tbl IN OUT NOCOPY FTE_LANE_PKG.lane_rate_chart_tbl,
2235 				     p_set_error           IN           BOOLEAN DEFAULT TRUE,
2236 				     x_status		   OUT NOCOPY	NUMBER,
2237 				     x_error_msg           OUT NOCOPY	VARCHAR2) IS
2238   l_rate_chart_name VARCHAR2(200);
2239   l_rate_chart_info STRINGARRAY := STRINGARRAY();
2240   l_count	NUMBER;
2241   l_module_name      CONSTANT VARCHAR2(100) := 'FTE.PLSQL.' || G_PKG_NAME || '.VALIDATE_LANE_RATE_CHART';
2242   BEGIN
2243     FTE_UTIL_PKG.ENTER_DEBUG(l_module_name);
2244 
2245     x_status := -1;
2246 
2247     IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
2248       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Action     ', p_action);
2249       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Lane ID    ', p_lane_tbl(p_lane_tbl.COUNT).lane_id);
2250       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Line number', p_line_number);
2251     END IF;
2252 
2253     IF (NOT p_lane_tbl(p_lane_tbl.COUNT).basis_flag) THEN
2254       x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_LANE_BASIS_MISSING');
2255       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
2256                    		 p_msg  	=> x_error_msg,
2257                    		 p_category	=> 'A',
2258 				 p_line_number	=> p_line_number);
2259       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
2260       x_status := 1;
2261       RETURN;
2262     END IF;
2263 
2264     IF (p_lane_tbl IS NOT NULL) THEN -- if service line is not missing
2265       IF (p_lane_tbl(p_lane_tbl.COUNT).lane_id <> 0) THEN
2266 
2267         l_rate_chart_name := FTE_UTIL_PKG.GET_DATA('RATE_CHART_NAME', p_values);
2268 	IF (l_rate_chart_name IS NULL) THEN
2269           x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_LANE_RATE_CHART_MISSING');
2270           FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
2271                      		     p_msg  		=> x_error_msg,
2272                    		     p_category		=> 'A',
2273 				     p_line_number	=> p_line_number);
2274           FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
2275           x_status := 1;
2276           RETURN;
2277        	END IF;
2278         l_rate_chart_info := FTE_RATE_CHART_PKG.GET_RATE_CHART_INFO(p_name		=> l_rate_chart_name,
2279 								    p_carrier_id	=> p_lane_tbl(p_lane_tbl.COUNT).carrier_id,
2280 								    x_status		=> x_status,
2281 								    x_error_msg		=> x_error_msg);
2282         IF (x_status <> -1) THEN
2283           FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
2284 	  RETURN;
2285 	END IF;
2286 
2287         IF (l_rate_chart_info IS  NULL) THEN
2288 
2289 	  IF ( p_set_error = FALSE) THEN
2290               x_status := -1;
2291 	      x_error_msg := 'Returning from VALIDATE_RATE_CHART with TRUE';
2292 	      FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
2293 	      RETURN;
2294 	  END IF;
2295 	  x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_RATE_CHART_UNKNOWN',
2296 					      p_tokens		=> STRINGARRAY('RATE_CHART'),
2297 					      p_values		=> STRINGARRAY(l_rate_chart_name));
2298           FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
2299                    		      p_msg	  	=> x_error_msg,
2300                    		      p_category	=> 'C',
2301 				      p_line_number	=> p_line_number);
2302           FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
2303           x_status := 1;
2304 	  RETURN;
2305 
2306         END IF;
2307 
2308         IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
2309       	  FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Rate chart name', l_rate_chart_name);
2310       	  FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'List header ID', l_rate_chart_info(1));
2311     	END IF;
2312 
2313         IF (p_action <> 'DELETE') THEN
2314 	  IF (FTE_LANE_PKG.CHECK_EXISTING_LOAD(p_id	=> p_lane_tbl(p_lane_tbl.COUNT).lane_id,
2315 					       p_table	=> 'FTE_LANE_RATE_CHARTS',
2316 					       p_code 	=> TO_NUMBER(l_rate_chart_info(1)),
2317 					       p_line_number => p_line_number,
2318 					       x_status	=> x_status,
2319 					       x_error_msg => x_error_msg)) THEN
2320 	    IF (x_status <> -1) THEN
2321               FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
2322   	      RETURN;
2323 	    END IF;
2324  	    x_status := 2;
2325 	    x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_LANE_RATE_CHART_EXIST',
2326 						p_tokens => STRINGARRAY('NAME'),
2327 						p_values => STRINGARRAY(l_rate_chart_name));
2328 	    FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name	=> l_module_name,
2329 				       p_msg		=> x_error_msg,
2330 				       p_category	=> 'D',
2331 				       p_line_number	=> p_line_number);
2332             FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
2333 	    RETURN;
2334 	  END IF;
2335 
2336 	  IF (FTE_LANE_PKG.VERIFY_OVERLAPPING_DATE(p_name	=> l_rate_chart_name,
2337 					           p_lane_id 	=> p_lane_tbl(p_lane_tbl.COUNT).lane_id,
2338 					           x_status	=> x_status,
2339 					           x_error_msg 	=> x_error_msg)) THEN
2340   	    x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_DATE_OVERLAP',
2341 					        p_tokens	=> STRINGARRAY('RATE_CHART1', 'RATE_CHART2'),
2342 					        p_values	=> STRINGARRAY(l_rate_chart_name, NULL));
2343             FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
2344                    		        p_msg	  	=> x_error_msg,
2345                    		        p_category	=> 'D',
2346 				        p_line_number	=> p_line_number);
2347             FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
2348             x_status := 1;
2349 	    RETURN;
2350 	  END IF;
2351         END IF;
2352 
2353         l_count := p_lane_rate_chart_tbl.COUNT+1;
2354         p_lane_rate_chart_tbl(l_count).lane_id := p_lane_tbl(p_lane_tbl.COUNT).lane_id;
2355         p_lane_rate_chart_tbl(l_count).list_header_id := TO_NUMBER(l_rate_chart_info(1));
2356 
2357         IF (l_rate_chart_info(2) IS NOT NULL) THEN
2358 	  BEGIN
2359 	    p_lane_rate_chart_tbl(l_count).start_date_active := TO_DATE(l_rate_chart_info(2), FTE_BULKLOAD_PKG.G_DATE_FORMAT2);
2360           EXCEPTION
2361             WHEN OTHERS THEN
2362 	      x_error_msg := sqlerrm;
2363               FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
2364                   			 p_msg   	=> x_error_msg,
2365              			      	 p_category    	=> 'O',
2366 	        		    	 p_line_number	=> p_line_number);
2367               FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
2368               x_status := 1;
2369               RETURN;
2370           END;
2371 
2372 	  IF (p_lane_rate_chart_tbl(l_count).start_date_active IS NULL) THEN
2373   	    x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_INCORRECT_DATE',
2374 					        p_tokens		=> STRINGARRAY('DATE'),
2375 					        p_values		=> STRINGARRAY(l_rate_chart_info(2)));
2376             FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name	 	=> l_module_name,
2377                      		        p_msg	  		=> x_error_msg,
2378                    		        p_category		=> 'D',
2379 				        p_line_number		=> p_line_number);
2380             FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
2381             x_status := 1;
2382             RETURN;
2383 	  END IF;
2384 
2385           IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
2386        	    FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Start date', l_rate_chart_info(2));
2387 	  END IF;
2388     	END IF;
2389 
2390         IF (l_rate_chart_info(3) IS NOT NULL) THEN
2391 	  BEGIN
2392   	    p_lane_rate_chart_tbl(l_count).end_date_active := TO_DATE(l_rate_chart_info(3), FTE_BULKLOAD_PKG.G_DATE_FORMAT2);
2393           EXCEPTION
2394             WHEN OTHERS THEN
2395 	      x_error_msg := sqlerrm;
2396               FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
2397                   			  p_msg   		=> x_error_msg,
2398              			      	  p_category    	=> 'O',
2399 	        		    	  p_line_number		=> p_line_number);
2400               FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
2401               x_status := 1;
2402               RETURN;
2403           END;
2404 
2405 	  IF (p_lane_rate_chart_tbl(l_count).end_date_active IS NULL) THEN
2406   	    x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_INCORRECT_DATE',
2407 					        p_tokens		=> STRINGARRAY('DATE'),
2408 					        p_values		=> STRINGARRAY(l_rate_chart_info(3)));
2409             FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 		=> l_module_name,
2410                    		        p_msg	  		=> x_error_msg,
2411                    		        p_category		=> 'D',
2412 				        p_line_number		=> p_line_number);
2413             FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
2414             x_status := 1;
2415             RETURN;
2416 	  END IF;
2417 
2418           IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
2419        	    FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'End date', l_rate_chart_info(3));
2420 	  END IF;
2421         END IF;
2422       END IF;
2423     ELSE
2424       x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_LANE_REF_MISSING');
2425       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name => l_module_name,
2426                    	          p_msg  	=> x_error_msg,
2427                    		  p_category	=> 'D',
2428 				  p_line_number	=> p_line_number);
2429       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
2430       x_status := 1;
2431       RETURN;
2432     END IF;
2433 
2434     FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
2435   EXCEPTION
2436     WHEN OTHERS THEN
2437       x_error_msg := sqlerrm;
2438       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name => l_module_name,
2439              			  p_msg   	=> x_error_msg,
2440              			  p_category    => 'O',
2441 	        		  p_line_number	=> p_line_number);
2442       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
2443       x_status := 1;
2444       RETURN;
2445   END VALIDATE_LANE_RATE_CHART;
2446 
2447   ----------------------------------------------------------------------------
2448   -- PROCEDURE VALIDATE_LANE_COMMODITY
2449   --
2450   -- Purpose: does validation for a commodity line in service block
2451   --
2452   -- IN parameters:
2453   --	1. p_values:		pl/sql table of the lane's commodity line
2454   --	2. p_line_number: 	line number of current line
2455   --	3. p_type:		type value of the line
2456   --	4. p_action:		action value of the line
2457   --  	5. p_lane_tbl:		pl/sql table for lanes
2458   --
2459   -- OUT parameters:
2460   --	1. p_lane_commodity_tbl: pl/sql table for lane commodity
2461   --	2. x_status:		status of the processing, -1 means no error
2462   --	3. x_error_msg:		error message if any.
2463   ----------------------------------------------------------------------------
2464   PROCEDURE VALIDATE_LANE_COMMODITY(p_values			IN		FTE_BULKLOAD_PKG.data_values_tbl,
2465 			  	    p_line_number		IN		NUMBER,
2466 				    p_type			IN		VARCHAR2,
2467 				    p_action			IN		VARCHAR2,
2468 				    p_lane_tbl			IN		FTE_LANE_PKG.lane_tbl,
2469 				    p_lane_commodity_tbl 	IN OUT	NOCOPY	FTE_LANE_PKG.lane_commodity_tbl,
2470 				    x_status			OUT NOCOPY	NUMBER,
2471 				    x_error_msg			OUT NOCOPY	VARCHAR2) IS
2472   l_catg_id	NUMBER := -1;
2473   l_count	NUMBER;
2474   l_com_class	VARCHAR2(100);
2475   l_com_type	VARCHAR2(100);
2476   l_basis	VARCHAR2(100);
2477   l_basis_code	VARCHAR2(100);
2478 
2479   l_module_name      CONSTANT VARCHAR2(100) := 'fte.plsql.' || G_PKG_NAME || '.VALIDATE_LANE_COMMODITY';
2480   BEGIN
2481     FTE_UTIL_PKG.ENTER_DEBUG(l_module_name);
2482 
2483     x_status := -1;
2484 
2485     IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
2486       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Type', p_type);
2487       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Action', p_action);
2488       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Line number', p_line_number);
2489     END IF;
2490 
2491     l_count := p_lane_commodity_tbl.COUNT+1;
2492 
2493     -- If the lane is deleted, or anything is wrong with the lane
2494     -- don't do anything with the Commodity...
2495     -- laneId is set to  0 when it's deleted in deleteLane
2496     -- laneId is set to -1 when there's any error with the lane
2497     IF (p_lane_tbl IS NOT NULL) THEN -- if service line is not missing
2498       IF (p_lane_tbl(p_lane_tbl.COUNT).lane_id <> 0) THEN
2499         l_com_class := p_lane_tbl(p_lane_tbl.COUNT).comm_fc_class_code;
2500         l_com_type  := FTE_UTIL_PKG.GET_DATA('COMMODITY_TYPE', p_values);
2501 
2502         IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
2503           FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Commodity class', l_com_class);
2504           FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Commodity type', l_com_type);
2505         END IF;
2506 
2507         IF (l_com_type IS NULL) THEN
2508 	  x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_COMM_TYPE_MISSING');
2509           FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
2510                    		     p_msg		=> x_error_msg,
2511                    		     p_category		=> 'A',
2512 				     p_line_number	=> p_line_number);
2513           FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
2514           x_status := 1;
2515 	  RETURN;
2516         END IF;
2517 
2518         IF (l_com_class IS NULL) THEN
2519 	  x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_COMM_CLASS_MISSING');
2520           FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
2521                    		     p_msg	  	=> x_error_msg,
2522                    		     p_category		=> 'A',
2523 				     p_line_number	=> p_line_number);
2524           FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
2525           x_status := 1;
2526 	  RETURN;
2527        	ELSE
2528           l_catg_id := FTE_UTIL_PKG.GET_CATG_ID(l_com_class, l_com_type);
2529 
2530           IF (l_catg_id = -1) THEN
2531             x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_COMMODITY_UNKNOWN',
2532 					        p_tokens	=> STRINGARRAY('COMMODITY'),
2533 				        	p_values	=> STRINGARRAY(l_com_type));
2534             FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
2535                   		        p_msg	  	=> x_error_msg,
2536                    		        p_category	=> 'D',
2537 				        p_line_number	=> p_line_number);
2538             FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
2539             x_status := 1;
2540 	    RETURN;
2541           ELSIF (l_catg_id = -2) THEN
2542             x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_COMMODITY_AMBIG',
2543 					        p_tokens	=> STRINGARRAY('COMMODITY'),
2544 					        p_values	=> STRINGARRAY(l_com_type));
2545             FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
2546                    		        p_msg	  	=> x_error_msg,
2547                    		        p_category	=> 'D',
2548 				        p_line_number	=> p_line_number);
2549             FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
2550             x_status := 1;
2551 	    RETURN;
2552           ELSIF (l_catg_id = -3) THEN
2553             x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_COMM_MISMATCH',
2554 					        p_tokens	=> STRINGARRAY('COMMODITY'),
2555 					        p_values	=> STRINGARRAY(l_com_type));
2556             FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
2557                    		        p_msg	  	=> x_error_msg,
2558                    		        p_category	=> 'D',
2559 				        p_line_number	=> p_line_number);
2560             FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
2561             x_status := 1;
2562 	    RETURN;
2563           ELSE
2564   	    IF (p_action = 'ADD') THEN
2565 	      IF (FTE_LANE_PKG.CHECK_EXISTING_LOAD(p_id		=> p_lane_tbl(p_lane_tbl.COUNT).lane_id,
2566 					           p_table	=> 'FTE_LANE_COMMODITIES',
2567 					           p_code 	=> l_catg_id,
2568 					           p_line_number => p_line_number,
2569 					           x_status	=> x_status,
2570 					           x_error_msg 	=> x_error_msg)) THEN
2571   	        IF (x_status <> -1) THEN
2572                   FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
2573   	          RETURN;
2574 	        END IF;
2575  	        x_status := 2;
2576 	        x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_LANE_COMMODITY_EXIST',
2577 						    p_tokens => STRINGARRAY('NAME'),
2578 						    p_values => STRINGARRAY(l_com_type));
2579 	        FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name	=> l_module_name,
2580 				           p_msg		=> x_error_msg,
2581 				           p_category		=> 'D',
2582 				           p_line_number	=> p_line_number);
2583                 FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
2584 	        RETURN;
2585 	      END IF;
2586 	    END IF;
2587             p_lane_commodity_tbl(l_count).commodity_catg_id := l_catg_id;
2588 	  END IF;
2589         END IF;
2590 
2591         -- Validation for BASIS
2592         l_basis := FTE_UTIL_PKG.GET_DATA('BASIS', p_values);
2593         IF (l_basis IS NULL OR p_lane_tbl(p_lane_tbl.COUNT).container_all_flag) THEN
2594           IF (NOT p_lane_tbl(p_lane_tbl.COUNT).basis_flag) THEN
2595             x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_BASIS_MISSING');
2596             FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
2597                    		       p_msg	  	=> x_error_msg,
2598                    		       p_category	=> 'A',
2599 				       p_line_number	=> p_line_number);
2600             FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
2601             x_status := 1;
2602 	    RETURN;
2603 	  END IF;
2604         ELSE
2605           l_basis_code := FTE_UTIL_PKG.GET_LOOKUP_CODE('FTE_BASES', l_basis);
2606           IF (l_basis_code IS NOT NULL) THEN
2607             p_lane_commodity_tbl(l_count).basis := l_basis_code;
2608 	    p_lane_commodity_tbl(l_count).basis_flag := true;
2609 	  ELSE
2610             x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_COMM_BASIS_INVALID',
2611 					        p_tokens	=> STRINGARRAY('BASIS'),
2612 					        p_values	=> STRINGARRAY(l_basis));
2613             FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
2614                    		        p_msg	  	=> x_error_msg,
2615                    		        p_category	=> 'D',
2616 				        p_line_number	=> p_line_number);
2617             FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
2618             x_status := 1;
2619 	    RETURN;
2620 	  END IF;
2621         END IF;
2622 
2623  	p_lane_commodity_tbl(l_count).lane_id := p_lane_tbl(p_lane_tbl.COUNT).lane_id;
2624 	p_lane_commodity_tbl(l_count).lane_commodity_id := FTE_LANE_PKG.GET_NEXT_LANE_COMMODITY_ID;
2625 
2626       END IF;
2627     ELSE
2628       x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_LANE_REF_MISSING');
2629       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name => l_module_name,
2630                    		  p_msg  	=> x_error_msg,
2631                    		  p_category	=> 'D',
2632 				  p_line_number	=> p_line_number);
2633       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
2634       x_status := 1;
2635       RETURN;
2636     END IF;
2637 
2638     FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
2639 
2640   EXCEPTION
2641     WHEN OTHERS THEN
2642       x_error_msg := sqlerrm;
2643       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name => l_module_name,
2644              			 p_msg   	=> x_error_msg,
2645              			 p_category    => 'O',
2646 	        		 p_line_number	=> p_line_number);
2647       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
2648       x_status := 1;
2649       RETURN;
2650   END VALIDATE_LANE_COMMODITY;
2651 
2652   ----------------------------------------------------------------------------
2653   -- PROCEDURE VALIDATE_LANE_SERVICE_LEVEL
2654   --
2655   -- Purpose: does validation for a service level line in service block
2656   --
2657   -- IN parameters:
2658   --	1. p_values:		pl/sql table of the lane's service level line
2659   --	2. p_line_number: 	line number of current line
2660   --	3. p_type:		type value of the line
2661   --	4. p_action:		action value of the line
2662   --  	5. p_lane_tbl:		pl/sql table for lanes
2663   --
2664   -- OUT parameters:
2665   --	1. p_lane_service_tbl: pl/sql table for lane service level
2666   --	2. x_status:		status of the processing, -1 means no error
2667   --	3. x_error_msg:		error message if any.
2668   ----------------------------------------------------------------------------
2669   PROCEDURE VALIDATE_LANE_SERVICE_LEVEL(p_values		IN		FTE_BULKLOAD_PKG.data_values_tbl,
2670 			  	    	p_line_number		IN		NUMBER,
2671 				    	p_type			IN		VARCHAR2,
2672 				    	p_action		IN		VARCHAR2,
2673 				    	p_lane_tbl		IN		FTE_LANE_PKG.lane_tbl,
2674 				    	p_lane_service_tbl 	IN OUT NOCOPY	FTE_LANE_PKG.lane_service_tbl,
2675 				    	x_status		OUT NOCOPY	NUMBER,
2676 				    	x_error_msg		OUT NOCOPY	VARCHAR2) IS
2677   l_service_level	VARCHAR2(100);
2678   l_service_code	VARCHAR2(100);
2679   l_count		NUMBER;
2680   l_carrier_name	VARCHAR2(100);
2681 
2682   l_module_name      CONSTANT VARCHAR2(100) := 'fte.plsql.' || G_PKG_NAME || '.VALIDATE_LANE_SERVICE_LEVEL';
2683   BEGIN
2684     FTE_UTIL_PKG.ENTER_DEBUG(l_module_name);
2685 
2686     x_status := -1;
2687 
2688     IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
2689       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Type', p_type);
2690       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Action', p_action);
2691       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Line number', p_line_number);
2692     END IF;
2693 
2694     -- If the lane is deleted, or anything is wrong with the lane
2695     -- don't do anything with the Types...
2696     -- laneId is set to  0 when it's deleted in deleteLane
2697     -- laneId is set to -1 when there's any error with the lane
2698     IF (p_lane_tbl IS NOT NULL) THEN -- if service line is not missing
2699       IF (p_lane_tbl(p_lane_tbl.COUNT).lane_id <> 0) THEN
2700 
2701         IF (p_type = 'SERVICE_LEVEL') THEN
2702           l_service_level := FTE_UTIL_PKG.GET_DATA('SERVICE_LEVEL', p_values);
2703 
2704           IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
2705             FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Service Level', l_service_level);
2706   	  END IF;
2707         END IF;
2708 
2709 	IF (l_service_level IS NULL) THEN
2710           x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_NO_SERVICE');
2711           FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
2712                    		      p_msg	  	=> x_error_msg,
2713                    		      p_category	=> 'D',
2714 				      p_line_number	=> p_line_number);
2715           FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
2716           x_status := 1;
2717 	  RETURN;
2718 	ELSE
2719    	  l_service_code := Validate_Service_Level (p_carrier_id	=> p_lane_tbl(p_lane_tbl.COUNT).carrier_id,
2720                                   		    p_carrier_name  	=> null,
2721                                   		    p_service_level 	=> l_service_level,
2722 						    p_line_number	=> p_line_number,
2723 				  		    x_status 		=> x_status,
2724                                     		    x_error_msg  	=> x_error_msg);
2725      	  IF (x_status <> -1) THEN
2726             FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
2727 	    RETURN;
2728 	  END IF;
2729 
2730           IF (l_service_code IS NULL) THEN
2731             x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_SERVICE_UNKNOWN',
2732 					        p_tokens	=> STRINGARRAY('SERVICE'),
2733 					        p_values	=> STRINGARRAY(l_service_level));
2734             FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
2735                    		        p_msg	  	=> x_error_msg,
2736                    		        p_category	=> 'D',
2737 				        p_line_number	=> p_line_number);
2738             FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
2739             x_status := 1;
2740 	    RETURN;
2741 	  ELSIF (p_type = 'SERVICE_LEVEL'
2742 		  AND NOT(VALIDATE_CARRIER_SERVICE(p_service_code 	=> l_service_code,
2743 						   p_carrier_id		=> p_lane_tbl(p_lane_tbl.COUNT).carrier_id,
2744 						   p_mode		=> p_lane_tbl(p_lane_tbl.COUNT).mode_of_transportation_code,
2745 						   p_line_number	=> p_line_number,
2746 						   x_status		=> x_status,
2747 						   x_error_msg		=> x_error_msg))) THEN
2748 	    -- checking if the carrier has the service level matching the mode
2749 	    IF (p_lane_tbl(p_lane_tbl.COUNT).mode_of_transportation_code IS NULL
2750 		  AND NOT(VALIDATE_CARRIER_SERVICE(p_service_code 	=> l_service_code,
2751 						   p_lane_id 		=> p_lane_tbl(p_lane_tbl.COUNT).lane_id,
2752 						   p_carrier_id		=> p_lane_tbl(p_lane_tbl.COUNT).carrier_id,
2753 						   p_mode		=> p_lane_tbl(p_lane_tbl.COUNT).mode_of_transportation_code,
2754 						   p_line_number	=> p_line_number,
2755 						   x_status		=> x_status,
2756 						   x_error_msg		=> x_error_msg))) THEN
2757 
2758   	      l_carrier_name := FTE_UTIL_PKG.GET_CARRIER_NAME(p_lane_tbl(p_lane_tbl.COUNT).carrier_id);
2759               x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CARRIER_SERVICE_INVALID',
2760 					          p_tokens	=> STRINGARRAY('SERVICE_LEVEL', 'CARRIER_NAME'),
2761 					          p_values	=> STRINGARRAY(l_service_level, l_carrier_name));
2762               FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
2763                    		         p_msg  	=> x_error_msg,
2764                    		         p_category	=> 'B',
2765 				         p_line_number	=> p_line_number);
2766               FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
2767               x_status := 1;
2768 	      RETURN;
2769 	    END IF;
2770  	  END IF;
2771 	END IF;
2772 
2773   	IF (p_action = 'ADD') THEN
2774 	  IF (FTE_LANE_PKG.CHECK_EXISTING_LOAD(p_id	=> p_lane_tbl(p_lane_tbl.COUNT).lane_id,
2775 					       p_table	=> 'FTE_LANE_SERVICES',
2776 					       p_code 	=> l_service_code,
2777 					       p_line_number => p_line_number,
2778 					       x_status	=> x_status,
2779 					       x_error_msg 	=> x_error_msg)) THEN
2780   	    IF (x_status <> -1) THEN
2781               FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
2782   	      RETURN;
2783 	    END IF;
2784  	    x_status := 2;
2785 	    x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_LANE_SERVICE_EXIST',
2786 						p_tokens => STRINGARRAY('NAME'),
2787 						p_values => STRINGARRAY(l_service_level));
2788 	    FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name	=> l_module_name,
2789 				       p_msg		=> x_error_msg,
2790 				       p_category	=> 'D',
2791 				       p_line_number	=> p_line_number);
2792             FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
2793 	    RETURN;
2794 	  END IF;
2795 	END IF;
2796 
2797 	l_count := p_lane_service_tbl.COUNT+1;
2798 
2799 	p_lane_service_tbl(l_count).service_code := l_service_code;
2800 	p_lane_service_tbl(l_count).lane_id := p_lane_tbl(p_lane_tbl.COUNT).lane_id;
2801 	p_lane_service_tbl(l_count).lane_service_id := FTE_LANE_PKG.GET_NEXT_LANE_SERVICE_ID;
2802 
2803       END IF;
2804     ELSE
2805       x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_LANE_REF_MISSING');
2806       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
2807                    		  p_msg  		=> x_error_msg,
2808                    		  p_category		=> 'D',
2809 				  p_line_number		=> p_line_number);
2810       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
2811       x_status := 1;
2812       RETURN;
2813     END IF;
2814 
2815     FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
2816 
2817   EXCEPTION
2818     WHEN OTHERS THEN
2819       x_error_msg := sqlerrm;
2820       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name => l_module_name,
2821              			  p_msg   	=> x_error_msg,
2822              			  p_category    => 'O',
2823 	        		  p_line_number	=> p_line_number);
2824       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
2825       x_status := 1;
2826       RETURN;
2827 
2828   END VALIDATE_LANE_SERVICE_LEVEL;
2829 
2830   ----------------------------------------------------------------------------
2831   -- PROCEDURE VALIDATE_SERVICE
2832   --
2833   -- Purpose: does validation for a line in service block
2834   --
2835   -- IN parameters:
2836   --	1. p_values:		pl/sql table of the service line
2837   --	2. p_line_number: 	line number of current line
2838   --
2839   -- OUT parameters:
2840   --	1. p_type:		type value of the line
2841   --	2. p_action:		action value of the line
2842   --	3. p_lane_tbl:		pl/sql table for lane
2843   --	4. p_lane_rate_chart_tbl: pl/sql table for lane rate chart
2844   --	5. p_lane_service_tbl:	pl/sql table for lane service
2845   --	6. p_lane_commodity_tbl: pl/sql table for lane commodity
2846   --	7. x_status:		status of the processing, -1 means no error
2847   --	8. x_error_msg:		error message if any.
2848   ----------------------------------------------------------------------------
2849   PROCEDURE VALIDATE_SERVICE(p_values			IN		FTE_BULKLOAD_PKG.data_values_tbl,
2850 			     p_line_number		IN		NUMBER,
2851 			     p_type			OUT NOCOPY	VARCHAR2,
2852 			     p_action			OUT NOCOPY	VARCHAR2,
2853 			     p_lane_tbl			IN OUT	NOCOPY	FTE_LANE_PKG.lane_tbl,
2854 			     p_lane_rate_chart_tbl 	IN OUT	NOCOPY	FTE_LANE_PKG.lane_rate_chart_tbl,
2855 			     p_lane_service_tbl		IN OUT	NOCOPY	FTE_LANE_PKG.lane_service_tbl,
2856 			     p_lane_commodity_tbl 	IN OUT	NOCOPY	FTE_LANE_PKG.lane_commodity_tbl,
2857 			     x_status			OUT NOCOPY	NUMBER,
2858 			     x_error_msg		OUT NOCOPY	VARCHAR2) IS
2859 
2860   l_effect_date		VARCHAR2(30);
2861   l_expiry_date		VARCHAR2(30);
2862   l_distance		VARCHAR2(30);
2863   l_distance_uom	VARCHAR2(10);
2864   l_transit		VARCHAR2(30);
2865   l_transit_uom		VARCHAR2(10);
2866   l_editable_flag	VARCHAR2(1) := NULL;
2867   l_mode		VARCHAR2(20);
2868   l_com_class		VARCHAR2(30);
2869   l_basis		VARCHAR2(30);
2870   l_view_flag		VARCHAR2(1);
2871   l_com_class_code	VARCHAR2(20);
2872   l_mode_code		VARCHAR2(20);
2873   l_basis_code		VARCHAR2(20);
2874   l_distance_uom_code	VARCHAR2(10);
2875   l_temp_number		VARCHAR2(60);
2876   l_count		NUMBER := 0;
2877   l_carrier_id		NUMBER := -1;
2878   l_rate_chart_id	NUMBER := -1;
2879   l_old_lane_id		NUMBER := -1;
2880   l_lane_number		VARCHAR2(200);
2881   l_carrier_name	VARCHAR2(200);
2882   l_rate_chart_name	VARCHAR2(200);
2883   l_transit_time_uom_code VARCHAR2(100);
2884   l_convert_date	DATE;
2885 
2886   l_region_info		wsh_regions_search_pkg.region_rec;
2887   l_region_id           wsh_regions.region_id%type;
2888 
2889   l_zone_id             NUMBER;
2890   l_module_name      CONSTANT VARCHAR2(100) := 'fte.plsql.' || G_PKG_NAME || '.VALIDATE_SERVICE';
2891 
2892   BEGIN
2893     FTE_UTIL_PKG.ENTER_DEBUG(l_module_name);
2894 
2895     x_status := -1;
2896 
2897     p_type	:= FTE_UTIL_PKG.GET_DATA('TYPE', p_values);
2898     p_action	:= FTE_UTIL_PKG.GET_DATA('ACTION', p_values);
2899 
2900     IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
2901       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Type', p_type);
2902       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Action', p_action);
2903       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Line number', p_line_number);
2904     END IF;
2905 
2906     IF (p_type IS NULL) THEN
2907       x_error_msg := FTE_UTIL_PKG.GET_MSG(P_Name => 'FTE_TYPE_MISSING');
2908       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
2909                    		 p_msg		=> x_error_msg,
2910                    		 p_category	=> 'A',
2911 				 p_line_number	=> p_line_number);
2912       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
2913       x_status := 1;
2914       RETURN;
2915     ELSE
2916       p_type := UPPER(p_type);
2917     END IF;
2918 
2919     IF (p_type NOT IN ('SERVICE', 'COMMODITY_TYPE', 'SERVICE_LEVEL', 'RATE_CHART')) THEN
2920       x_error_msg := FTE_UTIL_PKG.GET_MSG(P_Name => 'FTE_LANE_TYPE_UNKNOWN',
2921                                           P_Tokens => STRINGARRAY('TYPE'),
2922 					  P_values => STRINGARRAY(p_type));
2923       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
2924                    		 p_msg		=> x_error_msg,
2925                    		 p_category	=> 'D',
2926 				 p_line_number	=> p_line_number);
2927       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
2928       x_status := 1;
2929       RETURN;
2930     END IF;
2931 
2932     VALIDATE_ACTION(p_action	=> p_action,
2933 		    p_type	=> 'LANE_'||p_type,
2934 		    p_line_number => p_line_number,
2935 		    x_status	=> x_status,
2936 		    x_error_msg	=> x_error_msg);
2937 
2938     IF (x_status <> -1) THEN
2939       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
2940       RETURN;
2941     END IF;
2942 
2943     IF (p_type = 'SERVICE') THEN
2944       l_count := p_lane_tbl.COUNT+1;
2945       p_lane_tbl(l_count).action := p_action;
2946 
2947       l_lane_number	:= FTE_UTIL_PKG.GET_DATA('SERVICE_NUMBER', p_values);
2948       l_carrier_name	:= FTE_UTIL_PKG.GET_DATA('CARRIER_NAME', p_values);
2949       l_rate_chart_name := FTE_UTIL_PKG.GET_DATA('RATE_CHART_NAME', p_values);
2950       l_mode       	:= FTE_UTIL_PKG.GET_DATA('MODE_OF_TRANSPORTATION', p_values);
2951       l_com_class     	:= FTE_UTIL_PKG.GET_DATA('COMMODITY_CLASS', p_values);
2952       l_basis        	:= FTE_UTIL_PKG.GET_DATA('BASIS', p_values);
2953       l_view_flag    	:= FTE_UTIL_PKG.GET_DATA('RATE_CHART_VIEW_FLAG', p_values);
2954       l_distance     	:= FTE_UTIL_PKG.GET_DATA('DISTANCE', p_values);
2955       l_distance_uom 	:= FTE_UTIL_PKG.GET_DATA('DISTANCE_UOM', p_values);
2956       l_transit      	:= FTE_UTIL_PKG.GET_DATA('TRANSIT_TIME', p_values);
2957       l_transit_uom  	:= FTE_UTIL_PKG.GET_DATA('TRANSIT_TIME_UOM', p_values);
2958       l_effect_date  	:= FTE_UTIL_PKG.GET_DATA('START_DATE', p_values);
2959       l_expiry_date  	:= FTE_UTIL_PKG.GET_DATA('END_DATE', p_values);
2960       l_editable_flag 	:= FTE_UTIL_PKG.GET_DATA('EDITABLE_FLAG', p_values);
2961 
2962       IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
2963         FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Lane number', l_lane_number);
2964         FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Carrier name', l_carrier_name);
2965         FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Rate chart name', l_rate_chart_name);
2966         FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Mode of transportation', l_mode);
2967         FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Commodity class', l_com_class);
2968         FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Basis', l_basis);
2969         FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Rate chart view flag', l_view_flag);
2970         FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Distance', l_distance);
2971         FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Distance uom', l_distance_uom);
2972         FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Transit', l_transit);
2973         FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Transit UOM', l_transit_uom);
2974         FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Start date', l_effect_date);
2975         FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'End date', l_expiry_date);
2976         FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Editable flag', l_editable_flag);
2977       END IF;
2978 
2979       -- this boolean variable is true when :
2980       -- we load a TL_SERVICE and the Rate Chart is already in the system.
2981       -- In that case, we need to create the Service and we need to create a row into i
2982       -- FTE_LANE_RATE_CHARTS to attach the Service to the Rate Chart.
2983 
2984       IF (l_carrier_name IS NULL) THEN
2985         x_error_msg := FTE_UTIL_PKG.GET_MSG(P_Name => 'FTE_CAT_CARRIER_MISSING');
2986         FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
2987                      		   p_msg		=> x_error_msg,
2988                    		   p_category		=> 'A',
2989 				   p_line_number	=> p_line_number);
2990         FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
2991         x_status := 1;
2992         RETURN;
2993       ELSE
2994         VALIDATE_CARRIER(p_carrier_name	=> l_carrier_name,
2995 	    	         p_line_number	=> p_line_number,
2996 		         p_carrier_id	=> l_carrier_id,
2997 		         x_status	=> x_status,
2998 		         x_error_msg	=> x_error_msg);
2999 
3000         IF (x_status <> -1) THEN
3001           FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
3002           RETURN;
3003         END IF;
3004 
3005         p_lane_tbl(l_count).carrier_id := l_carrier_id;
3006       END IF;
3007 
3008       IF (l_lane_number IS NULL) THEN
3009         x_error_msg := FTE_UTIL_PKG.GET_MSG(P_Name => 'FTE_CAT_LANE_NUMBER_MISSING');
3010         FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
3011                      		   p_msg		=> x_error_msg,
3012                    		   p_category		=> 'A',
3013 				   p_line_number	=> p_line_number);
3014         FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
3015         x_status := 1;
3016  	RETURN;
3017       END IF;
3018 
3019       IF (p_action = 'UPDATE') THEN
3020         IF (l_lane_number IS NULL) THEN
3021           x_error_msg := FTE_UTIL_PKG.GET_MSG(P_Name => 'FTE_CAT_LANE_NUMBER_MISSING');
3022           FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
3023                      		     p_msg		=> x_error_msg,
3024                    		     p_category		=> 'A',
3025 				     p_line_number	=> p_line_number);
3026           FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
3027           x_status := 1;
3028   	  RETURN;
3029         ELSE
3030           l_old_lane_id := FTE_LANE_PKG.GET_LANE_ID(l_lane_number, l_carrier_id);
3031 
3032           IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
3033             FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Old Lane ID', l_old_lane_id);
3034           END IF;
3035 
3036 	  p_lane_tbl(l_count).lane_id := l_old_lane_id;
3037       	  p_lane_tbl(l_count).lane_number := l_lane_number;
3038 	  IF (l_old_lane_id = -1) THEN
3039             x_error_msg := FTE_UTIL_PKG.GET_MSG(P_Name => 'FTE_CAT_LANE_NUMBER_INVALID',
3040                                                 P_Tokens => STRINGARRAY('SERVICE_NUMBER'),
3041 					        P_values => STRINGARRAY(l_lane_number));
3042 
3043             FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
3044                    		       p_msg	 	=> x_error_msg,
3045                    		       p_category	=> 'C',
3046 				       p_line_number	=> p_line_number);
3047             FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
3048             x_status := 1;
3049   	    RETURN;
3050  	  END IF;
3051         END IF;
3052       ELSIF (p_action = 'SYNC') THEN
3053         -- if laneNumber is not specified, it's assumed to be ADD
3054         IF (l_lane_number IS NULL) THEN
3055       	  l_old_lane_id := -1;
3056 	  p_lane_tbl(l_count).lane_id := FTE_LANE_PKG.GET_NEXT_LANE_ID;
3057         ELSE
3058           -- To determine if it's ADD or UPDATE
3059           -- if there's a lane with the given laneNumber and carrirName
3060           -- oldLaneId is not -1, which means UPDATE
3061 	  l_old_lane_id := FTE_LANE_PKG.GET_LANE_ID(l_lane_number, l_carrier_id);
3062 	  IF (l_old_lane_id = -1) THEN
3063 	    p_lane_tbl(l_count).lane_id := FTE_LANE_PKG.GET_NEXT_LANE_ID;
3064 	  ELSE
3065 	    p_lane_tbl(l_count).lane_id := l_old_lane_id;
3066 	    p_lane_tbl(l_count).action := 'UPDATE';
3067 	  END IF;
3068  	  p_lane_tbl(l_count).lane_number := l_lane_number;
3069         END IF;
3070       ELSIF (p_action = 'DELETE') THEN
3071         l_old_lane_id := FTE_LANE_PKG.GET_LANE_ID(l_lane_number, l_carrier_id);
3072         p_lane_tbl(l_count).lane_id := l_old_lane_id;
3073         IF (l_old_lane_id = -1) THEN
3074           x_error_msg := FTE_UTIL_PKG.GET_MSG(P_Name => 'FTE_CAT_LANE_NUMBER_INVALID',
3075                                               P_Tokens => STRINGARRAY('SERVICE_NUMBER'),
3076 					      P_values => STRINGARRAY(l_lane_number));
3077           FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
3078                    		     p_msg	  	=> x_error_msg,
3079                    		     p_category		=> 'C',
3080 				     p_line_number	=> p_line_number);
3081           FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
3082           x_status := 1;
3083   	  RETURN;
3084         END IF;
3085         FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
3086         RETURN;
3087       ELSIF (p_action = 'ADD') THEN
3088 
3089         IF (-1 <> FTE_LANE_PKG.GET_LANE_ID(l_lane_number, l_carrier_id)) THEN
3090           x_error_msg := FTE_UTIL_PKG.GET_MSG(P_Name => 'FTE_CAT_LANE_REF_EXISTS',
3091                                               P_Tokens => STRINGARRAY('SERVICE_NUMBER'),
3092 					      P_values => STRINGARRAY(l_lane_number));
3093           FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
3094                    		     p_msg	  	=> x_error_msg,
3095                    		     p_category		=> 'D',
3096 				     p_line_number	=> p_line_number);
3097           FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
3098           x_status := 1;
3099   	  RETURN;
3100         ELSE
3101 	  p_lane_tbl(l_count).lane_id := FTE_LANE_PKG.GET_NEXT_LANE_ID;
3102 	  p_lane_tbl(l_count).lane_number := l_lane_number;
3103         END IF;
3104       END IF;
3105 
3106       -- validate Origin, Destination, Mode only for ADD
3107       IF (l_old_lane_id = -1) THEN
3108         -- set origin and  destination
3109 
3110         l_region_info.city             := FTE_UTIL_PKG.GET_DATA('ORIGIN_CITY', p_values);
3111         l_region_info.state            := FTE_UTIL_PKG.GET_DATA('ORIGIN_STATE', p_values);
3112         l_region_info.country          := FTE_UTIL_PKG.GET_DATA('ORIGIN_COUNTRY', p_values);
3113         l_region_info.postal_code_from := FTE_UTIL_PKG.GET_DATA('ORIGIN_POSTAL_CODE_FROM', p_values);
3114         l_region_info.postal_code_to   := FTE_UTIL_PKG.GET_DATA('ORIGIN_POSTAL_CODE_TO', p_values);
3115 
3116         l_region_info.zone             := FTE_UTIL_PKG.GET_DATA('ORIGIN_ZONE', p_values);
3117 
3118         IF (l_region_info.country IS NULL) THEN
3119 
3120 	  l_zone_id := FTE_REGION_ZONE_LOADER.GET_ZONE_ID(l_region_info.zone);
3121 
3122 	  IF (l_zone_id IS NULL OR l_zone_id = -1) THEN
3123             x_error_msg := FTE_UTIL_PKG.GET_MSG(P_Name => 'FTE_LANE_ORIGIN_MISSING');
3124 
3125 	    FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
3126                    		       p_msg		=> x_error_msg,
3127                    		       p_category	=> 'A',
3128 				       p_line_number	=> p_line_number);
3129 
3130             FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
3131             x_status := 2;
3132             RETURN;
3133 	  ELSE
3134               p_lane_tbl(l_count).origin_id := l_zone_id;
3135 	  END IF;
3136 
3137         ELSE
3138 
3139           l_region_id := FTE_REGION_ZONE_LOADER.GET_REGION_ID(p_region_info => l_region_info);
3140 
3141 	  IF (l_region_id IS NULL OR l_region_id = -1) THEN
3142             x_error_msg := FTE_UTIL_PKG.GET_MSG(P_Name 		=> 'FTE_CAT_REGION_UNKNOWN',
3143 				        	p_tokens	=> STRINGARRAY('REGION_NAME'),
3144 				        	p_values	=> STRINGARRAY(l_region_info.country ||' '||
3145 								       l_region_info.state ||' '||
3146 								       l_region_info.city));
3147             FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name	=> l_module_name,
3148                    		       p_msg		=> x_error_msg,
3149                    		       p_category	=> 'D',
3150 				       p_line_number	=> p_line_number);
3151 
3152             FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
3153             x_status := 2;
3154             RETURN;
3155           END IF;
3156 
3157 	  --+
3158 	  -- Inserting the region in wsh_zone_regions
3159           --+
3160     	  IF (FTE_REGION_ZONE_LOADER.INSERT_PARTY_REGION(p_region_id        => l_region_id,
3161 				                         p_parent_region_id => l_region_id,
3162 				                         p_supplier_id      => -1,
3163 				                         p_validate_flag    => TRUE,
3164 				                         p_postal_code_from => l_region_info.postal_code_from,
3165 				                         p_postal_code_to   => l_region_info.postal_code_to) = -1) THEN
3166             FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
3167             x_status := 2;
3168             RETURN;
3169           END IF;
3170 
3171 	  p_lane_tbl(l_count).origin_id := l_region_id;
3172 
3173         END IF;
3174 
3175         l_region_info.city     := FTE_UTIL_PKG.GET_DATA('DESTINATION_CITY', p_values);
3176         l_region_info.state    := FTE_UTIL_PKG.GET_DATA('DESTINATION_STATE', p_values);
3177         l_region_info.country  := FTE_UTIL_PKG.GET_DATA('DESTINATION_COUNTRY', p_values);
3178         l_region_info.postal_code_from := FTE_UTIL_PKG.GET_DATA('DESTINATION_POSTAL_CODE_FROM', p_values);
3179         l_region_info.postal_code_to   := FTE_UTIL_PKG.GET_DATA('DESTINATION_POSTAL_CODE_TO', p_values);
3180         l_region_info.zone     := FTE_UTIL_PKG.GET_DATA('DESTINATION_ZONE', p_values);
3181 
3182         IF (l_region_info.country IS NULL) THEN
3183 
3184 	  l_zone_id := FTE_REGION_ZONE_LOADER.GET_ZONE_ID(l_region_info.zone);
3185 
3186 	  IF (l_zone_id IS NULL OR l_zone_id = -1 ) THEN
3187             x_error_msg := FTE_UTIL_PKG.GET_MSG(P_Name => 'FTE_LANE_DEST_MISSING');
3188 
3189 	    FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
3190                    		       p_msg		=> x_error_msg,
3191                    		       p_category	=> 'A',
3192 				       p_line_number	=> p_line_number);
3193 
3194             FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
3195             x_status := 2;
3196             RETURN;
3197 	  ELSE
3198               p_lane_tbl(l_count).destination_id := l_zone_id;
3199 	  END IF;
3200 
3201         ELSE
3202           l_region_id := FTE_REGION_ZONE_LOADER.GET_REGION_ID(p_region_info => l_region_info);
3203 
3204 	  IF (l_region_id IS NULL OR l_region_id = -1) THEN
3205             x_error_msg := FTE_UTIL_PKG.GET_MSG(P_Name 		=> 'FTE_CAT_REGION_UNKNOWN',
3206 				        	p_tokens	=> STRINGARRAY('REGION_NAME'),
3207 				        	p_values	=> STRINGARRAY(l_region_info.country ||' '||
3208 								       l_region_info.state ||' '||
3209 								       l_region_info.city));
3210             FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name	=> l_module_name,
3211                    		       p_msg	 	=> x_error_msg,
3212                    		       p_category	=> 'D',
3213 				       p_line_number	=> p_line_number);
3214 
3215             FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
3216             x_status := 2;
3217             RETURN;
3218           END IF;
3219 
3220 	  --inserting the region in wsh_zone_regions
3221     	  IF (FTE_REGION_ZONE_LOADER.INSERT_PARTY_REGION(p_region_id        => l_region_id,
3222 				  p_parent_region_id => l_region_id,
3223 				  p_supplier_id      => -1,
3224 				  p_validate_flag    => TRUE,
3225 				  p_postal_code_from => l_region_info.postal_code_from,
3226 				  p_postal_code_to   => l_region_info.postal_code_to) = -1) THEN
3227             FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
3228             x_status := 2;
3229             RETURN;
3230           END IF;
3231 
3232 	  p_lane_tbl(l_count).destination_id := l_region_id;
3233 
3234 
3235         END IF;
3236 
3237         IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
3238           FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Origin ID', p_lane_tbl(l_count).origin_id);
3239           FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Destination ID', p_lane_tbl(l_count).destination_id);
3240 	END IF;
3241 
3242         -- Validation for MODE_OF_TRANSPORTATION
3243 
3244         IF (l_mode IS NULL) THEN
3245           x_error_msg := FTE_UTIL_PKG.GET_MSG(P_Name 	=> 'FTE_MODE_OF_TRANS_MISSING');
3246           FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
3247                      		     p_msg		=> x_error_msg,
3248                    		     p_category		=> 'A',
3249 				     p_line_number	=> p_line_number);
3250           FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
3251           x_status := 1;
3252 	  RETURN;
3253         ELSE
3254           VALIDATE_MODE_OF_TRANS(p_mode 	=> l_mode,
3255 			         p_line_number  => p_line_number,
3256 			         p_carrier_id 	=> l_carrier_id,
3257 			         p_mode_code	=> l_mode_code,
3258 			         x_status	=> x_status,
3259 			         x_error_msg	=> x_error_msg);
3260 
3261 	  IF (x_status <> -1) THEN
3262 	    FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
3263 	    RETURN;
3264 	  END IF;
3265 
3266 	  IF (l_mode_code = 'TRUCK') THEN
3267 	    x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_SERVICE_NO_TL');
3268             FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
3269                      		       p_msg		=> x_error_msg,
3270                    		       p_category	=> 'D',
3271 				       p_line_number	=> p_line_number);
3272             FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
3273             x_status := 1;
3274 	    RETURN;
3275 	  END IF;
3276 
3277   	  p_lane_tbl(l_count).mode_of_transportation_code := l_mode_code;
3278 
3279         END IF;
3280 
3281         -- Validation for DISTANCE and DISTANCE_UOM
3282         IF (l_distance IS NOT NULL) THEN
3283 
3284           IF (to_number(l_distance) < 0) THEN
3285             x_error_msg := FTE_UTIL_PKG.GET_MSG(P_Name 	=> 'FTE_CAT_DISTANCE_NEG');
3286             FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
3287                      		       p_msg		=> x_error_msg,
3288                    		       p_category	=> 'D',
3289 				       p_line_number	=> p_line_number);
3290             FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
3291             x_status := 1;
3292 	    RETURN;
3293 	  ELSE
3294 	    p_lane_tbl(l_count).distance := l_distance;
3295 	  END IF;
3296 
3297           -- If distance is a valid number, valid UOM should be specified.
3298           IF (l_distance_uom IS NULL) THEN
3299             x_error_msg := FTE_UTIL_PKG.GET_MSG(P_Name 	=> 'FTE_CAT_UOM_MISSING');
3300             FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
3301                      		       p_msg	  	=> x_error_msg,
3302                    		       p_category	=> 'A',
3303 				       p_line_number	=> p_line_number);
3304             FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
3305             x_status := 1;
3306   	    RETURN;
3307   	  ELSE
3308    	    VALIDATE_UOM(p_uom		=> l_distance_uom,
3309 		         p_class	=> 'Length',
3310 		         p_line_number 	=> p_line_number,
3311 		         p_uom_code 	=> l_distance_uom_code,
3312 		         x_status	=> x_status,
3313 		         x_error_msg	=> x_error_msg);
3314             IF (x_status <> -1) THEN
3315               FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
3316 	      RETURN;
3317             END IF;
3318 	    p_lane_tbl(l_count).distance_uom := l_distance_uom_code;
3319 
3320    	  END IF;
3321         END IF;
3322 
3323         -- Validation for TRANSIT_TIME and TRANSIT_TIME_UOM
3324         IF (l_transit IS NOT NULL) THEN
3325           IF (to_number(l_transit) < 0) THEN
3326             x_error_msg := FTE_UTIL_PKG.GET_MSG(P_Name 	=> 'FTE_CAT_TRANSIT_TIME_NEG');
3327             FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
3328                      		       p_msg	  	=> x_error_msg,
3329                    		       p_category	=> 'D',
3330 				       p_line_number	=> p_line_number);
3331             FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
3332             x_status := 1;
3333   	    RETURN;
3334   	  ELSE
3335 	    p_lane_tbl(l_count).transit_time := l_transit;
3336 	  END IF;
3337     	  -- If transit is a valid number, valid UOM should be specified.
3338           IF (l_transit_uom IS NULL) THEN
3339             x_error_msg := FTE_UTIL_PKG.GET_MSG(P_Name 	=> 'FTE_CAT_UOM_MISSING');
3340             FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
3341                      		       p_msg	  	=> x_error_msg,
3342                    		       p_category	=> 'A',
3343 				       p_line_number	=> p_line_number);
3344             FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
3345             x_status := 1;
3346 	    RETURN;
3347 	  ELSE
3348  	    VALIDATE_UOM(p_uom		=> l_transit_uom,
3349 		         p_class	=> 'Time',
3350 		         p_line_number 	=> p_line_number,
3351 		         p_uom_code 	=> l_transit_time_uom_code,
3352 		         x_status	=> x_status,
3353 		         x_error_msg	=> x_error_msg);
3354             IF (x_status <> -1) THEN
3355               FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
3356 	      RETURN;
3357             END IF;
3358 	    p_lane_tbl(l_count).transit_time_uom := l_transit_time_uom_code;
3359 
3360 	  END IF;
3361         END IF;
3362       END IF;
3363 
3364       --if treated as update, set the basisflag to true to avoid error thrown later in DataLoader.java
3365       IF (l_old_lane_id <> -1) THEN
3366         p_lane_tbl(l_count).basis_flag := true;
3367         VERIFY_LANE_BASIS(p_lane_id 	=> l_old_lane_id,
3368 			  p_lane_tbl	=> p_lane_tbl,
3369 			  p_line_number	=> p_line_number,
3370 			  x_status	=> x_status,
3371 			  x_error_msg	=> x_error_msg);
3372         IF (x_status <> -1) THEN
3373           FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
3374 	  RETURN;
3375         END IF;
3376       END IF;
3377 
3378       -- Validation for BASIS
3379       IF (l_basis IS NULL) THEN
3380         IF (NOT p_lane_tbl(l_count).basis_flag OR l_old_lane_id = -1) THEN
3381 	  --if the old lane doesn't have a basis or a new lane, then it's okay to put null
3382 	  p_lane_tbl(l_count).line_number := p_line_number;
3383         ELSIF (l_old_lane_id <> -1) THEN --if old lane does have basis and this is a update of it, then error
3384           x_error_msg := FTE_UTIL_PKG.GET_MSG(P_Name 	=> 'FTE_BASIS_MISSING');
3385           FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
3386                      		     p_msg	  	=> x_error_msg,
3387                    		     p_category		=> 'A',
3388 				     p_line_number	=> p_line_number);
3389           FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
3390           x_status := 1;
3391           RETURN;
3392         END IF;
3393       ELSE
3394         l_basis_code := FTE_UTIL_PKG.GET_LOOKUP_CODE('FTE_BASES', l_basis);
3395         IF (l_basis_code IS NOT NULL) THEN
3396 	  p_lane_tbl(l_count).basis := l_basis_code;
3397 	  p_lane_tbl(l_count).basis_flag := true;
3398         ELSE
3399           x_error_msg := FTE_UTIL_PKG.GET_MSG(P_Name 	=> 'FTE_BASIS_INVALID',
3400 				              p_tokens	=> STRINGARRAY('BASIS'),
3401 				 	      p_values	=> STRINGARRAY(l_basis));
3402           FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
3403                    		     p_msg  		=> x_error_msg,
3404                    		     p_category		=> 'D',
3405 				     p_line_number	=> p_line_number);
3406           FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
3407           x_status := 1;
3408   	  RETURN;
3409         END IF;
3410       END IF;
3411 
3412       -- added to check if container_all is the basis
3413       IF (l_basis = 'CONTAINER_ALL') THEN
3414         p_lane_tbl(l_count).container_all_flag := TRUE;
3415       END IF;
3416 
3417       -- Validation for COMMODITY_CLASS
3418       IF (l_com_class IS NULL) THEN
3419         p_lane_tbl(l_count).comm_fc_class_code := '';
3420       ELSE
3421         l_com_class_code := FTE_UTIL_PKG.GET_LOOKUP_CODE('WSH_COMMODITY_CLASSIFICATION', l_com_class);
3422         IF (l_com_class_code IS NOT NULL) THEN
3423           p_lane_tbl(l_count).comm_fc_class_code := l_com_class_code;
3424         ELSE
3425           x_error_msg := FTE_UTIL_PKG.GET_MSG(P_Name 	=> 'FTE_COMM_CLASS_INVALID',
3426 				  	      p_tokens	=> STRINGARRAY('COMMODITY_CLASS'),
3427 				  	      p_values	=> STRINGARRAY(l_com_class));
3428           FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
3429                    		     p_msg	  	=> x_error_msg,
3430                    		     p_category		=> 'D',
3431 				     p_line_number	=> p_line_number);
3432           FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
3433           x_status := 1;
3434   	  RETURN;
3435         END IF;
3436       END IF;
3437 
3438       -- Validation for EFFECTIVE_DATE
3439 
3440       VALIDATE_DATE(p_date => l_effect_date,
3441  		    p_line_number => p_line_number,
3442 		    x_status => x_status,
3443 		    x_error_msg => x_error_msg);
3444 
3445       IF (x_status <> -1) THEN
3446         FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
3447         RETURN;
3448       END IF;
3449 
3450       p_lane_tbl(l_count).effective_date := l_effect_date;
3451 
3452       -- Validation for EXPIRY_DATE
3453 
3454       VALIDATE_DATE(p_date => l_expiry_date,
3455 		    p_line_number => p_line_number,
3456 	  	    x_status => x_status,
3457 		    x_error_msg => x_error_msg);
3458 
3459       IF (x_status <> -1) THEN
3460         FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
3461         RETURN;
3462       END IF;
3463 
3464       p_lane_tbl(l_count).expiry_date := l_expiry_date;
3465 
3466       -- Validation for RATE_CHART_VIEW_FLAG
3467       IF (l_view_flag IS NULL) THEN
3468         --default pricelist_view_flag only when we are adding. else leave it as it was.
3469         IF (p_action = 'ADD') THEN
3470 	  p_lane_tbl(l_count).pricelist_view_flag := 'N';
3471         END IF;
3472       ELSIF (l_view_flag = 'Y' OR l_view_flag = 'N') THEN
3473 	p_lane_tbl(l_count).pricelist_view_flag := l_view_flag;
3474       ELSE
3475         x_error_msg := FTE_UTIL_PKG.GET_MSG(P_Name 	=> 'FTE_PRICELIST_VIEW_INVALID',
3476 				    	    p_tokens	=> STRINGARRAY('VIEW_FLAG'),
3477 					    p_values	=> STRINGARRAY(l_view_flag));
3478         FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
3479                    		   p_msg	  	=> x_error_msg,
3480                    		   p_category		=> 'D',
3481 				   p_line_number	=> p_line_number);
3482         FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
3483         x_status := 1;
3484         RETURN;
3485       END IF;
3486 
3487       IF (l_old_lane_id = -1) THEN -- add
3488 
3489         IF (l_editable_flag IS NULL) THEN
3490 	  p_lane_tbl(l_count).editable_flag := 'Y';
3491         ELSE
3492 	  p_lane_tbl(l_count).editable_flag := l_editable_flag;
3493         END IF;
3494 
3495         IF (l_lane_number IS NULL) THEN
3496 	  l_temp_number := p_lane_tbl(l_count).lane_id || '-' || l_carrier_name;
3497 	  IF (LENGTH(l_temp_number) > 30) THEN
3498 	    l_lane_number := SUBSTR(l_temp_number, 1, 30);
3499 	  ELSE
3500 	    l_lane_number := l_temp_number;
3501 	  END IF;
3502 
3503 	  p_lane_tbl(l_count).lane_number := l_lane_number;
3504         END IF;
3505       END IF;
3506 
3507     --    VALIDATE_ELEMENTS(LANETABLE, data, encoding, errors);  check length
3508 
3509     ELSIF(p_type = 'RATE_CHART') THEN
3510 	VALIDATE_LANE_RATE_CHART(p_values	=> p_values,
3511 				 p_line_number	=> p_line_number,
3512 				 p_action	=> p_action,
3513 				 p_lane_tbl	=> p_lane_tbl,
3514 				 p_lane_rate_chart_tbl	=> p_lane_rate_chart_tbl,
3515 				 x_status	=> x_status,
3516 				 x_error_msg	=> x_error_msg);
3517     ELSIF(p_type = 'SERVICE_LEVEL') THEN
3518 	VALIDATE_LANE_SERVICE_LEVEL(p_values		=> p_values,
3519 				    p_line_number	=> p_line_number,
3520 				    p_type		=> p_type,
3521 				    p_action		=> p_action,
3522 				    p_lane_tbl		=> p_lane_tbl,
3523 				    p_lane_service_tbl	=> p_lane_service_tbl,
3524 				    x_status		=> x_status,
3525 				    x_error_msg		=> x_error_msg);
3526     ELSIF(p_type = 'COMMODITY_TYPE') THEN
3527 	VALIDATE_LANE_COMMODITY(p_values		=> p_values,
3528 				p_line_number		=> p_line_number,
3529 				p_type			=> p_type,
3530 				p_action		=> p_action,
3531 				p_lane_tbl		=> p_lane_tbl,
3532 				p_lane_commodity_tbl	=> p_lane_commodity_tbl,
3533 				x_status		=> x_status,
3534 				x_error_msg		=> x_error_msg);
3535     END IF;
3536 
3537     FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
3538   EXCEPTION
3539     WHEN OTHERS THEN
3540       x_error_msg := sqlerrm;
3541       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
3542              			 p_msg        	=> x_error_msg,
3543              			 p_category    	=> 'O',
3544 	        		 p_line_number 	=> p_line_number);
3545       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
3546       x_status := 1;
3547       RETURN;
3548   END VALIDATE_SERVICE;
3549 
3550   ----------------------------------------------------------------------------
3551   -- PROCEDURE VALIDATE_SERVICE_RATING_SETUP
3552   --
3553   -- Purpose: does validation for one line in service rating setup block
3554   --
3555   -- IN parameters:
3556   --	1. p_values:		pl/sql table for the service rating setup line
3557   --	2. p_line_number: 	line number of current line
3558   --   	3. p_pre_lane_number:	previous lane's line number
3559   --
3560   -- OUT parameters:
3561   --	1. p_prc_parameter_tbl: pl/sql table for pricing parameter
3562   --	2. p_deficit_wt:	deficit weight parameter
3563   --	3. p_lane_function:	lane function
3564   --	4. p_lane_number:	lane number
3565   --	5. p_action:		action value of the line
3566   --	6. x_status:		status of the processing, -1 means no error
3567   --	7. x_error_msg:		error message if any.
3568   ----------------------------------------------------------------------------
3569   PROCEDURE VALIDATE_SERVICE_RATING_SETUP(p_values		IN		FTE_BULKLOAD_PKG.data_values_tbl,
3570 					  p_line_number		IN		NUMBER,
3571 					  p_pre_lane_number	IN		VARCHAR2,
3572 					  p_prc_parameter_tbl	IN OUT	NOCOPY	FTE_LANE_PKG.prc_parameter_tbl,
3573 					  p_deficit_wt		IN OUT	NOCOPY	BOOLEAN,
3574 					  p_lane_function	IN OUT	NOCOPY	VARCHAR2,
3575 					  p_lane_number		OUT NOCOPY	VARCHAR2,
3576 					  p_action		OUT NOCOPY	VARCHAR2,
3577 					  x_status		OUT NOCOPY	NUMBER,
3578 					  x_error_msg		OUT NOCOPY	VARCHAR2) IS
3579 
3580   l_old_function 	VARCHAR2(100);
3581   l_temp		VARCHAR2(100);
3582   l_carrier_name 	VARCHAR2(200);
3583   l_type		VARCHAR2(100);
3584   l_subtype		VARCHAR2(100);
3585   l_name		VARCHAR2(200);
3586   l_value_from		VARCHAR2(100);
3587   l_value_to		VARCHAR2(100);
3588   l_uom			VARCHAR2(100);
3589   l_currency		VARCHAR2(100);
3590   l_carrier_id 		NUMBER := -1;
3591   l_uom_code		VARCHAR2(100) := '';
3592   l_parameter_data_type VARCHAR2(100);
3593   l_data_keys		STRINGARRAY := STRINGARRAY();
3594   l_data_values		STRINGARRAY := STRINGARRAY();
3595   l_count		NUMBER;
3596   l_lane_id		NUMBER := -1;
3597   l_parameter_id 	NUMBER;
3598   l_prc_parameter_id 	NUMBER;
3599 
3600   CURSOR GET_PRC_PARAMETER (p_lane_id IN NUMBER, p_parameter_id IN NUMBER) IS
3601     SELECT PARAMETER_INSTANCE_ID
3602       FROM FTE_PRC_PARAMETERS
3603      WHERE lane_id = p_lane_id
3604        AND parameter_id = p_parameter_id;
3605 
3606   CURSOR GET_PARAMETER_DATATYPE (p_parameter_id IN NUMBER) IS
3607     SELECT parameter_datatype
3608       FROM FTE_PRC_PARAMETER_DEFAULTS
3609      WHERE parameter_id = p_parameter_id;
3610 
3611   CURSOR GET_FUNCTION(p_lane_id IN NUMBER, p_parameter_id NUMBER) IS
3612     SELECT value_from
3613       FROM FTE_PRC_PARAMETERS
3614      WHERE lane_id = p_lane_id
3615        AND parameter_id = p_parameter_id;
3616 
3617   l_module_name      CONSTANT VARCHAR2(100) := 'fte.plsql.' || G_PKG_NAME || '.VALIDATE_SERVICE_RATING_SETUP';
3618   BEGIN
3619     FTE_UTIL_PKG.ENTER_DEBUG(l_module_name);
3620 
3621     x_status := -1;
3622 
3623     p_action 		:= FTE_UTIL_PKG.GET_DATA('ACTION', p_values);
3624     p_lane_number 	:= FTE_UTIL_PKG.GET_DATA('SERVICE_NUMBER', p_values);
3625     l_carrier_name 	:= FTE_UTIL_PKG.GET_DATA('CARRIER_NAME', p_values);
3626     l_type 		:= FTE_UTIL_PKG.GET_DATA('TYPE', p_values);
3627     l_subtype 		:= FTE_UTIL_PKG.GET_DATA('SUBTYPE', p_values);
3628     l_name 		:= FTE_UTIL_PKG.GET_DATA('NAME', p_values);
3629     l_value_from 	:= FTE_UTIL_PKG.GET_DATA('VALUE_FROM', p_values);
3630     l_value_to 		:= FTE_UTIL_PKG.GET_DATA('VALUE_TO', p_values);
3631     l_uom 		:= FTE_UTIL_PKG.GET_DATA('UOM', p_values);
3632     l_currency 		:= FTE_UTIL_PKG.GET_DATA('CURRENCY', p_values);
3633 
3634     IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
3635       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Type', l_type);
3636       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Action', p_action);
3637       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Pre Lane Number', p_pre_lane_number);
3638       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Lane function', p_lane_function);
3639       IF (p_deficit_wt) THEN
3640         FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Deficit Wt', 'TRUE');
3641       ELSE
3642         FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Deficit Wt', 'FALSE');
3643       END IF;
3644       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Lane Number', p_lane_number);
3645       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Carrier name', l_carrier_name);
3646       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Subtype', l_subtype);
3647       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Name', l_name);
3648       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Value From', l_value_from);
3649       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Value To', l_value_to);
3650       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'UOM', l_uom);
3651       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Currency', l_currency);
3652       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Line number', p_line_number);
3653     END IF;
3654 
3655     p_deficit_wt := FALSE;
3656 
3657     -- ACTION
3658     VALIDATE_ACTION(p_action	=> p_action,
3659 		    p_type	=> 'SERVICE_RATING_SETUP',
3660 		    p_line_number => p_line_number,
3661 		    x_status	=> x_status,
3662 		    x_error_msg	=> x_error_msg);
3663 
3664     IF (x_status <> -1) THEN
3665       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
3666       RETURN;
3667     END IF;
3668 
3669     -- carrier name validation
3670     VALIDATE_CARRIER(p_carrier_name	=> l_carrier_name,
3671 		     p_line_number	=> p_line_number,
3672 		     p_carrier_id	=> l_carrier_id,
3673 		     x_status		=> x_status,
3674 		     x_error_msg	=> x_error_msg);
3675 
3676     IF (x_status <> -1) THEN
3677       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
3678       RETURN;
3679     END IF;
3680 
3681     -- LANE_NUMBER
3682     VALIDATE_LANE_NUMBER(p_lane_number	=> p_lane_number,
3683 		  	 p_carrier_id	=> l_carrier_id,
3684 			 p_line_number	=> p_line_number,
3685 			 p_lane_id	=> l_lane_id,
3686 			 x_status	=> x_status,
3687 			 x_error_msg	=> x_error_msg);
3688 
3689     IF (x_status <> -1) THEN
3690       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
3691       RETURN;
3692     END IF;
3693 
3694     -- TYPE
3695     IF (l_type IS NULL) THEN
3696       x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_TYPE_MISSING');
3697       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
3698                      		  p_msg  		=> x_error_msg,
3699                    		  p_category		=> 'A',
3700 				  p_line_number		=> p_line_number);
3701       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
3702       x_status := 1;
3703       RETURN;
3704     ELSE
3705       l_type := UPPER(l_type);
3706       IF (l_type NOT IN ('PARAMETER', 'RULE')) THEN
3707         x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_RATING_TYPE_INVALID');
3708         FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
3709                      		    p_msg	  	=> x_error_msg,
3710                    		    p_category		=> 'D',
3711 				    p_line_number	=> p_line_number);
3712         FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
3713         x_status := 1;
3714 	RETURN;
3715       END IF;
3716     END IF;
3717 
3718     IF (l_subtype IS NULL) THEN
3719       x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_SUBTYPE_MISSING');
3720       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
3721                      		  p_msg  		=> x_error_msg,
3722                    		  p_category		=> 'A',
3723 				  p_line_number		=> p_line_number);
3724       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
3725       x_status := 1;
3726       RETURN;
3727     ELSE
3728       l_subtype := UPPER(l_subtype);
3729     END IF;
3730 
3731     -- NAME
3732     IF (l_name IS NULL) THEN
3733       x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_NAME_MISSING');
3734       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
3735                      		  p_msg  		=> x_error_msg,
3736                    		  p_category		=> 'A',
3737 				  p_line_number		=> p_line_number);
3738       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
3739       x_status := 1;
3740       RETURN;
3741     ELSE
3742       l_name := UPPER(l_name);
3743     END IF;
3744 
3745     -- VALUE
3746     IF (l_value_from IS NULL) THEN
3747       x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_VALUE_FROM_MISSING');
3748       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
3749                      		  p_msg  		=> x_error_msg,
3750                    		  p_category		=> 'A',
3751 				  p_line_number		=> p_line_number);
3752       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
3753       x_status := 1;
3754       RETURN;
3755     END IF;
3756 
3757     IF (l_uom IS NULL) THEN
3758       l_uom_code := '';
3759     ELSIF (l_type = 'PARAMETER' AND l_subtype = 'DIM_WT' AND l_name = 'MIN_PACKAGE_VOLUME') THEN
3760       VALIDATE_UOM(p_uom	=> l_uom,
3761 		   p_class	=> 'Volume',
3762 		   p_line_number => p_line_number,
3763 		   p_uom_code 	=> l_uom_code,
3764 		   x_status	=> x_status,
3765 		   x_error_msg	=> x_error_msg);
3766       IF (x_status <> -1) THEN
3767         FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
3768 	RETURN;
3769       END IF;
3770     ELSE
3771       VALIDATE_UOM(p_uom	=> l_uom,
3772 		   p_class	=> 'Weight',
3773 		   p_line_number => p_line_number,
3774 		   p_uom_code 	=> l_uom_code,
3775 		   x_status	=> x_status,
3776 		   x_error_msg	=> x_error_msg);
3777       IF (x_status <> -1) THEN
3778         FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
3779 	RETURN;
3780       END IF;
3781     END IF;
3782 
3783     IF (l_type = 'PARAMETER' AND l_subtype = 'SERVICE' AND l_name = 'SERVICE_FUNCTION') THEN
3784       l_subtype := 'LANE';
3785       l_name := 'LANE_FUNCTION';
3786     END IF;
3787 
3788     -- validate once more not to throw error with PRICING_OBJECTIVE
3789     -- from validateName since it's known as RATING_OBJECTIVE to the user
3790     IF (l_type = 'RULE' AND l_name = 'RATING_OBJECTIVE' AND
3791         l_subtype IN ('SC_CB', 'SC_WB', 'SC_VB', 'MC_CB', 'MC_WB', 'MC_VB', 'MC_MY', 'MC_MN')) THEN
3792       l_name := 'PRICING_OBJECTIVE';
3793     END IF;
3794 
3795     -- First Parameter for New Lane should be LANE/LANE_FUNCTION
3796     IF (p_lane_number <> nvl(p_pre_lane_number, p_lane_number || p_lane_number)) THEN
3797       -- First Parameter for New Lane should be LANE/LANE_FUNCTION
3798       IF (l_type <> 'PARAMETER' OR l_subtype <> 'LANE' OR l_name <> 'LANE_FUNCTION') THEN
3799         x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_NAME_FIRST');
3800         FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
3801                      		    p_msg	  	=> x_error_msg,
3802                    		    p_category		=> 'D',
3803 				    p_line_number	=> p_line_number);
3804         FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
3805         x_status := 1;
3806 	RETURN;
3807       ELSE
3808         IF (UPPER(l_value_from) NOT IN ('NONE', 'LTL', 'PARCEL', 'FLAT')) THEN
3809           x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_VALUE_FROM_LANE');
3810           FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
3811                       		      p_msg	  	=> x_error_msg,
3812                    		      p_category	=> 'D',
3813 				      p_line_number	=> p_line_number);
3814           FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
3815           x_status := 1;
3816  	  RETURN;
3817 	ELSE
3818           p_lane_function := l_value_from;
3819 
3820   	  l_parameter_id := VALIDATE_NAME(p_type		=> l_type,
3821 			 		  p_lane_function 	=> 'NONE',
3822 			 		  p_subtype		=> l_subtype,
3823 			 		  p_name		=> l_name,
3824                          		  p_line_number		=> p_line_number,
3825 			 		  p_deficit_wt		=> p_deficit_wt,
3826 			 		  x_status		=> x_status,
3827 			 		  x_error_msg		=> x_error_msg);
3828 
3829           IF (x_status <> -1) THEN
3830             FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
3831 	    RETURN;
3832           END IF;
3833 
3834 	  OPEN GET_FUNCTION(l_lane_id, l_parameter_id);
3835 	  FETCH GET_FUNCTION INTO l_old_function;
3836 	  CLOSE GET_FUNCTION;
3837           IF (l_old_function IS NOT NULL AND l_old_function <> p_lane_function) THEN
3838             x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_NO_FUNC_CHANGE');
3839             FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
3840                       		        p_msg	  	=> x_error_msg,
3841                    		        p_category	=> 'D',
3842 				        p_line_number	=> p_line_number);
3843             FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
3844             x_status := 1;
3845 	    RETURN;
3846 	  END IF;
3847 	END IF;
3848       END IF;
3849     ELSE
3850       IF (l_subtype = 'LANE' AND l_name = 'LANE_FUNCTION') THEN
3851         x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_NAME_DUPLICATE');
3852         FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
3853                       		    p_msg	  	=> x_error_msg,
3854                    		    p_category		=> 'D',
3855 				    p_line_number	=> p_line_number);
3856         FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
3857         x_status := 1;
3858 	RETURN;
3859       END IF;
3860     END IF;
3861 
3862     l_parameter_id := VALIDATE_NAME(p_type		=> l_type,
3863 			 	    p_lane_function 	=> p_lane_function,
3864 			 	    p_subtype		=> l_subtype,
3865 			 	    p_name		=> l_name,
3866                          	    p_line_number	=> p_line_number,
3867 			 	    p_deficit_wt	=> p_deficit_wt,
3868 			 	    x_status		=> x_status,
3869 			 	    x_error_msg		=> x_error_msg);
3870 
3871     IF (x_status <> -1) THEN
3872       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
3873       RETURN;
3874     END IF;
3875 
3876     OPEN GET_PARAMETER_DATATYPE(l_parameter_id);
3877     FETCH GET_PARAMETER_DATATYPE INTO l_parameter_data_type;
3878     CLOSE GET_PARAMETER_DATATYPE;
3879 
3880     IF (l_parameter_id = -1) THEN
3881       x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_NAME_INVALID');
3882       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
3883                      		 p_msg  	=> x_error_msg,
3884                    		 p_category	=> 'D',
3885 				 p_line_number	=> p_line_number);
3886       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
3887       x_status := 1;
3888       RETURN;
3889     ELSE
3890       IF (l_name = 'WT_UOM') THEN
3891         VALIDATE_UOM(p_uom		=> l_value_from,
3892 		     p_class		=> 'Weight',
3893 		     p_line_number 	=> p_line_number,
3894 		     p_uom_code 	=> l_temp,
3895 		     x_status		=> x_status,
3896 		     x_error_msg	=> x_error_msg);
3897         IF (x_status <> -1) THEN
3898           FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
3899 	  RETURN;
3900         END IF;
3901       ELSIF (l_name = 'VOL_UOM') THEN
3902  	VALIDATE_UOM(p_uom		=> l_value_from,
3903 		     p_class		=> 'Volume',
3904 		     p_line_number 	=> p_line_number,
3905 		     p_uom_code 	=> l_temp,
3906 		     x_status		=> x_status,
3907 		     x_error_msg	=> x_error_msg);
3908         IF (x_status <> -1) THEN
3909           FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
3910 	  RETURN;
3911         END IF;
3912       ELSIF (l_name = 'DIM_UOM') THEN
3913  	VALIDATE_UOM(p_uom		=> l_value_from,
3914 		     p_class		=> 'Length',
3915 		     p_line_number 	=> p_line_number,
3916 		     p_uom_code 	=> l_temp,
3917 		     x_status		=> x_status,
3918 		     x_error_msg	=> x_error_msg);
3919         IF (x_status <> -1) THEN
3920           FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
3921      	  RETURN;
3922         END IF;
3923       ELSIF (l_name = 'GROUPING_LEVEL') THEN
3924         l_temp := FTE_UTIL_PKG.GET_LOOKUP_CODE('FTE_PRC_GROUPING_LEVEL', l_value_from);
3925         IF (l_temp IS NULL) THEN
3926           x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_GROUPING_LEVEL_INVALID',
3927 					      p_tokens		=> STRINGARRAY('VALUE'),
3928 					      p_values		=> STRINGARRAY(l_value_from));
3929           FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
3930                    		      p_msg	  	=> x_error_msg,
3931                    		      p_category	=> 'A',
3932 				      p_line_number	=> p_line_number);
3933           FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
3934           x_status := 1;
3935 	  RETURN;
3936 	END IF;
3937       ELSIF (l_name = 'COMMODITY_AGGREGATION') THEN
3938         l_temp := FTE_UTIL_PKG.GET_LOOKUP_CODE('FTE_PRC_COMM_AGGREGATION', l_value_from);
3939         IF (l_temp IS NULL) THEN
3940           x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_COMM_AGGREGATION_INVALID',
3941 					      p_tokens		=> STRINGARRAY('VALUE'),
3942 					      p_values		=> STRINGARRAY(l_value_from));
3943           FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
3944                    		      p_msg	  	=> x_error_msg,
3945                    		      p_category	=> 'A',
3946 				      p_line_number	=> p_line_number);
3947           FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
3948           x_status := 1;
3949 	  RETURN;
3950 	END IF;
3951       ELSIF (l_name = 'PRICING_OBJECTIVE') THEN
3952         l_temp := FTE_UTIL_PKG.GET_LOOKUP_CODE('FTE_PRC_PRICING_OBJECTIVE', l_value_from);
3953         IF (l_temp IS NULL) THEN
3954           x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_PRICING_OBJECTIVE_INVALID',
3955 					      p_tokens		=> STRINGARRAY('VALUE'),
3956 					      p_values		=> STRINGARRAY(l_value_from));
3957           FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
3958                    		      p_msg	  	=> x_error_msg,
3959                    		      p_category	=> 'A',
3960 				      p_line_number	=> p_line_number);
3961           FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
3962           x_status := 1;
3963 	  RETURN;
3964 	END IF;
3965       END IF;
3966       IF (l_temp IS NOT NULL) THEN
3967         l_value_from := l_temp;
3968       END IF;
3969     END IF;
3970 
3971     OPEN GET_PRC_PARAMETER(l_lane_id, l_parameter_id);
3972     FETCH GET_PRC_PARAMETER INTO l_prc_parameter_id;
3973     CLOSE GET_PRC_PARAMETER;
3974 
3975     l_count := p_prc_parameter_tbl.COUNT+1;
3976 
3977     IF (p_action IN ('SYNC', 'ADD', 'UPDATE')) THEN
3978       -- Added
3979 
3980       IF (l_parameter_data_type IS NOT NULL AND l_parameter_data_type = 'NUMBER') THEN
3981         p_prc_parameter_tbl(l_count).value_from := fnd_number.canonical_to_number(l_value_from);
3982       ELSE
3983         p_prc_parameter_tbl(l_count).value_from := l_value_from;
3984       END IF;
3985 
3986       p_prc_parameter_tbl(l_count).value_to := l_value_to;
3987       p_prc_parameter_tbl(l_count).uom_code := l_uom_code;
3988       p_prc_parameter_tbl(l_count).currency_code := l_currency;
3989 
3990       -- If it's already defined,
3991       IF (l_prc_parameter_id <> -1) THEN
3992         IF (p_action = 'ADD' AND (NOT p_deficit_wt)) THEN
3993           x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_ADD_ERROR',
3994 					      p_tokens		=> STRINGARRAY(''),
3995 					      p_values		=> STRINGARRAY(p_lane_function||':'||l_type||','||l_subtype||','||l_name));
3996           FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
3997                      		      p_msg	  	=> x_error_msg,
3998                    		      p_category	=> 'D',
3999 				      p_line_number	=> p_line_number);
4000           FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
4001           x_status := 1;
4002           RETURN;
4003 	END IF;
4004         p_action := 'UPDATE';
4005       ELSE
4006         IF (p_action = 'UPDATE') THEN
4007           x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_UPDATE_ERROR',
4008 					      p_tokens		=> STRINGARRAY(''),
4009 					      p_values		=> STRINGARRAY(p_lane_function||':'||l_type||','||l_subtype||','||l_name));
4010           FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
4011                      		      p_msg	  	=> x_error_msg,
4012                    		      p_category	=> 'D',
4013 				      p_line_number	=> p_line_number);
4014           FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
4015           x_status := 1;
4016           RETURN;
4017 	END IF;
4018         p_action := 'ADD';
4019       END IF;
4020 
4021       IF (p_deficit_wt) THEN
4022         p_action := 'ADD';
4023       END IF;
4024 
4025     ELSIF (p_action = 'DELETE') THEN
4026       IF (p_deficit_wt OR l_prc_parameter_id <> -1) THEN
4027     	p_prc_parameter_tbl(l_count).parameter_instance_id := l_prc_parameter_id;
4028     	p_prc_parameter_tbl(l_count).lane_id := l_lane_id;
4029     	p_prc_parameter_tbl(l_count).parameter_id := l_parameter_id;
4030       ELSE
4031         x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_UPDATE_ERROR',
4032 					    p_tokens		=> STRINGARRAY(''),
4033 					    p_values		=> STRINGARRAY(p_lane_function||':'||l_type||','||l_subtype||','||l_name));
4034         FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
4035                      		    p_msg	  	=> x_error_msg,
4036                    		    p_category		=> 'D',
4037 				    p_line_number	=> p_line_number);
4038         FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
4039         x_status := 1;
4040 	RETURN;
4041       END IF;
4042     END IF;
4043 
4044     IF (p_action = 'ADD') THEN
4045       l_prc_parameter_id := FTE_LANE_PKG.GET_NEXT_PRC_PARAMETER_ID;
4046       p_prc_parameter_tbl(l_count).parameter_instance_id := l_prc_parameter_id;
4047       p_prc_parameter_tbl(l_count).lane_id := l_lane_id;
4048       p_prc_parameter_tbl(l_count).parameter_id := l_parameter_id;
4049     ELSIF (p_action = 'UPDATE') THEN
4050       p_prc_parameter_tbl(l_count).parameter_instance_id := l_prc_parameter_id;
4051     END IF;
4052 
4053     FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
4054   EXCEPTION
4055     WHEN OTHERS THEN
4056       IF (GET_PRC_PARAMETER%ISOPEN) THEN
4057 	CLOSE GET_PRC_PARAMETER;
4058       END IF;
4059       IF (GET_PARAMETER_DATATYPE%ISOPEN) THEN
4060 	CLOSE GET_PARAMETER_DATATYPE;
4061       END IF;
4062       IF (GET_FUNCTION%ISOPEN) THEN
4063 	CLOSE GET_FUNCTION;
4064       END IF;
4065       x_error_msg := sqlerrm;
4066       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name => l_module_name,
4067              			  p_msg   	=> x_error_msg,
4068              			  p_category    => 'O',
4069 	        		  p_line_number	=> p_line_number);
4070       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
4071       x_status := 1;
4072       RETURN;
4073   END VALIDATE_SERVICE_RATING_SETUP;
4074 
4075   ----------------------------------------------------------------------------
4076   -- PROCEDURE VALIDATE_SCHEDULE
4077   --
4078   -- Purpose: does validation for one line in schedule block
4079   --
4080   -- IN parameters:
4081   --	1. p_values:		pl/sql table for schedule line
4082   --	2. p_line_number: 	line number of current line
4083   --
4084   -- OUT parameters:
4085   --	1. p_schedule_tbl:	pl/sql table for schedules
4086   --	2. p_action:		action value of the line
4087   --	3. x_status:		status of the processing, -1 means no error
4088   --	4. x_error_msg:		error message if any.
4089   ----------------------------------------------------------------------------
4090   PROCEDURE VALIDATE_SCHEDULE(p_values		IN		FTE_BULKLOAD_PKG.data_values_tbl,
4091 			      p_line_number	IN		NUMBER,
4092 			      p_schedule_tbl	IN OUT NOCOPY	FTE_LANE_PKG.schedule_tbl,
4093 			      p_action		OUT NOCOPY	VARCHAR2,
4094 			      x_status		OUT NOCOPY	NUMBER,
4095 			      x_error_msg	OUT NOCOPY	VARCHAR2) IS
4096 
4097   l_indicator_value 	NUMBER := 0;
4098   l_old_freq_type	VARCHAR2(100);
4099   l_freq_code		VARCHAR2(100);
4100   l_freq_arr		VARCHAR2(200);
4101   l_departure		VARCHAR2(200);
4102   l_arrival		VARCHAR2(200);
4103   l_transit_uom_code	VARCHAR2(100);
4104   l_carrier_name	VARCHAR2(200);
4105   l_lane_number		VARCHAR2(200);
4106   l_vessel_type		VARCHAR2(200);
4107   l_vessel_name		VARCHAR2(200);
4108   l_arrival_dt		VARCHAR2(200);
4109   l_arrival_tm		VARCHAR2(200);
4110   l_departure_dt	VARCHAR2(200);
4111   l_departure_tm	VARCHAR2(200);
4112   l_indicator		VARCHAR2(200);
4113   l_freq_type		VARCHAR2(200);
4114   l_frequency		VARCHAR2(200);
4115   l_transit		VARCHAR2(200);
4116   l_transit_uom		VARCHAR2(200);
4117   l_port_loading	VARCHAR2(200);
4118   l_port_discharge	VARCHAR2(200);
4119   l_start_date		VARCHAR2(200);
4120   l_end_date		VARCHAR2(200);
4121   l_count		NUMBER;
4122   l_carrier_id		NUMBER;
4123   l_tmp_tm		VARCHAR2(25);
4124   l_old_schedule_id	NUMBER;
4125   l_schedule_id		NUMBER;
4126   l_voyage_number	VARCHAR2(30);
4127   l_lane_id		NUMBER;
4128 
4129   l_module_name      CONSTANT VARCHAR2(100) := 'fte.plsql.' || G_PKG_NAME || '.VALIDATE_SERVICE_RATING_SETUP';
4130   BEGIN
4131     FTE_UTIL_PKG.ENTER_DEBUG(l_module_name);
4132 
4133     x_status := -1;
4134 
4135     p_action         	:= FTE_UTIL_PKG.GET_DATA('ACTION', p_values);
4136     l_carrier_name    	:= FTE_UTIL_PKG.GET_DATA('CARRIER_NAME', p_values);
4137     l_lane_number     	:= FTE_UTIL_PKG.GET_DATA('SERVICE_NUMBER', p_values);
4138     l_vessel_type     	:= FTE_UTIL_PKG.GET_DATA('VESSEL_TYPE', p_values);
4139     l_vessel_name     	:= FTE_UTIL_PKG.GET_DATA('VESSEL_NAME', p_values);
4140     l_voyage_number     := FTE_UTIL_PKG.GET_DATA('VOYAGE_NUMBER', p_values);
4141     l_departure_dt   	:= FTE_UTIL_PKG.GET_DATA('DEPARTURE_DATE', p_values);
4142     l_departure_tm   	:= FTE_UTIL_PKG.GET_DATA('DEPARTURE_TIME', p_values);
4143     l_arrival_dt     	:= FTE_UTIL_PKG.GET_DATA('ARRIVAL_DATE', p_values);
4144     l_arrival_tm     	:= FTE_UTIL_PKG.GET_DATA('ARRIVAL_TIME', p_values);
4145     l_indicator      	:= FTE_UTIL_PKG.GET_DATA('ARRIVAL_DATE_INDICATOR', p_values);
4146     l_freq_type       	:= FTE_UTIL_PKG.GET_DATA('FREQUENCY_TYPE', p_values);
4147     l_frequency      	:= FTE_UTIL_PKG.GET_DATA('FREQUENCY', p_values);
4148     l_transit        	:= FTE_UTIL_PKG.GET_DATA('TRANSIT_TIME', p_values);
4149     l_transit_uom    	:= FTE_UTIL_PKG.GET_DATA('TRANSIT_TIME_UOM', p_values);
4150     l_port_loading    	:= FTE_UTIL_PKG.GET_DATA('PORT_OF_LOADING', p_values);
4151     l_port_discharge  	:= FTE_UTIL_PKG.GET_DATA('PORT_OF_DISCHARGE', p_values);
4152     l_start_date   	:= FTE_UTIL_PKG.GET_DATA('START_DATE', p_values);
4153     l_end_date 		:= FTE_UTIL_PKG.GET_DATA('END_DATE', p_values);
4154 
4155     IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
4156       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Action', p_action);
4157       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Lane Number', l_lane_number);
4158       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Carrier name', l_carrier_name);
4159       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Vessel type', l_vessel_type);
4160       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Vessel name', l_vessel_name);
4161       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Voyage number', l_voyage_number);
4162       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Departure date', l_departure_dt);
4163       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Departure time', l_departure_tm);
4164       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Arrival date', l_arrival_dt);
4165       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Arrival time', l_arrival_tm);
4166       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Arrival date indicator', l_indicator);
4167       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Frequency type', l_freq_type);
4168       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Frequency', l_frequency);
4169       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Transit time', l_transit);
4170       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Transit time UOM', l_transit_uom);
4171       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Port of loading', l_port_loading);
4172       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Port of discharge', l_port_discharge);
4173       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Start date', l_start_date);
4174       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'End date', l_end_date);
4175       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Line number', p_line_number);
4176     END IF;
4177 
4178     l_count := p_schedule_tbl.COUNT+1;
4179     p_schedule_tbl(l_count).vessel_type := l_vessel_type;
4180     p_schedule_tbl(l_count).vessel_name := l_vessel_name;
4181     p_schedule_tbl(l_count).voyage_number := l_voyage_number;
4182     p_schedule_tbl(l_count).arrival_date_indicator := l_indicator;
4183     p_schedule_tbl(l_count).transit_time := l_transit;
4184     p_schedule_tbl(l_count).port_of_loading := l_port_loading;
4185     p_schedule_tbl(l_count).port_of_discharge := l_port_discharge;
4186 
4187     -- ACTION Validation
4188     VALIDATE_ACTION(p_action	=> p_action,
4189 		    p_type	=> 'SCHEDULE',
4190 		    p_line_number => p_line_number,
4191 		    x_status	=> x_status,
4192 		    x_error_msg	=> x_error_msg);
4193 
4194     IF (x_status <> -1) THEN
4195       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
4196       RETURN;
4197     END IF;
4198 
4199     -- carrier name validation
4200     VALIDATE_CARRIER(p_carrier_name	=> l_carrier_name,
4201 		     p_line_number	=> p_line_number,
4202 		     p_carrier_id	=> l_carrier_id,
4203 		     x_status		=> x_status,
4204 		     x_error_msg	=> x_error_msg);
4205 
4206     IF (x_status <> -1) THEN
4207       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
4208       RETURN;
4209     END IF;
4210 
4211     -- LANE_NUMBER
4212     VALIDATE_LANE_NUMBER(p_lane_number	=> l_lane_number,
4213 		  	 p_carrier_id	=> l_carrier_id,
4214 			 p_line_number	=> p_line_number,
4215 			 p_lane_id	=> l_lane_id,
4216 			 x_status	=> x_status,
4217 			 x_error_msg	=> x_error_msg);
4218 
4219     IF (x_status <> -1) THEN
4220       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
4221       RETURN;
4222     END IF;
4223 
4224     p_schedule_tbl(l_count).lane_number := l_lane_number;
4225 
4226     -- VESSEL_TYPE, VESSEL_NAME, VOYAGE_NUMBER Validation
4227     IF (l_voyage_number IS NULL) THEN
4228       x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_VOYAGE_NUMBER_MISSING');
4229       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name => l_module_name,
4230                    		  p_msg  	=> x_error_msg,
4231                    		  p_category	=> 'D',
4232 				  p_line_number	=> p_line_number);
4233       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
4234       x_status := 1;
4235       RETURN;
4236     END IF;
4237 
4238     -- ARRIVAL DATE INDICATOR Validation
4239     -- GLAMI added 11/09/01
4240     -- remove the leading + sign
4241     IF (l_indicator IS NOT NULL AND INSTR(l_indicator, '+') = 1) THEN
4242       l_indicator := SUBSTR(l_indicator, 2, LENGTH(l_indicator)-1);
4243     END IF;
4244 
4245     IF (l_indicator IS NOT NULL) THEN
4246       IF (TO_NUMBER(l_indicator) < -1) THEN
4247         x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_LESS_THAN_MINUSONE');
4248         FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
4249                    		    p_msg	  	=> x_error_msg,
4250                    		    p_category		=> 'D',
4251 				    p_line_number	=> p_line_number);
4252         FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
4253         x_status := 1;
4254 	RETURN;
4255       ELSE
4256 	IF (ISNUM(l_indicator) = 0) THEN
4257           x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_NUMBER_INVALID');
4258           FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
4259                    		      p_msg	  	=> x_error_msg,
4260                    		      p_category	=> 'D',
4261 				      p_line_number	=> p_line_number);
4262           FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
4263           x_status := 1;
4264 	  RETURN;
4265 	END IF;
4266         l_indicator_value := TO_NUMBER(l_indicator);
4267       END IF;
4268     END IF;
4269 
4270     -- FREQUENCY_TYPE and FREQUENCY Validation
4271     -- FREQUENCY_TYPE or DEPARTURE_DATE should be specified
4272     IF (l_freq_type IS NULL AND l_departure_dt IS NULL) THEN
4273       x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_NO_DEPARTURE_DATE');
4274       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
4275                    		  p_msg 	 	=> x_error_msg,
4276                    		  p_category		=> 'A',
4277 				  p_line_number		=> p_line_number);
4278       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
4279       x_status := 1;
4280       RETURN;
4281     END IF;
4282 
4283     -- FREQUENCY_TYPE or ARRIVAL_DATE should be specified
4284     IF (l_freq_type IS NULL AND l_arrival_dt IS NULL) THEN
4285       x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_NO_ARRIVAL_DATE');
4286       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
4287                    		  p_msg 	 	=> x_error_msg,
4288                    		  p_category		=> 'A',
4289 				  p_line_number		=> p_line_number);
4290       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
4291       x_status := 1;
4292       RETURN;
4293     END IF;
4294 
4295     IF (l_freq_type IS NOT NULL) THEN
4296       l_old_freq_type := l_freq_type;
4297       l_freq_type := FTE_UTIL_PKG.GET_LOOKUP_CODE('FTE_FREQUENCY_TYPE', l_old_freq_type);
4298 
4299       IF (l_freq_type IS NULL) THEN
4300         x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_UNDEFINED_FREQ_TYPE',
4301 					    p_tokens		=> STRINGARRAY(''),
4302 					    p_values		=> STRINGARRAY(l_old_freq_type));
4303         FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
4304                      		    p_msg	  	=> x_error_msg,
4305                    		    p_category		=> 'D',
4306 				    p_line_number	=> p_line_number);
4307         FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
4308         x_status := 1;
4309 
4310 	RETURN;
4311       ELSE
4312 	p_schedule_tbl(l_count).frequency_type := l_freq_type;
4313 
4314         IF (l_freq_type = 'DAILY') THEN
4315           p_schedule_tbl(l_count).frequency := NULL;
4316         ELSIF (l_freq_type = 'WEEKLY') THEN
4317 	  IF (l_frequency IS NULL) THEN
4318             x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_NO_FREQUENCY');
4319       	    FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
4320     	 	              		p_msg	 	=> x_error_msg,
4321                 	   		p_category	=> 'A',
4322 					p_line_number	=> p_line_number);
4323  	    FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
4324       	    x_status := 1;
4325 	    RETURN;
4326 	  ELSE
4327             l_freq_code := GET_FREQ_CODE(p_frequency	=> l_frequency,
4328 					 p_line_number	=> p_line_number,
4329 					 x_status	=> x_status,
4330 					 x_error_msg	=> x_error_msg);
4331             IF (l_freq_code IS NULL) THEN
4332               x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_INVALID_FREQUENCY',
4333 						  p_tokens	=> STRINGARRAY('frequency'),
4334 						  p_values	=> STRINGARRAY(l_frequency));
4335       	      FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name => l_module_name,
4336     	 	              		  p_msg 	=> x_error_msg,
4337                 	   		  p_category	=> 'D',
4338 					  p_line_number	=> p_line_number);
4339  	      FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
4340       	      x_status := 1;
4341 	      RETURN;
4342 	    ELSE
4343               p_schedule_tbl(l_count).frequency := TO_NUMBER(l_freq_code);
4344 	      l_freq_arr := CALCULATE_FREQ_ARRIVAL(p_frequency	=> l_freq_code,
4345 						   p_ind	=> l_indicator_value,
4346 						   p_line_number => p_line_number,
4347 						   x_status	=> x_status,
4348 						   x_error_msg	=> x_error_msg);
4349     	      IF (x_status <> -1) THEN
4350     	  	FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
4351       		RETURN;
4352     	      END IF;
4353 
4354 	      p_schedule_tbl(l_count).frequency_arrival := l_freq_arr;
4355 	    END IF;
4356           END IF;
4357 	END IF;
4358 
4359         -- DEPARTURE_TIME is mandatory if FREQUENCY is set
4360         IF (l_departure_tm IS NULL) THEN
4361           x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_NO_DEPARTURE_TIME');
4362           FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
4363                    		      p_msg	 	=> x_error_msg,
4364                    		      p_category	=> 'A',
4365 				      p_line_number	=> p_line_number);
4366           FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
4367           x_status := 1;
4368 	  RETURN;
4369         ELSE
4370           l_departure_tm := TRIM(' ' FROM l_departure_tm);
4371 	  BEGIN
4372             l_tmp_tm := TO_CHAR(TO_DATE(l_departure_tm, FTE_BULKLOAD_PKG.G_TIME_FORMAT), FTE_BULKLOAD_PKG.G_TIME_FORMAT);
4373           EXCEPTION
4374             WHEN OTHERS THEN
4375 	      x_error_msg := sqlerrm;
4376               FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
4377                  			  p_msg   		=> x_error_msg,
4378              			          p_category    	=> 'O',
4379 	        		      	  p_line_number		=> p_line_number);
4380               FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
4381               x_status := 1;
4382               RETURN;
4383           END;
4384 
4385 	  IF (l_tmp_tm IS NULL) THEN
4386             x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_DEPARTURE_TIME_INVALID');
4387             FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
4388                      		        p_msg  		=> x_error_msg,
4389                    		      	p_category		=> 'D',
4390 				        p_line_number		=> p_line_number);
4391             FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
4392             x_status := 1;
4393             RETURN;
4394 	  END IF;
4395           p_schedule_tbl(l_count).departure_time := l_tmp_tm;
4396         END IF;
4397 
4398         -- ARRIVAL_TIME is mandatory if FREQUENCY is set
4399         IF (l_arrival_tm IS NULL) THEN
4400           x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_NO_ARRIVAL_TIME');
4401           FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
4402                    		      p_msg	 	=> x_error_msg,
4403                    		      p_category	=> 'A',
4404 				      p_line_number	=> p_line_number);
4405           FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
4406           x_status := 1;
4407 	  RETURN;
4408         ELSE
4409           l_arrival_tm := TRIM(' ' FROM l_arrival_tm);
4410 	  BEGIN
4411             l_tmp_tm := TO_CHAR(TO_DATE(l_arrival_tm, FTE_BULKLOAD_PKG.G_TIME_FORMAT), FTE_BULKLOAD_PKG.G_TIME_FORMAT);
4412           EXCEPTION
4413             WHEN OTHERS THEN
4414 	      x_error_msg := sqlerrm;
4415               FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
4416                  			  p_msg   		=> x_error_msg,
4417              			          p_category    	=> 'O',
4418 	        		      	  p_line_number		=> p_line_number);
4419               FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
4420               x_status := 1;
4421               RETURN;
4422           END;
4423 
4424 	  IF (l_tmp_tm IS NULL) THEN
4425             x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_ARRIVAL_TIME_INVALID');
4426             FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
4427                     		        p_msg  		=> x_error_msg,
4428                    		      	p_category		=> 'D',
4429 				      	p_line_number		=> p_line_number);
4430             FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
4431             x_status := 1;
4432             RETURN;
4433 	  END IF;
4434 
4435           p_schedule_tbl(l_count).arrival_time := l_tmp_tm;
4436       	END IF;
4437       END IF;
4438     END IF;
4439 
4440     -- DATE Type Validation
4441 
4442     -- DEPARTURE_DATE Validation
4443     IF (l_departure_dt IS NOT NULL) THEN
4444       IF (l_departure_tm IS NULL) THEN
4445         l_departure := l_departure_dt;
4446       ELSE
4447         l_departure := l_departure_dt || ' ' || l_departure_tm;
4448       END IF;
4449 
4450       BEGIN
4451         p_schedule_tbl(l_count).departure_date := TO_DATE(TRIM(' ' FROM l_departure), FTE_BULKLOAD_PKG.G_DATE_FORMAT);
4452       EXCEPTION
4453         WHEN OTHERS THEN
4454           x_error_msg := sqlerrm;
4455           FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
4456                 		      p_msg   		=> x_error_msg,
4457              			      p_category    	=> 'O',
4458 	        		      p_line_number	=> p_line_number);
4459           FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
4460           x_status := 1;
4461           RETURN;
4462       END;
4463 
4464       IF (p_schedule_tbl(l_count).departure_date IS NULL) THEN
4465         x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_INCORRECT_DATE',
4466 					    p_tokens		=> STRINGARRAY('DATE'),
4467 					    p_values		=> STRINGARRAY(l_departure));
4468       	FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
4469     	 	              	    p_msg 		=> x_error_msg,
4470                 	  	    p_category		=> 'D',
4471 				    p_line_number	=> p_line_number);
4472  	FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
4473         x_status := 1;
4474 	RETURN;
4475       END IF;
4476 
4477     END IF;
4478 
4479     -- ARRIVAL_DATE Validation
4480     IF (l_arrival_dt IS NOT NULL) THEN
4481       IF (l_arrival_tm IS NULL) THEN
4482         l_arrival := l_arrival_dt;
4483       ELSE
4484         l_arrival := l_arrival_dt || ' ' || l_arrival_tm;
4485       END IF;
4486 
4487       BEGIN
4488         p_schedule_tbl(l_count).arrival_date := TO_DATE(TRIM(' ' FROM l_arrival), FTE_BULKLOAD_PKG.G_DATE_FORMAT);
4489       EXCEPTION
4490         WHEN OTHERS THEN
4491           x_error_msg := sqlerrm;
4492           FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
4493                  		      p_msg   		=> x_error_msg,
4494              			      p_category    	=> 'O',
4495 	        		      p_line_number	=> p_line_number);
4496           FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
4497           x_status := 1;
4498           RETURN;
4499       END;
4500 
4501       IF (p_schedule_tbl(l_count).arrival_date IS NULL) THEN
4502         x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_INCORRECT_DATE',
4503  					    p_tokens		=> STRINGARRAY('DATE'),
4504 	 				    p_values		=> STRINGARRAY(l_arrival));
4505       	FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
4506     	 	              	    p_msg 		=> x_error_msg,
4507                 	   	    p_category		=> 'D',
4508 				    p_line_number	=> p_line_number);
4509  	FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
4510         x_status := 1;
4511 	RETURN;
4512       END IF;
4513     END IF;
4514 
4515     -- End - Giacomo added 03/05/2001
4516 
4517     -- EFFECTIVE_DATE Validation
4518 
4519     l_start_date := TRIM(' ' FROM l_start_date);
4520     VALIDATE_DATE(p_date => l_start_date,
4521 		  p_line_number => p_line_number,
4522 		  x_status => x_status,
4523 		  x_error_msg => x_error_msg);
4524 
4525     IF (x_status <> -1) THEN
4526       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
4527       RETURN;
4528     END IF;
4529 
4530     p_schedule_tbl(l_count).effective_date := l_start_date;
4531 
4532     -- EXPIRY_DATE Validation
4533 
4534     l_end_date := TRIM(' ' FROM l_end_date);
4535     VALIDATE_DATE(p_date => l_end_date,
4536 		  p_line_number => p_line_number,
4537 		  x_status => x_status,
4538 		  x_error_msg => x_error_msg);
4539 
4540     IF (x_status <> -1) THEN
4541       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
4542       RETURN;
4543     END IF;
4544 
4545     p_schedule_tbl(l_count).expiry_date := l_end_date;
4546 
4547     -- Validation for TRANSIT_TIME and TRANSIT_TIME_UOM
4548 
4549     IF (l_transit IS NOT NULL) THEN
4550       IF (ISNUM(l_indicator) = 0) THEN
4551         x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_NUMBER_INVALID');
4552         FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
4553                    		    p_msg	  	=> x_error_msg,
4554                    		    p_category		=> 'D',
4555 				    p_line_number	=> p_line_number);
4556         FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
4557         x_status := 1;
4558 	RETURN;
4559       END IF;
4560 
4561       IF (to_number(l_transit) < 0) THEN
4562         x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_TRANSIT_TIME_NEG');
4563         FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
4564                    		    p_msg 		=> x_error_msg,
4565                    		    p_category		=> 'D',
4566 				    p_line_number	=> p_line_number);
4567         FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
4568         x_status := 1;
4569 	RETURN;
4570       END IF;
4571       -- If transit is a valid number, valid UOM should be specified.
4572       IF (l_transit_uom IS NULL) THEN
4573         x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_UOM_MISSING');
4574         FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
4575                    		    p_msg 		=> x_error_msg,
4576                    		    p_category		=> 'A',
4577 				    p_line_number	=> p_line_number);
4578         FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
4579         x_status := 1;
4580 	RETURN;
4581       ELSE
4582         l_transit_uom_code := FTE_UTIL_PKG.GET_UOM_CODE(l_transit_uom, 'Time');
4583         IF (l_transit_uom_code IS NOT NULL) THEN
4584 	  p_schedule_tbl(l_count).transit_time_uom := l_transit_uom_code;
4585  	ELSE
4586           x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_UOM_INVALID',
4587 					      p_tokens		=> STRINGARRAY('UOM'),
4588 					      p_values		=> STRINGARRAY(l_transit_uom));
4589           FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
4590                    		      p_msg	 	=> x_error_msg,
4591                    		      p_category	=> 'B',
4592 				      p_line_number	=> p_line_number);
4593           FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
4594           x_status := 1;
4595 	  RETURN;
4596 	END IF;
4597       END IF;
4598     END IF;
4599 
4600     l_old_schedule_id := FTE_LANE_PKG.GET_SCHEDULE(l_lane_id, l_voyage_number);
4601 
4602     IF (l_old_schedule_id = -1 AND (p_action IN ('SYNC', 'ADD'))) THEN
4603 
4604       p_action := 'ADD';
4605       p_schedule_tbl(l_count).lane_id := l_lane_id;
4606       l_schedule_id := FTE_LANE_PKG.GET_NEXT_SCHEDULE_ID;
4607       IF (l_schedule_id <> -1) THEN
4608         p_schedule_tbl(l_count).schedules_id := l_schedule_id;
4609 
4610 --          FTE_CAT_VALIDATION_PKG.VALIDATE_ELEMENTS(SCHEDULETABLE, data, _encoding, errors);
4611       END IF;
4612     ELSIF (l_old_schedule_id = -1 AND p_action = 'DELETE') THEN
4613       x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_NO_SCHEDULE');
4614       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
4615                    		  p_msg 		=> x_error_msg,
4616                    		  p_category		=> 'B',
4617 				  p_line_number		=> p_line_number);
4618       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
4619       x_status := 1;
4620       RETURN;
4621     ELSIF (l_old_schedule_id <> -1 AND p_action = 'DELETE') THEN
4622       p_schedule_tbl(l_count).schedules_id := l_old_schedule_id;
4623       p_schedule_tbl(l_count).lane_id := l_lane_id;
4624     ELSE
4625       p_schedule_tbl(l_count).schedules_id := l_old_schedule_id;
4626       --  schedule already exist
4627       IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
4628         FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Schedule already exist');
4629       END IF;
4630       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
4631       RETURN;
4632     END IF;
4633 
4634     FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
4635   EXCEPTION
4636     WHEN OTHERS THEN
4637       x_error_msg := sqlerrm;
4638       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name => l_module_name,
4639              			  p_msg   	=> x_error_msg,
4640              			  p_category    => 'O',
4641 	        		  p_line_number	=> p_line_number);
4642       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
4643       x_status := 1;
4644       RETURN;
4645   END VALIDATE_SCHEDULE;
4646 
4647   -----------------------------------------------------------------------------
4648   -- PROCEDURE: VALIDATE_RATE_CHART
4649   --
4650   -- Purpose: Validate the data corresponding to this Line Header, and
4651   --          store the data in temporary tables for later insertion into
4652   --          p_list_header_tbl
4653   --
4654   -- IN Parameters
4655   --    1. p_values: 		pl/sql table for the rate chart line
4656   --	2. p_line_number:	line number
4657   --	3. p_validate:		boolean for validating data within VALIDATION procedure, default true
4658   --	4. p_process_id		process id for the loading, default null and assigned later
4659   --
4660   -- Out Parameters
4661   --    1. p_qp_list_header_tbl: 	pl/sql table for the list header information
4662   --	2. p_qp_qualifier_tbl:	pl/sql table for the qualifiers
4663   --	3. p_action:		action of the line
4664   --	4. p_carrier_id:	carrier id
4665   --	4. x_status:		status of the processing, -1 means no error
4666   --	5. x_error_msg:		error message if any.
4667   -----------------------------------------------------------------------------
4668   PROCEDURE VALIDATE_RATE_CHART(p_values     		IN    		FTE_BULKLOAD_PKG.data_values_tbl,
4669 				p_line_number		IN		NUMBER,
4670 				p_validate 		IN 		BOOLEAN DEFAULT TRUE,
4671 				p_process_id 		IN		NUMBER default null,
4672                                 p_qp_list_header_tbl	IN OUT NOCOPY	FTE_RATE_CHART_PKG.qp_list_header_tbl,
4673 				p_qp_qualifier_tbl	IN OUT NOCOPY	FTE_RATE_CHART_PKG.qp_qualifier_tbl,
4674 				p_action		OUT NOCOPY	VARCHAR2,
4675 				p_carrier_id		OUT NOCOPY	NUMBER,
4676                                 x_status     		OUT NOCOPY  	NUMBER,
4677                                 x_error_msg  		OUT NOCOPY  	VARCHAR2) IS
4678 
4679   l_intAction        	VARCHAR2(30);
4680   l_qualifier_group   	NUMBER;
4681   l_name              	VARCHAR2(100);
4682   l_description      	VARCHAR2(100);
4683   l_start_date        	VARCHAR2(30);
4684   l_end_date          	VARCHAR2(30);
4685   l_currency         	VARCHAR2(20);
4686   l_carrier_currency   	VARCHAR2(100);
4687   l_carrier_name      	VARCHAR2(100);
4688   l_list_header_id     	NUMBER;
4689   l_service_level     	VARCHAR2(50);
4690   l_attribute1        	VARCHAR2(50);
4691 
4692   l_module_name      	CONSTANT VARCHAR2(100) := 'fte.plsql.' || G_PKG_NAME || '.VALIDATE_RATE_CHART';
4693 
4694   -- Multiple RC
4695   l_replaced_rc       	VARCHAR2(60);
4696   l_old_rc_id         	NUMBER;
4697 
4698   l_temp		VARCHAR2(50);
4699   l_tokens		STRINGARRAY:=STRINGARRAY();
4700   l_list_type_code	VARCHAR2(10);
4701   l_count		NUMBER;
4702   l_chart_type		VARCHAR2(50) := FTE_RATE_CHART_PKG.g_chart_type;
4703 
4704   BEGIN
4705     FTE_UTIL_PKG.ENTER_DEBUG(l_module_name);
4706 
4707     l_list_header_id := -1;
4708     x_status         := -1;
4709 
4710     l_qualifier_group := 1;
4711 
4712     p_action     	:= FTE_UTIL_PKG.Get_Data('ACTION', p_values);
4713     l_description   	:= FTE_UTIL_PKG.Get_Data('DESCRIPTION', p_values);
4714     l_start_date    	:= FTE_UTIL_PKG.Get_Data('START_DATE', p_values);
4715     l_end_date      	:= FTE_UTIL_PKG.Get_Data('END_DATE', p_values);
4716     l_currency      	:= FTE_UTIL_PKG.Get_Data('CURRENCY', p_values);
4717     l_carrier_name  	:= FTE_UTIL_PKG.Get_Data('CARRIER_NAME', p_values);
4718     l_service_level 	:= FTE_UTIL_PKG.Get_Data('SERVICE_LEVEL', p_values);
4719     l_attribute1    	:= FTE_UTIL_PKG.Get_Data('ATTRIBUTE1', p_values);
4720     p_carrier_id	:= FTE_UTIL_PKG.Get_Data('CARRIER_ID', p_values);
4721 
4722     -- Multiple RC
4723     l_replaced_rc 	:= FTE_UTIL_PKG.Get_Data('REPLACED_RATE_CHART', p_values);
4724 
4725     --find out what type of rate chart it is
4726     l_chart_type     := NULL;
4727 
4728     l_name := FTE_UTIL_PKG.Get_Data('RATE_CHART_NAME', p_values);
4729     IF (l_name IS NOT NULL) THEN
4730       l_chart_type := 'FTE_RATE_CHART';
4731       l_list_type_code  := 'PRL';
4732     END IF;
4733 
4734     IF (l_name IS NULL) THEN
4735       l_name := FTE_UTIL_PKG.Get_Data('LTL_RATE_CHART_NAME', p_values);
4736       IF (l_name IS NOT NULL) THEN
4737 	l_chart_type := 'FTE_RATE_CHART';
4738         l_list_type_code := 'PRL';
4739 	FTE_RATE_CHART_PKG.g_is_LTL := TRUE;
4740       END IF;
4741     END IF;
4742 
4743     IF (l_name IS NULL) THEN
4744       l_name  := FTE_UTIL_PKG.Get_Data('CHARGES_DISCOUNTS_NAME', p_values);
4745       IF (l_name IS NOT NULL) THEN
4746         l_chart_type := 'FTE_MODIFIER';
4747         l_list_type_code  := 'SLT';
4748 	l_attribute1 := 'FTE_MODIFIER';
4749 
4750         --Qualifiers added at the header level (e.g. carrier) apply to
4751         --all the rate charts in this qualifier
4752         l_qualifier_group := -1;
4753       END IF;
4754     END IF;
4755 
4756     IF (l_name IS NULL) THEN
4757       l_name := FTE_UTIL_PKG.Get_Data('TL_CHART_NAME', p_values);
4758       IF (l_name IS NOT NULL) THEN
4759         l_chart_type     := 'TL_RATE_CHART';
4760         l_list_type_code := 'PRL';
4761       END IF;
4762     END IF;
4763 
4764     IF (l_name IS NULL) THEN
4765       l_name := FTE_UTIL_PKG.Get_Data('TL_MODIFIER_NAME', p_values);
4766       IF (l_name IS NOT NULL) THEN
4767         l_chart_type := 'TL_MODIFIER';
4768         l_list_type_code := 'DLT';
4769       END IF;
4770     END IF;
4771 
4772     IF (l_name IS NULL) THEN
4773       l_name := FTE_UTIL_PKG.Get_Data('FACILITY_RATE_CHART_NAME', p_values);
4774       IF (l_name IS NOT NULL) THEN
4775         l_chart_type := 'FAC_RATE_CHART';
4776         l_list_type_code := 'PRL';
4777       END IF;
4778     END IF;
4779 
4780     IF (l_name IS NULL) THEN
4781       l_name := FTE_UTIL_PKG.Get_Data('TL_FACILITY_MODIFIER_NAME', p_values);
4782       IF (l_name IS NOT NULL) THEN
4783         l_chart_type := 'FAC_MODIFIER';
4784         l_list_type_code := 'DLT';
4785       END IF;
4786     END IF;
4787 
4788     IF (l_name IS NULL) THEN
4789       l_name := FTE_UTIL_PKG.Get_Data('TL_MIN_CHARGE', p_values);
4790       IF (l_name IS NOT NULL) THEN
4791         l_chart_type := 'MIN_MODIFIER';
4792         l_list_type_code := 'DLT';
4793       END IF;
4794     END IF;
4795 
4796     --DEBUG MESSAGES
4797     IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
4798       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Action', p_action);
4799       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Description', l_description);
4800       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Start date', l_start_date);
4801       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'End date', l_end_date);
4802       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Currency', l_currency);
4803       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Carrier name', l_carrier_name);
4804       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Service level', l_service_level);
4805       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Attribute1', l_attribute1);
4806       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Carrier ID', p_carrier_id);
4807       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Replaced RC', l_replaced_rc);
4808       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Name', l_name);
4809       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Line number', p_line_number);
4810     END IF;
4811 
4812     VALIDATE_DATE(p_date => l_start_date,
4813 		  p_line_number => p_line_number,
4814 		  x_status => x_status,
4815 		  x_error_msg => x_error_msg);
4816 
4817     IF (x_status <> -1) THEN
4818       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
4819       RETURN;
4820     END IF;
4821 
4822     VALIDATE_DATE(p_date => l_end_date,
4823 		  p_line_number => p_line_number,
4824 		  x_status => x_status,
4825 		  x_error_msg => x_error_msg);
4826 
4827     IF (x_status <> -1) THEN
4828       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
4829       RETURN;
4830     END IF;
4831 
4832     IF (p_validate) THEN
4833       IF (l_name IS NULL OR LENGTH(l_name) = 0 ) THEN
4834 	x_error_msg := FTE_UTIL_PKG.GET_MSG('FTE_PRICE_NAME_MISSING');
4835         FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
4836                      		    p_msg		=> x_error_msg,
4837                    		    p_category		=> 'A',
4838 				    p_line_number	=> p_line_number);
4839         FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
4840         x_status := 2;
4841         RETURN;
4842       END IF;
4843 
4844       VALIDATE_ACTION(p_action		=> p_action,
4845 		      p_type		=> 'RATE_CHART',
4846 		      p_line_number 	=> p_line_number,
4847 		      x_status		=> x_status,
4848 		      x_error_msg	=> x_error_msg);
4849 
4850       IF (x_status <> -1) THEN
4851         FTE_UTIL_PKG.Exit_Debug(l_module_name);
4852         RETURN;
4853       END IF;
4854 
4855       IF (p_carrier_id IS NULL) THEN
4856         -- Validation for Carrier Name. Use cached Carrier Id, if same carrier.
4857         IF (l_carrier_name IS NULL OR LENGTH(l_carrier_name) = 0) THEN
4858           --Facility Rate Charts and Surcharges Don't need a carrier.
4859           IF (l_chart_type <> 'FAC_RATE_CHART' and l_chart_type <> 'FAC_MODIFIER') THEN
4860   	    x_error_msg := FTE_UTIL_PKG.GET_MSG('FTE_CAT_CARRIER_MISSING');
4861             FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name	=> l_module_name,
4862                    		        p_msg 		=> x_error_msg,
4863                    		        p_category	=> 'A',
4864 				        p_line_number	=> p_line_number);
4865             FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
4866             x_status := 2;
4867        	    RETURN;
4868           END IF;
4869         ELSE
4870           VALIDATE_CARRIER(p_carrier_name	=> l_carrier_name,
4871 		           p_line_number	=> p_line_number,
4872 		           p_carrier_id		=> p_carrier_id,
4873 		           x_status		=> x_status,
4874 		           x_error_msg		=> x_error_msg);
4875 
4876           IF (x_status <> -1) THEN
4877             FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
4878             RETURN;
4879           END IF;
4880 
4881         END IF;  --End Validating Carrier.
4882       END IF;
4883 
4884       l_list_header_id := FTE_RATE_CHART_PKG.Get_Pricelist_Id(p_name      => l_name,
4885                                              		      p_carrier_id => p_carrier_id,
4886 					     		      p_attribute1 => l_temp);
4887 
4888       -- Validate Price List and  Check if the Pricelist is assigned to any Lane for DELETE
4889       -- If the pricelist already exists, set status to 999 and return immediately.
4890       IF (p_action = 'ADD' AND l_list_header_id <> -1) THEN
4891         x_error_msg := Fte_Util_PKG.Get_Msg(p_name   => 'FTE_PRICELIST_EXIST',
4892                                              p_tokens => StringArray('NAME'),
4893                                              p_values => StringArray(l_name));
4894 
4895         IF (l_chart_type <> 'LTL_RATE_CHART') THEN
4896           FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
4897                    		      p_msg		=> x_error_msg,
4898                    		      p_category	=> 'D',
4899 				      p_line_number	=> p_line_number);
4900         END IF;
4901 
4902         x_status := 999;
4903         FTE_UTIL_PKG.Exit_Debug(l_module_name);
4904         RETURN;
4905 
4906       ELSIF (p_action IN ('DELETE', 'UPDATE') AND (l_temp <> l_chart_type OR l_temp IS NULL) AND l_list_header_id <> -1) THEN
4907 
4908 --    need messages for these names
4909         l_tokens.EXTEND;
4910         l_tokens(l_tokens.COUNT) := l_name;
4911         l_tokens.EXTEND;
4912         IF (l_chart_type = 'FTE_RATE_CHART') THEN
4913           l_tokens(l_tokens.COUNT) := 'Rate Chart';
4914         ELSIF (l_chart_type = 'TL_RATE_CHART') THEN
4915           l_tokens(l_tokens.COUNT) := 'TL Rate Chart';
4916         ELSIF (l_chart_type = 'LTL_RC') THEN
4917           l_tokens(l_tokens.COUNT) := 'LTL Rate Chart';
4918         ELSIF (l_chart_type = 'FAC_RATE_CHART') THEN
4919           l_tokens(l_tokens.COUNT) := 'Facility Rate Chart';
4920         ELSIF (l_chart_type = 'FTE_MODIFIER') THEN
4921           l_tokens(l_tokens.COUNT) := 'Charges and Discounts';
4922         ELSIF (l_chart_type = 'FAC_MODIFIER') THEN
4923           l_tokens(l_tokens.COUNT) := 'Facility Charges';
4924         ELSIF (l_chart_type = 'TL_MODIFIER') THEN
4925           l_tokens(l_tokens.COUNT) := 'Accessorial Charges';
4926         ELSIF (l_chart_type = 'MIN_MODIFIER') THEN
4927           l_tokens(l_tokens.COUNT) := 'LTL and/or Parcel Modifier';
4928         ELSE
4929           l_tokens(l_tokens.COUNT) := 'Unknown Type Chart';
4930         END IF;
4931 
4932         l_tokens.EXTEND;
4933         IF (l_temp = 'FTE_RATE_CHART') THEN
4934           l_tokens(l_tokens.COUNT) := 'Rate Chart';
4935         ELSIF (l_temp = 'TL_RATE_CHART') THEN
4936           l_tokens(l_tokens.COUNT) := 'TL Rate Chart';
4937         ELSIF (l_temp = 'LTL_RC') THEN
4938           l_tokens(l_tokens.COUNT) := 'LTL Rate Chart';
4939         ELSIF (l_temp = 'FAC_RATE_CHART') THEN
4940           l_tokens(l_tokens.COUNT) := 'Facility Rate Chart';
4941         ELSIF (l_temp = 'FTE_MODIFIER') THEN
4942           l_tokens(l_tokens.COUNT) := 'Charges and Discounts';
4943         ELSIF (l_temp = 'FAC_MODIFIER') THEN
4944           l_tokens(l_tokens.COUNT) := 'Facility Charges';
4945         ELSIF (l_temp = 'TL_MODIFIER') THEN
4946           l_tokens(l_tokens.COUNT) := 'Accessorial Charges';
4947         ELSIF (l_temp = 'MIN_MODIFIER') THEN
4948           l_tokens(l_tokens.COUNT) := 'LTL and/or Parcel Modifier';
4949         ELSE
4950           l_tokens(l_tokens.COUNT) := 'Unknown Type Chart';
4951         END IF;
4952 
4953         x_error_msg := Fte_Util_PKG.Get_Msg(p_name   => 'FTE_CAT_DELETE_TYPE_WRONG',
4954                                              p_tokens => StringArray('NAME', 'TYPE', 'ACTUAL'),
4955                                              p_values => l_tokens);
4956 
4957         FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
4958                    		    p_msg		=> x_error_msg,
4959                    		    p_category		=> 'D',
4960 				    p_line_number	=> p_line_number);
4961 
4962         x_status := 2;
4963         FTE_UTIL_PKG.Exit_Debug(l_module_name);
4964         RETURN;
4965       ELSIF (p_action IN ('DELETE', 'UPDATE', 'APPEND') AND l_list_header_id = -1) THEN
4966         x_error_msg := Fte_Util_PKG.Get_Msg(p_name   => 'FTE_PRICELIST_INVALID',
4967                                              p_tokens => StringArray('NAME'),
4968                                              p_values => StringArray(l_name));
4969 
4970         FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
4971                    		    p_msg		=> x_error_msg,
4972                    		    p_category		=> 'C',
4973 				    p_line_number	=> p_line_number);
4974 
4975         x_status := 2;
4976         FTE_UTIL_PKG.Exit_Debug(l_module_name);
4977         RETURN;
4978       END IF;
4979 
4980       IF (l_service_level IS NULL) THEN
4981         --TL Rate Charts must have a service level attached to the header
4982         IF (l_chart_type IN ('TL_RATE_CHART', 'TL_MODIFIER', 'MIN_MODIFIER')) THEN
4983   	  x_error_msg := FTE_UTIL_PKG.GET_MSG('FTE_SERVICE_LEVEL_MISSING');
4984           FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
4985                      		      p_msg		=> x_error_msg,
4986                    		      p_category	=> 'A',
4987 				      p_line_number	=> p_line_number);
4988           FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
4989           x_status := 2;
4990 	  RETURN;
4991         END IF;
4992       ELSE
4993         l_service_level := Validate_Service_Level(p_carrier_id    => p_carrier_id,
4994                                                   p_carrier_name  => NULL,
4995                                                   p_service_level => l_service_level,
4996 						  p_line_number	  => p_line_number,
4997 						  x_status 	  => x_status,
4998                                                   x_error_msg     => x_error_msg);
4999 
5000         IF (l_service_level IS NULL OR x_status <> -1) THEN
5001           FTE_UTIL_PKG.Exit_Debug(l_module_name);
5002           RETURN;
5003         END IF;
5004       END IF;
5005 
5006       --Begin Validate and Cache Currency
5007       IF (l_chart_type <> 'FAC_MODIFIER' AND p_action <> 'DELETE') THEN
5008         -- not checking carrier currency anymore
5009         VALIDATE_CURRENCY(p_currency	=> l_currency,
5010                           p_carrier_id  => p_carrier_id,
5011 			  p_line_number	=> p_line_number,
5012 			  x_status	=> x_status,
5013 			  x_error_msg	=> x_error_msg);
5014 
5015         IF (x_status <> -1) THEN
5016           FTE_UTIL_PKG.Exit_Debug(l_module_name);
5017           RETURN;
5018         END IF;
5019 
5020       END IF; --End Validate and Cache Currency
5021 
5022       -- Multiple RC
5023       IF (l_replaced_rc IS NOT NULL AND LENGTH(l_replaced_rc) > 0 ) THEN
5024         BEGIN
5025           SELECT list_header_id
5026           INTO   l_old_rc_id
5027           FROM   qp_list_headers_tl
5028           WHERE  name = l_replaced_rc
5029           AND    language = userenv('LANG');
5030 
5031   	  FTE_RATE_CHART_PKG.LH_NEW_RC(FTE_RATE_CHART_PKG.lh_new_rc.COUNT + 1)         := l_name;
5032           FTE_RATE_CHART_PKG.LH_REPLACE_RC(FTE_RATE_CHART_PKG.lh_replace_rc.COUNT + 1) := l_old_rc_id;
5033 
5034         EXCEPTION
5035           WHEN NO_DATA_FOUND THEN
5036             x_error_msg := Fte_Util_PKG.Get_Msg(p_name   => 'FTE_REPLACE_RC_NOT_FOUND',
5037                                                  p_tokens => StringArray('RATE_CHART'),
5038                                                  p_values => STRINGARRAY(l_replaced_rc));
5039             FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
5040                     		        p_msg		=> x_error_msg,
5041                    		        p_category	=> 'D',
5042 				        p_line_number	=> p_line_number);
5043 
5044             x_status := 2;
5045             FTE_UTIL_PKG.Exit_Debug(l_module_name);
5046 	    RETURN;
5047           WHEN OTHERS THEN
5048     	    x_error_msg := sqlerrm;
5049             FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
5050                			        p_msg   	=> x_error_msg,
5051              			        p_category    	=> 'O',
5052 	        		        p_line_number	=> p_line_number);
5053             FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
5054             x_status := 2;
5055 	    RETURN;
5056         END;
5057       END IF;
5058     ELSE
5059       l_list_header_id := TO_NUMBER(FTE_UTIL_PKG.Get_Data('LIST_HEADER_ID', p_values));
5060     END IF;
5061 
5062     IF (p_process_id is NULL) THEN
5063       FTE_RATE_CHART_PKG.G_Process_Id := FTE_BULKLOAD_PKG.get_process_id;
5064     ELSE
5065       FTE_RATE_CHART_PKG.G_Process_Id := p_process_id;
5066     END IF;
5067 
5068     IF (p_action = 'DELETE') THEN
5069       l_count := p_qp_list_header_tbl.COUNT+1;
5070 
5071       p_qp_list_header_tbl(l_count).NAME                  := l_name;
5072       p_qp_list_header_tbl(l_count).LIST_HEADER_ID        := l_list_header_id;
5073       p_qp_list_header_tbl(l_count).INTERFACE_ACTION_CODE := 'D';
5074       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
5075       RETURN;
5076     ELSIF (p_action IN ('ADD', 'APPEND','UPDATE')) THEN
5077 
5078       IF (p_action = 'ADD') THEN
5079         l_intAction := 'C';
5080       ELSIF (p_action = 'APPEND') THEN
5081   	l_intAction := 'U';
5082       ELSE --'UPDATE'
5083 	l_intAction := 'U';
5084       END IF;
5085 
5086       -- Inserting insertdata into QP_INTERFACE_LIST_HEADERS
5087 
5088       l_count := p_qp_list_header_tbl.COUNT+1;
5089 
5090       p_qp_list_header_tbl(l_count).PROCESS_ID     	    := FTE_RATE_CHART_PKG.G_Process_Id;
5091       p_qp_list_header_tbl(l_count).INTERFACE_ACTION_CODE       := l_intAction;
5092       p_qp_list_header_tbl(l_count).START_DATE_ACTIVE     := l_start_date;
5093       p_qp_list_header_tbl(l_count).LIST_TYPE_CODE        := l_list_type_code;
5094       p_qp_list_header_tbl(l_count).END_DATE_ACTIVE       := l_end_date;
5095       p_qp_list_header_tbl(l_count).CURRENCY_CODE         := l_currency;
5096       p_qp_list_header_tbl(l_count).NAME                  := l_name;
5097       p_qp_list_header_tbl(l_count).DESCRIPTION           := l_description;
5098       p_qp_list_header_tbl(l_count).LIST_HEADER_ID        := l_list_header_id;
5099       p_qp_list_header_tbl(l_count).ATTRIBUTE1            := l_attribute1;
5100 
5101       IF (l_list_header_id = -1) THEN
5102         l_list_header_id := '';
5103       END IF;
5104 
5105       IF (p_validate) THEN
5106         --Insert party qualifier for all rate charts apart for FACILITY
5107         -- and for MIN_MODIFIER
5108         IF (p_action = 'ADD'
5109 	    AND l_chart_type NOT IN ('FAC_RATE_CHART', 'FAC_MODIFIER', 'MIN_MODIFIER')) THEN
5110 
5111   	  l_count := p_qp_qualifier_tbl.COUNT+1;
5112 
5113           p_qp_qualifier_tbl(l_count).PROCESS_ID            := FTE_RATE_CHART_PKG.G_Process_Id;
5114           p_qp_qualifier_tbl(l_count).INTERFACE_ACTION_CODE := l_intAction;
5115           p_qp_qualifier_tbl(l_count).QUALIFIER_ATTR_VALUE  := p_carrier_id;
5116           p_qp_qualifier_tbl(l_count).QUALIFIER_GROUPING_NO := l_qualifier_group;
5117           p_qp_qualifier_tbl(l_count).QUALIFIER_CONTEXT     := 'PARTY';
5118           p_qp_qualifier_tbl(l_count).QUALIFIER_ATTRIBUTE   := 'SUPPLIER';
5119         END IF;
5120 
5121         --Insert two additional qualifiers for TL rate charts
5122         --and modifiers (service type and mode_of_transport)
5123         IF (p_action = 'ADD' AND l_chart_type IN ('TL_RATE_CHART', 'TL_MODIFIER')) THEN
5124           --Service_Type
5125           l_count := p_qp_qualifier_tbl.COUNT+1;
5126 
5127           p_qp_qualifier_tbl(l_count).PROCESS_ID            := FTE_RATE_CHART_PKG.G_Process_Id;
5128           p_qp_qualifier_tbl(l_count).INTERFACE_ACTION_CODE := l_intAction;
5129           p_qp_qualifier_tbl(l_count).QUALIFIER_ATTRIBUTE   := 'SERVICE_TYPE';
5130           p_qp_qualifier_tbl(l_count).QUALIFIER_ATTR_VALUE  := l_service_level;
5131           p_qp_qualifier_tbl(l_count).QUALIFIER_GROUPING_NO := l_qualifier_group;
5132           p_qp_qualifier_tbl(l_count).QUALIFIER_CONTEXT     := FTE_RTG_GLOBALS.G_QX_SERVICE_TYPE;
5133 
5134           --Mode_Of_Transport
5135     	  l_count := p_qp_qualifier_tbl.COUNT+1;
5136 
5137           p_qp_qualifier_tbl(l_count).PROCESS_ID            := FTE_RATE_CHART_PKG.G_Process_Id;
5138           p_qp_qualifier_tbl(l_count).INTERFACE_ACTION_CODE := l_intAction;
5139           p_qp_qualifier_tbl(l_count).QUALIFIER_ATTRIBUTE   := 'MODE_OF_TRANSPORTATION';
5140           p_qp_qualifier_tbl(l_count).QUALIFIER_ATTR_VALUE  := 'TRUCK';
5141           p_qp_qualifier_tbl(l_count).QUALIFIER_GROUPING_NO := l_qualifier_group;
5142           p_qp_qualifier_tbl(l_count).QUALIFIER_CONTEXT     := FTE_RTG_GLOBALS.G_QX_MODE_OF_TRANSPORT;
5143         END IF;
5144       END IF;
5145     END IF;
5146 
5147     FTE_RATE_CHART_PKG.g_chart_type := l_chart_type;
5148 
5149     FTE_UTIL_PKG.Exit_Debug(l_module_name);
5150 
5151   EXCEPTION
5152     WHEN OTHERS THEN
5153       x_error_msg := sqlerrm;
5154       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
5155                			  p_msg   		=> x_error_msg,
5156              			  p_category    	=> 'O',
5157 	        		  p_line_number		=> p_line_number);
5158       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
5159       x_status := 2;
5160   END VALIDATE_RATE_CHART;
5161 
5162   -----------------------------------------------------------------------------
5163   -- PROCEDURE: VALIDATE_RATE_LINE
5164   --
5165   -- Purpose: Validate the data corresponding to this Rate Chart Line, and
5166   --          store the data in temporary tables for later insertion into
5167   --          QP_INTERFACE_LIST_LINES and QP_INTERFACE_LIST_PRICING_ATTRIBS.
5168   --
5169   -- IN Parameters
5170   --    1. p_values: 		pl/sql table for the rate line line
5171   --	2. p_line_number:	line number
5172   --	3. p_validate:		boolean for validating data within VALIDATION procedure, default true
5173   --
5174   -- Out Parameters
5175   --    1. p_qp_list_line_tbl: 	pl/sql table for the list line information
5176   --	2. p_qp_pricing_attrib_tbl:	pl/sql table for the attributes
5177   --	3. x_status:		status of the processing, -1 means no error
5178   --	4. x_error_msg:		error message if any.
5179   -----------------------------------------------------------------------------
5180   PROCEDURE VALIDATE_RATE_LINE(p_values     		IN    		FTE_BULKLOAD_PKG.data_values_tbl,
5181 			       p_line_number		IN		NUMBER,
5182 			       p_validate 		IN 		BOOLEAN DEFAULT TRUE,
5183                                p_qp_list_line_tbl	IN OUT	NOCOPY FTE_RATE_CHART_PKG.qp_list_line_tbl,
5184 			       p_qp_pricing_attrib_tbl	IN OUT	NOCOPY FTE_RATE_CHART_PKG.qp_pricing_attrib_tbl,
5185 	                       x_status     		OUT NOCOPY  	NUMBER,
5186                                x_error_msg  		OUT NOCOPY  	VARCHAR2) IS
5187 
5188   l_intAction           VARCHAR2(30);
5189   l_description         VARCHAR2(100);
5190   l_action          	VARCHAR2(20);
5191   l_linenum             VARCHAR2(20);
5192   l_operamt             VARCHAR2(20);
5193   l_uom                 VARCHAR2(20);
5194   l_uom_code            VARCHAR2(20);
5195   l_break_type          VARCHAR2(20);
5196   l_volume_type         VARCHAR2(20);
5197   l_rate_type           VARCHAR2(20);
5198   l_item                VARCHAR2(20);
5199   l_group               NUMBER;
5200   l_list_header_id      NUMBER;
5201   l_precedence          NUMBER;
5202   l_product_attribute   VARCHAR2(100);
5203   l_list_type_code      VARCHAR2(3);
5204   l_operator            VARCHAR2(30);
5205   l_pricing_attribute   VARCHAR2(50);
5206   l_prc_attr_datatype   VARCHAR2(3);
5207   l_context             VARCHAR2(50);
5208   l_comp_operator       VARCHAR2(30);
5209   l_attr_value_from     VARCHAR2(50);
5210   l_attr_value_to       VARCHAR2(50);
5211   l_mod_level_code      VARCHAR2(30);
5212   l_formula_id          NUMBER;
5213   l_start_date		VARCHAR2(50);
5214   l_end_date		VARCHAR2(50);
5215 
5216   --modifier stuff
5217   l_phase               NUMBER;
5218   l_qual_ind            NUMBER;
5219   l_dscvalue_amt        VARCHAR2(30);
5220   l_dsclumpsum_amt      VARCHAR2(30);
5221   l_dscprcnt_amt        VARCHAR2(30);
5222   l_type                VARCHAR2(30);
5223   l_subtype             VARCHAR2(30);
5224 
5225   l_attribute1          VARCHAR2(100);
5226   l_chart_type		VARCHAR2(50) := FTE_RATE_CHART_PKG.g_chart_type;
5227   l_module_name         CONSTANT VARCHAR2(100) := 'fte.plsql.' || G_PKG_NAME || '.VALIDATE_RATE_LINE';
5228   l_count		NUMBER;
5229 
5230   BEGIN
5231     FTE_UTIL_PKG.ENTER_Debug(l_module_name);
5232 
5233     --reset the upper value used for parcel LTL breaks.
5234     FTE_RATE_CHART_PKG.G_previous_upper := 0;
5235 
5236     l_list_header_id    := -1;
5237     x_status     := -1;
5238 
5239     l_group             := 1;
5240     l_product_attribute := null;
5241     l_item := 'ALL';
5242     l_prc_attr_datatype := 'C';
5243 
5244     l_action            := FTE_UTIL_PKG.GET_DATA('ACTION', p_values);
5245     l_linenum           := FTE_UTIL_PKG.GET_DATA('LINE_NUMBER', p_values);
5246     l_description       := FTE_UTIL_PKG.GET_DATA('DESCRIPTION', p_values);
5247     l_operamt           := FTE_UTIL_PKG.GET_DATA('RATE', p_values);
5248     l_uom               := FTE_UTIL_PKG.GET_DATA('UOM', p_values);
5249     l_precedence        := FTE_UTIL_PKG.GET_DATA('PRECEDENCE', p_values);
5250     l_break_type        := FTE_UTIL_PKG.GET_DATA('RATE_BREAK_TYPE', p_values);
5251     l_volume_type       := FTE_UTIL_PKG.GET_DATA('VOLUME_TYPE', p_values);
5252     l_rate_type         := FTE_UTIL_PKG.GET_DATA('RATE_TYPE', p_values);
5253     l_pricing_attribute := FTE_UTIL_PKG.GET_DATA('ATTRIBUTE', p_values);
5254     l_attr_value_from   := FTE_UTIL_PKG.GET_DATA('ATTRIBUTE_VALUE', p_values);
5255     l_attr_value_to     := FTE_UTIL_PKG.GET_DATA('ATTRIBUTE_VALUE_TO', p_values);
5256     l_context           := FTE_UTIL_PKG.GET_DATA('CONTEXT', p_values);
5257     l_comp_operator     := FTE_UTIL_PKG.GET_DATA('COMPARISON_OPERATOR', p_values);
5258     l_type              := FTE_UTIL_PKG.GET_DATA('TYPE', p_values);
5259     l_subtype           := FTE_UTIL_PKG.GET_DATA('SUBTYPE', p_values);
5260     l_formula_id        := FTE_UTIL_PKG.GET_DATA('FORMULA_ID', p_values);
5261     l_start_date        := FTE_UTIL_PKG.GET_DATA('START_DATE_ACTIVE', p_values);
5262     l_end_date          := FTE_UTIL_PKG.GET_DATA('END_DATE_ACTIVE', p_values);
5263 
5264     --FTE_RATE_CHART
5265     IF (l_chart_type = 'FTE_RATE_CHART') THEN
5266       l_list_type_code := 'PLL';
5267 
5268     --FTE_MODIFIER
5269     ELSIF (l_chart_type = 'FTE_MODIFIER') THEN
5270       l_phase := 2;
5271       l_qual_ind := 5;
5272       l_dscvalue_amt     := FTE_UTIL_PKG.GET_DATA('RATE_PER_UOM', p_values);
5273       l_dscprcnt_amt     := FTE_UTIL_PKG.GET_DATA('PERCENTAGE', p_values);
5274       l_dsclumpsum_amt   := FTE_UTIL_PKG.GET_DATA('FIXED_RATE', p_values);
5275       l_mod_level_code   := FTE_UTIL_PKG.GET_DATA('MOD_LEVEL_CODE', p_values);
5276       l_list_type_code   := 'SUR';
5277 
5278     --TL_RATE_CHART
5279     ELSIF (l_chart_type = 'TL_RATE_CHART') THEN
5280       l_attribute1      := FTE_UTIL_PKG.GET_DATA('ATTRIBUTE1', p_values);
5281       l_list_type_code  := 'PLL';
5282 
5283     --TL_MODIFIER
5284     ELSIF (l_chart_type IN ('TL_MODIFIER', 'MIN_MODIFIER', 'FAC_MODIFIER')) THEN
5285       l_phase := 2;
5286       l_qual_ind := 22;
5287       l_dscvalue_amt      := FTE_UTIL_PKG.GET_DATA('RATE_PER_UOM', p_values);
5288       l_dscprcnt_amt      := FTE_UTIL_PKG.GET_DATA('PERCENTAGE', p_values);
5289       l_dsclumpsum_amt    := FTE_UTIL_PKG.GET_DATA('FIXED_RATE', p_values);
5290       l_mod_level_code    := FTE_UTIL_PKG.GET_DATA('MOD_LEVEL_CODE', p_values);
5291       l_list_type_code    := 'SUR';
5292 
5293     ELSIF (l_chart_type = 'FAC_RATE_CHART') THEN
5294       l_list_type_code := 'PLL';
5295 
5296     ELSE
5297 
5298       x_error_msg := FTE_UTIL_PKG.GET_MSG('FTE_CHART_TYPE_ERROR');
5299       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name => l_module_name,
5300 	           		  p_msg   	=> x_error_msg,
5301 	           		  p_category    => 'O');
5302 
5303       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
5304       x_status := 2;
5305       RETURN;
5306     END IF;
5307 
5308     IF (l_mod_level_code = 'LINEGROUP') THEN
5309       l_phase := 3;
5310     ELSE
5311       l_mod_level_code := 'LINE';
5312     END IF;
5313 
5314     IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
5315       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Action', l_action);
5316       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Description', l_description );
5317       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Rate', l_operamt);
5318       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'UOM', l_uom);
5319       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Precedence', l_precedence);
5320       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Rate break type', l_break_type);
5321       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Volume type', l_volume_type);
5322       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Rate type', l_rate_type);
5323       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Attribute', l_pricing_attribute);
5324       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Attribute value', l_attr_value_from );
5325       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Attribute value to', l_attr_value_to );
5326       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Context', l_context);
5327       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Comparison operator', l_comp_operator);
5328       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Type', l_type );
5329       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Subtype', l_subtype );
5330       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Formula ID', l_formula_id);
5331       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Line number', p_line_number);
5332     END IF;
5333 
5334     l_action := UPPER(l_action);
5335 
5336     IF (NOT p_validate) THEN
5337       l_operator := l_rate_type;
5338       l_uom_code := l_uom;
5339     END IF;
5340 
5341     VALIDATE_DATE(p_date => l_start_date,
5342 		  p_line_number => p_line_number,
5343 		  x_status => x_status,
5344 		  x_error_msg => x_error_msg);
5345 
5346     IF (x_status <> -1) THEN
5347       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
5348       RETURN;
5349     END IF;
5350 
5351     VALIDATE_DATE(p_date => l_end_date,
5352 		  p_line_number => p_line_number,
5353 		  x_status => x_status,
5354 		  x_error_msg => x_error_msg);
5355 
5356     IF (x_status <> -1) THEN
5357       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
5358       RETURN;
5359     END IF;
5360 
5361     IF (p_validate) THEN
5362       VALIDATE_ACTION(p_action		=> l_action,
5363 	  	      p_type		=> 'RATE_LINE',
5364 		      p_line_number 	=> p_line_number,
5365 		      x_status		=> x_status,
5366 		      x_error_msg	=> x_error_msg);
5367 
5368       IF (x_status <> -1) THEN
5369         FTE_UTIL_PKG.Exit_Debug(l_module_name);
5370         RETURN;
5371       END IF;
5372 
5373       IF (l_linenum IS NULL) THEN
5374         x_error_msg := FTE_UTIL_PKG.GET_MSG('FTE_CAT_LINE_NUMBER_MISSING');
5375         FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
5376                    		    p_msg		=> x_error_msg,
5377                    		    p_category		=> 'A',
5378 				    p_line_number	=> p_line_number);
5379         FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
5380         x_status := 2;
5381         RETURN;
5382       ELSIF (isNum(l_linenum) = 0) THEN
5383         x_error_msg := Fte_Util_PKG.Get_Msg(p_name   => 'FTE_CAT_NUMBER_INVALID', -- need change
5384                                              p_tokens => STRINGARRAY('NUMBER'),
5385                                              p_values => STRINGARRAY(l_linenum));
5386         FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name => l_module_name,
5387                    		    p_msg	  => x_error_msg,
5388                    		    p_category	  => 'D',
5389 				    p_line_number => p_line_number);
5390         FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
5391         x_status := 2;
5392         RETURN;
5393       END IF;
5394     END IF;
5395 
5396     FTE_RATE_CHART_PKG.G_line_number    := l_linenum;
5397 
5398     IF (l_precedence IS NULL) THEN
5399       l_precedence := 220;
5400     END IF;
5401 
5402     IF (p_validate) THEN
5403       IF (l_uom IS NULL) THEN
5404         --The UOM is not mandatory for Modifiers, even for RATE_PER_UOM.
5405         --If the UOM is not specified, the UOM of the rate line will be used.
5406         IF (l_chart_type NOT IN ('FTE_MODIFIER', 'TL_MODIFIER',
5407                                  'MIN_MODIFIER', 'FAC_MODIFIER')) THEN
5408           x_error_msg := FTE_UTIL_PKG.GET_MSG('FTE_CAT_UOM_MISSING');
5409           FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name	=> l_module_name,
5410                    		      p_msg 		=> x_error_msg,
5411                    		      p_category	=> 'A',
5412 				      p_line_number	=> p_line_number);
5413           FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
5414           x_status := 2;
5415 	  RETURN;
5416         END IF;
5417       ELSE
5418         VALIDATE_UOM(p_uom		=> l_uom,
5419 		     p_class		=> NULL,
5420 		     p_line_number 	=> p_line_number,
5421 		     p_uom_code 	=> l_uom_code,
5422 		     x_status		=> x_status,
5423 		     x_error_msg	=> x_error_msg);
5424 
5425         IF (x_status <> -1) THEN
5426           FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
5427 	  RETURN;
5428         END IF;
5429 
5430       END IF;
5431 
5432       IF (LENGTH(l_break_type) > 0) THEN
5433         l_break_type := UPPER(l_break_type);
5434         IF (NOT( l_break_type = 'POINT' OR  l_break_type = 'RANGE' )) THEN
5435           x_error_msg := Fte_Util_PKG.Get_Msg(p_name   => 'FTE_BREAK_TYPE_INVALID',
5436                                                p_tokens => STRINGARRAY('BREAK_TYPE'),
5437                                                p_values => STRINGARRAY(l_break_type));
5438           FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name	=> l_module_name,
5439                    		      p_msg	 	=> x_error_msg,
5440                    		      p_category	=> 'D',
5441 				      p_line_number	=> p_line_number);
5442           FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
5443           x_status := 2;
5444 	  RETURN;
5445         END IF;
5446       END IF;
5447 
5448       -- if it's has no rate or break type, throw error.
5449       IF (l_chart_type = 'FTE_RATE_CHART' AND l_operamt IS NULL AND l_break_type IS NULL) THEN
5450         x_error_msg := FTE_UTIL_PKG.GET_MSG('FTE_CAT_RATE_AND_BREAK');
5451         FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name	=> l_module_name,
5452                      		    p_msg 		=> x_error_msg,
5453                    		    p_category		=> 'A',
5454 				    p_line_number	=> p_line_number);
5455         FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
5456         x_status := 2;
5457         RETURN;
5458 
5459       END IF;
5460 
5461       -- if both rate and break type not null, error also
5462       IF (l_chart_type = 'FTE_RATE_CHART' AND l_operamt IS NOT NULL AND l_break_type IS NOT NULL) THEN
5463         x_error_msg := FTE_UTIL_PKG.GET_MSG('FTE_CAT_RATE_AND_BREAK');
5464         FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name	=> l_module_name,
5465                    		    p_msg 		=> x_error_msg,
5466                    		    p_category		=> 'A',
5467 				    p_line_number	=> p_line_number);
5468         FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
5469         x_status := 2;
5470         RETURN;
5471       END IF;
5472 
5473       IF (LENGTH(l_volume_type) > 0) THEN
5474         l_volume_type := UPPER(l_volume_type);
5475         IF (NOT  (l_volume_type = 'QUANTITY' OR l_volume_type = 'TOTAL_QUANTITY') ) THEN
5476           x_error_msg := Fte_Util_PKG.Get_Msg(p_name   => 'FTE_VOLUME_TYPE_INVALID',
5477                                                p_tokens => STRINGARRAY('VOLUME_TYPE'),
5478                                                p_values => STRINGARRAY(l_volume_type));
5479 
5480           FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name	=> l_module_name,
5481                    		      p_msg 		=> x_error_msg,
5482                    		      p_category		=> 'D',
5483 				      p_line_number	=> p_line_number);
5484           FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
5485           x_status := 2;
5486 	  RETURN;
5487 --            x_error_msg := 'VOLUME_TYPE (' || l_volume_type || ') FOR LINE ' || l_linenum || ' INVALID';
5488         END IF;
5489       END IF;
5490 
5491       -- if it's a standard line and don't have rate type, throw error.
5492       IF (l_chart_type = 'FTE_RATE_CHART' AND l_operamt IS NOT NULL AND l_rate_type IS NULL) THEN
5493         x_error_msg := FTE_UTIL_PKG.GET_MSG('FTE_CAT_RATE_TYPE_MISSING');
5494         FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name	=> l_module_name,
5495                    		    p_msg 		=> x_error_msg,
5496                    		    p_category		=> 'A',
5497 				    p_line_number	=> p_line_number);
5498         FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
5499         x_status := 2;
5500         RETURN;
5501       END IF;
5502 
5503       l_rate_type := Validate_Rate_Type(p_rate_type  	=> l_rate_type,
5504 				        p_line_number   => p_line_number,
5505 				        x_status     	=> x_status,
5506 				        x_error_msg  	=> x_error_msg);
5507       IF (x_status <> -1) THEN
5508         FTE_UTIL_PKG.Exit_Debug(l_module_name);
5509         return;
5510       ELSE
5511         l_operator := l_rate_type;
5512       END IF;
5513     END IF;
5514 
5515 
5516     --Validate Modifier Specific Attributes
5517     IF (l_chart_type IN ('FTE_MODIFIER', 'TL_MODIFIER', 'MIN_MODIFIER')) THEN
5518       --validate the type
5519       IF (l_type = 'ACCESSORIAL_SURCHARGE') THEN
5520         IF (l_subtype IS NOT NULL AND LENGTH(l_subtype) > 0) THEN
5521           IF (l_chart_type NOT IN ('TL_MODIFIER', 'MIN_MODIFIER', 'FAC_MODIFIER')) THEN
5522             l_subtype := validate_subtype(p_subtype 	=> l_subtype,
5523 					  p_line_number	=> p_line_number,
5524 					  x_status	=> x_status,
5525 					  x_error_msg	=> x_error_msg);
5526 	    IF (x_status <> -1) THEN
5527               FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
5528               RETURN;
5529 	    END IF;
5530           END IF;
5531         ELSE
5532           x_error_msg := FTE_UTIL_PKG.GET_MSG('FTE_SUBTYPE_MISSING');
5533           FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name		=> l_module_name,
5534                    		      p_msg	 		=> x_error_msg,
5535                    		      p_category		=> 'A',
5536 				      p_line_number		=> p_line_number);
5537           FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
5538           x_status := 2;
5539           RETURN;
5540         END IF;
5541 
5542         IF (l_subtype IS NULL) THEN
5543 	  l_subtype := FTE_UTIL_PKG.GET_DATA('SUBTYPE', p_values);
5544           x_error_msg := Fte_Util_PKG.Get_Msg(p_name   => 'FTE_SUBTYPE_INVALID',
5545                                                p_tokens => STRINGARRAY('SUBTYPE'),
5546                                                p_values => STRINGARRAY(l_subtype));
5547 
5548           FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name	=> l_module_name,
5549                    		      p_msg	 	=> x_error_msg,
5550                    		      p_category	=> 'D',
5551 				      p_line_number	=> p_line_number);
5552           FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
5553           x_status := 2;
5554 	  RETURN;
5555         END IF;
5556 
5557       ELSIF (l_type = 'DISCOUNT') THEN
5558         l_list_type_code := 'DIS';
5559       ELSE
5560         x_error_msg := Fte_Util_PKG.Get_Msg(p_name   => 'FTE_MOD_TYPE_INVALID',
5561                                              p_tokens => STRINGARRAY('TYPE'),
5562                                              p_values => STRINGARRAY(l_type));
5563 
5564         FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name	=> l_module_name,
5565                    		    p_msg 		=> x_error_msg,
5566                  		    p_category		=> 'D',
5567 				    p_line_number	=> p_line_number);
5568         FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
5569         x_status := 2;
5570 	RETURN;
5571       END IF;
5572 
5573       --validate the discount amounts and percentages and set the operator
5574       IF (l_dscvalue_amt IS NOT NULL AND LENGTH(l_dscvalue_amt) > 0) THEN
5575         l_operator := 'AMT';
5576         l_operamt := l_dscvalue_amt;
5577       ELSIF (l_dscprcnt_amt IS NOT NULL AND LENGTH(l_dscprcnt_amt) > 0) THEN
5578         l_operator := '%';
5579         l_operamt := l_dscprcnt_amt;
5580       ELSIF (l_dsclumpsum_amt IS NOT NULL AND LENGTH(l_dsclumpsum_amt) > 0) THEN
5581         l_operator := 'LUMPSUM';
5582         l_operamt := l_dsclumpsum_amt;
5583       ELSIF (l_chart_type = 'FTE_MODIFIER') THEN
5584         --FTE_MODIFIERS don't have breaks, so one of these values must be specified.
5585         x_error_msg := FTE_UTIL_PKG.GET_MSG('FTE_MOD_RATE_MISSING');
5586         FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name	=> l_module_name,
5587                      		    p_msg		=> x_error_msg,
5588                    		    p_category		=> 'A',
5589 				    p_line_number	=> p_line_number);
5590         FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
5591         x_status := 2;
5592 	RETURN;
5593       END IF;
5594     END IF;  --end validation of specific Attributes.
5595 
5596     FTE_RATE_CHART_PKG.G_Prc_Brk_Type      := l_break_type;
5597     FTE_RATE_CHART_PKG.G_Prc_Rate_Type     := l_rate_type;
5598     FTE_RATE_CHART_PKG.G_Prc_Vol_Type      := l_volume_type;
5599     FTE_RATE_CHART_PKG.G_Prc_Line_Desc     := l_description;
5600     FTE_RATE_CHART_PKG.G_Product_UOM       := l_uom_code;
5601 
5602     --Save the current line number, so we can associate with breaks, if there are any.
5603     FTE_RATE_CHART_PKG.G_Prc_Brk_Hdr_Index := l_linenum;
5604 
5605     IF (l_action IN ('ADD', 'UPDATE')) THEN
5606       -- Insert into QP_INTERFACE_LIST_LINES
5607       l_count := p_qp_list_line_tbl.COUNT+1;
5608 
5609       --MODIFIERS NEED THE BREAK TYPE ON THE LINE, BUT RATE CHARTS DON'T
5610       IF (l_chart_type IN ('FTE_RATE_CHART', 'FAC_RATE_CHART')) THEN
5611         l_break_type := NULL;
5612       END IF;
5613 
5614       IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
5615         FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Chart Type', l_chart_type);
5616       END IF;
5617 
5618       p_qp_list_line_tbl(l_count).PROCESS_ID             := FTE_RATE_CHART_PKG.G_Process_Id;
5619       p_qp_list_line_tbl(l_count).OPERAND                := fnd_number.canonical_to_number(l_operamt);
5620       p_qp_list_line_tbl(l_count).COMMENTS               := l_description;
5621       p_qp_list_line_tbl(l_count).LIST_LINE_NO           := l_linenum;
5622       p_qp_list_line_tbl(l_count).PROCESS_TYPE           := 'SSH';
5623       p_qp_list_line_tbl(l_count).INTERFACE_ACTION_CODE  := 'C';
5624       p_qp_list_line_tbl(l_count).LIST_LINE_TYPE_CODE    := l_list_type_code;
5625       p_qp_list_line_tbl(l_count).AUTOMATIC_FLAG         := 'Y';
5626       p_qp_list_line_tbl(l_count).ACCRUAL_FLAG           := 'N';
5627       p_qp_list_line_tbl(l_count).OVERRIDE_FLAG          := 'N';
5628       p_qp_list_line_tbl(l_count).MODIFIER_LEVEL_CODE    := l_mod_level_code;
5629       p_qp_list_line_tbl(l_count).ARITHMETIC_OPERATOR    := l_operator;
5630       p_qp_list_line_tbl(l_count).PRICE_BREAK_TYPE_CODE  := l_break_type;
5631       p_qp_list_line_tbl(l_count).PRICE_BREAK_HEADER_INDEX := NULL;
5632       p_qp_list_line_tbl(l_count).ATTRIBUTE2             := NULL;
5633       p_qp_list_line_tbl(l_count).RLTD_MODIFIER_GRP_TYPE := NULL;
5634       p_qp_list_line_tbl(l_count).RLTD_MODIFIER_GRP_NO   := NULL;
5635       p_qp_list_line_tbl(l_count).PRIMARY_UOM_FLAG       := NULL;
5636       p_qp_list_line_tbl(l_count).PRODUCT_PRECEDENCE     := l_precedence;
5637       p_qp_list_line_tbl(l_count).PRICING_GROUP_SEQUENCE := NULL;
5638       p_qp_list_line_tbl(l_count).PRICING_PHASE_ID       := l_phase;
5639       p_qp_list_line_tbl(l_count).QUALIFICATION_IND      := l_qual_ind;
5640       p_qp_list_line_tbl(l_count).CHARGE_TYPE_CODE       := l_type;
5641       p_qp_list_line_tbl(l_count).CHARGE_SUBTYPE_CODE    := l_subtype;
5642       p_qp_list_line_tbl(l_count).ATTRIBUTE1             := l_attribute1;
5643       p_qp_list_line_tbl(l_count).PRICE_BY_FORMULA_ID    := l_formula_id;
5644       p_qp_list_line_tbl(l_count).START_DATE_ACTIVE	 := l_start_date;
5645       p_qp_list_line_tbl(l_count).END_DATE_ACTIVE	 := l_end_date;
5646 
5647       --Save the current index into p_qp_list_line_tbl, so we can
5648       --update list_type_code to 'PBH' in case of breaks.
5649       FTE_RATE_CHART_PKG.G_Cur_Line_Index := l_count;
5650 
5651       IF (l_chart_type = 'FTE_RATE_CHART') THEN
5652         --rate chart
5653         p_qp_list_line_tbl(l_count).PRIMARY_UOM_FLAG     := 'Y';
5654 
5655       ELSIF (l_chart_type = 'FTE_MODIFIER') THEN
5656         --modifiers
5657         p_qp_list_line_tbl(l_count).PRICING_GROUP_SEQUENCE   := l_group;
5658 
5659       ELSIF (l_chart_type = 'TL_RATE_CHART') THEN
5660         --tl rate chart
5661         p_qp_list_line_tbl(l_count).PRIMARY_UOM_FLAG       := 'Y';
5662 
5663       ELSIF (l_chart_type IN ('TL_MODIFIER', 'MIN_MODIFIER')) THEN
5664         --tl rate chart
5665         p_qp_list_line_tbl(l_count).PRIMARY_UOM_FLAG       := 'Y';
5666 
5667       ELSIF (l_chart_type = 'FAC_RATE_CHART') THEN
5668         --Facility rate chart
5669         p_qp_list_line_tbl(l_count).PRIMARY_UOM_FLAG       := 'Y';
5670 
5671       ELSIF (l_chart_type NOT IN ('FAC_MODIFIER')) THEN
5672         x_error_msg := FTE_UTIL_PKG.GET_MSG('FTE_CHART_TYPE_ERROR');
5673         FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name => l_module_name,
5674 	           		    p_msg   	  => x_error_msg,
5675 	           		    p_category    => 'O');
5676         FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
5677 	x_status := 2;
5678 	RETURN;
5679       END IF;
5680 
5681       IF (l_attr_value_from IS NOT NULL AND l_attr_value_to IS NOT NULL) THEN
5682         IF (l_comp_operator IS NOT NULL) THEN
5683           l_comp_operator := 'BETWEEN';
5684         END IF;
5685         l_prc_attr_datatype := 'N';
5686       ELSIF (l_attr_value_from IS NOT NULL) THEN
5687         IF (l_comp_operator IS NOT NULL) THEN
5688           l_comp_operator := '=';
5689         END IF;
5690       END IF;
5691 
5692       --insert into QP_INTERFACE_PRICING_ATTRIBS
5693       l_product_attribute := 'PRICING_ATTRIBUTE3';
5694 
5695       l_count := p_qp_pricing_attrib_tbl.COUNT+1;
5696       p_qp_pricing_attrib_tbl(l_count).PROCESS_ID              := FTE_RATE_CHART_PKG.G_Process_Id;
5697       p_qp_pricing_attrib_tbl(l_count).PRODUCT_ATTRIBUTE       := l_product_attribute;
5698       p_qp_pricing_attrib_tbl(l_count).PRODUCT_ATTR_VALUE      := l_item;
5699       p_qp_pricing_attrib_tbl(l_count).PRODUCT_UOM_CODE        := l_uom_code;
5700       p_qp_pricing_attrib_tbl(l_count).ATTRIBUTE_GROUPING_NO   := l_group;
5701       p_qp_pricing_attrib_tbl(l_count).LIST_LINE_NO            := l_linenum;
5702       p_qp_pricing_attrib_tbl(l_count).PROCESS_TYPE            := 'SSH';
5703       p_qp_pricing_attrib_tbl(l_count).INTERFACE_ACTION_CODE   := 'C';
5704       p_qp_pricing_attrib_tbl(l_count).EXCLUDER_FLAG           := 'N';
5705       p_qp_pricing_attrib_tbl(l_count).PRODUCT_ATTRIBUTE_CONTEXT := 'ITEM';
5706       p_qp_pricing_attrib_tbl(l_count).PRODUCT_ATTRIBUTE_DATATYPE := 'C';
5707       p_qp_pricing_attrib_tbl(l_count).PRICING_ATTRIBUTE_DATATYPE := l_prc_attr_datatype;
5708       p_qp_pricing_attrib_tbl(l_count).COMPARISON_OPERATOR_CODE   := l_comp_operator;
5709       p_qp_pricing_attrib_tbl(l_count).PRICING_ATTRIBUTE_CONTEXT  := l_context;
5710       p_qp_pricing_attrib_tbl(l_count).PRICING_ATTRIBUTE       := l_pricing_attribute;
5711       p_qp_pricing_attrib_tbl(l_count).PRICING_ATTR_VALUE_FROM := l_attr_value_from;
5712       p_qp_pricing_attrib_tbl(l_count).PRICING_ATTR_VALUE_TO   := l_attr_value_to;
5713 
5714     END IF;
5715 
5716     FTE_RATE_CHART_PKG.g_chart_type := l_chart_type;
5717 
5718     FTE_UTIL_PKG.Exit_Debug(l_module_name);
5719   EXCEPTION
5720     WHEN OTHERS THEN
5721       x_error_msg := sqlerrm;
5722       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
5723                			 p_msg   	=> x_error_msg,
5724              			 p_category    	=> 'O',
5725 	        		 p_line_number	=> p_line_number);
5726       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
5727       x_status := 2;
5728   END VALIDATE_RATE_LINE;
5729 
5730   -----------------------------------------------------------------------------
5731   -- PROCEDURE: VALIDATE_RATE_BREAK
5732   --
5733   -- Purpose: Validate the data corresponding to this price break, and store
5734   --          the data in temporary tables for later insertion into
5735   --          QP_INTERFACE_LIST_LINES and QP_INTERFACE_PRICING_ATTRIBS.
5736   --
5737   -- IN Parameters
5738   --    1. p_values: 		pl/sql table for the rate break line
5739   --	2. p_line_number:	line number
5740   --	3. p_validate:		boolean for validating data within VALIDATION procedure, default true
5741   --
5742   -- Out Parameters
5743   --    1. p_qp_list_line_tbl: 	pl/sql table for the list line information
5744   --	2. p_qp_pricing_attrib_tbl:	pl/sql table for the attributes
5745   --	3. x_status:		status of the processing, -1 means no error
5746   --	4. x_error_msg:		error message if any.
5747   -----------------------------------------------------------------------------
5748   PROCEDURE VALIDATE_RATE_BREAK(p_values     		IN    		FTE_BULKLOAD_PKG.data_values_tbl,
5749 				p_line_number		IN		NUMBER,
5750 				p_validate 		IN 		BOOLEAN DEFAULT TRUE,
5751                                 p_qp_list_line_tbl	IN OUT	NOCOPY  FTE_RATE_CHART_PKG.qp_list_line_tbl,
5752 				p_qp_pricing_attrib_tbl	IN OUT	NOCOPY  FTE_RATE_CHART_PKG.qp_pricing_attrib_tbl,
5753 	                        x_status     		OUT NOCOPY  	NUMBER,
5754                                 x_error_msg  		OUT NOCOPY  	VARCHAR2) IS
5755 
5756   l_group               NUMBER;
5757   l_phase               NUMBER;
5758   l_precedence          NUMBER;
5759   l_prcbrk_linenum      NUMBER;
5760   l_product_attribute   VARCHAR2(50);
5761   l_pricing_attribute   VARCHAR2(50);
5762   l_item                VARCHAR2(30);
5763   l_attribute2          VARCHAR2(30);  -- used to save the fixed price
5764   l_operator            VARCHAR2(30);
5765   l_action           	VARCHAR2(20);
5766   l_linenum             VARCHAR2(20);
5767 
5768   l_attribute1          VARCHAR2(50);
5769   l_attr_value_from     NUMBER;
5770   l_attr_value_to       NUMBER;
5771   l_context             VARCHAR2(50);
5772   l_comp_operator       VARCHAR2(30);
5773   l_break_price         NUMBER;
5774   l_low_val             NUMBER;
5775   l_lower               NUMBER;
5776   l_upper               NUMBER;
5777   l_tmp_d               NUMBER;
5778 
5779   l_brk_hdr_stored      BOOLEAN;
5780   l_brk_hdr_updated     BOOLEAN;
5781   l_count               NUMBER;
5782   l_type                VARCHAR2(50);
5783   l_rate_type           VARCHAR2(50);
5784   l_subtype             VARCHAR2(50);
5785   l_break_type_code     VARCHAR2(30);
5786   l_mod_level_code      VARCHAR2(30);
5787   l_formula_id          NUMBER;
5788 
5789   -- Variables used for error messages
5790   l_tokens              STRINGARRAY;
5791   l_values              STRINGARRAY;
5792   l_chart_type		VARCHAR2(50) := FTE_RATE_CHART_PKG.g_chart_type;
5793 
5794   l_module_name CONSTANT VARCHAR2(100) := 'fte.plsql.' || G_PKG_NAME || '.VALIDATE_RATE_BREAK';
5795 
5796   BEGIN
5797     x_status := -1;
5798     FTE_UTIL_PKG.ENTER_Debug(l_module_name);
5799 
5800     l_precedence        := 220;
5801     l_prcbrk_linenum    := 0;
5802     l_product_attribute := null;
5803     l_item              := 'ALL';
5804     l_attribute2        := '';
5805     x_status            := -1;
5806     l_break_type_code   := 'PLL';
5807 
5808     l_action            := FTE_UTIL_PKG.GET_DATA('ACTION', p_values);
5809     l_linenum           := FTE_UTIL_PKG.GET_DATA('LINE_NUMBER', p_values);
5810     l_attr_value_from   := Fnd_Number.Canonical_To_Number(FTE_UTIL_PKG.GET_DATA('LOWER_LIMIT', p_values));
5811     l_attr_value_to     := Fnd_Number.Canonical_To_Number(FTE_UTIL_PKG.GET_DATA('UPPER_LIMIT', p_values));
5812     l_break_price       := Fnd_Number.Canonical_To_Number(FTE_UTIL_PKG.GET_DATA('RATE', p_values));
5813     l_rate_type         := FTE_UTIL_PKG.GET_DATA('RATE_TYPE', p_values);
5814     l_pricing_attribute := FTE_UTIL_PKG.GET_DATA('ATTRIBUTE', p_values);
5815     l_context           := FTE_UTIL_PKG.GET_DATA('CONTEXT', p_values);
5816     l_formula_id        := FTE_UTIL_PKG.GET_DATA('FORMULA_ID', p_values);
5817 
5818     IF (l_chart_type  IN ('TL_MODIFIER', 'MIN_MODIFIER', 'FAC_MODIFIER')) THEN
5819       l_phase := 2;
5820       l_group := 22;
5821       l_mod_level_code  := FTE_UTIL_PKG.GET_DATA('MOD_LEVEL_CODE', p_values);
5822       l_subtype         := FTE_UTIL_PKG.GET_DATA('SUBTYPE', p_values);
5823       l_type            := FTE_UTIL_PKG.GET_DATA('TYPE', p_values);
5824       l_break_type_code := 'SUR';
5825     END IF;
5826 
5827     IF (l_mod_level_code = 'LINEGROUP') THEN
5828       l_phase := 3;
5829     ELSE
5830       l_mod_level_code := 'LINE';
5831     END IF;
5832 
5833     IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
5834       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Action', l_action);
5835       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Rate type', l_rate_type);
5836       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Attribute', l_pricing_attribute);
5837       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Attribute value', l_attr_value_from );
5838       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Attribute value to', l_attr_value_to );
5839       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Rate', l_break_price );
5840       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Context', l_context);
5841       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Formula ID', l_formula_id);
5842       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Line number', p_line_number);
5843     END IF;
5844 
5845     IF (p_validate) THEN
5846       IF (l_linenum IS NULL) THEN
5847         x_error_msg := FTE_UTIL_PKG.GET_MSG('FTE_CAT_LINE_NUMBER_MISSING');
5848         FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name	=> l_module_name,
5849                      		    p_msg		=> x_error_msg,
5850                    		    p_category		=> 'A',
5851 				    p_line_number	=> p_line_number);
5852         FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
5853         x_status := 2;
5854         RETURN;
5855       ELSIF (isNum(l_linenum) = 0) THEN
5856         x_error_msg := FTE_UTIL_PKG.GET_MSG('FTE_CAT_NUMBER_INVALID');
5857         FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
5858                    		    p_msg		=> x_error_msg,
5859                    		    p_category		=> 'D',
5860 				    p_line_number	=> p_line_number);
5861         FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
5862         x_status := 2;
5863         RETURN;
5864       END IF;
5865     END IF;
5866 
5867     --Inherit line level rate type if not specified at the break level.
5868     IF (l_rate_type IS NULL) THEN
5869       l_rate_type := FTE_RATE_CHART_PKG.G_Prc_Rate_Type;
5870 
5871       -- if both line rate type and break line rate type are null, then error
5872       IF (l_rate_type IS NULL) THEN
5873         x_error_msg := Fte_Util_PKG.Get_Msg(p_name   => 'FTE_RATE_TYPE_INVALID',
5874                                             p_tokens => STRINGARRAY('RATE_TYPE'),
5875                                             p_values => STRINGARRAY(l_rate_type));
5876         FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name	=> l_module_name,
5877                    		   p_msg		=> x_error_msg,
5878                    		   p_category		=> 'D',
5879 				   p_line_number	=> p_line_number);
5880         FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
5881         x_status := 2;
5882 	RETURN;
5883       END IF;
5884     ELSE
5885       IF (p_validate) THEN
5886         l_rate_type := Validate_Rate_Type(p_rate_type  => l_rate_type,
5887 					  p_line_number	 => l_linenum,
5888 					  x_status     => x_status,
5889 					  x_error_msg  => x_error_msg);
5890 
5891         IF (x_status <> -1) THEN
5892 	  FTE_UTIL_PKG.Exit_Debug(l_module_name);
5893 	  return;
5894         END IF;
5895       END IF;
5896     END IF;
5897 
5898     l_operator := l_rate_type;
5899 
5900     IF (p_validate) THEN
5901       VALIDATE_ACTION(p_action		=> l_action,
5902 		      p_type		=> 'RATE_BREAK',
5903 		      p_line_number 	=> p_line_number,
5904 		      x_status		=> x_status,
5905 		      x_error_msg	=> x_error_msg);
5906 
5907       IF (x_status <> -1) THEN
5908         FTE_UTIL_PKG.Exit_Debug(l_module_name);
5909         return;
5910       END IF;
5911 
5912       IF (l_attr_value_to IS NULL) THEN
5913         x_error_msg := FTE_UTIL_PKG.GET_MSG('FTE_UPPER_LIMIT_MISSING');
5914         FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
5915                    		    p_msg	  	=> x_error_msg,
5916                    		    p_category		=> 'A',
5917 				    p_line_number	=> p_line_number);
5918         FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
5919         x_status := 2;
5920         RETURN;
5921       ELSE
5922         IF (l_attr_value_from IS NULL) THEN
5923           -- set break_from
5924           IF (FTE_RATE_CHART_PKG.G_previous_upper = 0 OR FTE_RATE_CHART_PKG.G_previous_upper IS NULL) THEN
5925             l_attr_value_from := 0;  --continuous break start with 0
5926           ELSE
5927             l_low_val    := FTE_RATE_CHART_PKG.G_previous_upper;
5928             l_attr_value_from := l_low_val;
5929           END IF;
5930         END IF;
5931         -- check if UPPER_LIMIT is greater than or equal to LOWER_LIMIT
5932         l_lower := l_attr_value_from;
5933         l_upper := l_attr_value_to;
5934 
5935         IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
5936           FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Attribute Value From', l_attr_value_from);
5937           FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Attribute Value To', l_attr_value_to);
5938   	END IF;
5939 
5940         IF (l_lower > l_upper) THEN
5941           x_error_msg := FTE_UTIL_PKG.GET_MSG('FTE_BREAKS_BAD_LIMITS');
5942           FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
5943                    		      p_msg		=> x_error_msg,
5944                    		      p_category	=> 'D',
5945 				      p_line_number	=> p_line_number);
5946           FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
5947           x_status := 2;
5948           RETURN;
5949         END IF;
5950 
5951         l_tmp_d  := l_attr_value_to;
5952         FTE_RATE_CHART_PKG.G_previous_upper := l_tmp_d;
5953       END IF;
5954 
5955       IF (l_break_price IS NULL) THEN
5956         x_error_msg := FTE_UTIL_PKG.GET_MSG('FTE_CAT_RATE_MISSING');
5957         FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
5958                      		    p_msg 		=> x_error_msg,
5959                    		    p_category		=> 'A',
5960 				    p_line_number	=> p_line_number);
5961         FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
5962         x_status := 2;
5963         RETURN;
5964       END IF;
5965 
5966       IF (FTE_RATE_CHART_PKG.G_Prc_Brk_Type IS NULL) THEN
5967         x_error_msg := FTE_UTIL_PKG.GET_MSG('FTE_RATE_BREAK_TYPE_MISSING');
5968         FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
5969                    		    p_msg		=> x_error_msg,
5970                      		    p_category		=> 'A',
5971 				    p_line_number	=> p_line_number);
5972         FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
5973         x_status := 2;
5974         RETURN;
5975       END IF;
5976 
5977       IF (FTE_RATE_CHART_PKG.G_Prc_Vol_Type IS NULL) THEN
5978         x_error_msg := FTE_UTIL_PKG.GET_MSG('FTE_VOLUME_TYPE_MISSING');
5979         FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
5980                    		    p_msg		=> x_error_msg,
5981                    		    p_category		=> 'A',
5982 				    p_line_number	=> p_line_number);
5983         FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
5984         x_status := 2;
5985         RETURN;
5986       END IF;
5987     END IF;
5988 
5989     IF (l_context IS NULL) THEN
5990       l_context := 'VOLUME';
5991     END IF;
5992 
5993     IF (FTE_RATE_CHART_PKG.G_IS_LTL) THEN
5994       l_attribute2  := l_break_price*100;
5995     END IF;
5996 
5997     IF (l_action IN ('ADD', 'UPDATE')) THEN
5998 
5999       --Update this break's header line with the code 'PBH'
6000       l_count := p_qp_list_line_tbl.COUNT;
6001 
6002       p_qp_list_line_tbl(FTE_RATE_CHART_PKG.g_cur_line_index).LIST_LINE_TYPE_CODE := 'PBH';
6003       p_qp_list_line_tbl(FTE_RATE_CHART_PKG.g_cur_line_index).PRICE_BREAK_TYPE_CODE := FTE_RATE_CHART_PKG.g_prc_brk_type;
6004 
6005       l_count := p_qp_list_line_tbl.COUNT+1;
6006 
6007       p_qp_list_line_tbl(l_count).PROCESS_ID           := FTE_RATE_CHART_PKG.G_Process_Id;
6008       p_qp_list_line_tbl(l_count).OPERAND              := l_break_price;
6009 
6010       p_qp_list_line_tbl(l_count).PRICE_BREAK_TYPE_CODE := FTE_RATE_CHART_PKG.G_Prc_Brk_Type;
6011       p_qp_list_line_tbl(l_count).PRODUCT_PRECEDENCE   := l_precedence;
6012       p_qp_list_line_tbl(l_count).COMMENTS             := FTE_RATE_CHART_PKG.G_Prc_Line_Desc;
6013       p_qp_list_line_tbl(l_count).LIST_LINE_NO         := l_linenum;
6014       p_qp_list_line_tbl(l_count).PRICE_BREAK_HEADER_INDEX := FTE_RATE_CHART_PKG.G_Prc_Brk_Hdr_Index;
6015       p_qp_list_line_tbl(l_count).RLTD_MODIFIER_GRP_NO := FTE_RATE_CHART_PKG.G_Mod_Grp;
6016       p_qp_list_line_tbl(l_count).ATTRIBUTE2           := l_attribute2;
6017       p_qp_list_line_tbl(l_count).ARITHMETIC_OPERATOR  := l_operator;
6018 
6019       p_qp_list_line_tbl(l_count).PROCESS_TYPE         := 'SSH';
6020       p_qp_list_line_tbl(l_count).INTERFACE_ACTION_CODE := 'C';
6021       p_qp_list_line_tbl(l_count).LIST_LINE_TYPE_CODE  := l_break_type_code;
6022       p_qp_list_line_tbl(l_count).AUTOMATIC_FLAG       := 'Y';
6023       p_qp_list_line_tbl(l_count).OVERRIDE_FLAG        := 'N';
6024       p_qp_list_line_tbl(l_count).ACCRUAL_FLAG         := 'N';
6025       p_qp_list_line_tbl(l_count).MODIFIER_LEVEL_CODE  := l_mod_level_code;
6026 
6027       p_qp_list_line_tbl(l_count).PRICING_GROUP_SEQUENCE := l_group;
6028       p_qp_list_line_tbl(l_count).PRICING_PHASE_ID     := l_phase;
6029       p_qp_list_line_tbl(l_count).QUALIFICATION_IND    := NULL;
6030       p_qp_list_line_tbl(l_count).CHARGE_TYPE_CODE     := l_type;
6031       p_qp_list_line_tbl(l_count).CHARGE_SUBTYPE_CODE  := l_subtype;
6032       p_qp_list_line_tbl(l_count).ATTRIBUTE1           := l_attribute1;
6033       p_qp_list_line_tbl(l_count).PRICE_BY_FORMULA_ID  := l_formula_id;
6034 
6035       p_qp_list_line_tbl(l_count).RLTD_MODIFIER_GRP_TYPE := 'PRICE BREAK';
6036       p_qp_list_line_tbl(l_count).PRIMARY_UOM_FLAG     := NULL;
6037 
6038       FTE_RATE_CHART_PKG.G_Mod_Grp := FTE_RATE_CHART_PKG.G_Mod_Grp + 1;
6039 
6040       l_product_attribute := 'PRICING_ATTRIBUTE3';
6041 
6042       IF (l_pricing_attribute IS NULL) THEN
6043         IF (FTE_RATE_CHART_PKG.G_Prc_Vol_Type = 'QUANTITY') THEN
6044           l_pricing_attribute := 'ITEM_QUANTITY';
6045         ELSIF (FTE_RATE_CHART_PKG.G_Prc_Vol_Type = 'TOTAL_QUANTITY') THEN
6046           l_pricing_attribute := 'TOTAL_ITEM_QUANTITY';
6047         END IF;
6048       END IF;
6049 
6050       IF (l_attr_value_from IS NOT NULL AND
6051           l_attr_value_to IS NOT NULL) THEN
6052         l_comp_operator := 'BETWEEN';
6053       ELSIF (l_attr_value_from IS NOT NULL) THEN
6054         l_comp_operator := '=';
6055       END IF;
6056 
6057       l_group := 1;
6058 
6059       l_count := p_qp_pricing_attrib_tbl.COUNT+1;
6060 
6061       p_qp_pricing_attrib_tbl(l_count).PROCESS_ID                  := FTE_RATE_CHART_PKG.G_Process_Id;
6062       p_qp_pricing_attrib_tbl(l_count).PRODUCT_ATTRIBUTE           := l_product_attribute;
6063       p_qp_pricing_attrib_tbl(l_count).PRODUCT_ATTR_VALUE          := l_item;
6064       p_qp_pricing_attrib_tbl(l_count).PRODUCT_UOM_CODE            := FTE_RATE_CHART_PKG.G_Product_UOM;
6065       p_qp_pricing_attrib_tbl(l_count).PRICING_ATTRIBUTE           := l_pricing_attribute;
6066       p_qp_pricing_attrib_tbl(l_count).PRICING_ATTR_VALUE_FROM     := fnd_number.number_to_canonical(l_attr_value_from);
6067       p_qp_pricing_attrib_tbl(l_count).PRICING_ATTR_VALUE_TO       := fnd_number.number_to_canonical(l_attr_value_to);
6068       p_qp_pricing_attrib_tbl(l_count).ATTRIBUTE_GROUPING_NO       := l_group;
6069       p_qp_pricing_attrib_tbl(l_count).LIST_LINE_NO                := l_linenum;
6070 
6071       p_qp_pricing_attrib_tbl(l_count).PROCESS_TYPE                := 'SSH';
6072       p_qp_pricing_attrib_tbl(l_count).INTERFACE_ACTION_CODE       := 'C';
6073       p_qp_pricing_attrib_tbl(l_count).EXCLUDER_FLAG               := 'N';
6074       p_qp_pricing_attrib_tbl(l_count).PRODUCT_ATTRIBUTE_CONTEXT   := 'ITEM';
6075       p_qp_pricing_attrib_tbl(l_count).PRODUCT_ATTRIBUTE_DATATYPE  := 'C';
6076       p_qp_pricing_attrib_tbl(l_count).PRICING_ATTRIBUTE_DATATYPE  := 'N';
6077       p_qp_pricing_attrib_tbl(l_count).PRICING_ATTRIBUTE_CONTEXT   := l_context;
6078       p_qp_pricing_attrib_tbl(l_count).COMPARISON_OPERATOR_CODE    := l_comp_operator;
6079 
6080     END IF;
6081 
6082     FTE_RATE_CHART_PKG.g_chart_type := l_chart_type;
6083 
6084     FTE_UTIL_PKG.Exit_Debug(l_module_name);
6085   EXCEPTION
6086     WHEN OTHERS THEN
6087       x_error_msg := sqlerrm;
6088       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
6089                			  p_msg   		=> x_error_msg,
6090              			  p_category    	=> 'O',
6091 	        		  p_line_number		=> p_line_number);
6092       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
6093       x_status := 2;
6094   END VALIDATE_RATE_BREAK;
6095 
6096   -----------------------------------------------------------------------------
6097   -- PROCEDURE: VALIDATE_RATING_ATTRIBUTE
6098   --
6099   -- Purpose: Validate the data corresponding to this pricing attribute, and
6100   --          store the data in temporary tables for later insertion into
6101   --          QP_INTERFACE_PRICING_ATTRIBS.
6102   --
6103   -- IN Parameters
6104   --    1. p_values: 		pl/sql table for rating attribute line
6105   --	2. p_line_number:	line number
6106   --
6107   -- Out Parameters
6108   --	1. p_qp_pricing_attrib_tbl:	pl/sql table for the attributes
6109   --	2. x_status:		status of the processing, -1 means no error
6110   --	3. x_error_msg:		error message if any.
6111   -----------------------------------------------------------------------------
6112   PROCEDURE VALIDATE_RATING_ATTRIBUTE(p_values     	IN    		FTE_BULKLOAD_PKG.data_values_tbl,
6113 				      p_line_number	IN		NUMBER,
6114 				      p_qp_pricing_attrib_tbl	IN OUT	NOCOPY FTE_RATE_CHART_PKG.qp_pricing_attrib_tbl,
6115 	                      	      x_status     	OUT NOCOPY  	NUMBER,
6116                                       x_error_msg  	OUT NOCOPY  	VARCHAR2) IS
6117 
6118   l_intAction       VARCHAR2(30);
6119 
6120   l_description     VARCHAR2(100);
6121   l_carrier_code    VARCHAR2(100);
6122   l_carrier_name    VARCHAR2(100);
6123   l_list_header_id  NUMBER;
6124   l_comp_operator   VARCHAR2(30);
6125 
6126   l_delimiter                 VARCHAR2(30);
6127   l_action         	      VARCHAR2(20);
6128   l_linenum                   VARCHAR2(20);
6129   l_pricing_attribute         VARCHAR2(50);
6130   l_pricing_attr_value_from   VARCHAR2(50);
6131   l_pricing_attr_value_to     VARCHAR2(50);
6132   l_region_id                 NUMBER;
6133   l_context                   VARCHAR2(30) := 'LOGISTICS';
6134 
6135   l_catg_id             NUMBER;
6136   l_attr_code           VARCHAR2(50);
6137 
6138   l_zone_id             NUMBER;
6139   l_chart_type		VARCHAR2(50) := FTE_RATE_CHART_PKG.g_chart_type;
6140 
6141   l_module_name      CONSTANT VARCHAR2(100) := 'fte.plsql.' || G_PKG_NAME || '.VALIDATE_RATING_ATTRIBUTE';
6142 
6143   BEGIN
6144     FTE_UTIL_PKG.ENTER_Debug(l_module_name);
6145 
6146     l_list_header_id := -1;
6147     x_status         := -1;
6148 
6149     l_action                  := FTE_UTIL_PKG.GET_DATA('ACTION', p_values);
6150     l_linenum                 := FTE_UTIL_PKG.GET_DATA('LINE_NUMBER', p_values);
6151     l_pricing_attribute       := FTE_UTIL_PKG.GET_DATA('ATTRIBUTE', p_values);
6152     l_pricing_attr_value_from := FTE_UTIL_PKG.GET_DATA('ATTRIBUTE_VALUE', p_values);
6153     l_pricing_attr_value_to   := FTE_UTIL_PKG.GET_DATA('ATTRIBUTE_VALUE_TO', p_values);
6154     l_context                 := FTE_UTIL_PKG.GET_DATA('CONTEXT', p_values);
6155     l_comp_operator           := FTE_UTIL_PKG.GET_DATA('COMPARISON_OPERATOR', p_values);
6156 
6157     IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
6158       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Action', l_action);
6159       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Attribute', l_pricing_attribute);
6160       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Attribute value', l_pricing_attr_value_from );
6161       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Attribute value to', l_pricing_attr_value_to );
6162       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Context', l_context);
6163       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Comparison operator', l_comp_operator);
6164       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Line number', p_line_number);
6165     END IF;
6166 
6167     l_region_id := -1;
6168 
6169     VALIDATE_ACTION(p_action		=> l_action,
6170 		    p_type		=> 'RATING_ATTRIBUTE',
6171 		    p_line_number 	=> p_line_number,
6172 		    x_status		=> x_status,
6173 		    x_error_msg		=> x_error_msg);
6174 
6175     IF (x_status <> -1) THEN
6176       FTE_UTIL_PKG.Exit_Debug(l_module_name);
6177       return;
6178     END IF;
6179 
6180     IF (l_linenum IS NULL) THEN
6181       x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_LINE_NUMBER_MISSING');
6182       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name		=> l_module_name,
6183                    		  p_msg 		=> x_error_msg,
6184                    		  p_category		=> 'A',
6185 				  p_line_number		=> p_line_number);
6186       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
6187       x_status := 2;
6188       RETURN;
6189     ELSIF (isNum(l_linenum) = 0) THEN
6190       x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_NUMBER_INVALID');
6191       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
6192                    		  p_msg  		=> x_error_msg,
6193                    		  p_category		=> 'D',
6194 				  p_line_number		=> p_line_number);
6195       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
6196       x_status := 2;
6197       RETURN;
6198     END IF;
6199 
6200     IF (l_context IS NULL) THEN
6201       l_context := 'LOGISTICS';
6202     END IF;
6203 
6204     IF (l_pricing_attribute IS NULL) THEN
6205       x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_ATTRIBUTE_MISSING');
6206       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name		=> l_module_name,
6207                    		  p_msg 		=> x_error_msg,
6208                    		  p_category		=> 'A',
6209 				  p_line_number		=> p_line_number);
6210       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
6211       x_status := 2;
6212       RETURN;
6213     ELSIF l_pricing_attribute NOT IN ('COMMODITY'           ,'COMMODITY_TYPE',
6214 			              'CONTAINER_TYPE',
6215                                       'SERVICE_LEVEL'       ,'HAZARD_CODE',
6216                                       'TL_RATE_BASIS'       ,'TL_DISTANCE_TYPE',
6217                                       'TL_RATE_TYPE'        ,'TL_EQUIPMENT_TYPE',
6218                                       'ITEM_QUANTITY'       ,'ITEM_AMOUNT',
6219                                       'TL_NUM_STOPS'        ,'TL_VEHICLE_TYPE',
6220                                       'TL_DEADHEAD_RT_VAR',  'TL_WEEKEND_LAYOVER_MILEAGE',
6221                                       'TL_PICKUP_WT'        ,'TL_PICKUP_VOL',
6222                                       'TL_PICKUP_PALLET'    ,'TL_PICKUP_CONTAINER',
6223                                       'TL_DROPOFF_WT'       ,'TL_DROPOFF_VOL',
6224                                       'TL_DROPOFF_PALLET'   ,'TL_DROPOFF_CONTAINER',
6225                                       'TL_HANDLING_VOL'     ,'TL_HANDLING_WT',
6226                                       'TL_STOP_UNLOADING_ACT', 'TL_STOP_LOADING_ACT',
6227                                       'TL_HANDLING_ACT',
6228                                       'FAC_PICKUP_WT'        ,'FAC_PICKUP_VOL',
6229                                       'FAC_PICKUP_PALLET'    ,'FAC_PICKUP_CONTAINER',
6230                                       'FAC_DROPOFF_WT'       ,'FAC_DROPOFF_VOL',
6231                                       'FAC_DROPOFF_PALLET'   ,'FAC_DROPOFF_CONTAINER',
6232                                       'FAC_HANDLING_VOL'     ,'FAC_HANDLING_WT',
6233                                       'FAC_HANDLING_CONTAINER', 'FAC_HANDLING_PALLET',
6234                                       'TL_NUM_WEEKDAY_LAYOVERS' ,'TL_CHARGED_OUT_RT_DISTANCE',
6235                                       'TL_CM_DISCOUNT_FLG', 'LOADING_PROTOCOL',
6236                                       'FREIGHT_CLASS'       ,'PARCEL_MULTIPIECE_FLAG',
6237                                       'ORIGIN_CITY'         ,'ORIGIN_STATE',
6238                                       'ORIGIN_COUNTRY'      ,'ORIGIN_POSTAL_CODE_FROM',
6239                                       'ORIGIN_ZONE'         ,'ORIGIN_POSTAL_CODE_TO',
6240                                       'ORIGIN_ZONE_ID'      ,'DESTINATION_ZONE_ID',
6241                                       'DESTINATION_COUNTRY' ,'DESTINATION_STATE',
6242                                       'DESTINATION_CITY'    ,'DESTINATION_POSTAL_CODE_FROM',
6243                                       'DESTINATION_ZONE'    ,'DESTINATION_POSTAL_CODE_TO') THEN
6244 
6245       x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_ATTRIBUTE_INVALID');
6246       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name		=> l_module_name,
6247                    		  p_msg 		=> x_error_msg,
6248                    		  p_category		=> 'D',
6249 				  p_line_number		=> p_line_number);
6250       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
6251       x_status := 2;
6252       RETURN;
6253     ELSIF (l_pricing_attr_value_from IS NULL) THEN
6254       --'tl_modifiers' have several attributes that don't require values.
6255       IF (l_chart_type NOT IN ('TL_MODIFIER', 'FAC_MODIFIER', 'MIN_MODIFIER')) THEN
6256         x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_ATTR_VALUE_MISSING');
6257         FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name	=> l_module_name,
6258                    		  p_msg 		=> x_error_msg,
6259                    		  p_category		=> 'A',
6260 				  p_line_number		=> p_line_number);
6261         FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
6262         x_status := 2;
6263         RETURN;
6264       END IF;
6265     END IF;
6266 
6267     --In the case of Origins and Destinations, we have to make sure we have all the information
6268     --for the origin or destination before we insert the origin/destination ID into the table.
6269     --Therefore we have to store each line with [ORIGIN/DESTINATION]_[COUNTRY/STATE/CITY] in
6270     --G_region_info until we are sure we have all the information.
6271     IF (SUBSTR(l_pricing_attribute, 1, 6) = 'ORIGIN' AND
6272       l_pricing_attribute NOT IN ('ORIGIN_ZONE', 'ORIGIN_ZONE_ID')) THEN --(1)
6273 
6274       IF (FTE_RATE_CHART_PKG.g_region_flag IS NULL) THEN
6275         FTE_RATE_CHART_PKG.Reset_Region_Info;
6276       ELSIF (FTE_RATE_CHART_PKG.g_region_flag = 'DESTINATION' OR FTE_RATE_CHART_PKG.g_region_linenum <> l_linenum) THEN
6277         l_region_id := FTE_REGION_ZONE_LOADER.GET_REGION_ID(p_region_info	=> FTE_RATE_CHART_PKG.G_region_info);
6278 
6279         IF (l_region_id IS NOT NULL OR l_region_id <> -1) THEN
6280           ADD_ATTRIBUTE(p_pricing_attribute  => FTE_RATE_CHART_PKG.g_region_flag||'_ZONE',
6281                         p_attr_value_from    => l_region_id,
6282                         p_attr_value_to      => NULL,
6283                         p_line_number        => FTE_RATE_CHART_PKG.g_region_linenum,
6284                         p_context            => l_context,
6285                         p_comp_operator      => NULL,
6286 			p_qp_pricing_attrib_tbl => p_qp_pricing_attrib_tbl,
6287                         x_status             => x_status,
6288 			x_error_msg	     => x_error_msg);
6289         ELSE
6290           x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_REGION_UNKNOWN',
6291 					      p_tokens		=> STRINGARRAY('REGION_NAME'),
6292 					      p_values		=> STRINGARRAY(FTE_RATE_CHART_PKG.g_region_info.country ||' '||
6293 								       FTE_RATE_CHART_PKG.g_region_info.state ||' '||
6294 								       FTE_RATE_CHART_PKG.g_region_info.city));
6295           FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name	=> l_module_name,
6296                    		      p_msg	 	=> x_error_msg,
6297                    		      p_category	=> 'D',
6298 				      p_line_number	=> p_line_number);
6299 
6300           FTE_RATE_CHART_PKG.Reset_Region_Info;
6301           FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
6302           x_status := 2;
6303           RETURN;
6304         END IF;
6305         FTE_RATE_CHART_PKG.Reset_Region_Info;
6306       END IF;
6307 
6308       IF (l_pricing_attribute = 'ORIGIN_COUNTRY') THEN
6309         FTE_RATE_CHART_PKG.G_region_info.country := l_pricing_attr_value_from;
6310       ELSIF (l_pricing_attribute = 'ORIGIN_STATE') THEN
6311         FTE_RATE_CHART_PKG.G_region_info.state := l_pricing_attr_value_from;
6312       ELSIF (l_pricing_attribute = 'ORIGIN_CITY') THEN
6313         FTE_RATE_CHART_PKG.G_region_info.city := l_pricing_attr_value_from;
6314       ELSIF (l_pricing_attribute = 'ORIGIN_POSTAL_CODE_FROM') THEN
6315         FTE_RATE_CHART_PKG.G_region_info.postal_code_from := l_pricing_attr_value_from;
6316       ELSIF (l_pricing_attribute = 'ORIGIN_POSTAL_CODE_TO') THEN
6317         FTE_RATE_CHART_PKG.G_region_info.postal_code_to := l_pricing_attr_value_from;
6318       END IF;
6319       FTE_RATE_CHART_PKG.g_region_flag := 'ORIGIN';
6320       FTE_RATE_CHART_PKG.g_region_linenum := l_linenum;
6321 
6322     ELSIF (substr(l_pricing_attribute,1,11) = 'DESTINATION' AND
6323       l_pricing_attribute NOT IN ('DESTINATION_ZONE', 'DESTINATION_ZONE_ID')) THEN --(1)
6324 
6325       IF (FTE_RATE_CHART_PKG.g_region_flag IS NULL) THEN  -- start of New DESTINATION
6326         FTE_RATE_CHART_PKG.Reset_Region_Info;
6327       ELSIF (FTE_RATE_CHART_PKG.g_region_flag = 'ORIGIN' OR FTE_RATE_CHART_PKG.g_region_linenum <> l_linenum) THEN
6328 
6329 	l_region_id := FTE_REGION_ZONE_LOADER.GET_REGION_ID(p_region_info	=> FTE_RATE_CHART_PKG.G_region_info);
6330 
6331         IF (l_region_id IS NOT NULL OR l_region_id <> -1) THEN
6332           ADD_ATTRIBUTE(p_pricing_attribute  => FTE_RATE_CHART_PKG.g_region_flag||'_ZONE',
6333                         p_attr_value_from    => l_region_id,
6334                         p_attr_value_to      => NULL,
6335                         p_line_number        => FTE_RATE_CHART_PKG.g_region_linenum,
6336                         p_context            => l_context,
6337                         p_comp_operator      => NULL,
6338 			p_qp_pricing_attrib_tbl => p_qp_pricing_attrib_tbl,
6339                         x_status             => x_status,
6340 			x_error_msg	     => x_error_msg);
6341         ELSE
6342           x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_REGION_UNKNOWN',
6343 					      p_tokens		=> STRINGARRAY('REGION_NAME'),
6344 					      p_values		=> STRINGARRAY(FTE_RATE_CHART_PKG.g_region_info.country ||' '||
6345 								       FTE_RATE_CHART_PKG.g_region_info.state ||' '||
6346 								       FTE_RATE_CHART_PKG.g_region_info.city));
6347           FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name	=> l_module_name,
6348                    		      p_msg	 	=> x_error_msg,
6349                    		      p_category	=> 'D',
6350 				      p_line_number	=> p_line_number);
6351 
6352           FTE_RATE_CHART_PKG.Reset_Region_Info;
6353           FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
6354           x_status := 2;
6355           RETURN;
6356         END IF;
6357         FTE_RATE_CHART_PKG.Reset_Region_Info;
6358       END IF;
6359 
6360       IF (l_pricing_attribute = 'DESTINATION_COUNTRY') THEN
6361         FTE_RATE_CHART_PKG.G_region_info.country := l_pricing_attr_value_from;
6362       ELSIF (l_pricing_attribute = 'DESTINATION_STATE') THEN
6363         FTE_RATE_CHART_PKG.G_region_info.state := l_pricing_attr_value_from;
6364       ELSIF (l_pricing_attribute = 'DESTINATION_CITY') THEN
6365         FTE_RATE_CHART_PKG.G_region_info.city := l_pricing_attr_value_from;
6366       ELSIF (l_pricing_attribute = 'DESTINATION_POSTAL_CODE_FROM') THEN
6367         FTE_RATE_CHART_PKG.G_region_info.postal_code_from := l_pricing_attr_value_from;
6368       ELSIF (l_pricing_attribute = 'DESTINATION_POSTAL_CODE_TO') THEN
6369         FTE_RATE_CHART_PKG.G_region_info.postal_code_to := l_pricing_attr_value_from;
6370       END IF;
6371 
6372       FTE_RATE_CHART_PKG.g_region_flag := 'DESTINATION';
6373       FTE_RATE_CHART_PKG.g_region_linenum := l_linenum;
6374       FTE_RATE_CHART_PKG.g_region_context := l_context;
6375     ELSE --(1)
6376       IF (l_pricing_attribute IN ('ORIGIN_ZONE', 'DESTINATION_ZONE')) THEN --(2)
6377 
6378         -- get ZONE_ID from ZONE_NAME
6379         l_zone_id := FTE_REGION_ZONE_LOADER.GET_ZONE_ID(l_pricing_attr_value_from);
6380 
6381         IF (l_zone_id <> -1 OR l_zone_id IS NOT NULL) THEN
6382           l_pricing_attr_value_from := l_zone_id;
6383         ELSE
6384           x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_ZONE_UNKNOWN',
6385 					      p_tokens		=> STRINGARRAY('ZONE'),
6386 					      p_values		=> STRINGARRAY(l_pricing_attr_value_from));
6387           FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name	=> l_module_name,
6388                    		      p_msg	 	=> x_error_msg,
6389                    		      p_category	=> 'D',
6390 				      p_line_number	=> p_line_number);
6391 
6392           FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
6393           x_status := 2;
6394           RETURN;
6395         END IF;
6396       ELSIF (l_pricing_attribute = 'ORIGIN_ZONE_ID') THEN
6397         l_pricing_attribute := 'ORIGIN_ZONE';
6398       ELSIF (l_pricing_attribute = 'DESTINATION_ZONE_ID') THEN
6399         l_pricing_attribute := 'DESTINATION_ZONE';
6400       ELSIF (l_pricing_attribute = 'TOTAL_SHIPMENT_QUANTITY') THEN
6401         l_pricing_attr_value_to := '9999999999';
6402       ELSIF (l_pricing_attribute =  'SERVICE_LEVEL') THEN
6403         l_attr_code := Validate_Service_Level (p_carrier_id		=> NULL,
6404                             		       p_carrier_name		=> NULL,
6405                             		       p_service_level 		=> l_pricing_attr_value_from,
6406                             		       p_line_number		=> p_line_number,
6407                   			       x_status 		=> x_status,
6408                             		       x_error_msg 		=> x_error_msg);
6409 
6410         IF (x_status <> -1) THEN
6411           FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
6412           RETURN;
6413         END IF;
6414 
6415         l_pricing_attribute := 'SERVICE_TYPE';
6416 
6417         IF (l_attr_code IS NOT NULL) THEN
6418           l_pricing_attr_value_from := l_attr_code;
6419         END IF;
6420       ELSIF (l_pricing_attribute =  'CONTAINER_TYPE') THEN --(2)
6421 
6422         l_pricing_attribute := 'CONTAINER_TYPE';
6423         l_attr_code := FTE_UTIL_PKG.Get_Lookup_Code('CONTAINER_TYPE', l_pricing_attr_value_from);
6424 
6425         IF (l_attr_code IS NOT NULL) THEN
6426           l_pricing_attr_value_from := l_attr_code;
6427         ELSE
6428           x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_CONTAINER_UNKNOWN',
6429 					      p_tokens		=> STRINGARRAY('CONTAINER'),
6430 					      p_values		=> STRINGARRAY(l_pricing_attr_value_from));
6431           FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name	=> l_module_name,
6432                    		      p_msg	 	=> x_error_msg,
6433                    		      p_category	=> 'D',
6434 				      p_line_number	=> p_line_number);
6435 
6436           FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
6437           x_status := 2;
6438           RETURN;
6439         END IF;
6440 
6441       ELSIF (SUBSTR(l_pricing_attribute,1,9) =  'COMMODITY') THEN  --(2)
6442         FTE_UTIL_PKG.GET_CATEGORY_ID(p_commodity_value => l_pricing_attr_value_from,
6443                           	      x_catg_id         => l_pricing_attr_value_from,
6444 				      x_status		=> x_status,
6445 				      x_error_msg	=> x_error_msg);
6446 
6447         IF (l_pricing_attr_value_from IS NULL) THEN
6448           l_pricing_attr_value_from := FTE_UTIL_PKG.GET_DATA('ATTRIBUTE_VALUE', p_values);
6449           x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_COMMODITY_UNKNOWN',
6450 				      p_tokens		=> STRINGARRAY('COMM'),
6451 				      p_values		=> STRINGARRAY(l_pricing_attr_value_from));
6452  	  FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name	=> l_module_name,
6453                    		      p_msg	 	=> x_error_msg,
6454                    		      p_category	=> 'D',
6455 				      p_line_number	=> p_line_number);
6456 
6457           FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
6458           x_status := 2;
6459           RETURN;
6460         END IF;
6461       ELSIF (l_pricing_attribute = 'TL_VEHICLE_TYPE') THEN
6462         l_pricing_attribute     := 'VEHICLE';
6463         l_pricing_attr_value_from := FTE_UTIL_PKG.Get_Vehicle_Type(p_vehicle_type => l_pricing_attr_value_from);
6464 
6465         IF (l_pricing_attr_value_from IS NULL) THEN
6466 
6467           l_pricing_attr_value_from := FTE_UTIL_PKG.GET_DATA('ATTRIBUTE_VALUE', p_values);
6468 
6469           x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_VEHICLE_NAME_INVALID',
6470 				  	      p_tokens		=> STRINGARRAY('NAME'),
6471 					      p_values		=> STRINGARRAY(l_pricing_attr_value_from));
6472  	  FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name	=> l_module_name,
6473 	                  	      p_msg	   	=> x_error_msg,
6474                    		      p_category	=> 'D',
6475 				      p_line_number	=> p_line_number);
6476 
6477           FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
6478           x_status := 2;
6479           RETURN;
6480         END IF;
6481       ELSIF (l_pricing_attribute = 'TL_NUM_STOPS') THEN
6482         l_pricing_attr_value_from := NULL;
6483       END IF; --end --(2)
6484 
6485       IF (FTE_RATE_CHART_PKG.g_region_flag IS NOT NULL) THEN
6486         -- Insert previous ORIGIN or DESTINATION Region Attribute
6487         l_region_id := FTE_REGION_ZONE_LOADER.GET_REGION_ID(p_region_info => FTE_RATE_CHART_PKG.G_region_info);
6488 
6489         IF (l_region_id IS NOT NULL OR l_region_id <> -1) THEN
6490           ADD_ATTRIBUTE(p_pricing_attribute  => FTE_RATE_CHART_PKG.g_region_flag ||'_ZONE',
6491                         p_attr_value_from    => l_region_id,
6492                         p_attr_value_to      => NULL,
6493                         p_line_number        => FTE_RATE_CHART_PKG.g_region_linenum,
6494                         p_context            => l_context,
6495                         p_comp_operator      => NULL,
6496 			p_qp_pricing_attrib_tbl => p_qp_pricing_attrib_tbl,
6497                         x_status             => x_status,
6498 			x_error_msg	     => x_error_msg);
6499         ELSE
6500           x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_REGION_UNKNOWN',
6501 					      p_tokens		=> STRINGARRAY('REGION_NAME'),
6502 					      p_values		=> STRINGARRAY(FTE_RATE_CHART_PKG.g_region_info.country ||' '||
6503 								       FTE_RATE_CHART_PKG.g_region_info.state ||' '||
6504 								       FTE_RATE_CHART_PKG.g_region_info.city));
6505           FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name	=> l_module_name,
6506                    		      p_msg	 	=> x_error_msg,
6507                    		      p_category	=> 'D',
6508 				      p_line_number	=> p_line_number);
6509 
6510           FTE_RATE_CHART_PKG.Reset_Region_Info;
6511           FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
6512           x_status := 2;
6513           RETURN;
6514         END IF;
6515       END IF;
6516 
6517       -- Insert Current Attribute
6518       IF (l_linenum <> FTE_RATE_CHART_PKG.g_line_number) THEN
6519         x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_PRC_ATTR_WRONG_LINE',
6520 					    p_tokens		=> STRINGARRAY('VALUE'),
6521 					    p_values		=> STRINGARRAY(l_pricing_attr_value_from));
6522  	FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name	=> l_module_name,
6523                    		    p_msg 		=> x_error_msg,
6524                    		    p_category		=> 'D',
6525 				    p_line_number	=> p_line_number);
6526 
6527         FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
6528         x_status := 2;
6529         RETURN;
6530       END IF;
6531 
6532       ADD_ATTRIBUTE(p_pricing_attribute  => l_pricing_attribute,
6533                     p_attr_value_from    => l_pricing_attr_value_from,
6534                     p_attr_value_to      => l_pricing_attr_value_to,
6535                     p_line_number        => l_linenum,
6536                     p_context            => l_context,
6537                     p_comp_operator      => l_comp_operator,
6538 		    p_qp_pricing_attrib_tbl => p_qp_pricing_attrib_tbl,
6539                     x_status             => x_status,
6540 		    x_error_msg		 => x_error_msg);
6541 
6542       FTE_RATE_CHART_PKG.g_region_flag := NULL;
6543       FTE_RATE_CHART_PKG.Reset_Region_Info;
6544     END IF; --end --(1)
6545     FTE_RATE_CHART_PKG.g_chart_type := l_chart_type;
6546 
6547     FTE_UTIL_PKG.Exit_Debug(l_module_name);
6548   EXCEPTION
6549     WHEN OTHERS THEN
6550       x_error_msg := sqlerrm;
6551       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
6552                			  p_msg   		=> x_error_msg,
6553              			  p_category    	=> 'O',
6554 	        		  p_line_number		=> p_line_number);
6555       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
6556       x_status := 2;
6557   END VALIDATE_RATING_ATTRIBUTE;
6558 
6559   -----------------------------------------------------------------------------
6560   -- PROCEDURE: VALIDATE_ADJUSTED_RATE_CHART
6561   --
6562   -- Purpose: Validate the data corresponding to this Qualifier, and
6563   --          store the data in temporary tables for later insertion into
6564   --          QP_INTERFACE_QUALIFIERS.
6565   --
6566   -- IN Parameters
6567   --    1. p_values: 		pl/sql table for adjusted rate chart line
6568   --	2. p_line_number:	line number
6569   --	3. p_carrier_id:	carrier id from the header
6570   --
6571   -- Out Parameters
6572   --	1. p_qp_qualifier_tbl:	pl/sql table for the attributes
6573   --	2. x_status:		status of the processing, -1 means no error
6574   --	3. x_error_msg:		error message if any.
6575   -----------------------------------------------------------------------------
6576   PROCEDURE VALIDATE_ADJUSTED_RATE_CHART(p_values     	IN    		FTE_BULKLOAD_PKG.data_values_tbl,
6577 					 p_line_number	IN		NUMBER,
6578 					 p_carrier_id	IN		NUMBER,
6579 			       		 p_qp_qualifier_tbl	IN OUT	NOCOPY FTE_RATE_CHART_PKG.qp_qualifier_tbl,
6580 	                       		 x_status     	OUT NOCOPY  	NUMBER,
6581                                		 x_error_msg  	OUT NOCOPY  	VARCHAR2) IS
6582 
6583   l_action                 VARCHAR2(30);
6584   l_name                   VARCHAR2(50);
6585   l_derived_qualifier      VARCHAR2(30);
6586   l_qualifier_attr         VARCHAR2(30);
6587   l_qualifier_context      VARCHAR2(30);
6588   l_qualifier_group        NUMBER;
6589   l_carrier_id             NUMBER;
6590   l_list_header_id         NUMBER;
6591   l_tariff		   VARCHAR2(60);
6592   l_list_header_ids	   Wsh_Util_Core.Id_Tab_Type;
6593   l_valid_carrier	   BOOLEAN;
6594   l_module_name   CONSTANT VARCHAR2(100) := 'fte.plsql.' || G_PKG_NAME || '.VALIDATE_ADJUSTED_RATE_CHART';
6595   l_temp		   VARCHAR2(50);
6596   l_count		   NUMBER;
6597   l_chart_type		   VARCHAR2(50) := FTE_RATE_CHART_PKG.g_chart_type;
6598 
6599   BEGIN
6600     FTE_UTIL_PKG.ENTER_Debug(l_module_name);
6601     x_status           := -1;
6602     l_qualifier_group  := 1;
6603 
6604     l_action := FTE_UTIL_PKG.GET_DATA('ACTION', p_values);
6605     l_name   := FTE_UTIL_PKG.GET_DATA('RATE_CHART_NAME', p_values);
6606     l_tariff := FTE_UTIL_PKG.GET_DATA('TARIFF_NAME', p_values);
6607 
6608     IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
6609       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Action', l_action);
6610       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Rate Chart name', l_name);
6611       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Tariff Name', l_tariff);
6612       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Line number', p_line_number);
6613     END IF;
6614 
6615     VALIDATE_ACTION(p_action		=> l_action,
6616 		    p_type		=> 'ADJUSTED_RATE_CHART',
6617 		    p_line_number 	=> p_line_number,
6618 		    x_status		=> x_status,
6619 		    x_error_msg		=> x_error_msg);
6620 
6621     IF (x_status <> -1) THEN
6622       FTE_UTIL_PKG.Exit_Debug(l_module_name);
6623       return;
6624     END IF;
6625 
6626     IF (l_name IS NOT NULL AND l_tariff IS NOT NULL) THEN
6627       x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_BOTH_RC_TARIFF');
6628       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name		=> l_module_name,
6629                    		  p_msg 		=> x_error_msg,
6630                    		  p_category		=> 'D',
6631 				  p_line_number		=> p_line_number);
6632       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
6633       x_status := 2;
6634       RETURN;
6635 
6636     ELSIF (l_name IS NULL AND l_tariff IS NULL) THEN
6637       x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_NEITHER_RC_TARIFF');
6638       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name		=> l_module_name,
6639                    		  p_msg 		=> x_error_msg,
6640                    		  p_category		=> 'D',
6641 				  p_line_number		=> p_line_number);
6642       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
6643       x_status := 2;
6644       RETURN;
6645     END IF;
6646 
6647     --Facility Modifiers don't need a carrier.
6648     IF (l_chart_type <> 'FAC_MODIFIER') THEN
6649       l_carrier_id := p_carrier_id;
6650       IF (l_carrier_id IS NULL) THEN
6651         x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_CARRIER_MISSING');
6652         FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name	=> l_module_name,
6653                    		    p_msg 		=> x_error_msg,
6654                    		    p_category		=> 'A',
6655 				    p_line_number	=> p_line_number);
6656         FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
6657         x_status := 2;
6658         RETURN;
6659       END IF;
6660     END IF;
6661 
6662     IF (l_chart_type IN ('FTE_MODIFIER', 'FAC_MODIFIER')) THEN
6663       l_derived_qualifier    := 'PRICE_LIST';
6664       l_qualifier_attr       := 'PRICE_LIST';
6665       l_qualifier_context    := 'MODLIST';
6666     END IF;
6667 
6668     IF (l_name IS NOT NULL) THEN
6669       l_list_header_id := FTE_RATE_CHART_PKG.Get_Pricelist_Id(p_name 	   => l_name,
6670                                                		      p_carrier_id => l_carrier_id,
6671 					       		      p_attribute1 => l_temp);
6672 
6673       IF (l_list_header_id = -1) THEN
6674         x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_PRICELIST_INVALID',
6675 					    p_tokens		=> STRINGARRAY('NAME'),
6676 					    p_values		=> STRINGARRAY(l_name));
6677         FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
6678                    		    p_msg 		=> x_error_msg,
6679                    		    p_category		=> 'C',
6680 				    p_line_number	=> p_line_number);
6681 
6682         x_status := 2;
6683         FTE_UTIL_PKG.Exit_Debug(l_module_name);
6684         RETURN;
6685 
6686       ELSE
6687 	l_list_header_ids(1) := l_list_header_id;
6688       END IF;
6689 
6690     ELSE --l_tariff IS NOT NULL
6691 --check these procedures in LTL
6692       l_valid_carrier := FTE_LTL_LOADER.Verify_Tariff_Carrier(l_tariff, l_carrier_id, x_error_msg);
6693       IF (l_valid_carrier) THEN
6694 	l_list_header_ids := FTE_LTL_LOADER.Get_Tariff_Ratecharts(p_tariff_name => l_tariff,
6695 			                                          x_error_msg => x_error_msg);
6696       ELSE
6697         x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_TARIFF_NOT_ASSOC',
6698 					    p_tokens		=> STRINGARRAY('TARIFF', 'CARRIER'),
6699 					    p_values		=> STRINGARRAY(l_tariff, FTE_UTIL_PKG.GET_CARRIER_NAME(l_carrier_id)));
6700         FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name	=> l_module_name,
6701                    		    p_msg 		=> x_error_msg,
6702                    		    p_category		=> 'A',
6703 				    p_line_number	=> p_line_number);
6704         FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
6705         x_status := 2;
6706         RETURN;
6707 --          x_error_msg := 'Carrier specified does not associated with the Tariff ' || l_tariff;
6708       END IF;
6709     END IF;
6710 
6711     IF (l_list_header_ids IS NULL OR l_list_header_ids.COUNT <= 0) THEN
6712 --error?
6713       x_status := 2;
6714       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name        => l_module_name,
6715                                     p_msg               => x_error_msg,
6716                                     p_category          => 'A',
6717                                     p_line_number       => p_line_number);
6718 
6719       FTE_UTIL_PKG.Exit_Debug(l_module_name);
6720       return;
6721     END IF;
6722 
6723     -- -------------------------------------------------------------
6724     -- Add the qualifier
6725     -- -------------------------------------------------------------
6726 
6727     IF (l_action = 'ADD'
6728         AND l_chart_type in ('FTE_MODIFIER', 'FAC_MODIFIER')) THEN
6729       FOR i IN 1..l_list_header_ids.COUNT LOOP
6730         --Store the Qualifier
6731         FTE_RATE_CHART_PKG.g_qualifier_group := FTE_RATE_CHART_PKG.g_qualifier_group + 1;
6732 
6733 	l_count := p_qp_qualifier_tbl.COUNT+1;
6734 
6735         p_qp_qualifier_tbl(l_count).PROCESS_ID            := FTE_RATE_CHART_PKG.G_Process_Id;
6736         p_qp_qualifier_tbl(l_count).INTERFACE_ACTION_CODE       := 'C';
6737         p_qp_qualifier_tbl(l_count).QUALIFIER_CONTEXT     := l_qualifier_context;
6738         p_qp_qualifier_tbl(l_count).QUALIFIER_ATTRIBUTE        := l_qualifier_attr;
6739         p_qp_qualifier_tbl(l_count).QUALIFIER_ATTR_VALUE  := l_list_header_ids(i);
6740         p_qp_qualifier_tbl(l_count).QUALIFIER_GROUPING_NO := FTE_RATE_CHART_PKG.g_qualifier_group;
6741       END LOOP;
6742     END IF;
6743 
6744     FTE_RATE_CHART_PKG.g_chart_type := l_chart_type;
6745 
6746     FTE_UTIL_PKG.Exit_Debug(l_module_name);
6747 
6748   EXCEPTION
6749     WHEN OTHERS THEN
6750       x_error_msg := sqlerrm;
6751       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
6752                			  p_msg   		=> x_error_msg,
6753              			  p_category    	=> 'O',
6754 	        		  p_line_number		=> p_line_number);
6755       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
6756       x_status := 2;
6757   END VALIDATE_ADJUSTED_RATE_CHART;
6758 
6759 
6760   -----------------------------------------------------------------------------
6761   -- PROCEDURE: VALIDATE_QUALIFIER
6762   --
6763   -- Purpose: Add a qualifier to the qp_interface_qualifiers table for the
6764   --          a rate chart.
6765   --
6766   -- IN Parameters
6767   --    1. p_values: 		pl/sql table for the qualifier line
6768   --	2. p_line_number:	line number
6769   --
6770   -- Out Parameters
6771   --	1. p_qp_qualifier_tbl:	pl/sql table for the attributes
6772   --	2. x_status:		status of the processing, -1 means no error
6773   --	3. x_error_msg:		error message if any.
6774   -----------------------------------------------------------------------------
6775   PROCEDURE VALIDATE_QUALIFIER(p_values     	IN    		FTE_BULKLOAD_PKG.data_values_tbl,
6776 			       p_line_number	IN		NUMBER,
6777 			       p_qp_qualifier_tbl	IN OUT	NOCOPY FTE_RATE_CHART_PKG.qp_qualifier_tbl,
6778 	                       x_status     	OUT NOCOPY  	NUMBER,
6779                                x_error_msg  	OUT NOCOPY  	VARCHAR2) IS
6780 
6781   l_action            VARCHAR2(30);
6782   l_qual_attr         VARCHAR2(30);
6783   l_qual_context      VARCHAR2(30);
6784   l_qual_attr_value   VARCHAR2(30);
6785   l_qual_group        NUMBER;
6786   l_process_id        NUMBER;
6787   l_list_header_id    NUMBER;
6788 
6789   l_module_name   CONSTANT VARCHAR2(100) := 'fte.plsql.' || G_PKG_NAME || '.VALIDATE_QUALIFIER';
6790   l_count		NUMBER;
6791 
6792   BEGIN
6793     FTE_UTIL_PKG.ENTER_Debug(l_module_name);
6794     x_status           := -1;
6795 
6796     l_action          := FTE_UTIL_PKG.GET_DATA('ACTION'          , p_values);
6797     l_process_id      := FTE_UTIL_PKG.GET_DATA('PROCESS_ID'      , p_values);
6798     l_qual_attr       := FTE_UTIL_PKG.GET_DATA('ATTRIBUTE'       , p_values);
6799     l_qual_attr_value := FTE_UTIL_PKG.GET_DATA('VALUE'           , p_values);
6800     l_qual_context    := FTE_UTIL_PKG.GET_DATA('CONTEXT'         , p_values);
6801     l_qual_group      := FTE_UTIL_PKG.GET_DATA('GROUP'           , p_values);
6802 
6803     IF (l_qual_group IS NULL) THEN
6804       l_qual_group := 1;
6805     END IF;
6806 
6807     IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
6808       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Action', l_action);
6809       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Process ID', l_process_id);
6810       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Attribute', l_qual_attr);
6811       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Attribute Value', l_qual_attr_value);
6812       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Context', l_qual_context);
6813       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Group', l_qual_group);
6814       FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'Line number', p_line_number);
6815     END IF;
6816 
6817     VALIDATE_ACTION(p_action		=> l_action,
6818 		    p_type		=> 'QUALIFIER',
6819 		    p_line_number 	=> p_line_number,
6820 		    x_status		=> x_status,
6821 		    x_error_msg		=> x_error_msg);
6822 
6823     IF (x_status <> -1) THEN
6824       FTE_UTIL_PKG.Exit_Debug(l_module_name);
6825       return;
6826     END IF;
6827 
6828     IF (l_qual_context IS NULL) THEN
6829       x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_QUAL_CONTEXT_MISSING');
6830       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name		=> l_module_name,
6831                    		  p_msg 		=> x_error_msg,
6832                    		  p_category		=> 'A',
6833 				  p_line_number		=> p_line_number);
6834       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
6835       x_status := 2;
6836       RETURN;
6837     END IF;
6838 
6839     IF (l_qual_attr IS NULL) THEN
6840       x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_QUAL_ATTR_MISSING');
6841       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name		=> l_module_name,
6842                    		  p_msg 		=> x_error_msg,
6843                    		  p_category		=> 'A',
6844 				  p_line_number		=> p_line_number);
6845       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
6846       x_status := 2;
6847       RETURN;
6848     END IF;
6849 
6850     IF (l_qual_attr_value IS NULL) THEN
6851       x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_QUAL_ATTR_VALUE_MISSING');
6852       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name		=> l_module_name,
6853                    		  p_msg			=> x_error_msg,
6854                    		  p_category		=> 'A',
6855 				  p_line_number		=> p_line_number);
6856       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
6857       x_status := 2;
6858       RETURN;
6859     END IF;
6860 
6861     l_count := p_qp_qualifier_tbl.COUNT+1;
6862 
6863     p_qp_qualifier_tbl(l_count).PROCESS_ID            := l_process_id;
6864     p_qp_qualifier_tbl(l_count).INTERFACE_ACTION_CODE := 'C';
6865     p_qp_qualifier_tbl(l_count).QUALIFIER_ATTRIBUTE   := l_qual_attr;
6866     p_qp_qualifier_tbl(l_count).QUALIFIER_ATTR_VALUE  := l_qual_attr_value;
6867     p_qp_qualifier_tbl(l_count).QUALIFIER_CONTEXT     := l_qual_context;
6868     p_qp_qualifier_tbl(l_count).QUALIFIER_GROUPING_NO := l_qual_group;
6869 
6870     FTE_UTIL_PKG.Exit_Debug(l_module_name);
6871   EXCEPTION
6872     WHEN OTHERS THEN
6873       x_error_msg := sqlerrm;
6874       FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
6875                			  p_msg   		=> x_error_msg,
6876              			  p_category    	=> 'O',
6877 	        		  p_line_number		=> p_line_number);
6878       FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
6879       x_status := 2;
6880   END VALIDATE_QUALIFIER;
6881 
6882 
6883     ----------------------------------------------------------------------------
6884     -- PROCEDURE: VALIDATE_TL_SERVICE
6885     --
6886     -- Purpose: does validation for a line in tl service block
6887     --
6888     -- IN parameters:
6889     --  1. FTE_UTIL_PKG.GET_DATA:        FTE_BULKLOAD_PKG.data_values_tbl
6890     --  2. p_line_number: line number of current line
6891     --
6892     -- OUT parameters:
6893     --  1. p_type:      type value of the line
6894     --  2. p_action:        action value of the line
6895     --  3. x_status:        status of the processing, -1 means no error
6896     --  4. x_error_msg:     error message if any.
6897     ----------------------------------------------------------------------------
6898     PROCEDURE VALIDATE_TL_SERVICE(p_values              IN          FTE_BULKLOAD_PKG.data_values_tbl,
6899                                   p_line_number         IN          NUMBER,
6900                                   p_type                OUT NOCOPY  VARCHAR2,
6901                                   p_action              OUT NOCOPY  VARCHAR2,
6902                                   p_lane_tbl            IN  OUT NOCOPY    FTE_LANE_PKG.lane_tbl,
6903                                   p_lane_service_tbl    IN  OUT NOCOPY    FTE_LANE_PKG.lane_service_tbl,
6904                                   p_lane_rate_chart_tbl IN  OUT NOCOPY    FTE_LANE_PKG.lane_rate_chart_tbl,
6905                                   x_status              OUT NOCOPY  NUMBER,
6906                                   x_error_msg           OUT NOCOPY  VARCHAR2) IS
6907 
6908     l_effect_date       VARCHAR2(30);
6909     l_expiry_date       VARCHAR2(30);
6910     l_temp_number       VARCHAR2(60);
6911     l_count             NUMBER := 0;
6912     l_carrier_id        NUMBER := -1;
6913     l_rate_chart_id     NUMBER := -1;
6914     l_old_lane_id       NUMBER := -1;
6915     l_lane_number       VARCHAR2(200);
6916     l_carrier_name      VARCHAR2(200);
6917     l_rate_chart_name   VARCHAR2(200);
6918     l_editable_flag     VARCHAR2(1) := 'Y';
6919     l_service_level     VARCHAR2(50);
6920     l_convert_date      DATE;
6921     l_region_info       WSH_REGIONS_SEARCH_PKG.REGION_REC;
6922     l_mode_code         VARCHAR2(20);
6923     l_mode              CONSTANT VARCHAR2(20) := 'TRUCK';
6924     l_rate_chart_view_flag    VARCHAR2(1) := 'Y';
6925 
6926     l_lane_id           NUMBER;
6927     l_apply_hold        BOOLEAN;
6928 
6929     l_zone_id           NUMBER;
6930 
6931     l_lane_rate_chart_data     FTE_BULKLOAD_PKG.data_values_tbl;
6932     l_lane_service_level_data  FTE_BULKLOAD_PKG.data_values_tbl;
6933 
6934     l_region_id         WSH_REGIONS.REGION_ID%TYPE;
6935 
6936     g_debug_on BOOLEAN := TRUE;
6937 
6938     l_module_name CONSTANT VARCHAR2(60) := 'FTE.PLSQL.' || g_pkg_name || '.VALIDATE_TL_SERVICE';
6939 
6940     BEGIN
6941 
6942         FTE_UTIL_PKG.Enter_Debug(l_module_name);
6943         x_status := -1;
6944 
6945         p_action := FTE_UTIL_PKG.GET_DATA('ACTION',p_values);
6946 
6947         IF (g_debug_on) THEN
6948             FTE_UTIL_PKG.Write_LogFile(l_module_name,'p_action', p_action);
6949         END IF;
6950 
6951         VALIDATE_ACTION(p_action      => p_action,
6952                         p_type        => 'TL_SERVICE',
6953                         p_line_number => p_line_number,
6954                         x_status      => x_status,
6955                         x_error_msg   => x_error_msg);
6956 
6957         IF (x_status <> -1) THEN
6958             FTE_UTIL_PKG.Exit_Debug(l_module_name);
6959             RETURN;
6960         END IF;
6961 
6962         l_count := p_lane_tbl.COUNT + 1;
6963         p_lane_tbl(l_count).action := p_action;
6964 
6965         l_lane_number     := FTE_UTIL_PKG.GET_DATA('SERVICE_NUMBER',p_values);
6966         l_carrier_name    := FTE_UTIL_PKG.GET_DATA('CARRIER_NAME',p_values);
6967         l_rate_chart_name := FTE_UTIL_PKG.GET_DATA('RATE_CHART_NAME',p_values);
6968         l_effect_date     := FTE_UTIL_PKG.GET_DATA('SERVICE_START_DATE',p_values);
6969         l_expiry_date     := FTE_UTIL_PKG.GET_DATA('SERVICE_END_DATE',p_values);
6970         l_service_level   := FTE_UTIL_PKG.GET_DATA('SERVICE_LEVEL',p_values);
6971 
6972         IF (g_debug_on) THEN
6973             FTE_UTIL_PKG.Write_LogFile(l_module_name,'l_lane_number    ', l_lane_number);
6974             FTE_UTIL_PKG.Write_LogFile(l_module_name,'l_carrier_name   ', l_carrier_name);
6975             FTE_UTIL_PKG.Write_LogFile(l_module_name,'l_rate_chart_name', l_rate_chart_name);
6976             FTE_UTIL_PKG.Write_LogFile(l_module_name,'l_effect_date    ', l_effect_date);
6977             FTE_UTIL_PKG.Write_LogFile(l_module_name,'l_expiry_date    ', l_expiry_date);
6978             FTE_UTIL_PKG.Write_LogFile(l_module_name,'l_service_level  ', l_service_level);
6979         END IF;
6980 
6981         VALIDATE_CARRIER(p_carrier_name => l_carrier_name,
6982                          p_line_number  => p_line_number,
6983                          p_carrier_id   => l_carrier_id,
6984                          x_status       => x_status,
6985                          x_error_msg    => x_error_msg);
6986 
6987 	IF (g_debug_on) THEN
6988             FTE_UTIL_PKG.Write_LogFile(l_module_name,'l_carrier_id', l_carrier_id);
6989         END IF;
6990 
6991 	IF (x_status <> -1) THEN
6992             FTE_UTIL_PKG.Exit_Debug(l_module_name);
6993             RETURN;
6994         END IF;
6995 
6996         --+
6997 	-- Store the carrier id
6998         --+
6999         p_lane_tbl(l_count).carrier_id := l_carrier_id;
7000 
7001         IF (l_lane_number IS NULL) THEN
7002             x_status := 2;
7003             x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_LANE_NUMBER_MISSING');
7004 	    FTE_UTIL_PKG.Write_OutFile(p_msg  => x_error_msg,
7005                                         p_category  => 'A',
7006                                         p_module_name => l_module_name,
7007                                         p_line_number => p_line_number);
7008             FTE_UTIL_PKG.Exit_Debug(l_module_name);
7009             RETURN;
7010 
7011 	ELSE
7012 	    --+
7013             -- Get the lane id.
7014             -- Lane ID is -1 if this is new service, a +ve number otherwise.
7015             --+
7016 	    l_old_lane_id := FTE_LANE_PKG.GET_LANE_ID(l_lane_number, l_carrier_id);
7017 
7018 	    IF(g_debug_on) THEN
7019 	        FTE_UTIL_PKG.Write_LogFile(l_module_name,'l_old_lane_id ',l_old_lane_id);
7020             END IF;
7021 
7022 	END IF;
7023 
7024 	IF (p_action = 'UPDATE') THEN
7025 
7026                 IF (l_old_lane_id = -1) THEN
7027 	            x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_LANE_NUMBER_INVALID');
7028                     FTE_UTIL_PKG.Write_OutFile(p_msg     => x_error_msg,
7029                                                 p_category     => 'A',
7030                                                 p_module_name  => l_module_name,
7031                                                 p_line_number  => p_line_number);
7032                     FTE_UTIL_PKG.Exit_Debug(l_module_name);
7033                     RETURN;
7034                 END IF;
7035 
7036 		p_lane_tbl(l_count).lane_id := l_old_lane_id;
7037 		p_lane_tbl(l_count).lane_number := l_lane_number;
7038 
7039         ELSIF (p_action = 'DELETE') THEN
7040 
7041             IF (l_old_lane_id = -1) THEN
7042 	        x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_LANE_NUMBER_INVALID');
7043                 FTE_UTIL_PKG.Write_OutFile(p_msg  => x_error_msg,
7044                                             p_category  => 'C',
7045                                             p_module_name => l_module_name,
7046                                             p_line_number => p_line_number); -- TODO add tokens
7047                 FTE_UTIL_PKG.Exit_Debug(l_module_name);
7048                 RETURN;
7049             END IF;
7050 
7051             p_lane_tbl(l_count).lane_id := l_old_lane_id;
7052 	    FTE_UTIL_PKG.Exit_Debug(l_module_name);
7053             RETURN;
7054 
7055         ELSIF (p_action = 'ADD') THEN
7056 
7057             IF (l_old_lane_id <> -1) THEN
7058                 x_status := 2;
7059 	        x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_LANE_REF_EXISTS');
7060                 FTE_UTIL_PKG.Write_OutFile(p_msg    => x_error_msg,
7061                                             p_category    => 'D',
7062                                             p_module_name => l_module_name,
7063                                             p_line_number => p_line_number); -- TODO add tokens SERVICE_NUMBER
7064                 FTE_UTIL_PKG.Exit_Debug(l_module_name);
7065                 RETURN;
7066 
7067             ELSE
7068                 --+
7069                 -- Get a new Lane Id from the suquence "fte_lanes_s" for the new lane
7070                 --+
7071 	        p_lane_tbl(l_count).lane_id     := FTE_LANE_PKG.GET_NEXT_LANE_ID;
7072                 p_lane_tbl(l_count).lane_number := l_lane_number;
7073 
7074             END IF;
7075 
7076             --+
7077             -- validate Origin, Destination, Mode only for ADD
7078             --+
7079 
7080 	    --+
7081             -- set origin and  destination
7082             --+
7083 
7084             l_region_info.city     := FTE_UTIL_PKG.GET_DATA('ORIGIN_CITY',p_values);
7085             l_region_info.state    := FTE_UTIL_PKG.GET_DATA('ORIGIN_STATE',p_values);
7086             l_region_info.country  := FTE_UTIL_PKG.GET_DATA('ORIGIN_COUNTRY',p_values);
7087             l_region_info.postal_code_from := FTE_UTIL_PKG.GET_DATA('ORIGIN_POSTAL_CODE_FROM',p_values);
7088             l_region_info.postal_code_to   := FTE_UTIL_PKG.GET_DATA('ORIGIN_POSTAL_CODE_TO',p_values);
7089             l_region_info.zone     := FTE_UTIL_PKG.GET_DATA('ORIGIN_ZONE',p_values);
7090 
7091             IF (l_region_info.country IS NULL AND l_region_info.zone IS NOT NULL) THEN
7092 
7093                 l_zone_id := FTE_REGION_ZONE_LOADER.GET_ZONE_ID(l_region_info.zone);
7094 
7095 		IF (l_zone_id <> -1 OR l_zone_id IS NOT NULL) THEN
7096                     p_lane_tbl(l_count).origin_id := l_zone_id;
7097 		ELSE
7098 		   x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_LANE_ORIGIN_MISSING');
7099 
7100 	           FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
7101                          		      p_msg		=> x_error_msg,
7102                    		              p_category	=> 'A',
7103 				              p_line_number	=> p_line_number);
7104 
7105                    FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
7106                    x_status := 2;
7107                    RETURN;
7108                 END IF;
7109 
7110             ELSIF (l_region_info.country IS NOT NULL) THEN
7111 
7112 	       l_region_id := FTE_REGION_ZONE_LOADER.GET_REGION_ID(p_region_info  => l_region_info);
7113 
7114 	       IF (l_region_id IS NULL OR l_region_id = -1) THEN
7115   	          x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_REGION_UNKNOWN',
7116 						      p_tokens	=> STRINGARRAY('REGION_NAME'),
7117 						      p_values	=> STRINGARRAY(l_region_info.country ||' '||
7118 								       l_region_info.state ||' '||
7119 								       l_region_info.city));
7120 		  FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name	=> l_module_name,
7121 					      p_msg	 	=> x_error_msg,
7122 					      p_category	=> 'D',
7123 					      p_line_number	=> p_line_number);
7124 
7125 		  FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
7126 		  x_status := 2;
7127 		  RETURN;
7128                END IF;
7129 
7130   	       --inserting the region in wsh_zone_regions
7131     	       IF (FTE_REGION_ZONE_LOADER.INSERT_PARTY_REGION(p_region_id        => l_region_id,
7132 				  p_parent_region_id => l_region_id,
7133 				  p_supplier_id      => -1,
7134 				  p_validate_flag    => TRUE,
7135 				  p_postal_code_from => l_region_info.postal_code_from,
7136 				  p_postal_code_to   => l_region_info.postal_code_to) = -1) THEN
7137                  FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
7138                  x_status := 2;
7139                  RETURN;
7140                END IF;
7141 
7142                p_lane_tbl(l_count).origin_id := l_region_id;
7143 
7144 	    ELSE
7145 	        x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_LOAD_ORIGIN_MISSING');
7146 	        FTE_UTIL_PKG.Write_OutFile(p_msg    => x_error_msg,
7147                                             p_category    => 'D',
7148                                             p_module_name => l_module_name,
7149                                             p_line_number => p_line_number); -- TODO add tokens
7150                 FTE_UTIL_PKG.Exit_Debug(l_module_name);
7151                 RETURN;
7152 
7153             END IF;
7154 
7155             l_region_info.city     := FTE_UTIL_PKG.GET_DATA('DESTINATION_CITY',p_values);
7156             l_region_info.state    := FTE_UTIL_PKG.GET_DATA('DESTINATION_STATE',p_values);
7157             l_region_info.country  := FTE_UTIL_PKG.GET_DATA('DESTINATION_COUNTRY',p_values);
7158             l_region_info.postal_code_from := FTE_UTIL_PKG.GET_DATA('DESTINATION_POSTAL_CODE_FROM',p_values);
7159             l_region_info.postal_code_to   := FTE_UTIL_PKG.GET_DATA('DESTINATION_POSTAL_CODE_TO',p_values);
7160             l_region_info.zone     := FTE_UTIL_PKG.GET_DATA('DESTINATION_ZONE',p_values);
7161 
7162             IF (l_region_info.country IS NULL AND l_region_info.zone IS NOT NULL) THEN
7163 
7164                 l_zone_id := FTE_REGION_ZONE_LOADER.GET_ZONE_ID(l_region_info.zone);
7165 
7166 	        IF (l_zone_id <> -1 OR l_zone_id IS NOT NULL) THEN
7167                     p_lane_tbl(l_count).destination_id := l_zone_id;
7168 		ELSE
7169 		   x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_LANE_ORIGIN_MISSING');
7170 
7171 	           FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
7172                          		      p_msg		=> x_error_msg,
7173                    		              p_category	=> 'A',
7174 				              p_line_number	=> p_line_number);
7175 
7176                    FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
7177                    x_status := 2;
7178                    RETURN;
7179                 END IF;
7180 
7181             ELSIF (l_region_info.country IS NOT NULL) THEN
7182 
7183 	        l_region_id := FTE_REGION_ZONE_LOADER.GET_REGION_ID(p_region_info  => l_region_info);
7184 
7185 		IF (l_region_id IS NULL OR l_region_id = -1) THEN
7186   	          x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_REGION_UNKNOWN',
7187 						      p_tokens	=> STRINGARRAY('REGION_NAME'),
7188 						      p_values	=> STRINGARRAY(l_region_info.country ||' '||
7189 								       l_region_info.state ||' '||
7190 								       l_region_info.city));
7191 		  FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name	=> l_module_name,
7192 					      p_msg	 	=> x_error_msg,
7193 					      p_category	=> 'D',
7194 					      p_line_number	=> p_line_number);
7195 
7196 		  FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
7197 		  x_status := 2;
7198 		  RETURN;
7199                 END IF;
7200 
7201   	       --inserting the region in wsh_zone_regions
7202     	       IF (FTE_REGION_ZONE_LOADER.INSERT_PARTY_REGION(p_region_id        => l_region_id,
7203 				  p_parent_region_id => l_region_id,
7204 				  p_supplier_id      => -1,
7205 				  p_validate_flag    => TRUE,
7206 				  p_postal_code_from => l_region_info.postal_code_from,
7207 				  p_postal_code_to   => l_region_info.postal_code_to) = -1) THEN
7208                  FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
7209                  x_status := 2;
7210                  RETURN;
7211                END IF;
7212 
7213                 p_lane_tbl(l_count).destination_id := l_region_id;
7214 
7215 	    ELSE
7216   	        x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_LOAD_DESTINATION_MISSING');
7217 	        FTE_UTIL_PKG.Write_OutFile(p_msg    => x_error_msg,
7218                                             p_category    => 'D',
7219                                             p_module_name => l_module_name,
7220                                             p_line_number => p_line_number); -- TODO add tokens
7221                 FTE_UTIL_PKG.Exit_Debug(l_module_name);
7222                 RETURN;
7223 
7224             END IF;
7225 
7226             IF (g_debug_on) THEN
7227                 FTE_UTIL_PKG.Write_LogFile(l_module_name, 'origin ID     ',p_lane_tbl(l_count).origin_id);
7228                 FTE_UTIL_PKG.Write_LogFile(l_module_name, 'destination ID',  p_lane_tbl(l_count).destination_id);
7229             END IF;
7230 
7231             VALIDATE_MODE_OF_TRANS(p_mode         => l_mode,
7232                                    p_line_number  => p_line_number,
7233                                    p_carrier_id   => l_carrier_id,
7234                                    p_mode_code    => l_mode_code,
7235                                    x_status       => x_status,
7236                                    x_error_msg    => x_error_msg);
7237 
7238             IF(x_status <> -1) THEN
7239                 FTE_UTIL_PKG.Exit_Debug(l_module_name);
7240                 RETURN;
7241             END IF;
7242 
7243             p_lane_tbl(l_count).mode_of_transportation_code := l_mode_code;
7244 
7245         END IF;
7246 
7247         --+
7248         -- Validation for EFFECTIVE_DATE
7249         --+
7250 
7251         VALIDATE_DATE(p_date => l_effect_date,
7252 		      p_line_number => p_line_number,
7253 		      x_status => x_status,
7254 		      x_error_msg => x_error_msg);
7255 
7256         IF (x_status <> -1) THEN
7257           FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
7258           RETURN;
7259         END IF;
7260 
7261  	p_lane_tbl(l_count).effective_date := l_effect_date;
7262 
7263         -- Validation for EXPIRY_DATE
7264 
7265         VALIDATE_DATE(p_date => l_expiry_date,
7266 		      p_line_number => p_line_number,
7267 		      x_status => x_status,
7268 		      x_error_msg => x_error_msg);
7269 
7270         IF (x_status <> -1) THEN
7271           FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
7272           RETURN;
7273         END IF;
7274 
7275         p_lane_tbl(l_count).expiry_date := l_expiry_date;
7276 
7277         IF (l_rate_chart_view_flag IS NOT NULL) THEN
7278             p_lane_tbl(l_count).pricelist_view_flag := l_rate_chart_view_flag;
7279         END IF;
7280 
7281         IF (p_action = 'ADD')  THEN  -- ADD
7282 
7283             IF(l_editable_flag IS NULL) THEN
7284                 p_lane_tbl(l_count).editable_flag := 'Y';
7285 	    ELSE
7286  	        p_lane_tbl(l_count).editable_flag := l_editable_flag;
7287             END IF;
7288 
7289 	    --+
7290             -- DO WE NEED TO SET THESE FALGS. ASK PM.
7291 	    -- p_lane_tbl(l_count).owner_id := -1;
7292 	    -- p_lane_tbl(l_count).SCHEDULES_FLAG := 'N'
7293 	    -- p_lane_tbl(l_count).COMMODITY_DETAIL_FLAG := 'N';
7294 	    -- p_lane_tbl(l_count).SERVICE_DETAIL_FLAG := 'N';
7295             --+
7296 
7297 	   IF (l_rate_chart_name IS NULL) THEN
7298     	       x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_LOAD_RC_NAME_MISSING');
7299 	       FTE_UTIL_PKG.WRITE_OUTFILE(p_msg  	 => x_error_msg,
7300                     		           p_category	 => 'C',
7301 					   p_module_name => l_module_name,
7302 				           p_line_number => p_line_number);
7303                FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
7304                x_status := 1;
7305 	       RETURN;
7306 
7307 	   END IF;
7308 
7309 	   l_lane_rate_chart_data('ACTION') := 'ADD';
7310            l_lane_rate_chart_data('RATE_CHART_NAME') := l_rate_chart_name;
7311 
7312            --+
7313            -- Though we know p_action has the value 'ADD' at this point,
7314            -- I have put the literal 'ADD' for readability.
7315            --+
7316            VALIDATE_LANE_RATE_CHART(p_values              => l_lane_rate_chart_data,
7317                                     p_line_number         => p_line_number,
7318                                     p_action              => 'ADD',
7319                                     p_lane_tbl            => p_lane_tbl,
7320                                     p_lane_rate_chart_tbl => p_lane_rate_chart_tbl,
7321 			            p_set_error           => FALSE,
7322                                     x_status              => x_status,
7323                                     x_error_msg           => x_error_msg);
7324 
7325 	   IF (x_status <> -1) THEN
7326 
7327 	       IF (g_debug_on) THEN
7328 		   FTE_UTIL_PKG.Write_LogFile(l_module_name, 'VALIDATE_LANE_RATE_CHART returned with status',x_status);
7329 	       END IF;
7330 
7331                FTE_UTIL_PKG.Exit_Debug(l_module_name);
7332 	       RETURN;
7333 
7334 	   ELSE
7335 	       p_lane_tbl(l_count).LANE_TYPE := 'HOLD_' || l_rate_chart_name;
7336 	   END IF;
7337 
7338            l_lane_service_level_data('ACTION') := 'ADD';
7339            l_lane_service_level_data('TYPE') := 'SERVICE_LEVEL';
7340            l_lane_service_level_data('SERVICE_LEVEL') := l_service_level;
7341 
7342            VALIDATE_LANE_SERVICE_LEVEL(p_values          => l_lane_service_level_data,
7343                                        p_line_number     => p_line_number,
7344                                        p_type            => 'SERVICE_LEVEL',
7345                                        p_action          => 'ADD',
7346                                        p_lane_tbl        => p_lane_tbl,
7347                                        p_lane_service_tbl=> p_lane_service_tbl,
7348                                        x_status          => x_status,
7349                                        x_error_msg       => x_error_msg);
7350         END IF;
7351 
7352         FTE_UTIL_PKG.Exit_Debug(l_module_name);
7353     EXCEPTION
7354         WHEN OTHERS THEN
7355             x_status := 2;
7356             x_error_msg := sqlerrm;
7357             FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
7358                			  p_msg   		=> x_error_msg,
7359              			  p_category    	=> 'O',
7360 	        		  p_line_number		=> p_line_number);
7361             FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
7362 
7363     END VALIDATE_TL_SERVICE;
7364 
7365     --_______________________________________________________________________________________--
7366     --
7367     -- PROCEDURE VALIDATE_ZONE
7368     --
7369     -- Purpose: does validation for one line in zone block
7370     --
7371     -- IN parameters:
7372     --  1. p_columns:   STRINGARRAY of the column names
7373     --  2. p_values:    STRINGARRAY of the line values
7374     --  3. p_line_number: line number of current line
7375     --  4. p_region_type: region type for the zone (10, 11 etc)
7376     --
7377     -- OUT parameters:
7378     --  1. p_action:    action value of the line
7379     --  2. p_zone_name: zone name value of the line
7380     --  3. p_country:   country value of the line
7381     --  4. p_zone_id:   zone id, not -1 if zone exists
7382     --  5. p_region_rec: record to store region info
7383     --  6. p_region_id: region id, not -1 if already exists
7384     --  7. x_status:    status of the processing, -1 means no error
7385     --  8. x_error_msg: error message if any.
7386     --_______________________________________________________________________________________--
7387 
7388     PROCEDURE VALIDATE_ZONE(p_values            IN          FTE_BULKLOAD_PKG.data_values_tbl,
7389                             p_line_number       IN          NUMBER,
7390                             p_region_type       IN          VARCHAR2,
7391                             p_action            OUT NOCOPY  VARCHAR2,
7392                             p_zone_name         OUT NOCOPY  VARCHAR2,
7393                             p_country           OUT NOCOPY  VARCHAR2,
7394                             p_zone_id           OUT NOCOPY  NUMBER,
7395                             p_region_rec        OUT NOCOPY  WSH_REGIONS_SEARCH_PKG.region_rec,
7396                             p_region_id         OUT NOCOPY  NUMBER,
7397                             x_status            OUT NOCOPY  NUMBER,
7398                             x_error_msg         OUT NOCOPY  VARCHAR2) IS
7399 
7400     l_module_name       CONSTANT VARCHAR2(100) := 'FTE.PLSQL.' || G_PKG_NAME || '.VALIDATE_ZONE';
7401 
7402     BEGIN
7403         FTE_UTIL_PKG.Enter_Debug(l_module_name);
7404         x_status := -1;
7405 
7406         p_action    := p_values('ACTION');
7407         p_zone_name := p_values('ZONE_NAME');
7408         p_country   := p_values('COUNTRY');
7409 
7410         IF (g_debug_on) THEN
7411           FTE_UTIL_PKG.Write_LogFile(l_module_name, 'Action', p_action);
7412           FTE_UTIL_PKG.Write_LogFile(l_module_name, 'Zone Name', p_zone_name);
7413           FTE_UTIL_PKG.Write_LogFile(l_module_name, 'Country', p_country);
7414         END IF;
7415 
7416         IF (p_region_type IS NOT NULL AND p_region_type = '10') THEN
7417 
7418             VALIDATE_ACTION(p_action        => p_action,
7419                             p_type          => 'ZONE',
7420                             p_line_number   => p_line_number,
7421                             x_status        => x_status,
7422                             x_error_msg     => x_error_msg);
7423 
7424             IF (x_status <> -1) THEN
7425                 FTE_UTIL_PKG.Exit_Debug(l_module_name);
7426                 RETURN;
7427             END IF;
7428 
7429             IF (p_zone_name IS NULL) THEN
7430                 FTE_UTIL_PKG.Write_OutFile('FTE_CAT_ZONE_NAME_MISSING', 'A', p_line_number);
7431                 FTE_UTIL_PKG.Exit_Debug(l_module_name);
7432                 RETURN;
7433             END IF;
7434 
7435             IF (p_country IS NULL) THEN
7436                 FTE_UTIL_PKG.Write_OutFile('FTE_CAT_COUNTRY_REQUIRED', 'A', p_line_number);
7437                 FTE_UTIL_PKG.Exit_Debug(l_module_name);
7438                 RETURN;
7439             END IF;
7440 
7441         END IF;
7442 
7443         p_zone_id := FTE_REGION_ZONE_LOADER.GET_ZONE_ID(p_zone_name);
7444 
7445         --+
7446         -- Zone without any region is not allowed
7447         -- So, create the Zone only when the region is valid
7448         --+
7449         p_region_rec.region_id        := -1;
7450         p_region_rec.zone_level       := -1;
7451         p_region_rec.country          := p_values('COUNTRY');
7452         p_region_rec.state            := p_values('STATE');
7453         p_region_rec.city             := p_values('CITY');
7454         p_region_rec.postal_code_from := p_values('POSTAL_CODE_FROM');
7455         p_region_rec.postal_code_to   := p_values('POSTAL_CODE_TO');
7456 
7457         p_region_id := FTE_REGION_ZONE_LOADER.GET_REGION_ID(p_region_rec, 'Y');
7458 
7459         --+
7460         -- No such region, cannot add zone
7461         --+
7462         IF (p_region_id IS NULL OR p_region_id = -1) THEN
7463 	    x_status := 2;
7464   	    x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name   => 'FTE_CAT_REGION_UNKNOWN',
7465 					        p_tokens => STRINGARRAY('REGION_NAME'),
7466 					        p_values => STRINGARRAY(p_region_rec.country ||' '||
7467 								        p_region_rec.state ||' '||
7468 								        p_region_rec.city));
7469             FTE_UTIL_PKG.Write_OutFile(p_module_name 	=> l_module_name,
7470 				       p_msg		=> x_error_msg,
7471 				       p_category	=> 'C',
7472 				       p_line_number	=> p_line_number);
7473             FTE_UTIL_PKG.Exit_Debug(l_module_name);
7474             RETURN;
7475         END IF;
7476 
7477         FTE_UTIL_PKG.Exit_Debug(l_module_name);
7478 
7479     EXCEPTION
7480         WHEN OTHERS THEN
7481             x_status := 2;
7482             x_error_msg := sqlerrm;
7483             FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name 	=> l_module_name,
7484                			  p_msg   		=> x_error_msg,
7485              			  p_category    	=> 'O',
7486 	        		  p_line_number		=> p_line_number);
7487             FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
7488 
7489     END VALIDATE_ZONE;
7490 
7491 END FTE_VALIDATION_PKG;