[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;