DBA Data[Home] [Help]

PACKAGE BODY: APPS.ZX_TDS_UTILITIES_PKG

Source


1 package body ZX_TDS_UTILITIES_PKG as
2 /* $Header: zxdiutilitiespub.pls 120.50.12020000.3 2013/03/20 06:40:52 srajapar ship $ */
3 
4 g_current_runtime_level   NUMBER;
5 g_level_statement         CONSTANT NUMBER   := FND_LOG.LEVEL_STATEMENT;
6 g_level_unexpected        CONSTANT NUMBER   := FND_LOG.LEVEL_UNEXPECTED;
7 
8 ----------------------------------------------------------------------
9 --  PUBLIC FUNCTION
10 --  get_tax_status_index
11 --
12 --  DESCRIPTION
13 --
14 --  This function returns the hash table index from global tax
15 --  status cache structure
16 --
17 
18 FUNCTION get_tax_status_index(
19             p_tax               IN   ZX_TAXES_B.TAX%TYPE,
20             p_tax_regime_code   IN   ZX_REGIMES_B.TAX_REGIME_CODE%TYPE,
21             p_tax_status_code   IN   ZX_STATUS_B.TAX_STATUS_CODE%TYPE)
22 RETURN BINARY_INTEGER IS
23 
24   l_tbl_index      BINARY_INTEGER;
25 BEGIN
26 
27   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
28 
29   IF (g_level_statement >= g_current_runtime_level ) THEN
30     FND_LOG.STRING(g_level_statement,
31                    'ZX.PLSQL.ZX_TDS_UTILITIES_PKG.get_tax_status_index.BEGIN',
32                    'ZX_TDS_UTILITIES_PKG: get_tax_status_index(+)');
33   END IF;
34 
35   l_tbl_index := dbms_utility.get_hash_value(
36                 p_tax_regime_code||p_tax||p_tax_status_code,
37                 1,
38                 8192);
39 
40   IF (g_level_statement >= g_current_runtime_level ) THEN
41 
42     FND_LOG.STRING(g_level_statement,
43                    'ZX.PLSQL.ZX_TDS_UTILITIES_PKG.get_tax_status_index.END',
44                    'ZX_TDS_UTILITIES_PKG: get_tax_status_index(-)'||
45                     'tbl index = ' || to_char(l_tbl_index));
46 
47   END IF;
48 
49   return l_tbl_index;
50 
51 EXCEPTION
52   WHEN OTHERS THEN
53     IF (g_level_unexpected >= g_current_runtime_level ) THEN
54       FND_LOG.STRING(g_level_unexpected,
55                      'ZX.PLSQL.ZX_TDS_UTILITIES_PKG.get_tax_status_index',
56                       sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80));
57     END IF;
58     RAISE;
59 END get_tax_status_index;
60 
61 -----------------------------------------------------------------------
62 --  PUBLIC PROCEDURE
63 --  get_tax_status_cache_info
64 --
65 --  DESCRIPTION
66 --  This procedure gets tax status information from global cache structure
67 --  based on the hash index of Tax, Tax regime code and Tax status code if
68 --  exists, if not, obtain the Tax status information from the database
69 --
70 PROCEDURE  get_tax_status_cache_info(
71              p_tax                 IN     ZX_TAXES_B.TAX%TYPE,
72              p_tax_regime_code     IN     ZX_REGIMES_B.TAX_REGIME_CODE%TYPE,
73              p_tax_status_code     IN     ZX_STATUS_B.TAX_STATUS_CODE%TYPE,
74              p_tax_determine_date  IN     ZX_LINES.TAX_DETERMINE_DATE%TYPE,
75              p_status_rec             OUT NOCOPY ZX_STATUS_INFO_REC,
76              p_return_status          OUT NOCOPY VARCHAR2,
77              p_error_buffer           OUT NOCOPY VARCHAR2)
78 
79 IS
80   l_index              BINARY_INTEGER;
81 
82   CURSOR get_status_info_csr
83     (c_tax_status_code      ZX_STATUS_B.TAX_STATUS_CODE%TYPE,
84      c_tax                  ZX_REGIMES_B.TAX_REGIME_CODE%TYPE,
85      c_tax_regime_code      ZX_REGIMES_B.TAX_REGIME_CODE%TYPE,
86      c_tax_determine_date   ZX_LINES.TAX_DETERMINE_DATE%TYPE)
87   IS
88     SELECT tax_status_id,
89            tax_status_code,
90            tax,
91            tax_regime_code,
92            effective_from,
93            effective_to,
94            Rule_Based_Rate_Flag,
95            Allow_Rate_Override_Flag,
96 --           Allow_Adhoc_Tax_Rate_Flag, -- commented out for bug 3420310
97            Allow_Exemptions_Flag,
98            Allow_Exceptions_Flag
99       FROM  ZX_SCO_STATUS_B_V
100       WHERE TAX_STATUS_CODE = c_tax_status_code      AND
101             TAX             = c_tax                  AND
102             TAX_REGIME_CODE = c_tax_regime_code      AND
103             c_tax_determine_date >= EFFECTIVE_FROM   AND
104             (c_tax_determine_date <= EFFECTIVE_TO OR
105              EFFECTIVE_TO IS NULL)
106         -- AND rownum = 1;
107         ORDER BY subscription_level_code;
108 
109 BEGIN
110 
111   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
112 
113   IF (g_level_statement >= g_current_runtime_level ) THEN
114     FND_LOG.STRING(g_level_statement,
115                    'ZX.PLSQL.ZX_TDS_UTILITIES_PKG.get_tax_status_cache_info.BEGIN',
116                    'ZX_TDS_UTILITIES_PKG: get_tax_status_cache_info(+)'||
117                    ' regime code: ' || p_tax_regime_code||
118                    ' status code: ' || p_tax_status_code||
119                    ' tax: ' || p_tax);
120   END IF;
121 
122   p_return_status := FND_API.G_RET_STS_SUCCESS;
123 
124   l_index := get_tax_status_index(p_tax,
125                                   p_tax_regime_code,
126                                   p_tax_status_code);
127   --
128   -- first check if the status info is available from the cache
129   --
130   IF g_tax_status_info_tbl.EXISTS(l_index) AND
131      p_tax_determine_date >= g_tax_status_info_tbl(l_index).effective_from AND
132      p_tax_determine_date <= NVL(g_tax_status_info_tbl(l_index).effective_to,
133                                                           p_tax_determine_date)
134   THEN
135 
136     p_status_rec := g_tax_status_info_tbl(l_index);
137 
138   ELSE
139     --
140     -- status info does not exist in cache, get it from zx_status
141     --
142     OPEN get_status_info_csr(p_tax_status_code,
143                              p_tax,
144                              p_tax_regime_code,
145                              p_tax_determine_date);
146     FETCH get_status_info_csr  INTO
147        p_status_rec.tax_status_id,
148        p_status_rec.tax_status_code,
149        p_status_rec.tax,
150        p_status_rec.tax_regime_code,
151        p_status_rec.effective_from,
152        p_status_rec.effective_to,
153        p_status_rec.Rule_Based_Rate_Flag,
154        p_status_rec.Allow_Rate_Override_Flag,
155 --       p_status_rec.Allow_Adhoc_Tax_Rate_Flag,  -- commented out for bug 3420310
156        p_status_rec.Allow_Exemptions_Flag,
157        p_status_rec.Allow_Exceptions_Flag;
158 
159     IF get_status_info_csr%NOTFOUND THEN
160       p_return_status := FND_API.G_RET_STS_ERROR;
161       p_error_buffer  := 'No data found for the specified tax status code';
162 
163       FND_MESSAGE.SET_NAME('ZX','ZX_TAX_STATUS_INFO_NOT_FOUND');
164       FND_MESSAGE.SET_TOKEN('TAX_REGIME',p_tax_regime_code);
165       FND_MESSAGE.SET_TOKEN('TAX', p_tax );   -- 8568734
166       FND_MESSAGE.SET_TOKEN('TAX_STATUS', p_tax_status_code);
167 
168       -- FND_MSG_PUB.Add;
169       ZX_API_PUB.add_msg(ZX_TDS_CALC_SERVICES_PUB_PKG.g_msg_context_info_rec);
170 
171     END IF;
172 
173     CLOSE get_status_info_csr;
174 
175     -- update the global status cache structure
176     --
177     IF p_return_status =  FND_API.G_RET_STS_SUCCESS THEN
178       g_tax_status_info_tbl(l_index) := p_status_rec;
179     END IF;
180   END IF;
181 
182   IF (g_level_statement >= g_current_runtime_level ) THEN
183     FND_LOG.STRING(g_level_statement,
184                    'ZX.PLSQL.ZX_TDS_UTILITIES_PKG.get_tax_status_cache_info',
185                    'Return_status = ' || p_return_status||
186                    ' tax_status_id = ' ||
187                     to_char(p_status_rec.tax_status_id)||
188                    ' Rule_Based_Rate_Flag = ' ||
189                     p_status_rec.Rule_Based_Rate_Flag||
190                    ' Allow_Rate_Override_Flag = ' ||
191                     p_status_rec.Allow_Rate_Override_Flag||
192                    ' Allow_Exemptions_Flag = ' ||
193                     p_status_rec.Allow_Exemptions_Flag||
194                    ' Allow_Exceptions_Flag = ' ||
195                     p_status_rec.Allow_Exceptions_Flag);
196 
197     FND_LOG.STRING(g_level_statement,
198                    'ZX.PLSQL.ZX_TDS_UTILITIES_PKG.get_tax_status_cache_info.END',
199                    'ZX_TDS_UTILITIES_PKG: get_tax_status_cache_info(-)');
200   END IF;
201 
202 EXCEPTION
203   WHEN OTHERS THEN
204     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
205     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
206     IF get_status_info_csr%ISOPEN THEN
207       CLOSE get_status_info_csr;
208     END IF;
209     IF (g_level_unexpected >= g_current_runtime_level ) THEN
210       FND_LOG.STRING(g_level_unexpected,
211                      'ZX.PLSQL.ZX_TDS_UTILITIES_PKG.get_tax_status_cache_info',
212                       p_error_buffer);
213     END IF;
214 
215 END get_tax_status_cache_info;
216 
217 --------------------------------------------------------------------------
218 --  PUBLIC PROCEDURE
219 --  get_tax_regime_cache_info
220 --
221 --  DESCRIPTION
222 --  This procedure gets tax regime information from global cache
223 --  structure based on tax regime code, if regime exists in it.
224 --  If regime does not exist, get tax regime information from the database
225 --------------------------------------------------------------------------
226 PROCEDURE get_regime_cache_info (
227   p_tax_regime_code     IN          zx_regimes_b.tax_regime_code%TYPE,
228   p_tax_determine_date  IN          DATE,
229   p_tax_regime_rec      OUT NOCOPY  zx_global_structures_pkg.tax_regime_rec_type,
230   p_return_status       OUT NOCOPY  VARCHAR2,
231   p_error_buffer        OUT NOCOPY  VARCHAR2) IS
232 
233   CURSOR  get_regime_info_csr IS
234    SELECT regime_precedence,
235           tax_regime_id,
236           tax_regime_code,
237           parent_regime_code,
238           country_code,
239           geography_type,
240           geography_id,
241           effective_from,
242           effective_to,
243           country_or_group_code
244      FROM ZX_REGIMES_B_V
245     WHERE tax_regime_code = p_tax_regime_code
246       AND (( effective_from <= p_tax_determine_date) AND
247            ( effective_to   >= p_tax_determine_date OR effective_to IS NULL));
248 
249  l_in_cache_flg         BOOLEAN         := FALSE;
250  l_index                NUMBER;
251 
252 BEGIN
253 
254   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
255 
256   IF (g_level_statement >= g_current_runtime_level ) THEN
257     FND_LOG.STRING(g_level_statement,
258                    'ZX.PLSQL.ZX_TDS_UTILITIES_PKG.get_regime_cache_info.BEGIN',
259                    'ZX_TDS_UTILITIES_PKG.get_regime_cache_info(+)'||
260                    ' regime code: ' || p_tax_regime_code);
261   END IF;
262 
263   p_return_status := FND_API.G_RET_STS_SUCCESS;
264 
265   -- check if this tax regime exists in the cache structure
266   --
267   l_index := ZX_GLOBAL_STRUCTURES_PKG.tax_regime_tbl.FIRST;
268   WHILE l_index IS NOT NULL LOOP
269 
270     IF(p_tax_regime_code =
271         ZX_GLOBAL_STRUCTURES_PKG.tax_regime_tbl(l_index).tax_regime_code AND
272        (p_tax_determine_date >=
273          ZX_GLOBAL_STRUCTURES_PKG.tax_regime_tbl(l_index).effective_from AND
274         (p_tax_determine_date <=
275           ZX_GLOBAL_STRUCTURES_PKG.tax_regime_tbl(l_index).effective_to  OR
276          ZX_GLOBAL_STRUCTURES_PKG.tax_regime_tbl(l_index).effective_to IS NULL)))
277     THEN
278 
279       p_tax_regime_rec := ZX_GLOBAL_STRUCTURES_PKG.tax_regime_tbl(l_index);
280 
281       l_in_cache_flg := TRUE;
282 
283       EXIT;
284     END IF;
285     l_index := ZX_GLOBAL_STRUCTURES_PKG.tax_regime_tbl.NEXT(l_index);
286   END LOOP;
287 
288   IF NOT l_in_cache_flg  THEN
289 
290     OPEN  get_regime_info_csr;
291     FETCH get_regime_info_csr INTO
292       p_tax_regime_rec.tax_regime_precedence,
293       p_tax_regime_rec.tax_regime_id,
294       p_tax_regime_rec.tax_regime_code,
295       p_tax_regime_rec.parent_regime_code,
296       p_tax_regime_rec.country_code,
297       p_tax_regime_rec.geography_type,
298       p_tax_regime_rec.geography_id,
299       p_tax_regime_rec.effective_from,
300       p_tax_regime_rec.effective_to,
301       p_tax_regime_rec.country_or_group_code;
302 
303     IF get_regime_info_csr%NOTFOUND THEN
304 
305       p_return_status := FND_API.G_RET_STS_ERROR;
306       p_error_buffer  := 'No data found for the specified tax regime code';
307 
308       FND_MESSAGE.SET_NAME('ZX','ZX_TAX_REGIME_INFO_NOT_FOUND');
309       FND_MESSAGE.SET_TOKEN('TAX_REGIME',p_tax_regime_code);
310 
311       -- FND_MSG_PUB.Add;
312       ZX_API_PUB.add_msg(ZX_TDS_CALC_SERVICES_PUB_PKG.g_msg_context_info_rec);
313 
314     ELSE
315        -- populate the global cache structure for regime
316        --
317        ZX_GLOBAL_STRUCTURES_PKG.tax_regime_tbl(
318                        p_tax_regime_rec.tax_regime_id) := p_tax_regime_rec;
319 
320     END IF;
321 
322     CLOSE get_regime_info_csr;
323 
324   END IF;
325 
326   IF (g_level_statement >= g_current_runtime_level ) THEN
327 
328     FND_LOG.STRING(g_level_statement,
329                    'ZX.PLSQL.ZX_TDS_UTILITIES_PKG.get_regime_cache_info.END',
330                    'ZX_TDS_UTILITIES_PKG.get_regime_cache_info(-)'||
331                    ' tax_regime_id = ' ||
332                     to_char(p_tax_regime_rec.tax_regime_id)||
333                     ' RETURN_STATUS = ' || p_return_status);
334   END IF;
335 
336 EXCEPTION
337   WHEN OTHERS THEN
338     IF get_regime_info_csr%ISOPEN THEN
339       CLOSE get_regime_info_csr;
340     END IF;
341     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
342     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
343     IF (g_level_unexpected >= g_current_runtime_level ) THEN
344       FND_LOG.STRING(g_level_unexpected,
345                      'ZX.PLSQL.ZX_TDS_UTILITIES_PKG.get_regime_cache_info',
346                       p_error_buffer);
347       FND_LOG.STRING(g_level_unexpected,
348                      'ZX.PLSQL.ZX_TDS_UTILITIES_PKG.get_regime_cache_info.END',
349                      'ZX_TDS_UTILITIES_PKG.get_regime_cache_info(-)');
350     END IF;
351 
352 END get_regime_cache_info;
353 
354 -------------------------------------------------------------------------
355 --  PUBLIC PROCEDURE
356 --  get_tax_cache_info
357 --
358 --  DESCRIPTION
359 --  This procedure gets tax information from global cache structure
360 --  based on tax regime code and tax, if tax exists in it.
361 --  If tax does not exist, get the tax information from database
362 -------------------------------------------------------------------------
363 PROCEDURE get_tax_cache_info (
364   p_tax_regime_code     IN          zx_regimes_b.tax_regime_code%TYPE,
365   p_tax                 IN          zx_taxes_b.tax%TYPE,
366   p_tax_determine_date  IN          DATE,
367   x_tax_rec             OUT NOCOPY  zx_tax_info_cache_rec,
368   p_return_status       OUT NOCOPY  VARCHAR2,
369   p_error_buffer        OUT NOCOPY  VARCHAR2) IS
370 
371   CURSOR  get_tax_info_csr IS
372    SELECT tax_id,
373           tax,
374           tax_regime_code,
375           tax_type_code,
376           tax_precision,
377           minimum_accountable_unit,
378           Rounding_Rule_Code,
379           Tax_Status_Rule_Flag,
380           Tax_Rate_Rule_Flag,
381           Place_Of_Supply_Rule_Flag,
382           Applicability_Rule_Flag,
383           Tax_Calc_Rule_Flag,
384           Taxable_Basis_Rule_Flag,
385           def_tax_calc_formula,
386           def_taxable_basis_formula,
387           Reporting_Only_Flag,
388           tax_currency_code,
389           Def_Place_Of_Supply_Type_Code,
390           Def_Registr_Party_Type_Code,
391           Registration_Type_Rule_Flag,
392           Direct_Rate_Rule_Flag,
393           Def_Inclusive_Tax_Flag,
394           effective_from,
395           effective_to,
396           compounding_precedence,
397           Has_Other_Jurisdictions_Flag,
398           Live_For_Processing_Flag,
399           Regn_Num_Same_As_Le_Flag,
400           applied_amt_handling_flag,
401           exchange_rate_type,
402           applicable_by_default_flag,
403           record_type_code,
404           tax_exmpt_cr_method_code,
405           tax_exmpt_source_tax,
406           legal_reporting_status_def_val,
407           def_rec_settlement_option_code,
408           zone_geography_type,
409           override_geography_type,
410           allow_rounding_override_flag,
411           tax_account_source_tax
412      FROM ZX_SCO_TAXES_B_V
413     WHERE tax = p_tax
414       AND tax_regime_code = p_tax_regime_code
415       AND (effective_from <= p_tax_determine_date AND
416             (effective_to >= p_tax_determine_date OR effective_to IS NULL))
417       AND live_for_processing_flag = 'Y'
418       AND (live_for_applicability_flag = 'Y' OR
419            (LIVE_FOR_APPLICABILITY_FLAG = 'N' AND
420             tax ='LOCATION' AND record_type_code = 'MIGRATED'
421            )
422           )
423       -- AND rownum = 1;
424     ORDER BY subscription_level_code;
425 
426 
427  l_in_cache_flg         BOOLEAN         := FALSE;
428  l_index                NUMBER;
429 
430 BEGIN
431 
432   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
433 
434   IF (g_level_statement >= g_current_runtime_level ) THEN
435     FND_LOG.STRING(g_level_statement,
436                    'ZX.PLSQL.ZX_TDS_UTILITIES_PKG.get_tax_cache_info.BEGIN',
437                    'ZX_TDS_UTILITIES_PKG.get_tax_cache_info(+)'||
438                    ' regime_code: ' || p_tax_regime_code||
439                    ' tax: ' || p_tax);
440   END IF;
441 
442   p_return_status := FND_API.G_RET_STS_SUCCESS;
443 
444   --
445   -- first check if tax exists in tax cache structure
446   --
447   l_index := g_tax_rec_tbl.LAST;
448   WHILE l_index IS NOT NULL LOOP
449 
450     IF (p_tax = g_tax_rec_tbl(l_index).tax AND
451         p_tax_regime_code = g_tax_rec_tbl(l_index).tax_regime_code)
452     THEN
453 
454       x_tax_rec := g_tax_rec_tbl(l_index);
455       l_in_cache_flg := TRUE;
456       EXIT;
457     END IF;
458     l_index := g_tax_rec_tbl.PRIOR(l_index);
459   END LOOP;
460 
461   -- if tax does not exist in cache, get tax info from zx_taxes_b
462   --
463   IF NOT l_in_cache_flg  THEN
464     --
465     -- fetching tax_info from zx_taxes_b
466     --
467     OPEN  get_tax_info_csr;
468     FETCH get_tax_info_csr INTO x_tax_rec;
469 
470     IF get_tax_info_csr%NOTFOUND THEN
471       p_return_status := FND_API.G_RET_STS_ERROR;
472       p_error_buffer  := 'No data found for the specified tax_regime_code and tax';
473 
474       FND_MESSAGE.SET_NAME('ZX','ZX_TAX_INFO_NOT_FOUND');
475       FND_MESSAGE.SET_TOKEN('TAX_REGIME',p_tax_regime_code);
476       FND_MESSAGE.SET_TOKEN('TAX',p_tax);
477 
478       -- FND_MSG_PUB.Add;
479       ZX_API_PUB.add_msg(ZX_TDS_CALC_SERVICES_PUB_PKG.g_msg_context_info_rec);
480 
481     ELSE
482 
483       -- populate tax cache
484       --
485       g_tax_rec_tbl(x_tax_rec.tax_id) :=  x_tax_rec;
486     END IF;
487 
488     CLOSE get_tax_info_csr;
489 
490   END IF;   -- tax not in cache
491 
492   IF (g_level_statement >= g_current_runtime_level ) THEN
493 
494     FND_LOG.STRING(g_level_statement,
495                    'ZX.PLSQL.ZX_TDS_UTILITIES_PKG.get_tax_cache_info.END',
496                    'ZX_TDS_UTILITIES_PKG.get_tax_cache_info(-)'||
497                    'return_status = ' || p_return_status);
498   END IF;
499 
500 EXCEPTION
501   WHEN OTHERS THEN
502     IF get_tax_info_csr%ISOPEN THEN
503         CLOSE get_tax_info_csr;
504      END IF;
505     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
506     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
507     IF (g_level_unexpected >= g_current_runtime_level ) THEN
508       FND_LOG.STRING(g_level_unexpected,
509                      'ZX.PLSQL.ZX_TDS_UTILITIES_PKG.get_tax_cache_info',
510                       p_error_buffer);
511       FND_LOG.STRING(g_level_unexpected,
512                      'ZX.PLSQL.ZX_TDS_UTILITIES_PKG.get_tax_cache_info.END',
513                      'ZX_TDS_UTILITIES_PKG.get_tax_cache_info(-)');
514     END IF;
515 
516 END get_tax_cache_info;
517 
518 -------------------------------------------------------------------------
519 --  PUBLIC PROCEDURE
520 --  get_jurisdiction_cache_info
521 --
522 --  DESCRIPTION
523 --  This procedure gets jurisdiction information from global cache structure
524 --  based on tax regime code ,tax and tax jurisdiction code, if tax exists in it.
525 --
526 -------------------------------------------------------------------------
527 PROCEDURE get_jurisdiction_cache_info (
528   p_tax_regime_code     IN          zx_regimes_b.tax_regime_code%TYPE,
529   p_tax                 IN          zx_taxes_b.tax%TYPE,
530   p_tax_jurisdiction_code IN        zx_jurisdictions_b.tax_jurisdiction_code%TYPE,
531   p_tax_determine_date  IN          DATE,
532   x_jurisdiction_rec    OUT NOCOPY  zx_jur_info_cache_rec_type,
533   p_return_status       OUT NOCOPY  VARCHAR2,
534   p_error_buffer        OUT NOCOPY  VARCHAR2) IS
535 
536   CURSOR  get_jur_info_csr IS
537    SELECT tax_jurisdiction_code,
538           tax_jurisdiction_id,
539           effective_from,
540           effective_to,
541           tax_regime_code,
542           tax
543      FROM ZX_JURISDICTIONS_B
544     WHERE tax_regime_code = p_tax_regime_code
545       AND tax = p_tax
546       AND tax_jurisdiction_code = p_tax_jurisdiction_code
547       AND (effective_from <= p_tax_determine_date AND
548              (effective_to  >= p_tax_determine_date OR effective_to IS NULL));
549 
550  l_in_cache_flg         BOOLEAN         := FALSE;
551  l_index                NUMBER;
552 
553 BEGIN
554 
555   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
556 
557   IF (g_level_statement >= g_current_runtime_level ) THEN
558     FND_LOG.STRING(g_level_statement,
559                    'ZX.PLSQL.ZX_TDS_UTILITIES_PKG.get_jurisdiction_cache_info.BEGIN',
560                    'ZX_TDS_UTILITIES_PKG.get_jurisdiction_cache_info(+)'||
561                    ' regime_code = ' || p_tax_regime_code||
562                    ' tax = ' || p_tax||
563                    ' jurisdiciton_code = ' || p_tax_jurisdiction_code);
564 
565   END IF;
566 
567   p_return_status := FND_API.G_RET_STS_SUCCESS;
568 
569   --
570   -- first check if tax exists in tax cache structure
571   --
572   l_index := g_jur_info_tbl.FIRST;
573   WHILE l_index IS NOT NULL LOOP
574 
575     IF (p_tax = g_jur_info_tbl(l_index).tax AND
576         p_tax_regime_code = g_jur_info_tbl(l_index).tax_regime_code AND
577         p_tax_jurisdiction_code = g_jur_info_tbl(l_index).tax_jurisdiction_code)
578     THEN
579 
580       x_jurisdiction_rec := g_jur_info_tbl(l_index);
581       l_in_cache_flg := TRUE;
582       EXIT;
583     END IF;
584     l_index := g_jur_info_tbl.NEXT(l_index);
585   END LOOP;
586 
587   -- if tax does not exist in cache, get tax info from zx_taxes_b
588   --
589   IF NOT l_in_cache_flg  THEN
590     --
591     -- fetching tax_info from zx_taxes_b
592     --
593     OPEN  get_jur_info_csr;
594     FETCH get_jur_info_csr INTO
595           x_jurisdiction_rec.tax_jurisdiction_code,
596           x_jurisdiction_rec.tax_jurisdiction_id,
597           x_jurisdiction_rec.effective_from,
598           x_jurisdiction_rec.effective_to,
599           x_jurisdiction_rec.tax_regime_code,
600           x_jurisdiction_rec.tax;
601 
602     IF get_jur_info_csr%NOTFOUND THEN
603        p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
604        p_error_buffer  := 'No data found for the specified tax_regime_code and tax';
605     ELSE
606 
607       -- populate tax cache
608       --
609       g_jur_info_tbl(x_jurisdiction_rec.tax_jurisdiction_id) :=  x_jurisdiction_rec;
610     END IF;
611 
612     CLOSE get_jur_info_csr;
613 
614   END IF;   -- jurisdiciton not in cache
615 
616   IF (g_level_statement >= g_current_runtime_level ) THEN
617 
618     FND_LOG.STRING(g_level_statement,
619                    'ZX.PLSQL.ZX_TDS_UTILITIES_PKG.get_jurisdiciton_cache_info.END',
620                    'ZX_TDS_UTILITIES_PKG.get_jurisdiciton_cache_info(-)'||
621                    ' jurisdiction id = '||to_char(x_jurisdiction_rec.tax_jurisdiction_id) ||
622                    ' return_status = ' || p_return_status);
623   END IF;
624 
625 EXCEPTION
626   WHEN OTHERS THEN
627     IF get_jur_info_csr%ISOPEN THEN
628         CLOSE get_jur_info_csr;
629      END IF;
630     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
631     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
632     IF (g_level_unexpected >= g_current_runtime_level ) THEN
633       FND_LOG.STRING(g_level_unexpected,
634                      'ZX.PLSQL.ZX_TDS_UTILITIES_PKG.get_jurisdiction_cache_info',
635                       p_error_buffer);
636       FND_LOG.STRING(g_level_unexpected,
637                      'ZX.PLSQL.ZX_TDS_UTILITIES_PKG.get_jurisdiction_cache_info.END',
638                      'ZX_TDS_UTILITIES_PKG.get_jurisdiction_cache_info(-)');
639     END IF;
640 
641 END get_jurisdiction_cache_info;
642 
643 -----------------------------------------------------------------------
644 --  PUBLIC PROCEDURE
645 --  populate_tax_cache
646 --
647 --  DESCRIPTION
648 --  This procedure populate the tax global cache structure
649 --  g_tax_rec_tbl based on tax_id, if it does not exist.
650 -----------------------------------------------------------------------
651 PROCEDURE populate_tax_cache (
652   p_tax_id             IN           NUMBER,
653   p_return_status      OUT NOCOPY   VARCHAR2,
654   p_error_buffer       OUT NOCOPY   VARCHAR2) IS
655 
656   CURSOR  get_tax_info_csr IS
657    SELECT tax_id,
658           tax,
659           tax_regime_code,
660           tax_type_code,
661           tax_precision,
662           minimum_accountable_unit,
663           Rounding_Rule_Code,
664           Tax_Status_Rule_Flag,
665           Tax_Rate_Rule_Flag,
666           Place_Of_Supply_Rule_Flag,
667           Applicability_Rule_Flag,
668           Tax_Calc_Rule_Flag,
669           Taxable_Basis_Rule_Flag,
670           def_tax_calc_formula,
671           def_taxable_basis_formula,
672           Reporting_Only_Flag,
673           tax_currency_code,
674           Def_Place_Of_Supply_Type_Code,
675           Def_Registr_Party_Type_Code,
676           Registration_Type_Rule_Flag,
677           Direct_Rate_Rule_Flag,
678           Def_Inclusive_Tax_Flag,
679           effective_from,
680           effective_to,
681           compounding_precedence,
682           Has_Other_Jurisdictions_Flag,
683           Live_For_Processing_Flag,
684           Regn_Num_Same_As_Le_Flag,
685           applied_amt_handling_flag,
686           exchange_rate_type,
687           applicable_by_default_flag,
688           record_type_code,
689           tax_exmpt_cr_method_code,
690           tax_exmpt_source_tax,
691           legal_reporting_status_def_val,
692           def_rec_settlement_option_code,
693           zone_geography_type,
694           override_geography_type,
695           allow_rounding_override_flag,
696           tax_account_source_tax
697      FROM ZX_TAXES_B
698     WHERE tax_id = p_tax_id;
699 
700 BEGIN
701 
702   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
703 
704   IF (g_level_statement >= g_current_runtime_level ) THEN
705     FND_LOG.STRING(g_level_statement,
706                    'ZX.PLSQL.ZX_TDS_UTILITIES_PKG.populate_tax_cache.BEGIN',
707                    'ZX_TDS_UTILITIES_PKG.populate_tax_cache(+)'||
708                    'tax_id := ' || to_char(p_tax_id));
709   END IF;
710 
711   p_return_status := FND_API.G_RET_STS_SUCCESS;
712 
713   IF p_tax_id IS NULL THEN
714     IF (g_level_statement >= g_current_runtime_level ) THEN
715       FND_LOG.STRING(g_level_statement,
716                      'ZX.PLSQL.ZX_TDS_UTILITIES_PKG.populate_tax_cache',
717                      'tax_id cannot be null');
718     END IF;
719     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;     -- bug 4893261
720     p_error_buffer := 'tax_id cannot be null';
721     RETURN;
722   END IF;
723 
724   -- if tax does not exist in the cache structure, get tax info from database
725   --
726   IF NOT g_tax_rec_tbl.EXISTS(p_tax_id)  THEN
727 
728     OPEN get_tax_info_csr;
729     FETCH get_tax_info_csr INTO g_tax_rec_tbl(p_tax_id);
730 
731     IF get_tax_info_csr%NOTFOUND THEN
732        p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;     -- bug 4893261
733        p_error_buffer  := 'No data found for the specified tax_id';
734     END IF;
735 
736     CLOSE get_tax_info_csr;
737   END IF;       -- tax_id not exist in g_tax_rec_tbl
738 
739   IF (g_level_statement >= g_current_runtime_level ) THEN
740 
741     FND_LOG.STRING(g_level_statement,
742                    'ZX.PLSQL.ZX_TDS_UTILITIES_PKG.populate_tax_cache.END',
743                    'ZX_TDS_UTILITIES_PKG.populate_tax_cache(-)'||
744                    ' RETURN_STATUS = ' || p_return_status||
745                    ' error buffer: '||p_error_buffer);
746   END IF;
747 
748  EXCEPTION
749    WHEN OTHERS THEN
750      IF get_tax_info_csr%ISOPEN THEN
751         CLOSE get_tax_info_csr;
752      END IF;
753      p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
754      p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
755      IF (g_level_unexpected >= g_current_runtime_level ) THEN
756        FND_LOG.STRING(g_level_unexpected,
757                       'ZX.PLSQL.ZX_TDS_UTILITIES_PKG.populate_tax_cache',
758                        p_error_buffer);
759        FND_LOG.STRING(g_level_unexpected,
760                       'ZX.PLSQL.ZX_TDS_UTILITIES_PKG.populate_tax_cache.END',
761                       'ZX_TDS_UTILITIES_PKG.populate_tax_cache(-)');
762      END IF;
763 
764 END populate_tax_cache;
765 
766 -----------------------------------------------------------------------
767 --  PUBLIC PROCEDURE
768 --  populate_currency_cache
769 --
770 --  DESCRIPTION
771 --  This procedure populates the currency cache structure
772 --  g_currency_rec_tbl based on ledger_id. If this ledger_id already
773 --  exists in the cache structure, the population process will be skipped.
774 -----------------------------------------------------------------------
775 PROCEDURE populate_currency_cache (
776  p_ledger_id              IN          gl_sets_of_books.set_of_books_id%TYPE,
777  p_return_status          OUT NOCOPY  VARCHAR2,
778  p_error_buffer           OUT NOCOPY  VARCHAR2) IS
779 
780  CURSOR  get_currency_info_csr IS
781   SELECT sob.set_of_books_id,
782          cur.currency_code,
783          NVL(cur.minimum_accountable_unit, power(10, (-1 * precision))),
784          precision
785     FROM fnd_currencies cur, gl_sets_of_books sob
786    WHERE sob.set_of_books_id = p_ledger_id
787      AND cur.currency_code = sob.currency_code;
788 
789 
790 BEGIN
791   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
792 
793   IF (g_level_statement >= g_current_runtime_level ) THEN
794     FND_LOG.STRING(g_level_statement,
795                    'ZX.PLSQL.ZX_TDS_UTILITIES_PKG.populate_currency_cache.BEGIN',
796                    'ZX_TDS_UTILITIES_PKG.populate_currency_cache(+)'||
797                    'ledger_id := ' || to_char(p_ledger_id));
798   END IF;
799 
800   p_return_status := FND_API.G_RET_STS_SUCCESS;
801 
802   IF p_ledger_id IS NULL THEN
803     IF (g_level_statement >= g_current_runtime_level ) THEN
804       FND_LOG.STRING(g_level_statement,
805                      'ZX.PLSQL.ZX_TDS_UTILITIES_PKG.populate_currency_cache',
806                      'ledger_id cannot be null');
807     END IF;
808     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;     -- bug 4893261
809     p_error_buffer := 'ledger_id cannot be null';
810     RETURN;
811   END IF;
812 
813   -- if ledger_id does not exist in the cache structure,
814   -- get currency info from database
815   --
816   IF NOT g_currency_rec_tbl.EXISTS(p_ledger_id)  THEN
817 
818     OPEN  get_currency_info_csr;
819     FETCH get_currency_info_csr INTO
820             g_currency_rec_tbl(p_ledger_id).ledger_id,
821             g_currency_rec_tbl(p_ledger_id).currency_code,
822             g_currency_rec_tbl(p_ledger_id).minimum_accountable_unit,
823             g_currency_rec_tbl(p_ledger_id).precision;
824 
825     IF get_currency_info_csr%NOTFOUND THEN
826        p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
827        p_error_buffer  := 'No data found for the specified ledger_id';
828     END IF;
829 
830     CLOSE get_currency_info_csr;
831   END IF;
832 
833   IF (g_level_statement >= g_current_runtime_level ) THEN
834 
835     FND_LOG.STRING(g_level_statement,
836                    'ZX.PLSQL.ZX_TDS_UTILITIES_PKG.populate_currency_cache.END',
837                    'ZX_TDS_UTILITIES_PKG.populate_currency_cache(-)'||
838                    ' RETURN_STATUS = ' || p_return_status||
839                    ' error buffer: '||p_error_buffer);
840   END IF;
841 
842  EXCEPTION
843    WHEN OTHERS THEN
844      IF get_currency_info_csr%ISOPEN THEN
845         CLOSE get_currency_info_csr;
846      END IF;
847      p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
848      p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
849      IF (g_level_unexpected >= g_current_runtime_level ) THEN
850        FND_LOG.STRING(g_level_unexpected,
851                       'ZX.PLSQL.ZX_TDS_UTILITIES_PKG.populate_currency_cache',
852                        p_error_buffer);
853        FND_LOG.STRING(g_level_unexpected,
854                       'ZX.PLSQL.ZX_TDS_UTILITIES_PKG.populate_currency_cache.END',
855                       'ZX_TDS_UTILITIES_PKG.populate_currency_cache(-)');
856      END IF;
857 
858 END populate_currency_cache;
859 
860 ----------------------------------------------------------------------
861 --  PROCEDURE
862 --  get_tax_rate_info
863 --
864 --  DESCRIPTION
865 --
866 --  This procedure get tax_rate_id from zx_rates_b with given tax_regime_code,
867 --  tax, tax_status_code, tax_rate_code and tax_determine_date.
868 --
869 --  IN
870 --                 p_tax_regime_code       VARCHAR2
871 --                 p_tax                   VARCHAR2
872 --                 p_tax_status_code       VARCHAR2
873 --                 p_tax_rate_code         VARCHAR2
874 --                 p_tax_determine_date    DATE
875 --                 p_tax_class             VARCHAR2
876 --  OUT NOCOPY
877 --                  p_tax_rate_rec         zx_rate_info_rec_type
878 --                 p_return_status         VARCHAR2
879 --                 p_error_buffer          VARCHAR2
880 --
881 PROCEDURE  get_tax_rate_info (
882  p_tax_regime_code        IN          VARCHAR2,
883  p_tax                    IN          VARCHAR2,
884  p_tax_jurisdiction_code  IN          zx_jurisdictions_b.tax_jurisdiction_code%TYPE,
885  p_tax_status_code        IN          VARCHAR2,
886  p_tax_rate_code          IN          VARCHAR2,
887  p_tax_determine_date     IN          DATE,
888  p_tax_class              IN          VARCHAR2,
889  p_tax_rate_rec           OUT NOCOPY  zx_rate_info_rec_type,
890  p_return_status          OUT NOCOPY  VARCHAR2,
891  p_error_buffer           OUT NOCOPY  VARCHAR2) IS
892 
893  l_tax_jurisdiction_code zx_jurisdictions_b.tax_jurisdiction_code%TYPE; -- for  bug#5569426
894  CURSOR  fetch_tax_rate_info_csr_jur IS
895   SELECT tax_regime_code,
896          tax,
897          tax_status_code,
898          tax_rate_code,
899          tax_rate_id,
900          effective_from,
901          effective_to,
902          rate_type_code,
903          percentage_rate,
904          quantity_rate,
905          Allow_Adhoc_Tax_Rate_Flag,
906          uom_code,
907          tax_jurisdiction_code,
908          offset_tax,
909          offset_status_code,
910          offset_tax_rate_code,
911          allow_exemptions_flag,
912          allow_exceptions_flag,
913          NULL     tax_jurisdiction_id,
914          def_rec_settlement_option_code,
915          taxable_basis_formula_code,
916          adj_for_adhoc_amt_code,
917          inclusive_tax_flag,
918          tax_class
919    FROM  ZX_SCO_RATES_B_V
920   WHERE  tax_regime_code = p_tax_regime_code
921     AND  tax = p_tax
922     AND  tax_status_code = p_tax_status_code
923     AND  active_flag     = 'Y'
924     AND  (tax_jurisdiction_code = p_tax_jurisdiction_code )
925     AND  tax_rate_code = p_tax_rate_code
926     AND  (tax_class = p_tax_class or tax_class IS NULL)
927     AND  ( p_tax_determine_date >= effective_from AND
928           (p_tax_determine_date <= effective_to OR effective_to IS NULL))
929     ORDER BY tax_class NULLS LAST, subscription_level_code;
930 
931    CURSOR  fetch_tax_rate_info_csr_no_jur IS
932   SELECT tax_regime_code,
933          tax,
934          tax_status_code,
935          tax_rate_code,
936          tax_rate_id,
937          effective_from,
938          effective_to,
939          rate_type_code,
940          percentage_rate,
941          quantity_rate,
942          Allow_Adhoc_Tax_Rate_Flag,
943          uom_code,
944          tax_jurisdiction_code,
945          offset_tax,
946          offset_status_code,
947          offset_tax_rate_code,
948          allow_exemptions_flag,
949          allow_exceptions_flag,
950          NULL     tax_jurisdiction_id,
951          def_rec_settlement_option_code,
952          taxable_basis_formula_code,
953          adj_for_adhoc_amt_code,
954          inclusive_tax_flag,
955          tax_class
956    FROM  ZX_SCO_RATES_B_V
957   WHERE  tax_regime_code = p_tax_regime_code
958     AND  tax = p_tax
959     AND  tax_status_code = p_tax_status_code
960     AND  active_flag     = 'Y'
961     AND  (tax_jurisdiction_code is NULL)
962     AND  tax_rate_code = p_tax_rate_code
963     AND  (tax_class = p_tax_class or tax_class IS NULL)
964     AND  ( p_tax_determine_date >= effective_from AND
965           (p_tax_determine_date <= effective_to OR effective_to IS NULL))
966     ORDER BY tax_class NULLS LAST, subscription_level_code;
967 
968 BEGIN
969   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
970 
971   p_return_status := FND_API.G_RET_STS_SUCCESS;
972 
973   IF (g_level_statement >= g_current_runtime_level ) THEN
974     FND_LOG.STRING(g_level_statement,
975                   'ZX.PLSQL.ZX_TDS_UTILITIES_PKG.get_tax_rate_info.BEGIN',
976                   'ZX_TDS_UTILITIES_PKG.get_tax_rate_info(+)'||
977                   ' tax_regime_code = ' || p_tax_regime_code||
978                   ' tax = ' || p_tax||
979                   ' tax_status_code = ' || p_tax_status_code||
980                   ' tax_rate_code = ' || p_tax_rate_code||
981                   ' trax_class = ' || p_tax_class||
982                   ' tax determine date = ' || p_tax_determine_date);
983 
984   END IF;
985 
986   --start bug#5569426
987   IF  p_tax_jurisdiction_code is NULL  then
988      l_tax_jurisdiction_code :='NULL';
989   ELSE
990      l_tax_jurisdiction_code := p_tax_jurisdiction_code;
991   END IF;
992   --end bug#5569426
993 
994   IF p_tax_jurisdiction_code is NOT NULL then
995      OPEN  fetch_tax_rate_info_csr_JUR;
996      FETCH fetch_tax_rate_info_csr_JUR INTO  p_tax_rate_rec;
997 
998      IF fetch_tax_rate_info_csr_JUR%NOTFOUND THEN
999 
1000         OPEN  fetch_tax_rate_info_csr_no_JUR;
1001         FETCH fetch_tax_rate_info_csr_no_jur INTO  p_tax_rate_rec;
1002 
1003         IF fetch_tax_rate_info_csr_no_JUR%NOTFOUND THEN
1004              p_return_status := FND_API.G_RET_STS_ERROR;
1005              p_error_buffer := 'No tax_rate_id found for the specified ' ||
1006                                'tax_regime_code, tax, tax_status_code and tax_rate_code';
1007 
1008               FND_MESSAGE.SET_NAME('ZX','ZX_TAX_RATE_INFO_NOT_FOUND');
1009               FND_MESSAGE.SET_TOKEN('TAX_REGIME',p_tax_regime_code);
1010               FND_MESSAGE.SET_TOKEN('TAX_CODE',p_tax);
1011               FND_MESSAGE.SET_TOKEN('TAX_STATUS',p_tax_status_code);
1012               FND_MESSAGE.SET_TOKEN('TAX_RATE_CODE',p_tax_rate_code);
1013         FND_MESSAGE.SET_TOKEN('TAX_JURISDICTION_CODE',l_tax_jurisdiction_code); --for bug#5569426
1014               -- FND_MSG_PUB.Add;
1015               ZX_API_PUB.add_msg(ZX_TDS_CALC_SERVICES_PUB_PKG.g_msg_context_info_rec);
1016          END IF;
1017          close fetch_tax_rate_info_csr_no_JUR;
1018 
1019      END IF;
1020 
1021      CLOSE fetch_tax_rate_info_csr_JUR;
1022 
1023   ELSE
1024 
1025        OPEN  fetch_tax_rate_info_csr_no_JUR;
1026        FETCH fetch_tax_rate_info_csr_no_jur INTO  p_tax_rate_rec;
1027 
1028        IF fetch_tax_rate_info_csr_no_JUR%NOTFOUND THEN
1029             p_return_status := FND_API.G_RET_STS_ERROR;
1030             p_error_buffer := 'No tax_rate_id found for the specified ' ||
1031                               'tax_regime_code, tax, tax_status_code and tax_rate_code';
1032 
1033              FND_MESSAGE.SET_NAME('ZX','ZX_TAX_RATE_INFO_NOT_FOUND');
1034              FND_MESSAGE.SET_TOKEN('TAX_REGIME',p_tax_regime_code);
1035              FND_MESSAGE.SET_TOKEN('TAX_CODE',p_tax);
1036              FND_MESSAGE.SET_TOKEN('TAX_STATUS',p_tax_status_code);
1037              FND_MESSAGE.SET_TOKEN('TAX_RATE_CODE',p_tax_rate_code);
1038              FND_MESSAGE.SET_TOKEN('TAX_JURISDICTION_CODE',l_tax_jurisdiction_code);   --for bug#5569426
1039              -- FND_MSG_PUB.Add;
1040              ZX_API_PUB.add_msg(ZX_TDS_CALC_SERVICES_PUB_PKG.g_msg_context_info_rec);
1041         END IF;
1042         close fetch_tax_rate_info_csr_no_JUR;
1043 
1044   END IF;
1045 
1046   IF (g_level_statement >= g_current_runtime_level ) THEN
1047 
1048     FND_LOG.STRING(g_level_statement,
1049                   'ZX.PLSQL.ZX_TDS_UTILITIES_PKG.get_tax_rate_info.END',
1050                   'ZX_TDS_UTILITIES_PKG.get_tax_rate_info(-)'||
1051                   ' tax rate id: '||to_char(p_tax_rate_rec.tax_rate_id)||
1052                   ' RETURN_STATUS = ' || p_return_status||
1053                   ' error buffer: '||p_error_buffer);
1054   END IF;
1055 
1056 EXCEPTION
1057   WHEN OTHERS THEN
1058     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1059     IF (g_level_unexpected >= g_current_runtime_level ) THEN
1060       FND_LOG.STRING(g_level_unexpected,
1061                     'ZX.PLSQL.ZX_TDS_UTILITIES_PKG.get_tax_rate_info',
1062                      sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80));
1063       FND_LOG.STRING(g_level_unexpected,
1064                     'ZX.PLSQL.ZX_TDS_UTILITIES_PKG.get_tax_rate_info.END',
1065                     'ZX_TDS_UTILITIES_PKG.get_tax_rate_info(-)');
1066     END IF;
1067 
1068 END get_tax_rate_info;
1069 
1070 ----------------------------------------------------------------------
1071 --  FUNCTION
1072 --   get_tax_index
1073 --
1074 --  DESCRIPTION
1075 --
1076 --  This function check if a tax line is allicable in the current document.
1077 --  If it is applicable, return the line index in p_detail_tax_line_tbl.
1078 --
1079 --  IN             p_taxregime_code
1080 --                 p_tax
1081 --                 p_trx_line_id
1082 --                 p_trx_level_type
1083 --                 l_begin_index
1084 --                 l_begin_index
1085 --  OUT NOCOPY     x_return_status
1086 --
1087 FUNCTION get_tax_index (
1088  p_tax_regime_code        IN          zx_regimes_b.tax_regime_code%TYPE,
1089  p_tax                    IN          zx_taxes_b.tax%TYPE,
1090  p_trx_line_id            IN          NUMBER,
1091  p_trx_level_type         IN          VARCHAR2,
1092  p_begin_index            IN          BINARY_INTEGER,
1093  p_end_index              IN          BINARY_INTEGER,
1094  x_return_status          OUT NOCOPY  VARCHAR2)  RETURN NUMBER IS
1095 
1096 BEGIN
1097 
1098   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
1099   x_return_status :=  FND_API.G_RET_STS_SUCCESS;
1100 
1101   IF (g_level_statement >= g_current_runtime_level ) THEN
1102     FND_LOG.STRING(g_level_statement, 'ZX.PLSQL.ZX_TDS_UTILITIES_PKG.get_tax_index.BEGIN',
1103                   'ZX_TDS_UTILITIES_PKG.get_tax_index(+)'||
1104                   ' tax_regime_code : ' || p_tax_regime_code||
1105                   ' tax : ' || p_tax);
1106   END IF;
1107 
1108   -- Return NULL if p_begin_index IS NULL
1109   --
1110   IF (p_begin_index IS NULL) THEN
1111     IF (g_level_statement >= g_current_runtime_level ) THEN
1112       FND_LOG.STRING(g_level_statement, 'ZX.PLSQL.ZX_TDS_UTILITIES_PKG.get_tax_index',
1113                     'Warning: p_begin_index is NULL');
1114       FND_LOG.STRING(g_level_statement, 'ZX.PLSQL.ZX_TDS_UTILITIES_PKG.get_tax_index.END',
1115                     'ZX_TDS_UTILITIES_PKG.get_tax_index(-)');
1116     END IF;
1117     RETURN NULL;
1118   END IF;
1119 
1120   FOR i IN NVL(p_begin_index, 0) .. NVL(p_end_index, -1) LOOP
1121 
1122     IF(ZX_TDS_CALC_SERVICES_PUB_PKG.g_detail_tax_lines_tbl(i).trx_line_id =
1123                                                               p_trx_line_id  AND
1124        ZX_TDS_CALC_SERVICES_PUB_PKG.g_detail_tax_lines_tbl(i).trx_level_type =
1125                                                            p_trx_level_type  AND
1126        ZX_TDS_CALC_SERVICES_PUB_PKG.g_detail_tax_lines_tbl(i).tax_regime_code =
1127                                                            p_tax_regime_code AND
1128        ZX_TDS_CALC_SERVICES_PUB_PKG.g_detail_tax_lines_tbl(i).tax = p_tax )
1129     THEN
1130       IF (g_level_statement >= g_current_runtime_level ) THEN
1131 
1132         FND_LOG.STRING(g_level_statement, 'ZX.PLSQL.ZX_TDS_UTILITIES_PKG.get_tax_index.END',
1133                       'ZX_TDS_UTILITIES_PKG.get_tax_index(-) tax found in cache');
1134       END IF;
1135       RETURN i;
1136     END IF;
1137   END LOOP;
1138 
1139   -- Return NULL if tax does not exist
1140   --
1141   IF (g_level_statement >= g_current_runtime_level ) THEN
1142 
1143     FND_LOG.STRING(g_level_statement, 'ZX.PLSQL.ZX_TDS_UTILITIES_PKG.get_tax_index.END',
1144                   'ZX_TDS_UTILITIES_PKG.get_tax_index(-) tax does not exist in cache');
1145   END IF;
1146 
1147   RETURN NULL;
1148 
1149 EXCEPTION
1150   WHEN OTHERS THEN
1151     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1152     IF (g_level_unexpected >= g_current_runtime_level ) THEN
1153       FND_LOG.STRING(g_level_unexpected, 'ZX.PLSQL.ZX_TDS_UTILITIES_PKG.get_tax_index',
1154                      sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80));
1155       FND_LOG.STRING(g_level_unexpected, 'ZX.PLSQL.ZX_TDS_UTILITIES_PKG.get_tax_index.END',
1156                     'get_tax_index(-)');
1157     END IF;
1158 
1159 END get_tax_index;
1160 
1161 ----------------------------------------------------------------------
1162 --  PROCEDURE
1163 --  get_tax_rate_info
1164 --
1165 --  DESCRIPTION
1166 --
1167 --  This procedure get tax_rate_id from zx_rates_b with given tax_rate_id
1168 --
1169 --  IN
1170 --                 p_tax_id                NUMBER
1171 --  OUT NOCOPY
1172 --                 p_tax_rate_rec         zx_rate_info_rec_type
1173 --                 p_return_status         VARCHAR2
1174 --                 p_error_buffer          VARCHAR2
1175 --  HISTORY
1176 --
1177 --  Apr-05-2005  Ling Zhang  Created for bug fix 4277780
1178 --
1179 
1180 PROCEDURE  get_tax_rate_info (
1181  p_tax_rate_id            IN          NUMBER,
1182  p_tax_rate_rec           OUT NOCOPY  zx_rate_info_rec_type,
1183  p_return_status          OUT NOCOPY  VARCHAR2,
1184  p_error_buffer           OUT NOCOPY  VARCHAR2) IS
1185 
1186  CURSOR  fetch_tax_rate_info_csr IS
1187   SELECT tax_regime_code,
1188          tax,
1189          tax_status_code,
1190          tax_rate_code,
1191          tax_rate_id,
1192          effective_from,
1193          effective_to,
1194          rate_type_code,
1195          percentage_rate,
1196          quantity_rate,
1197          Allow_Adhoc_Tax_Rate_Flag,
1198          uom_code,
1199          tax_jurisdiction_code,
1200          offset_tax,
1201          offset_status_code,
1202          offset_tax_rate_code,
1203          allow_exemptions_flag,
1204          allow_exceptions_flag,
1205          NULL     tax_jurisdiction_id,
1206          def_rec_settlement_option_code,
1207          taxable_basis_formula_code,
1208          adj_for_adhoc_amt_code,
1209          inclusive_tax_flag,
1210          tax_class
1211    -- FROM  ZX_SCO_RATES -- Bug#5395227
1212       FROM  ZX_RATES_B
1213   WHERE  tax_rate_id = p_tax_rate_id
1214   AND    active_flag = 'Y';
1215 
1216   l_tbl_index BINARY_INTEGER;
1217 
1218 BEGIN
1219   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
1220 
1221   p_return_status := FND_API.G_RET_STS_SUCCESS;
1222 
1223   IF (g_level_statement >= g_current_runtime_level ) THEN
1224     FND_LOG.STRING(g_level_statement,
1225                   'ZX.PLSQL.ZX_TDS_UTILITIES_PKG.get_tax_rate_info.BEGIN',
1226                   'ZX_TDS_UTILITIES_PKG.get_tax_rate_info(+)'||
1227                   'tax_rate_id = ' || p_tax_rate_id);
1228   END IF;
1229 
1230  IF g_tax_rate_info_tbl.exists(p_tax_rate_id) then
1231 
1232     IF (g_level_statement >= g_current_runtime_level ) THEN
1233 
1234        FND_LOG.STRING(g_level_statement,
1235                   'ZX.PLSQL.ZX_TDS_UTILITIES_PKG.get_tax_rate_info',
1236                   'Found rate info in cache. ');
1237     END IF;
1238 
1239     p_tax_rate_rec := g_tax_rate_info_tbl(p_tax_rate_id);
1240 
1241  ELSE
1242 
1243       OPEN  fetch_tax_rate_info_csr;
1244       FETCH fetch_tax_rate_info_csr INTO  p_tax_rate_rec;
1245 
1246       g_tax_rate_info_tbl(p_tax_rate_id) := p_tax_rate_rec;
1247 
1248       l_tbl_index := dbms_utility.get_hash_value(
1249                 p_tax_rate_rec.tax_regime_code||p_tax_rate_rec.tax||
1250                 p_tax_rate_rec.tax_status_code||p_tax_rate_rec.tax_rate_code,
1251                 1,
1252                 8192);
1253 
1254       g_tax_rate_info_ind_by_hash(l_tbl_index) := p_tax_rate_rec;
1255 
1256       IF fetch_tax_rate_info_csr%NOTFOUND THEN
1257          p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;     -- bug 4893261
1258          p_error_buffer := 'No tax rate info found for the specified tax_rate_id';
1259       END IF;
1260 
1261       CLOSE fetch_tax_rate_info_csr;
1262   END IF;
1263 
1264   IF (g_level_statement >= g_current_runtime_level ) THEN
1265 
1266     FND_LOG.STRING(g_level_statement,
1267                   'ZX.PLSQL.ZX_TDS_UTILITIES_PKG.get_tax_rate_info.END',
1268                   'ZX_TDS_UTILITIES_PKG.get_tax_rate_info(-)'||
1269                   ' RETURN_STATUS = ' || p_return_status||
1270                   ' error buffer: '||p_error_buffer);
1271   END IF;
1272 
1273 EXCEPTION
1274   WHEN OTHERS THEN
1275     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1276     IF (g_level_unexpected >= g_current_runtime_level ) THEN
1277       FND_LOG.STRING(g_level_unexpected,
1278                     'ZX.PLSQL.ZX_TDS_UTILITIES_PKG.get_tax_rate_info',
1279                      sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80));
1280       FND_LOG.STRING(g_level_unexpected,
1281                     'ZX.PLSQL.ZX_TDS_UTILITIES_PKG.get_tax_rate_info.END',
1282                     'ZX_TDS_UTILITIES_PKG.get_tax_rate_info(-)');
1283     END IF;
1284 
1285 END get_tax_rate_info;
1286 
1287 END  ZX_TDS_UTILITIES_PKG;
1288