DBA Data[Home] [Help]

PACKAGE BODY: APPS.FTE_TL_LOADER

Source


1 PACKAGE BODY FTE_TL_LOADER AS
2 /* $Header: FTETLLRB.pls 120.13 2006/04/28 04:51:12 pkaliyam noship $ */
3     --================================================================================--
4     --
5     --  NAME: FTE_TL_LOADER ("TL" stands for TruckLoad)
6     --
7     --
8     --  PURPOSE : BulkLoading of TL Services, TL Base Rates, TL Surchages and
9     --            Facility charges.
10     --
11     --  PROCEDURES:  PROCESS_DATA                Entry point in the package
12     --               PROCESS_TL_SERVICES         To process TL Services
13     --               PROCESS_FACILITY_CHARGES    To process Facility Charges
14     --               PROCESS_TL_BASE_RATES       To process TL Rate Charts
15     --               PROCESS_TL_SURCHARGES       To process TL Accessorial Charges
16     --
17     -- CHANGE CONTROL LOG
18     --
19     -- DATE        VERSION  BY        BUG      DESCRIPTION
20     -- ----------  -------  --------  -------  ------------
21     -- Prabhakhar                              CREATED.
22     --=================================================================================--
23 
24 
25     -------------------------  GLOBAL Variables  Start -----------------------------------
26 
27     G_CURDATE               DATE := sysdate;
28     G_MAX_NUMBER            NUMBER := 9999999;
29     G_ACTION                VARCHAR2(30);
30 
31     G_LANE_TBL              FTE_LANE_PKG.lane_tbl;
32     G_LANE_RATE_CHART_TBL   FTE_LANE_PKG.lane_rate_chart_tbl;
33     G_LANE_SERVICE_TBL      FTE_LANE_PKG.lane_service_tbl;
34     G_LANE_COMMODITY_TBL    FTE_LANE_PKG.LANE_COMMODITY_TBL;
35 
36     G_DUMMY_BLOCK_HDR_TBL   FTE_BULKLOAD_PKG.block_header_tbl;
37 
38     G_PKG_NAME         CONSTANT  VARCHAR2(50) := 'FTE_TL_LOADER';
39 
40     -------------------------  GLOBAL Variables  END -----------------------------------
41 
42     --_________________________________________________________________________________--
43     --
44     -- FUNCTION:  GET_GLOBAL_UNIT_UOM
45     --
46     -- PURPOSE  Get the global unit uom from wsh_global_parameters table.
47     --
48     -- PARAMETERS
49     -- IN
50     --   NO PARAMETERS.
51     --
52     -- RETURNS,  GLOBAL_UNIT_UOM defined in Shipping parameters form, if setup.
53     --           NULL  otherwise.
54     --_________________________________________________________________________________--
55 
56     FUNCTION GET_GLOBAL_UNIT_UOM (x_status     OUT NOCOPY NUMBER,
57                                   x_error_msg  OUT NOCOPY VARCHAR2) RETURN VARCHAR2 IS
58 
59         l_unit_uom        VARCHAR2(10);
60         l_params          WSH_SHIPPING_PARAMS_PVT.GLOBAL_PARAMETERS_REC_TYP;
61         l_return_status   VARCHAR2(30);
62 
63         l_module_name     CONSTANT VARCHAR2(100) := 'FTE.PLSQL.' || G_PKG_NAME || '.GET_GLOBAL_UNIT_UOM';
64 
65     BEGIN
66 
67         FTE_UTIL_PKG.Enter_Debug(l_module_name);
68         x_status := -1;
69 
70         WSH_SHIPPING_PARAMS_PVT.GET_GLOBAL_PARAMETERS(l_params, l_return_status);
71 
72         IF (l_return_status NOT IN (WSH_UTIL_CORE.G_RET_STS_SUCCESS, WSH_UTIL_CORE.G_RET_STS_WARNING )) THEN
73             x_status := 2;
74             FTE_UTIL_PKG.Write_LogFile(l_module_name,'CALL TO WSH_SHIPPING_PARAMS_PVT.GET_GLOBAL_PARAMETERS RETURNED WITH STATUS', l_return_status);
75             FTE_UTIL_PKG.Exit_Debug(l_module_name);
76             RETURN NULL;
77         END IF;
78 
79         l_unit_uom := l_params.UOM_FOR_NUM_OF_UNITS;
80 
81         IF (l_unit_uom IS NULL) THEN
82             x_status := 2;
83             x_error_msg := FTE_UTIL_PKG.Get_Msg(p_name => 'FTE_GLOBAL_UNIT_UOM_NOT_DEFINE');
84 
85             FTE_UTIL_PKG.Write_OutFile(p_msg         => x_error_msg,
86                                        p_module_name => l_module_name,
87                                        p_category    => 'B',
88                                        p_line_number => 0);
89             FTE_UTIL_PKG.Exit_Debug(l_module_name);
90             RETURN NULL;
91         END IF;
92 
93         FTE_UTIL_PKG.Exit_Debug(l_module_name);
94 
95         RETURN l_unit_uom;
96 
97     EXCEPTION
98         WHEN OTHERS THEN
99             x_status := 2;
100             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'UNEXPECTED ERROR in GET_GLOBAL_UNIT_UOM', sqlerrm);
101             FTE_UTIL_PKG.Exit_Debug(l_module_name);
102     END GET_GLOBAL_UNIT_UOM;
103 
104     --_________________________________________________________________________________--
105     --
106     -- PROCEDURE:  GET_CARRIER_PREFERENCES
107     --
108     -- PURPOSE:   In Frieght Carriers form, we might have set the Carrier Preferences.
109     --            It queries up the preferences that have set in that
110     --            form for the carrier, p_carrier_name.
111     --
112     -- PARAMETERS:
113     --
114     --  IN
115     --    p_carrier_name,  the carrier name for which the preferences to be retrieved.
116     --    p_service_level, the service level of the carrier we are looking for.
117     --    p_line_number,   line number in the upload file, used for logging.
118     --
119     --  OUT
120     --    x_status,  the return status, -1 for success
121     --                                   2 for failure.
122     --    x_error_msg, the corresponding error message,
123     --                 if any exception occurs during the process.
124     --________________________________________________________________________________
125 
126     PROCEDURE GET_CARRIER_PREFERENCES ( p_carrier_name   IN      VARCHAR2,
127                                         p_service_level  IN      VARCHAR2,
128                                         p_line_number    IN      NUMBER,
129                                         x_status         OUT NOCOPY  NUMBER,
130                                         x_error_msg      OUT NOCOPY  VARCHAR2) IS
131 
132         l_volume_uom             VARCHAR2(3);
133         l_weight_uom             VARCHAR2(3);
134 
135         l_mode_of_trans CONSTANT VARCHAR2(25)  := 'TRUCK';
136 
137         l_module_name   CONSTANT VARCHAR2(100) := 'FTE.PLSQL.' || G_PKG_NAME || '.GET_CARRIER_PREFERENCES';
138 
139     BEGIN
140 
141         FTE_UTIL_PKG.Enter_Debug(l_module_name);
142         x_status := -1;
143 
144         IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
145             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'Getting Carrier Preferences for ' || p_carrier_name);
146         END IF;
147 
148         -- Unit rate basis for WEIGHT/VOLUME/CONTAINER/PALLET
149         IF (g_carrier_name <> p_carrier_name OR
150             g_service_level <> p_service_level OR
151             g_carrier_id IS NULL OR
152             g_carrier_unit_basis IS NULL OR
153             g_carrier_unit_basis_uom IS NULL) THEN
154 
155             BEGIN
156                 SELECT
157                   ca.carrier_id,
158                   ca.currency_code,
159                   nvl(cs.unit_rate_basis, ca.unit_rate_basis) unit_rate_basis,
160                   ca.time_uom,
161                   ca.distance_uom,
162                   ca.weight_uom,
163                   ca.volume_uom
164                 INTO
165                   g_carrier_id,
166                   g_carrier_currency,
167                   g_carrier_unit_basis,
168                   g_carrier_time_uom,
169                   g_carrier_distance_uom,
170                   l_weight_uom,
171                   l_volume_uom
172                 FROM
173                   WSH_CARRIER_SERVICES cs,
174                   WSH_CARRIERS ca,
175                   HZ_PARTIES hz
176                 WHERE
177                   cs.carrier_id(+) = ca.carrier_id AND
178                   cs.service_level(+) = p_service_level AND
179                   cs.mode_of_transport = l_mode_of_trans AND
180                   hz.party_name = p_carrier_name AND
181                   hz.party_id = ca.carrier_id;
182             EXCEPTION
183                 WHEN NO_DATA_FOUND THEN
184                     x_status := 2;
185                     x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name   => 'FTE_SEL_INVALID_CARRIER',
186                                                         p_tokens => STRINGARRAY('NAME'),
187                                                         p_values => STRINGARRAY(p_carrier_name));
188 
189                     FTE_UTIL_PKG.Write_OutFile(p_msg         => x_error_msg,
190                                                p_module_name => l_module_name,
191                                                p_category    => 'D',
192                                                p_line_number => p_line_number);
193                     FTE_UTIL_PKG.Exit_Debug(l_module_name);
194                     RETURN;
195                  WHEN OTHERS THEN
196                     x_status := 2;
197                     x_error_msg := sqlerrm;
198                     FTE_UTIL_PKG.Write_LogFile(l_module_name,'UNEXPECTED ERROR occured ' || sqlerrm );
199                     FTE_UTIL_PKG.Exit_Debug(l_module_name);
200                     RETURN;
201             END;
202 
203             --+
204             -- Get the carrier's prefered rate basis uom.
205             --+
206             IF (g_carrier_unit_basis IS NULL) THEN
207                 x_status := 2;
208                 x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CARRIER_RATE_BASIS_NOT_SET',
209                                                     p_tokens => STRINGARRAY('CARRIER'),
210                                                     p_values => STRINGARRAY(p_carrier_name));
211                 FTE_UTIL_PKG.Write_OutFile( p_msg         => x_error_msg,
212                                             p_module_name => l_module_name,
213                                             p_category    => 'B',
214                                             p_line_number => p_line_number);
215                 FTE_UTIL_PKG.Exit_Debug(l_module_name);
216                 RETURN;
217 
218             ELSIF (g_carrier_unit_basis = 'WEIGHT') THEN
219 
220                 g_carrier_unit_basis_uom := l_weight_uom;
221 
222             ELSIF (g_carrier_unit_basis = 'VOLUME') THEN
223 
224                 g_carrier_unit_basis_uom := l_volume_uom;
225 
226             ELSIF (g_carrier_unit_basis IN ('CONTAINER', 'PALLET')) THEN
227 
228                 g_carrier_unit_basis_uom := g_unit_uom;
229 
230             END IF;
231 
232             g_carrier_name  := p_carrier_name;
233             g_service_level := p_service_level;
234 
235         END IF;
236 
237         IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
238             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'g_carrier_name  ', g_carrier_name);
239             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'g_service_level ', g_service_level);
240             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'g_carrier_id    ', g_carrier_id);
241             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'g_rate_basis    ', g_carrier_unit_basis);
242             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'g_rate_basis_uom',g_carrier_unit_basis_uom);
243             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'g_currency_code ',g_carrier_currency);
244         END IF;
245 
246         FTE_UTIL_PKG.Exit_Debug(l_module_name);
247 
248     EXCEPTION WHEN OTHERS THEN
249 
250         x_status := 2;
251         x_error_msg := sqlerrm;
252         FTE_UTIL_PKG.Write_LogFile(l_module_name, sqlerrm);
253         FTE_UTIL_PKG.Exit_Debug(l_module_name);
254 
255     END GET_CARRIER_PREFERENCES;
256 
257     --_________________________________________________________________________________--
258     --
259     -- FUNCTION: CHECK_RATE_BASIS
260     --
261     -- PURPOSE  Checks a rate basis and uom against a carrier's prefered rate bases.
262     --
263     -- PARAMETERS
264     -- IN
265     --    1. p_carrier_name
266     --    2. p_rate_basis
267     --    3. p_rate_basis_uom
268     --    4. p_service_level
269     --    5. p_line_number
270     -- OUT
271     --    x_status,  the return status, -1 for success
272     --                                   2 for failure.
273     --    x_error_msg, the corresponding error meassge,
274     --                 if any exception occurs during the process.
275     --
276     --_________________________________________________________________________________--
277 
278     PROCEDURE CHECK_RATE_BASIS( p_carrier_name     IN  VARCHAR2,
279                                 p_rate_basis       IN  VARCHAR2,
280                                 p_rate_basis_uom   IN  VARCHAR2,
281                                 p_service_level    IN  VARCHAR2,
282                                 p_line_number      IN  NUMBER,
283                                 x_status           OUT NOCOPY  VARCHAR2,
284                                 x_error_msg        OUT NOCOPY  VARCHAR2) IS
285 
286     l_basis_type      VARCHAR2(10);
287     l_prefered_basis  VARCHAR2(50);
288     l_prefered_uom    VARCHAR2(50);
289 
290     l_module_name     CONSTANT VARCHAR2(100) := 'FTE.PLSQL.' || G_PKG_NAME || '.CHECK_RATE_BASIS';
291 
292     BEGIN
293 
294         FTE_UTIL_PKG.Enter_Debug(l_module_name);
295         x_status := -1;
296         l_basis_type := p_rate_basis;
297 
298         IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
299             FTE_UTIL_PKG.Write_LogFile(l_module_name,'p_carrier_name ',p_carrier_name);
300             FTE_UTIL_PKG.Write_LogFile(l_module_name,'p_rate_basis   ',p_rate_basis);
301             FTE_UTIL_PKG.Write_LogFile(l_module_name,'p_rate_basis_uom',p_rate_basis_uom);
302             FTE_UTIL_PKG.Write_LogFile(l_module_name,'p_service_level',p_service_level);
303         END IF;
304 
305         GET_CARRIER_PREFERENCES (p_carrier_name   => p_carrier_name,
306                                  p_service_level  => p_service_level,
307                                  p_line_number    => p_line_number,
308                                  x_status         => x_status,
309                                  x_error_msg      => x_error_msg);
310 
311         IF (x_status <> -1) THEN
312             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'GET_CARRIER_PREFERENCES returned with error');
313             FTE_UTIL_PKG.Exit_Debug(l_module_name);
314             RETURN;
315         END IF;
316 
317         IF (p_rate_basis IN (FTE_RTG_GLOBALS.G_TL_RATE_BASIS_CONT,       -- Container
318                              FTE_RTG_GLOBALS.G_TL_RATE_BASIS_PALLET,     -- Pallet
319                              FTE_RTG_GLOBALS.G_TL_RATE_BASIS_WT,         -- Weight
320                              FTE_RTG_GLOBALS.G_TL_RATE_BASIS_VOL)) THEN  -- Volume
321 
322             l_basis_type := 'UNIT';
323 
324             IF (p_rate_basis <> g_carrier_unit_basis) THEN
325 
326                 x_status := 2;
327                 x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name   => 'FTE_RATE_BASIS_NO_MATCH',
328                                                     p_tokens => STRINGARRAY('RATE_BASIS','CARRIER'),
329                                                     p_values => STRINGARRAY(p_rate_basis,p_carrier_name));
330                 FTE_UTIL_PKG.Write_OutFile( p_msg         => x_error_msg,
331                                             p_module_name => l_module_name,
332                                             p_category    => 'D',
333                                             p_line_number => p_line_number);
334                 FTE_UTIL_PKG.Exit_Debug(l_module_name);
335                 RETURN;
336 
337             ELSIF (p_rate_basis_uom <> g_carrier_unit_basis_uom) THEN
338                 x_status := 3;
339             END IF;
340 
341         ELSIF (p_rate_basis = FTE_RTG_GLOBALS.G_TL_RATE_BASIS_TIME AND
342                p_rate_basis_uom <> g_carrier_time_uom) THEN
343 
344             x_status := 3;
345 
346         ELSIF (p_rate_basis = FTE_RTG_GLOBALS.G_TL_RATE_BASIS_DIST AND
347                p_rate_basis_uom <> g_carrier_distance_uom) THEN
348 
349             x_status := 3;
350 
351         END IF;
352 
353         --+
354         -- The rate basis uom did not match that of the carrier
355         --+
356         IF (x_status = 3) THEN
357             x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_RATE_BASIS_UOM_NO_MATCH',
358                                                 p_tokens => STRINGARRAY('RATE_BASIS_UOM','CARRIER'),
359                                                 p_values => STRINGARRAY(p_rate_basis_uom,p_carrier_name));
360             FTE_UTIL_PKG.Write_OutFile( p_msg         => x_error_msg,
361                                         p_module_name => l_module_name,
362                                         p_category    => 'D',
363                                         p_line_number => p_line_number);
364             FTE_UTIL_PKG.Exit_Debug(l_module_name);
365             x_status := 2;
366 
367         END IF;
368 
369         FTE_UTIL_PKG.Exit_Debug(l_module_name);
370 
371     EXCEPTION
372         WHEN OTHERS THEN
373             x_error_msg := sqlerrm;
374             x_status := 2;
375             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'UNEXPECTED ERROR IN CHECK_RATE_BASIS ' || sqlerrm);
376             FTE_UTIL_PKG.Exit_Debug(l_module_name);
377 
378     END CHECK_RATE_BASIS;
379 
380     --____________________________________________________________________________--
381     --
382     -- PROCEDURE:  CHECK_DUPLICATE_RATE_CHART
383     --
384     -- PURPOSE    To ensure that the rate chart is qualified to be
385     --            loaded.  Validate the qualifiers, rate basis and uoms.
386     --
387     -- PARAMETERS
388     -- IN
389     --  p_chart_name,    The Rate Chart Name
390     --  p_chart_type,    The Rate Chart Type
391     --  p_carrier_name,  Carrier name
392     --  p_service_level, Service level of the carrier
393     --  p_line_number,   Line Number in the upload file, used for error reporting.
394     --
395     -- OUT
396     --    x_status,  the return status, -1 for success
397     --                                   2 for failure.
398     --    x_error_msg, the corresponding error meassge,
399     --                 if any exception occurs during the process.
400     --______________________________________________________________________________--
401 
402     PROCEDURE CHECK_DUPLICATE_RATE_CHART( p_chart_name     IN      VARCHAR2,
403                                           p_chart_type     IN      VARCHAR2,
404                                           p_carrier_name   IN      VARCHAR2,
405                                           p_service_level  IN      VARCHAR2,
406                                           p_line_number    IN      NUMBER,
407                                           x_error_msg  OUT NOCOPY  VARCHAR2,
408                                           x_status     OUT NOCOPY  NUMBER ) IS
409 
410     l_rc_names  VARCHAR100_TAB;
411     l_rc_types  VARCHAR100_TAB;
412 
413     CURSOR GET_TL_CHARTS IS
414     SELECT
415       lh.name, b.attribute1
416     FROM
417       qp_list_headers_tl lh,
418       qp_list_headers_b b,
419       qp_qualifiers qc,
420       qp_qualifiers qs,
421       qp_qualifiers qm
422     WHERE
423       lh.list_header_id       = b.list_header_id AND
424       qc.qualifier_attribute  = 'QUALIFIER_ATTRIBUTE1' AND
425       qc.qualifier_context    = 'PARTY' AND
426       qc.qualifier_attr_value = Fnd_Number.Number_To_Canonical(g_carrier_id) AND
427       qc.list_header_id       = lh.list_header_id AND
428       qs.qualifier_attribute  = 'QUALIFIER_ATTRIBUTE10' AND
429       qs.qualifier_context    = 'LOGISTICS' AND
430       qs.qualifier_attr_value = p_service_level AND
431       qs.list_header_id       = qc.list_header_id AND
432       qm.qualifier_attribute  = 'QUALIFIER_ATTRIBUTE7' AND
433       qm.qualifier_context    = 'LOGISTICS' AND
434       qm.qualifier_attr_value = 'TRUCK' AND
435       qm.list_header_id       = qc.list_header_id AND
436       lh.language             = userenv('LANG');
437 
438     l_module_name   CONSTANT VARCHAR2(100) := 'FTE.PLSQL.' || G_PKG_NAME || '.CHECK_DUPLICATE_RATE_CHART';
439 
440     BEGIN
441 
442         FTE_UTIL_PKG.Enter_Debug(l_module_name);
443         x_status := -1;
444 
445         --
446         -- Ensure that there is no rate chart with the same qualifier set
447         -- already loaded (CARRIER, SERVICE_LEVEL, MODE_OF_TRANSPORT)
448         --
449 
450         IF (p_chart_type IN ('TL_MODIFIER')) THEN
451 
452             GET_CARRIER_PREFERENCES(p_carrier_name   => p_carrier_name,
453                                     p_service_level  => p_service_level,
454                                     p_line_number    => p_line_number,
455                                     x_error_msg      => x_error_msg,
456                                     x_status         => x_status);
457 
458             IF (x_status <> -1) THEN
459                 FTE_UTIL_PKG.Write_LogFile(l_module_name,'GET_CARRIER_PREFERENCES returned with error' || x_error_msg);
460                 FTE_UTIL_PKG.Exit_Debug(l_module_name);
461                 RETURN;
462             END IF;
463 
464             OPEN  GET_TL_CHARTS;
465             FETCH GET_TL_CHARTS BULK COLLECT INTO l_rc_names, l_rc_types;
466             CLOSE GET_TL_CHARTS;
467 
468             FOR i IN 1..l_rc_types.COUNT LOOP
469                 IF (l_rc_types(i) = p_chart_type) THEN
470                     x_status := 2;
471                     x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_DUPLICATE_CHART');
472                     FTE_UTIL_PKG.Write_OutFile( p_msg         => x_error_msg,
473                                                 p_module_name => l_module_name,
474                                                 p_category    => 'C',
475                                                 p_line_number => p_line_number);
476                     FTE_UTIL_PKG.Exit_Debug(l_module_name);
477                     RETURN;
478                 END IF;
479             END LOOP;
480 
481         END IF;
482 
483         FTE_UTIL_PKG.Exit_Debug(l_module_name);
484 
485     EXCEPTION
486         WHEN OTHERS THEN
487             x_status := 2;
488             FTE_UTIL_PKG.Write_LogFile(l_module_name,'UNEXPECTED ERROR in CHECK_DUPLICATE_RATE_CHART ', sqlerrm);
489             FTE_UTIL_PKG.Exit_Debug(l_module_name);
490 
491     END CHECK_DUPLICATE_RATE_CHART;
492 
493     --______________________________________________________________________________________--
494     --                                                                                      --
495     -- FUNCTION: GET_CHART_DATA                                                             --
496     --                                                                                      --
497     -- PURPOSE  Store summary information about each rate chart in the current load.        --
498     --                                                                                      --
499     -- PARAMETERS                                                                           --
500     -- IN                                                                                   --
501     --     p_chart_name:    The rate chart name                                             --
502     --     p_carrier_name:  The carrier name                                                --
503     --     p_currency:      The Currency of the rate chart                                  --
504     --     p_chart_type:    The Chart type                                                  --
505     --     p_line_number:   The line number in the upload file.                             --
506     --                                                                                      --
507     -- IN OUT                                                                    --
508     --    x_service_level: The service level                                                --
509     --                                                                                      --
510     -- OUT                                                                      --
511     --    x_cur_line,  The current line number of rate chart.                               --
512     --    x_job_id,    The process ID of this job.                                          --
513     --    x_status,    The return status, -1 for success                                    --
514     --                                   2 for failure.                                     --
515     --    x_error_msg, The corresponding error meassge,                                     --
516     --                 if any exception occurs during the process.                          --
517     --______________________________________________________________________________________--
518 
519     PROCEDURE GET_CHART_DATA( p_chart_name    IN  VARCHAR2,
520                               p_currency      IN  VARCHAR2,
521                               p_chart_type    IN  VARCHAR2,
522                               x_carrier_name  IN  OUT NOCOPY VARCHAR2,
523                               x_service_level IN  OUT NOCOPY VARCHAR2,
524                               x_cur_line      OUT NOCOPY NUMBER,
525                               x_job_id        OUT NOCOPY NUMBER,
526                               p_line_number   IN NUMBER,
527                               x_error_msg     OUT NOCOPY VARCHAR2,
528                               x_status        OUT NOCOPY NUMBER) IS
529 
530     chart_exists    BOOLEAN := FALSE;
531 
532     l_module_name   CONSTANT VARCHAR2(100) := 'FTE.PLSQL.' || G_PKG_NAME || '.GET_CHART_DATA';
533 
534     BEGIN
535 
536         FTE_UTIL_PKG.Enter_Debug(l_module_name);
537         x_status := -1;
538 
539         IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
540             FTE_UTIL_PKG.Write_LogFile(l_module_name,'p_chart_name',p_chart_name);
541             FTE_UTIL_PKG.Write_LogFile(l_module_name,'p_currency  ',p_currency);
542             FTE_UTIL_PKG.Write_LogFile(l_module_name,'p_chart_type', p_chart_type);
543         END IF;
544 
545         FOR i IN 1.. Chart_Names.COUNT LOOP
546 
547             IF (p_chart_name = Chart_Names(i)) THEN
548                 x_cur_line := Chart_LineNums(i);
549                 x_job_id := Chart_Process_Ids(i);
550                 x_carrier_name := Chart_Carriers(i);
551                 IF (x_service_level IS NULL) THEN
552                     x_service_level := chart_service_levels(i);
553                 ELSIF (x_service_level <> chart_service_levels(i)) THEN
554                     x_status := 2;
555                     x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_SERVICE_LEVELS_NOT_SAME');
556                     FTE_UTIL_PKG.Write_OutFile( p_msg         => x_error_msg,
557                                                 p_module_name => l_module_name,
558                                                 p_category    => 'D',
559                                                 p_line_number => p_line_number);
560                     FTE_UTIL_PKG.Exit_Debug(l_module_name);
561                     RETURN;
562                 END IF;
563                 chart_exists := true;
564                 EXIT;
565             END IF;
566 
567         END LOOP;
568 
569         IF (NOT chart_exists) THEN
570 
571             x_cur_line := 0;
572             Chart_Names(Chart_Names.COUNT + 1)        := p_chart_name;
573             Chart_LineNums(Chart_LineNums.COUNT + 1)  := x_cur_line;
574             Chart_Carriers(Chart_Carriers.COUNT + 1)  := x_carrier_name;
575             Chart_Service_Levels(Chart_Service_Levels.COUNT + 1) := x_service_level;
576             Chart_Currencies(Chart_Currencies.COUNT + 1) := p_currency;
577 
578             IF (p_chart_type IS NOT NULL) THEN
579                 Chart_Types(Chart_Types.COUNT + 1) := p_chart_type;
580             ELSE
581                 FTE_UTIL_PKG.Write_LogFile(l_module_name,'Programmer Error: Chart_Type NOT SPECIFIED');
582                 x_status := 2;
583             END IF;
584 
585             x_job_id := FTE_BULKLOAD_PKG.GET_PROCESS_ID;
586             Chart_Process_Ids(Chart_Process_Ids.COUNT + 1) := x_job_id;
587 
588             --+
589             -- validate the rate chart to ensure that it can be loaded.
590             --+
591             IF (G_ACTION = 'ADD') THEN
592 
593                 CHECK_DUPLICATE_RATE_CHART(p_chart_name    => p_chart_name,
594                                            p_chart_type    => p_chart_type,
595                                            p_carrier_name  => x_carrier_name,
596                                            p_service_level => x_service_level,
597                                            p_line_number   => p_line_number,
598                                            x_error_msg     => x_error_msg,
599                                            x_status        => x_status);
600 
601                 IF (x_status <> -1) THEN
602                     FTE_UTIL_PKG.Exit_Debug(l_module_name);
603                     RETURN;
604                 END IF;
605             END IF;
606         END IF;
607 
608         FTE_UTIL_PKG.Exit_Debug(l_module_name);
609 
610     EXCEPTION
611         WHEN OTHERS THEN
612             x_status := 2;
613             FTE_UTIL_PKG.Write_LogFile(l_module_name, sqlerrm);
614             FTE_UTIL_PKG.Exit_Debug(l_module_name);
615 
616     END GET_CHART_DATA;
617 
618     --_________________________________________________________________________________--
619     --
620     -- FUNCTION: IS_LANE_LOADED
621     --
622     -- Purpose   Returns true if the rate chart <p_chart_name> has an associated
623     --           lane that has already been loaded.  If that is true, the lane
624     --           needs to be updated with the rate chart id.
625     --
626     -- PARAMETERS
627     -- IN
628     --   p_chart_name   VARCHAR2 : The rate chart name
629     --   p_carrier_name VARCHAR2 : The carrier name of the rate chart.
630     --
631     -- OUT
632     --   x_carrier_id   NUMBER     : The carrier ID of the rate chart.
633     --   x_lane_ids     NUMBER_TAB : A list of all the lanes associated with
634     --                               this rate chart.
635     -- RETURN:
636     --  true , If the lane_type is of the form hold_<p_chart_name>
637     --  false, otherwise.
638     --_________________________________________________________________________________--
639 
640     FUNCTION IS_LANE_LOADED( p_chart_name      IN      VARCHAR2,
641                              p_carrier_name    IN      VARCHAR2,
642                              p_service_level   IN      VARCHAR2,
643                              p_line_number     IN      NUMBER,
644                              x_lane_ids    OUT NOCOPY  NUMBER_TAB,
645                              x_error_msg   OUT NOCOPY  VARCHAR2,
646                              x_status      OUT NOCOPY  VARCHAR2)
647     RETURN BOOLEAN IS
648 
649     l_lane_loaded      BOOLEAN := true;
650     l_name             VARCHAR2(50);
651     l_lane_numbers     STRINGARRAY;
652     l_lane_services    STRINGARRAY;
653     l_carrier_ids      NUMBER_TAB;
654 
655     l_num_of_lanes     NUMBER;
656 
657     CURSOR GET_LANES(p_chart_name VARCHAR2) IS
658     SELECT
659       lane_id,
660       carrier_id,
661       lane_number,
662       service_type_code
663     FROM
664       fte_lanes
665     WHERE
666       UPPER(lane_type) = UPPER('HOLD_'|| p_chart_name) AND
667       editable_flag <> 'D';
668 
669     l_module_name      CONSTANT VARCHAR2(100) := 'FTE.PLSQL.' || G_PKG_NAME || '.IS_LANE_LOADED';
670 
671     BEGIN
672         FTE_UTIL_PKG.Enter_Debug(l_module_name);
673         x_status    := -1;
674 
675         l_name := UPPER(p_chart_name);
676 
677     IF ( FTE_BULKLOAD_PKG.g_debug_on )  THEN
678        FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_name ',l_name );
679     END IF;
680 
681         OPEN GET_LANES(p_chart_name);
682 
683         FETCH GET_LANES BULK COLLECT INTO x_lane_ids, l_carrier_ids, l_lane_numbers, l_lane_services;
684 
685         l_num_of_lanes := GET_LANES % ROWCOUNT;
686 
687         CLOSE GET_LANES;
688 
689         l_lane_loaded := l_num_of_lanes > 0;
690 
691         --+
692         -- check to make sure the carrier ids of the lanes and rate chart match
693         --+
694         IF (l_lane_loaded) THEN
695 
696             GET_CARRIER_PREFERENCES(p_carrier_name  => p_carrier_name,
697                                     p_service_level => p_service_level,
698                                     p_line_number   => p_line_number,
699                                     x_error_msg     => x_error_msg,
700                                     x_status        => x_status);
701 
702             IF (x_status <> -1) THEN
703                 IF(FTE_BULKLOAD_PKG.g_debug_on) THEN
704                     FTE_UTIL_PKG.Write_LogFile(l_module_name, 'Error message from GET_CARRIER_PREFERENCES => ' || x_error_msg );
705                 END IF;
706                 FTE_UTIL_PKG.Exit_Debug(l_module_name);
707                 RETURN FALSE;
708             END IF;
709 
710             FOR i IN 1..l_carrier_ids.COUNT LOOP
711                 IF(FTE_BULKLOAD_PKG.g_debug_on) THEN
712                     FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_lane_numbers(' || i || ')', l_lane_numbers(i));
713                     FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_lane_services('|| i || ')', l_lane_services(i));
714                 END IF;
715 
716                 IF (g_carrier_id <> l_carrier_ids(i)) THEN
717                     x_status := 2;
718                     l_lane_loaded := false;
719                     x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name   => 'FTE_CAT_CARRIER_LANE_MISMATCH',
720                                                         p_tokens => STRINGARRAY('CARRIER','RATE_CHART','SERVICE'),
721                                                         p_values => STRINGARRAY(p_carrier_name,p_chart_name,l_lane_numbers(i)));
722                     FTE_UTIL_PKG.Write_OutFile( p_msg         => x_error_msg,
723                                                 p_module_name => l_module_name,
724                                                 p_category    => 'D',
725                                                 p_line_number => p_line_number);
726                     EXIT;
727                 ELSIF (p_service_level <> l_lane_services(i)) THEN
728                     x_status := 2;
729                     l_lane_loaded := false;
730                     x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name   => 'FTE_SERV_LEVEL_LANE_MISMATCH',
731                                                         p_tokens => STRINGARRAY('RATE_CHART','SERVICE'),
732                                                         p_values => STRINGARRAY(p_chart_name,l_lane_numbers(i)));
733                     FTE_UTIL_PKG.Write_OutFile( p_msg         => x_error_msg,
734                                                 p_module_name => l_module_name,
735                                                 p_category    => 'D',
736                                                 p_line_number => p_line_number);
737 
738                     EXIT;
739                 END IF;
740             END LOOP;
741         END IF;
742 
743         FTE_UTIL_PKG.Exit_Debug(l_module_name);
744 
745         RETURN l_lane_loaded;
746 
747     EXCEPTION
748         WHEN OTHERS THEN
749             IF ( GET_LANES%ISOPEN ) THEN
750                 CLOSE GET_LANES;
751             END IF;
752             x_status := 2;
753             FTE_UTIL_PKG.Write_LogFile(l_module_name, sqlerrm);
754             FTE_UTIL_PKG.Exit_Debug(l_module_name);
755 
756     END IS_LANE_LOADED;
757 
758     --_________________________________________________________________________________--
759     --
760     -- PROCEDURE:  SET_CHART_LINE
761     --
762     -- PURPOSE   Update the cached rate chart information with the current line
763     --           Number of the rate chart.
764     --
765     -- PARAMETERS
766     -- IN
767     --    1. p_chart_name : The rate chart name
768     --    2. p_linenum    : The rate chart's current line number.
769     --
770     -- OUT
771     --    1. x_status     : The exit status
772     --_________________________________________________________________________________--
773 
774     PROCEDURE SET_CHART_LINE (p_chart_name  IN  VARCHAR2,
775                               p_linenum     IN  NUMBER,
776                               x_status      OUT NOCOPY NUMBER) IS
777 
778     l_module_name   CONSTANT VARCHAR2(100) := 'FTE.PLSQL.' || G_PKG_NAME || '.SET_CHART_LINE';
779 
780     BEGIN
781         FTE_UTIL_PKG.Enter_Debug(l_module_name);
782         x_status := -1;
783 
784         FOR i IN 1.. Chart_Names.COUNT LOOP
785             IF (p_chart_name = Chart_Names(i)) THEN
786                 Chart_LineNums(i) := p_linenum;
787                 FTE_UTIL_PKG.Exit_Debug(l_module_name);
788                 RETURN;
789             END IF;
790         END LOOP;
791 
792         x_status := 2;
793 
794         IF( FTE_BULKLOAD_PKG.g_debug_on) THEN
795             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'Error: Rate Chart ' || p_chart_name || ' not found');
796         END  IF;
797 
798         FTE_UTIL_PKG.Exit_Debug(l_module_name);
799 
800     EXCEPTION
801         WHEN OTHERS THEN
802             x_status := 2;
803             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'UNEXPECTED ERROR IN SET_CHART_LINE: ' || sqlerrm);
804             FTE_UTIL_PKG.Exit_Debug(l_module_name);
805 
806     END SET_CHART_LINE;
807 
808     --_________________________________________________________________________________--
809     --
810     -- PROCEDURE: LINK_RC_MODIFIERS
811     --
812     -- PURPOSE: Link all processed Modifiers to their corresponding Rate Charts.
813     --          Creates a Qualifier for the Modifier and stores the Rate Chart
814     --          ID in the qualifier attribute value.
815     --
816     --          The Modifier Names and and their associated Rate Chart Names
817     --          are stored in the tables Link_ChartNames and Link_ModifierNames
818     --
819     -- PARAMETERS
820     --  IN  p_chart_name, the chart name to be linked
821     --
822     --  OUT
823     --    x_status,  the return status, -1 for success
824     --                                   2 for failure.
825     --    x_error_msg, the corresponding error message,
826     --                 if any exception occurs during the process.
827     --_________________________________________________________________________________--
828 
829     PROCEDURE LINK_RC_MODIFIERS(p_chart_name     IN     VARCHAR2,
830                                 x_error_msg      OUT NOCOPY VARCHAR2,
831                                 x_status         OUT NOCOPY VARCHAR2) IS
832 
833     l_rc_id               NUMBER;
834     l_mod_pid             NUMBER;
835     l_rc_name             VARCHAR2(50);
836     l_mod_name            VARCHAR2(50);
837     l_temp                VARCHAR2(30);
838     l_carrier_name        VARCHAR2(100);
839 
840     l_qualifier_data      FTE_BULKLOAD_PKG.data_values_tbl;
841     l_qualifier_data_tbl  FTE_BULKLOAD_PKG.block_data_tbl;
842 
843     l_module_name CONSTANT VARCHAR2(100) := 'FTE.PLSQL.' || G_PKG_NAME || '.LINK_RC_MODIFIERS';
844 
845     BEGIN
846 
847         FTE_UTIL_PKG.Enter_Debug(l_module_name);
848         x_status := -1;
849 
850         --
851         -- Get the associated modifier name, if it exists.
852         --
853         FOR i IN 1..Link_ChartNames.COUNT LOOP
854 
855             IF (Link_ChartNames(i) = p_chart_name) THEN
856 
857                 l_mod_name := Link_ModifierNames(i);
858 
859                 IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
860                     FTE_UTIL_PKG.Write_LogFile(l_module_name, 'Modifier for ' || p_chart_name || ' is ' || l_mod_name);
861                 END IF;
862 
863                 BEGIN
864                     SELECT
865                       l.list_header_id
866                     INTO
867                       l_rc_id
868                     FROM
869                       qp_list_headers_tl l,
870                       qp_list_headers_b b
871                     WHERE
872                       l.list_header_id = b.list_header_id AND
873                       l.name = p_chart_name AND
874                       l.language = userenv('LANG');
875 
876                 EXCEPTION
877                     WHEN NO_DATA_FOUND THEN
878                         x_status := 2;
879                         FTE_UTIL_PKG.Write_LogFile(l_module_name,'Rate Chart ' || p_chart_name || ' has not been loaded!'); --message.
880                         FTE_UTIL_PKG.Exit_Debug(l_module_name);
881                         RETURN;
882                 END;
883 
884                 -- Get the process_id of the modifier, for update.
885                 GET_CHART_DATA(p_chart_name    => l_mod_name,
886                                p_currency      => l_temp,
887                                p_chart_type    => l_temp,
888                                x_carrier_name  => l_carrier_name,
889                                x_service_level => l_temp,
890                                x_cur_line      => l_temp,
891                                x_job_id        => l_mod_pid,
892                                p_line_number   => 0,
893                                x_error_msg     => x_error_msg,
894                                x_status        => x_status);
895 
896                 IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
897                     FTE_UTIL_PKG.Write_LogFile(l_module_name, 'p_chart_name', p_chart_name);
898                     FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_mod_name  ', l_mod_name);
899                     FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_rc_id     ', l_rc_id);
900                     FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_mod_pid   ', l_mod_pid);
901                 END IF;
902 
903                 l_qualifier_data('ACTION')          := 'ADD';
904                 l_qualifier_data('RATE_CHART_NAME') := p_chart_name;
905                 l_qualifier_data('PROCESS_ID')      := l_mod_pid;
906                 l_qualifier_data('ATTRIBUTE')       := 'PRICE_LIST';
907                 l_qualifier_data('VALUE')           := l_rc_id;
908                 l_qualifier_data('CONTEXT')         := 'MODLIST';
909                 l_qualifier_data('GROUP')           := 1;
910 
911                 l_qualifier_data_tbl(1) := l_qualifier_data;
912 
913                 FTE_RATE_CHART_LOADER.PROCESS_QUALIFIER(p_block_header  => g_dummy_block_hdr_tbl,
914                                                         p_block_data    => l_qualifier_data_tbl,
915                                                         p_line_number   => 0,
916                                                         x_status        => x_status,
917                                                         x_error_msg     => x_error_msg);
918                 l_qualifier_data.DELETE;
919                 l_qualifier_data_tbl.DELETE;
920 
921                 IF (x_status <> -1) THEN
922                     FTE_UTIL_PKG.Write_LogFile(l_module_name, x_error_msg);
923                     FTE_UTIL_PKG.Exit_Debug(l_module_name);
924                     RETURN;
925                 END IF;
926 
927                 FTE_RATE_CHART_LOADER.SUBMIT_QP_PROCESS(p_qp_call   => FALSE,
928                                                         x_status    => x_status,
929                                                         x_error_msg => x_error_msg);
930                 IF (x_status <> -1) THEN
931                     FTE_UTIL_PKG.Write_LogFile(l_module_name, x_error_msg);
932                     FTE_UTIL_PKG.Exit_Debug(l_module_name);
933                     RETURN;
934                 END IF;
935                 EXIT;
936             END IF;
937         END LOOP;
938 
939         FTE_UTIL_PKG.Exit_Debug(l_module_name);
940 
941     EXCEPTION
942         WHEN OTHERS THEN
943             x_status := 2;
944             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'UNEXP. ERROR in LINK_RC_MODIFIERS: ' || sqlerrm);
945             FTE_UTIL_PKG.Exit_Debug(l_module_name);
946     END LINK_RC_MODIFIERS;
947 
948 
949     --_________________________________________________________________________________--
950     --
951     -- FUNCTION:  GET_FACILITY_RATE_BASIS
952     --
953     -- PURPOSE  Get the rate basis and UOM associated with the facility modifier.
954     --
955     -- PARAMETERS
956     --
957     -- IN
958     --    p_chart_name:    The rate chart name
959     --
960     -- OUT
961     --    x_rate_basis: The rate basis of the facility modifier.
962     --    x_uom:        The rate basis uom.
963     --_________________________________________________________________________________--
964 
965     PROCEDURE GET_FACILITY_RATE_BASIS(p_chart_name  IN         VARCHAR2,
966                                       x_rate_basis  OUT NOCOPY VARCHAR2,
967                                       x_uom         OUT NOCOPY VARCHAR2,
968                                       x_status      OUT NOCOPY NUMBER,
969                                       x_error_msg   OUT NOCOPY VARCHAR2) IS
970 
971     l_module_name   CONSTANT VARCHAR2(100) := 'FTE.PLSQL.' || G_PKG_NAME || '.GET_FACILITY_RATE_BASIS';
972 
973     BEGIN
974 
975         FTE_UTIL_PKG.Enter_Debug(l_module_name);
976         x_status := -1;
977 
978         FOR i IN 1..Fac_Modifier_Names.COUNT LOOP
979             IF (p_chart_name = Fac_Modifier_Names(i)) THEN
980                 x_rate_basis := Fac_Modifier_Bases(i);
981                 x_uom :=  Fac_Modifier_Uoms(i);
982                 FTE_UTIL_PKG.Exit_Debug(l_module_name);
983                 RETURN;
984             END IF;
985         END LOOP;
986 
987         x_status := 2;
988         IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
989             x_error_msg:='Facility Rate Chart Name Not Found';
990             FTE_UTIL_PKG.Write_LogFile(l_module_name , x_error_msg);
991             FTE_UTIL_PKG.Exit_Debug(l_module_name);
992             RETURN;
993         END IF;
994 
995         FTE_UTIL_PKG.Exit_Debug(l_module_name);
996     EXCEPTION
997         WHEN OTHERS THEN
998             x_status := 2;
999             FTE_UTIL_PKG.Write_LogFile(l_module_name , 'UNEXP. ERROR IN GET_FACILITY_RATE_BASIS: ' || sqlerrm);
1000             FTE_UTIL_PKG.Exit_Debug(l_module_name);
1001 
1002     END GET_FACILITY_RATE_BASIS;
1003 
1004     --_________________________________________________________________________________--
1005     --
1006     -- PROCEDURE:  ADD_ATTRIBUTE
1007     --
1008     -- PURPOSE   Add an attribute to a rate chart line.
1009     --           Calls FTE_RATE_CHART_VAL_PKG.Validate_Attribute_Row.
1010     --
1011     -- PARAMETERS
1012     --
1013     -- IN
1014     --  p_attribute_type      Attribute Type (eg. COMMODITY)
1015     --  p_attribute_value     Attribute Value_From
1016     --  p_attribute_value_to  Attribute Value_To
1017     --  p_context             Context of the Attribute
1018     --  p_linenum             Rate Chart Line Number.
1019     --  p_comp_operator       Comparison Operator (eg. BETWEEN)
1020     --  p_process_id          process ID of the rate chart.
1021     --  p_line_number         line number in the spreadsheet, used for error logging
1022     --
1023     -- OUT
1024     --    x_status  :  the return status, -1 for success
1025     --                                     2 for failure.
1026     --    x_error_msg: the corresponding error meassge,
1027     --                 if any exception occurs during the process.
1028     --_________________________________________________________________________________--
1029 
1030     PROCEDURE ADD_ATTRIBUTE(p_attribute_type      IN     VARCHAR2,
1031                             p_attribute_value     IN     VARCHAR2,
1032                             p_attribute_value_to  IN     VARCHAR2,
1033                             p_context             IN     VARCHAR2,
1034                             p_linenum             IN     NUMBER,
1035                             p_comp_operator       IN     VARCHAR2,
1036                             p_process_id          IN     NUMBER,
1037                             p_line_number         IN     NUMBER,
1038                             x_error_msg      OUT  NOCOPY VARCHAR2,
1039                             x_status         OUT  NOCOPY NUMBER ) IS
1040 
1041 
1042     l_attribute_data         FTE_BULKLOAD_PKG.data_values_tbl;
1043     l_attribute_block_tbl    FTE_BULKLOAD_PKG.block_data_tbl;
1044 
1045     l_module_name  CONSTANT  VARCHAR2(100) := 'fte.plsql.'||G_PKG_NAME||'.ADD_ATTRIBUTE';
1046 
1047     BEGIN
1048 
1049         FTE_UTIL_PKG.Enter_Debug(l_module_name);
1050         x_status := -1;
1051 
1052         l_attribute_data('ACTION')              := 'ADD';
1053         l_attribute_data('LINE_NUMBER')         := Fnd_Number.Number_To_Canonical(p_linenum);
1054         l_attribute_data('ATTRIBUTE')           := p_attribute_type;
1055         l_attribute_data('ATTRIBUTE_VALUE')     := p_attribute_value;
1056         l_attribute_data('ATTRIBUTE_VALUE_TO')  := p_attribute_value_to;
1057         l_attribute_data('CONTEXT')             := p_context;
1058         l_attribute_data('COMPARISON_OPERATOR') := p_comp_operator;
1059 
1060         l_attribute_block_tbl(1) := l_attribute_data;
1061 
1062         FTE_RATE_CHART_LOADER.PROCESS_RATING_ATTRIBUTE( p_block_header  => g_dummy_block_hdr_tbl,
1063                                                         p_block_data    => l_attribute_block_tbl,
1064                                                         p_line_number   => p_line_number,
1065                                                         p_validate_column => FALSE,
1066                                                         x_status        => x_status,
1067                                                         x_error_msg     => x_error_msg);
1068 
1069         l_attribute_data.DELETE;
1070         l_attribute_block_tbl.DELETE;
1071 
1072         IF (x_status <> -1) THEN
1073             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'Error ',x_error_msg);
1074             FTE_UTIL_PKG.Exit_Debug(l_module_name);
1075             RETURN;
1076         END IF;
1077 
1078         FTE_UTIL_PKG.Exit_Debug(l_module_name);
1079 
1080     EXCEPTION
1081         WHEN OTHERS THEN
1082             x_status := 2;
1083             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'UNEXPECTED ERROR ', sqlerrm);
1084             FTE_UTIL_PKG.Exit_Debug(l_module_name);
1085 
1086     END ADD_ATTRIBUTE;
1087 
1088     --_________________________________________________________________________________--
1089     --
1090     -- PROCEDURE:  RESET_ALL
1091     --
1092     -- PURPOSE  To delete all rows from all pl/sql tables, used for caching by the
1093     --          procedure GET_CHART_DATA.
1094     --
1095     --_________________________________________________________________________________--
1096 
1097     PROCEDURE RESET_ALL IS
1098 
1099     BEGIN
1100 
1101         IF (Chart_Names.EXISTS(1)) THEN
1102             Chart_Names.DELETE;
1103             Chart_Carriers.DELETE;
1104             Chart_Service_Levels.DELETE;
1105             Chart_LineNums.DELETE;
1106             Chart_Currencies.DELETE;
1107             Chart_Process_Ids.DELETE;
1108             Chart_Types.DELETE;
1109             Chart_Min_Charges.DELETE;
1110             Chart_Ids.DELETE;
1111             Chart_Start_Dates.DELETE;
1112             Chart_End_Dates.DELETE;
1113             g_layovr_charges.DELETE;
1114             g_layovr_breaks.DELETE;
1115             Link_ChartNames.DELETE;
1116             Link_Modifiernames.DELETE;
1117         END IF;
1118 
1119         g_chart_name      := NULL;
1120         g_wknd_layovr_uom := NULL;
1121 
1122     EXCEPTION
1123         WHEN OTHERS THEN
1124             FTE_UTIL_PKG.Write_LogFile('RESET_ALL','UNEXPECTED ERROR occured',sqlerrm);
1125             RAISE;
1126     END RESET_ALL;
1127 
1128     --_________________________________________________________________________________--
1129     --
1130     -- PROCEDURE:  RESET_CHART_INFO
1131     --
1132     -- Purpose  To reset the chart info already stored in global variables.
1133     --
1134     --_________________________________________________________________________________--
1135 
1136     PROCEDURE RESET_CHART_INFO IS
1137     BEGIN
1138         g_layovr_charges  := STRINGARRAY();
1139         g_layovr_breaks   := STRINGARRAY();
1140         g_chart_name      := NULL;
1141         g_wknd_layovr_uom := NULL;
1142     EXCEPTION
1143         WHEN OTHERS THEN
1144             FTE_UTIL_PKG.Write_LogFile('RESET_CHART_INFO','Unexpected error');
1145             RAISE;
1146     END RESET_CHART_INFO;
1147 
1148 
1149     --_________________________________________________________________________________--
1150     --                                                                                 --
1151     -- PROCEDURE: CREATE_BREAKS                                                        --
1152     --                                                                                 --
1153     -- PURPOSE:   Create rate chart break lines in qp_list_lines given the             --
1154     --            charges and break ranges.                                            --
1155     --                                                                                 --
1156     -- PARAMETERS                                                                      --
1157     -- IN                                                                              --
1158     --    p_break_charges,   The charges of the break ranges.                          --
1159     --    p_break_limits,    The limits of the break ranges.                           --
1160     --    p_break_gap,       The gap between the end of one break and the              --
1161     --                       beginning of the next break                               --
1162     --    p_rate_type,       Rate Type (eg. STOP, FACILITY, ...)                       --
1163     --    p_attribute_type,  The attribute type associated with the break line.        --
1164     --    p_process_id,      Process Id of the rate chart.                             --
1165     --                                                                                 --
1166     -- IN OUT Parameters                                                               --
1167     --    x_linenum,         The line number of the rate break header.                 --
1168     --                                                                                 --
1169     -- OUT Parameters                                                                  --
1170     --    x_status,       the return status, -1 for success                            --
1171     --                                        2 for failure.                           --
1172     --    x_error_msg, the corresponding error meassge,                                --
1173     --                   if any exception occurs during the process.                   --
1174     --_________________________________________________________________________________--
1175 
1176     PROCEDURE CREATE_BREAKS(p_break_charges   IN  STRINGARRAY,
1177                             p_break_limits    IN  STRINGARRAY,
1178                             p_break_start     IN  NUMBER,
1179                             p_break_gap       IN  NUMBER,
1180                             p_rate_type       IN  VARCHAR2,
1181                             p_attribute_type  IN  VARCHAR2,
1182                             p_process_id      IN  NUMBER,
1183                             x_linenum         IN  OUT NOCOPY NUMBER,
1184                             x_error_msg       OUT NOCOPY VARCHAR2,
1185                             x_status          OUT NOCOPY NUMBER) IS
1186 
1187     l_break_min      NUMBER;
1188     l_break_max      NUMBER;
1189     l_rate           NUMBER;
1190     l_index1         NUMBER;
1191     l_index2         NUMBER;
1192     p_line_number    NUMBER := 0;
1193 
1194     l_rate_break_data      FTE_BULKLOAD_PKG.data_values_tbl;
1195     l_rate_break_block_tbl FTE_BULKLOAD_PKG.block_data_tbl;
1196 
1197     l_module_name    CONSTANT VARCHAR2(100) := 'FTE.PLSQL.' || G_PKG_NAME || '.CREATE_BREAKS';
1198 
1199     BEGIN
1200 
1201         FTE_UTIL_PKG.Enter_Debug(l_module_name);
1202         x_status := -1;
1203 
1204         l_break_max := p_break_start - p_break_gap;
1205 
1206         l_index1 := p_break_charges.FIRST;
1207         l_index2 := p_break_limits.FIRST;
1208 
1209         FOR i IN 1..p_break_charges.COUNT LOOP
1210 
1211             l_rate      := Fnd_Number.Canonical_To_Number(p_break_charges(l_index1));
1212             l_break_min := l_break_max + p_break_gap;
1213             l_break_max := Fnd_Number.Canonical_To_Number(p_break_limits(l_index2));
1214             x_linenum   := x_linenum + 1;
1215 
1216             IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
1217                 FTE_UTIL_PKG.Write_LogFile(l_module_name, 'x_linenum  ' || x_linenum);
1218                 FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_break_min' || l_break_min);
1219                 FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_break_max' || l_break_max);
1220                 FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_rate     ' || l_rate);
1221             END IF;
1222 
1223             l_rate_break_data('ACTION')     := 'ADD'; --G_ACTION;
1224             l_rate_break_data('LINE_NUMBER'):= x_linenum;
1225             l_rate_break_data('LOWER_LIMIT'):= Fnd_Number.Number_To_Canonical(l_break_min);
1226             l_rate_break_data('UPPER_LIMIT'):= Fnd_Number.Number_To_Canonical(l_break_max);
1227             l_rate_break_data('RATE')       := Fnd_Number.Number_To_Canonical(l_rate);
1228             l_rate_break_data('RATE_TYPE')  := p_rate_type;
1229             l_rate_break_data('ATTRIBUTE')  := p_attribute_type;
1230             l_rate_break_data('TYPE')       := 'ACCESSORIAL_SURCHARGE';
1231 
1232             l_rate_break_block_tbl(1) := l_rate_break_data;
1233 
1234             FTE_RATE_CHART_LOADER.PROCESS_RATE_BREAK(p_block_header  => g_dummy_block_hdr_tbl,
1235                                                      p_block_data    => l_rate_break_block_tbl,
1236                                                      p_line_number   => p_line_number,
1237                                                      p_validate_column => FALSE,
1238                                                      x_status        => x_status,
1239                                                      x_error_msg     => x_error_msg);
1240 
1241             l_rate_break_data.DELETE;
1242             l_rate_break_block_tbl.DELETE;
1243 
1244             IF (x_status <> -1) THEN
1245                 FTE_UTIL_PKG.Write_LogFile(l_module_name, 'Error On Line ' || x_linenum);
1246                 FTE_UTIL_PKG.Exit_Debug(l_module_name);
1247                 RETURN;
1248             END IF;
1249             l_index1 := p_break_charges.NEXT(l_index1);
1250             l_index2 := p_break_limits.NEXT(l_index2);
1251 
1252         END LOOP;
1253 
1254         FTE_UTIL_PKG.Exit_Debug(l_module_name);
1255 
1256     EXCEPTION
1257         WHEN OTHERS THEN
1258 
1259             x_status := 2;
1260             FTE_UTIL_PKG.Write_LogFile(l_module_name, sqlerrm);
1261             FTE_UTIL_PKG.Exit_Debug(l_module_name);
1262 
1263     END CREATE_BREAKS;
1264 
1265     --_________________________________________________________________________________--
1266     --
1267     -- PROCEDURE: CREATE_MINCHARGE_MODIFIER
1268     --
1269     -- PURPOSE:  Create a Modifier for a rate chart that has minimum charges
1270     --           For its lines. This modifier is then later linked to the rate
1271     --           chart.
1272     --
1273     -- PARAMETERS
1274     -- IN
1275     --   p_chart_name,    the rate chart name
1276     --   p_service_level, service level of the carrier
1277     --   p_carrier_name,  carrier name for which the mincharge has to be attached
1278     --   p_currency,      carrier currency?
1279     --   p_charge_data,   minimum rate figures
1280     --   p_line_number,   line number in the upload file, used for logging
1281     --
1282     -- OUT Parameters
1283     --    x_status,       the return status, -1 for success
1284     --                                        2 for failure.
1285     --    x_error_msg, the corresponding error meassge,
1286     --                   if any exception occurs during the process.
1287     --_________________________________________________________________________________--
1288 
1289     PROCEDURE CREATE_MINCHARGE_MODIFIER( p_chart_name    IN     VARCHAR2,
1290                                          p_service_level IN     VARCHAR2,
1291                                          p_carrier_name  IN     VARCHAR2,
1292                                          p_currency      IN     VARCHAR2,
1293                                          p_charge_data   IN     VARCHAR2,
1294                                          x_mod_name  OUT NOCOPY VARCHAR2,
1295                                          p_line_number   IN     NUMBER,
1296                                          x_status    OUT NOCOPY NUMBER,
1297                                          x_error_msg OUT NOCOPY VARCHAR2) IS
1298     l_description      VARCHAR2(100);
1299     l_vehicle_type     VARCHAR2(50);
1300     l_basis            VARCHAR2(30);
1301     l_attribute_type   VARCHAR2(50);
1302     l_context          VARCHAR2(50);
1303     l_linenum          NUMBER;
1304     l_process_id       NUMBER;
1305     l_mincharge        NUMBER;
1306     l_service_level    VARCHAR2(30);
1307     l_start_date       VARCHAR2(30);
1308     l_end_date         VARCHAR2(30);
1309     l_type             VARCHAR2(30);
1310     l_subtype          VARCHAR2(30);
1311     l_uom              VARCHAR2(30);
1312     l_count            NUMBER;
1313     l_chart_type       VARCHAR2(30);
1314     l_charge_info      STRINGARRAY;
1315     l_formula_id       NUMBER;
1316     l_carrier_name     VARCHAR2(100);
1317 
1318     l_rate_hdr_data       FTE_BULKLOAD_PKG.data_values_tbl;
1319     l_rate_hdr_block_tbl  FTE_BULKLOAD_PKG.block_data_tbl;
1320 
1321     l_rate_line_data      FTE_BULKLOAD_PKG.data_values_tbl;
1322     l_rate_line_block_tbl FTE_BULKLOAD_PKG.block_data_tbl;
1323 
1324     l_module_name  CONSTANT VARCHAR2(100) := 'FTE.PLSQL.'||G_PKG_NAME||'.CREATE_MINCHARGE_MODIFIER';
1325 
1326     BEGIN
1327 
1328         FTE_UTIL_PKG.Enter_Debug(l_module_name);
1329         x_status := -1;
1330 
1331         x_mod_name      := p_chart_name || '_MIN';
1332         l_service_level := p_service_level;
1333         l_chart_type    := 'MIN_MODIFIER';
1334         l_carrier_name  := p_carrier_name;
1335 
1336         IF(FTE_BULKLOAD_PKG.g_debug_on) THEN
1337             FTE_UTIL_PKG.Write_LogFile(l_module_name, p_service_level||'::'||p_chart_name||'::'||p_currency);
1338         END IF;
1339 
1340         -- Store modifier data.
1341         GET_CHART_DATA(p_chart_name    => x_mod_name,
1342                        p_currency      => p_currency,
1343                        p_chart_type    => l_chart_type,
1344                        x_carrier_name  => l_carrier_name,
1345                        x_service_level => l_service_level,
1346                        x_cur_line      => l_linenum,
1347                        x_job_id        => l_process_id,
1348                        p_line_number   => p_line_number,
1349                        x_error_msg     => x_error_msg,
1350                        x_status        => x_status);
1351 
1352         IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
1353             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_linenum      ', l_linenum);
1354             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_process_id   ', l_process_id);
1355             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_service_level', l_service_level);
1356             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'Creating Modifier Header For ' || x_mod_name);
1357         END IF;
1358 
1359         IF (x_status <> -1) THEN
1360             FTE_UTIL_PKG.Write_LogFile(l_module_name, x_error_msg);
1361             FTE_UTIL_PKG.Exit_Debug(l_module_name);
1362             RETURN;
1363         END IF;
1364 
1365         -- Create Modifier Header --
1366         l_description := 'Rate Chart ' || x_mod_name;
1367 
1368         l_rate_hdr_data('ACTION')        := 'ADD';
1369         l_rate_hdr_data('TL_MIN_CHARGE') := x_mod_name;
1370         l_rate_hdr_data('DESCRIPTION')   := l_description;
1371         l_rate_hdr_data('START_DATE')    := l_start_date;
1372         l_rate_hdr_data('END_DATE')      := l_end_date;
1373         l_rate_hdr_data('CURRENCY')      := p_currency;
1374         l_rate_hdr_data('CARRIER_NAME')  := p_carrier_name;
1375         l_rate_hdr_data('SERVICE_LEVEL') := l_service_level;
1376         l_rate_hdr_data('ATTRIBUTE1')    := l_chart_type;
1377 
1378         l_rate_hdr_block_tbl(1) := l_rate_hdr_data;
1379 
1380         FTE_RATE_CHART_LOADER.PROCESS_RATE_CHART(p_block_header => g_dummy_block_hdr_tbl,
1381                                                  p_block_data   => l_rate_hdr_block_tbl,
1382                                                  p_line_number  => p_line_number,
1383                                                  p_validate_column => FALSE,
1384                                                  p_process_id   => l_process_id,
1385                                                  x_status       => x_status,
1386                                                  x_error_msg    => x_error_msg);
1387 
1388         l_rate_hdr_data.DELETE;
1389         l_rate_hdr_block_tbl.DELETE;
1390 
1391         IF (x_status <> -1) THEN
1392             FTE_UTIL_PKG.Exit_Debug(l_module_name);
1393             RETURN;
1394         END IF;
1395 
1396 
1397         IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
1398             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'p_charge_data', p_charge_data);
1399         END IF;
1400 
1401         l_charge_info := FTE_UTIL_PKG.TOKENIZE_STRING(p_string => p_charge_data,
1402                                                       p_delim  => ':' );
1403         l_type := 'ACCESSORIAL_SURCHARGE';
1404 
1405         BEGIN
1406 
1407             SELECT price_formula_id
1408             INTO   l_formula_id
1409             FROM   qp_price_formulas_b
1410             WHERE  price_formula_no = 'QP_MIN_CHARGE';
1411 
1412         EXCEPTION
1413             WHEN NO_DATA_FOUND THEN
1414                 x_status := 2;
1415                 x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_MIN_CHARGE_FORMULA_NOT_SET');
1416                 FTE_UTIL_PKG.Write_OutFile( p_msg    => x_error_msg,
1417                                             p_module_name => l_module_name,
1418                                             p_category    => 'B',
1419                                             p_line_number => p_line_number);
1420                 FTE_UTIL_PKG.Exit_Debug(l_module_name);
1421                 RETURN;
1422             WHEN OTHERS THEN
1423                 x_status := 2;
1424                 FTE_UTIL_PKG.Write_LogFile(l_module_name, sqlerrm);
1425                 FTE_UTIL_PKG.Exit_Debug(l_module_name);
1426 
1427         END;
1428 
1429         --+
1430         -- Create a Line for each (basis,vehicle,mincharge) combination.
1431         -- l_charge_info contains strings of the format
1432         -- (B:<basis>:V:<veh>:U:<uom>:C:<charge>:B:<basis>:...)
1433         --+
1434 
1435         l_count := l_charge_info.FIRST;
1436 
1437         WHILE l_count < l_charge_info.COUNT-1 LOOP
1438 
1439             l_linenum := l_linenum + 1;
1440 
1441             l_description := 'Line ' || l_linenum || ' Of ' ||x_mod_name;
1442 
1443             l_basis        := l_charge_info(l_count + 1);
1444             l_vehicle_type := l_charge_info(l_count + 3);
1445             l_uom          := l_charge_info(l_count + 5);
1446             l_mincharge    := Fnd_Number.Canonical_To_Number(l_charge_info(l_count+7));
1447 
1448             IF (l_basis = 'DISTANCE') THEN
1449                 l_subtype := FTE_RTG_GLOBALS.G_C_MIN_DISTANCE_CH;
1450             ELSIF (l_basis = 'TIME') THEN
1451                 l_subtype := FTE_RTG_GLOBALS.G_C_MIN_TIME_CH;
1452             ELSE
1453                 -- WEIGHT/VOLUME/PALLET/CONTAINER
1454                 l_subtype := FTE_RTG_GLOBALS.G_C_MIN_UNIT_CH;
1455             END IF;
1456 
1457             IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
1458                 FTE_UTIL_PKG.Write_LogFile(l_module_name, 'Creating   ' || l_description);
1459                 FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_subtype  ', l_subtype);
1460                 FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_basis    ', l_basis);
1461                 FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_vehicle_type',l_vehicle_type);
1462                 FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_mincharge ', l_mincharge);
1463                 FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_uom       ', l_uom);
1464             END IF;
1465 
1466             --
1467             -- MinCharge Modifier lines must have the item_amount attribute for each line
1468             -- AND no item_all attribute.
1469             --
1470             l_rate_line_data('ACTION')       := G_ACTION;
1471             l_rate_line_data('LINE_NUMBER')  := l_linenum;
1472             l_rate_line_data('DESCRIPTION')  := l_description;
1473             l_rate_line_data('FIXED_RATE')   := Fnd_Number.Number_To_Canonical(l_mincharge);
1474             l_rate_line_data('UOM')          := l_uom;
1475             l_rate_line_data('RATE_BREAK_TYPE')  := 'POINT';
1476             l_rate_line_data('RATE_TYPE')    := 'LUMPSUM';
1477             l_rate_line_data('TYPE')         := l_type;
1478             l_rate_line_data('SUBTYPE')      := l_subtype;
1479             l_rate_line_data('MOD_LEVEL_CODE')  := 'LINEGROUP';
1480             l_rate_line_data('FORMULA_ID')   := l_formula_id;
1481             l_rate_line_data('ATTRIBUTE')    := 'ITEM_AMOUNT';
1482             l_rate_line_data('CONTEXT')      := 'VOLUME';
1483             l_rate_line_data('COMPARISON_OPERATOR') := 'BETWEEN';
1484             l_rate_line_data('ATTRIBUTE_VALUE')     :=  1;
1485             l_rate_line_data('ATTRIBUTE_VALUE_TO')  := g_max_number;
1486 
1487             l_rate_line_block_tbl(1) := l_rate_line_data;
1488 
1489             FTE_RATE_CHART_LOADER.PROCESS_RATE_LINE(p_block_header  => g_dummy_block_hdr_tbl,
1490                                                     p_block_data    => l_rate_line_block_tbl,
1491                                                     p_line_number   => p_line_number,
1492                                                     p_validate_column => FALSE,
1493                                                     x_status        => x_status,
1494                                                     x_error_msg     => x_error_msg);
1495             l_rate_line_data.DELETE;
1496             l_rate_line_block_tbl.DELETE;
1497 
1498             IF (x_status <> -1) THEN
1499                 FTE_UTIL_PKG.Exit_Debug(l_module_name);
1500                 RETURN;
1501             END IF;
1502 
1503             ADD_ATTRIBUTE(p_attribute_type      => 'TL_RATE_BASIS',
1504                           p_attribute_value     => l_basis,
1505                           p_attribute_value_to  => NULL,
1506                           p_context             => FTE_RTG_GLOBALS.G_AX_TL_RATE_BASIS,
1507                           p_comp_operator       => NULL,
1508                           p_linenum             => l_linenum,
1509                           p_process_id          => l_process_id,
1510                           p_line_number         => p_line_number,
1511                           x_error_msg           => x_error_msg,
1512                           x_status              => x_status);
1513 
1514             ADD_ATTRIBUTE(p_attribute_type      => 'TL_RATE_TYPE',
1515                           p_attribute_value     => 'BASE_RATE',
1516                           p_attribute_value_to  => NULL,
1517                           p_context             => FTE_RTG_GLOBALS.G_AX_TL_RATE_TYPE,
1518                           p_comp_operator       => NULL,
1519                           p_linenum             => l_linenum,
1520                           p_process_id          => l_process_id,
1521                           p_line_number         => p_line_number,
1522                           x_error_msg           => x_error_msg,
1523                           x_status              => x_status);
1524 
1525 
1526             -- Attribute : VEHICLE TYPE (optional)
1527             IF (l_vehicle_type IS NOT NULL AND LENGTH(l_vehicle_type) > 0) THEN
1528                 --Vehicle type is already in ID form
1529                 ADD_ATTRIBUTE (p_attribute_type      => 'TL_VEHICLE_TYPE',
1530                                p_attribute_value     => l_vehicle_type,
1531                                p_attribute_value_to  => NULL,
1532                                p_context             => FTE_RTG_GLOBALS.G_AX_VEHICLE,
1533                                p_comp_operator       => NULL,
1534                                p_linenum             => l_linenum,
1535                                p_process_id          => l_process_id,
1536                                p_line_number         => p_line_number,
1537                                x_error_msg           => x_error_msg,
1538                                x_status              => x_status);
1539 
1540             END IF;
1541             --
1542             -- Insert a qualifier for the associated pricelist
1543             --
1544             IF (x_status <> -1) THEN
1545                 FTE_UTIL_PKG.Exit_Debug(l_module_name);
1546                 RETURN;
1547             END IF;
1548 
1549             l_count := l_count + 8;
1550         END LOOP;
1551 
1552         FTE_UTIL_PKG.Exit_Debug(l_module_name);
1553     EXCEPTION
1554         WHEN OTHERS THEN
1555             x_status := 2;
1556             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'UNEXPECTED ERROR in CREATE_MINCHARGE_MODIFIER',sqlerrm);
1557             FTE_UTIL_PKG.Exit_Debug(l_module_name);
1558 
1559     END CREATE_MINCHARGE_MODIFIER;
1560 
1561     --_________________________________________________________________________________--
1562     --
1563     -- PROCEDURE: STORE_MIN_CHARGE
1564     --
1565     -- Purpose:  Store Minimum Charges for the the rate chart.
1566     --           Each Rate Chart has a minimum charges for each of its
1567     --           rate bases.
1568     --
1569     --           Rate Chart       Basis:<val>:Veh:<val>:Uom:<val>:Charge:<val>:Basis:....
1570     --           ----------       -------------------------------------------------------
1571     --           Rate       ->    B:WEIGHT:V:53FT:C:30:U:Lbs:B:DIST:...
1572     --
1573     -- PARAMETERS
1574     --  OUT
1575     --    x_status,  the return status, -1 for success
1576     --                                   2 for failure.
1577     --    x_error_msg, the corresponding error message,
1578     --                 if any exception occurs during the process.
1579     --_________________________________________________________________________________--
1580 
1581     PROCEDURE STORE_MIN_CHARGE(p_chart_name     IN     VARCHAR2,
1582                                p_charge         IN     NUMBER,
1583                                p_basis          IN     VARCHAR2,
1584                                p_uom            IN     VARCHAR2,
1585                                p_vehicle        IN     VARCHAR2,
1586                                p_line_number    IN     NUMBER,
1587                                x_error_msg  OUT NOCOPY VARCHAR2,
1588                                x_status     OUT NOCOPY NUMBER ) IS
1589 
1590 
1591     l_module_name   CONSTANT VARCHAR2(100) := 'FTE.PLSQL.' || G_PKG_NAME || '.STORE_MIN_CHARGE';
1592 
1593     l_charge_str    VARCHAR2(2000);
1594     l_str           VARCHAR2(100);
1595 
1596     BEGIN
1597         FTE_UTIL_PKG.Enter_Debug(l_module_name);
1598         x_status := -1;
1599 
1600         --+
1601         -- Create the minimum charge string.
1602         --+
1603         l_str := 'B:' || p_basis || ':V:' || p_vehicle||':U:'|| p_uom ||':C:' || Fnd_Number.Number_To_Canonical(p_charge) || ':';
1604 
1605         FOR i IN 1.. Chart_Names.COUNT LOOP
1606             IF (p_chart_name = Chart_Names(i)) THEN
1607                 IF (NOT Chart_Min_Charges.EXISTS(i)) THEN
1608                     --+
1609                     -- store a new min charge string for the rate chart
1610                     --+
1611                     Chart_Min_Charges(i) := l_str;
1612                     FTE_UTIL_PKG.Exit_Debug(l_module_name);
1613                     RETURN;
1614                 ELSE
1615                     --+
1616                     -- Get the stored string from the min charges table
1617                     --+
1618                     l_charge_str := Chart_Min_Charges(i);
1619                 END IF;
1620 
1621                 --+
1622                 -- Validate the Rate Basis, Vehicle Type, Uom, Minimum Charge combination.
1623                 --+
1624                 IF (l_charge_str IS NOT NULL) THEN
1625 
1626                     --+
1627                     -- Check the stored string for the same combination of basis, vehicle, uom, charge.
1628                     -- If that combination exists, then
1629                     --    a. If basis is NOT distance, we have a duplicate line (ERROR).
1630                     --    b. If basis is distance, this is not an error because distance
1631                     --       allows different distance types to have the same combination.
1632                     --+
1633                     IF (INSTR(l_charge_str, l_str) > 0) THEN
1634                         IF (p_basis <> 'DISTANCE') THEN
1635                             x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_DUPLICATE_BASIS_LINE',
1636                                                                 p_tokens => STRINGARRAY('BASIS','VEHICLE'),
1637                                                                 p_values => STRINGARRAY(p_basis,p_vehicle));
1638                             FTE_UTIL_PKG.Write_OutFile(p_msg         => x_error_msg,
1639                                                        p_module_name => l_module_name,
1640                                                        p_category    => 'D',
1641                                                        p_line_number => p_line_number);
1642 
1643                             x_status := 2;
1644                         END IF;
1645                         FTE_UTIL_PKG.Exit_Debug(l_module_name);
1646                         RETURN;
1647                     --
1648                     -- Check the stored string for the same combination of basis, vehicle, uom
1649                     -- If that combination exists, then
1650                     --    a. If basis is NOT distance, we have a duplicate line (ERROR).
1651                     --    b. If basis is distance, we have an error because the different
1652                     --       distance types must have the same minimum charge.
1653                     --
1654                     ELSIF (INSTR(l_charge_str, 'B:'||p_basis||':V:'||p_vehicle||':U:'||p_uom) > 0) THEN
1655                         IF (p_basis <> 'DISTANCE') THEN
1656                             x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_DUPLICATE_BASIS_LINE',
1657                                                                 p_tokens => STRINGARRAY('BASIS','VEHICLE'),
1658                                                                 p_values => STRINGARRAY(p_basis,p_vehicle));
1659                             FTE_UTIL_PKG.Write_OutFile( p_msg    => x_error_msg,
1660                                                         p_module_name => l_module_name,
1661                                                         p_category    => 'D',
1662                                                         p_line_number => p_line_number);
1663                             x_status := 2;
1664                         ELSE
1665                             x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_MULTIPLE_MIN_CHARGES',
1666                                                                 p_tokens => STRINGARRAY('BASIS','VEHICLE'),
1667                                                                 p_values => STRINGARRAY(p_basis,p_vehicle));
1668                             FTE_UTIL_PKG.Write_OutFile(p_msg         => x_error_msg,
1669                                                        p_module_name => l_module_name,
1670                                                        p_category    => 'D',
1671                                                        p_line_number => p_line_number);
1672                             x_status := 2;
1673                         END IF;
1674 
1675                         FTE_UTIL_PKG.Exit_Debug(l_module_name);
1676                         RETURN;
1677 
1678                     --
1679                     -- Check for the same combination of basis and vehicle.
1680                     -- If it exists, then we have an error because we have a
1681                     --    similar preceding line (basis, vehicle) with different uom.
1682                     --
1683                     ELSIF (INSTR(l_charge_str, 'B:' || p_basis || ':V:'||p_vehicle) > 0) THEN
1684                         x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name   => 'FTE_CAT_MULTIPLE_UOMS',
1685                                                             p_tokens => STRINGARRAY('BASIS','VEHICLE'),
1686                                                             p_values => STRINGARRAY(p_basis,p_vehicle));
1687                         FTE_UTIL_PKG.Write_OutFile(p_msg         => x_error_msg,
1688                                                    p_module_name => l_module_name,
1689                                                    p_category    => 'D',
1690                                                    p_line_number => p_line_number);
1691                          x_status := 2;
1692                          FTE_UTIL_PKG.Exit_Debug(l_module_name);
1693                          RETURN;
1694                     END IF;
1695                 END IF;
1696 
1697                 l_charge_str := l_charge_str || l_str;
1698                 Chart_Min_Charges(i) := l_charge_str;
1699 
1700             END IF;
1701         END LOOP;
1702 
1703         FTE_UTIL_PKG.Exit_Debug(l_module_name);
1704 
1705     EXCEPTION
1706         WHEN OTHERS THEN
1707             x_status := 2;
1708             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'UNEXPECTED ERROR in STORE_MIN_CHARGE', sqlerrm);
1709             FTE_UTIL_PKG.Exit_Debug(l_module_name);
1710 
1711     END STORE_MIN_CHARGE;
1712 
1713     --______________________________________________________________________________________--
1714     --                                                                                      --
1715     -- PROCEDURE: PROCESS_WKND_LAYOVR_CHARGES                                                --
1716     --                                                                                      --
1717     -- Purpose : week end lay over charge is a type os TL surcharge.                        --
1718     --           This is called from PROCESS_TL_SURCHARGES to process             --
1719     --           PROCESS_WKND_LAYOVR_CHARGES, if the type of charge is 'B'.                 --
1720     --                                                                                      --
1721     -- Parameters :                                                                         --
1722     --                                                                                      --
1723     -- IN     p_process_id,                                                                 --
1724     --        p_line_number                                                                 --
1725     -- OUT                                                                                  --
1726     --    x_linenum                                                                         --
1727     --    x_status,   the return status, -1 for success                                     --
1728     --                                        2 for failure.                                --
1729     --    x_error_msg, the corresponding error meassge,                                     --
1730     --                    if any exception occurs during the process.                       --
1731     --______________________________________________________________________________________--
1732 
1733     PROCEDURE PROCESS_WKND_LAYOVR_CHARGES(p_process_id  IN  NUMBER,
1734                                           x_linenum     IN  OUT NOCOPY NUMBER,
1735                                           p_line_number IN  NUMBER,
1736                                           x_error_msg   OUT NOCOPY VARCHAR2,
1737                                           x_status      OUT NOCOPY NUMBER) IS
1738     l_subtype               VARCHAR2(30);
1739     l_type                  VARCHAR2(30);
1740     l_break_type            VARCHAR2(30);
1741     l_description           VARCHAR2(300);
1742     l_context               VARCHAR2(50);
1743     l_attribute_value       VARCHAR2(50);
1744     l_attribute_type        VARCHAR2(50);
1745 
1746     l_rate_line_data        FTE_BULKLOAD_PKG.data_values_tbl;
1747     l_rate_line_block_tbl   FTE_BULKLOAD_PKG.block_data_tbl;
1748 
1749     l_module_name         CONSTANT VARCHAR2(100) := 'FTE.PLSQL.'||G_PKG_NAME||'.PROCESS_WKND_LAYOVR_CHARGES';
1750 
1751     BEGIN
1752         FTE_UTIL_PKG.Enter_Debug(l_module_name);
1753         x_status := -1;
1754 
1755         x_linenum := x_linenum + 1;
1756         l_description := 'Weekend Layover Charge: Line ' || x_linenum;
1757 
1758         IF(FTE_BULKLOAD_PKG.g_debug_on) THEN
1759             FTE_UTIL_PKG.Write_LogFile(l_module_name, l_description);
1760         END IF;
1761 
1762         l_type        := 'ACCESSORIAL_SURCHARGE';
1763         l_break_type  := 'POINT';
1764         l_subtype     := FTE_RTG_GLOBALS.G_C_WEEKEND_LAYOVER_CH;
1765 
1766         l_rate_line_data('ACTION')         := 'ADD'; --G_ACTION;
1767         l_rate_line_data('LINE_NUMBER')    := x_linenum;
1768         l_rate_line_data('DESCRIPTION')    := l_description;
1769         l_rate_line_data('VOLUME_TYPE')    := 'TOTAL_QUANTITY';
1770         l_rate_line_data('RATE_BREAK_TYPE'):= l_break_type;
1771         l_rate_line_data('SUBTYPE')        := l_subtype;
1772         l_rate_line_data('TYPE')           := l_type;
1773         l_rate_line_data('RATE_TYPE')      := 'FIXED';
1774         l_rate_line_data('UOM')            := g_unit_uom;
1775 
1776         l_rate_line_block_tbl(1) := l_rate_line_data;
1777 
1778         FTE_RATE_CHART_LOADER.PROCESS_RATE_LINE(p_block_header    => g_dummy_block_hdr_tbl,
1779                                                 p_block_data      => l_rate_line_block_tbl,
1780                                                 p_line_number     => p_line_number,
1781                                                 p_validate_column => FALSE,
1782                                                 x_status          => x_status,
1783                                                 x_error_msg       => x_error_msg);
1784         IF (x_status <> -1) THEN
1785             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'Error: ' || x_error_msg);
1786             FTE_UTIL_PKG.Exit_Debug(l_module_name);
1787             RETURN;
1788         END IF;
1789 
1790         --+
1791         -- add Rate Type Attribute
1792         --+
1793         l_attribute_type  := 'TL_RATE_TYPE';
1794         l_context         := FTE_RTG_GLOBALS.G_AX_TL_RATE_TYPE;
1795         l_attribute_value := FTE_RTG_GLOBALS.G_TL_RATE_TYPE_STOP;
1796 
1797         ADD_ATTRIBUTE (p_attribute_type      => l_attribute_type,
1798                        p_attribute_value     => l_attribute_value,
1799                        p_attribute_value_to  => NULL,
1800                        p_context             => l_context,
1801                        p_linenum             => x_linenum,
1802                        p_comp_operator       => '=',
1803                        p_process_id          => p_process_id,
1804                        p_line_number         => p_line_number,
1805                        x_error_msg           => x_error_msg,
1806                        x_status              => x_status);
1807 
1808         IF (x_status <> -1) THEN
1809             FTE_UTIL_PKG.Exit_Debug(l_module_name);
1810             RETURN;
1811         END IF;
1812 
1813         IF(FTE_BULKLOAD_PKG.g_debug_on) THEN
1814             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'Begin Create Breaks');
1815         END IF;
1816 
1817         CREATE_BREAKS (p_break_charges    => g_layovr_charges,
1818                        p_break_limits     => g_layovr_breaks,
1819                        p_break_start      => Fnd_Number.Canonical_To_Number('0'),
1820                        p_break_gap        => Fnd_Number.Canonical_To_Number('0'),
1821                        p_rate_type        => 'LUMPSUM',
1822                        p_attribute_type   => 'TL_WEEKEND_LAYOVER_MILEAGE',
1823                        p_process_id       => p_process_id,
1824                        x_linenum          => x_linenum,
1825                        x_error_msg        => x_error_msg,
1826                        x_status           => x_status);
1827 
1828         g_layovr_breaks.DELETE;
1829         g_layovr_charges.DELETE;
1830 
1831         FTE_UTIL_PKG.Exit_Debug(l_module_name);
1832     EXCEPTION
1833         WHEN OTHERS THEN
1834             x_status := 2;
1835             FTE_UTIL_PKG.Exit_Debug(l_module_name);
1836             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'UNEXPECTED ERROR in PROCESS_WKND_LAYOVR_CHARGES Error',sqlerrm);
1837 
1838     END PROCESS_WKND_LAYOVR_CHARGES;
1839 
1840     --_________________________________________________________________________________--
1841     --
1842     -- PROCEDURE: SUBMIT_TL_CHART
1843     --
1844     -- PURPOSE: Calls FTE_RATE_CHART_LOADER.SUBMIT_QP_PROCESS, to popupulate the interface
1845     --          tables and call corresponginf QP API. The values for headers,lines, attribs,
1846     --          qualifiers have already been stored through the validation procedures.
1847     --          For instance, FTE.VALIDATION_PKG.VALIDATE_RATE_CHART stores the header info
1848     --          after all validations for header in temporary pl/sql tables.
1849     --          Inspite of name, validation procedures stores the data in temp pl/sql tables.
1850     --
1851     -- PARAMETERS
1852     --
1853     -- OUT
1854     --  x_status , -1 return status,
1855     --             > 0, otherwise
1856     --_________________________________________________________________________________--
1857 
1858     PROCEDURE SUBMIT_TL_CHART (x_status     OUT NOCOPY NUMBER,
1859                    x_error_msg  OUT NOCOPY VARCHAR2) IS
1860 
1861     l_module_name CONSTANT VARCHAR2(100) := 'FTE.PLSQL.' || G_PKG_NAME || '.SUBMIT_TL_CHART';
1862 
1863     l_lane_loaded          BOOLEAN;
1864     l_chart_name           VARCHAR2(60);
1865     l_carrier_name         VARCHAR2(60);
1866     l_process_id           NUMBER;
1867     l_lane_ids             NUMBER_TAB;
1868     l_lane_id              NUMBER;
1869     l_list_header_id       NUMBER;
1870     l_start_date           VARCHAR2(20);
1871     l_end_date             VARCHAR2(20);
1872     l_service_level        VARCHAR2(30);
1873     l_chart_type           VARCHAR2(30);
1874     l_count                NUMBER;
1875     l_linenum              NUMBER;
1876     l_lane_service         VARCHAR2(30);
1877 
1878     -- For Facility Modifiers
1879     l_currency             VARCHAR2(30);
1880     l_prc_param_ids        STRINGARRAY;
1881     l_prc_param_values     STRINGARRAY;
1882     l_parameter_id         NUMBER;
1883     l_rate_basis           VARCHAR2(30);
1884     l_rate_basis_uom       VARCHAR2(30);
1885     l_modifier_id          NUMBER;
1886     l_currency_tbl     FTE_RATE_CHART_PKG.LH_CURRENCY_CODE_TAB;
1887     l_name         FTE_RATE_CHART_PKG.LH_NAME_TAB;
1888 
1889     l_carrier_name_temp	VARCHAR2(60);
1890     l_service_level_temp	VARCHAR2(30);
1891     l_linenum_temp	NUMBER;
1892     l_process_id_temp	NUMBER;
1893 
1894     p_line_number         NUMBER := 0;
1895 
1896     BEGIN
1897 
1898         FTE_UTIL_PKG.Enter_Debug(l_module_name);
1899         x_status := -1;
1900 
1901         IF (g_unit_uom IS NULL) THEN
1902 
1903             g_unit_uom := GET_GLOBAL_UNIT_UOM (x_status, x_error_msg);
1904 
1905             IF (x_status <> -1) THEN
1906                 FTE_UTIL_PKG.Write_LogFile(l_module_name, 'ERROR Getting Global UOM' || x_error_msg);
1907                 FTE_UTIL_PKG.Exit_Debug(l_module_name);
1908                 RETURN;
1909             END IF;
1910 
1911         END IF;
1912 
1913    IF (g_layovr_breaks.exists(1)) THEN
1914      Get_Chart_Data(p_chart_name    => g_chart_name,
1915                     p_currency      => l_currency,
1916                     p_chart_type    => l_chart_type,
1917                     x_carrier_name  => l_carrier_name_temp,
1918                     x_service_level => l_service_level_temp,
1919                     x_cur_line      => l_linenum_temp,
1920                     x_job_id        => l_process_id_temp,
1921 		    p_line_number   => null,
1922                     x_error_msg     => x_error_msg,
1923                     x_status        => x_status);
1924 
1925      IF (l_carrier_name_temp IS NULL) THEN
1926        x_status := 2;
1927        x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_NO_RC');
1928        FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name => l_module_name,
1929                  		  p_msg   => x_error_msg,
1930                  		  p_category    => 'D');
1931        FTE_UTIL_PKG.Exit_Debug(l_module_name);
1932        RETURN;
1933      END IF;
1934 
1935      IF (g_debug_on) THEN
1936         FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'l_name', g_chart_name);
1937         FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'l_process_id', l_process_id_temp);
1938         FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'l_service_level', l_service_level_temp);
1939 	FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, '--------Begin Process_Weekend_Layover_Charges');
1940      END IF;
1941 
1942      Process_Wknd_Layovr_Charges (p_process_id  => l_process_id_temp,
1943                                   x_linenum     => l_linenum_temp,
1944 				  p_line_number	=> null,
1945                                   x_error_msg   => x_error_msg,
1946                                   x_status      => x_status );
1947      IF (g_debug_on) THEN
1948         FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, '--------End Process_Weekend_Layover_Charges with status :' || x_status);
1949      END IF;
1950 
1951      Set_Chart_Line(g_chart_name, l_linenum_temp, x_status);
1952 
1953      IF (x_status <> -1) THEN
1954        FTE_UTIL_PKG.Exit_Debug(l_module_name);
1955        RETURN;
1956      END IF;
1957 
1958    END IF;
1959 
1960 
1961     IF (instr(g_chart_name, 'MOD_') > 0 AND g_action <> 'DELETE') THEN
1962       Get_Chart_Data(p_chart_name    => g_chart_name,
1963                      p_currency      => l_currency,
1964                      p_chart_type    => l_chart_type,
1965                      x_carrier_name  => l_carrier_name_temp,
1966                      x_service_level => l_service_level_temp,
1967                      x_cur_line      => l_linenum_temp,
1968                      x_job_id        => l_process_id_temp,
1969 		     p_line_number   => null,
1970                      x_error_msg     => x_error_msg,
1971                      x_status        => x_status);
1972 
1973       IF (g_debug_on) THEN
1974         FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'action: ', g_action);
1975         FTE_UTIL_PKG.WRITE_LOGFILE(l_module_name, 'linenum: ', l_linenum_temp);
1976       END IF;
1977 
1978       IF (l_linenum_temp = 0 OR x_status <> -1) THEN
1979         x_status := 2;
1980         x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_UI_NO_LINES',
1981 					    p_tokens => STRINGARRAY('TYPE'),
1982 					    p_values => STRINGARRAY(FTE_UTIL_PKG.GET_MSG('FTE_TL_ACCESSORIALS')));
1983         FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name => l_module_name,
1984                  		   p_msg   => x_error_msg,
1985                  		   p_category    => 'D');
1986         FTE_UTIL_PKG.Exit_Debug(l_module_name);
1987         RETURN;
1988       END IF;
1989     END IF;
1990 
1991         --+
1992         -- Process any remaining weekday layover charges.
1993         --+
1994         IF (g_layovr_breaks.COUNT > 0) THEN
1995 
1996             GET_CHART_DATA( p_chart_name    => g_chart_name,
1997                             p_currency      => l_currency,
1998                             p_chart_type    => l_chart_type,
1999                             x_carrier_name  => l_carrier_name,
2000                             x_service_level => l_service_level,
2001                             x_cur_line      => l_linenum,
2002                             x_job_id        => l_process_id,
2003                             p_line_number   => p_line_number,
2004                             x_error_msg     => x_error_msg,
2005                             x_status        => x_status);
2006 
2007             IF (l_linenum = 0 OR x_status <> -1) THEN
2008                 x_status := 2;
2009                 FTE_UTIL_PKG.Write_LogFile(l_module_name, 'ERROR BREAK: No Rate Chart Name Previously Defined');
2010             END IF;
2011 
2012             IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
2013                 FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_name         ', g_chart_name);
2014                 FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_process_id   ', l_process_id);
2015                 FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_service_level', l_service_level);
2016             END IF;
2017 
2018             PROCESS_WKND_LAYOVR_CHARGES ( p_process_id  => l_process_id,
2019                                           x_linenum     => l_linenum,
2020                                           p_line_number => p_line_number,
2021                                           x_error_msg   => x_error_msg,
2022                                           x_status      => x_status );
2023             IF (x_status <> -1) THEN
2024                 FTE_UTIL_PKG.Write_LogFile(l_module_name, 'Returned with Error from PROCESS_WKND_LAYOVR_CHARGES',x_error_msg );
2025             END IF;
2026 
2027         END IF;
2028 
2029         --+
2030         -- For all previously created rate charts, we need to create a minimum charge
2031         -- modifier for the rate chart, if minimum charges exist.
2032         --+
2033 
2034         l_count := Chart_Names.COUNT;
2035         FOR i IN 1..l_count LOOP
2036             IF (Chart_Min_Charges.EXISTS(i)) THEN
2037                 CREATE_MINCHARGE_MODIFIER(p_chart_name    => Chart_Names(i),
2038                                           p_service_level => Chart_Service_Levels(i),
2039                                           p_carrier_name  => Chart_Carriers(i),
2040                                           p_currency      => Chart_Currencies(i),
2041                                           p_charge_data   => Chart_Min_Charges(i),
2042                                           x_mod_name      => l_chart_name,
2043                                           p_line_number   => p_line_number,
2044                                           x_status        => x_status,
2045                                           x_error_msg     => x_error_msg);
2046 
2047                 IF (x_status <> -1) THEN
2048                     FTE_UTIL_PKG.Write_LogFile(l_module_name, 'Returned Error from CREATE_MINCHARGE_MODIFIER', x_error_msg );
2049                     FTE_UTIL_PKG.Exit_Debug(l_module_name);
2050                     RETURN;
2051                 ELSE
2052                     Link_ChartNames(Link_ChartNames.COUNT+1) := Chart_Names(i);
2053                     Link_ModifierNames(Link_ModifierNames.COUNT+1) := l_chart_name;
2054                 END IF;
2055             END IF;
2056         END LOOP;
2057 
2058         --+
2059         -- Now Insert All rate chart data into the QP_INTERFACE tables.
2060         -- Insert_qp_interface tables of rate chart package  should not call QP_MOD_LOADER_PUB.LOAD_MOD_LIST(p
2061         -- depending on some parameters.
2062         --+
2063         FTE_RATE_CHART_LOADER.SUBMIT_QP_PROCESS(p_qp_call   => FALSE,
2064                                                 x_error_msg => x_error_msg,
2065                                                 x_status    => x_status);
2066 
2067         IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
2068             FTE_UTIL_PKG.Write_LogFile(l_module_name,'Return Status from FTE_RATE_CHART_LOADER.SUBMIT_QP_PROCESS', x_status);
2069             FTE_UTIL_PKG.Write_LogFile(l_module_name,'Return Message from FTE_RATE_CHART_LOADER.SUBMIT_QP_PROCESS', x_error_msg);
2070         END IF;
2071 
2072         IF (x_status <> -1) THEN
2073             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'Return status from  SUBMIT_QP_PROCESS', x_status );
2074             FTE_UTIL_PKG.Exit_Debug(l_module_name);
2075             RETURN;
2076         END IF;
2077 
2078         FND_PROFILE.PUT('QP_PRICING_TRANSACTION_ENTITY', 'LOGSTX');
2079         FND_PROFILE.PUT('QP_SOURCE_SYSTEM_CODE', 'FTE');
2080 
2081         IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
2082             FTE_UTIL_PKG.Write_LogFile(l_module_name,'Chart_Process_Ids.COUNT ', Chart_Process_Ids.COUNT);
2083         END IF;
2084 
2085         FOR i IN 1..Chart_Process_Ids.COUNT LOOP
2086             l_chart_name    := Chart_Names(i);
2087             l_carrier_name  := Chart_Carriers(i);
2088             l_process_id    := Chart_Process_Ids(i);
2089             l_service_level := Chart_Service_Levels(i);
2090             l_chart_type    := Chart_Types(i);
2091             l_currency      := Chart_Currencies(i);
2092 
2093             IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
2094                 FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_chart_name   ', l_chart_name);
2095                 FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_carrier_name ', l_carrier_name);
2096                 FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_process_id   ', l_process_id);
2097                 FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_service_level', l_service_level);
2098                 FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_chart_type   ', l_chart_type);
2099                 FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_currency     ', l_currency);
2100             END IF;
2101 
2102             IF (l_chart_type in('TL_RATE_CHART', 'FAC_RATE_CHART')) THEN
2103                 l_name(1) := l_chart_name;
2104                 l_currency_tbl(1) := l_currency;
2105                 FTE_RATE_CHART_PKG.QP_API_CALL(p_chart_type     => l_chart_type,
2106                                                p_process_id => l_process_id,
2107                                                p_name       => l_name,
2108                                                p_currency   => l_currency_tbl,
2109                                                x_status     => x_status,
2110                                                x_error_msg  => x_error_msg);
2111 
2112                 IF (x_status <> -1) THEN
2113                           FTE_UTIL_PKG.Exit_Debug(l_module_name);
2114                           RETURN;
2115                 ELSE
2116 
2117                     --+
2118                     -- We need to link the rate chart to any modifiers that
2119                     -- may be attached to it, before we upload the modifiers.
2120                     -- (TL_RATE_CHART => MIN_MODIFIER), (FAC_RATE_CHART => FAC_MODIFIER)
2121                     --+
2122 
2123                     LINK_RC_MODIFIERS(p_chart_name => l_chart_name,
2124                                       x_error_msg  => x_error_msg,
2125                                       x_status     => x_status);
2126 
2127                     IF (x_status <> -1) THEN
2128                         FTE_UTIL_PKG.Write_LogFile(l_module_name, x_error_msg);
2129                         FTE_UTIL_PKG.Exit_Debug(l_module_name);
2130                         RETURN;
2131                     END IF;
2132                 END IF;
2133 
2134             ELSIF (l_chart_type IN ('TL_MODIFIER', 'FAC_MODIFIER', 'FTE_MODIFIER', 'MIN_MODIFIER')) THEN
2135                 l_name(1) := l_chart_name;
2136                 l_currency_tbl(1) := l_currency;
2137                 FTE_RATE_CHART_PKG.QP_API_CALL(p_chart_type     => l_chart_type,
2138                                                p_process_id => l_process_id,
2139                                                p_name       => l_name,
2140                                                p_currency   => l_currency_tbl,
2141                                                x_status     => x_status,
2142                                                x_error_msg  => x_error_msg);
2143 
2144                 IF (x_status <> -1) THEN
2145                      FTE_UTIL_PKG.Exit_Debug(l_module_name);
2146                      RETURN;
2147                 END IF;
2148 
2149             ELSE
2150                 x_status := 2;
2151                 FTE_UTIL_PKG.Write_LogFile(l_module_name, 'Unknown Chart Type ' || l_chart_type);
2152                 FTE_UTIL_PKG.Write_LogFile(l_module_name, 'Could Not Load The Rate Chart ' || l_chart_name);
2153                 FTE_UTIL_PKG.Exit_Debug(l_module_name);
2154                 RETURN;
2155             END IF;
2156 
2157             IF (i = 1) THEN
2158                 FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name => l_module_name,
2159                                            p_msg     => 'FTE_RATECHARTS_LOADED',
2160                                            p_category    => NULL);
2161             END IF;
2162 
2163             FTE_UTIL_PKG.WRITE_OUTFILE(p_module_name => l_module_name,
2164                                        p_msg         => l_chart_name,
2165                                        p_category    => NULL);
2166 
2167             IF (l_chart_type = 'TL_RATE_CHART') THEN
2168 
2169                 --+
2170                 -- Update any lanes associated with this loaded rate chart.
2171                 --+
2172                 l_lane_loaded := IS_LANE_LOADED( p_chart_name    => l_chart_name,
2173                                                  p_carrier_name  => l_carrier_name,
2174                                                  p_service_level => l_service_level,
2175                                                  p_line_number   => p_line_number,
2176                                                  x_lane_ids      => l_lane_ids,
2177                                                  x_error_msg     => x_error_msg,
2178                                                  x_status        => x_status);
2179 
2180                 IF (x_status <> -1) THEN
2181                     FTE_UTIL_PKG.Write_LogFile(l_module_name, 'Error In Lane Status');
2182                     FTE_UTIL_PKG.Exit_Debug(l_module_name);
2183                     RETURN;
2184                 END IF;
2185 
2186                 IF(FTE_BULKLOAD_PKG.g_debug_on) THEN
2187                     FTE_UTIL_PKG.Write_LogFile(l_module_name, 'Found ' || l_lane_ids.COUNT || ' lanes matching rate chart');
2188                 END IF;
2189 
2190                 IF (l_lane_loaded) THEN
2191 
2192                     IF(FTE_BULKLOAD_PKG.g_debug_on) THEN
2193                         FTE_UTIL_PKG.Write_LogFile(l_module_name, 'Updating Existing Lanes with Rate Chart Info');
2194                     END IF;
2195 
2196                     BEGIN
2197 
2198                         SELECT
2199                           lh.list_header_id,
2200                           b.start_date_active,
2201                           b.end_date_active
2202                         INTO
2203                           l_list_header_id,
2204                           l_start_date,
2205                           l_end_date
2206                         FROM
2207                           qp_list_headers_tl lh,
2208                           qp_list_headers_b b,
2209                           qp_qualifiers q
2210                         WHERE
2211                           lh.list_header_id = b.list_header_id AND
2212                           lh.list_header_id = q.list_header_id AND
2213                           q.qualifier_context = 'PARTY' AND
2214                           q.qualifier_attr_value = Fnd_Number.Number_To_Canonical(g_carrier_id) AND
2215                           lh.name = l_chart_name AND
2216                           lh.language = userenv('LANG');
2217 
2218                     EXCEPTION
2219                         WHEN NO_DATA_FOUND THEN
2220                             l_list_header_id := NULL;
2221                             x_status := 2;
2222                             x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_PRICE_NAME_MISSING');
2223                             FTE_UTIL_PKG.Write_OutFile(p_msg         => x_error_msg,
2224                                                        p_module_name => l_module_name,
2225                                                        p_category    => 'D',
2226                                                        p_line_number => p_line_number);
2227                             FTE_UTIL_PKG.Exit_Debug(l_module_name);
2228                             RETURN;
2229                     END;
2230 
2231                     IF(FTE_BULKLOAD_PKG.g_debug_on) THEN
2232                         FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_list_header_id', l_list_header_id);
2233                     END IF;
2234 
2235                     --+
2236                     -- Update the lane with the rate chart ID:
2237                     --+
2238                     FOR j IN 1..l_lane_ids.COUNT LOOP
2239                         BEGIN
2240                             IF(FTE_BULKLOAD_PKG.g_debug_on) THEN
2241                                 FTE_UTIL_PKG.Write_LogFile(l_module_name, 'lane id('|| j|| ')',l_lane_ids(j));
2242                             END IF;
2243 
2244                             INSERT INTO FTE_LANE_RATE_CHARTS (LANE_ID,
2245                                                               LIST_HEADER_ID,
2246                                                               START_DATE_ACTIVE,
2247                                                               END_DATE_ACTIVE,
2248                                                               CREATED_BY,
2249                                                               CREATION_DATE,
2250                                                               LAST_UPDATED_BY,
2251                                                               LAST_UPDATE_DATE,
2252                                                               LAST_UPDATE_LOGIN)
2253                                                       VALUES (l_lane_ids(j),
2254                                                               l_list_header_id,
2255                                                               l_start_date,
2256                                                               l_end_date,
2257                                                               FND_GLOBAL.USER_ID,
2258                                                               G_CURDATE,
2259                                                               FND_GLOBAL.USER_ID,
2260                                                               G_CURDATE,
2261                                                               FND_GLOBAL.USER_ID);
2262                         EXCEPTION
2263                             WHEN OTHERS THEN
2264                                  x_status := 2;
2265                                  FTE_UTIL_PKG.Write_LogFile(l_module_name, sqlerrm);
2266                                  FTE_UTIL_PKG.Exit_Debug(l_module_name);
2267                           END;
2268 
2269                         BEGIN
2270                             IF(FTE_BULKLOAD_PKG.g_debug_on) THEN
2271                                 FTE_UTIL_PKG.Write_LogFile(l_module_name, 'Updating Fte_Lanes with service level ', l_service_level);
2272                             END IF;
2273 
2274                             UPDATE fte_lanes
2275                             SET service_detail_flag ='Y',
2276                                 service_type_code = l_service_level,
2277                                 lane_type = NULL,
2278                                 LAST_UPDATED_BY = FND_GLOBAL.USER_ID,
2279                                 LAST_UPDATE_DATE = SYSDATE,
2280                                 LAST_UPDATE_LOGIN = FND_GLOBAL.USER_ID
2281                             WHERE lane_id = l_lane_ids(j);
2282 
2283                         EXCEPTION
2284                             WHEN OTHERS THEN
2285                                 x_status := 2;
2286                                 FTE_UTIL_PKG.Write_LogFile(l_module_name, sqlerrm);
2287                                 FTE_UTIL_PKG.Exit_Debug(l_module_name);
2288                         END;
2289                     END LOOP;
2290 
2291                 END IF;
2292 
2293             ELSIF (l_chart_type = 'FAC_MODIFIER') THEN
2294 
2295                 IF(FTE_BULKLOAD_PKG.g_debug_on) THEN
2296                     FTE_UTIL_PKG.Write_LogFile(l_module_name, 'Postprocessing Facility Modifier');
2297                 END IF;
2298 
2299                 BEGIN
2300 
2301                     SELECT
2302                       modc.list_header_id,
2303                       Fnd_Number.Canonical_To_Number(qual.qualifier_attr_value)
2304                     INTO
2305                       l_modifier_id,
2306                       l_list_header_id
2307                     FROM
2308                       qp_list_headers_tl modc,
2309                       qp_list_headers_b b,
2310                       qp_qualifiers  qual
2311                     WHERE
2312                       modc.list_header_id = b.list_header_id AND
2313                       qual.list_header_id = modc.list_header_id AND
2314                       qual.qualifier_context = 'MODLIST' AND
2315                       qual.qualifier_attribute = 'QUALIFIER_ATTRIBUTE4' AND
2316                       modc.name = l_chart_name AND
2317                       modc.language = userenv('LANG');
2318 
2319                 EXCEPTION
2320 
2321                     WHEN NO_DATA_FOUND THEN
2322                         l_list_header_id := NULL;
2323                         x_status := 2;
2324                         x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_PRICELIST_INVALID');
2325                         FTE_UTIL_PKG.Write_OutFile( p_msg         => x_error_msg,
2326                                                     p_module_name => l_module_name,
2327                                                     p_category    => 'D',
2328                                                     p_line_number => p_line_number);
2329                         FTE_UTIL_PKG.Exit_Debug(l_module_name);
2330                         RETURN;
2331                 END;
2332 
2333                 GET_FACILITY_RATE_BASIS(p_chart_name  =>  l_chart_name,
2334                                         x_rate_basis  =>  l_rate_basis,
2335                                         x_uom         =>  l_rate_basis_uom,
2336                                         x_status      =>  x_status,
2337                                         x_error_msg   =>  x_error_msg);
2338 
2339                 IF (x_status <> -1) THEN
2340                     FTE_UTIL_PKG.Write_LogFile(l_module_name, 'Error In Get_Facility_Rate_Basis', x_error_msg);
2341                     FTE_UTIL_PKG.Exit_Debug(l_module_name);
2342                     RETURN;
2343                 END IF;
2344 
2345                 l_prc_param_ids    := STRINGARRAY(57, 58, 59, 60);
2346                 l_prc_param_values := STRINGARRAY(l_rate_basis, l_rate_basis_uom, l_list_header_id, l_currency);
2347 
2348                 --+
2349                 -- Insert Facility Data into FTE_PRC_PARAMETERS
2350                 --+
2351                 BEGIN
2352                     IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
2353                         FTE_UTIL_PKG.Write_LogFile(l_module_name, 'Inserting into FTE_PRC_PARAMETERS');
2354                         FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_chart_name    ', l_chart_name);
2355                         FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_rate_basis    ', l_rate_basis);
2356                         FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_rate_basis_uom', l_rate_basis_uom);
2357                         FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_currency      ', l_currency);
2358                         FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_modifier_id   ', l_modifier_id);
2359                         FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_list_header_id', l_list_header_id);
2360                     END IF;
2361 
2362                     FORALL m IN 1..l_prc_param_ids.COUNT
2363                         INSERT INTO FTE_PRC_PARAMETERS( PARAMETER_INSTANCE_ID,
2364                                                         PARAMETER_ID,
2365                                                         VALUE_FROM,
2366                                                         UOM_CODE,
2367                                                         CURRENCY_CODE,
2368                                                         CREATION_DATE,
2369                                                         CREATED_BY,
2370                                                         LAST_UPDATE_DATE,
2371                                                         LAST_UPDATED_BY,
2372                                                         LIST_HEADER_ID)
2373                                                 VALUES( fte_prc_parameters_s.NEXTVAL,
2374                                                         l_prc_param_ids(m),
2375                                                         l_prc_param_values(m),
2376                                                         l_rate_basis_uom,
2377                                                         l_currency,
2378                                                         sysdate,
2379                                                         FND_GLOBAL.User_Id,
2380                                                         sysdate,
2381                                                         FND_GLOBAL.User_Id,
2382                                                         l_modifier_id);
2383                 EXCEPTION
2384                     WHEN OTHERS THEN
2385                         x_status := 2;
2386                         x_error_msg := sqlerrm;
2387                         FTE_UTIL_PKG.Write_LogFile(l_module_name, 'UNEXP. ERROR Inserting Prc_Parameters', sqlerrm);
2388                         FTE_UTIL_PKG.Exit_Debug(l_module_name);
2389                 END;
2390             END IF; -- End Processing Different Chart Types
2391 
2392         END LOOP;
2393 
2394 
2395         RESET_ALL;
2396         FTE_UTIL_PKG.Exit_Debug(l_module_name);
2397 
2398     EXCEPTION
2399         WHEN OTHERS THEN
2400             x_status := 2;
2401             x_error_msg := sqlerrm;
2402             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'UNEXP ERROR in SUBMIT_TL_CHART', sqlerrm);
2403             FTE_UTIL_PKG.Exit_Debug(l_module_name);
2404 
2405     END SUBMIT_TL_CHART;
2406 
2407     --_________________________________________________________________________________--
2408     --
2409     -- PROCEDURE: PROCESS_FUEL_CHARGES
2410     --
2411     -- PURPOSE  To processs the Fuel charges in the file. called by PROCESS_TL_SURCHAGRES.
2412     --
2413     -- PARAMETERS
2414     -- IN
2415     --    p_charge
2416     --    p_process_id
2417     --    p_line_number
2418     --
2419     --  OUT
2420     --    x_status,  the return status, -1 for success
2421     --                                   2 for failure.
2422     --    x_error_msg, the corresponding error message,
2423     --                 if any exception occurs during the process.
2424     --_________________________________________________________________________________--
2425 
2426     PROCEDURE PROCESS_FUEL_CHARGES(p_charge       IN  NUMBER,
2427                                    p_process_id   IN  NUMBER,
2428                                    p_line_number  IN  NUMBER,
2429                                    x_linenum      IN  OUT NOCOPY  NUMBER,
2430                                    x_error_msg    OUT NOCOPY      VARCHAR2,
2431                                    x_status       OUT NOCOPY      NUMBER) IS
2432 
2433     l_description      VARCHAR2(300);
2434     l_type             VARCHAR2(30);
2435     l_subtype          VARCHAR2(50);
2436     l_attribute_value  VARCHAR2(50);
2437     l_attribute_type   VARCHAR2(50);
2438     l_context          VARCHAR2(30);
2439 
2440     l_rate_line_data      FTE_BULKLOAD_PKG.data_values_tbl;
2441     l_rate_line_block_tbl FTE_BULKLOAD_PKG.block_data_tbl;
2442 
2443     l_module_name      CONSTANT VARCHAR2(100) := 'FTE.PLSQL.'||G_PKG_NAME||'.PROCESS_FUEL_CHARGES';
2444 
2445     BEGIN
2446         FTE_UTIL_PKG.Enter_Debug(l_module_name);
2447         x_status := -1;
2448 
2449         x_linenum := x_linenum + 1;
2450         l_description := 'Fuel Surcharge Line ' || x_linenum;
2451 
2452         IF(FTE_BULKLOAD_PKG.g_debug_on) THEN
2453             FTE_UTIL_PKG.Write_LogFile(l_module_name, l_description);
2454         END IF;
2455 
2456         l_type := 'ACCESSORIAL_SURCHARGE';
2457         l_subtype  := FTE_RTG_GLOBALS.G_C_FUEL_CH;
2458 
2459         l_rate_line_data('ACTION')      := G_ACTION;
2460         l_rate_line_data('LINE_NUMBER') := x_linenum;
2461         l_rate_line_data('DESCRIPTION') := l_description;
2462         l_rate_line_data('VOLUME_TYPE') := 'TOTAL_QUANTITY';
2463         l_rate_line_data('SUBTYPE')     := l_subtype;
2464         l_rate_line_data('TYPE')        := l_type;
2465         l_rate_line_data('PERCENTAGE')  := Fnd_Number.Number_To_Canonical(p_charge);
2466         l_rate_line_data('UOM')         := g_unit_uom;
2467 
2468         l_rate_line_block_tbl(1) := l_rate_line_data;
2469 
2470         FTE_RATE_CHART_LOADER.PROCESS_RATE_LINE(p_block_header  => g_dummy_block_hdr_tbl,
2471                                                 p_block_data    => l_rate_line_block_tbl,
2472                                                 p_line_number   => p_line_number,
2473                                                 p_validate_column => FALSE,
2474                                                 x_status        => x_status,
2475                                                 x_error_msg     => x_error_msg);
2476 
2477         l_rate_line_data.DELETE;
2478         l_rate_line_block_tbl.DELETE;
2479 
2480         IF (x_status <> -1) THEN
2481             FTE_UTIL_PKG.Write_LogFile(l_module_name, x_error_msg);
2482             FTE_UTIL_PKG.Exit_Debug(l_module_name);
2483             RETURN;
2484         END IF;
2485 
2486         l_context         := FTE_RTG_GLOBALS.G_AX_TL_RATE_TYPE;
2487         l_attribute_type  := 'TL_RATE_TYPE';
2488         l_attribute_value := FTE_RTG_GLOBALS.G_TL_RATE_TYPE_LOAD;
2489 
2490         ADD_ATTRIBUTE(p_attribute_type      => l_attribute_type,
2491                       p_attribute_value     => l_attribute_value,
2492                       p_attribute_value_to  => NULL,
2493                       p_context             => l_context,
2494                       p_comp_operator       => NULL,
2495                       p_linenum             => x_linenum,
2496                       p_process_id          => p_process_id,
2497                       p_line_number         => p_line_number,
2498                       x_error_msg           => x_error_msg,
2499                       x_status              => x_status);
2500 
2501         IF (x_status <> -1) THEN
2502             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'Error: ' || x_error_msg);
2503             FTE_UTIL_PKG.Exit_Debug(l_module_name);
2504             RETURN;
2505         END IF;
2506 
2507         FTE_UTIL_PKG.Exit_Debug(l_module_name);
2508     EXCEPTION
2509         WHEN OTHERS THEN
2510             x_status := 2;
2511             FTE_UTIL_PKG.Exit_Debug(l_module_name);
2512             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'UNEXPECTED ERROR in PROCESS_FUEL_CHARGES', sqlerrm);
2513 
2514     END PROCESS_FUEL_CHARGES;
2515 
2516     --_________________________________________________________________________________--
2517     --
2518     -- PROCEDURE: PROCESS_REGION_CHARGES
2519     --
2520     -- Purpose
2521     --
2522     -- IN Parameters
2523     --
2524     --  OUT
2525     --    x_status,  the return status, -1 for success
2526     --                                   2 for failure.
2527     --    x_error_msg, the corresponding error message,
2528     --                 if any exception occurs during the process.
2529     --_________________________________________________________________________________--
2530 
2531     PROCEDURE PROCESS_REGION_CHARGES(p_region_type IN  VARCHAR2,
2532                                      p_region_info IN  WSH_REGIONS_SEARCH_PKG.REGION_REC,
2533                                      p_charge      IN  NUMBER,
2534                                      p_process_id  IN  NUMBER,
2535                                      p_line_number IN  NUMBER,
2536                                      p_region_id   IN  NUMBER,
2537                                      x_linenum     IN  OUT NOCOPY NUMBER,
2538                                      x_error_msg   OUT NOCOPY VARCHAR2,
2539                                      x_status      OUT NOCOPY NUMBER) IS
2540     l_description      VARCHAR2(300);
2541     l_zone_id          NUMBER;
2542     l_type             VARCHAR2(30);
2543     l_subtype          VARCHAR2(50);
2544     l_attribute_value  VARCHAR2(50);
2545     l_attribute_type   VARCHAR2(50);
2546     l_context          VARCHAR2(30);
2547 
2548     l_rate_line_data         FTE_BULKLOAD_PKG.data_values_tbl;
2549     l_rate_line_block_tbl    FTE_BULKLOAD_PKG.block_data_tbl;
2550 
2551     l_module_name    CONSTANT VARCHAR2(100) := 'FTE.PLSQL.'||G_PKG_NAME||'.PROCESS_REGION_CHARGES';
2552 
2553     BEGIN
2554         FTE_UTIL_PKG.Enter_Debug(l_module_name);
2555         x_status := -1;
2556 
2557         IF (p_region_id IS NOT NULL) THEN
2558             l_zone_id := p_region_id;
2559         ELSE
2560             l_zone_id := FTE_REGION_ZONE_LOADER.GET_REGION_ID(p_region_info => p_region_info);
2561         END IF;
2562 
2563         IF (l_zone_id IS NULL OR l_zone_id = -1) THEN
2564             x_status := 2;
2565             x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_REGION_NOT_FOUND');
2566             FTE_UTIL_PKG.Write_OutFile(p_msg          => x_error_msg,
2567                                        p_module_name => l_module_name,
2568                                        p_category    => 'D',
2569                                        p_line_number => p_line_number);
2570             FTE_UTIL_PKG.Exit_Debug(l_module_name);
2571             RETURN;
2572         END IF;
2573 
2574         x_linenum := x_linenum + 1;
2575         l_description := p_region_type || ' Surcharge Line ' || x_linenum;
2576 
2577         IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
2578             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'Zone Id', l_zone_id);
2579             FTE_UTIL_PKG.Write_LogFile(l_module_name, l_description);
2580         END IF;
2581 
2582 
2583         l_type := 'ACCESSORIAL_SURCHARGE';
2584 
2585         IF (p_region_type = 'ORIGIN') THEN
2586             l_subtype  := FTE_RTG_GLOBALS.G_C_ORIGIN_SURCHRG;
2587         ELSIF (p_region_type = 'DESTINATION') THEN
2588             l_subtype  := FTE_RTG_GLOBALS.G_C_DESTINATION_SURCHRG;
2589         END IF;
2590 
2591         l_rate_line_data('ACTION')     := G_ACTION;
2592         l_rate_line_data('LINE_NUMBER'):= x_linenum;
2593         l_rate_line_data('DESCRIPTION'):= l_description;
2594         l_rate_line_data('VOLUME_TYPE'):= 'TOTAL_QUANTITY';
2595         l_rate_line_data('SUBTYPE')    := l_subtype;
2596         l_rate_line_data('TYPE')       := l_type;
2597         l_rate_line_data('FIXED_RATE') := Fnd_Number.Number_To_Canonical(p_charge);
2598         l_rate_line_data('UOM')        := g_unit_uom;
2599 
2600         l_rate_line_block_tbl(1) := l_rate_line_data;
2601 
2602         FTE_RATE_CHART_LOADER.PROCESS_RATE_LINE(p_block_header  => g_dummy_block_hdr_tbl,
2603                                                 p_block_data    => l_rate_line_block_tbl,
2604                                                 p_line_number   => p_line_number,
2605                                                 p_validate_column => FALSE,
2606                                                 x_status        => x_status,
2607                                                 x_error_msg     => x_error_msg);
2608         l_rate_line_data.DELETE;
2609         l_rate_line_block_tbl.DELETE;
2610 
2611         IF (x_status <> -1) THEN
2612             FTE_UTIL_PKG.Write_LogFile(l_module_name,x_error_msg);
2613             FTE_UTIL_PKG.Exit_Debug(l_module_name);
2614             RETURN;
2615         END IF;
2616 
2617         l_context       := FTE_RTG_GLOBALS.G_AX_TL_RATE_TYPE;
2618         l_attribute_type  := 'TL_RATE_TYPE';
2619         l_attribute_value := FTE_RTG_GLOBALS.G_TL_RATE_TYPE_STOP;
2620 
2621         ADD_ATTRIBUTE(p_attribute_type      => l_attribute_type,
2622                       p_attribute_value     => l_attribute_value,
2623                       p_attribute_value_to  => NULL,
2624                       p_context             => l_context,
2625                       p_comp_operator       => NULL,
2626                       p_linenum             => x_linenum,
2627                       p_process_id          => p_process_id,
2628                       p_line_number         => p_line_number,
2629                       x_error_msg           => x_error_msg,
2630                       x_status              => x_status);
2631 
2632         IF (x_status <> -1) THEN
2633             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'Error: ' || x_error_msg);
2634             FTE_UTIL_PKG.Exit_Debug(l_module_name);
2635             RETURN;
2636         END IF;
2637 
2638         -- Add Region Attribute
2639         l_attribute_type := p_region_type || '_ZONE_ID';
2640 
2641         IF (p_region_type = 'ORIGIN') THEN
2642             l_context  := FTE_RTG_GLOBALS.G_AX_ORIGIN_ZONE;
2643         ELSIF (p_region_type = 'DESTINATION') THEN
2644             l_context  := FTE_RTG_GLOBALS.G_AX_DESTINATION_ZONE;
2645         END IF;
2646 
2647         ADD_ATTRIBUTE (p_attribute_type      => l_attribute_type,
2648                        p_attribute_value     => Fnd_Number.Number_To_Canonical(l_zone_id),
2649                        p_attribute_value_to  => NULL,
2650                        p_context             => l_context,
2651                        p_comp_operator       => NULL,
2652                        p_linenum             => x_linenum,
2653                        p_process_id          => p_process_id,
2654                        p_line_number         => p_line_number,
2655                        x_error_msg           => x_error_msg,
2656                        x_status              => x_status);
2657 
2658         FTE_UTIL_PKG.Exit_Debug(l_module_name);
2659     EXCEPTION
2660         WHEN OTHERS THEN
2661             x_status := 2;
2662             x_error_msg := sqlerrm;
2663             FTE_UTIL_PKG.Exit_Debug(l_module_name);
2664             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'UNEXP. ERROR in Process_Region_Charges',sqlerrm);
2665 
2666     END PROCESS_REGION_CHARGES;
2667 
2668     --_________________________________________________________________________________--
2669     --
2670     -- PROCEDURE: PROCESS_STOPOFF_CHARGES
2671     --
2672     -- PURPOSE . Processing for stop off charges is being done here.
2673     --           Called by PROCESS_CHART_CHARGES.
2674     --
2675     -- Parameters
2676     --_________________________________________________________________________________--
2677 
2678     PROCEDURE PROCESS_STOPOFF_CHARGES(p_break_charges  IN  STRINGARRAY,
2679                                       p_num_free_stops IN  NUMBER,
2680                                       p_process_id     IN  NUMBER,
2681                                       x_linenum        IN  OUT NOCOPY NUMBER,
2682                                       p_line_number    IN  NUMBER,
2683                                       x_error_msg      OUT NOCOPY VARCHAR2,
2684                                       x_status         OUT NOCOPY NUMBER) IS
2685 
2686     l_break_charges       STRINGARRAY;
2687     l_break_limits        STRINGARRAY := STRINGARRAY();
2688     l_subtype             VARCHAR2(30);
2689     l_type                VARCHAR2(30);
2690     l_rate_type           VARCHAR2(30);
2691     l_break_type          VARCHAR2(30);
2692     l_break_start         NUMBER;
2693     l_description         VARCHAR2(300);
2694     l_context             VARCHAR2(50);
2695     l_attribute_value     VARCHAR2(50);
2696     l_attribute_type      VARCHAR2(50);
2697 
2698     l_rate_line_data        FTE_BULKLOAD_PKG.data_values_tbl;
2699     l_rate_line_block_tbl   FTE_BULKLOAD_PKG.block_data_tbl;
2700 
2701     l_module_name  CONSTANT VARCHAR2(100) := 'FTE.PLSQL.' || G_PKG_NAME || '.PROCESS_STOPOFF_CHARGES';
2702 
2703     BEGIN
2704         FTE_UTIL_PKG.Enter_Debug(l_module_name);
2705         x_status := -1;
2706 
2707         l_break_charges := p_break_charges;
2708 
2709         IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
2710             FTE_UTIL_PKG.Write_LogFile(l_module_name,'p_num_free_stops', p_num_free_stops);
2711             FTE_UTIL_PKG.Write_LogFile(l_module_name,'p_process_id    ', p_process_id);
2712             FTE_UTIL_PKG.Write_LogFile(l_module_name,'x_linenum       ', x_linenum);
2713             FTE_UTIL_PKG.Write_LogFile(l_module_name,'p_line_number   ', p_line_number);
2714 
2715             FOR i IN 1..l_break_charges.COUNT LOOP
2716                 FTE_UTIL_PKG.Write_LogFile(l_module_name, 'p_break_charges(' || i || ')', l_break_charges(i));
2717             END LOOP;
2718 
2719         END IF;
2720 
2721         --+
2722         --  Remove any NULL breaks
2723         --  If any of the stop off charges are NULL, we delete the remaining breaks are also.
2724         --  But, check additional stop off charges, which is the last element in the STRINGARRAY.
2725         --+
2726         FOR i IN 1..l_break_charges.COUNT LOOP
2727 
2728         IF (l_break_charges(i) IS NULL) THEN
2729                 IF (l_break_charges(l_break_charges.COUNT) IS NULL) THEN
2730                     l_break_charges.DELETE(i, l_break_charges.COUNT);
2731                 ELSE
2732                     l_break_charges(i) := l_break_charges(l_break_charges.COUNT);
2733                     l_break_charges.DELETE(i+1, l_break_charges.COUNT);
2734                 END IF;
2735                 EXIT;
2736             END IF;
2737 
2738         END LOOP;
2739 
2740         IF (p_num_free_stops IS NULL OR p_num_free_stops <= 0) THEN
2741             l_break_charges.DELETE(1);
2742             l_break_start := 1;
2743         ELSE
2744             l_break_start := p_num_free_stops;
2745         END IF;
2746 
2747         IF (l_break_charges.COUNT > 0) THEN
2748             x_linenum := x_linenum + 1;
2749             l_description := 'Stop Off Charge: Line ' || x_linenum;
2750 
2751             IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
2752                 FTE_UTIL_PKG.Write_LogFile(l_module_name, l_description, l_description);
2753             END IF;
2754 
2755             l_type       := 'ACCESSORIAL_SURCHARGE';
2756             l_rate_type  := 'LUMPSUM';
2757             l_break_type := 'RANGE';
2758             l_subtype    := FTE_RTG_GLOBALS.G_C_STOP_OFF_CH;
2759 
2760             l_rate_line_data('ACTION')         := G_ACTION;
2761             l_rate_line_data('LINE_NUMBER')    := x_linenum;
2762             l_rate_line_data('DESCRIPTION')    := l_description;
2763             l_rate_line_data('VOLUME_TYPE')    := 'TOTAL_QUANTITY';
2764             l_rate_line_data('RATE_BREAK_TYPE'):= l_break_type;
2765             l_rate_line_data('SUBTYPE')        := l_subtype;
2766             l_rate_line_data('TYPE')           := l_type;
2767             l_rate_line_data('RATE_TYPE')      := l_rate_type;
2768             l_rate_line_data('UOM')            := g_unit_uom;
2769 
2770             l_rate_line_block_tbl(1) := l_rate_line_data;
2771 
2772             FTE_RATE_CHART_LOADER.PROCESS_RATE_LINE(p_block_header  => g_dummy_block_hdr_tbl,
2773                                                     p_block_data    => l_rate_line_block_tbl,
2774                                                     p_line_number   => p_line_number,
2775                                                     p_validate_column => FALSE,
2776                                                     x_status        => x_status,
2777                                                     x_error_msg     => x_error_msg);
2778             l_rate_line_data.DELETE;
2779             l_rate_line_block_tbl.DELETE;
2780 
2781             IF (x_status <> -1) THEN
2782                 FTE_UTIL_PKG.Write_LogFile(l_module_name, 'Error: ' || x_error_msg);
2783                 FTE_UTIL_PKG.Exit_Debug(l_module_name);
2784                 RETURN;
2785             END IF;
2786 
2787             --+
2788             -- Add Rate Type Attribute
2789             --+
2790             l_attribute_type  := 'TL_RATE_TYPE';
2791             l_context         := FTE_RTG_GLOBALS.G_AX_TL_RATE_TYPE;
2792             l_attribute_value := FTE_RTG_GLOBALS.G_TL_RATE_TYPE_LOAD;
2793 
2794             ADD_ATTRIBUTE(p_attribute_type      => l_attribute_type,
2795                           p_attribute_value     => l_attribute_value,
2796                           p_attribute_value_to  => NULL,
2797                           p_context             => l_context,
2798                           p_linenum             => x_linenum,
2799                           p_comp_operator       => '=',
2800                           p_process_id          => p_process_id,
2801                           p_line_number         => p_line_number,
2802                           x_error_msg           => x_error_msg,
2803                           x_status              => x_status);
2804 
2805             IF (x_status <> -1) THEN
2806                 FTE_UTIL_PKG.Write_LogFile(l_module_name, 'Error', x_error_msg);
2807                 FTE_UTIL_PKG.Exit_Debug(l_module_name);
2808                 RETURN;
2809             END IF;
2810 
2811             --+
2812             -- create the break limits
2813             --+
2814             l_break_limits.EXTEND;
2815             l_break_limits(1) := Fnd_Number.Number_To_Canonical(l_break_start);
2816 
2817             FOR i IN 2..l_break_charges.COUNT LOOP
2818                 l_break_limits.EXTEND;
2819                 l_break_limits(i) := Fnd_Number.Number_To_Canonical(Fnd_Number.Canonical_To_Number(l_break_limits(i-1)) + 1);
2820             END LOOP;
2821 
2822             l_break_limits(l_break_limits.COUNT) := g_max_number;
2823 
2824             --+
2825             -- Create Breaks
2826             --+
2827             IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
2828                 FTE_UTIL_PKG.Write_LogFile(l_module_name, 'Begin Create Breaks');
2829             END IF;
2830 
2831             CREATE_BREAKS(p_break_charges    => l_break_charges,
2832                           p_break_limits     => l_break_limits,
2833                           p_break_start      => Fnd_Number.Canonical_To_Number('0'),
2834                           p_break_gap        => Fnd_Number.Canonical_To_Number('0'),
2835                           p_rate_type        => l_rate_type,
2836                           p_attribute_type   => 'TL_NUM_STOPS',
2837                           p_process_id       => p_process_id,
2838                           x_linenum          => x_linenum,
2839                           x_error_msg        => x_error_msg,
2840                           x_status           => x_status);
2841         END IF;
2842 
2843         FTE_UTIL_PKG.Exit_Debug(l_module_name);
2844     EXCEPTION
2845         WHEN OTHERS THEN
2846             x_status := 2;
2847             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'Unexpected Error in PROCESS_STOP_OFF_CHARGES',sqlerrm);
2848             FTE_UTIL_PKG.Exit_Debug(l_module_name);
2849 
2850     END PROCESS_STOPOFF_CHARGES;
2851 
2852     --_________________________________________________________________________________--
2853     --
2854     -- PROCEDURE: PROCESS_LOADING_CHARGES
2855     --
2856     -- Purpose
2857     --
2858     -- PARAMETERS
2859     --  OUT
2860     --    x_status,  the return status, -1 for success
2861     --                                   2 for failure.
2862     --    x_error_msg, the corresponding error message,
2863     --                 if any exception occurs during the process.
2864     --
2865     --_________________________________________________________________________________--
2866 
2867     PROCEDURE PROCESS_LOADING_CHARGES(p_min_charge     IN  NUMBER,
2868                                       p_charge         IN  NUMBER,
2869                                       p_load_type      IN  VARCHAR2,
2870                                       p_basis          IN  VARCHAR2,
2871                                       p_basis_uom      IN  VARCHAR2,
2872                                       p_process_id     IN  NUMBER,
2873                                       x_linenum        IN  OUT NOCOPY NUMBER,
2874                                       p_line_number    IN  NUMBER,
2875                                       x_error_msg      OUT NOCOPY VARCHAR2,
2876                                       x_status         OUT NOCOPY NUMBER) IS
2877     l_subtype          VARCHAR2(30);
2878     l_subtype_min      VARCHAR2(30);
2879     l_subtype2         VARCHAR2(30);
2880     l_type             VARCHAR2(30);
2881     l_rate             NUMBER;
2882     l_rate_type        VARCHAR2(30);
2883     l_break_type       VARCHAR2(30);
2884     l_description      VARCHAR2(300);
2885     l_context          VARCHAR2(50);
2886     l_flat_rate        BOOLEAN := FALSE;
2887     l_min_break        BOOLEAN := FALSE;
2888 
2889     -- attributes
2890     l_attr1_type       VARCHAR2(50);
2891     l_attr2_type       VARCHAR2(50);
2892     l_attr3_type       VARCHAR2(50);
2893     l_attr1_value      VARCHAR2(50);
2894     l_attr2_value      VARCHAR2(50);
2895     l_attr3_value      VARCHAR2(50);
2896     l_attr1_context    VARCHAR2(50);
2897     l_attr2_context    VARCHAR2(50);
2898     l_attr3_context    VARCHAR2(50);
2899     l_attr_value_from  VARCHAR2(50);
2900     l_attr_value_to    VARCHAR2(50);
2901 
2902     l_rate_line_data       FTE_BULKLOAD_PKG.data_values_tbl;
2903     l_rate_line_block_tbl  FTE_BULKLOAD_PKG.block_data_tbl;
2904 
2905     l_rate_break_data      FTE_BULKLOAD_PKG.data_values_tbl;
2906     l_rate_break_block_tbl FTE_BULKLOAD_PKG.block_data_tbl;
2907 
2908     l_module_name      CONSTANT VARCHAR2(100) := 'FTE.PLSQL.' || G_PKG_NAME || '.PROCESS_LOADING_CHARGES';
2909 
2910     BEGIN
2911         FTE_UTIL_PKG.Enter_Debug(l_module_name);
2912         x_status := -1;
2913 
2914         l_type            := 'ACCESSORIAL_SURCHARGE';
2915         l_attr1_type      := 'TL_RATE_TYPE';
2916         l_attr1_context   := FTE_RTG_GLOBALS.G_AX_TL_RATE_TYPE;
2917 
2918         l_attr3_type      := 'LOADING_PROTOCOL';
2919         l_attr3_context   := FTE_RTG_GLOBALS.G_AX_LOADING_PROTOCOL;
2920 
2921         -- TL handling only deals with weight and volume
2922         IF (p_load_type = 'HANDLING') THEN
2923             l_attr1_value := FTE_RTG_GLOBALS.G_TL_RATE_TYPE_LOAD;
2924             l_attr3_value := 'CARRIER';
2925             l_subtype_min     := FTE_RTG_GLOBALS.G_C_MIN_HANDLING_CH;
2926 
2927             IF (p_basis = FTE_RTG_GLOBALS.G_TL_RATE_BASIS_WT) THEN
2928                 l_subtype       := FTE_RTG_GLOBALS.G_C_HANDLING_WEIGHT_CH;
2929                 l_attr2_type    := 'TL_HANDLING_WT';
2930                 l_attr2_context := FTE_RTG_GLOBALS.G_AX_TL_HANDLING_WT;
2931             ELSIF (p_basis = FTE_RTG_GLOBALS.G_TL_RATE_BASIS_VOL) THEN
2932                 l_subtype       := FTE_RTG_GLOBALS.G_C_HANDLING_VOLUME_CH;
2933                 l_attr2_type    := 'TL_HANDLING_VOL';
2934                 l_attr2_context := FTE_RTG_GLOBALS.G_AX_TL_HANDLING_VOL;
2935             ELSIF (p_basis = 'FLAT') THEN
2936                 l_flat_rate  := TRUE;
2937                 l_subtype    := FTE_RTG_GLOBALS.G_C_HANDLING_FLAT_CH;
2938             ELSE
2939                 x_status := 3;
2940             END IF;
2941         ELSIF (p_load_type = 'FACILITY_HANDLING') THEN
2942             l_attr1_value := 'FACILITY_CHARGE';
2943             l_attr3_value := 'FACILITY';
2944             l_subtype_min     := FTE_RTG_GLOBALS.G_F_MIN_HANDLING_CH;
2945 
2946             IF (p_basis = FTE_RTG_GLOBALS.G_TL_RATE_BASIS_WT) THEN
2947                 l_subtype       := FTE_RTG_GLOBALS.G_F_HANDLING_WEIGHT_CH;
2948                 l_attr2_type    := 'FAC_HANDLING_WT';
2949                 l_attr2_context := FTE_RTG_GLOBALS.G_AX_FAC_HANDLING_WT;
2950             ELSIF (p_basis = FTE_RTG_GLOBALS.G_TL_RATE_BASIS_VOL) THEN
2951                 l_subtype       := FTE_RTG_GLOBALS.G_F_HANDLING_VOLUME_CH;
2952                 l_attr2_type    := 'FAC_HANDLING_VOL';
2953                 l_attr2_context := FTE_RTG_GLOBALS.G_AX_FAC_HANDLING_VOL;
2954             ELSIF (p_basis = FTE_RTG_GLOBALS.G_TL_RATE_BASIS_PALLET) THEN
2955                 l_subtype       := FTE_RTG_GLOBALS.G_F_HANDLING_PALLET_CH;
2956                 l_attr2_type    := 'FAC_HANDLING_PALLET';
2957                 l_attr2_context := FTE_RTG_GLOBALS.G_AX_FAC_HANDLING_PALLET;
2958             ELSIF (p_basis = FTE_RTG_GLOBALS.G_TL_RATE_BASIS_CONT) THEN
2959                 l_subtype       := FTE_RTG_GLOBALS.G_F_HANDLING_CONTAINER_CH;
2960                 l_attr2_type    := 'FAC_HANDLING_CONTAINER';
2961                 l_attr2_context := FTE_RTG_GLOBALS.G_AX_FAC_HANDLING_CONTAINER;
2962             ELSIF (p_basis = 'FLAT') THEN
2963                 l_flat_rate  := TRUE;
2964                 l_subtype    := FTE_RTG_GLOBALS.G_F_HANDLING_FLAT_CH;
2965             ELSE
2966                 x_status := 3;
2967             END IF;
2968 
2969         ELSIF (p_load_type = 'UNLOADING') THEN
2970             l_attr1_value := FTE_RTG_GLOBALS.G_TL_RATE_TYPE_STOP;
2971             l_attr3_value := 'CARRIER';
2972             l_subtype_min     := FTE_RTG_GLOBALS.G_C_MIN_UNLOADING_CH;
2973 
2974             IF (p_basis = FTE_RTG_GLOBALS.G_TL_RATE_BASIS_WT) THEN
2975                 l_subtype       := FTE_RTG_GLOBALS.G_C_UNLOADING_WEIGHT_CH;
2976                 l_attr2_type    := 'TL_DROPOFF_WT';
2977                 l_attr2_context := FTE_RTG_GLOBALS.G_AX_TL_DROPOFF_WT;
2978             ELSIF (p_basis = FTE_RTG_GLOBALS.G_TL_RATE_BASIS_VOL) THEN
2979                 l_subtype       := FTE_RTG_GLOBALS.G_C_UNLOADING_VOLUME_CH;
2980                 l_attr2_type    := 'TL_DROPOFF_VOL';
2981                 l_attr2_context := FTE_RTG_GLOBALS.G_AX_TL_DROPOFF_VOL;
2982             ELSIF (p_basis = FTE_RTG_GLOBALS.G_TL_RATE_BASIS_PALLET) THEN
2983                 l_subtype       := FTE_RTG_GLOBALS.G_C_UNLOADING_PALLET_CH;
2984                 l_attr2_type    := 'TL_DROPOFF_PALLET';
2985                 l_attr2_context := FTE_RTG_GLOBALS.G_AX_TL_DROPOFF_PALLET;
2986             ELSIF (p_basis = FTE_RTG_GLOBALS.G_TL_RATE_BASIS_CONT) THEN
2987                 l_subtype       := FTE_RTG_GLOBALS.G_C_UNLOADING_CONTAINER_CH;
2988                 l_attr2_type    := 'TL_DROPOFF_CONTAINER';
2989                 l_attr2_context := FTE_RTG_GLOBALS.G_AX_TL_DROPOFF_CONTAINER;
2990             ELSIF(p_basis = 'FLAT') THEN
2991                 l_flat_rate  := TRUE;
2992                 l_subtype    := FTE_RTG_GLOBALS.G_C_UNLOADING_FLAT_CH;
2993             ELSE
2994                 x_status := 3;
2995             END IF;
2996 
2997         ELSIF (p_load_type = 'FACILITY_UNLOADING') THEN
2998             l_attr1_value := 'FACILITY_CHARGE';
2999             l_attr3_value := 'FACILITY';
3000             l_subtype_min     := FTE_RTG_GLOBALS.G_F_MIN_UNLOADING_CH;
3001 
3002             IF (p_basis = FTE_RTG_GLOBALS.G_TL_RATE_BASIS_WT) THEN
3003                 l_subtype       := FTE_RTG_GLOBALS.G_F_UNLOADING_WEIGHT_CH;
3004                 l_attr2_type    := 'FAC_DROPOFF_WT';
3005                 l_attr2_context := FTE_RTG_GLOBALS.G_AX_FAC_DROPOFF_WT;
3006             ELSIF (p_basis = FTE_RTG_GLOBALS.G_TL_RATE_BASIS_VOL) THEN
3007                 l_subtype       := FTE_RTG_GLOBALS.G_F_UNLOADING_VOLUME_CH;
3008                 l_attr2_type    := 'FAC_DROPOFF_VOL';
3009                 l_attr2_context := FTE_RTG_GLOBALS.G_AX_FAC_DROPOFF_VOL;
3010             ELSIF (p_basis = FTE_RTG_GLOBALS.G_TL_RATE_BASIS_PALLET) THEN
3011                 l_subtype       := FTE_RTG_GLOBALS.G_F_UNLOADING_PALLET_CH;
3012                 l_attr2_type    := 'FAC_DROPOFF_PALLET';
3013                 l_attr2_context := FTE_RTG_GLOBALS.G_AX_FAC_DROPOFF_PALLET;
3014             ELSIF (p_basis = FTE_RTG_GLOBALS.G_TL_RATE_BASIS_CONT) THEN
3015                 l_subtype       := FTE_RTG_GLOBALS.G_F_UNLOADING_CONTAINER_CH;
3016                 l_attr2_type    := 'FAC_DROPOFF_CONTAINER';
3017                 l_attr2_context := FTE_RTG_GLOBALS.G_AX_FAC_DROPOFF_CONTAINER;
3018             ELSIF(p_basis = 'FLAT') THEN
3019                 l_flat_rate  := TRUE;
3020                 l_subtype    := FTE_RTG_GLOBALS.G_F_UNLOADING_FLAT_CH;
3021             ELSE
3022                 x_status := 3;
3023             END IF;
3024 
3025         ELSIF (p_load_type = 'ASSISTED_UNLOADING') THEN
3026             l_attr1_value := FTE_RTG_GLOBALS.G_TL_RATE_TYPE_STOP;
3027             l_attr3_value := 'JOINT';
3028             l_subtype_min := FTE_RTG_GLOBALS.G_C_MIN_AST_UNLOADING_CH;
3029 
3030             IF (p_basis = FTE_RTG_GLOBALS.G_TL_RATE_BASIS_WT) THEN
3031                 l_subtype       := FTE_RTG_GLOBALS.G_C_AST_UNLOADING_WEIGHT_CH;
3032                 l_attr2_type    := 'TL_DROPOFF_WT';
3033                 l_attr2_context := FTE_RTG_GLOBALS.G_AX_TL_DROPOFF_WT;
3034             ELSIF (p_basis = FTE_RTG_GLOBALS.G_TL_RATE_BASIS_VOL) THEN
3035                 l_subtype       := FTE_RTG_GLOBALS.G_C_AST_UNLOADING_VOLUME_CH;
3036                 l_attr2_type    := 'TL_DROPOFF_VOL';
3037                 l_attr2_context := FTE_RTG_GLOBALS.G_AX_TL_DROPOFF_VOL;
3038             ELSIF (p_basis = FTE_RTG_GLOBALS.G_TL_RATE_BASIS_PALLET) THEN
3039                 l_subtype       := FTE_RTG_GLOBALS.G_C_AST_UNLOADING_PALLET_CH;
3040                 l_attr2_type    := 'TL_DROPOFF_PALLET';
3041                 l_attr2_context := FTE_RTG_GLOBALS.G_AX_TL_DROPOFF_PALLET;
3042             ELSIF (p_basis = FTE_RTG_GLOBALS.G_TL_RATE_BASIS_CONT) THEN
3043                 l_subtype       := FTE_RTG_GLOBALS.G_C_AST_UNLOADING_CONTAINER_CH;
3044                 l_attr2_type    := 'TL_DROPOFF_CONTAINER';
3045                 l_attr2_context := FTE_RTG_GLOBALS.G_AX_TL_DROPOFF_CONTAINER;
3046             ELSIF(p_basis = 'FLAT') THEN
3047                 l_flat_rate  := TRUE;
3048                 l_subtype    := FTE_RTG_GLOBALS.G_C_AST_UNLOADING_FLAT_CH;
3049             ELSE
3050                 x_status := 3;
3051             END IF;
3052 
3053         ELSIF (p_load_type = 'FACILITY_ASSISTED_UNLOADING') THEN
3054             l_attr1_value := 'FACILITY_CHARGE';
3055             l_attr3_value := 'JOINT';
3056             l_subtype_min := FTE_RTG_GLOBALS.G_F_MIN_AST_UNLOADING_CH;
3057 
3058             IF (p_basis = FTE_RTG_GLOBALS.G_TL_RATE_BASIS_WT) THEN
3059                 l_subtype       := FTE_RTG_GLOBALS.G_F_AST_UNLOADING_WEIGHT_CH;
3060                 l_attr2_type    := 'FAC_DROPOFF_WT';
3061                 l_attr2_context := FTE_RTG_GLOBALS.G_AX_FAC_DROPOFF_WT;
3062             ELSIF (p_basis = FTE_RTG_GLOBALS.G_TL_RATE_BASIS_VOL) THEN
3063                 l_subtype       := FTE_RTG_GLOBALS.G_F_AST_UNLOADING_VOLUME_CH;
3064                 l_attr2_type    := 'FAC_DROPOFF_VOL';
3065                 l_attr2_context := FTE_RTG_GLOBALS.G_AX_FAC_DROPOFF_VOL;
3066             ELSIF (p_basis = FTE_RTG_GLOBALS.G_TL_RATE_BASIS_PALLET) THEN
3067                 l_subtype       := FTE_RTG_GLOBALS.G_F_AST_UNLOADING_PALLET_CH;
3068                 l_attr2_type    := 'FAC_DROPOFF_PALLET';
3069                 l_attr2_context := FTE_RTG_GLOBALS.G_AX_FAC_DROPOFF_PALLET;
3070             ELSIF (p_basis = FTE_RTG_GLOBALS.G_TL_RATE_BASIS_CONT) THEN
3071                 l_subtype       := FTE_RTG_GLOBALS.G_F_AST_UNLOADING_CONTAINER_CH;
3072                 l_attr2_type    := 'FAC_DROPOFF_CONTAINER';
3073                 l_attr2_context := FTE_RTG_GLOBALS.G_AX_FAC_DROPOFF_CONTAINER;
3074             ELSIF(p_basis = 'FLAT') THEN
3075                 l_flat_rate  := TRUE;
3076                 l_subtype    := FTE_RTG_GLOBALS.G_F_AST_UNLOADING_FLAT_CH;
3077             ELSE
3078                 x_status := 3;
3079             END IF;
3080 
3081         ELSIF (p_load_type = 'LOADING') THEN
3082             l_attr1_value := FTE_RTG_GLOBALS.G_TL_RATE_TYPE_STOP;
3083             l_attr3_value := 'CARRIER';
3084             l_subtype_min     := FTE_RTG_GLOBALS.G_C_MIN_LOADING_CH;
3085 
3086             IF (p_basis = FTE_RTG_GLOBALS.G_TL_RATE_BASIS_WT) THEN
3087                 l_subtype       := FTE_RTG_GLOBALS.G_C_LOADING_WEIGHT_CH;
3088                 l_attr2_type    := 'TL_PICKUP_WT';
3089                 l_attr2_context := FTE_RTG_GLOBALS.G_AX_TL_PICKUP_WT;
3090             ELSIF (p_basis = FTE_RTG_GLOBALS.G_TL_RATE_BASIS_VOL) THEN
3091                 l_subtype       := FTE_RTG_GLOBALS.G_C_LOADING_VOLUME_CH;
3092                 l_attr2_type    := 'TL_PICKUP_VOL';
3093                 l_attr2_context := FTE_RTG_GLOBALS.G_AX_TL_PICKUP_VOL;
3094             ELSIF (p_basis = FTE_RTG_GLOBALS.G_TL_RATE_BASIS_PALLET) THEN
3095                 l_subtype       := FTE_RTG_GLOBALS.G_C_LOADING_PALLET_CH;
3096                 l_attr2_type    := 'TL_PICKUP_PALLET';
3097                 l_attr2_context := FTE_RTG_GLOBALS.G_AX_TL_PICKUP_PALLET;
3098             ELSIF (p_basis = FTE_RTG_GLOBALS.G_TL_RATE_BASIS_CONT) THEN
3099                 l_subtype       := FTE_RTG_GLOBALS.G_C_LOADING_CONTAINER_CH;
3100                 l_attr2_type    := 'TL_PICKUP_CONTAINER';
3101                 l_attr2_context := FTE_RTG_GLOBALS.G_AX_TL_PICKUP_CONTAINER;
3102             ELSIF(p_basis = 'FLAT') THEN
3103                 l_flat_rate  := TRUE;
3104                 l_subtype    := FTE_RTG_GLOBALS.G_C_LOADING_FLAT_CH;
3105             ELSE
3106                 x_status := 3;
3107             END IF;
3108 
3109         ELSIF (p_load_type = 'FACILITY_LOADING') THEN
3110             l_attr1_value := 'FACILITY_CHARGE';
3111             l_attr3_value := 'FACILITY';
3112             l_subtype_min := FTE_RTG_GLOBALS.G_F_MIN_LOADING_CH;
3113 
3114             IF (p_basis = FTE_RTG_GLOBALS.G_TL_RATE_BASIS_WT) THEN
3115                 l_subtype       := FTE_RTG_GLOBALS.G_F_LOADING_WEIGHT_CH;
3116                 l_attr2_type    := 'FAC_PICKUP_WT';
3117                 l_attr2_context := FTE_RTG_GLOBALS.G_AX_FAC_PICKUP_WT;
3118             ELSIF (p_basis = FTE_RTG_GLOBALS.G_TL_RATE_BASIS_VOL) THEN
3119                 l_subtype       := FTE_RTG_GLOBALS.G_F_LOADING_VOLUME_CH;
3120                 l_attr2_type    := 'FAC_PICKUP_VOL';
3121                 l_attr2_context := FTE_RTG_GLOBALS.G_AX_FAC_PICKUP_VOL;
3122             ELSIF (p_basis = FTE_RTG_GLOBALS.G_TL_RATE_BASIS_PALLET) THEN
3123                 l_subtype       := FTE_RTG_GLOBALS.G_F_LOADING_PALLET_CH;
3124                 l_attr2_type    := 'FAC_PICKUP_PALLET';
3125                 l_attr2_context := FTE_RTG_GLOBALS.G_AX_FAC_PICKUP_PALLET;
3126             ELSIF (p_basis = FTE_RTG_GLOBALS.G_TL_RATE_BASIS_CONT) THEN
3127                 l_subtype       := FTE_RTG_GLOBALS.G_F_LOADING_CONTAINER_CH;
3128                 l_attr2_type    := 'FAC_PICKUP_CONTAINER';
3129                 l_attr2_context := FTE_RTG_GLOBALS.G_AX_FAC_PICKUP_CONTAINER;
3130             ELSIF(p_basis = 'FLAT') THEN
3131                 l_flat_rate  := TRUE;
3132                 l_subtype    := FTE_RTG_GLOBALS.G_F_LOADING_FLAT_CH;
3133             ELSE
3134                 x_status := 3;
3135             END IF;
3136 
3137         ELSIF (p_load_type = 'ASSISTED_LOADING') THEN
3138             l_attr1_value := FTE_RTG_GLOBALS.G_TL_RATE_TYPE_STOP;
3139             l_attr3_value := 'JOINT';
3140             l_subtype_min := FTE_RTG_GLOBALS.G_C_MIN_AST_LOADING_CH;
3141 
3142             IF (p_basis = FTE_RTG_GLOBALS.G_TL_RATE_BASIS_WT) THEN
3143                 l_subtype       := FTE_RTG_GLOBALS.G_C_AST_LOADING_WEIGHT_CH;
3144                 l_attr2_type    := 'TL_PICKUP_WT';
3145                 l_attr2_context := FTE_RTG_GLOBALS.G_AX_TL_PICKUP_WT;
3146             ELSIF (p_basis = FTE_RTG_GLOBALS.G_TL_RATE_BASIS_VOL) THEN
3147                 l_subtype       := FTE_RTG_GLOBALS.G_C_AST_LOADING_VOLUME_CH;
3148                 l_attr2_type    := 'TL_PICKUP_VOL';
3149                 l_attr2_context := FTE_RTG_GLOBALS.G_AX_TL_PICKUP_VOL;
3150             ELSIF (p_basis = FTE_RTG_GLOBALS.G_TL_RATE_BASIS_PALLET) THEN
3151                 l_subtype       := FTE_RTG_GLOBALS.G_C_AST_LOADING_PALLET_CH;
3152                 l_attr2_type    := 'TL_PICKUP_PALLET';
3153                 l_attr2_context := FTE_RTG_GLOBALS.G_AX_TL_PICKUP_PALLET;
3154             ELSIF (p_basis = FTE_RTG_GLOBALS.G_TL_RATE_BASIS_CONT) THEN
3155                 l_subtype       := FTE_RTG_GLOBALS.G_C_AST_LOADING_CONTAINER_CH;
3156                 l_attr2_type    := 'TL_PICKUP_CONTAINER';
3157                 l_attr2_context := FTE_RTG_GLOBALS.G_AX_TL_PICKUP_CONTAINER;
3158             ELSIF(p_basis = 'FLAT') THEN
3159                 l_flat_rate  := TRUE;
3160                 l_subtype    := FTE_RTG_GLOBALS.G_C_AST_LOADING_FLAT_CH;
3161             ELSE
3162                 x_status := 3;
3163             END IF;
3164 
3165         ELSIF (p_load_type = 'FACILITY_ASSISTED_LOADING') THEN
3166             l_attr1_value := 'FACILITY_CHARGE';
3167             l_attr3_value := 'JOINT';
3168             l_subtype_min := FTE_RTG_GLOBALS.G_F_MIN_AST_LOADING_CH;
3169 
3170             IF (p_basis = FTE_RTG_GLOBALS.G_TL_RATE_BASIS_WT) THEN
3171                 l_subtype       := FTE_RTG_GLOBALS.G_F_AST_LOADING_WEIGHT_CH;
3172                 l_attr2_type    := 'FAC_PICKUP_WT';
3173                 l_attr2_context := FTE_RTG_GLOBALS.G_AX_FAC_PICKUP_WT;
3174             ELSIF (p_basis = FTE_RTG_GLOBALS.G_TL_RATE_BASIS_VOL) THEN
3175                 l_subtype       := FTE_RTG_GLOBALS.G_F_AST_LOADING_VOLUME_CH;
3176                 l_attr2_type    := 'FAC_PICKUP_VOL';
3177                 l_attr2_context := FTE_RTG_GLOBALS.G_AX_FAC_PICKUP_VOL;
3178             ELSIF (p_basis = FTE_RTG_GLOBALS.G_TL_RATE_BASIS_PALLET) THEN
3179                 l_subtype       := FTE_RTG_GLOBALS.G_F_AST_LOADING_PALLET_CH;
3180                 l_attr2_type    := 'FAC_PICKUP_PALLET';
3181                 l_attr2_context := FTE_RTG_GLOBALS.G_AX_FAC_PICKUP_PALLET;
3182             ELSIF (p_basis = FTE_RTG_GLOBALS.G_TL_RATE_BASIS_CONT) THEN
3183                 l_subtype       := FTE_RTG_GLOBALS.G_F_AST_LOADING_CONTAINER_CH;
3184                 l_attr2_type    := 'FAC_PICKUP_CONTAINER';
3185                 l_attr2_context := FTE_RTG_GLOBALS.G_AX_FAC_PICKUP_CONTAINER;
3186             ELSIF(p_basis = 'FLAT') THEN
3187                 l_flat_rate  := TRUE;
3188                 l_subtype    := FTE_RTG_GLOBALS.G_F_AST_LOADING_FLAT_CH;
3189             ELSE
3190                 x_status := 3;
3191             END IF;
3192 
3193         ELSIF (p_load_type = 'ASSISTED_LOADING') THEN
3194             l_attr1_value := FTE_RTG_GLOBALS.G_TL_RATE_TYPE_STOP;
3195             l_attr3_value := 'JOINT';
3196             l_subtype_min := FTE_RTG_GLOBALS.G_C_MIN_AST_LOADING_CH;
3197 
3198             IF (p_basis = FTE_RTG_GLOBALS.G_TL_RATE_BASIS_WT) THEN
3199                 l_subtype       := FTE_RTG_GLOBALS.G_C_AST_LOADING_WEIGHT_CH;
3200                 l_attr2_type    := 'TL_PICKUP_WT';
3201                 l_attr2_context := FTE_RTG_GLOBALS.G_AX_TL_PICKUP_WT;
3202             ELSIF (p_basis = FTE_RTG_GLOBALS.G_TL_RATE_BASIS_VOL) THEN
3203                 l_subtype       := FTE_RTG_GLOBALS.G_C_AST_LOADING_VOLUME_CH;
3204                 l_attr2_type    := 'TL_PICKUP_VOL';
3205                 l_attr2_context := FTE_RTG_GLOBALS.G_AX_TL_PICKUP_VOL;
3206             ELSIF (p_basis = FTE_RTG_GLOBALS.G_TL_RATE_BASIS_PALLET) THEN
3207                 l_subtype       := FTE_RTG_GLOBALS.G_C_AST_LOADING_PALLET_CH;
3208                 l_attr2_type    := 'TL_PICKUP_PALLET';
3209                 l_attr2_context := FTE_RTG_GLOBALS.G_AX_TL_PICKUP_PALLET;
3210             ELSIF (p_basis = FTE_RTG_GLOBALS.G_TL_RATE_BASIS_CONT) THEN
3211                 l_subtype       := FTE_RTG_GLOBALS.G_C_AST_LOADING_CONTAINER_CH;
3212                 l_attr2_type    := 'TL_PICKUP_CONTAINER';
3213                 l_attr2_context := FTE_RTG_GLOBALS.G_AX_TL_PICKUP_CONTAINER;
3214             ELSIF(p_basis = 'FLAT') THEN
3215                 l_flat_rate  := TRUE;
3216                 l_subtype    := FTE_RTG_GLOBALS.G_C_AST_LOADING_FLAT_CH;
3217             ELSE
3218                 x_status := 3;
3219             END IF;
3220 
3221         ELSIF (p_load_type = 'FACILITY_ASSISTED_LOADING') THEN
3222             l_attr1_value := 'FACILITY_CHARGE';
3223             l_attr3_value := 'JOINT';
3224             l_subtype_min := FTE_RTG_GLOBALS.G_F_MIN_AST_LOADING_CH;
3225 
3226             IF (p_basis = FTE_RTG_GLOBALS.G_TL_RATE_BASIS_WT) THEN
3227                 l_subtype       := FTE_RTG_GLOBALS.G_F_AST_LOADING_WEIGHT_CH;
3228                 l_attr2_type    := 'FAC_PICKUP_WT';
3229                 l_attr2_context := FTE_RTG_GLOBALS.G_AX_FAC_PICKUP_WT;
3230             ELSIF (p_basis = FTE_RTG_GLOBALS.G_TL_RATE_BASIS_VOL) THEN
3231                 l_subtype       := FTE_RTG_GLOBALS.G_F_AST_LOADING_VOLUME_CH;
3232                 l_attr2_type    := 'FAC_PICKUP_VOL';
3233                 l_attr2_context := FTE_RTG_GLOBALS.G_AX_FAC_PICKUP_VOL;
3234             ELSIF (p_basis = FTE_RTG_GLOBALS.G_TL_RATE_BASIS_PALLET) THEN
3235                 l_subtype       := FTE_RTG_GLOBALS.G_F_AST_LOADING_PALLET_CH;
3236                 l_attr2_type    := 'FAC_PICKUP_PALLET';
3237                 l_attr2_context := FTE_RTG_GLOBALS.G_AX_FAC_PICKUP_PALLET;
3238             ELSIF (p_basis = FTE_RTG_GLOBALS.G_TL_RATE_BASIS_CONT) THEN
3239                 l_subtype       := FTE_RTG_GLOBALS.G_F_AST_LOADING_CONTAINER_CH;
3240                 l_attr2_type    := 'FAC_PICKUP_CONTAINER';
3241                 l_attr2_context := FTE_RTG_GLOBALS.G_AX_FAC_PICKUP_CONTAINER;
3242             ELSIF(p_basis = 'FLAT') THEN
3243                 l_flat_rate  := TRUE;
3244                 l_subtype    := FTE_RTG_GLOBALS.G_F_AST_LOADING_FLAT_CH;
3245             ELSE
3246                 x_status := 3;
3247             END IF;
3248         END IF;
3249 
3250         IF (x_status = 3) THEN
3251             x_status := 2;
3252             x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_INVALID_BASIS',
3253                                                 p_tokens => STRINGARRAY('BASIS','LOAD'),
3254                                                 p_values => STRINGARRAY(p_basis,p_load_type));
3255             FTE_UTIL_PKG.Write_OutFile( p_msg         => x_error_msg,
3256                                         p_module_name => l_module_name,
3257                                         p_category    => 'D',
3258                                         p_line_number => p_line_number );
3259             FTE_UTIL_PKG.Exit_Debug(l_module_name);
3260         END IF;
3261 
3262         --+
3263         -- Cannot Have Flat Rate With Minimum Charges
3264         --+
3265         IF (l_flat_rate AND (p_min_charge IS NOT NULL)) THEN
3266             x_status := 2;
3267             x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_FLAT_CANT_HAVE_MIN');
3268             FTE_UTIL_PKG.Write_OutFile( p_msg          => x_error_msg,
3269                                          p_module_name => l_module_name,
3270                                          p_category    => 'D',
3271                                          p_line_number => p_line_number);
3272             FTE_UTIL_PKG.Exit_Debug(l_module_name);
3273             RETURN;
3274         END IF;
3275         --+
3276         -- Find out if you need to create breaks.
3277         --+
3278         IF (p_charge IS NOT NULL AND p_min_charge IS NOT NULL) THEN
3279             l_min_break := TRUE;
3280         END IF;
3281 
3282         IF (l_flat_rate) THEN
3283             l_rate        := p_charge;
3284             l_rate_type   := 'LUMPSUM';
3285         ELSE
3286             l_rate        := NULL;
3287             l_break_type  := 'POINT';
3288             l_rate_type   := 'FIXED';
3289         END IF;
3290 
3291         x_linenum := x_linenum + 1;
3292         l_description := p_load_type || ' : Line ' || x_linenum;
3293 
3294         IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
3295             FTE_UTIL_PKG.Write_LogFile(l_module_name, l_description);
3296         END IF;
3297 
3298         l_rate_line_data('ACTION')      := G_ACTION;
3299         l_rate_line_data('LINE_NUMBER') := x_linenum;
3300         l_rate_line_data('DESCRIPTION') := l_description;
3301         l_rate_line_data('RATE')        := Fnd_Number.Number_To_Canonical(l_rate);
3302         l_rate_line_data('UOM')         := g_unit_uom;
3303         l_rate_line_data('VOLUME_TYPE') := 'TOTAL_QUANTITY';
3304         l_rate_line_data('TYPE')        := l_type;
3305         l_rate_line_data('RATE_TYPE')   := l_rate_type;
3306         l_rate_line_data('SUBTYPE')     := l_subtype;
3307         l_rate_line_data('RATE_BREAK_TYPE')  := l_break_type;
3308 
3309         l_rate_line_block_tbl(1) := l_rate_line_data;
3310 
3311         FTE_RATE_CHART_LOADER.PROCESS_RATE_LINE(p_block_header  => g_dummy_block_hdr_tbl,
3312                                                 p_block_data    => l_rate_line_block_tbl,
3313                                                 p_line_number   => p_line_number,
3314                                                 p_validate_column => FALSE,
3315                                                 x_status        => x_status,
3316                                                 x_error_msg     => x_error_msg);
3317 
3318         l_rate_line_data.DELETE;
3319         l_rate_line_block_tbl.DELETE;
3320 
3321         IF (x_status <> -1) THEN
3322             FTE_UTIL_PKG.Write_LogFile(l_module_name, x_error_msg);
3323             FTE_UTIL_PKG.Exit_Debug(l_module_name);
3324             RETURN;
3325         END IF;
3326 
3327         -- Add the Charge Type attribute.
3328         IF (l_attr1_type IS NOT NULL AND l_context IS NULL) THEN
3329             ADD_ATTRIBUTE (p_attribute_type      => l_attr1_type,
3330                            p_attribute_value     => l_attr1_value,
3331                            p_attribute_value_to  => NULL,
3332                            p_context             => l_attr1_context,
3333                            p_linenum             => x_linenum,
3334                            p_comp_operator       => '=',
3335                            p_process_id          => p_process_id,
3336                            p_line_number         => p_line_number,
3337                            x_error_msg           => x_error_msg,
3338                            x_status              => x_status);
3339 
3340         END IF;
3341 
3342         -- Add the Loading_Protocol Attribute
3343         IF (p_load_type NOT IN ('HANDLING', 'FACILITY_HANDLING')) THEN
3344             ADD_ATTRIBUTE (p_attribute_type      => l_attr3_type,
3345                            p_attribute_value     => l_attr3_value,
3346                            p_attribute_value_to  => NULL,
3347                            p_context             => l_attr3_context,
3348                            p_linenum             => x_linenum,
3349                            p_comp_operator       => NULL,
3350                            p_process_id          => p_process_id,
3351                            p_line_number         => p_line_number,
3352                            x_error_msg           => x_error_msg,
3353                            x_status              => x_status);
3354         END IF;
3355 
3356         -- Add additional attributes for loading, unloading, handling if flat rate basis
3357         IF (p_basis IN ('FLAT')) THEN
3358             IF (p_load_type IN ('LOADING', 'FACILITY_LOADING','ASSISTED_LOADING', 'FACILITY_ASSISTED_LOADING')) THEN
3359 
3360                 ADD_ATTRIBUTE (p_attribute_type      => 'TL_STOP_LOADING_ACT',
3361                                p_attribute_value     => 'Y',
3362                                p_attribute_value_to  => NULL,
3363                                p_context             => FTE_RTG_GLOBALS.G_AX_TL_STOP_LOADING_ACT,
3364                                p_linenum             => x_linenum,
3365                                p_comp_operator       => '=',
3366                                p_process_id          => p_process_id,
3367                                p_line_number         => p_line_number,
3368                                x_error_msg           => x_error_msg,
3369                                x_status              => x_status);
3370 
3371             ELSIF (p_load_type IN ('UNLOADING', 'FACILITY_UNLOADING','ASSISTED_UNLOADING', 'FACILITY_ASSISTED_UNLOADING')) THEN
3372 
3373                 ADD_ATTRIBUTE ( p_attribute_type      => 'TL_STOP_UNLOADING_ACT',
3374                                 p_attribute_value     => 'Y',
3375                                 p_attribute_value_to  => NULL,
3376                                 p_context             => FTE_RTG_GLOBALS.G_AX_TL_STOP_UNLOADING_ACT,
3377                                 p_linenum             => x_linenum,
3378                                 p_comp_operator       => '=',
3379                                 p_process_id          => p_process_id,
3380                                 p_line_number         => p_line_number,
3381                                 x_error_msg           => x_error_msg,
3382                                 x_status              => x_status);
3383 
3384             ELSIF (p_load_type IN ('HANDLING', 'FACILITY_HANDLING')) THEN
3385 
3386                 ADD_ATTRIBUTE (p_attribute_type      => 'TL_HANDLING_ACT',
3387                                p_attribute_value     => 'Y',
3388                                p_attribute_value_to  => NULL,
3389                                p_context             => FTE_RTG_GLOBALS.G_AX_TL_HANDLING_ACT,
3390                                p_linenum             => x_linenum,
3391                                p_comp_operator       => '=',
3392                                p_process_id          => p_process_id,
3393                                p_line_number         => p_line_number,
3394                                x_error_msg           => x_error_msg,
3395                                x_status              => x_status);
3396 
3397             END IF;
3398         END IF;
3399 
3400         --+
3401         -- For Non-Flat Charge basis, we have to add breaks for block unit pricing.
3402         --+
3403         IF (NOT l_flat_rate) THEN
3404 
3405             -- Add Break 1
3406             l_attr_value_from := 0;
3407             IF (NOT l_min_break) THEN
3408                 l_attr_value_to  := g_max_number;
3409                 l_rate           := p_charge;
3410                 l_subtype2       := l_subtype;
3411                 l_rate_type      := 'BLOCK_UNIT';
3412             ELSE
3413                 l_attr_value_to  := Fnd_Number.Number_To_Canonical(ROUND(p_min_charge/p_charge, 1));
3414                 l_rate           := p_min_charge;
3415                 l_subtype2       := l_subtype_min;
3416                 l_rate_type      := 'LUMPSUM';
3417             END IF;
3418 
3419             x_linenum := x_linenum + 1;
3420 
3421             l_rate_break_data('ACTION')     := G_ACTION;
3422             l_rate_break_data('LINE_NUMBER'):= x_linenum;
3423             l_rate_break_data('LOWER_LIMIT'):= 0;
3424             l_rate_break_data('UPPER_LIMIT'):= l_attr_value_to;
3425             l_rate_break_data('RATE')       := Fnd_Number.Number_To_Canonical(l_rate);
3426             l_rate_break_data('RATE_TYPE')  := l_rate_type;
3427             l_rate_break_data('ATTRIBUTE')  := l_attr2_type;
3428             l_rate_break_data('TYPE')       := l_type;
3429             l_rate_break_data('SUBTYPE')    := l_subtype2;
3430 
3431             l_rate_break_block_tbl(1) := l_rate_break_data;
3432 
3433             FTE_RATE_CHART_LOADER.PROCESS_RATE_BREAK(p_block_header  => g_dummy_block_hdr_tbl,
3434                                                      p_block_data    => l_rate_break_block_tbl ,
3435                                                      p_line_number   => p_line_number,
3436                                                      p_validate_column => FALSE,
3437                                                      x_status        => x_status,
3438                                                      x_error_msg     => x_error_msg);
3439 
3440             l_rate_break_data.DELETE;
3441             l_rate_break_block_tbl.DELETE;
3442 
3443             IF (x_status <> -1) THEN
3444                 FTE_UTIL_PKG.Write_LogFile(l_module_name, 'Error: ' || x_error_msg);
3445                 FTE_UTIL_PKG.Exit_Debug(l_module_name);
3446                 RETURN;
3447             END IF;
3448 
3449             -- Break 2
3450             IF (l_min_break) THEN
3451                 x_linenum         := x_linenum + 1;
3452                 l_attr_value_from := Fnd_Number.Canonical_To_Number(l_attr_value_to);
3453                 l_attr_value_to   := g_max_number;
3454                 l_rate            := p_charge;
3455                 l_rate_type       := 'BLOCK_UNIT';
3456 
3457                 l_rate_break_data('ACTION')     := G_ACTION;
3458                 l_rate_break_data('LINE_NUMBER'):= x_linenum;
3459                 l_rate_break_data('LOWER_LIMIT'):= Fnd_Number.Number_To_Canonical(l_attr_value_from);
3460                 l_rate_break_data('UPPER_LIMIT'):= Fnd_Number.Number_To_Canonical(l_attr_value_to);
3461                 l_rate_break_data('RATE')       := Fnd_Number.Number_To_Canonical(l_rate);
3462                 l_rate_break_data('RATE_TYPE')  := l_rate_type;
3463                 l_rate_break_data('ATTRIBUTE')  := l_attr2_type;
3464                 l_rate_break_data('TYPE')       := l_type;
3465                 l_rate_break_data('SUBTYPE')    := l_subtype;
3466 
3467                 l_rate_break_block_tbl(1) := l_rate_break_data;
3468 
3469                 FTE_RATE_CHART_LOADER.PROCESS_RATE_BREAK(p_block_header  => g_dummy_block_hdr_tbl,
3470                                                          p_block_data    => l_rate_break_block_tbl,
3471                                                          p_line_number   => p_line_number,
3472                                                          p_validate_column => FALSE,
3473                                                          x_status        => x_status,
3474                                                          x_error_msg     => x_error_msg);
3475 
3476                 l_rate_break_data.DELETE;
3477                 l_rate_break_block_tbl.DELETE;
3478 
3479                 IF (x_status <> -1) THEN
3480                     FTE_UTIL_PKG.Write_LogFile(l_module_name, 'Error: ' || x_error_msg);
3481                     FTE_UTIL_PKG.Exit_Debug(l_module_name);
3482                     RETURN;
3483                 END IF;
3484             END IF;
3485         END IF;
3486 
3487         FTE_UTIL_PKG.Exit_Debug(l_module_name);
3488     EXCEPTION
3489         WHEN OTHERS THEN
3490             x_status := 2;
3491             FTE_UTIL_PKG.Exit_Debug(l_module_name);
3492             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'Process_Loading_Charges Error: ' || sqlerrm);
3493 
3494     End PROCESS_LOADING_CHARGES;
3495 
3496     --_________________________________________________________________________________--
3497     --
3498     -- PROCEDURE: PROCESS_BLOCK_UNIT_CHARGES
3499     --
3500     -- Purpose Process block unit charges that do not have a minimum charge.
3501     --
3502     -- Parameters
3503     --
3504     --  OUT
3505     --    x_status,  the return status, -1 for success
3506     --                                   2 for failure.
3507     --    x_error_msg, the corresponding error message,
3508     --                 if any exception occurs during the process.
3509     --_________________________________________________________________________________--
3510 
3511     PROCEDURE PROCESS_BLOCK_UNIT_CHARGES(p_charge      IN  NUMBER,
3512                                          p_subtype     IN  VARCHAR2,
3513                                          p_uom         IN  VARCHAR2,
3514                                          p_process_id  IN  NUMBER,
3515                                          x_linenum     IN  OUT NOCOPY NUMBER,
3516                                          p_line_number IN  NUMBER,
3517                                          x_error_msg   OUT NOCOPY VARCHAR2,
3518                                          x_status      OUT NOCOPY NUMBER) IS
3519 
3520     l_type             VARCHAR2(30);
3521     l_break_type       VARCHAR2(30);
3522     l_description      VARCHAR2(300);
3523     l_context          VARCHAR2(50);
3524     l_attribute_value  VARCHAR2(50);
3525     l_attribute_type   VARCHAR2(50);
3526     l_attr_value_to    VARCHAR2(50);
3527     l_rate_type        VARCHAR2(25);
3528     l_volume_type      VARCHAR2(25);
3529     l_subtype          VARCHAR2(30);
3530 
3531     l_rate_line_data       FTE_BULKLOAD_PKG.data_values_tbl;
3532     l_rate_break_data      FTE_BULKLOAD_PKG.data_values_tbl;
3533     l_rate_line_block_tbl  FTE_BULKLOAD_PKG.block_data_tbl;
3534     l_rate_break_block_tbl FTE_BULKLOAD_PKG.block_data_tbl;
3535 
3536     l_module_name      CONSTANT VARCHAR2(100) := 'FTE.PLSQL.' || G_PKG_NAME || '.PROCESS_BLOCK_UNIT_CHARGES';
3537 
3538     BEGIN
3539         FTE_UTIL_PKG.Enter_Debug(l_module_name);
3540         x_status := -1;
3541 
3542         x_linenum    := x_linenum + 1;
3543         l_type       := 'ACCESSORIAL_SURCHARGE';
3544         l_break_type := 'POINT';
3545         l_rate_type  := 'FIXED';
3546         l_volume_type:= 'TOTAL_QUANTITY';
3547 
3548         IF (p_subtype = FTE_RTG_GLOBALS.G_C_OUT_OF_ROUTE_CH) THEN
3549             l_description := 'Out Of Route Charge: Line ' || x_linenum;
3550         ELSIF (p_subtype = FTE_RTG_GLOBALS.G_C_WEEKDAY_LAYOVER_CH) THEN
3551             l_description := 'Weekday Layover Charge: Line ' || x_linenum;
3552         END IF;
3553 
3554         IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
3555             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_description', l_description);
3556             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_type       ', l_type);
3557             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_break_type ', l_break_type);
3558             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'p_subtype    ', p_subtype);
3559             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_rate_type  ', l_rate_type);
3560             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_volume_type', l_volume_type);
3561             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'g_unit_uom   ', g_unit_uom);
3562         END IF;
3563 
3564         l_rate_line_data('ACTION')      := G_ACTION;
3565         l_rate_line_data('LINE_NUMBER') := x_linenum;
3566         l_rate_line_data('DESCRIPTION') := l_description;
3567         l_rate_line_data('UOM')         := g_unit_uom;
3568         l_rate_line_data('VOLUME_TYPE') := l_volume_type;
3569         l_rate_line_data('TYPE')        := l_type;
3570         l_rate_line_data('RATE_TYPE')   := l_rate_type;
3571         l_rate_line_data('SUBTYPE')     := p_subtype;
3572         l_rate_line_data('RATE_BREAK_TYPE') := l_break_type;
3573 
3574         l_rate_line_block_tbl(1) := l_rate_line_data;
3575 
3576         FTE_RATE_CHART_LOADER.PROCESS_RATE_LINE(p_block_header  => g_dummy_block_hdr_tbl,
3577                                                 p_block_data    => l_rate_line_block_tbl,
3578                                                 p_line_number   => p_line_number,
3579                                                 p_validate_column => FALSE,
3580                                                 x_status        => x_status,
3581                                                 x_error_msg     => x_error_msg);
3582 
3583         l_rate_line_data.DELETE;
3584         l_rate_line_block_tbl.DELETE;
3585 
3586         IF (x_status <> -1) THEN
3587             FTE_UTIL_PKG.Write_LogFile(l_module_name, x_error_msg);
3588             FTE_UTIL_PKG.Exit_Debug(l_module_name);
3589             RETURN;
3590         END IF;
3591 
3592         -- add Rate Type Attribute
3593         l_attribute_type  := 'TL_RATE_TYPE';
3594         l_context         := FTE_RTG_GLOBALS.G_AX_TL_RATE_TYPE;
3595 
3596         IF (p_subtype = FTE_RTG_GLOBALS.G_C_OUT_OF_ROUTE_CH) THEN
3597             l_attribute_value := FTE_RTG_GLOBALS.G_TL_RATE_TYPE_LOAD;
3598         ELSIF (p_subtype = FTE_RTG_GLOBALS.G_C_WEEKDAY_LAYOVER_CH) THEN
3599             l_attribute_value := FTE_RTG_GLOBALS.G_TL_RATE_TYPE_STOP;
3600         END IF;
3601 
3602         IF (l_attribute_type IS NOT NULL AND l_context IS NOT NULL) THEN
3603             ADD_ATTRIBUTE (p_attribute_type      => l_attribute_type,
3604                            p_attribute_value     => l_attribute_value,
3605                            p_attribute_value_to  => NULL,
3606                            p_context             => l_context,
3607                            p_comp_operator       => '=',
3608                            p_linenum             => x_linenum,
3609                            p_process_id          => p_process_id,
3610                            p_line_number         => p_line_number,
3611                            x_error_msg           => x_error_msg,
3612                            x_status              => x_status);
3613         END IF;
3614 
3615         -- Add Charge Type Attribute
3616         IF (p_subtype = FTE_RTG_GLOBALS.G_C_OUT_OF_ROUTE_CH) THEN
3617             l_attribute_type := 'TL_CHARGED_OUT_RT_DISTANCE';
3618             l_context        := FTE_RTG_GLOBALS.G_AX_TL_CHARGED_OUT_RT_DIST;
3619 
3620         ELSIF (p_subtype = FTE_RTG_GLOBALS.G_C_WEEKDAY_LAYOVER_CH) THEN
3621             l_attribute_type := 'TL_NUM_WEEKDAY_LAYOVERS';
3622             l_context        := FTE_RTG_GLOBALS.G_AX_TL_NUM_WEEKDAY_LAYOVERS;
3623         END IF;
3624 
3625 
3626         -- NOTE: attributes with context VOLUME should not be put on the PBH.
3627 
3628         -- break
3629         x_linenum := x_linenum + 1;
3630 
3631         l_rate_break_data('ACTION')     := G_ACTION;
3632         l_rate_break_data('LINE_NUMBER'):= x_linenum;
3633         l_rate_break_data('LOWER_LIMIT'):= 0;
3634         l_rate_break_data('UPPER_LIMIT'):= FTE_UTIL_PKG.Canonicalize_Number(g_max_number);
3635         l_rate_break_data('RATE')       := p_charge;
3636         l_rate_break_data('RATE_TYPE')  := 'BLOCK_UNIT';
3637         l_rate_break_data('ATTRIBUTE')  := l_attribute_type;
3638         l_rate_break_data('TYPE')       := l_type;
3639         l_rate_break_data('SUBTYPE')    := l_subtype;
3640         l_rate_break_data('CONTEXT')    := l_context;
3641 
3642         l_rate_break_block_tbl(1) := l_rate_break_data;
3643 
3644         FTE_RATE_CHART_LOADER.PROCESS_RATE_BREAK(p_block_header  => g_dummy_block_hdr_tbl,
3645                                                  p_block_data    => l_rate_break_block_tbl,
3646                                                  p_line_number   => p_line_number,
3647                                                  p_validate_column => FALSE,
3648                                                  x_status        => x_status,
3649                                                  x_error_msg     => x_error_msg);
3650 
3651         l_rate_break_data.DELETE;
3652         l_rate_break_block_tbl.DELETE;
3653 
3654         IF (x_status <> -1) THEN
3655             FTE_UTIL_PKG.Write_LogFile(l_module_name, x_error_msg);
3656             FTE_UTIL_PKG.Exit_Debug(l_module_name);
3657             RETURN;
3658         END IF;
3659 
3660         FTE_UTIL_PKG.Exit_Debug(l_module_name);
3661 
3662     EXCEPTION
3663         WHEN OTHERS THEN
3664             x_status := 2;
3665             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'Process_Block_Unit_Charges Error',sqlerrm);
3666             FTE_UTIL_PKG.Exit_Debug(l_module_name);
3667 
3668     END PROCESS_BLOCK_UNIT_CHARGES;
3669 
3670     --_________________________________________________________________________________--
3671     --                                                                                 --
3672     -- PROCEDURE: PROCESS_CHART_SURCHARGES
3673     --
3674     -- PURPOSE:
3675     --
3676     -- PARAMETERS
3677     --  IN
3678     --   p_values:      An Associative array of data with header as key.
3679     --   p_chart_type   rate chart type, may be TL_MODIFIER...
3680     --   p_process_id   the load id of the current process
3681     --   p_line_number  line number in the file, used for error logging
3682     --   p_doValidate   to indicate whether the validations to be done or not.
3683     --                  From UI, this takes the value of FALSE. Defaulted to TRUE.
3684     --
3685     --  IN OUT
3686     --   x_linenum
3687     --
3688     --  OUT
3689     --    x_status,  the return status, -1 for success
3690     --                                   2 for failure.
3691     --    x_error_msg, the corresponding error message,
3692     --                 if any exception occurs during the process.
3693     --_________________________________________________________________________________--
3694 
3695     PROCEDURE PROCESS_CHART_SURCHARGES (p_values      IN   FTE_BULKLOAD_PKG.data_values_tbl,
3696                                         p_chart_type  IN   VARCHAR2,
3697                                         p_process_id  IN   NUMBER,
3698                                         p_line_number IN   NUMBER,
3699                                         p_doValidate  IN   BOOLEAN DEFAULT TRUE,
3700                                         x_linenum     IN   OUT  NOCOPY NUMBER,
3701                                         x_error_msg   OUT  NOCOPY VARCHAR2,
3702                                         x_status      OUT  NOCOPY NUMBER  ) IS
3703 
3704     l_module_name CONSTANT VARCHAR2(100) := 'FTE.PLSQL.'||G_PKG_NAME||'.PROCESS_CHART_SURCHARGES';
3705 
3706     l_num_free_stops               NUMBER;
3707     l_stop_chg_1                   NUMBER;
3708     l_stop_chg_2                   NUMBER;
3709     l_stop_chg_3                   NUMBER;
3710     l_stop_chg_4                   NUMBER;
3711     l_stop_chg_5                   NUMBER;
3712     l_stop_chg_x                   NUMBER;
3713     l_out_rt_chg                   NUMBER;
3714     l_handling_chg                 NUMBER;
3715     l_min_handling_chg             NUMBER;
3716     l_ld_chg                       NUMBER;
3717     l_min_ld_chg                   NUMBER;
3718     l_asst_ld_chg                  NUMBER;
3719     l_unld_chg                     NUMBER;
3720     l_min_unld_chg                 NUMBER;
3721     l_asst_unld_chg                NUMBER;
3722     l_min_asst_unld_chg            NUMBER;
3723     l_min_asst_ld_chg              NUMBER;
3724     l_cont_mv_dsct_prcnt           NUMBER;
3725     l_wkday_layovr_chg             NUMBER;
3726     l_out_rt_chg_uom               VARCHAR2(20);
3727     l_rate_basis                   VARCHAR2(20);
3728     l_rate_basis_uom               VARCHAR2(20);
3729     l_break_type                   VARCHAR2(30);
3730     l_break_charges                STRINGARRAY;
3731     l_attribute_type               VARCHAR2(50);
3732     l_attribute_value              VARCHAR2(50);
3733     l_context                      VARCHAR2(50);
3734     l_load_type_prefix             VARCHAR2(30);
3735     l_description                  VARCHAR2(100);
3736     l_type                         VARCHAR2(50);
3737     l_subtype                      VARCHAR2(50);
3738     l_carrier_name                 VARCHAR2(100);
3739     l_service_level                VARCHAR2(30);
3740 
3741     l_rate_line_data      FTE_BULKLOAD_PKG.data_values_tbl;
3742     l_rate_line_block_tbl FTE_BULKLOAD_PKG.block_data_tbl;
3743 
3744     BEGIN
3745 
3746         FTE_UTIL_PKG.Enter_Debug(l_module_name);
3747         x_status := -1;
3748 
3749         l_carrier_name      := FTE_UTIL_PKG.GET_DATA('CARRIER_NAME', p_values);
3750         l_num_free_stops    := FTE_UTIL_PKG.GET_DATA('NUMBER_OF_FREE_STOPS', p_values);
3751         l_rate_basis        := FTE_UTIL_PKG.GET_DATA('BASIS_FOR_HANDLING_LOADING_UNLOADING_CHARGES', p_values);
3752         l_rate_basis_uom    := FTE_UTIL_PKG.GET_DATA('UOM_FOR_HANDLING_LOADING_UNLOADING_CHARGE_BASIS', p_values);
3753         l_out_rt_chg_uom    := FTE_UTIL_PKG.GET_DATA('OUT_OF_ROUTE_CHARGE_BASIS_UOM', p_values);
3754         l_stop_chg_1        := FTE_UTIL_PKG.GET_DATA('FIRST_ADD_STOP_OFF_CHARGES', p_values );
3755         l_stop_chg_2        := FTE_UTIL_PKG.GET_DATA('SECOND_ADD_STOP_OFF_CHARGES', p_values);
3756         l_stop_chg_3        := FTE_UTIL_PKG.GET_DATA('THIRD_ADD_STOP_OFF_CHARGES', p_values);
3757         l_stop_chg_4        := FTE_UTIL_PKG.GET_DATA('FOURTH_ADD_STOP_OFF_CHARGES', p_values);
3758         l_stop_chg_5        := FTE_UTIL_PKG.GET_DATA('FIFTH_ADD_STOP_OFF_CHARGES', p_values);
3759         l_stop_chg_x        := FTE_UTIL_PKG.GET_DATA('ADDITIONAL_STOP_CHARGES',p_values);
3760         l_out_rt_chg        := FTE_UTIL_PKG.GET_DATA('OUT_OF_ROUTE_CHARGES',p_values);
3761         l_handling_chg      := FTE_UTIL_PKG.GET_DATA('HANDLING_CHARGES', p_values);
3762         l_min_handling_chg  := FTE_UTIL_PKG.GET_DATA('MINIMUM_HANDLING_CHARGES', p_values);
3763         l_ld_chg            := FTE_UTIL_PKG.GET_DATA('LOADING_CHARGES', p_values);
3764         l_min_ld_chg        := FTE_UTIL_PKG.GET_DATA('MINIMUM_LOADING_CHARGES', p_values);
3765         l_unld_chg          := FTE_UTIL_PKG.GET_DATA('UNLOADING_CHARGES', p_values);
3766         l_min_unld_chg      := FTE_UTIL_PKG.GET_DATA('MINIMUM_UNLOADING_CHARGES', p_values);
3767         l_asst_unld_chg     := FTE_UTIL_PKG.GET_DATA('ASSISTED_UNLOADING_CHARGES', p_values);
3768         l_min_asst_unld_chg := FTE_UTIL_PKG.GET_DATA('MINIMUM_ASSISTED_UNLOADING_CHARGES', p_values);
3769         l_asst_ld_chg       := FTE_UTIL_PKG.GET_DATA('ASSISTED_LOADING_CHARGES', p_values);
3770         l_min_asst_ld_chg   := FTE_UTIL_PKG.GET_DATA('MINIMUM_ASSISTED_LOADING_CHARGES', p_values);
3771         l_cont_mv_dsct_prcnt:= FTE_UTIL_PKG.GET_DATA('CONTINUOUS_MOVE_DISCOUNT_PERCENTAGE', p_values);
3772         l_wkday_layovr_chg  := FTE_UTIL_PKG.GET_DATA('WEEKDAY_LAYOVER_CHARGES', p_values);
3773         l_service_level     := FTE_UTIL_PKG.GET_DATA('SERVICE_LEVEL', p_values);
3774 
3775     IF (NOT p_doValidate) THEN
3776       l_service_level     := FTE_UTIL_PKG.GET_DATA('SERVICE_CODE', p_values);
3777     END IF;
3778 
3779         l_rate_basis := UPPER(l_rate_basis);
3780 
3781         BEGIN
3782             l_stop_chg_1        := Fnd_Number.Canonical_To_Number(l_stop_chg_1);
3783             l_stop_chg_2        := Fnd_Number.Canonical_To_Number(l_stop_chg_2);
3784             l_stop_chg_3        := Fnd_Number.Canonical_To_Number(l_stop_chg_3);
3785             l_stop_chg_4        := Fnd_Number.Canonical_To_Number(l_stop_chg_4);
3786             l_stop_chg_5        := Fnd_Number.Canonical_To_Number(l_stop_chg_5);
3787             l_stop_chg_x        := Fnd_Number.Canonical_To_Number(l_stop_chg_x);
3788             l_out_rt_chg        := Fnd_Number.Canonical_To_Number(l_out_rt_chg);
3789             l_handling_chg      := Fnd_Number.Canonical_To_Number(l_handling_chg);
3790             l_min_handling_chg  := Fnd_Number.Canonical_To_Number(l_min_handling_chg);
3791             l_ld_chg            := Fnd_Number.Canonical_To_Number(l_ld_chg);
3792             l_min_ld_chg        := Fnd_Number.Canonical_To_Number(l_min_ld_chg);
3793             l_unld_chg          := Fnd_Number.Canonical_To_Number(l_unld_chg);
3794             l_min_unld_chg      := Fnd_Number.Canonical_To_Number(l_min_unld_chg);
3795             l_asst_unld_chg     := Fnd_Number.Canonical_To_Number(l_asst_unld_chg);
3796             l_min_asst_unld_chg := Fnd_Number.Canonical_To_Number(l_min_asst_unld_chg);
3797             l_asst_ld_chg       := Fnd_Number.Canonical_To_Number(l_asst_ld_chg);
3798             l_min_asst_ld_chg   := Fnd_Number.Canonical_To_Number(l_min_asst_ld_chg);
3799             l_cont_mv_dsct_prcnt:= Fnd_Number.Canonical_To_Number(l_cont_mv_dsct_prcnt);
3800             l_wkday_layovr_chg  := Fnd_Number.Canonical_To_Number(l_wkday_layovr_chg);
3801         EXCEPTION
3802             WHEN OTHERS THEN
3803                 x_status := 2;
3804                 FTE_UTIL_PKG.Write_LogFile(l_module_name,'Unexcepted Error ', sqlerrm);
3805                 FTE_UTIL_PKG.Exit_Debug(l_module_name);
3806         END;
3807 
3808         IF ( p_doValidate ) THEN
3809             IF (p_chart_type <> 'FAC_MODIFIER') THEN
3810                 l_service_level := FTE_VALIDATION_PKG.VALIDATE_SERVICE_LEVEL(p_carrier_id    => NULL,
3811                                                                              p_carrier_name  => l_carrier_name,
3812                                                                              p_service_level => l_service_level,
3813                                                                              p_line_number   => p_line_number,
3814                                                                              x_error_msg     => x_error_msg,
3815                                                                              x_status        => x_status);
3816                 IF (x_status <> -1) THEN
3817                     FTE_UTIL_PKG.Exit_Debug(l_module_name);
3818                     RETURN;
3819                 END IF;
3820             END IF;
3821         END IF;
3822 
3823         IF (l_out_rt_chg < 0         OR l_stop_chg_1 < 0 OR l_handling_chg < 0 OR
3824             l_asst_unld_chg < 0      OR l_stop_chg_2 < 0 OR l_min_handling_chg < 0 OR
3825             l_min_asst_unld_chg < 0  OR l_stop_chg_3 < 0 OR l_min_ld_chg < 0 OR
3826             l_min_asst_ld_chg < 0    OR l_stop_chg_4 < 0 OR l_ld_chg < 0 OR
3827             l_asst_ld_chg < 0        OR l_stop_chg_5 < 0 OR l_unld_chg < 0 OR
3828             l_cont_mv_dsct_prcnt < 0 OR l_stop_chg_x < 0 OR l_min_unld_chg < 0 OR
3829             l_wkday_layovr_chg < 0 ) THEN
3830 
3831             x_status := 2;
3832             x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_VALUE_ERROR',
3833                                                 p_tokens => STRINGARRAY('ENTITY'),
3834                                                 p_values => STRINGARRAY('Charge'));
3835             FTE_UTIL_PKG.Write_OutFile( p_msg    => x_error_msg,
3836                                         p_module_name => l_module_name,
3837                                         p_category    => 'D',
3838                                         p_line_number => p_line_number);
3839             FTE_UTIL_PKG.Exit_Debug(l_module_name);
3840             RETURN;
3841         END IF;
3842 
3843         IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
3844 
3845             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'Validating Modifier for Process ID ' || p_process_id);
3846             FTE_UTIL_PKG.Write_LogFile(l_module_name, '-------------------------------------------');
3847             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_num_free_stops ',l_num_free_stops);
3848             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_stop_chg_1     ',l_stop_chg_1);
3849             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_stop_chg_2     ',l_stop_chg_2);
3850             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_stop_chg_3     ',l_stop_chg_3);
3851             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_stop_chg_4     ',l_stop_chg_4);
3852             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_stop_chg_5     ',l_stop_chg_5);
3853             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_stop_chg_x     ',l_stop_chg_x);
3854             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_out_rt_chg     ',l_out_rt_chg);
3855             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_out_rt_chg_uom ',l_out_rt_chg_uom);
3856             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_rate_basis     ',l_rate_basis);
3857             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_rate_basis_uom ',l_rate_basis_uom);
3858             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_handling_chg   ',l_handling_chg);
3859             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_min_handling_chg',l_min_handling_chg);
3860             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_ld_chg         ',l_ld_chg);
3861             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_min_ld_chg     ',l_min_ld_chg);
3862             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_asst_ld_chg    ',l_asst_ld_chg);
3863             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_unld_chg       ',l_unld_chg);
3864             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_min_unld_chg   ',l_min_unld_chg);
3865             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_asst_unld_chg  ',l_asst_unld_chg);
3866             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_min_asst_unld_chg ',l_min_asst_unld_chg);
3867             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_wkday_layovr_chg  ',l_wkday_layovr_chg);
3868             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_cont_mv_dsct_prcnt',l_cont_mv_dsct_prcnt);
3869         END IF;
3870 
3871         -- Attribute : Rate Basis, Rate Basis UOM are required
3872 
3873         IF (l_rate_basis IS NULL OR LENGTH(l_rate_basis) = 0 OR l_rate_basis = 'FLAT') THEN
3874 
3875             l_rate_basis := 'FLAT';
3876             l_rate_basis_uom := g_unit_uom;
3877 
3878         ELSIF (l_rate_basis NOT IN (FTE_RTG_GLOBALS.G_TL_RATE_BASIS_DIST,
3879                                     FTE_RTG_GLOBALS.G_TL_RATE_BASIS_WT,
3880                                     FTE_RTG_GLOBALS.G_TL_RATE_BASIS_VOL,
3881                                     FTE_RTG_GLOBALS.G_TL_RATE_BASIS_CONT,
3882                                     FTE_RTG_GLOBALS.G_TL_RATE_BASIS_PALLET,
3883                                     FTE_RTG_GLOBALS.G_TL_RATE_BASIS_TIME,
3884                                     FTE_RTG_GLOBALS.G_TL_RATE_BASIS_FLAT)) THEN
3885 
3886             x_status := 2;
3887             x_error_msg := FTE_UTIL_PKG.GET_MSG('FTE_BASIS_INVALID');
3888             FTE_UTIL_PKG.Write_OutFile( p_msg          => x_error_msg,
3889                                         p_module_name => l_module_name,
3890                                         p_category    => 'D',
3891                                         p_line_number => p_line_number);
3892             FTE_UTIL_PKG.Exit_Debug(l_module_name);
3893             RETURN;
3894         --+
3895         -- UOM Required for 'DISTANCE', 'TIME', 'VOLUME', 'WEIGHT'
3896         --+
3897         ELSIF (l_rate_basis IN (FTE_RTG_GLOBALS.G_TL_RATE_BASIS_DIST,
3898                                 FTE_RTG_GLOBALS.G_TL_RATE_BASIS_WT,
3899                                 FTE_RTG_GLOBALS.G_TL_RATE_BASIS_VOL,
3900                                 FTE_RTG_GLOBALS.G_TL_RATE_BASIS_TIME)) THEN
3901             IF (l_rate_basis_uom IS NULL OR LENGTH(l_rate_basis_uom) = 0) THEN
3902                 x_status := 2;
3903                 x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_RATE_BASIS_UOM_MISSING');
3904                 FTE_UTIL_PKG.Write_OutFile( p_msg          => x_error_msg,
3905                                             p_module_name => l_module_name,
3906                                             p_category    => 'A',
3907                                             p_line_number => p_line_number);
3908 
3909                 FTE_UTIL_PKG.Exit_Debug(l_module_name);
3910                 RETURN;
3911             ELSE
3912                 l_rate_basis_uom := FTE_UTIL_PKG.GET_UOM_CODE(p_uom => l_rate_basis_uom);
3913 
3914                 IF (x_status <> -1 OR l_rate_basis_uom IS NULL) THEN
3915                     x_status := 2;
3916                     x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name  => 'FTE_CAT_UOM_INVALID',
3917                                                         p_tokens   => STRINGARRAY('UOM'),
3918                                                         p_values   => STRINGARRAY(l_rate_basis_uom));
3919                     FTE_UTIL_PKG.WRITE_OUTFILE(p_msg          => x_error_msg,
3920                                                p_module_name => l_module_name,
3921                                                p_category    => 'D',
3922                                                p_line_number => p_line_number);
3923 
3924                     FTE_UTIL_PKG.Exit_Debug(l_module_name);
3925                     RETURN;
3926                 END IF;
3927 
3928             END IF;
3929 
3930         ELSIF (l_rate_basis IN (FTE_RTG_GLOBALS.G_TL_RATE_BASIS_CONT,
3931                                 FTE_RTG_GLOBALS.G_TL_RATE_BASIS_PALLET)) THEN
3932             l_rate_basis_uom := g_unit_uom;
3933         END IF;
3934 
3935         IF (p_chart_type = 'TL_MODIFIER') THEN
3936             --+
3937             -- Validate rate basis against carrier preferences
3938             --+
3939             CHECK_RATE_BASIS(p_carrier_name   => l_carrier_name,
3940                              p_rate_basis     => l_rate_basis,
3941                              p_rate_basis_uom => l_rate_basis_uom,
3942                              p_service_level  => l_service_level,
3943                              p_line_number    => p_line_number,
3944                              x_status         => x_status,
3945                              x_error_msg      => x_error_msg);
3946 
3947             IF (x_status <> -1) THEN
3948                 FTE_UTIL_PKG.Exit_Debug(l_module_name);
3949                 RETURN;
3950             END IF;
3951         END IF;
3952 
3953         --+
3954         -- OUT OF ROUTE Charges
3955         --+
3956 
3957         IF (l_out_rt_chg IS NOT NULL) THEN
3958 
3959             IF (l_out_rt_chg_uom IS NULL) THEN
3960                 x_status := 2;
3961                 x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_OUT_RTE_CHG_UOM_MISSING');
3962                 FTE_UTIL_PKG.Write_OutFile(p_msg         => x_error_msg,
3963                                            p_module_name => l_module_name,
3964                                            p_category    => 'A',
3965                                            p_line_number => p_line_number);
3966                 FTE_UTIL_PKG.Exit_Debug(l_module_name);
3967                 RETURN;
3968             ELSE
3969 
3970                 l_out_rt_chg_uom := FTE_UTIL_PKG.GET_UOM_CODE(l_out_rt_chg_uom);
3971 
3972                 IF (l_out_rt_chg_uom IS NULL) THEN
3973                     x_status := 2;
3974                     FTE_UTIL_PKG.Write_LogFile(l_module_name,'Returned with Error from FTE_UTIL_PKG.GET_UOM_CODE');
3975                     FTE_UTIL_PKG.Exit_Debug(l_module_name);
3976                     RETURN;
3977                 END IF;
3978 
3979             END IF;
3980 
3981             PROCESS_BLOCK_UNIT_CHARGES(p_charge      => l_out_rt_chg,
3982                                        p_subtype     => FTE_RTG_GLOBALS.G_C_OUT_OF_ROUTE_CH,
3983                                        p_uom         => g_unit_uom,
3984                                        p_process_id  => p_process_id,
3985                                        x_linenum     => x_linenum,
3986                                        p_line_number => p_line_number,
3987                                        x_error_msg   => x_error_msg,
3988                                        x_status      => x_status);
3989 
3990             IF (x_status <> -1) THEN
3991                 FTE_UTIL_PKG.Exit_Debug(l_module_name);
3992                 RETURN;
3993             END IF;
3994 
3995         END IF;
3996 
3997         --+
3998         -- Process WEEKDAY LAYOVER Charges if specified.
3999         --+
4000 
4001         IF (l_wkday_layovr_chg IS NOT NULL) THEN
4002 
4003             PROCESS_BLOCK_UNIT_CHARGES(p_charge      => l_wkday_layovr_chg,
4004                                        p_subtype     => FTE_RTG_GLOBALS.G_C_WEEKDAY_LAYOVER_CH,
4005                                        p_uom         => g_unit_uom,
4006                                        p_process_id  => p_process_id,
4007                                        x_linenum     => x_linenum,
4008                                        p_line_number => p_line_number,
4009                                        x_error_msg   => x_error_msg,
4010                                        x_status      => x_status);
4011 
4012             IF (x_status <> -1) THEN
4013                 FTE_UTIL_PKG.Exit_Debug(l_module_name);
4014                 RETURN;
4015             END IF;
4016         END IF;
4017 
4018         --+
4019         -- Process CONTINUOUS MOVE Charges if specified.
4020         --+
4021 
4022         IF (l_cont_mv_dsct_prcnt IS NOT NULL) THEN
4023 
4024             l_type    := 'DISCOUNT';
4025             l_subtype := FTE_RTG_GLOBALS.G_C_CONTINUOUS_MOVE_DISCOUNT;
4026 
4027             x_linenum := x_linenum + 1;
4028             l_description := ' Continuous Move Discount Line ' || x_linenum;
4029 
4030             l_rate_line_data('ACTION')      := G_ACTION;
4031             l_rate_line_data('LINE_NUMBER') := x_linenum;
4032             l_rate_line_data('DESCRIPTION') := l_description;
4033             l_rate_line_data('UOM')         := g_unit_uom;
4034             l_rate_line_data('VOLUME_TYPE') := 'TOTAL_QUANTITY';
4035             l_rate_line_data('TYPE')        := l_type;
4036             l_rate_line_data('SUBTYPE')     := l_subtype;
4037             l_rate_line_data('PERCENTAGE')  := Fnd_Number.Number_To_Canonical(l_cont_mv_dsct_prcnt);
4038 
4039             l_rate_line_block_tbl(1) := l_rate_line_data;
4040 
4041             FTE_RATE_CHART_LOADER.PROCESS_RATE_LINE(p_block_header  => g_dummy_block_hdr_tbl,
4042                                                     p_block_data    => l_rate_line_block_tbl,
4043                                                     p_line_number   => p_line_number,
4044                                                     p_validate_column => FALSE,
4045                                                     x_status        => x_status,
4046                                                     x_error_msg     => x_error_msg);
4047 
4048             l_rate_line_data.DELETE;
4049             l_rate_line_block_tbl.DELETE;
4050 
4051             IF (x_status <> -1) THEN
4052                 FTE_UTIL_PKG.Write_LogFile(l_module_name, x_error_msg);
4053                 FTE_UTIL_PKG.Exit_Debug(l_module_name);
4054                 RETURN;
4055             END IF;
4056 
4057             -- Add CHARGE Attribute
4058             l_attribute_type := 'TL_CM_DISCOUNT_FLG';
4059             l_context        := FTE_RTG_GLOBALS.G_AX_TL_CM_DISCOUNT_FLG;
4060             ADD_ATTRIBUTE (p_attribute_type      => l_attribute_type,
4061                            p_attribute_value     => 'Y',
4062                            p_attribute_value_to  => NULL,
4063                            p_context             => l_context,
4064                            p_comp_operator       => NULL,
4065                            p_linenum             => x_linenum,
4066                            p_process_id          => p_process_id,
4067                            p_line_number         => p_line_number,
4068                            x_error_msg           => x_error_msg,
4069                            x_status              => x_status);
4070         END IF;
4071 
4072         --+
4073         --  Processing for STOP OFF Charges, if specified.
4074         --  l_num_free_stops is required to specify additional stop-off charges.
4075         --  It has the number of stops that are included in the base rate.
4076         --+
4077 
4078         IF (l_num_free_stops IS NOT NULL AND
4079             (l_stop_chg_1 IS NULL AND l_stop_chg_2 IS NULL AND l_stop_chg_3 IS NULL AND
4080              l_stop_chg_4 IS NULL AND l_stop_chg_5 IS NULL AND l_stop_chg_x IS NULL)) THEN
4081             x_status := 2;
4082             x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_LOAD_STOPOFF_CHRG_MISSING');
4083             FTE_UTIL_PKG.Write_OutFile( p_msg         => x_error_msg,
4084                                         p_module_name => l_module_name,
4085                                         p_category    => 'A',
4086                                         p_line_number => p_line_number);
4087             FTE_UTIL_PKG.Exit_Debug(l_module_name);
4088             RETURN;
4089         END IF;
4090 
4091         l_break_charges := STRINGARRAY(0,
4092                                        l_stop_chg_1, l_stop_chg_2,
4093                                        l_stop_chg_3, l_stop_chg_4,
4094                                        l_stop_chg_5, l_stop_chg_x);
4095 
4096         PROCESS_STOPOFF_CHARGES(p_break_charges  => l_break_charges,
4097                                 p_num_free_stops => l_num_free_stops,
4098                                 p_process_id     => p_process_id,
4099                                 x_linenum        => x_linenum,
4100                                 p_line_number    => p_line_number,
4101                                 x_error_msg      => x_error_msg,
4102                                 x_status         => x_status);
4103 
4104         IF (x_status <> -1) THEN
4105             FTE_UTIL_PKG.Exit_Debug(l_module_name);
4106             RETURN;
4107         END IF;
4108 
4109         IF (p_chart_type = 'FAC_MODIFIER') THEN
4110             l_load_type_prefix := 'FACILITY_';
4111         END IF;
4112 
4113         --+
4114         --  Process HANDLING Charges if specified.
4115         --+
4116         IF (l_handling_chg IS NOT NULL) THEN
4117             PROCESS_LOADING_CHARGES(p_min_charge => l_min_handling_chg,
4118                                     p_charge     => l_handling_chg,
4119                                     p_load_type  => l_load_type_prefix || 'HANDLING',
4120                                     p_basis      => l_rate_basis,
4121                                     p_basis_uom  => g_unit_uom,
4122                                     p_process_id => p_process_id,
4123                                     x_linenum    => x_linenum,
4124                                     p_line_number => p_line_number,
4125                                     x_error_msg  => x_error_msg,
4126                                     x_status     => x_status);
4127 
4128             IF (x_status <> -1) THEN
4129                 FTE_UTIL_PKG.Exit_Debug(l_module_name);
4130                 RETURN;
4131             END IF;
4132         END IF;
4133 
4134         --+
4135         -- Process LOADING Charges if specified.
4136         --+
4137 
4138         IF (l_ld_chg IS NOT NULL) THEN
4139 
4140             PROCESS_LOADING_CHARGES(p_min_charge => l_min_ld_chg,
4141                                     p_charge     => l_ld_chg,
4142                                     p_load_type  => l_load_type_prefix || 'LOADING',
4143                                     p_basis      => l_rate_basis,
4144                                     p_basis_uom  => g_unit_uom,
4145                                     p_process_id => p_process_id,
4146                                     x_linenum    => x_linenum,
4147                                     p_line_number => p_line_number,
4148                                     x_error_msg  => x_error_msg,
4149                                     x_status     => x_status);
4150 
4151             IF (x_status <> -1) THEN
4152                 FTE_UTIL_PKG.Exit_Debug(l_module_name);
4153                 RETURN;
4154             END IF;
4155 
4156         END IF;
4157 
4158         --+
4159         -- Process ASSISTED LOADING Charges if specified.
4160         --+
4161 
4162         IF (l_asst_ld_chg IS NOT NULL) THEN
4163             PROCESS_LOADING_CHARGES(p_min_charge => l_min_asst_ld_chg,
4164                                     p_charge     => l_asst_ld_chg,
4165                                     p_load_type  => l_load_type_prefix || 'ASSISTED_LOADING',
4166                                     p_basis      => l_rate_basis,
4167                                     p_basis_uom  => g_unit_uom,
4168                                     p_process_id => p_process_id,
4169                                     x_linenum    => x_linenum,
4170                                     p_line_number => p_line_number,
4171                                     x_error_msg  => x_error_msg,
4172                                     x_status     => x_status);
4173 
4174             IF (x_status <> -1) THEN
4175                 FTE_UTIL_PKG.Exit_Debug(l_module_name);
4176                 RETURN;
4177             END IF;
4178 
4179         END IF;
4180 
4181         --+
4182         -- Process UNLOADING Charges if specified
4183         --+
4184 
4185         IF (l_unld_chg IS NOT NULL) THEN
4186 
4187             PROCESS_LOADING_CHARGES(p_min_charge => l_min_unld_chg,
4188                                     p_charge     => l_unld_chg,
4189                                     p_load_type  => l_load_type_prefix || 'UNLOADING',
4190                                     p_basis      => l_rate_basis,
4191                                     p_basis_uom  => g_unit_uom,
4192                                     p_process_id => p_process_id,
4193                                     x_linenum    => x_linenum,
4194                                     p_line_number => p_line_number,
4195                                     x_error_msg  => x_error_msg,
4196                                     x_status     => x_status);
4197 
4198             IF (x_status <> -1) THEN
4199                 FTE_UTIL_PKG.Exit_Debug(l_module_name);
4200                 RETURN;
4201             END IF;
4202 
4203         END IF;
4204 
4205         --+
4206         -- Process ASSISTED UNLOADING Charges if specified.
4207         --+
4208 
4209         IF (l_asst_unld_chg IS NOT NULL) THEN
4210 
4211             PROCESS_LOADING_CHARGES(p_min_charge => l_min_asst_unld_chg,
4212                                     p_charge     => l_asst_unld_chg,
4213                                     p_load_type  => l_load_type_prefix || 'ASSISTED_UNLOADING',
4214                                     p_basis      => l_rate_basis,
4215                                     p_basis_uom  => g_unit_uom,
4216                                     p_process_id => p_process_id,
4217                                     x_linenum    => x_linenum,
4218                                     p_line_number => p_line_number,
4219                                     x_error_msg  => x_error_msg,
4220                                     x_status     => x_status);
4221 
4222             IF (x_status <> -1) THEN
4223                 FTE_UTIL_PKG.Exit_Debug(l_module_name);
4224                 RETURN;
4225             END IF;
4226         END IF;
4227 
4228         --+
4229         -- For Facility Modifiers, store the rate basis and its uom. Each facility rate chart
4230         -- has a unique rate basis and basis uom.  These will be used to populate
4231         -- fte_prc_parameters.
4232         --+
4233 
4234         IF (p_chart_type = 'FAC_MODIFIER') THEN
4235 
4236             IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
4237                 FTE_UTIL_PKG.Write_LogFile(l_module_name, 'Facility Modifier : Storing UOM ',l_rate_basis_uom);
4238             END IF;
4239 
4240             Fac_Modifier_Names(Fac_Modifier_Names.COUNT+1) := FTE_UTIL_PKG.GET_DATA('FACILITY_RATE_CHART_NAME', p_values);
4241             Fac_Modifier_Bases(Fac_Modifier_Bases.COUNT+1) := l_rate_basis;
4242             Fac_Modifier_Uoms(Fac_Modifier_Uoms.COUNT+1) := l_rate_basis_uom;
4243 
4244         END IF;
4245 
4246         FTE_UTIL_PKG.Exit_Debug(l_module_name);
4247 
4248     EXCEPTION
4249         WHEN OTHERS THEN
4250             x_status := 2;
4251             FTE_UTIL_PKG.Write_LogFile(l_module_name,sqlerrm);
4252             FTE_UTIL_PKG.Exit_Debug(l_module_name);
4253 
4254     END PROCESS_CHART_SURCHARGES;
4255 
4256     --_________________________________________________________________________________--
4257     --                                                                                 --
4258     -- PROCEDURE: PROCESS_FACILITY_CHARGES                                             --
4259     --                                                                                 --
4260     -- Purpose: This is called by PROCESS_DATA if the type to be processed             --
4261     --          is 'FACILITY_CHARGES'.                                                 --
4262     --                                                                                 --
4263     -- IN Parameters                                                                   --
4264     --    1. p_block_header: An associative array with column names in the upload file,--
4265     --                       as indices and integers as values.                        --
4266     --    2. p_block_data  : A table of associative array. Each element in the table   --
4267     --                       represents a single line of data in the upload file.      --
4268     --    3. p_line_number : Specifies the line number in the file where this block    --
4269     --                       begins.This is used for error logging, which aims         --
4270     --                       at ease of loader usage.                                  --
4271     --    4. p_doValidate  : determines whether to validate the incoming data or not.  --
4272     --                       Normally it will have the vlue TRUE, enabling validation  --
4273     --                       When called from RATE CHART EDITOR UI, no need to validate--
4274     --                       so they will pass FALSE for this.                         --
4275     --                                                                                 --
4276     -- Out Parameters                                                                  --
4277     --    1. x_status  :  the return status, -1 for success                            --
4278     --                                        2 for failure.                           --
4279     --    2.x_error_msg: the corresponding error meassge,                              --
4280     --                   if any exception occurs during the process.                   --
4281     --_________________________________________________________________________________--
4282 
4283     PROCEDURE PROCESS_FACILITY_CHARGES(p_block_header IN   FTE_BULKLOAD_PKG.block_header_tbl,
4284                                        p_block_data   IN   FTE_BULKLOAD_PKG.block_data_tbl,
4285                                        p_line_number  IN   NUMBER,
4286                                        x_error_msg    OUT  NOCOPY  VARCHAR2,
4287                                        x_status       OUT  NOCOPY  NUMBER) IS
4288 
4289     l_carrier_name          VARCHAR2(50);
4290     l_currency              VARCHAR2(20);
4291     l_start_date            VARCHAR2(20);
4292     l_end_date              VARCHAR2(20);
4293     l_name                  VARCHAR2(60);
4294     l_rc_name               VARCHAR2(60);
4295     l_list_header_id        NUMBER;
4296     l_description           VARCHAR2(240);
4297     l_process_id            NUMBER;
4298     l_linenum               NUMBER;
4299     l_chart_type            VARCHAR2(50);
4300     l_status                VARCHAR2(4000);
4301     l_service_level         VARCHAR2(30);
4302     l_assoc_rc_ids          STRINGARRAY;
4303 
4304     l_values                FTE_BULKLOAD_PKG.data_values_tbl;
4305     l_rate_hdr_data         FTE_BULKLOAD_PKG.data_values_tbl;
4306     l_rate_line_data        FTE_BULKLOAD_PKG.data_values_tbl;
4307     l_rate_hdr_block_tbl    FTE_BULKLOAD_PKG.block_data_tbl;
4308     l_rate_line_block_tbl   FTE_BULKLOAD_PKG.block_data_tbl;
4309 
4310     l_type         CONSTANT  VARCHAR2(30)  := 'FACILITY_CHARGES';
4311     l_module_name  CONSTANT  VARCHAR2(100) := 'FTE.PLSQL.' || G_PKG_NAME || '.PROCESS_FACILITY_CHARGES';
4312 
4313     BEGIN
4314 
4315         FTE_UTIL_PKG.Enter_Debug(l_module_name);
4316         x_status := -1;
4317 
4318         IF (g_unit_uom IS NULL) THEN
4319             g_unit_uom := GET_GLOBAL_UNIT_UOM(x_status, x_error_msg);
4320             IF (x_status <> -1) THEN
4321                 FTE_UTIL_PKG.Write_LogFile(l_module_name, 'FTE_UTIL_PKG.GET_GLOBAL_UNIT_UOM returned with error' || x_error_msg);
4322                 FTE_UTIL_PKG.Exit_Debug(l_module_name);
4323                 RETURN;
4324             END IF;
4325         END IF;
4326 
4327         FTE_VALIDATION_PKG.VALIDATE_COLUMNS(p_keys      => p_block_header,
4328                                             p_type      => l_type,
4329                                             p_line_number => p_line_number-1,
4330                                             x_status    => x_status,
4331                                             x_error_msg => x_error_msg);
4332         IF (x_status <> -1) THEN
4333            RETURN;
4334         END IF;
4335 
4336         FOR i IN 1..p_block_data.COUNT LOOP
4337 
4338             l_values      := p_block_data(i);
4339             G_ACTION      := FTE_UTIL_PKG.GET_DATA('ACTION', l_values);
4340             l_currency    := FTE_UTIL_PKG.GET_DATA('CURRENCY', l_values);
4341             l_start_date  := FTE_UTIL_PKG.GET_DATA('START_DATE', l_values);
4342             l_end_date    := FTE_UTIL_PKG.GET_DATA('END_DATE', l_values);
4343             l_name        := FTE_UTIL_PKG.GET_DATA('FACILITY_RATE_CHART_NAME', l_values);
4344 
4345             G_ACTION      := UPPER(G_ACTION);
4346 
4347             IF (l_start_date IS NOT NULL) THEN
4348                 BEGIN
4349                     l_start_date := to_char(to_date(l_start_date, 'MM/DD/YYYY'),'MM/DD/YYYY');
4350                 EXCEPTION
4351                     WHEN OTHERS THEN
4352                         x_status := 2;
4353                         x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_DATE_FORMAT_ERROR');
4354                         FTE_UTIL_PKG.Write_OutFile( p_msg    => x_error_msg,
4355                                                      p_module_name => l_module_name,
4356                                                      p_category    => 'D',
4357                                                      p_line_number => p_line_number + i + 1);
4358                         FTE_UTIL_PKG.Exit_Debug(l_module_name);
4359                         RETURN;
4360                 END;
4361             END IF;
4362 
4363             IF (l_end_date IS NOT NULL) THEN
4364                 BEGIN
4365                     l_end_date := to_char(to_date(l_end_date, 'MM/DD/YYYY'),'MM/DD/YYYY');
4366                 EXCEPTION
4367                     WHEN OTHERS THEN
4368                         x_status := 2;
4369                         x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_DATE_FORMAT_ERROR');
4370                         FTE_UTIL_PKG.Write_OutFile( p_msg    => x_error_msg,
4371                                                      p_module_name => l_module_name,
4372                                                      p_category    => 'D',
4373                                                      p_line_number => p_line_number + i + 1);
4374                         FTE_UTIL_PKG.Exit_Debug(l_module_name);
4375                         RETURN;
4376                 END;
4377             END IF;
4378 
4379             IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
4380                 FTE_UTIL_PKG.Write_LogFile(l_module_name, 'G_ACTION    ',G_ACTION);
4381                 FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_name      ',l_name);
4382                 FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_currency  ',l_currency);
4383                 FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_start_date',l_start_date);
4384                 FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_end_date  ',l_end_date);
4385             END IF;
4386 
4387             --Action
4388             IF (G_ACTION IS NULL OR LENGTH(G_ACTION) = 0) THEN
4389                 x_status := 2;
4390                 x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_ACTION_MISSING');
4391                 FTE_UTIL_PKG.Write_OutFile( p_msg    => x_error_msg,
4392                                             p_module_name => l_module_name,
4393                                             p_category    => 'A',
4394                                             p_line_number => p_line_number + i + 1);
4395                 FTE_UTIL_PKG.Exit_Debug(l_module_name);
4396                 RETURN;
4397             END IF;
4398 
4399             --
4400             -- Rate Chart Name
4401             --
4402             IF (l_name IS NULL OR LENGTH(l_name) = 0) THEN
4403                 x_status := 2;
4404                 x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_PRICE_NAME_MISSING');
4405                 FTE_UTIL_PKG.Write_OutFile( p_msg          => x_error_msg,
4406                                             p_module_name => l_module_name,
4407                                             p_category    => 'A',
4408                                             p_line_number => p_line_number + i + 1);
4409                 FTE_UTIL_PKG.Exit_Debug(l_module_name);
4410                 RETURN;
4411             END IF;
4412 
4413             -- Delete
4414             IF (G_ACTION IN('DELETE')) THEN
4415 
4416                 --+
4417                 -- For DELETE, we delete the dummy rate chart associated with the modifier.
4418                 --+
4419                 l_assoc_rc_ids := FTE_RATE_CHART_PKG.GET_ASSOC_PRICELISTS(NULL, l_name);
4420 
4421                 FOR i IN 1..l_assoc_rc_ids.COUNT LOOP
4422 
4423                     FTE_RATE_CHART_PKG.G_CHART_TYPE := 'FAC_RATE_CHART';
4424                     FTE_RATE_CHART_PKG.DELETE_FROM_QP(p_list_header_id  => l_assoc_rc_ids(i),
4425                                                       p_name            => NULL,
4426                                                       p_action          => 'DELETE',
4427                                                       p_line_number     => p_line_number + i + 1,
4428                                                       x_status          => x_status,
4429                                                       x_error_msg       => x_error_msg);
4430                     IF(FTE_BULKLOAD_PKG.g_debug_on) THEN
4431                         FTE_UTIL_PKG.Write_LogFile(l_module_name,'Deleting Rate Chart with ID '||l_assoc_rc_ids(i)|| ' of Modifier ' || l_name);
4432                     END IF;
4433                 END LOOP;
4434 
4435                 --+
4436                 -- For Delete, we delete the lines and attributes and exit
4437                 --+
4438 
4439                 FTE_RATE_CHART_PKG.G_CHART_TYPE := 'FAC_MODIFIER';
4440                 FTE_RATE_CHART_PKG.DELETE_FROM_QP(p_list_header_id  => NULL,
4441                                                   p_name            => l_name,
4442                                                   p_action          => G_ACTION,
4443                                                   p_line_number     => p_line_number + i + 1,
4444                                                   x_status          => x_status,
4445                                                   x_error_msg       => x_error_msg);
4446                 FTE_UTIL_PKG.Exit_Debug(l_module_name);
4447                 RETURN;
4448             END IF;
4449             --+
4450             -- Currency
4451             --+
4452 
4453             IF (l_currency IS NULL OR LENGTH(l_currency) = 0) THEN
4454                 x_status := 2;
4455                 x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CURRENCY_MISSING');
4456                 FTE_UTIL_PKG.Write_OutFile(p_msg         => x_error_msg,
4457                                            p_module_name => l_module_name,
4458                                            p_category    => 'A',
4459                                            p_line_number => p_line_number + i + 1);
4460                 FTE_UTIL_PKG.Exit_Debug(l_module_name);
4461                 RETURN;
4462             END IF;
4463 
4464             --+
4465             -- Create Dummy Rate Chart
4466             -- For update, the dummy pricelist already exists. We don't need to recreate it.
4467             --+
4468             IF (G_ACTION = 'ADD') THEN
4469 
4470                 IF(FTE_BULKLOAD_PKG.g_debug_on) THEN
4471                     FTE_UTIL_PKG.Write_LogFile(l_module_name, 'Create Dummy Rate Chart');
4472                 END IF;
4473 
4474                 l_rc_name := l_name || '_RC';
4475 
4476                 l_chart_type := 'FAC_RATE_CHART';
4477                 l_description := 'Rate Chart ' || l_rc_name;
4478 
4479                 GET_CHART_DATA(p_chart_name    => l_rc_name,
4480                                p_currency      => l_currency,
4481                                p_chart_type    => l_chart_type,
4482                                x_carrier_name  => l_carrier_name,
4483                                x_service_level => l_service_level,
4484                                x_cur_line      => l_linenum,
4485                                x_job_id        => l_process_id,
4486                                p_line_number   => p_line_number,
4487                                x_error_msg     => x_error_msg,
4488                                x_status        => x_status);
4489 
4490 
4491                 IF(FTE_BULKLOAD_PKG.g_debug_on) THEN
4492                     FTE_UTIL_PKG.Write_LogFile(l_module_name, 'Creating Fac Chart Header');
4493                     FTE_UTIL_PKG.Write_LogFile(l_module_name, 'Name', l_rc_name);
4494                     FTE_UTIL_PKG.Write_LogFile(l_module_name, 'PID ', l_process_id);
4495                 END IF;
4496 
4497                 l_rate_hdr_data('ACTION')        := G_ACTION;
4498                 l_rate_hdr_data('FACILITY_RATE_CHART_NAME') := l_rc_name;
4499                 l_rate_hdr_data('DESCRIPTION')   := l_description;
4500                 l_rate_hdr_data('START_DATE')    := l_start_date;
4501                 l_rate_hdr_data('END_DATE')      := l_end_date;
4502                 l_rate_hdr_data('CURRENCY')      := l_currency;
4503                 l_rate_hdr_data('ATTRIBUTE1')    := 'FAC_RATE_CHART';
4504 
4505                 l_rate_hdr_block_tbl(1) := l_rate_hdr_data;
4506 
4507                 FTE_RATE_CHART_LOADER.PROCESS_RATE_CHART(p_block_header => g_dummy_block_hdr_tbl,
4508                                                          p_block_data   => l_rate_hdr_block_tbl,
4509                                                          p_line_number  => p_line_number + i + 1,
4510                                                          p_validate_column => FALSE,
4511                                                          p_process_id   => l_process_id,
4512                                                          x_status       => x_status,
4513                                                          x_error_msg    => x_error_msg);
4514 
4515                 l_rate_hdr_data.DELETE;
4516                 l_rate_hdr_block_tbl.DELETE;
4517 
4518                 IF (x_status <> -1) THEN
4519                     FTE_UTIL_PKG.Exit_Debug(l_module_name);
4520                     RETURN;
4521                 END IF;
4522 
4523                 l_rate_line_data('ACTION')      := G_ACTION;
4524                 l_rate_line_data('LINE_NUMBER') := 1;
4525                 l_rate_line_data('DESCRIPTION') := l_description;
4526                 l_rate_line_data('RATE')        := 0;
4527                 l_rate_line_data('UOM')         := g_unit_uom;
4528                 l_rate_line_data('VOLUME_TYPE') := 'TOTAL_QUANTITY';
4529                 l_rate_line_data('TYPE')        := l_type;
4530                 l_rate_line_data('RATE_TYPE')   := 'PER_UOM';
4531 
4532                 l_rate_line_block_tbl(1) := l_rate_line_data;
4533 
4534                 FTE_RATE_CHART_LOADER.PROCESS_RATE_LINE(p_block_header  => g_dummy_block_hdr_tbl,
4535                                                         p_block_data    => l_rate_line_block_tbl,
4536                                                         p_line_number   => p_line_number + i + 1,
4537                                                         p_validate_column => FALSE,
4538                                                         x_status        => x_status,
4539                                                         x_error_msg     => x_error_msg);
4540             END IF;
4541 
4542             -- Now process the modifier.
4543             l_chart_type := 'FAC_MODIFIER';
4544 
4545             --+
4546             -- Obtain Cached Information about the Chart, if it exists.
4547             --+
4548             GET_CHART_DATA(p_chart_name    => l_name,
4549                            p_currency      => l_currency,
4550                            p_chart_type    => l_chart_type,
4551                            x_carrier_name  => l_carrier_name,
4552                            x_service_level => l_service_level,
4553                            x_cur_line      => l_linenum,
4554                            x_job_id        => l_process_id,
4555                            p_line_number   => p_line_number,
4556                            x_error_msg     => x_error_msg,
4557                            x_status        => x_status);
4558 
4559             IF (x_status <> -1) THEN
4560                 FTE_UTIL_PKG.Exit_Debug(l_module_name);
4561                 RETURN;
4562             END IF;
4563 
4564             --+
4565             -- Create Modifier Header
4566             --+
4567             IF(FTE_BULKLOAD_PKG.g_debug_on) THEN
4568                 FTE_UTIL_PKG.Write_LogFile(l_module_name, 'Creating Modifier Header For ' || l_name);
4569             END IF;
4570 
4571             l_description := 'Rate Chart ' || l_name;
4572 
4573             l_rate_hdr_data('ACTION')        := G_ACTION;
4574             l_rate_hdr_data('TL_FACILITY_MODIFIER_NAME') := l_name;
4575             l_rate_hdr_data('DESCRIPTION')   := l_description;
4576             l_rate_hdr_data('START_DATE')    := l_start_date;
4577             l_rate_hdr_data('END_DATE')      := l_end_date;
4578             l_rate_hdr_data('CURRENCY')      := NULL;
4579             l_rate_hdr_data('ATTRIBUTE1')    := l_chart_type;
4580 
4581             l_rate_hdr_block_tbl(1) := l_rate_hdr_data;
4582 
4583             FTE_RATE_CHART_LOADER.PROCESS_RATE_CHART(p_block_header  => g_dummy_block_hdr_tbl,
4584                                                      p_block_data   => l_rate_hdr_block_tbl,
4585                                                      p_line_number  => p_line_number + i + 1,
4586                                                      p_validate_column => FALSE,
4587                                                      p_process_id   => l_process_id,
4588                                                      x_status       => x_status,
4589                                                      x_error_msg    => x_error_msg);
4590             l_rate_hdr_data.DELETE;
4591             l_rate_hdr_block_tbl.DELETE;
4592 
4593             IF (x_status <> -1) THEN
4594                 FTE_UTIL_PKG.Exit_Debug(l_module_name);
4595                 RETURN;
4596             END IF;
4597 
4598             PROCESS_CHART_SURCHARGES( p_values      => l_values,
4599                                       p_chart_type  => l_chart_type,
4600                                       p_process_id  => l_process_id,
4601                                       x_linenum     => l_linenum,
4602                                       p_line_number => p_line_number,
4603                                       x_error_msg   => x_error_msg,
4604                                       x_status      => x_status);
4605 
4606             IF (x_status <> -1) THEN
4607                 FTE_UTIL_PKG.Exit_Debug(l_module_name);
4608                 RETURN;
4609             END IF;
4610 
4611             Link_ChartNames(Link_ChartNames.COUNT+1)       := l_rc_name;
4612             Link_ModifierNames(Link_ModifierNames.COUNT+1) := l_name;
4613 
4614         END LOOP;
4615 
4616         SUBMIT_TL_CHART(x_status, x_error_msg);
4617 
4618         IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
4619             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'Return status from SUBMIT_TL_CHART',x_status);
4620             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'Return Message from SUBMIT_TL_CHART',x_error_msg);
4621         END IF;
4622 
4623         FTE_UTIL_PKG.Exit_Debug(l_module_name);
4624 
4625     EXCEPTION
4626         WHEN VALUE_ERROR THEN
4627             x_status := 2;
4628             x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_VALUE_ERROR');
4629             FTE_UTIL_PKG.Write_OutFile(p_msg          => x_error_msg,
4630                                        p_module_name => l_module_name,
4631                                        p_category    => 'D',
4632                                        p_line_number => 0);
4633             FTE_UTIL_PKG.Exit_Debug(l_module_name);
4634 
4635         WHEN OTHERS THEN
4636             x_status := 2;
4637             FTE_UTIL_PKG.Write_LogFile(l_module_name, SQLERRM);
4638             FTE_UTIL_PKG.Exit_Debug(l_module_name);
4639 
4640     END PROCESS_FACILITY_CHARGES;
4641 
4642     --_________________________________________________________________________________--
4643     --                                                                                 --
4644     -- PROCEDURE: PROCESS_TL_SURCHARGES                                                --
4645     --                                                                                 --
4646     -- Purpose: This is called by PROCESS_DATA if the type to be processed   --
4647     --          is 'TL_SURCHARGES'.                                                    --
4648     -- IN Parameters                                                                   --
4649     --    1. p_block_header: An associative array with column names in the upload file,--
4650     --                       as indices and integers as values.                        --
4651     --    2. p_block_data  : A table of associative array. Each element in the table   --
4652     --                       represents a single line of data in the upload file.      --
4653     --    3. p_line_number : Specifies the line number in the file where this block    --
4654     --                       begins.This is used for error logging, which aims         --
4655     --                       at ease of loader usage.                                  --
4656     --    4. p_doValidate  : determines whether to validate the incoming data or not.  --
4657     --                       Normally it will have the vlue TRUE, enabling validation  --
4658     --                       When called from RATE CHART EDITOR UI, no need to validate--
4659     --                       so they will pass FALSE for this.                         --
4660     --                                                                                 --
4661     -- Out Parameters                                                                  --
4662     --    1. x_status  :  the return status, -1 for success                            --
4663     --                                        2 for failure.                           --
4664     --    2.x_error_msg: the corresponding error meassge,                              --
4665     --                   if any exception occurs during the process.                   --
4666     --_________________________________________________________________________________--
4667 
4668     PROCEDURE PROCESS_TL_SURCHARGES(p_block_header IN  FTE_BULKLOAD_PKG.block_header_tbl,
4669                                     p_block_data   IN  FTE_BULKLOAD_PKG.block_data_tbl,
4670                                     p_line_number  IN  NUMBER,
4671                                     p_doValidate   IN  BOOLEAN DEFAULT TRUE,
4672                                     x_error_msg    OUT   NOCOPY  VARCHAR2,
4673                                     x_status       OUT   NOCOPY  NUMBER) IS
4674 
4675 
4676     l_type                     VARCHAR2(30);
4677     l_service_level            VARCHAR2(20);
4678     l_currency                 VARCHAR2(20);
4679     l_start_date               VARCHAR2(20);
4680     l_end_date                 VARCHAR2(20);
4681     l_country                  VARCHAR2(60);
4682     l_state                    VARCHAR2(60);
4683     l_city                     VARCHAR2(60);
4684     l_zone_type                VARCHAR2(30);
4685     l_zipcode_from             VARCHAR2(30);
4686     l_zipcode_to               VARCHAR2(30);
4687     l_zone                     VARCHAR2(60);
4688     l_name                     VARCHAR2(60);
4689     l_description              VARCHAR2(240);
4690     l_process_id               NUMBER;
4691     l_linenum                  NUMBER;
4692     l_subtype                  VARCHAR2(50);
4693     l_carrier_name             VARCHAR2(100);
4694     l_carrier_id               NUMBER;
4695     l_region_id            NUMBER;
4696     l_rate                     NUMBER;
4697     l_wkend_layovr_dist_uom    VARCHAR2(20);
4698     l_wkend_layovr_dist_brk    NUMBER;
4699 
4700     l_chart_type     CONSTANT  VARCHAR2(50) := 'TL_MODIFIER';
4701     l_block_type     CONSTANT  VARCHAR2(25) := 'TL_SURCHARGES';
4702     l_region_info              wsh_regions_search_pkg.region_rec;
4703 
4704     l_rate_hdr_data            FTE_BULKLOAD_PKG.data_values_tbl;
4705     l_values                   FTE_BULKLOAD_PKG.data_values_tbl;
4706     l_rate_hdr_block_tbl       FTE_BULKLOAD_PKG.block_data_tbl;
4707 
4708     l_module_name    CONSTANT  VARCHAR2(100) := 'FTE.PLSQL.' || G_PKG_NAME || '.PROCESS_TL_SURCHARGES';
4709 
4710     BEGIN
4711 
4712         FTE_UTIL_PKG.Enter_Debug(l_module_name);
4713         x_status := -1;
4714 
4715         --+
4716         -- Get the global unit UOM defined at Shipping->Setup->Global Parameters
4717         --+
4718         IF (g_unit_uom IS NULL) THEN
4719             g_unit_uom := GET_GLOBAL_UNIT_UOM (x_status, x_error_msg);
4720             IF (x_status <> -1) THEN
4721                 FTE_UTIL_PKG.Exit_Debug(l_module_name);
4722                 RETURN;
4723             END IF;
4724         END IF;
4725 
4726         IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
4727             FTE_UTIL_PKG.Write_LogFile(l_module_name,'g_unit_uom',g_unit_uom);
4728         END IF;
4729 
4730         IF( p_doValidate ) THEN
4731             FTE_VALIDATION_PKG.VALIDATE_COLUMNS(p_keys      => p_block_header,
4732                                                 p_type      => l_block_type,
4733                                                 p_line_number => p_line_number-1,
4734                                                 x_status    => x_status,
4735                                                 x_error_msg => x_error_msg);
4736             IF (x_status <> -1) THEN
4737                 FTE_UTIL_PKG.Write_LogFile(l_module_name,'Return status from FTE_VALIDATION_PKG.VALIDATE_COLUMNS ', x_status);
4738                 RETURN;
4739             END IF;
4740         END IF;
4741 
4742 
4743         FOR i IN 1..p_block_data.COUNT LOOP
4744 
4745             l_values := p_block_data(i);
4746 
4747             l_type := FTE_UTIL_PKG.GET_DATA('TYPE',l_values);
4748             l_type := UPPER(l_type);
4749 
4750             IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
4751                 FTE_UTIL_PKG.Write_LogFile(l_module_name,'i     ',i);
4752                 FTE_UTIL_PKG.Write_LogFile(l_module_name,'l_type',l_type);
4753             END IF;
4754 
4755             G_ACTION         := FTE_UTIL_PKG.GET_DATA('ACTION', l_values);
4756 
4757             /*
4758                C to specify stop-off, out-of-route, handling, minimum handling,
4759                   loading, minimum loading, assisted loading, minimum assisted loading,
4760                   unloading, minimum unloading, assisted unloading, minimum assisted unloading,
4761                   and weekday layover charges,
4762                O to specify origin surcharges,
4763                D to specify destination surcharges,
4764                B to specify weekend layover distance breaks and the associated weekend layover charges and
4765                F to specify fuel surcharges
4766             */
4767 
4768             IF (l_type NOT IN ('C','O','D','B','F')) THEN
4769                x_status := 2;
4770                x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_LOAD_SURCHARGE_TYPE_INVALID');
4771                    FTE_UTIL_PKG.Write_OutFile(p_msg    => x_error_msg,
4772                                                p_module_name => l_module_name,
4773                                                p_category    => 'D',
4774                                                p_line_number => 0);
4775                    RETURN;
4776             END IF;
4777 
4778 	  IF (NOT(g_action = 'DELETE' AND Upper(l_type) <> 'C')) THEN
4779 
4780             IF (l_type = 'C') THEN
4781 
4782                 RESET_CHART_INFO;
4783 
4784                 l_carrier_name   := FTE_UTIL_PKG.GET_DATA('CARRIER_NAME', l_values);
4785                 l_currency       := FTE_UTIL_PKG.GET_DATA('CURRENCY', l_values);
4786                 l_start_date     := FTE_UTIL_PKG.GET_DATA('START_DATE', l_values);
4787                 l_end_date       := FTE_UTIL_PKG.GET_DATA('END_DATE', l_values);
4788                 l_service_level  := FTE_UTIL_PKG.GET_DATA('SERVICE_LEVEL', l_values);
4789 
4790                 IF (NOT p_doValidate) THEN
4791                     --+
4792                     -- Get the carrier name from the ID for rate chart cretion.
4793                     --+
4794                     l_carrier_id := FTE_UTIL_PKG.GET_DATA('CARRIER_ID', l_values);
4795                     l_carrier_name := FTE_UTIL_PKG.GET_CARRIER_NAME(p_carrier_id => l_carrier_id);
4796 
4797                     l_values('CARRIER_NAME') := l_carrier_name;
4798 
4799                     --+
4800                     -- populate SERVICE LEVEL CODE.
4801                     --+
4802                     l_service_level := FTE_UTIL_PKG.GET_DATA('SERVICE_CODE', l_values);
4803 
4804                 END IF;
4805 
4806                 G_ACTION := UPPER(G_ACTION);
4807 
4808                 IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
4809                     FTE_UTIL_PKG.Write_LogFile(l_module_name, 'G_ACTION       ',G_ACTION);
4810                     FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_name         ',l_name);
4811                     FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_service_level',l_service_level);
4812                     FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_carrier_name ',l_carrier_name);
4813                     FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_currency     ',l_currency);
4814                     FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_start_date   ',l_start_date);
4815                     FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_end_date     ',l_end_date);
4816                 END IF;
4817 
4818                 IF (p_doValidate) THEN
4819                     FTE_VALIDATION_PKG.VALIDATE_ACTION(p_action      => G_ACTION,
4820                                                        p_type        => l_block_type,
4821                                                        p_line_number => p_line_number + i + 1,
4822                                                        x_status      => x_status,
4823                                                        x_error_msg   => x_error_msg);
4824                     IF (x_status <> -1) THEN
4825                         FTE_UTIL_PKG.Write_LogFile(l_module_name,'FTE_VALIDATION_PKG.VALIDATE_ACTION failed');
4826                         FTE_UTIL_PKG.Exit_Debug(l_module_name);
4827                         RETURN;
4828                     END IF;
4829                 END IF;
4830 
4831                 IF (p_doValidate) THEN
4832                     IF (l_start_date IS NOT NULL) THEN
4833                         BEGIN
4834                             IF (p_doValidate) THEN
4835                                 l_start_date := to_char(to_date(l_start_date, 'MM/DD/YYYY'),'MM/DD/YYYY');
4836                             END IF;
4837                         EXCEPTION
4838                             WHEN OTHERS THEN
4839                                 x_status := 2;
4840                                 x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_LOAD_INVALID_DATE');
4841                                 FTE_UTIL_PKG.Write_OutFile( p_msg      => x_error_msg,
4842                                                              p_module_name => l_module_name,
4843                                                              p_category    => 'D',
4844                                                              p_line_number => p_line_number + i + 1);
4845                                 FTE_UTIL_PKG.Exit_Debug(l_module_name);
4846                                 RETURN;
4847                         END;
4848                     END IF;
4849 
4850                     IF (l_end_date IS NOT NULL) THEN
4851                         BEGIN
4852                             IF (p_doValidate) THEN
4853                                 l_end_date := to_char(to_date(l_end_date, 'MM/DD/YYYY'),'MM/DD/YYYY');
4854                             END IF;
4855                         EXCEPTION
4856                             WHEN OTHERS THEN
4857                                 x_status := 2;
4858                                 x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_LOAD_INVALID_DATE');
4859                                 FTE_UTIL_PKG.Write_OutFile(p_msg     => x_error_msg,
4860                                                            p_module_name => l_module_name,
4861                                                            p_category    => 'D',
4862                                                            p_line_number => p_line_number + i + 1);
4863 
4864                                 FTE_UTIL_PKG.Exit_Debug(l_module_name);
4865                                 RETURN;
4866                         END;
4867                     END IF;
4868                 END IF;
4869 
4870                 IF (p_doValidate) THEN
4871                     l_service_level := FTE_VALIDATION_PKG.VALIDATE_SERVICE_LEVEL(p_carrier_id    => NULL,
4872                                                                                  p_carrier_name  => l_carrier_name,
4873                                                                                  p_service_level => l_service_level,
4874                                                                                  p_line_number   => p_line_number + i + 1,
4875                                                                                  x_error_msg     => x_error_msg,
4876                                                                                  x_status        => x_status);
4877                     IF (x_status <> -1) THEN
4878                         FTE_UTIL_PKG.Exit_Debug(l_module_name);
4879                         RETURN;
4880                     END IF;
4881                 END IF;
4882 
4883                 IF (p_doValidate) THEN
4884                     IF (l_currency IS NULL OR LENGTH(l_currency) = 0 AND  G_ACTION IN ('ADD', 'UPDATE')) THEN
4885                         x_status := 2;
4886                         x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name =>'FTE_LOAD_CURRENCY_MISSING');
4887                         FTE_UTIL_PKG.Write_OutFile(p_msg         => x_error_msg,
4888                                                    p_module_name => l_module_name,
4889                                                    p_category    => 'D',
4890                                                    p_line_number => p_line_number + i + 1);
4891                         FTE_UTIL_PKG.Exit_Debug(l_module_name);
4892                         RETURN;
4893                     END IF;
4894                 END IF;
4895 
4896                 IF (p_doValidate) THEN
4897                     --+
4898                     -- We need the carrier ID in order
4899                     -- to create the modifier rate chart name.
4900                     --+
4901                     BEGIN
4902                         SELECT
4903                           'MOD_' || hz.party_id || '_' || l_service_level INTO l_name
4904                         FROM
4905                           HZ_PARTIES hz,
4906                           WSH_CARRIERS ca
4907                         WHERE
4908                           hz.party_name = l_carrier_name AND
4909                           hz.party_id   = ca.carrier_id;
4910                     EXCEPTION
4911                         WHEN NO_DATA_FOUND THEN
4912                             x_status := 2;
4913                             x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name =>  'FTE_SEL_INVALID_CARRIER');
4914                             FTE_UTIL_PKG.Write_OutFile(p_msg         => x_error_msg,
4915                                                        p_module_name => l_module_name,
4916                                                        p_category    => 'D',
4917                                                        p_line_number => p_line_number + i + 1);
4918                             FTE_UTIL_PKG.Exit_Debug(l_module_name);
4919                             RETURN;
4920                         WHEN OTHERS THEN
4921                             x_status := 2;
4922                             FTE_UTIL_PKG.Write_LogFile(l_module_name, sqlerrm);
4923                             FTE_UTIL_PKG.Exit_Debug(l_module_name);
4924                             RETURN;
4925                     END;
4926                 ELSE
4927                     l_name := 'MOD_'||l_carrier_id||'_'||l_service_level;
4928                 END IF;
4929 
4930                 IF (G_ACTION = 'DELETE') THEN
4931 
4932                     IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
4933                         FTE_UTIL_PKG.Write_LogFile(l_module_name, 'Deleting TL_MODIFIER ' || l_name);
4934                     END IF;
4935 
4936                     FTE_RATE_CHART_PKG.G_CHART_TYPE := l_chart_type;
4937 
4938                     FTE_RATE_CHART_PKG.DELETE_FROM_QP(p_list_header_id  => NULL,
4939                                                       p_name            => l_name,
4940                                                       p_action          => G_ACTION,
4941                                                       p_line_number     => p_line_number + i + 1,
4942                                                       x_status          => x_status,
4943                                                       x_error_msg       => x_error_msg);
4944                     FTE_UTIL_PKG.Exit_Debug(l_module_name);
4945                     RETURN;
4946                 END IF;
4947 
4948                 GET_CHART_DATA(p_chart_name    => l_name,
4949                                p_currency      => l_currency,
4950                                p_chart_type    => l_chart_type,
4951                                x_carrier_name  => l_carrier_name,
4952                                x_service_level => l_service_level,
4953                                x_cur_line      => l_linenum,
4954                                x_job_id        => l_process_id,
4955                                p_line_number   => p_line_number + i + 1,
4956                                x_error_msg     => x_error_msg,
4957                                x_status        => x_status);
4958 
4959                 g_chart_name := l_name;
4960 
4961                 --+
4962                 -- If the linenum from GET_CHART_DATA is greater than o,
4963                 -- it means that user is trying to upload a duplicate ratechart
4964                 -- in the same spreadsheet.
4965                 --+
4966                 IF (l_linenum > 0) THEN
4967                     x_status := 2;
4968                     x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_DUPLICATE_CHART');
4969                     FTE_UTIL_PKG.Write_OutFile(p_msg    => x_error_msg,
4970                                                p_module_name => l_module_name,
4971                                                p_category    => 'D',
4972                                                p_line_number =>  p_line_number + i + 1);
4973                     FTE_UTIL_PKG.Exit_Debug(l_module_name);
4974                     RETURN;
4975                 ELSIF (x_status <> -1) THEN
4976                     FTE_UTIL_PKG.Exit_Debug(l_module_name);
4977                     RETURN;
4978                 END IF;
4979 
4980                 --
4981                 -- Create Modifier Header
4982                 --
4983 
4984                 IF(FTE_BULKLOAD_PKG.g_debug_on) THEN
4985                     FTE_UTIL_PKG.Write_LogFile(l_module_name, 'Creating Modifier Header For ' || l_name);
4986                 END IF;
4987 
4988                 l_description := 'Rate Chart ' || g_chart_name;
4989 
4990                 l_rate_hdr_data('ACTION')        := G_ACTION;
4991                 l_rate_hdr_data('TL_MODIFIER_NAME') := g_chart_name;
4992                 l_rate_hdr_data('DESCRIPTION')   := l_description;
4993                 l_rate_hdr_data('START_DATE')    := l_start_date;
4994                 l_rate_hdr_data('END_DATE')      := l_end_date;
4995                 l_rate_hdr_data('CURRENCY')      := l_currency;
4996                 l_rate_hdr_data('CARRIER_NAME')  := l_carrier_name;
4997                 l_rate_hdr_data('SERVICE_LEVEL') := l_service_level;
4998                 l_rate_hdr_data('ATTRIBUTE1')    := 'TL_MODIFIER';
4999 
5000                 l_rate_hdr_block_tbl(1) := l_rate_hdr_data;
5001 
5002                 FTE_RATE_CHART_LOADER.PROCESS_RATE_CHART(p_block_header    => g_dummy_block_hdr_tbl,
5003                                                          p_block_data      => l_rate_hdr_block_tbl,
5004                                                          p_line_number     => p_line_number + i + 1,
5005                                                          p_validate_column => FALSE,
5006                                                          p_process_id      => l_process_id,
5007                                                          x_status          => x_status,
5008                                                          x_error_msg       => x_error_msg);
5009 
5010 
5011                 l_rate_hdr_data.DELETE;
5012                 l_rate_hdr_block_tbl.DELETE;
5013 
5014                 IF (x_status <> -1) THEN
5015                     FTE_UTIL_PKG.Write_LogFile(l_module_name, x_error_msg || ' [' || l_service_level || ', ' || l_carrier_name || ', TL]');
5016                     FTE_UTIL_PKG.Exit_Debug(l_module_name);
5017                     RETURN;
5018                 END IF;
5019 
5020                 PROCESS_CHART_SURCHARGES(p_values      => l_values,
5021                                          p_chart_type  => l_chart_type,
5022                                          p_process_id  => l_process_id,
5023                                          p_doValidate  => p_doValidate,
5024                                          x_linenum     => l_linenum,
5025                                          p_line_number => p_line_number,
5026                                          x_error_msg   => x_error_msg,
5027                                          x_status      => x_status);
5028 
5029                 IF (x_status <> -1) THEN
5030                     FTE_UTIL_PKG.Exit_Debug(l_module_name);
5031                     RETURN;
5032                 END IF;
5033 
5034             ELSIF (l_type = 'B') THEN
5035 
5036                 IF(FTE_BULKLOAD_PKG.g_debug_on) THEN
5037                     FTE_UTIL_PKG.Write_LogFile(l_module_name, 'Weekend Layover Break.');
5038                 END IF;
5039 
5040                 GET_CHART_DATA(p_chart_name    => g_chart_name,
5041                                p_currency      => l_currency,
5042                                p_chart_type    => l_chart_type,
5043                                x_carrier_name  => l_carrier_name,
5044                                x_service_level => l_service_level,
5045                                x_cur_line      => l_linenum,
5046                                x_job_id        => l_process_id,
5047                                p_line_number   => p_line_number + i + 1,
5048                                x_error_msg     => x_error_msg,
5049                                x_status        => x_status);
5050 
5051 
5052                 l_wkend_layovr_dist_uom := FTE_UTIL_PKG.GET_DATA('DISTANCE_UOM_FOR_WEEKEND_LAYOVER_CHARGES', l_values);
5053                 l_wkend_layovr_dist_brk := FTE_UTIL_PKG.GET_DATA('WEEKEND_LAYOVER_DISTANCE_BREAK', l_values);
5054                 l_rate                  := FTE_UTIL_PKG.GET_DATA('CHARGES', l_values);
5055 
5056                 l_wkend_layovr_dist_brk := Fnd_Number.Canonical_To_Number(l_wkend_layovr_dist_brk);
5057                 l_rate                  := Fnd_Number.Canonical_To_Number(l_rate);
5058 
5059                 IF (l_rate < 0) THEN
5060                     x_status := 2;
5061                     x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_VALUE_ERROR',
5062                                                         p_tokens => STRINGARRAY('ENTITY'),
5063                                                         p_values => STRINGARRAY('RATE'));
5064                     FTE_UTIL_PKG.Write_OutFile(p_msg          => x_error_msg,
5065                                                p_module_name => l_module_name,
5066                                                p_category    => 'D',
5067                                                p_line_number => p_line_number + i + 1);
5068                     FTE_UTIL_PKG.Exit_Debug(l_module_name);
5069                     RETURN;
5070                 END IF;
5071 
5072                 IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
5073                     FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_rate       ', l_rate);
5074                     FTE_UTIL_PKG.Write_LogFile(l_module_name, 'g_chart_name ', g_chart_name);
5075                     FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_linenum    ', l_linenum);
5076                     FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_process_id ', l_process_id);
5077                     FTE_UTIL_PKG.Write_LogFile(l_module_name, 'G_ACTION     ', G_ACTION);
5078                     FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_wkend_layovr_dist_uom',l_wkend_layovr_dist_uom );
5079                     FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_wkend_layovr_dist_brk',l_wkend_layovr_dist_brk);
5080                 END IF;
5081 
5082                 IF (l_wkend_layovr_dist_uom IS NULL) THEN
5083                     x_status := 2;
5084                     x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_WKEND_DIST_UOM_MISSING');
5085                     FTE_UTIL_PKG.Write_OutFile(p_msg         => x_error_msg,
5086                                                p_module_name => l_module_name,
5087                                                p_category    => 'D',
5088                                                p_line_number => p_line_number + i + 1);
5089                     FTE_UTIL_PKG.Exit_Debug(l_module_name);
5090                     RETURN;
5091                 ELSIF (l_wkend_layovr_dist_brk IS NULL) THEN
5092                     x_status := 2;
5093                     x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_WKEND_NO_DIST_BREAK');
5094                     FTE_UTIL_PKG.Write_OutFile(p_msg         => x_error_msg,
5095                                                p_module_name => l_module_name,
5096                                                p_category    => 'D',
5097                                                p_line_number => p_line_number + i + 1);
5098                     FTE_UTIL_PKG.Exit_Debug(l_module_name);
5099                     RETURN;
5100                 ELSIF (l_rate IS NULL) THEN
5101                     x_status := 2;
5102                     x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_RATE_MISSING');
5103                     FTE_UTIL_PKG.Write_OutFile(p_msg         => x_error_msg,
5104                                                p_module_name => l_module_name,
5105                                                p_category    => 'D',
5106                                                p_line_number => p_line_number + i + 1);
5107                     FTE_UTIL_PKG.Exit_Debug(l_module_name);
5108                     RETURN;
5109                 END IF;
5110 
5111                 IF (g_wknd_layovr_uom <> l_wkend_layovr_dist_uom) THEN
5112                     IF (g_layovr_breaks.EXISTS(1)) THEN
5113                         x_status := 2;
5114                         x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_DIST_UOM_MISMATCH');
5115                         FTE_UTIL_PKG.Write_OutFile(p_msg         => x_error_msg,
5116                                                    p_module_name => l_module_name,
5117                                                    p_category    => 'D',
5118                                                    p_line_number => p_line_number + i + 1);
5119                         FTE_UTIL_PKG.Exit_Debug(l_module_name);
5120                         RETURN;
5121                     END IF;
5122                 ELSE
5123                     g_wknd_layovr_uom := l_wkend_layovr_dist_uom;
5124                     g_layovr_breaks.EXTEND;
5125                     g_layovr_charges.EXTEND;
5126                     g_layovr_breaks(g_layovr_breaks.COUNT)   := Fnd_Number.Number_To_Canonical(l_wkend_layovr_dist_brk);
5127                     g_layovr_charges(g_layovr_charges.COUNT) := Fnd_Number.Number_To_Canonical(l_rate);
5128                 END IF;
5129 
5130             ELSIF (l_type IN ('O', 'D', 'F')) THEN
5131 
5132                 l_rate := Fnd_Number.Canonical_To_Number(FTE_UTIL_PKG.GET_DATA('SURCHARGES', l_values));
5133 
5134                 IF (l_rate < 0) THEN
5135                     x_status := 2;
5136                     x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_VALUE_ERROR',
5137                                                         p_tokens => STRINGARRAY('ENTITY'),
5138                                                         p_values => STRINGARRAY('RATE'));
5139                     FTE_UTIL_PKG.Write_OutFile( p_msg    => x_error_msg,
5140                                                  p_module_name => l_module_name,
5141                                                  p_category    => 'D',
5142                                                  p_line_number => p_line_number + i + 1);
5143                     FTE_UTIL_PKG.Exit_Debug(l_module_name);
5144                     RETURN;
5145                 ELSIF (l_rate IS NULL) THEN
5146                     x_status := 2;
5147                     x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_SURCHARGE_MISSING');
5148                     FTE_UTIL_PKG.Write_OutFile(p_msg         => x_error_msg,
5149                                                p_module_name => l_module_name,
5150                                                p_category    => 'D',
5151                                                p_line_number => p_line_number + i + 1);
5152                     FTE_UTIL_PKG.Exit_Debug(l_module_name);
5153                     RETURN;
5154                 END IF;
5155 
5156                 GET_CHART_DATA(p_chart_name    => g_chart_name,
5157                                p_currency      => l_currency,
5158                                p_chart_type    => l_chart_type,
5159                                x_carrier_name  => l_carrier_name,
5160                                x_service_level => l_service_level,
5161                                x_cur_line      => l_linenum,
5162                                x_job_id        => l_process_id,
5163                                p_line_number   => p_line_number + i + 1,
5164                                x_error_msg     => x_error_msg,
5165                                x_status        => x_status);
5166 
5167                 IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
5168                      FTE_UTIL_PKG.Write_LogFile(l_module_name, 'g_chart_name', g_chart_name);
5169                      FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_linenum',    l_linenum);
5170                      FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_process_id', l_process_id);
5171                 END IF;
5172 
5173                 IF (l_carrier_name IS NULL) THEN
5174                     x_status := 2;
5175                     x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_RATECHART_NOT_DEFINED');
5176                     FTE_UTIL_PKG.Write_OutFile(p_msg         => x_error_msg,
5177                                                p_module_name => l_module_name,
5178                                                p_category    => 'D',
5179                                                p_line_number => p_line_number + i + 1);
5180                     FTE_UTIL_PKG.Exit_Debug(l_module_name);
5181                     RETURN;
5182                 END IF;
5183 
5184                 IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
5185                     FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_rate', l_rate);
5186                 END IF;
5187 
5188                 IF (l_type IN ('O', 'D')) THEN
5189 
5190                     IF (l_type = 'O') THEN
5191                        l_zone_type := 'ORIGIN';
5192                     ELSE
5193                        l_zone_type := 'DESTINATION';
5194                     END IF;
5195 
5196                     IF (p_doValidate) THEN
5197                         l_country      := FTE_UTIL_PKG.GET_DATA('COUNTRY', l_values);
5198                         l_state        := FTE_UTIL_PKG.GET_DATA('STATE', l_values);
5199                         l_city         := FTE_UTIL_PKG.GET_DATA('CITY', l_values);
5200                         l_zipcode_from := FTE_UTIL_PKG.GET_DATA('POSTAL_CODE_FROM', l_values);
5201                         l_zipcode_to   := FTE_UTIL_PKG.GET_DATA('POSTAL_CODE_TO', l_values);
5202                         l_zone         := FTE_UTIL_PKG.GET_DATA('ZONE', l_values);
5203 
5204                         IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
5205                             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_country', l_country);
5206                             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_state',   l_state);
5207                             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_city',    l_city);
5208                             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_zipcode_to', l_zipcode_to);
5209                             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_zipcode_from', l_zipcode_from);
5210                             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_zone',    l_zone);
5211                         END IF;
5212 
5213                         IF (l_country IS NULL AND l_state IS NULL AND l_city IS NULL AND
5214                             l_zipcode_from IS NULL AND l_zipcode_to IS NULL AND l_zone IS NULL) THEN
5215 
5216                             x_status := 2;
5217                             x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_REGION_INFO_SPECIFIED');
5218                             FTE_UTIL_PKG.Write_OutFile(p_msg    => x_error_msg,
5219                                                        p_module_name => l_module_name,
5220                                                        p_category    => 'D',
5221                                                        p_line_number => p_line_number + i + 1);
5222                             FTE_UTIL_PKG.Exit_Debug(l_module_name);
5223                             RETURN;
5224                         END IF;
5225 
5226                         l_region_info.country          := l_country;
5227                         l_region_info.state            := l_state;
5228                         l_region_info.city             := l_city;
5229                         l_region_info.postal_code_from := l_zipcode_from;
5230                         l_region_info.postal_code_to   := l_zipcode_to;
5231                         l_region_info.zone             := l_zone;
5232                     ELSE
5233                         l_region_id := FTE_UTIL_PKG.GET_DATA('REGION_CODE', l_values);
5234                     END IF;
5235 
5236                     PROCESS_REGION_CHARGES(p_region_type  => l_zone_type,
5237                                            p_region_info  => l_region_info,
5238                                            p_charge       => l_rate,
5239                                            p_process_id   => l_process_id,
5240                                            x_linenum      => l_linenum,
5241                                            p_region_id    => l_region_id,
5242                                            p_line_number  => p_line_number + i + 1,
5243                                            x_error_msg    => x_error_msg,
5244                                            x_status       => x_status);
5245 
5246                 ELSIF (l_type = 'F') THEN
5247 
5248                     PROCESS_FUEL_CHARGES( p_charge       => l_rate,
5249                                           p_process_id   => l_process_id,
5250                                           x_linenum      => l_linenum,
5251                                           p_line_number  => p_line_number + i + 1,
5252                                           x_error_msg    => x_error_msg,
5253                                           x_status       => x_status);
5254 
5255                 END IF;
5256 
5257                 IF (x_status <> -1) THEN
5258                     x_status := 2;
5259                     FTE_UTIL_PKG.Exit_Debug(l_module_name);
5260                     RETURN;
5261                 END IF;
5262             END IF;
5263 
5264             SET_CHART_LINE(g_chart_name, l_linenum, x_status);
5265 	  END IF;
5266         END LOOP;
5267 
5268         SUBMIT_TL_CHART(x_status, x_error_msg);
5269 
5270         IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
5271             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'Return status from SUBMIT_TL_CHART',x_status);
5272             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'Return Message from SUBMIT_TL_CHART',x_error_msg);
5273         END IF;
5274 
5275         IF (x_status <> -1) THEN
5276             FTE_UTIL_PKG.Exit_Debug(l_module_name);
5277             RETURN;
5278         END IF;
5279 
5280         FTE_UTIL_PKG.Exit_Debug(l_module_name);
5281 
5282     EXCEPTION
5283         WHEN VALUE_ERROR THEN
5284 
5285             x_status := 2;
5286             FTE_UTIL_PKG.Write_LogFile(l_module_name,'Numeric Value Error while reading file. Please ensure that all data is of the right type.');
5287             FTE_UTIL_PKG.Exit_Debug(l_module_name);
5288 
5289         WHEN OTHERS THEN
5290 
5291             x_status := 2;
5292             FTE_UTIL_PKG.Write_LogFile(l_module_name, sqlerrm);
5293             FTE_UTIL_PKG.Exit_Debug(l_module_name);
5294 
5295     END PROCESS_TL_SURCHARGES;
5296 
5297     --_________________________________________________________________________________--
5298     --                                                                                 --
5299     -- PROCEDURE: PROCESS_TL_BASE_RATES                                                --
5300     --                                                                                 --
5301     -- Purpose: This is called by PROCESS_DATA if the type to be processed   --
5302     --          is 'TL_BASE_RATES'. By uploading a 'TL_BASE_RATES' block, the user is  --
5303     --          creating rate chart.                                                   --
5304     --                                                                                 --
5305     -- IN Parameters                                                                   --
5306     --    1. p_block_header: An associative array with column names in the upload file,--
5307     --                       as indices and integers as values.                        --
5308     --    2. p_block_data  : A table of associative array. Each element in the table   --
5309     --                       represents a single line of data in the upload file.      --
5310     --    3. p_line_number : Specifies the line number in the file where this block    --
5311     --                       begins.This is used for error logging, which aims         --
5312     --                       at ease of loader usage.                                  --
5313     --    4. p_doValidate  : determines whether to validate the incoming data or not.  --
5314     --                       Normally it will have the vlue TRUE, enabling validation  --
5315     --                       When called from RATE CHART EDITOR UI, no need to validate--
5316     --                       so they will pass FALSE for this.                         --
5317     --                                                                                 --
5318     -- Out Parameters                                                                  --
5319     --    1. x_status  :  the return status, -1 for success                            --
5320     --                                        2 for failure.                           --
5321     --    2.x_error_msg: the corresponding error meassge,                              --
5322     --                   if any exception occurs during the process.                   --
5323     --                                                                                 --
5324     --                                                                                 --
5325     --   Column headers. 13 columns                                                    --
5326     --   ACTION, CARRIER_NAME, RATE_CHART_NAME, CURRENCY, RATE_BASIS, RATE_BASIS_UOM,  --
5327     --   DISTANCE_TYPE, SERVICE_LEVEL,VEHICLE_TYPE, RATE, MINIMUM_CHARGE,              --
5328     --   START_DATE, END_DATE                                                          --
5329     --_________________________________________________________________________________--
5330 
5331     PROCEDURE PROCESS_TL_BASE_RATES(p_block_header    IN  FTE_BULKLOAD_PKG.block_header_tbl,
5332                                     p_block_data      IN  FTE_BULKLOAD_PKG.block_data_tbl,
5333                                     p_line_number     IN  NUMBER,
5334                                     p_doValidate      IN  BOOLEAN DEFAULT TRUE,
5335                                     x_status          OUT NOCOPY NUMBER,
5336                                     x_error_msg       OUT NOCOPY VARCHAR2) IS
5337 
5338     l_process_id            NUMBER;
5339     l_carrier_name          VARCHAR2(100);
5340     l_rate_chart_name       VARCHAR2(100);
5341     l_currency              VARCHAR2(20);
5342     l_rate_basis            VARCHAR2(30);
5343     l_rate_basis_uom        VARCHAR2(20);
5344     l_attribute             VARCHAR2(50);
5345     l_dist_type             VARCHAR2(100);
5346     l_service_level         VARCHAR2(100);
5347     l_chart_type            VARCHAR2(30);
5348     l_vehicle_type          VARCHAR2(100);
5349     l_rate                  NUMBER;
5350     l_min_charge            NUMBER;
5351     l_start_date            VARCHAR2(20);
5352     l_end_date              VARCHAR2(20);
5353     l_attribute_type        VARCHAR2(50);
5354     l_attribute_value       VARCHAR2(50);
5355     l_description           VARCHAR2(200);
5356     l_linenum               NUMBER;
5357     l_precedence            NUMBER;
5358     l_deadhead              BOOLEAN := FALSE;
5359     l_assoc_modifier_ids    STRINGARRAY;
5360 
5361     --+
5362     -- Used for Rate Chart Deletion
5363     --+
5364     l_deleted_rate_charts   STRINGARRAY;
5365     l_del_count             NUMBER := 0;
5366 
5367 
5368     --+
5369     -- Jiong's Requirement for UI
5370     --+
5371     l_carrier_id           NUMBER;
5372 
5373 
5374     l_values                FTE_BULKLOAD_PKG.data_values_tbl;
5375     l_rate_hdr_data         FTE_BULKLOAD_PKG.data_values_tbl;
5376     l_rate_line_data        FTE_BULKLOAD_PKG.data_values_tbl;
5377     l_rate_hdr_block_tbl    FTE_BULKLOAD_PKG.block_data_tbl;
5378     l_rate_line_block_tbl   FTE_BULKLOAD_PKG.block_data_tbl;
5379 
5380     l_type         CONSTANT VARCHAR2(25) := 'TL_BASE_RATES';
5381     l_module_name  CONSTANT VARCHAR2(100):= 'FTE.PLSQL.' || G_PKG_NAME || '.PROCESS_TL_BASE_RATES';
5382 
5383     BEGIN
5384 
5385         FTE_UTIL_PKG.Enter_Debug(l_module_name);
5386         x_status         := -1;
5387 
5388         l_chart_type     := 'TL_MODIFIER';
5389         l_precedence     := G_CONST_PRECEDENCE_HIGH;
5390 
5391         IF (g_unit_uom IS NULL) THEN
5392             g_unit_uom := GET_GLOBAL_UNIT_UOM (x_status, x_error_msg);
5393             IF (x_status <> -1) THEN
5394                 FTE_UTIL_PKG.Exit_Debug(l_module_name);
5395                 RETURN;
5396             END IF;
5397         END IF;
5398 
5399         IF (p_doValidate) THEN
5400             FTE_VALIDATION_PKG.VALIDATE_COLUMNS(p_keys      => p_block_header,
5401                                                 p_type      => l_type,
5402                                                 p_line_number => p_line_number-1,
5403                                                 x_status    => x_status,
5404                                                 x_error_msg => x_error_msg);
5405             IF (x_status <> -1) THEN
5406                 FTE_UTIL_PKG.Exit_Debug(l_module_name);
5407                 RETURN;
5408             END IF;
5409         END IF;
5410 
5411         --+
5412         -- Start processing the elements in p_block_data.
5413         --+
5414 
5415         FOR i IN 1..p_block_data.COUNT LOOP
5416 
5417             l_values := p_block_data(i);
5418 
5419             G_ACTION         := FTE_UTIL_PKG.GET_DATA('ACTION', l_values);
5420             l_carrier_name   := FTE_UTIL_PKG.GET_DATA('CARRIER_NAME', l_values);
5421             l_rate_chart_name:= FTE_UTIL_PKG.GET_DATA('RATE_CHART_NAME', l_values);
5422             l_currency       := FTE_UTIL_PKG.GET_DATA('CURRENCY', l_values);
5423             l_rate_basis_uom := FTE_UTIL_PKG.GET_DATA('RATE_BASIS_UOM', l_values);
5424             l_vehicle_type   := FTE_UTIL_PKG.GET_DATA('VEHICLE_TYPE', l_values);
5425             l_start_date     := FTE_UTIL_PKG.GET_DATA('START_DATE', l_values);
5426             l_end_date       := FTE_UTIL_PKG.GET_DATA('END_DATE', l_values);
5427             l_dist_type      := FTE_UTIL_PKG.GET_DATA('DISTANCE_TYPE', l_values);
5428             l_service_level  := FTE_UTIL_PKG.GET_DATA('SERVICE_LEVEL', l_values);
5429             l_rate_basis     := FTE_UTIL_PKG.GET_DATA('RATE_BASIS', l_values);
5430 
5431 	    BEGIN
5432 	       l_rate := FTE_UTIL_PKG.GET_DATA('RATE', l_values);
5433                IF (l_rate < 0 ) THEN
5434 	            x_status := 2;
5435                     x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_VALUE_ERROR',
5436                                                         p_tokens => STRINGARRAY('ENTITY'),
5437                                                         p_values => STRINGARRAY('RATE'));
5438                     FTE_UTIL_PKG.Write_OutFile(p_msg         => x_error_msg,
5439                                                p_module_name => l_module_name,
5440                                                p_category    => 'D',
5441                                                p_line_number => p_line_number + i + 1);
5442                     FTE_UTIL_PKG.Exit_Debug(l_module_name);
5443                     RETURN;
5444 	       END IF;
5445 	    EXCEPTION
5446 	       WHEN OTHERS THEN
5447 		        x_status := 2;
5448 	                x_error_msg := FTE_UTIL_PKG.GET_MSG('FTE_CAT_RATE_NON_NUMERIC');
5449                         FTE_UTIL_PKG.Write_OutFile( p_msg         => x_error_msg,
5450                                                     p_module_name => l_module_name,
5451                                                     p_category    => 'D',
5452                                                     p_line_number => p_line_number + i + 1);
5453 			RETURN;
5454 	    END;
5455 
5456             BEGIN
5457 	       l_min_charge := FTE_UTIL_PKG.GET_DATA('MINIMUM_CHARGE', l_values);
5458 	       IF (l_min_charge IS NOT NULL ) THEN
5459 		  IF (l_min_charge < 0 ) THEN
5460 	            x_status := 2;
5461                     x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_VALUE_ERROR',
5462                                                         p_tokens => STRINGARRAY('ENTITY'),
5463                                                         p_values => STRINGARRAY('MINIMUM_CHARGE'));
5464                     FTE_UTIL_PKG.Write_OutFile(p_msg         => x_error_msg,
5465                                                p_module_name => l_module_name,
5466                                                p_category    => 'D',
5467                                                p_line_number => p_line_number + i + 1);
5468                     FTE_UTIL_PKG.Exit_Debug(l_module_name);
5469                     RETURN;
5470 		 END IF;
5471 	       END IF;
5472 	     EXCEPTION
5473 	       WHEN OTHERS THEN
5474 		        x_status := 2;
5475 	                x_error_msg := FTE_UTIL_PKG.GET_MSG('FTE_CAT_RATE_NON_NUMERIC');
5476                         FTE_UTIL_PKG.Write_OutFile( p_msg         => x_error_msg,
5477                                                     p_module_name => l_module_name,
5478                                                     p_category    => 'D',
5479                                                     p_line_number => p_line_number + i + 1);
5480 			RETURN;
5481 	    END;
5482 
5483             --+
5484             -- Added for Jiong's Requirement.
5485             -- No check for return status done, as the validations has been done at UI level.
5486             --+
5487 
5488             IF( NOT p_doValidate) THEN
5489 
5490                 --+
5491                 -- Get the carrier name from the ID for rate chart cretion.
5492                 --+
5493                 l_carrier_id := FTE_UTIL_PKG.GET_DATA('CARRIER_ID', l_values);
5494                 l_carrier_name := FTE_UTIL_PKG.GET_CARRIER_NAME(p_carrier_id => l_carrier_id);
5495 
5496                 --+
5497                 -- populate SERVICE LEVEL CODE.
5498                 --+
5499                 l_service_level := FTE_UTIL_PKG.GET_DATA('SERVICE_CODE', l_values);
5500 
5501                 --+
5502                 -- populate VEHICLE_TYPE_ID
5503                 --+
5504                 l_vehicle_type := FTE_UTIL_PKG.GET_DATA('VEHICLE_CODE', l_values);
5505                 l_rate_basis_uom := FTE_UTIL_PKG.GET_DATA('RATE_BASIS_UOM_CODE', l_values);
5506 
5507                 IF (l_rate_basis IS NULL OR length(l_rate_basis) = 0 OR l_rate_basis = 'FLAT') THEN
5508                     l_rate_basis := 'FLAT';
5509                     l_rate_basis_uom := g_unit_uom;
5510                 ELSIF (l_rate_basis IN (FTE_RTG_GLOBALS.G_TL_RATE_BASIS_CONT,
5511                                         FTE_RTG_GLOBALS.G_TL_RATE_BASIS_PALLET)) THEN
5512                     l_rate_basis_uom := g_unit_uom;
5513                 END IF;
5514 
5515             END IF;
5516 
5517             G_ACTION         := UPPER(G_ACTION);
5518             l_dist_type      := UPPER(l_dist_type);
5519             l_rate_basis     := UPPER(l_rate_basis);
5520             l_rate           := Fnd_Number.Canonical_To_Number(l_rate);
5521             l_min_charge     := Fnd_Number.Canonical_To_Number(l_min_charge);
5522 
5523             IF (p_doValidate) THEN
5524 
5525                 FTE_VALIDATION_PKG.VALIDATE_ACTION(p_action      => G_ACTION,
5526                                                    p_type        => l_type,
5527                                                    p_line_number => p_line_number + i + 1,
5528                                                    x_status      => x_status,
5529                                                    x_error_msg   => x_error_msg);
5530 
5531                 IF (x_status <> -1) THEN
5532                     FTE_UTIL_PKG.Write_LogFile(l_module_name,'FTE_VALIDATION_PKG.VALIDATE_ACTION failed');
5533                     RETURN;
5534                 END IF;
5535 
5536             END IF;
5537 
5538             IF (l_start_date IS NOT NULL) THEN
5539                 BEGIN
5540                     IF (p_doValidate) THEN
5541                          l_start_date := to_char(to_date(l_start_date, 'MM/DD/YYYY'), FTE_BULKLOAD_PKG.G_DATE_FORMAT);
5542                     END IF;
5543                 EXCEPTION
5544                     WHEN OTHERS THEN
5545                         x_status := 2;
5546                         x_error_msg := FTE_UTIL_PKG.GET_MSG('FTE_CAT_DATE_FORMAT_ERROR');
5547                         FTE_UTIL_PKG.Write_OutFile( p_msg          => x_error_msg,
5548                                                      p_module_name => l_module_name,
5549                                                      p_category    => 'D',
5550                                                      p_line_number => p_line_number + i + 1);
5551                         FTE_UTIL_PKG.Exit_Debug(l_module_name);
5552                         RETURN;
5553                 END;
5554             END IF;
5555 
5556             IF (l_end_date IS NOT NULL) THEN
5557                 BEGIN
5558                     IF (p_doValidate) THEN
5559                         l_end_date := to_char(to_date(l_end_date, 'MM/DD/YYYY'), FTE_BULKLOAD_PKG.G_DATE_FORMAT);
5560                     END IF;
5561                 EXCEPTION
5562                     WHEN OTHERS THEN
5563                         x_status := 2;
5564                         x_error_msg := FTE_UTIL_PKG.GET_MSG('FTE_CAT_DATE_FORMAT_ERROR');
5565                         FTE_UTIL_PKG.Write_OutFile( p_msg      => x_error_msg,
5566                                                      p_module_name => l_module_name,
5567                                                      p_category    => 'D',
5568                                                      p_line_number => p_line_number + i + 1);
5569 
5570                         FTE_UTIL_PKG.Exit_Debug(l_module_name);
5571                         RETURN;
5572                 END;
5573             END IF;
5574 
5575             IF (p_doValidate) THEN
5576                 IF (l_rate < 0 ) THEN
5577                     x_status := 2;
5578                     x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_VALUE_ERROR',
5579                                                         p_tokens => STRINGARRAY('ENTITY'),
5580                                                         p_values => STRINGARRAY('RATE'));
5581                     FTE_UTIL_PKG.Write_OutFile(p_msg => x_error_msg,
5582                                                p_module_name => l_module_name,
5583                                                p_category    => 'D',
5584                                                p_line_number => p_line_number + i + 1);
5585                     FTE_UTIL_PKG.Exit_Debug(l_module_name);
5586                     RETURN;
5587                 END IF;
5588 
5589                 IF (l_min_charge < 0) THEN
5590                     x_status := 2;
5591                     x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_VALUE_ERROR',
5592                                                       p_tokens => STRINGARRAY('ENTITY'),
5593                                                       p_values => STRINGARRAY('MINIMUM_CHARGE'));
5594                     FTE_UTIL_PKG.Write_OutFile(p_msg => x_error_msg,
5595                                              p_module_name => l_module_name,
5596                                              p_category    => 'D',
5597                                              p_line_number => p_line_number + i + 1);
5598                     FTE_UTIL_PKG.Exit_Debug(l_module_name);
5599                     RETURN;
5600                 END IF;
5601 
5602                 IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
5603                     FTE_UTIL_PKG.Write_LogFile(l_module_name, 'G_ACTION         ',G_ACTION);
5604                     FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_rate_chart_name',l_rate_chart_name);
5605                     FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_carrier_name   ',l_carrier_name);
5606                     FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_currency       ',l_currency);
5607                     FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_rate_basis     ',l_rate_basis);
5608                     FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_rate_basis_uom ',l_rate_basis_uom);
5609                     FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_distance_type  ',l_dist_type);
5610                     FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_service_level  ',l_service_level);
5611                     FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_vehicle_type   ',l_vehicle_type);
5612                     FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_rate           ',l_rate);
5613                     FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_min_charge     ',l_min_charge);
5614                     FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_rate_start_date',l_start_date);
5615                     FTE_UTIL_PKG.Write_LogFile(l_module_name, 'l_rate_end_date  ',l_end_date);
5616                 END IF;
5617 
5618                 IF (l_rate_chart_name IS NULL OR LENGTH(l_rate_chart_name) = 0) THEN
5619                     x_status := 2;
5620                     x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_PRICE_NAME_MISSING');
5621                     FTE_UTIL_PKG.Write_OutFile(p_msg    => x_error_msg,
5622                                                p_module_name => l_module_name,
5623                                                p_category    => 'D',
5624                                                p_line_number => p_line_number + i + 1);
5625                     FTE_UTIL_PKG.Exit_Debug(l_module_name);
5626                     RETURN;
5627                 END IF;
5628 
5629             END IF;
5630 
5631             IF (G_ACTION IN('UPDATE', 'DELETE')) THEN
5632 
5633                 -- For both UPDATE and DELETE, delete the associated Mincharge Modifier of the rate chart
5634 
5635                 l_assoc_modifier_ids := FTE_RATE_CHART_PKG.GET_ASSOC_MODIFIERS(NULL, l_rate_chart_name);
5636 
5637                 FOR i IN 1..l_assoc_modifier_ids.COUNT
5638                 LOOP
5639                     IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
5640                         FTE_UTIL_PKG.Write_LogFile(l_module_name, 'Deleting Modifier ' || l_assoc_modifier_ids(i) || ' of Rate Chart ' || l_rate_chart_name);
5641                     END IF;
5642 
5643                     FTE_RATE_CHART_PKG.G_CHART_TYPE := 'TL_MODIFIER';
5644                     FTE_RATE_CHART_PKG.DELETE_FROM_QP(p_list_header_id  => l_assoc_modifier_ids(i),
5645                                                       p_name            => NULL,
5646                                                       p_action          => 'DELETE',
5647                                                       p_line_number     => p_line_number + i + 1,
5648                                                       x_status          => x_status,
5649                                                       x_error_msg       => x_error_msg);
5650 
5651 
5652                     IF (x_status <> -1) THEN
5653                         FTE_UTIL_PKG.Write_LogFile(l_module_name,'FTE_RATE_CHART_PKG.DELETE_FROM_QP returned with error' || x_error_msg);
5654                         FTE_UTIL_PKG.Exit_Debug(l_module_name);
5655                         RETURN;
5656                     END IF;
5657                 END LOOP;
5658 
5659                 IF (G_ACTION = 'DELETE') THEN
5660                     --+
5661                     -- For Delete, we delete and exit
5662                     --+
5663                     FOR i IN 1..l_deleted_rate_charts.COUNT
5664                     LOOP
5665                        IF (l_rate_chart_name = l_deleted_rate_charts(i)) THEN
5666                            GOTO next_record;
5667                        END IF;
5668                     END LOOP;
5669 
5670                     IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
5671                         FTE_UTIL_PKG.Write_LogFile(l_module_name, 'Deleting TL_RATE_CHART ' || l_rate_chart_name);
5672                     END IF;
5673 
5674                     FTE_RATE_CHART_PKG.G_CHART_TYPE := 'TL_RATE_CHART';
5675 
5676                     FTE_RATE_CHART_PKG.DELETE_FROM_QP(p_list_header_id  => NULL,
5677                                                       p_name            => l_rate_chart_name,
5678                                                       p_action          => G_ACTION,
5679                                                       p_line_number     => p_line_number + i + 1,
5680                                                       x_status          => x_status,
5681                                                       x_error_msg       => x_error_msg);
5682                     IF (x_status <> -1) THEN
5683                         FTE_UTIL_PKG.Write_LogFile(l_module_name,'FTE_RATE_CHART_PKG.DELETE_FROM_QP returned with error' || x_error_msg);
5684                         FTE_UTIL_PKG.Exit_Debug(l_module_name);
5685                         RETURN;
5686                     END IF;
5687 
5688                     l_del_count := l_del_count + 1;
5689                     l_deleted_rate_charts(l_del_count) := l_rate_chart_name;
5690 
5691                 END IF;
5692             END IF;
5693 
5694             --+
5695             -- The Carrier associated with the lane and rate chart should be the same.
5696             --+
5697             IF (p_doValidate) THEN
5698                 IF (l_carrier_name IS NULL OR LENGTH(l_carrier_name) = 0) THEN
5699                     x_status := 2;
5700                     x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_CARRIER_MISSING');
5701                     FTE_UTIL_PKG.Write_OutFile(p_msg         => x_error_msg,
5702                                                p_module_name => l_module_name,
5703                                                p_category    => 'D',
5704                                                p_line_number => p_line_number + i + 1);
5705                     FTE_UTIL_PKG.Exit_Debug(l_module_name);
5706                     RETURN;
5707                 END IF;
5708                 --+
5709                 -- Attribute : Rate Basis, Rate Basis UOM required
5710                 --+
5711                 IF (l_rate_basis IS NULL OR length(l_rate_basis) = 0 OR l_rate_basis = 'FLAT') THEN
5712 
5713                     l_rate_basis := 'FLAT';
5714                     l_rate_basis_uom := g_unit_uom;
5715 
5716                 ELSIF (l_rate_basis NOT IN (FTE_RTG_GLOBALS.G_TL_RATE_BASIS_DIST,
5717                                             FTE_RTG_GLOBALS.G_TL_RATE_BASIS_WT,
5718                                             FTE_RTG_GLOBALS.G_TL_RATE_BASIS_VOL,
5719                                             FTE_RTG_GLOBALS.G_TL_RATE_BASIS_CONT,
5720                                             FTE_RTG_GLOBALS.G_TL_RATE_BASIS_PALLET,
5721                                             FTE_RTG_GLOBALS.G_TL_RATE_BASIS_TIME,
5722                                             FTE_RTG_GLOBALS.G_TL_RATE_BASIS_FLAT)) THEN
5723                     x_status := 2;
5724                     x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_BASIS_INVALID');
5725                     FTE_UTIL_PKG.Write_OutFile(p_msg         => x_error_msg,
5726                                              p_module_name => l_module_name,
5727                                              p_category    => 'D',
5728                                              p_line_number => p_line_number + i + 1); -- add tokens
5729                     FTE_UTIL_PKG.Exit_Debug(l_module_name);
5730                     RETURN;
5731                 ELSIF (l_rate_basis IN (FTE_RTG_GLOBALS.G_TL_RATE_BASIS_DIST,
5732                                         FTE_RTG_GLOBALS.G_TL_RATE_BASIS_WT,
5733                                         FTE_RTG_GLOBALS.G_TL_RATE_BASIS_VOL,
5734                                         FTE_RTG_GLOBALS.G_TL_RATE_BASIS_TIME)) THEN
5735 
5736                     --+
5737                     -- UOM is required for 'DISTANCE', 'TIME', 'VOLUME', 'WEIGHT'
5738                     -- Note that when called from UI, p_doValidate will be false and we have
5739                     -- already populated the l_rate_basis_uom with the l_rate_basis_uom_code
5740                     --+
5741 
5742                     IF (l_rate_basis_uom IS NULL OR LENGTH(l_rate_basis_uom) = 0) THEN
5743                             x_status := 2;
5744                             x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_RATE_BASIS_UOM_MISSING');
5745                             FTE_UTIL_PKG.Write_OutFile(p_msg         => x_error_msg,
5746                                                        p_module_name => l_module_name,
5747                                                        p_category    => 'D',
5748                                                        p_line_number => p_line_number + i + 1);
5749                             FTE_UTIL_PKG.Exit_Debug(l_module_name);
5750                             RETURN;
5751                     ELSE
5752                             l_rate_basis_uom := FTE_UTIL_PKG.GET_UOM_CODE(p_uom => l_rate_basis_uom);
5753 
5754                             IF (l_rate_basis_uom IS NULL) THEN
5755                                 x_status := 2;
5756                                 x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_UOM_INVALID');
5757                                 FTE_UTIL_PKG.Write_OutFile(p_msg         => x_error_msg,
5758                                                            p_module_name => l_module_name,
5759                                                            p_category    => 'B',
5760                                                            p_line_number =>  p_line_number + i + 1);
5761                                 FTE_UTIL_PKG.Exit_Debug(l_module_name);
5762                                 RETURN;
5763                             END IF;
5764                      END IF;
5765 
5766                 ELSIF (l_rate_basis IN (FTE_RTG_GLOBALS.G_TL_RATE_BASIS_CONT,
5767                                     FTE_RTG_GLOBALS.G_TL_RATE_BASIS_PALLET)) THEN
5768                     l_rate_basis_uom := g_unit_uom;
5769                 END IF;
5770 
5771                 --+
5772                 -- Distance Type(loaded, unloaded and continuous) is required if rate_basis is DISTANCE
5773                 --+
5774                 IF (l_rate_basis = FTE_RTG_GLOBALS.G_TL_RATE_BASIS_DIST) THEN
5775                     IF (l_dist_type IS NULL OR LENGTH(l_dist_type) = 0) THEN
5776                         x_status := 2;
5777                         x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_DISTANCE_TYPE_MISSING');
5778                         FTE_UTIL_PKG.Write_OutFile(p_msg         => x_error_msg,
5779                                                    p_module_name => l_module_name,
5780                                                    p_category    =>'D',
5781                                                    p_line_number => p_line_number + i + 1);
5782                         FTE_UTIL_PKG.Exit_Debug(l_module_name);
5783                         RETURN;
5784                     END IF;
5785                 END IF;
5786 
5787                 IF (x_status <> -1) THEN
5788                     FTE_UTIL_PKG.Exit_Debug(l_module_name);
5789                     RETURN;
5790                 END IF;
5791 
5792                 --+
5793                 -- Service Level is required.
5794                 --+
5795                 l_service_level := FTE_VALIDATION_PKG.VALIDATE_SERVICE_LEVEL(p_carrier_id    => NULL,
5796                                                                              p_carrier_name  => l_carrier_name,
5797                                                                              p_service_level => l_service_level,
5798                                                                              p_line_number   => p_line_number + i + 1,
5799                                                                              x_error_msg     => x_error_msg,
5800                                                                              x_status        => x_status);
5801                 IF (x_status <> -1) THEN
5802                     FTE_UTIL_PKG.Exit_Debug(l_module_name);
5803                     RETURN;
5804                 END IF;
5805 
5806 		IF (l_vehicle_type IS NULL ) THEN
5807 		        x_status := 2;
5808                         x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_VEHICLE_MISSING');
5809                         FTE_UTIL_PKG.Write_OutFile(p_msg         => x_error_msg,
5810                                                    p_module_name => l_module_name,
5811                                                    p_category    =>'D',
5812                                                    p_line_number => p_line_number + i + 1);
5813                         FTE_UTIL_PKG.Exit_Debug(l_module_name);
5814                         RETURN;
5815 		END IF;
5816 
5817                 --+
5818                 -- To populate l_vehicle_type with l_vehicle_type_id
5819                 -- This call is not needed when called from UI
5820                 --+
5821                 l_vehicle_type := FTE_UTIL_PKG.GET_VEHICLE_TYPE(p_vehicle_type => l_vehicle_type);
5822 
5823 		IF (l_vehicle_type IS NULL ) THEN
5824 		        x_status := 2;
5825                         x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_CAT_VEH_NOT_DEFINED');
5826                         FTE_UTIL_PKG.Write_OutFile(p_msg         => x_error_msg,
5827                                                    p_module_name => l_module_name,
5828                                                    p_category    =>'D',
5829                                                    p_line_number => p_line_number + i + 1);
5830                         FTE_UTIL_PKG.Exit_Debug(l_module_name);
5831                         RETURN;
5832 		END IF;
5833 
5834             END IF;
5835 
5836             --+
5837             -- Get the chart data, from the cache.
5838             --+
5839             GET_CHART_DATA(p_chart_name    => l_rate_chart_name,
5840                            p_currency      => l_currency,
5841                            p_chart_type    => 'TL_RATE_CHART',
5842                            x_carrier_name  => l_carrier_name,
5843                            x_service_level => l_service_level,
5844                            x_cur_line      => l_linenum,
5845                            x_job_id        => l_process_id,
5846                            p_line_number   => p_line_number + i + 1,
5847                            x_error_msg     => x_error_msg,
5848                            x_status        => x_status);
5849 
5850             IF (x_status <> -1) THEN
5851                 FTE_UTIL_PKG.Exit_Debug(l_module_name);
5852                 RETURN;
5853             END IF;
5854 
5855             GET_CARRIER_PREFERENCES (p_carrier_name   => l_carrier_name,
5856                                      p_service_level  => l_service_level,
5857                                      p_line_number    => p_line_number + i + 1,
5858                                      x_status         => x_status,
5859                                      x_error_msg      => x_error_msg);
5860 
5861             IF (p_doValidate) THEN
5862 
5863                 --+
5864                 -- Validate Against Carrier Preferences
5865                 --+
5866                 CHECK_RATE_BASIS(p_carrier_name       => l_carrier_name,
5867                                  p_rate_basis         => l_rate_basis,
5868                                  p_rate_basis_uom     => l_rate_basis_uom,
5869                                  p_service_level      => l_service_level,
5870                                  p_line_number        => p_line_number + i + 1,
5871                                  x_status             => x_status,
5872                                  x_error_msg          => x_error_msg);
5873 
5874                 IF (x_status <> -1) THEN
5875                     FTE_UTIL_PKG.Exit_Debug(l_module_name);
5876                     RETURN;
5877                 END IF;
5878 
5879             END IF;
5880 
5881             --+
5882             -- Set the precedence and rate type, store min charges
5883             --+
5884             IF (l_rate_basis = FTE_RTG_GLOBALS.G_TL_RATE_BASIS_DIST) THEN
5885 
5886                 IF (l_dist_type = FTE_RTG_GLOBALS.G_TL_DIST_TYPE_UNLOADED) THEN
5887                     l_attribute := FTE_RTG_GLOBALS.G_C_UNLOADED_DISTANCE_RT;
5888                     l_precedence := G_CONST_PRECEDENCE_LOW;
5889                     l_deadhead   := TRUE;
5890                 ELSIF (l_dist_type = FTE_RTG_GLOBALS.G_TL_DIST_TYPE_CM) THEN
5891                     l_attribute := FTE_RTG_GLOBALS.G_C_CONTINUOUS_MOVE_DIST_RT;
5892                     l_precedence := G_CONST_PRECEDENCE_MID;
5893                 ELSIF (l_dist_type = 'LOADED') THEN
5894                     l_attribute := FTE_RTG_GLOBALS.G_C_LOADED_DISTANCE_RT;
5895                 ELSE
5896                     x_status := 2;
5897                     x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_DISTANCE_TYPE_INVALID');
5898                     FTE_UTIL_PKG.Write_OutFile( p_msg    => x_error_msg,
5899                                                 p_module_name => l_module_name,
5900                                                 p_category    =>'D',
5901                                                 p_line_number => p_line_number + i + 1);
5902                     FTE_UTIL_PKG.Exit_Debug(l_module_name);
5903                     RETURN;
5904                 END IF;
5905 
5906             ELSIF (l_rate_basis = FTE_RTG_GLOBALS.G_TL_RATE_BASIS_FLAT) THEN
5907                 l_attribute := FTE_RTG_GLOBALS.G_C_FLAT_RT;
5908             ELSIF (l_rate_basis = FTE_RTG_GLOBALS.G_TL_RATE_BASIS_TIME) THEN
5909                 l_attribute := FTE_RTG_GLOBALS.G_C_TIME_RT;
5910             ELSIF (l_rate_basis = FTE_RTG_GLOBALS.G_TL_RATE_BASIS_WT) THEN
5911                 l_attribute := FTE_RTG_GLOBALS.G_C_UNIT_WT_RT;
5912             ELSIF (l_rate_basis = FTE_RTG_GLOBALS.G_TL_RATE_BASIS_VOL) THEN
5913                 l_attribute := FTE_RTG_GLOBALS.G_C_UNIT_VOL_RT;
5914             ELSIF (l_rate_basis = FTE_RTG_GLOBALS.G_TL_RATE_BASIS_CONT) THEN
5915                 l_attribute := FTE_RTG_GLOBALS.G_C_UNIT_CONT_RT;
5916             ELSIF (l_rate_basis = FTE_RTG_GLOBALS.G_TL_RATE_BASIS_PALLET) THEN
5917                 l_attribute := FTE_RTG_GLOBALS.G_C_UNIT_PALLET_RT;
5918             END IF;
5919 
5920             --+
5921             -- For the first line of the RC, we have to create the header.
5922             --
5923             -- In the call to GET_CHART_DATA(), this l_line_num has been passed
5924             -- as an output parameter to get the value.
5925             --
5926             -- If it is the first time, then it should be zero
5927             -- else it will have a non-zero value equal to the number of lines processed + 1 (header)
5928             --+
5929             IF (l_linenum = 0) THEN
5930 
5931                 IF(FTE_BULKLOAD_PKG.g_debug_on) THEN
5932                     FTE_UTIL_PKG.Write_LogFile(l_module_name, 'Creating Rate Chart Header For ' || l_rate_chart_name);
5933                 END IF;
5934 
5935                 l_description := 'Rate Chart ' || l_rate_chart_name;
5936 
5937                 l_rate_hdr_data('ACTION')        := G_ACTION;
5938                 l_rate_hdr_data('TL_CHART_NAME') := l_rate_chart_name;
5939                 l_rate_hdr_data('DESCRIPTION')   := l_description;
5940                 l_rate_hdr_data('START_DATE')    := l_start_date;
5941                 l_rate_hdr_data('END_DATE')      := l_end_date;
5942                 l_rate_hdr_data('CURRENCY')      := l_currency;
5943                 l_rate_hdr_data('CARRIER_NAME')  := l_carrier_name;
5944                 l_rate_hdr_data('SERVICE_LEVEL') := l_service_level;
5945                 l_rate_hdr_data('ATTRIBUTE1')    := 'TL_RATE_CHART';
5946 
5947                 l_rate_hdr_block_tbl(1) := l_rate_hdr_data;
5948 
5949                 FTE_RATE_CHART_LOADER.PROCESS_RATE_CHART(p_block_header => g_dummy_block_hdr_tbl,
5950                                                          p_block_data   => l_rate_hdr_block_tbl,
5951                                                          p_line_number  => p_line_number + i + 1,
5952                                                          p_validate_column => FALSE,
5953                                                          p_process_id   => l_process_id,
5954                                                          x_status       => x_status,
5955                                                          x_error_msg    => x_error_msg);
5956 
5957                 l_rate_hdr_data.DELETE;
5958                 l_rate_hdr_block_tbl.DELETE;
5959 
5960                 IF (x_status <> -1) THEN
5961                     FTE_UTIL_PKG.Exit_Debug(l_module_name);
5962                     RETURN;
5963                 END IF;
5964 
5965                 --+
5966                 -- The first two lines in each rate chart should be 'dummy' rate chart lines.
5967                 -- The first one should have a rate type of 'STOP_CHARGE', and
5968                 -- the second one should have a rate type of 'LOAD_CHARGE'.
5969                 --
5970                 -- Rate chart dummy line 1
5971                 --+
5972                 l_linenum := l_linenum + 1;
5973                 l_description := 'Line ' || l_linenum || ' Of ' || l_rate_chart_name;
5974 
5975                 IF(FTE_BULKLOAD_PKG.g_debug_on) THEN
5976                     FTE_UTIL_PKG.Write_LogFile(l_module_name, 'Creating ' || l_description);
5977                 END IF;
5978 
5979                 l_rate_line_data('ACTION')      := G_ACTION;
5980                 l_rate_line_data('LINE_NUMBER') := l_linenum;
5981                 l_rate_line_data('DESCRIPTION') := l_description;
5982                 l_rate_line_data('RATE')        := 0;
5983                 l_rate_line_data('UOM')         := g_unit_uom;
5984                 l_rate_line_data('VOLUME_TYPE') := 'TOTAL_QUANTITY';
5985                 l_rate_line_data('ATTRIBUTE1')  := FTE_RTG_GLOBALS.G_C_STOP_LEVEL_CHARGES_RT;
5986                 l_rate_line_data('PRECEDENCE')  := l_precedence;
5987                 l_rate_line_data('RATE_TYPE')   := 'PER_UOM';
5988 		l_rate_line_data('START_DATE_ACTIVE') := l_start_date;
5989 		l_rate_line_data('END_DATE_ACTIVE') := l_end_date;
5990 
5991                 l_rate_line_block_tbl(1) := l_rate_line_data;
5992 
5993                 FTE_RATE_CHART_LOADER.PROCESS_RATE_LINE(p_block_header  => g_dummy_block_hdr_tbl,
5994                                                         p_block_data    => l_rate_line_block_tbl,
5995                                                         p_line_number   => p_line_number + i + 1,
5996                                                         p_validate_column => FALSE,
5997                                                         x_status        => x_status,
5998                                                         x_error_msg     => x_error_msg);
5999 
6000                 l_rate_line_data.DELETE;
6001                 l_rate_line_block_tbl.DELETE;
6002 
6003                 IF (x_status <> -1) THEN
6004                     FTE_UTIL_PKG.Exit_Debug(l_module_name);
6005                     RETURN;
6006                 END IF;
6007 
6008                 --+
6009                 -- Add Rate Type Attribute 'STOP_CHARGE'
6010                 --+
6011                 l_attribute_type  := 'TL_RATE_TYPE';
6012                 l_attribute_value := FTE_RTG_GLOBALS.G_TL_RATE_TYPE_STOP;
6013                 ADD_ATTRIBUTE (p_attribute_type      => l_attribute_type,
6014                                p_attribute_value     => l_attribute_value,
6015                                p_attribute_value_to  => NULL,
6016                                p_context             => FTE_RTG_GLOBALS.G_AX_TL_RATE_TYPE,
6017                                p_linenum             => l_linenum,
6018                                p_comp_operator       => NULL,
6019                                p_process_id          => l_process_id,
6020                                p_line_number         => p_line_number + i + 1,
6021                                x_error_msg           => x_error_msg,
6022                                x_status              => x_status);
6023 
6024                 IF (x_status <> -1) THEN
6025                     FTE_UTIL_PKG.Exit_Debug(l_module_name);
6026                     RETURN;
6027                 END IF;
6028 
6029                 --+
6030                 -- Rate Chart dummy line 2
6031                 --+
6032                 l_linenum := l_linenum + 1;
6033                 l_description := 'Line ' || l_linenum || ' Of ' || l_rate_chart_name;
6034 
6035                 IF(FTE_BULKLOAD_PKG.g_debug_on) THEN
6036                     FTE_UTIL_PKG.Write_LogFile(l_module_name, 'Creating ' || l_description);
6037                 END IF;
6038 
6039                 l_rate_line_data('ACTION')     := G_ACTION;
6040                 l_rate_line_data('LINE_NUMBER'):= l_linenum;
6041                 l_rate_line_data('DESCRIPTION'):= l_description;
6042                 l_rate_line_data('RATE')       := 0;
6043                 l_rate_line_data('UOM')        := g_unit_uom;
6044                 l_rate_line_data('VOLUME_TYPE'):= 'TOTAL_QUANTITY';
6045                 l_rate_line_data('ATTRIBUTE1') := FTE_RTG_GLOBALS.G_C_LOAD_LEVEL_CHARGES_RT;
6046                 l_rate_line_data('PRECEDENCE') := l_precedence;
6047                 l_rate_line_data('RATE_TYPE')  := 'PER_UOM';
6048 		l_rate_line_data('START_DATE_ACTIVE') := l_start_date;
6049 		l_rate_line_data('END_DATE_ACTIVE') := l_end_date;
6050 
6051                 l_rate_line_block_tbl(1) := l_rate_line_data;
6052 
6053                 FTE_RATE_CHART_LOADER.PROCESS_RATE_LINE(p_block_header  => g_dummy_block_hdr_tbl,
6054                                                         p_block_data    => l_rate_line_block_tbl,
6055                                                         p_line_number   => p_line_number + i + 1,
6056                                                         p_validate_column => FALSE,
6057                                                         x_status        => x_status,
6058                                                         x_error_msg     => x_error_msg);
6059                 l_rate_line_data.DELETE;
6060                 l_rate_line_block_tbl.DELETE;
6061 
6062                 IF (x_status <> -1) THEN
6063                     FTE_UTIL_PKG.Exit_Debug(l_module_name);
6064                     RETURN;
6065                 END IF;
6066 
6067                 --+
6068                 -- Add Rate Type Attribute 'LOAD_CHARGE'
6069                 --+
6070                 l_attribute_type := 'TL_RATE_TYPE';
6071                 l_attribute_value := FTE_RTG_GLOBALS.G_TL_RATE_TYPE_LOAD;
6072                 ADD_ATTRIBUTE(p_attribute_type      => l_attribute_type,
6073                               p_attribute_value     => l_attribute_value,
6074                               p_attribute_value_to  => NULL,
6075                               p_context             => FTE_RTG_GLOBALS.G_AX_TL_RATE_TYPE,
6076                               p_linenum             => l_linenum,
6077                               p_comp_operator       => NULL,
6078                               p_process_id          => l_process_id,
6079                               p_line_number         => p_line_number + i + 1,
6080                               x_error_msg           => x_error_msg,
6081                               x_status              => x_status);
6082 
6083             END IF;
6084 
6085             --+
6086             -- Create a  RATE CHART LINE
6087             --+
6088             l_linenum := l_linenum + 1;
6089             l_description := 'Line ' || l_linenum || ' Of ' || l_rate_chart_name;
6090 
6091             IF(FTE_BULKLOAD_PKG.g_debug_on) THEN
6092                 FTE_UTIL_PKG.Write_LogFile(l_module_name, 'Creating ' || l_description);
6093             END IF;
6094 
6095             l_rate_line_data('ACTION')      := G_ACTION;
6096             l_rate_line_data('LINE_NUMBER') := l_linenum;
6097             l_rate_line_data('DESCRIPTION') := l_description;
6098             l_rate_line_data('RATE')        := Fnd_Number.Number_To_Canonical(l_rate);
6099             l_rate_line_data('UOM')         := l_rate_basis_uom;
6100             l_rate_line_data('VOLUME_TYPE') := 'TOTAL_QUANTITY';
6101             l_rate_line_data('ATTRIBUTE1')  := l_attribute;
6102             l_rate_line_data('PRECEDENCE')  := l_precedence;
6103             l_rate_line_data('RATE_TYPE')   := 'PER_UOM';
6104 	    l_rate_line_data('START_DATE_ACTIVE') := l_start_date;
6105             l_rate_line_data('END_DATE_ACTIVE') := l_end_date;
6106 
6107             l_rate_line_block_tbl(1) := l_rate_line_data;
6108 
6109             FTE_RATE_CHART_LOADER.PROCESS_RATE_LINE(p_block_header  => g_dummy_block_hdr_tbl,
6110                                                     p_block_data    => l_rate_line_block_tbl,
6111                                                     p_line_number   => p_line_number + i + 1,
6112                                                     p_validate_column => FALSE,
6113                                                     x_status        => x_status,
6114                                                     x_error_msg     => x_error_msg);
6115             l_rate_line_data.DELETE;
6116             l_rate_line_block_tbl.DELETE;
6117 
6118             IF (x_status <> -1) THEN
6119                 FTE_UTIL_PKG.Exit_Debug(l_module_name);
6120                 RETURN;
6121             END IF;
6122 
6123             --+
6124             -- RATE_BASIS Attribute should be attached to each line
6125             --+
6126             l_attribute_type := 'TL_RATE_BASIS';
6127             ADD_ATTRIBUTE (p_attribute_type      => l_attribute_type,
6128                            p_attribute_value     => l_rate_basis,
6129                            p_attribute_value_to  => NULL,
6130                            p_context             => FTE_RTG_GLOBALS.G_AX_TL_RATE_BASIS,
6131                            p_linenum             => l_linenum,
6132                            p_comp_operator       => NULL,
6133                            p_process_id          => l_process_id,
6134                            p_line_number         => p_line_number + i + 1,
6135                            x_error_msg           => x_error_msg,
6136                            x_status              => x_status);
6137 
6138             IF (x_status <> -1) THEN
6139                 FTE_UTIL_PKG.Exit_Debug(l_module_name);
6140                 RETURN;
6141             END IF;
6142 
6143             --+
6144             -- Add DISTANCE_TYPE attribute if rate basis is DISTANCE
6145             -- and distance type IS NOT LOADED
6146             --+
6147             IF (l_rate_basis = FTE_RTG_GLOBALS.G_TL_RATE_BASIS_DIST AND
6148                 l_dist_type IN ('UNLOADED', 'CONTINUOUS_MOVE')) THEN
6149 
6150                 l_attribute_type := 'TL_DISTANCE_TYPE';
6151                 ADD_ATTRIBUTE(p_attribute_type      => l_attribute_type,
6152                               p_attribute_value     => l_dist_type,
6153                               p_attribute_value_to  => NULL,
6154                               p_context             => FTE_RTG_GLOBALS.G_AX_TL_DISTANCE_TYPE,
6155                               p_linenum             => l_linenum,
6156                               p_comp_operator       => NULL,
6157                               p_process_id          => l_process_id,
6158                               p_line_number         => p_line_number + i + 1,
6159                               x_error_msg           => x_error_msg,
6160                               x_status              => x_status);
6161 
6162                 IF (x_status <> -1) THEN
6163                     FTE_UTIL_PKG.Exit_Debug(l_module_name);
6164                     RETURN;
6165                 END IF;
6166             END IF;
6167 
6168             --+
6169             -- RATE_TYPE Attribute should be attached to each line
6170             --+
6171             l_attribute_type  := 'TL_RATE_TYPE';
6172             l_attribute_value := 'BASE_RATE';
6173             ADD_ATTRIBUTE (p_attribute_type      => l_attribute_type,
6174                            p_attribute_value     => l_attribute_value,
6175                            p_attribute_value_to  => NULL,
6176                            p_context             => FTE_RTG_GLOBALS.G_AX_TL_RATE_TYPE,
6177                            p_linenum             => l_linenum,
6178                            p_comp_operator       => NULL,
6179                            p_process_id          => l_process_id,
6180                            p_line_number         => p_line_number + i + 1,
6181                            x_error_msg           => x_error_msg,
6182                            x_status              => x_status);
6183 
6184             IF (x_status <> -1) THEN
6185                 FTE_UTIL_PKG.Exit_Debug(l_module_name);
6186                 RETURN;
6187             END IF;
6188 
6189             --+
6190             -- Add the VEHICLE_TYPE attribute.
6191             --+
6192             IF (l_vehicle_type IS NOT NULL AND LENGTH(l_vehicle_type) > 0) THEN
6193 
6194                 l_attribute_type := 'TL_VEHICLE_TYPE';
6195                 ADD_ATTRIBUTE (p_attribute_type    => l_attribute_type,
6196                                p_attribute_value     => l_vehicle_type,
6197                                p_attribute_value_to  => NULL,
6198                                p_context             => FTE_RTG_GLOBALS.G_AX_VEHICLE,
6199                                p_linenum             => l_linenum,
6200                                p_process_id          => l_process_id,
6201                                p_comp_operator       => NULL,
6202                                p_line_number         => p_line_number,
6203                                x_error_msg           => x_error_msg,
6204                                x_status              => x_status);
6205 
6206                 IF (x_status <> -1) THEN
6207                     FTE_UTIL_PKG.Exit_Debug(l_module_name);
6208                     RETURN;
6209                 END IF;
6210             END IF;
6211 
6212             --+
6213             -- If rate basis is 'DISTANCE' and distance type is 'UNLOADED', then
6214             -- we create an additional line and attach the
6215             -- 'CONTINUOUS_MOVE_DEADHEAD_RATING' attribute.
6216             --+
6217             IF (l_deadhead) THEN
6218 
6219                 l_deadhead := FALSE;
6220 
6221                 --+
6222                 -- Create Rate Line
6223                 --+
6224                 l_linenum := l_linenum + 1;
6225                 l_description := 'Line ' || l_linenum || ' Of ' || l_rate_chart_name;
6226 
6227                 l_attribute := FTE_RTG_GLOBALS.G_C_CONTINUOUS_MOVE_DH_RT;
6228                 l_precedence := G_CONST_PRECEDENCE_LOW;
6229 
6230                 IF(FTE_BULKLOAD_PKG.g_debug_on) THEN
6231                     FTE_UTIL_PKG.Write_LogFile(l_module_name, 'Creating ' || l_description);
6232                 END IF;
6233 
6234                 l_rate_line_data('ACTION')      := G_ACTION;
6235                 l_rate_line_data('LINE_NUMBER') := l_linenum;
6236                 l_rate_line_data('DESCRIPTION') := l_description;
6237                 l_rate_line_data('RATE')        := Fnd_Number.Number_To_Canonical(l_rate);
6238                 l_rate_line_data('UOM')         := l_rate_basis_uom;
6239                 l_rate_line_data('VOLUME_TYPE') := 'TOTAL_QUANTITY';
6240                 l_rate_line_data('ATTRIBUTE1')  := l_attribute;
6241                 l_rate_line_data('PRECEDENCE')  := l_precedence;
6242                 l_rate_line_data('RATE_TYPE')   := 'PER_UOM';
6243 		l_rate_line_data('START_DATE_ACTIVE') := l_start_date;
6244                 l_rate_line_data('END_DATE_ACTIVE') := l_end_date;
6245 
6246                 l_rate_line_block_tbl(1) := l_rate_line_data;
6247 
6248                 FTE_RATE_CHART_LOADER.PROCESS_RATE_LINE(p_block_header  => g_dummy_block_hdr_tbl,
6249                                                         p_block_data    => l_rate_line_block_tbl,
6250                                                         p_line_number   => p_line_number + i + 1,
6251                                                         p_validate_column => FALSE,
6252                                                         x_status        => x_status,
6253                                                         x_error_msg     => x_error_msg);
6254                 l_rate_line_data.DELETE;
6255                 l_rate_line_block_tbl.DELETE;
6256 
6257                 IF (x_status <> -1) THEN
6258                     FTE_UTIL_PKG.Exit_Debug(l_module_name);
6259                     RETURN;
6260                 END IF;
6261 
6262                 --+
6263                 -- Attach the DEADHEAD_RATING to the line
6264                 --+
6265                 l_attribute_type := 'TL_DEADHEAD_RT_VAR';
6266                 ADD_ATTRIBUTE (p_attribute_type      => l_attribute_type,
6267                                p_attribute_value     => FTE_RTG_GLOBALS.G_TL_DEADHEAD_RT_VAR_YES,
6268                                p_attribute_value_to  => NULL,
6269                                p_context             => FTE_RTG_GLOBALS.G_AX_TL_DEADHEAD_RT_VAR,
6270                                p_linenum             => l_linenum,
6271                                p_process_id          => l_process_id,
6272                                p_comp_operator       => NULL,
6273                                p_line_number         => p_line_number + i + 1,
6274                                x_error_msg           => x_error_msg,
6275                                x_status              => x_status);
6276 
6277                 IF (x_status <> -1) THEN
6278                     FTE_UTIL_PKG.Exit_Debug(l_module_name);
6279                     RETURN;
6280                 END IF;
6281 
6282                 --+
6283                 -- Attach the Rate Basis Attribute to the line
6284                 --+
6285                 l_attribute_type := 'TL_RATE_BASIS';
6286                 ADD_ATTRIBUTE (p_attribute_type      => l_attribute_type,
6287                               p_attribute_value     => l_rate_basis,
6288                               p_attribute_value_to  => NULL,
6289                               p_context             => FTE_RTG_GLOBALS.G_AX_TL_RATE_BASIS,
6290                               p_linenum             => l_linenum,
6291                               p_process_id          => l_process_id,
6292                               p_comp_operator       => NULL,
6293                               p_line_number         => p_line_number + i + 1,
6294                               x_error_msg           => x_error_msg,
6295                               x_status              => x_status);
6296 
6297                 IF (x_status <> -1) THEN
6298                     FTE_UTIL_PKG.Exit_Debug(l_module_name);
6299                     RETURN;
6300                 END IF;
6301 
6302                 --+
6303                 -- Attach the Distance Type 'CONTINUOUS_MOVE' to the line.
6304                 --+
6305                 l_attribute_type := 'TL_DISTANCE_TYPE';
6306                 ADD_ATTRIBUTE (p_attribute_type      => l_attribute_type,
6307                                p_attribute_value     => FTE_RTG_GLOBALS.G_TL_DIST_TYPE_CM,
6308                                p_attribute_value_to  => NULL,
6309                                p_context             => FTE_RTG_GLOBALS.G_AX_TL_DISTANCE_TYPE,
6310                                p_linenum             => l_linenum,
6311                                p_comp_operator       => NULL,
6312                                p_process_id          => l_process_id,
6313                                p_line_number         => p_line_number + i + 1,
6314                                x_error_msg           => x_error_msg,
6315                                x_status              => x_status);
6316 
6317                 IF (x_status <> -1) THEN
6318                     FTE_UTIL_PKG.Exit_Debug(l_module_name);
6319                     RETURN;
6320                 END IF;
6321 
6322                 --+
6323                 -- Attach the Rate Type (BASE_RATE) Attribute
6324                 --+
6325                 l_attribute_type  := 'TL_RATE_TYPE';
6326                 l_attribute_value := 'BASE_RATE';
6327 
6328                 ADD_ATTRIBUTE(p_attribute_type      => l_attribute_type,
6329                               p_attribute_value     => l_attribute_value,
6330                               p_attribute_value_to  => NULL,
6331                               p_context             => FTE_RTG_GLOBALS.G_AX_TL_RATE_TYPE,
6332                               p_linenum             => l_linenum,
6333                               p_comp_operator       => NULL,
6334                               p_process_id          => l_process_id,
6335                               p_line_number         => p_line_number + i + 1,
6336                               x_error_msg           => x_error_msg,
6337                               x_status              => x_status);
6338 
6339                 IF (x_status <> -1) THEN
6340                     FTE_UTIL_PKG.Exit_Debug(l_module_name);
6341                     RETURN;
6342                 END IF;
6343 
6344 
6345                 --+
6346                 -- Add the VEHICLE_TYPE (optional) attribute if the vehicle is specified
6347                 --+
6348                 IF (l_vehicle_type IS NOT NULL AND LENGTH(l_vehicle_type) > 0) THEN
6349                     --+
6350                     -- Vehicle Type has already been translated to ID format
6351                     --+
6352                     l_attribute_type := 'TL_VEHICLE_TYPE';
6353                     ADD_ATTRIBUTE ( p_attribute_type      => l_attribute_type,
6354                                     p_attribute_value     => l_vehicle_type,
6355                                     p_attribute_value_to  => NULL,
6356                                     p_context             => FTE_RTG_GLOBALS.G_AX_VEHICLE,
6357                                     p_linenum             => l_linenum,
6358                                     p_comp_operator       => NULL,
6359                                     p_process_id          => l_process_id,
6360                                     p_line_number         => p_line_number + i + 1,
6361                                     x_error_msg           => x_error_msg,
6362                                     x_status              => x_status);
6363 
6364                     IF (x_status <> -1) THEN
6365                         FTE_UTIL_PKG.Exit_Debug(l_module_name);
6366                         RETURN;
6367                     END IF;
6368                 END IF;
6369             END IF;
6370 
6371 
6372             --+
6373             -- Validate and store the minimum charge, if it is specified.
6374             --+
6375             IF (l_min_charge IS NOT NULL) THEN
6376                 IF (l_rate_basis <> FTE_RTG_GLOBALS.G_TL_RATE_BASIS_FLAT) THEN
6377                     STORE_MIN_CHARGE(p_chart_name => l_rate_chart_name,
6378                                      p_charge     => l_min_charge,
6379                                      p_basis      => l_rate_basis,
6380                                      p_uom        => l_rate_basis_uom,
6381                                      p_vehicle    => l_vehicle_type,
6382                                      p_line_number => p_line_number + i + 1,
6383                                      x_error_msg  => x_error_msg,
6384                                      x_status     => x_status);
6385 
6386                 ELSE
6387                     x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_FLAT_MIN_NOT_ALLOWED');
6388                     FTE_UTIL_PKG.Write_OutFile(p_msg         => x_error_msg,
6389                                                p_module_name => l_module_name,
6390                                                p_category    => 'D',
6391                                                p_line_number => p_line_number + i + 1);
6392                     FTE_UTIL_PKG.Exit_Debug(l_module_name);
6393                     x_status := 2;
6394                     RETURN;
6395                 END IF;
6396 
6397                 IF (x_status <> -1) THEN
6398                     FTE_UTIL_PKG.Exit_Debug(l_module_name);
6399                     RETURN;
6400                 END IF;
6401             END IF;
6402 
6403             SET_CHART_LINE(l_rate_chart_name, l_linenum, x_status);
6404 
6405         <<next_record>> NULL;
6406 
6407         END LOOP;
6408 
6409         SUBMIT_TL_CHART(x_status, x_error_msg);
6410 
6411         IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
6412             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'Return status from SUBMIT_TL_CHART  ', x_status);
6413             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'Return Message from SUBMIT_TL_CHART ', x_error_msg);
6414         END IF;
6415 
6416         IF (x_status <> -1) THEN
6417             FTE_UTIL_PKG.Exit_Debug(l_module_name);
6418             RETURN;
6419         END IF;
6420 
6421         FTE_UTIL_PKG.Exit_Debug(l_module_name);
6422 
6423     EXCEPTION
6424         WHEN OTHERS THEN
6425            x_status := 2;
6426            x_error_msg := sqlerrm;
6427            FTE_UTIL_PKG.Write_LogFile(l_module_name, 'UNEXPECTED ERROR occured in PROCESS_TL_BASE_RATES ', sqlerrm);
6428            FTE_UTIL_PKG.Exit_Debug(l_module_name);
6429 
6430     END PROCESS_TL_BASE_RATES;
6431 
6432     --_________________________________________________________________________________--
6433     --                                                                                 --
6434     -- PROCEDURE: PROCESS_TL_SERVICES                                                  --
6435     --                                                                                 --
6436     -- Purpose: This is called by PROCESS_DATA if the type to be processed   --
6437     --          is 'TL_SERVICES'. By uploading a 'TL_SERVICE' block, the user is       --
6438     --          creating a tl service, a ratechart - service association and           --
6439     --          a service level in the system.                                         --
6440     --                                                                                 --
6441     -- IN Parameters                                                                   --
6442     --    1. p_block_header: An associative array with column names in the upload file,--
6443     --                       as indices and integers as values.                        --
6444     --    2. p_block_data  : A table of associative array. Each element in the table   --
6445     --                       represents a single line of data in the upload file.      --
6446     --    3. p_line_number : Specifies the line number in the file where this block    --
6447     --                       begins.This is used for error logging, which aims         --
6448     --                       at ease of loader usage.                                  --
6449     --                                                                                 --
6450     -- Out Parameters                                                                  --
6451     --    x_status  :  the return status, -1 for success                               --
6452     --                                     2 for failure.                              --
6453     --    x_error_msg: the corresponding error meassge,                                --
6454     --                 if any exception occurs during the process.                     --
6455     --_________________________________________________________________________________--
6456 
6457     PROCEDURE PROCESS_TL_SERVICES(p_block_header    IN  FTE_BULKLOAD_PKG.block_header_tbl,
6458                                   p_block_data      IN  FTE_BULKLOAD_PKG.block_data_tbl,
6459                                   p_line_number     IN  NUMBER,
6460                                   x_status          OUT NOCOPY  NUMBER,
6461                                   x_error_msg       OUT NOCOPY  VARCHAR2) IS
6462 
6463         l_action       VARCHAR2(100);
6464         l_values       FTE_BULKLOAD_PKG.data_values_tbl;
6465 
6466         l_mode         CONSTANT VARCHAR2(50)  := 'TRUCK';
6467         l_type         VARCHAR2(25)  := 'TL_SERVICES';
6468         l_module_name  CONSTANT VARCHAR2(100) := 'FTE.PLSQL.' || G_PKG_NAME || '.PROCESS_TL_SERVICES';
6469 
6470         /* Columns in TL-Services.
6471         ACTION, CARRIER_NAME, SERVICE_NUMBER,
6472         ORIGIN_COUNTRY, ORIGIN_STATE, ORIGIN_CITY, ORIGIN_POSTAL_CODE_FROM, ORIGIN_POSTAL_CODE_TO, ORIGIN_ZONE,
6473         DESTINATION_COUNTRY, DESTINATION_STATE, DESTINATION_CITY, DESTINATION_POSTAL_CODE_FROM, DESTINATION_POSTAL_CODE_TO, DESTINATION_ZONE,
6474         SERVICE_START_DATE, SERVICE_END_DATE,
6475         SERVICE_LEVEL, RATE_CHART_NAME
6476         */
6477 
6478     BEGIN
6479 
6480         FTE_UTIL_PKG.Enter_Debug(l_module_name);
6481         x_status := -1;
6482 
6483         FTE_VALIDATION_PKG.VALIDATE_COLUMNS(p_keys      => p_block_header,
6484                                             p_type      => l_type,
6485                                             p_line_number => p_line_number+1,
6486                                             x_status    => x_status,
6487                                             x_error_msg => x_error_msg);
6488         IF (x_status <> -1) THEN
6489             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'VALIDATE_COLUMNS returned with Error');
6490             FTE_UTIL_PKG.Exit_Debug(l_module_name);
6491             RETURN;
6492         END IF;
6493 
6494         FOR i IN 1..p_block_data.COUNT LOOP
6495 
6496             l_values := p_block_data(i);
6497 
6498             -- Validate ACTION.
6499             -- The valid actions for TL are ADD, DELETE and  UPDATE.
6500             l_action := FTE_UTIL_PKG.GET_DATA('ACTION', l_values);
6501 
6502 
6503             FTE_VALIDATION_PKG.VALIDATE_ACTION(p_action      => l_action,
6504                                                p_type        => l_type,
6505                                                p_line_number => p_line_number + i + 1,
6506                                                x_status      => x_status,
6507                                                x_error_msg   => x_error_msg);
6508             IF (x_status <> -1) THEN
6509                 FTE_UTIL_PKG.Write_LogFile(l_module_name, 'VALIDATE_ACTION returned with Error');
6510                 FTE_UTIL_PKG.Exit_Debug(l_module_name);
6511                 RETURN;
6512             END IF;
6513 
6514             --+
6515             -- VALIDATE_TL_SERVICE validates CARRIER,MODE etc., of the line
6516             -- and put the values in the pl/sql tables passed. We collect the values in these pl/sql
6517             -- tables and do a bulk insert after the processing all the lines.
6518             --+
6519             FTE_VALIDATION_PKG.VALIDATE_TL_SERVICE(p_values             => l_values,
6520                                                    p_line_number        => p_line_number + i + 1,
6521                                                    p_type               => l_type,
6522                                                    p_action             => l_action,
6523                                                    p_lane_tbl           => g_lane_tbl,
6524                                                    p_lane_service_tbl   => g_lane_service_tbl,
6525                                                    p_lane_rate_chart_tbl=> g_lane_rate_chart_tbl,
6526                                                    x_status             => x_status,
6527                                                    x_error_msg          => x_error_msg);
6528             IF (x_status <> -1) THEN
6529                 FTE_UTIL_PKG.Write_LogFile(l_module_name, 'VALIDATE_TL_SERVICE returned with Error');
6530                 FTE_UTIL_PKG.Exit_Debug(l_module_name);
6531                 RETURN;
6532             END IF;
6533 
6534         END LOOP;
6535 
6536         FTE_LANE_PKG.INSERT_LANE_TABLES(p_lane_tbl            => g_lane_tbl,
6537                                         p_lane_rate_chart_tbl => g_lane_rate_chart_tbl,
6538                                         p_lane_commodity_tbl  => g_lane_commodity_tbl,
6539                                         p_lane_service_tbl    => g_lane_service_tbl,
6540                                         x_status              => x_status,
6541                                         x_error_msg           => x_error_msg);
6542 
6543         FTE_UTIL_PKG.Exit_Debug(l_module_name);
6544 
6545     EXCEPTION
6546         WHEN OTHERS THEN
6547             x_status := 2;
6548             FTE_UTIL_PKG.Write_LogFile(l_module_name,'UNEXPECTED ERROR OCCURED IN ' || l_module_name);
6549             FTE_UTIL_PKG.Exit_Debug(l_module_name);
6550 
6551     END PROCESS_TL_SERVICES;
6552 
6553 
6554     --_________________________________________________________________________________--
6555     --                                                                                 --
6556     -- PROCEDURE: PROCESS_DATA                                                         --
6557     --                                                                                 --
6558     -- PURPOSE: Call appropriate process_xxx based on the type.                        --
6559     --          where xxx is one of TL_SERVICES, TL_BASE_RATES,TL_SURCHARGES,          --
6560     --          and FACILITY_CHARGES                                                   --
6561     --                                                                                 --
6562     -- PARAMETERS:                                                                     --
6563     -- IN                                                                              --
6564     --    0. p_type        : Type of the block to be processed. This calls             --
6565     --                       the appropriate PROCESS_XXX depending on this parameter.  --
6566     --                       In R12, It can take the following four values.            --
6567     --                       TL_SERVICES, TL_BASE_RATES,TL_SURCHARGES                  --
6568     --                       and FACILITY_CHARGES                                      --
6569     --    1. p_block_header: An associative array with column names in the upload file,--
6570     --                       as indices and integers as values.                        --
6571     --    2. p_block_data  : A table of associative array. Each element in the table   --
6572     --                       represents a single line of data in the upload file.      --
6573     --    3. p_line_number : Specifies the line number in the file where this block    --
6574     --                       begins.This is used for error logging, which aims         --
6575     --                       at ease of loader usage.                                  --
6576     --                                                                                 --
6577     -- OUT parameters:                                                                 --
6578     --    1. x_status:    status of the processing, -1 means no error                  --
6579     --    2. x_error_msg: error message if any.                                        --
6580     --_________________________________________________________________________________--
6581 
6582     PROCEDURE PROCESS_DATA (  p_type            IN  VARCHAR2,
6583                               p_block_header    IN  FTE_BULKLOAD_PKG.block_header_tbl,
6584                               p_block_data      IN  FTE_BULKLOAD_PKG.block_data_tbl,
6585                               p_line_number     IN  NUMBER,
6586                               x_status          OUT NOCOPY NUMBER,
6587                               x_error_msg       OUT NOCOPY VARCHAR2) IS
6588 
6589     l_module_name       CONSTANT VARCHAR2(100) := 'FTE.PLSQL.' || G_PKG_NAME || '.PROCESS_DATA';
6590 
6591     BEGIN
6592 
6593         FTE_UTIL_PKG.Enter_Debug(l_module_name);
6594         x_status := -1;
6595 
6596         IF(FTE_BULKLOAD_PKG.g_debug_on) THEN
6597             FTE_UTIL_PKG.Write_LogFile(l_module_name,'p_type              ', p_type);
6598             FTE_UTIL_PKG.Write_LogFile(l_module_name,'p_block_header count', p_block_header.COUNT);
6599             FTE_UTIL_PKG.Write_LogFile(l_module_name,'p_block_data.count  ', p_block_data.count);
6600             FTE_UTIL_PKG.Write_LogFile(l_module_name,'p_line_number       ', p_line_number);
6601         END IF;
6602 
6603         IF(p_block_header.COUNT =0 OR p_block_data.COUNT = 0 ) THEN
6604             x_status := 2;
6605             x_error_msg := FTE_UTIL_PKG.GET_MSG(p_name => 'FTE_COLUMN_OR_DATA_MISSING');
6606             FTE_UTIL_PKG.Write_OutFile( p_msg    => x_error_msg,
6607                                         p_module_name => l_module_name,
6608                                         p_category    => 'D',
6609                                         p_line_number => p_line_number);
6610             FTE_UTIL_PKG.Exit_Debug(l_module_name);
6611             RETURN;
6612         END IF;
6613 
6614         IF (p_type = 'TL_SERVICES') THEN
6615 
6616             PROCESS_TL_SERVICES(p_block_header => p_block_header,
6617                                 p_block_data   => p_block_data,
6618                                 p_line_number  => p_line_number,
6619                                 x_status       => x_status,
6620                                 x_error_msg    => x_error_msg);
6621 
6622         ELSIF (p_type = 'TL_BASE_RATES') THEN
6623 
6624             PROCESS_TL_BASE_RATES(p_block_header => p_block_header,
6625                                   p_block_data   => p_block_data,
6626                                   p_line_number  => p_line_number,
6627                                   p_doValidate   => TRUE,
6628                                   x_status       => x_status,
6629                                   x_error_msg    => x_error_msg);
6630 
6631         ELSIF (p_type = 'TL_SURCHARGES') THEN
6632 
6633             PROCESS_TL_SURCHARGES(p_block_header => p_block_header,
6634                                   p_block_data   => p_block_data,
6635                                   p_line_number  => p_line_number,
6636                                   x_status       => x_status,
6637                                   x_error_msg    => x_error_msg);
6638 
6639         ELSIF (p_type = 'FACILITY_CHARGES') THEN
6640 
6641             PROCESS_FACILITY_CHARGES(p_block_header => p_block_header,
6642                                      p_block_data   => p_block_data,
6643                                      p_line_number  => p_line_number,
6644                                      x_status       => x_status,
6645                                      x_error_msg    => x_error_msg);
6646         ELSE
6647                 -- Unreacheable code --
6648                 x_status := 2;
6649                 FTE_UTIL_PKG.Write_LogFile(l_module_name,'INVALID BLOCK TYPE');
6650 
6651         END IF;
6652 
6653         FTE_UTIL_PKG.Exit_Debug(l_module_name);
6654 
6655     EXCEPTION
6656 
6657         WHEN OTHERS THEN
6658             x_status := 2;
6659             FTE_UTIL_PKG.Write_LogFile(l_module_name, 'UNEXPECTED ERROR OCCURED IN ' || l_module_name || sqlerrm);
6660             FTE_UTIL_PKG.Exit_Debug(l_module_name);
6661 
6662     END PROCESS_DATA;
6663 
6664 END FTE_TL_LOADER;