DBA Data[Home] [Help]

PACKAGE BODY: APPS.FTE_UTIL_PKG

Source


1 PACKAGE BODY FTE_UTIL_PKG AS
2 /* $Header: FTEUTILB.pls 120.8 2005/08/02 00:12:27 pkaliyam ship $ */
3 
4   --
5   -- Package FTE_UTIL_PKG
6   --
7   --
8 
9   g_debug_set            BOOLEAN := TRUE;
10   g_debug_on             BOOLEAN := TRUE;
11   g_user_debug        BOOLEAN;
12   G_PKG_NAME    CONSTANT        VARCHAR2(50) := 'FTE_UTIL_PKG';
13 
14   TYPE VARCHAR2_TAB IS TABLE OF VARCHAR2(100) INDEX BY BINARY_INTEGER;
15 
16   concat_segments    varchar2_tab;
17   catg_ids           varchar2_tab;
18   segment_code       varchar2_tab;
19   segment_val        varchar2_tab;
20   segment_cc         varchar2_tab;
21   l_delimiter        varchar2(3);
22 
23   ----------------------------------------------------------------
24   -- FUNCTION : Tokenize_String
25   --
26   -- Parameters :
27   -- IN:
28   --  1. p_string            VARCHAR2          REQUIRED
29   --                         The string to be tokenized.
30   --  2. p_delim             VARCHAR2          REQUIRED
31   --                         The delimiter, or token.
32   -- RETURN: A Stringarray containing the tokens of the string.
33   ----------------------------------------------------------------
34   FUNCTION Tokenize_String (p_string     IN    VARCHAR2,
35                             p_delim      IN    VARCHAR2) RETURN STRINGARRAY IS
36 
37   l_tokens                   STRINGARRAY := STRINGARRAY();
38   l_token                    VARCHAR2(4000);
39   l_start_index              NUMBER := 1;
40   l_end_index                NUMBER := 1;
41   l_count                    NUMBER := 0;
42   l_delim_count              NUMBER := 1;
43 
44   BEGIN
45     l_delim_count := length(p_delim);
46     WHILE l_end_index <> 0  LOOP
47       l_end_index := INSTR(p_string, p_delim, l_start_index);
48       l_count := l_count + 1;
49       IF (l_end_index = 0) THEN
50         --no more tokens after this one
51         l_token := SUBSTR(p_string, l_start_index);
52       ELSE
53         l_token := SUBSTR(p_string, l_start_index,
54                           l_end_index - l_start_index);
55       END IF;
56       l_start_index := l_end_index + l_delim_count;
57       l_tokens.extend;
58       l_tokens(l_count) := l_token;
59     END LOOP;
60     RETURN l_tokens;
61   END TOKENIZE_STRING;
62 
63 
64   ------------------------------------------------------------
65   --FUNCTION : Get_Msg
66   --
67   -- Parameters :
68   -- IN:
69   --  1. p_name        VARCHAR2       REQUIRED
70   --  2. p_tokens      STRINGARRAY    NOT REQUIRED.
71   --                   The tokens for the message.
72   --  3. p_values      STRINGARRAY    NOT REQUIRED.
73   --                   The token values.  Required if p_tokens is passed.
74   --
75   -- RETURN  The token-substituted message text
76   -------------------------------------------------------------
77   FUNCTION Get_Msg (p_name         IN    VARCHAR2,
78                     p_tokens       IN    STRINGARRAY DEFAULT NULL,
79                     p_values       IN    STRINGARRAY DEFAULT NULL)
80    RETURN VARCHAR2 IS
81 
82   l_msg       varchar2(5000);
83 
84   BEGIN
85 
86     IF (p_name IS NULL) THEN
87       Fnd_File.Put_Line(Fnd_File.Log, 'Fte_Util_Pkg => Programmer Error: Message Name NULL');
88       RETURN NULL;
89     END IF;
90 
91     IF (p_tokens.EXISTS(1) AND p_values.EXISTS(1)
92         AND p_tokens.COUNT = p_values.COUNT ) THEN
93       Fnd_Message.Set_Name('APPLICATION' => 'FTE',
94                            'NAME' => p_name);
95 
96       FOR i IN 1..p_tokens.COUNT LOOP
97         Fnd_Message.Set_Token(token => p_tokens(i), value => p_values(i));
98       END LOOP;
99 
100       l_msg := Fnd_Message.Get;
101     ELSE
102       l_msg := Fnd_Message.Get_String('APPIN'  => 'FTE',
103 	                              'NAMEIN' => p_name);
104     END IF;
105 
106     return l_msg;
107 
108   EXCEPTION
109     WHEN OTHERS THEN
110       Fnd_File.Put_Line(Fnd_File.Log, 'UNEXP. ERROR IN FTE_UTIL_PKG.Get_Msg: ' || sqlerrm);
111       RAISE;
112   END Get_Msg;
113 
114   -----------------------------------------------------------------
115   -- FUNCTION : Canonicalize_Number
116   --
117   -- Parameters :
118   -- IN:
119   --  1. p_number             NUMBER            REQUIRED
120   ------------------------------------------------------------------
121   FUNCTION Canonicalize_Number (p_number    IN    NUMBER)
122    RETURN NUMBER IS
123   BEGIN
124     return
125       fnd_number.canonical_to_number(fnd_number.number_to_canonical(p_number));
126   END;
127 
128   -----------------------------------------------------------------------------
129   -- FUNCTION  GET_CARRIER_ID
130   --
131   -- Purpose  Get Carrier Id From Carrier Name
132   --
133   -- IN Parameters:
134   --  	1. p_carrier_name:	carrier name
135   -----------------------------------------------------------------------------
136   FUNCTION GET_CARRIER_ID(p_carrier_name    IN      VARCHAR2) RETURN NUMBER IS
137 
138   l_carrier_id    	NUMBER := NULL;
139   l_module_name CONSTANT VARCHAR2(100) := 'fte.plsql.' || G_PKG_NAME || '.GET_CARRIER_ID';
140 
141   BEGIN
142     SELECT hz.PARTY_ID  INTO l_carrier_id
143       FROM   HZ_PARTIES hz, WSH_CARRIERS ca
144       WHERE  hz.party_name = p_carrier_name
145         AND    hz.party_id   = ca.carrier_id;
146 
147     RETURN l_carrier_id;
148   EXCEPTION
149     WHEN NO_DATA_FOUND THEN
150       RETURN -1;
151     WHEN OTHERS THEN
152       WRITE_OUTFILE(p_module_name => l_module_name,
153                     p_msg   	  => sqlerrm,
154                     p_category    => 'O');
155       RETURN -2;
156   END GET_CARRIER_ID;
157 
158 -----------------------------------------------------------------------------
159   -- FUNCTION  GET_CARRIER_NAME
160   --
161   -- Purpose  Get Carrier Name From Carrier ID
162   --
163   -- IN Parameters:
164   --  	1. p_carrier_name:	carrier name
165   -----------------------------------------------------------------------------
166   FUNCTION GET_CARRIER_NAME(p_carrier_id IN NUMBER) RETURN VARCHAR2 IS
167 
168   l_carrier_name HZ_PARTIES.PARTY_NAME%TYPE;
169   l_module_name CONSTANT VARCHAR2(100) := 'FTE.PLSQL.' || G_PKG_NAME || '.GET_CARRIER_NAME';
170 
171   BEGIN
172 
173     SELECT hz.PARTY_name
174     INTO l_carrier_name
175     FROM HZ_PARTIES hz
176     WHERE hz.party_id = p_carrier_id;
177 
178     RETURN l_carrier_name;
179 
180   EXCEPTION
181 
182     WHEN NO_DATA_FOUND THEN
183       RETURN -1;
184 
185     WHEN OTHERS THEN
186       WRITE_OUTFILE(p_module_name => l_module_name,
187                     p_msg   	  => sqlerrm,
188                     p_category    => 'O');
189       RETURN -2;
190   END GET_CARRIER_NAME;
191 
192   -------------------------------------------------------------------------------
193   --  FUNCTION GET_LOOKUP_CODE
194   --
195   --  Purpose:	Get the code from fnd_lookup_values
196   --
197   --  IN parameter:
198   --	1. p_lookup_type:	type of the lookup
199   --	2. p_value:		value to lookup
200   -------------------------------------------------------------------------------
201   FUNCTION GET_LOOKUP_CODE(p_lookup_type IN VARCHAR2,
202                            p_value       IN VARCHAR2)  RETURN VARCHAR2 IS
203 
204   l_code     	VARCHAR2(100);
205   l_module_name CONSTANT VARCHAR2(100) := 'fte.plsql.' || G_PKG_NAME || '.GET_LOOKUP_CODE';
206 
207   BEGIN
208     l_code := null;
209 
210     -- First check with LOOKUP_CODE
211     BEGIN
212       SELECT lookup_code  INTO l_code
213         FROM   fnd_lookup_values_vl
214         WHERE  lookup_type = p_lookup_type
215           AND    lookup_code = p_value;
216     EXCEPTION
217       WHEN NO_DATA_FOUND THEN
218         BEGIN
219           -- If the given value can't be found as LOOKUP_CODE
220           -- try with 'like MEANING%'
221           SELECT lookup_code  INTO l_code
222             FROM   fnd_lookup_values_vl
223             WHERE  lookup_type = p_lookup_type
224               AND    meaning like p_value;
225         EXCEPTION
226           WHEN NO_DATA_FOUND THEN
227             RETURN NULL;
228         END;
229     END;
230 
231     RETURN l_code;
232 
233   EXCEPTION
234     WHEN OTHERS THEN
235       WRITE_OUTFILE(p_module_name => l_module_name,
236                     p_msg   	  => sqlerrm,
237                     p_category    => 'O');
238 
239       RETURN NULL;
240   END GET_LOOKUP_CODE;
241 
242   -------------------------------------------------------------------------------
243   -- FUNCTION GET_SHIPPING_UOM_CLASS
244   --
245   -- Purpose: get the shipping uom class from the class name
246   --
247   -- IN parameters:
248   --	1. p_uom_class:	uom class name
249   --
250   -- Returns a uom class name corresponding to the input class, NULL if exception raised
251   -------------------------------------------------------------------------------
252   FUNCTION GET_SHIPPING_UOM_CLASS(p_uom_class	IN 	VARCHAR2) RETURN VARCHAR2 IS
253   l_uom_class 	VARCHAR2(20) := '';
254   BEGIN
255     BEGIN
256       SELECT p_uom_class--||'_uom_class'
257 	INTO l_uom_class
258         FROM wsh_shipping_parameters
259         WHERE rownum < 2;
260     EXCEPTION
261       WHEN OTHERS THEN
262 	RETURN NULL;
263     END;
264     RETURN l_uom_class;
265   END GET_SHIPPING_UOM_CLASS;
266 
267   -------------------------------------------------------------------------------
268   -- FUNCTION GET_UOM_CODE
269   --
270   -- Purpose: get the uom code from uom name and class
271   --
272   -- IN parameters:
273   --	1. p_uom:	uom name
274   --	2. p_uom_class: class name (only applies to weight and volumn)
275   --
276   -- Returns a Uom_Code searching into mtl_units_of_measure
277   --                 using first uom_code then unit_of_measure
278   -------------------------------------------------------------------------------
279   FUNCTION GET_UOM_CODE(p_uom		IN	VARCHAR2,
280 			p_uom_class	IN	VARCHAR2 DEFAULT NULL) RETURN VARCHAR2 IS
281 
282   l_code 		VARCHAR2(100) := '';
283   l_shipping_uom_class 	VARCHAR2(100) := '';
284   l_module_name      CONSTANT VARCHAR2(100) := 'fte.plsql.' || G_PKG_NAME || '.GET_UOM_CODE';
285 
286   BEGIN
287     IF (p_uom_class IS NULL OR p_uom_class NOT IN ('Weight', 'Volume')) THEN
288       BEGIN
289         -- First check with UOM_CODE
290         SELECT uom_code  INTO l_code
291           FROM   mtl_units_of_measure
292           WHERE  uom_code  = p_uom;
293       EXCEPTION
294         WHEN NO_DATA_FOUND THEN
295           BEGIN
296             -- If the given value can't be found as UOM_CODE
297             -- try with UNIT_OF_MEASURE
298             SELECT uom_code INTO l_code
299               FROM   mtl_units_of_measure
300               WHERE  unit_of_measure = p_uom;
301           EXCEPTION
302             WHEN OTHERS THEN
303 	      RETURN NULL;
304           END;
305         WHEN OTHERS THEN
306 	  RETURN NULL;
307       END;
308     ELSE
309       l_shipping_uom_class := GET_SHIPPING_UOM_CLASS(p_uom_class);
310       IF (l_shipping_uom_class IS NOT NULL) THEN
311         BEGIN
312           -- First check with UOM_CODE
313           SELECT  uom_code  INTO l_code
314             FROM  mtl_units_of_measure
315             WHERE uom_code  = p_uom
316 	      AND uom_class = l_shipping_uom_class;
317         EXCEPTION
318           WHEN NO_DATA_FOUND THEN
319             BEGIN
320               -- If the given value can't be found as UOM_CODE
321               -- try with UNIT_OF_MEASURE
322               SELECT  uom_code INTO l_code
323                 FROM  mtl_units_of_measure
324                 WHERE unit_of_measure = p_uom
325 		  AND uom_class = l_shipping_uom_class;
326             EXCEPTION
327               WHEN OTHERS THEN
328 		RETURN NULL;
329             END;
330           WHEN OTHERS THEN
331 	    RETURN NULL;
332         END;
333       ELSE
334 	RETURN NULL;
335       END IF;
336     END IF;
337 
338     RETURN l_code;
339   END GET_UOM_CODE;
340 
341   -----------------------------------------------------------------------------
342   -- FUNCTION  GET_DATA
343   --
344   -- Purpose  Given two String arrays representing key/value pairs, and a 'key',
345   --          it returns the corresponding 'value'.
346   --
347   -- IN Parameters
348   --    1. p_key: The 'key' whose corresponding value is required
349   --    2. p_keys: An array of keys.
350   --    3. p_values : An array of values.
351   --
352   -- RETURN: The corresponding 'value' of the input parameter 'p_key', or NULL
353   --         if 'p_key' is not in the array of keys.
354   -----------------------------------------------------------------------------
355   FUNCTION GET_DATA(p_key     IN     VARCHAR2,
356                     p_values  IN     FTE_BULKLOAD_PKG.data_values_tbl) RETURN VARCHAR2 IS
357 
358   l_data         VARCHAR2(50) := NULL;
359   l_module_name  CONSTANT VARCHAR2(100) := 'fte.plsql.' || G_PKG_NAME || '.GET_DATA';
360 
361   BEGIN
362     IF (p_values.EXISTS(p_key)) THEN
363       RETURN p_values(p_key);
364     ELSE
365       RETURN NULL;
366     END IF;
367   EXCEPTION
368     WHEN SUBSCRIPT_BEYOND_COUNT THEN
369       Enter_Debug(l_module_name);
370       WRITE_LOGFILE(l_module_name, 'WARNING: Key or Value not found for Tag ' || p_key);
371       Exit_Debug(l_module_name);
372       RETURN NULL;
373     WHEN NO_DATA_FOUND THEN
374       ENTER_Debug(l_module_name);
375       WRITE_LOGFILE(l_module_name, 'WARNING: No data found for key ' || p_key);
376       Exit_Debug(l_module_name);
377       RETURN NULL;
378     WHEN OTHERS THEN
379       WRITE_OUTFILE(p_module_name => l_module_name,
380 	            p_msg   	  => sqlerrm,
381 	            p_category    => 'O');
382 
383       RETURN NULL;
384   END GET_DATA;
385 
386   -----------------------------------------------------------------------------
387   -- FUNCTION Get_Vehicle_Type
388   --
389   -- Purpose  Get the vehicle ID Given the vehicle type or id
390   --
391   -- IN Parameters
392   --    1. l_vehicle_type   IN   VARCHAR2 : The vehicle type to be validated.
393   --
394   -- RETURN:
395   --    the vehicle ID, or null if it doesn't exist.
396   -----------------------------------------------------------------------------
397   FUNCTION Get_Vehicle_Type (p_vehicle_type  IN           VARCHAR2) RETURN VARCHAR2 IS
398 
399   l_veh_id           NUMBER := NULL;
400   l_module_name      CONSTANT VARCHAR2(100) := 'fte.plsql.' || G_PKG_NAME || '.GET_VEHICLE_TYPE';
401 
402   BEGIN
403 
404     BEGIN
405       SELECT veh.vehicle_type_id
406       INTO  l_veh_id
407       FROM  mtl_system_items_kfv mtl, fte_vehicle_types veh
408       WHERE mtl.concatenated_segments = p_vehicle_type
409       AND   mtl.inventory_item_id = veh.inventory_item_id
410       AND   mtl.vehicle_item_flag = 'Y'
411       AND   rownum = 1;
412 
413     EXCEPTION
414       WHEN NO_DATA_FOUND THEN
415         BEGIN
416           SELECT veh.vehicle_type_id
417           INTO  l_veh_id
418           FROM  mtl_system_items_kfv mtl, fte_vehicle_types veh
419           WHERE to_char(veh.vehicle_type_id) = p_vehicle_type
420           AND   mtl.inventory_item_id = veh.inventory_item_id
421           AND   mtl.vehicle_item_flag = 'Y'
422           AND   rownum = 1;
423         EXCEPTION
424           WHEN NO_DATA_FOUND THEN
425 	    RETURN null;
426         END;
427     END;
428 
429     return l_veh_id;
430 
431   EXCEPTION
432     WHEN OTHERS THEN
433       ENTER_Debug(l_module_name);
434       WRITE_OUTFILE(p_module_name => l_module_name,
435                     p_msg   	  => sqlerrm,
436                     p_category    => 'O');
437       Exit_Debug(l_module_name);
438       RETURN NULL;
439   END Get_Vehicle_Type;
440 
441 
442   -----------------------------------------------------------------------------
443   -- FUNCTION GET_CATG_ID
444   --
445   -- Purpose  Get the category ID using the commodity value
446   --
447   -- IN Parameters
448   --    1. p_com_class:	commodity class
449   --	2. p_value:	commodity value
450   --
451   -- RETURN:
452   --    the category id for the commodity, -1 if not found
453   -----------------------------------------------------------------------------
454 
455   FUNCTION GET_CATG_ID (p_com_class	IN	VARCHAR2,
456 			p_value		IN	VARCHAR2) RETURN NUMBER IS
457   l_delimiter	VARCHAR2(5);
458   l_id		NUMBER;
459   l_class	VARCHAR2(100);
460   token_tab              STRINGARRAY;
461   l_value 	VARCHAR2(30);
462   BEGIN
463     BEGIN
464       SELECT concatenated_segment_delimiter
465         INTO l_delimiter
466         FROM fnd_id_flex_structures
467        WHERE id_flex_code = 'MCAT'
468          AND id_flex_structure_code='WSH_COMMODITY_CODE'
469          AND application_id = 401;
470 
471     EXCEPTION
472       WHEN NO_DATA_FOUND THEN
473 --            addError(FIELD_COMMODITY,"FTE_CAT_COMM_DELIMITER_ERROR", DataLoader.CATEGORY_B);
474             return -1;
475     END;
476 
477     -- Validate against Commodify Class in the lane
478 
479     IF (INSTR(p_value, l_delimiter) <= 0) THEN
480       l_class := p_value;
481     ELSE
482       l_class := SUBSTR(p_value, 1, (INSTR(p_value, l_delimiter)-1));
483     END IF;
484 
485     IF (l_class <> p_com_class) THEN
486       RETURN -3;
487     END IF;
488 
489     token_tab := TOKENIZE_STRING(p_value, l_delimiter);
490 
491     IF (token_tab.COUNT = 1) THEN
492       l_value := token_tab(1);
493     ELSIF (token_tab.COUNT > 1) THEN
494       l_value := token_tab(1) || l_delimiter || token_tab(2);
495     END IF;
496 
497     BEGIN
498       SELECT category_id
499         INTO l_id
500         FROM mtl_categories_kfv c, mtl_category_sets s
501        WHERE s.structure_id = c.structure_id
502          AND s.category_set_name = 'WSH_COMMODITY_CODE'
503          AND c.concatenated_segments like l_value||'%'
504 	 AND rownum = 1;
505 
506     EXCEPTION
507       WHEN NO_DATA_FOUND THEN
508 	RETURN -1;
509     END;
510     RETURN l_id;
511   END GET_CATG_ID;
512 
513   -----------------------------------------------------------------------------
514   -- PROCEDURE     GET_CATEGORY_ID
515   --
516   -- Purpose
517   --    Return the category ID of the freight class represented in
518   --    the string 'p_commodity_value'.  Caches the values of all commodities
519   --    the first time it is called, for greater efficiency.
520   --
521   -- IN Parameters
522   --    1. p_commodity_value: Three different (but equivalent) configurations of
523   --       the commodity will all evaluate to the same value. E.g. '500', 'FC.500'
524   --       and 'FC.500.US' are all acceptable inputs, and will return the same
525   --       category ID.
526   --
527   -- Out Parameters
528   --    1. x_catg_id: The category ID of the input.
529   --    2. x_class_code: The class_code of the input. (e.g. FC)
530   -----------------------------------------------------------------------------
531 
532   PROCEDURE GET_CATEGORY_ID (p_commodity_value   IN  VARCHAR2,
533                              x_catg_id           OUT NOCOPY NUMBER,
534                              x_class_code        OUT NOCOPY VARCHAR2,
535                              x_status            OUT NOCOPY NUMBER,
536                              x_error_msg         OUT NOCOPY VARCHAR2) IS
537 
538   i                      NUMBER;
539   token_tab              STRINGARRAY;
540   l_module_name CONSTANT VARCHAR2(100) := 'fte.plsql.' || G_PKG_NAME || '.GET_CATEGORY_ID';
541 
542   CURSOR get_freight_classes IS
543   SELECT c.category_id, c.concatenated_segments, c.segment1, c.segment2, c.segment3
544   FROM   mtl_categories_kfv c, mtl_category_sets s
545   WHERE  s.structure_id       = c.structure_id
546   AND    s.category_set_name  = 'WSH_COMMODITY_CODE';
547 
548   CURSOR get_delimiter IS
549   SELECT concatenated_segment_delimiter
550   FROM   fnd_id_flex_structures
551   WHERE  id_flex_code           = 'MCAT'
552   AND    id_flex_structure_code ='WSH_COMMODITY_CODE'
553   AND    application_id         = 401;
554 
555   BEGIN
556     x_catg_id := NULL;
557     x_status := -1;
558 
559     IF (concat_segments IS NULL OR concat_segments.COUNT = 0) THEN
560 
561       Enter_Debug(l_module_name);
562 
563       OPEN get_delimiter;
564       FETCH get_delimiter INTO l_delimiter;
565 
566       IF get_delimiter%NOTFOUND OR length(l_delimiter) = 0 THEN
567         x_catg_id := NULL;
568         CLOSE get_delimiter;
569 	x_error_msg := GET_MSG(p_name => 'FTE_DELIMITER_NOT_FOUND');
570 	WRITE_OUTFILE(p_module_name => l_module_name,
571 	              p_msg         => x_error_msg,
572 	              p_category    => 'B');
573 
574 	Exit_Debug(l_module_name);
575         return;
576       END IF;
577       CLOSE get_delimiter;
578 
579       OPEN GET_FREIGHT_CLASSES;
580       FETCH GET_FREIGHT_CLASSES BULK COLLECT INTO catg_ids, concat_segments, segment_code,
581                                                     segment_val, segment_cc;
582 
583       IF (FTE_BULKLOAD_PKG.g_debug_on) THEN
584         WRITE_LOGFILE(l_module_name, 'Fetched ' || catg_ids.COUNT || ' commodities');
585       END IF;
586 
587       close get_freight_classes;
588       Exit_Debug(l_module_name);
589     END IF;
590 
591     token_tab := TOKENIZE_STRING(p_commodity_value, l_delimiter);
592 
593     IF (token_tab.count = 1) THEN  --ASSUME USER PASSED IN ONLY THE VALUE.
594       FOR i in 1..concat_segments.COUNT LOOP
595         IF (segment_val(i) = p_commodity_value) THEN
596           x_catg_id := catg_ids(i);
597           x_class_code := segment_code(i);
598           return;
599         END IF;
600       END LOOP;
601     ELSIF (token_tab.count > 1) THEN
602       FOR i in 1..concat_segments.COUNT LOOP
603         IF (segment_code(i) = token_tab(1) AND segment_val(i) = token_tab(2)) THEN
604           x_catg_id := catg_ids(i);
605           x_class_code := segment_code(i);
606           return;
607         END IF;
608       END LOOP;
609     END IF;
610 
611     Enter_Debug(l_module_name);
612     x_status := 2;
613 
614     x_error_msg := GET_MSG(p_name => 'FTE_CAT_COMMODITY_UNKNOWN',
615 		  	   p_tokens	=> STRINGARRAY('COMMODITY'),
616 		  	   p_values	=> STRINGARRAY(p_commodity_value));
617 
618     WRITE_OUTFILE(p_module_name => l_module_name,
619                   p_msg   	=> x_error_msg,
620                   p_category    => 'D');
621 
622     Exit_Debug(l_module_name);
623 
624   EXCEPTION
625     WHEN OTHERS THEN
626       IF (get_freight_classes%ISOPEN) THEN
627 	CLOSE get_freight_classes;
628       END IF;
629       IF (get_delimiter%ISOPEN) THEN
630 	CLOSE get_delimiter;
631       END IF;
632       WRITE_OUTFILE(p_module_name => l_module_name,
633                     p_msg   	  => sqlerrm,
634              	    p_category    => 'O');
635       RETURN;
636   END GET_CATEGORY_ID;
637 
638   -----------------------------------------------------------------------------
639   -- PROCEDURE    GET_CATEGORY_ID
640   --
641   -- Purpose
642   --  Overloaded version of the function GET_CATEGORY_ID. See above.
643   -----------------------------------------------------------------------------
644 
645   PROCEDURE GET_CATEGORY_ID (p_commodity_value   IN  VARCHAR2,
646                              x_catg_id           OUT NOCOPY NUMBER,
647                              x_status            OUT NOCOPY NUMBER,
648                              x_error_msg         OUT NOCOPY VARCHAR2) IS
649 
650   x_class_code    VARCHAR2(40);
651   l_module_name   CONSTANT VARCHAR2(100) := 'fte.plsql.' || G_PKG_NAME || '.GET_CATEGORY_ID';
652   BEGIN
653     GET_CATEGORY_ID(p_commodity_value => p_commodity_value,
654                     x_catg_id         => x_catg_id,
655                     x_class_code      => x_class_code,
656                     x_status          => x_status,
657                     x_error_msg       => x_error_msg);
658 
659   EXCEPTION
660     WHEN OTHERS THEN
661       WRITE_OUTFILE(p_module_name => l_module_name,
662             	    p_msg   	  => sqlerrm,
663             	    p_category    => 'O');
664       RETURN;
665   END GET_CATEGORY_ID;
666 
667   -----------------------------------------------------------------------------
668   -- PROCEDURE  GET_Fnd_Currency
669   --
670   -- Purpose  Validate a currency against Fnd_Currencies.
671   --
672   -- Parameters
673   --   p_currency : The currency name to be validated.
674   --
675   -- RETURN       : The currency, if the currency is valid. NULL if the currency
676   --                is not valid.
677   -----------------------------------------------------------------------------
678   FUNCTION GET_Fnd_Currency (p_currency      IN       VARCHAR2,
679                                   x_error_msg OUT NOCOPY   VARCHAR2,
680                                   x_status    OUT NOCOPY   NUMBER) RETURN VARCHAR2 IS
681 
682     l_currency     VARCHAR2(45);
683 
684     l_module_name  CONSTANT VARCHAR2(100) := 'FTE.PLSQL.' || G_PKG_NAME || '.GET_FND_CURRENCY';
685 
686    BEGIN
687      FTE_UTIL_PKG.ENTER_DEBUG(l_module_name);
688      x_status := -1;
689 
690      BEGIN
691       --try the currency code.
692       SELECT currency_code INTO l_currency
693       FROM   fnd_currencies
694       WHERE  currency_code = p_currency
695 	AND  enabled_flag = 'Y'
696     	AND  currency_flag = 'Y'
697     	AND  nvl(start_date_active, sysdate) <= sysdate
698 	AND  nvl(end_date_active, sysdate) >= sysdate
699         AND  rownum = 1;
700 
701      EXCEPTION
702       WHEN NO_DATA_FOUND THEN
703         BEGIN
704           --try the currency name.
705           SELECT currency_code INTO l_currency
706           FROM   fnd_currencies_vl
707           WHERE  name = p_currency
708 	    AND  enabled_flag = 'Y'
709 	    AND  currency_flag = 'Y'
710 	    AND  nvl(start_date_active, sysdate) <= sysdate
711 	    AND  nvl(end_date_active, sysdate) >= sysdate
712             AND  rownum = 1;
713         EXCEPTION
714           WHEN NO_DATA_FOUND THEN
715            x_error_msg := Get_Msg(P_Name => 'FTE_INVALID_CARRIER_CURRENCY');
716 	   WRITE_OUTFILE(p_module_name => l_module_name,
717 	            	 p_msg	       => x_error_msg,
718   	            	 p_category    => 'D');
719 
720            x_status := 2;
721         END;
722      END;
723      FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
724      RETURN l_currency;
725 
726   EXCEPTION
727    WHEN OTHERS THEN
728      WRITE_OUTFILE(p_module_name => l_module_name,
729                    p_msg   	 => sqlerrm,
730                    p_category    => 'O');
731      FTE_UTIL_PKG.EXIT_DEBUG(l_module_name);
732      RETURN NULL;
733   END GET_Fnd_Currency;
734 
735   ------------------------------------------------------------
736   -- FUNCTION GET_CATEGORY_MESSAGE
737   --
738   -- Purpose: get the category message for error
739   --
740   -- IN parameters:
741   --	1. p_category:	the category letter
742   --
743   -- Return category message
744   ------------------------------------------------------------
745   FUNCTION Get_Category_message(p_category IN VARCHAR2)
746   RETURN VARCHAR2 IS
747   l_category_msg     VARCHAR2(1000);
748   l_module_name       CONSTANT VARCHAR2(100) := 'FTE.PLSQL.' || G_PKG_NAME || '.Get_Category_message';
749   BEGIN
750 
751     IF (UPPER(p_category) = 'A') THEN
752       l_category_msg := GET_MSG('FTE_LOADER_CATEGORY_A');
753     ELSIF (UPPER(p_category) = 'B') THEN
754       l_category_msg := GET_MSG('FTE_LOADER_CATEGORY_B');
755     ELSIF (UPPER(p_category) = 'C') THEN
756       l_category_msg := GET_MSG('FTE_LOADER_CATEGORY_C');
757     ELSIF (UPPER(p_category) = 'D') THEN
758       l_category_msg := GET_MSG('FTE_LOADER_CATEGORY_D');
759     ELSIF (UPPER(p_category) = 'E') THEN
760       l_category_msg := GET_MSG('FTE_LOADER_CATEGORY_E');
761     ELSIF (UPPER(p_category) = 'F') THEN
762       l_category_msg := GET_MSG('FTE_LOADER_CATEGORY_F');
763     ELSIF (UPPER(p_category) = 'O') THEN
764       l_category_msg := GET_MSG('FTE_LOADER_CATEGORY_O');
765     ELSE
766       Write_LogFile(l_module_name, 'Programmer Error: Invalid Message Category - ' || p_category);
767       RETURN NULL;
768     END IF;
769 
770     RETURN l_category_msg;
771 
772   END Get_Category_message;
773 
774   -------------------------------------------------------------------------------------
775   -- PROCEDURE  Init_Debug
776   --
777   -- Purpose:  This procedure turns the debug on depending on the value p_user_debug.
778   --           and starts the WSH debugger.
779   --
780   -- IN Parameters:
781   --	1. p_user_debug: user debug flag
782   -------------------------------------------------------------------------------------
783 
784   PROCEDURE Init_Debug(p_user_debug NUMBER) IS
785   BEGIN
786 
787     IF (p_user_debug = 1) THEN
788       FTE_BULKLOAD_PKG.g_debug_on := TRUE;
789       WSH_UTIL_CORE.Set_Log_Level(p_log_level => 1);
790       -- NEED TO SET QP debug.
791     END IF;
792 
793   END Init_Debug;
794 
795   -----------------------------------------------------------------------------
796   -- PROCEDURE  Enter_Debug
797   --
798   -- Purpose:  Enter the debug for current procedure/function in wsh debug file
799   --
800   -- IN Parameters:
801   --	1. p_module_name:	module name to enter
802   --
803   -----------------------------------------------------------------------------
804 
805   PROCEDURE Enter_Debug(p_module_name  IN  VARCHAR2) IS
806   BEGIN
807     WSH_DEBUG_SV.push(p_module_name);
808   END Enter_Debug;
809 
810   -----------------------------------------------------------------------------
811   -- PROCEDURE  Exit_Debug
812   --
813   -- Purpose:  Exit the debug for current procedure/function in wsh debug file
814   --
815   -- IN Parameters:
816   --	1. p_module_name:	module name to exit
817   --
818   -----------------------------------------------------------------------------
819 
820   PROCEDURE Exit_Debug(p_module_name  IN  VARCHAR2) IS
821 
822   BEGIN
823     WSH_DEBUG_SV.pop(p_module_name);
824   END Exit_Debug;
825 
826 
827   -------------------------------------------------------------------------------------
828   -- PROCEDURE  Write_OutFile
829   --
830   -- Purpose:  Writing a message in the concurrent output file(without tokens).
831   --
832   -- IN Parameters:
833   --  	1. p_msg	    the message (i.e. sqlerrm)
834   --	2. p_module_name    procedure name
835   --    3. p_category       category the p_msg_name belongs to.
836   --    4. p_line_number    the line number where the error occurs.
837   -------------------------------------------------------------------------------------
838 
839   PROCEDURE Write_OutFile(p_msg     	IN	VARCHAR2,
840 			  p_module_name IN	VARCHAR2,
841                           p_category    IN	VARCHAR2,
842                           p_line_number IN	NUMBER DEFAULT NULL)  IS
843 
844   BEGIN
845 
846     WRITE_LOGFILE(p_module_name => p_module_name,
847 		  p_message	=> p_msg);
848 
849     IF (p_category IS NOT NULL) THEN
850         Fnd_File.Put_Line(Fnd_File.Output, Get_Category_message(p_category));
851     END IF;
852 
853     IF (p_line_number IS NOT NULL) THEN
854       -- make 'Line No.' a message
855       Fnd_File.Put_Line(Fnd_File.Output, 'Line No. ' || p_line_number || ' : ' || p_msg);
856     ELSE
857       Fnd_File.Put_Line(Fnd_File.Output, p_msg);
858     END IF;
859 
860   END Write_OutFile;
861 
862   -------------------------------------------------------------------------------------
863   -- PROCEDURE  Write_OutFile
864   --
865   -- Purpose:  Writing a message with tokens in the concurrent output file.
866   --
867   -- IN Parameters:
868   --  	1. p_msg_name	    the message name. e.g, 'FTE_CAT_ACTION_INVALID'
869   --	2. p_tokens		    the tokens the message text of p_msg_name has.
870   --	3. p_values		    the values for the p_tokens.
871   --	4. p_module_name:	module where error occured
872   --    4. p_category       category the p_msg_name belongs to.
873   --    5. p_line_number    the line number where the error occurs.
874   -------------------------------------------------------------------------------------
875 
876   PROCEDURE Write_OutFile(p_msg_name     IN  VARCHAR2,
877                           p_tokens       IN  STRINGARRAY DEFAULT NULL,
878                           p_values       IN  STRINGARRAY DEFAULT NULL,
879 			  p_module_name	 IN  VARCHAR2,
880                           p_category     IN  VARCHAR2,
881                           p_line_number  IN  NUMBER DEFAULT NULL)  IS
882   l_message VARCHAR2(2000);
883 
884   BEGIN
885 
886     l_message  := GET_MSG(p_name	=> p_msg_name,
887 			  p_tokens	=> p_tokens,
888 			  p_values	=> p_values);
889 
890     WRITE_LOGFILE(p_module_name => p_module_name,
891 		  p_message	=> l_message);
892 
893     IF (p_category IS NOT NULL) THEN
894         Fnd_File.Put_Line(Fnd_File.Output, Get_Category_message(p_category));
895     END IF;
896     IF (p_line_number IS NOT NULL) THEN
897 -- make 'Line No.' a message
898       Fnd_File.Put_Line(Fnd_File.Output, 'Line No. ' || p_line_number || ' : ' || l_message);
899     ELSE
900       Fnd_File.Put_Line(Fnd_File.Output, l_message);
901     END IF;
902 
903   END Write_OutFile;
904 
905   -------------------------------------------------------------------------------------
906   -- PROCEDURE  Write_LogFile
907   --
908   -- Purpose:  Logging a message.
909   --
910   -- IN Parameters:
911   --  	1. p_module_name	the module messages were logged at
912   --	    2. p_message		the message to be logged.
913   -------------------------------------------------------------------------------------
914 
915   PROCEDURE Write_LogFile(p_module_name  IN VARCHAR2,
916                           p_message      IN VARCHAR2)  IS
917 
918   BEGIN
919     WSH_DEBUG_SV.LogMsg(p_module_name, p_message);
920   END Write_LogFile;
921 
922   -------------------------------------------------------------------------------------
923   -- PROCEDURE  Write_LogFile
924   --
925   -- Purpose:  Logging a message with an attribute and value (ie. carrier_id = 100)
926   --
927   -- IN Parameters:
928   --  	1. p_module_name	the module messages were logged at
929   --	2. p_attribute		the attribute displayed
930   --	3. p_value		    the value of the attribute
931   -------------------------------------------------------------------------------------
932   PROCEDURE Write_LogFile(p_module_name  IN   VARCHAR2,
933                           p_attribute    IN   VARCHAR2,
934                           p_value        IN   VARCHAR2) IS
935   BEGIN
936     WSH_DEBUG_SV.Log(x_Module   =>   p_module_name,
937                      x_Text     =>   p_attribute,
938                      x_Value    =>   p_value);
939 
940   END Write_LogFile;
941 
942 END FTE_UTIL_PKG;