DBA Data[Home] [Help]

PACKAGE BODY: APPS.ZX_TRD_INTERNAL_SERVICES_PVT

Source


1 PACKAGE BODY ZX_TRD_INTERNAL_SERVICES_PVT AS
2 /* $Header: zxmirecdmsrvpvtb.pls 120.132.12020000.8 2013/04/24 11:05:27 ssohal ship $ */
3 
4 g_current_runtime_level      NUMBER;
5 g_level_statement            CONSTANT NUMBER := FND_LOG.LEVEL_STATEMENT;
6 g_level_procedure            CONSTANT NUMBER := FND_LOG.LEVEL_PROCEDURE;
7 g_level_event                CONSTANT NUMBER := FND_LOG.LEVEL_EVENT;
8 g_level_unexpected           CONSTANT NUMBER := FND_LOG.LEVEL_UNEXPECTED;
9 g_level_error                CONSTANT NUMBER := FND_LOG.LEVEL_ERROR;
10 
11  TYPE index_amt_rec_type IS RECORD (
12    tbl_index		BINARY_INTEGER,
13    tbl_amt		NUMBER);
14 
15  TYPE index_amt_tbl_type IS TABLE OF index_amt_rec_type
16       INDEX BY BINARY_INTEGER;
17 
18  PROCEDURE distribute_rounding_diff (
19   p_index_amt_tbl     IN OUT NOCOPY index_amt_tbl_type,
20   p_rounding_diff     IN 	    NUMBER,
21   p_min_acct_unit     IN	    NUMBER,
22   p_return_status     OUT NOCOPY    VARCHAR2,
23   p_error_buffer      OUT NOCOPY    VARCHAR2);
24 
25  PROCEDURE sort_tbl_amt_desc (
26   p_index_amt_tbl     IN OUT NOCOPY index_amt_tbl_type,
27   p_return_status     OUT NOCOPY    VARCHAR2,
28   p_error_buffer      OUT NOCOPY    VARCHAR2);
29 
30  PROCEDURE round_tax_dists_trx_curr (
31   p_rec_nrec_dist_tbl IN OUT NOCOPY ZX_TRD_SERVICES_PUB_PKG.REC_NREC_DIST_TBL_TYPE,
32   p_rnd_begin_index   IN            NUMBER,
33   p_rnd_end_index     IN            NUMBER,
34   p_tax_line_amt      IN            NUMBER,
35   p_return_status     OUT NOCOPY    VARCHAR2,
36   p_error_buffer      OUT NOCOPY    VARCHAR2);
37 
38  PROCEDURE convert_tax_dists (
39   p_rec_nrec_dist_tbl IN OUT NOCOPY ZX_TRD_SERVICES_PUB_PKG.REC_NREC_DIST_TBL_TYPE,
40   p_rnd_begin_index          IN            NUMBER,
41   p_rnd_end_index            IN            NUMBER,
42   p_tax_line_amt_tax_curr    IN            NUMBER,
43   p_tax_line_amt_funcl_curr  IN            NUMBER,
44   p_return_status            OUT NOCOPY    VARCHAR2,
45   p_error_buffer             OUT NOCOPY    VARCHAR2);
46 
47 PROCEDURE get_recovery_from_applied(
48  p_tax_id                     IN            NUMBER,
49  p_tax_apportionment_line_num IN            NUMBER,
50  p_prd_total_tax_amt          IN            NUMBER,
51  p_trx_line_dist_index        IN            NUMBER,
52  p_rec_nrec_dist_tbl          IN OUT NOCOPY ZX_TRD_SERVICES_PUB_PKG.REC_NREC_DIST_TBL_TYPE,
53  p_rnd_begin_index            IN            NUMBER,
54  p_rnd_end_index              OUT NOCOPY    NUMBER,
55  p_return_status              OUT NOCOPY    VARCHAR2,
56  p_error_buffer               OUT NOCOPY    VARCHAR2);
57 
58 PROCEDURE get_recovery_from_adjusted(
59  p_tax_id                     IN            NUMBER,
60  p_tax_apportionment_line_num IN            NUMBER,
61  p_trx_line_dist_index        IN            NUMBER,
62  p_rec_nrec_dist_tbl          IN OUT NOCOPY ZX_TRD_SERVICES_PUB_PKG.REC_NREC_DIST_TBL_TYPE,
63  p_rnd_begin_index            IN            NUMBER,
64  p_rnd_end_index              OUT NOCOPY    NUMBER,
65  p_return_status              OUT NOCOPY    VARCHAR2,
66  p_error_buffer               OUT NOCOPY    VARCHAR2);
67 
68 PROCEDURE enforce_recovery_from_ref(
69  p_detail_tax_line_tbl  IN             ZX_TRD_SERVICES_PUB_PKG.TAX_LINE_TBL_TYPE,
70  p_tax_line_index       IN             NUMBER,
71  p_trx_line_dist_index  IN            NUMBER,
72  p_rec_nrec_dist_tbl    IN OUT NOCOPY ZX_TRD_SERVICES_PUB_PKG.REC_NREC_DIST_TBL_TYPE,
73  p_rnd_begin_index      IN            NUMBER,
74  p_rnd_end_index        OUT NOCOPY    NUMBER,
75  p_return_status        OUT NOCOPY    VARCHAR2,
76  p_error_buffer         OUT NOCOPY    VARCHAR2);
77 
78 PROCEDURE round_and_adjust_prd_tax_amts (
79  p_rec_nrec_dist_tbl  IN OUT NOCOPY  ZX_TRD_SERVICES_PUB_PKG.REC_NREC_DIST_TBL_TYPE,
80  p_rnd_begin_index    IN             NUMBER,
81  p_rnd_end_index      IN             NUMBER,
82  p_return_status      OUT NOCOPY     VARCHAR2,
83  p_error_buffer       OUT NOCOPY     VARCHAR2);
84 
85 PROCEDURE get_variance_related_columns(
86  p_detail_tax_line_tbl  IN            ZX_TRD_SERVICES_PUB_PKG.TAX_LINE_TBL_TYPE,
87  p_tax_line_index       IN            NUMBER,
88  p_rec_nrec_dist_tbl    IN OUT NOCOPY ZX_TRD_SERVICES_PUB_PKG.REC_NREC_DIST_TBL_TYPE,
89  p_rnd_begin_index      IN            NUMBER,
90  p_rnd_end_index        IN            NUMBER,
91  p_return_status           OUT NOCOPY VARCHAR2,
92  p_error_buffer            OUT NOCOPY VARCHAR2);
93 
94 PROCEDURE calc_tax_dist(
95  p_detail_tax_line_tbl  IN             ZX_TRD_SERVICES_PUB_PKG.TAX_LINE_TBL_TYPE,
96  p_tax_line_index       IN             NUMBER,
97  p_trx_line_dist_index  IN             NUMBER,
98  p_rec_nrec_dist_tbl    IN OUT NOCOPY  ZX_TRD_SERVICES_PUB_PKG.REC_NREC_DIST_TBL_TYPE,
99  p_rnd_begin_index      IN             NUMBER,
100  p_rnd_end_index        IN OUT NOCOPY  NUMBER,
101  p_event_class_rec      IN             ZX_API_PUB.event_class_rec_type,
102  p_return_status           OUT NOCOPY  VARCHAR2,
103  p_error_buffer            OUT NOCOPY  VARCHAR2) IS
104 
105  l_index   			NUMBER;
106  l_new_index   			NUMBER;
107  l_total_count   		NUMBER;
108  l_curr_count   		NUMBER;
109  l_new_count   			NUMBER;
110  l_tax_dist_id   		NUMBER;
111  l_max_tax_dist_number          NUMBER;
112 
113  CURSOR  get_tax_distribution_cur is
114   SELECT *
115     FROM zx_rec_nrec_dist
116    WHERE NVL(reverse_flag,'N') = 'N'
117      AND tax_line_id = p_detail_tax_line_tbl(p_tax_line_index).tax_line_id
118      AND trx_line_dist_id =
119          ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.trx_line_dist_id(
120                                                        p_trx_line_dist_index)
121    ORDER BY rec_nrec_tax_dist_id, recoverable_flag;
122 
123  CURSOR  get_maximum_tax_dist_num_csr is
124   SELECT max(rec_nrec_tax_dist_number)
125     FROM zx_rec_nrec_dist
126    WHERE tax_line_id = p_detail_tax_line_tbl(p_tax_line_index).tax_line_id
127      AND trx_line_dist_id =
128          ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.trx_line_dist_id(
129                                                       p_trx_line_dist_index);
130 
131 BEGIN
132 
133   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
134 
135   IF (g_level_procedure >= g_current_runtime_level ) THEN
136      FND_LOG.STRING(g_level_procedure,
137                    'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.CALC_TAX_DIST.BEGIN',
138                    'ZX_TRD_INTERNAL_SERVICES_PVT.calc_tax_dist(+)');
139   END IF;
140 
141   p_return_status:= FND_API.G_RET_STS_SUCCESS;
142 
143   l_index:= p_rnd_begin_index - 1;
144   l_new_index := NULL;
145   l_total_count := 0;
146 
147   IF (g_level_statement >= g_current_runtime_level ) THEN
148      FND_LOG.STRING(g_level_statement,
149                    'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.CALC_TAX_DIST',
150                    'p_rnd_begin_index = ' || p_rnd_begin_index||
151                    'p_rnd_end_index = ' || p_rnd_end_index);
152   END IF;
153 
154   OPEN get_tax_distribution_cur;
155 
156   LOOP           -- get_tax_distribution_cur
157     l_index := l_index + 1;
158     FETCH get_tax_distribution_cur INTO p_rec_nrec_dist_tbl(l_index);
159     EXIT WHEN get_tax_distribution_cur%NOTFOUND;
160 
161   END LOOP;      -- get_tax_distribution_cur
162 
163   l_total_count:= get_tax_distribution_cur%ROWCOUNT;
164 
165   IF (g_level_statement >= g_current_runtime_level ) THEN
166     FND_LOG.STRING(g_level_statement,
167                   'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.CALC_TAX_DIST',
168                   'l_total_count = ' || l_total_count);
169   END IF;
170 
171   CLOSE get_tax_distribution_cur;
172 
173   IF l_total_count = 0 THEN -- first time processing
174 
175    /*
176     first fetch all the tax distributions whose reverse_flag <>'Y',
177     order by recoverable_flag for the tax line id
178     and item distribution id.
179     If there is no tax distribution found -- first time calculation
180     call recovery type applicability
181     */
182 
183     IF (g_level_statement >= g_current_runtime_level ) THEN
184       FND_LOG.STRING(g_level_statement,
185                   'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.CALC_TAX_DIST',
186                   'first time calculation for this tax line and item dist');
187     END IF;
188 
189     -- Modified the IF condition for Bug#14055352 --
190     IF (NVL(p_event_class_rec.enforce_tax_from_ref_doc_flag, 'N') = 'Y'
191         OR
192         -- Added following conditions for Bug#13012588 --
193         -- zero amount reference tax line --
194         (p_detail_tax_line_tbl(p_tax_line_index).other_doc_source = 'REFERENCE'
195          AND p_detail_tax_line_tbl(p_tax_line_index).unrounded_tax_amt = 0
196          AND p_detail_tax_line_tbl(p_tax_line_index).unrounded_taxable_amt = 0
197          AND p_detail_tax_line_tbl(p_tax_line_index).manually_entered_flag = 'Y'
198          AND p_detail_tax_line_tbl(p_tax_line_index).freeze_until_overridden_flag ='Y')
199        )
200        AND p_event_class_rec.tax_event_type_code <> 'OVERRIDE_TAX'
201        AND ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.adjusted_doc_application_id(p_trx_line_dist_index) IS NULL
202        AND ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.applied_from_application_id(p_trx_line_dist_index) IS NULL
203        AND ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.ref_doc_application_id(p_trx_line_dist_index) IS NOT NULL
204     THEN
205       -- If p_event_class_rec.enforce_tax_from_ref_doc_flag = 'Y' AND
206       -- trx_line_dist_tbl.ref_doc_application_id IS NOT NULL,
207       -- OR --
208       -- If tax line is zero amount reference tax line --
209       -- get tax recovery rate code from refefence document
210       --
211       enforce_recovery_from_ref(
212                 p_detail_tax_line_tbl,
213                 p_tax_line_index,
214                 p_trx_line_dist_index,
215                 p_rec_nrec_dist_tbl,
216                 p_rnd_begin_index,
217                 p_rnd_end_index,
218                 p_return_status,
219                 p_error_buffer);
220 
221       IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
222         IF (g_level_statement >= g_current_runtime_level ) THEN
223           FND_LOG.STRING(g_level_statement,
224                       'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.calc_tax_dist',
225                       'Incorrect return_status after calling ' ||
226                       'ZX_TRD_INTERNAL_SERVICES_PVT.enforce_recovery_from_ref()'||p_return_status);
227         END IF;
228         RETURN;
229       END IF;
230 
231     ELSE
232 
233       det_appl_rec_type(
234                   p_detail_tax_line_tbl,
235                   p_tax_line_index,
236                   p_trx_line_dist_index,
237                   p_rec_nrec_dist_tbl,
238                   p_rnd_begin_index,
239                   p_rnd_end_index,
240                   p_return_status,
241                   p_error_buffer);
242 
243       IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
244         IF (g_level_statement >= g_current_runtime_level ) THEN
245           FND_LOG.STRING(g_level_statement,
246                       'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.calc_tax_dist',
247                       'Incorrect return_status after calling ' ||
248                       'ZX_TRD_INTERNAL_SERVICES_PVT.det_appl_rec_type()'||p_return_status);
249         END IF;
250         RETURN;
251       END IF;
252 
253     END IF;
254 
255     -- get_related_column and call recovery rate determination
256     --
257     get_tax_related_columns_sta(
258                   p_detail_tax_line_tbl,
259                   p_tax_line_index,
260                   p_trx_line_dist_index,
261                   p_rec_nrec_dist_tbl,
262                   p_rnd_begin_index,
263                   p_rnd_end_index,
264                   p_return_status,
265                   p_error_buffer);
266 
267       IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
268         IF (g_level_statement >= g_current_runtime_level ) THEN
269           FND_LOG.STRING(g_level_statement,
270                       'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.calc_tax_dist',
271                       'Incorrect return_status after calling ' ||
272                       'ZX_TRD_INTERNAL_SERVICES_PVT.get_tax_related_columns_sta()'||p_return_status);
273         END IF;
274         RETURN;
275       END IF;
276 
277 
278     get_tax_related_columns_var(
279                   p_detail_tax_line_tbl,
280                   p_tax_line_index,
281                   p_trx_line_dist_index,
282                   p_rec_nrec_dist_tbl,
283                   p_rnd_begin_index,
284                   p_rnd_end_index,
285                   p_return_status,
286                   p_error_buffer);
287 
288       IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
289         IF (g_level_statement >= g_current_runtime_level ) THEN
290           FND_LOG.STRING(g_level_statement,
291                       'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.calc_tax_dist',
292                       'Incorrect return_status after calling ' ||
293                       'ZX_TRD_INTERNAL_SERVICES_PVT.get_tax_related_columns_var()'||p_return_status);
294         END IF;
295         RETURN;
296       END IF;
297 
298     IF ZX_TRD_SERVICES_PUB_PKG.g_variance_calc_flag = 'Y' THEN
299       get_variance_related_columns(
300                   p_detail_tax_line_tbl,
301                   p_tax_line_index,
302                   p_rec_nrec_dist_tbl,
303                   p_rnd_begin_index,
304                   p_rnd_end_index,
305                   p_return_status,
306                   p_error_buffer);
307 
308       IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
309         IF (g_level_statement >= g_current_runtime_level ) THEN
310           FND_LOG.STRING(g_level_statement,
311                       'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.calc_tax_dist',
312                       'Incorrect return_status after calling ' ||
313                       'ZX_TRD_INTERNAL_SERVICES_PVT.get_variance_related_columns()'||p_return_status);
314         END IF;
315         RETURN;
316       END IF;
317 
318 
319     END IF;
320 
321     get_rec_rate(
322                   p_detail_tax_line_tbl,
323                   p_tax_line_index,
324                   p_trx_line_dist_index,
325                   p_event_class_rec,
326                   p_rec_nrec_dist_tbl,
327                   p_rnd_begin_index,
328                   p_rnd_end_index,
329                   p_return_status,
330                   p_error_buffer);
331    IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
332         IF (g_level_statement >= g_current_runtime_level ) THEN
333           FND_LOG.STRING(g_level_statement,
334                       'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.calc_tax_dist',
335                       'Incorrect return_status after calling ' ||
336                       'ZX_TRD_INTERNAL_SERVICES_PVT.get_rec_rate()'||p_return_status);
337         END IF;
338         RETURN;
339    END IF;
340 
341   ELSE -- second time calculation
342 
343     /*
344     If there are tax distribution found -- second time calculation.
345     First we need to consider frozen tax distribution case,
346     we need to create reverse tax distributions for the frozen tax
347     distributions.
348     For example, we get
349     D1    frozen
350     D2    frozen
351     D3    frozen
352     we can assume if one tax distribution for the same tax line and item
353     dist is frozen, all tax distributions for the same tax line and item
354     dist are frozen.
355 
356     So we need to create
357     D1   frozen reverse
358     D2   frozen reverse
359     D3   frozen reverse
360     D4   negative D1 reverse
361     D5   negative D2 reverse
362     D6   negative D3 reverse
363     D7   same as D1
364     D8   same as D2
365     D9   same as D3
366     THEN recovery rate determination need to be ran for D7 - D9.
367     */
368 
369     IF (g_level_statement >= g_current_runtime_level ) THEN
370        FND_LOG.STRING(g_level_statement,
371                      'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.CALC_TAX_DIST',
372                      'tax dists have been determined before '||
373                      'p_rnd_begin_index = ' || p_rnd_begin_index||
374                      'p_rnd_end_index = ' || p_rnd_end_index);
375     END IF;
376 
377     -- get the maximum rec_nrec_tax_dist_number
378     --
379     OPEN  get_maximum_tax_dist_num_csr;
380     FETCH get_maximum_tax_dist_num_csr INTO l_max_tax_dist_number;
381     CLOSE get_maximum_tax_dist_num_csr;
382 
383     l_max_tax_dist_number := NVL(l_max_tax_dist_number, 0);
384 
385     -- set p_rnd_end_index
386     --
387     p_rnd_end_index:= p_rnd_begin_index + l_total_count - 1;
388 
389     FOR i IN p_rnd_begin_Index .. p_rnd_end_Index LOOP
390 
391         -- 6709478
392       IF NVL(p_rec_nrec_dist_tbl(i).summary_tax_line_id, -999999) <>
393          NVL(p_detail_tax_line_tbl(p_tax_line_index).summary_tax_line_id, -999999)
394       THEN
395 
396         SELECT zx_rec_nrec_dist_s.nextval INTO
397                  p_rec_nrec_dist_tbl(i).rec_nrec_tax_dist_id FROM DUAL;
398 
399       END IF;
400 
401       IF NVL(p_rec_nrec_dist_tbl(i).freeze_flag, 'N') = 'Y' THEN
402 
403 
404         p_rec_nrec_dist_tbl(i).reverse_flag:= 'Y';
405 
406         SELECT zx_rec_nrec_dist_s.nextval INTO l_tax_dist_id from dual;
407 
408         l_new_index:= i + l_total_count;
409         p_rec_nrec_dist_tbl(l_new_index):= p_rec_nrec_dist_tbl(i);
410         p_rec_nrec_dist_tbl(l_new_index).rec_nrec_tax_dist_id:= l_tax_dist_id;
411         p_rec_nrec_dist_tbl(l_new_index).freeze_flag:= 'N';
412         p_rec_nrec_dist_tbl(l_new_index).reverse_flag := 'Y';
413         p_rec_nrec_dist_tbl(l_new_index).posting_flag := NULL;
414         p_rec_nrec_dist_tbl(l_new_index).reversed_tax_dist_id :=
415                                    p_rec_nrec_dist_tbl(i).rec_nrec_tax_dist_id;
416         p_rec_nrec_dist_tbl(l_new_index).rec_nrec_tax_amt:=
417                             -p_rec_nrec_dist_tbl(l_new_index).rec_nrec_tax_amt;
418         p_rec_nrec_dist_tbl(l_new_index).rec_nrec_tax_amt_tax_curr:=
419                    -p_rec_nrec_dist_tbl(l_new_index).rec_nrec_tax_amt_tax_curr;
420         p_rec_nrec_dist_tbl(l_new_index).rec_nrec_tax_amt_funcl_curr :=
421                  -p_rec_nrec_dist_tbl(l_new_index).rec_nrec_tax_amt_funcl_curr;
422         p_rec_nrec_dist_tbl(l_new_index).trx_line_dist_amt:=
423                            -p_rec_nrec_dist_tbl(l_new_index).trx_line_dist_amt;
424         p_rec_nrec_dist_tbl(l_new_index).trx_line_dist_tax_amt:=
425                        -p_rec_nrec_dist_tbl(l_new_index).trx_line_dist_tax_amt;
426         -- 6709478
427         p_rec_nrec_dist_tbl(l_new_index).trx_line_dist_qty:=
428                            -p_rec_nrec_dist_tbl(l_new_index).trx_line_dist_qty;
429         p_rec_nrec_dist_tbl(l_new_index).taxable_amt :=
430                                  -p_rec_nrec_dist_tbl(l_new_index).taxable_amt;
431         p_rec_nrec_dist_tbl(l_new_index).taxable_amt_tax_curr :=
432                         -p_rec_nrec_dist_tbl(l_new_index).taxable_amt_tax_curr;
433         p_rec_nrec_dist_tbl(l_new_index).taxable_amt_funcl_curr :=
434                       -p_rec_nrec_dist_tbl(l_new_index).taxable_amt_funcl_curr;
435         p_rec_nrec_dist_tbl(l_new_index).orig_rec_nrec_tax_amt:=
436                        -p_rec_nrec_dist_tbl(l_new_index).orig_rec_nrec_tax_amt;
437         p_rec_nrec_dist_tbl(l_new_index).orig_rec_nrec_tax_amt_tax_curr:=
438               -p_rec_nrec_dist_tbl(l_new_index).orig_rec_nrec_tax_amt_tax_curr;
439         p_rec_nrec_dist_tbl(l_new_index).unrounded_rec_nrec_tax_amt:=
440                   -p_rec_nrec_dist_tbl(l_new_index).unrounded_rec_nrec_tax_amt;
441 
442         p_rec_nrec_dist_tbl(l_new_index).rec_nrec_tax_dist_number :=
443                                                    l_max_tax_dist_number + 1;
444 
445         -- bug 6706941: populate gl_date for the reversed tax distribution
446         --
447         p_rec_nrec_dist_tbl(l_new_index).gl_date :=
448               AP_UTILITIES_PKG.get_reversal_gl_date(
449                  p_date   => p_rec_nrec_dist_tbl(l_new_index).gl_date,
450                  p_org_id => p_rec_nrec_dist_tbl(l_new_index).internal_organization_id);
451 
452         l_max_tax_dist_number := l_max_tax_dist_number + 1;
453 
454 --        p_rec_nrec_dist_tbl(l_new_index).rec_nrec_tax_dist_number :=
455 --                     -p_rec_nrec_dist_tbl(l_new_index).rec_nrec_tax_dist_number;
456 
457 --        p_rec_nrec_dist_tbl(l_new_index).invoice_price_variance:=
458 --                      -p_rec_nrec_dist_tbl(l_new_index).invoice_price_variance;
459 --        p_rec_nrec_dist_tbl(l_new_index).base_invoice_price_variance:=
460 --                 -p_rec_nrec_dist_tbl(l_new_index).base_invoice_price_variance;
461 --        p_rec_nrec_dist_tbl(l_new_index).exchange_rate_variance:=
462 --                      -p_rec_nrec_dist_tbl(l_new_index).exchange_rate_variance;
463 
464         l_new_index:= l_new_index + l_total_count;
465 
466         SELECT zx_rec_nrec_dist_s.nextval INTO l_tax_dist_id from dual;
467 
468         p_rec_nrec_dist_tbl(l_new_index) := p_rec_nrec_dist_tbl(i);
469         p_rec_nrec_dist_tbl(l_new_index).rec_nrec_tax_dist_id := l_tax_dist_id;
470         p_rec_nrec_dist_tbl(l_new_index).freeze_flag := 'N';
471         p_rec_nrec_dist_tbl(l_new_index).reverse_flag := 'N';
472         p_rec_nrec_dist_tbl(l_new_index).posting_flag := NULL;
473 
474         -- Start : Code changes for Bug#10072294 --
475         ZX_TDS_UTILITIES_PKG.populate_tax_cache (
476                p_tax_id  => p_detail_tax_line_tbl(p_tax_line_index).tax_id,
477                p_return_status  => p_return_status,
478                p_error_buffer   => p_error_buffer);
479 
480         IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
481           IF (g_level_statement >= g_current_runtime_level ) THEN
482             FND_LOG.STRING(g_level_statement,
483                            'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.calc_tax_dist',
484                            'Incorrect return_status after calling ' ||
485                            'ZX_TDS_UTILITIES_PKG.populate_tax_cache()'||p_return_status);
486           END IF;
487           RETURN;
488         END IF;
489 
490         IF  (NVL(p_rec_nrec_dist_tbl(l_new_index).historical_flag, 'N') <> 'Y') AND
491         (ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.adjusted_doc_application_id(p_trx_line_dist_index) IS NULL) AND
492           (ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.applied_from_application_id(p_trx_line_dist_index) IS NULL OR
493            (  ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.applied_from_application_id(p_trx_line_dist_index) IS NOT NULL AND
494               ZX_TDS_UTILITIES_PKG.g_tax_rec_tbl(p_detail_tax_line_tbl(p_tax_line_index).tax_id).applied_amt_handling_flag = 'R'
495            )
496          )
497         THEN
498           p_rec_nrec_dist_tbl(l_new_index).recovery_rate_id := NULL;
499         END IF;
500         -- End : Code changes for Bug#10072294 --
501 
502         p_rec_nrec_dist_tbl(l_new_index).rec_nrec_tax_dist_number :=
503                                                    l_max_tax_dist_number + 1;
504         l_max_tax_dist_number := l_max_tax_dist_number + 1;
505 
506 	-- commented out for bug 5581573
507         --IF p_event_class_rec.enforce_tax_from_ref_doc_flag = 'Y' AND
508         --   ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.ref_doc_application_id(
509         --                                   p_trx_line_dist_index) IS NOT NULL
510         --THEN
511           -- set rec_nrec_rate  to NULL
512           --
513          -- p_rec_nrec_dist_tbl(l_new_index).rec_nrec_rate := NULL;
514 
515         --END IF;
516 
517         -- Bug 7117340 -- DFF ER
518         p_rec_nrec_dist_tbl(l_new_index).attribute1 := NULL;
519         p_rec_nrec_dist_tbl(l_new_index).attribute2 := NULL;
520         p_rec_nrec_dist_tbl(l_new_index).attribute3 := NULL;
521         p_rec_nrec_dist_tbl(l_new_index).attribute4 := NULL;
522         p_rec_nrec_dist_tbl(l_new_index).attribute5 := NULL;
523         p_rec_nrec_dist_tbl(l_new_index).attribute6 := NULL;
524         p_rec_nrec_dist_tbl(l_new_index).attribute7 := NULL;
525         p_rec_nrec_dist_tbl(l_new_index).attribute8 := NULL;
526         p_rec_nrec_dist_tbl(l_new_index).attribute9 := NULL;
527         p_rec_nrec_dist_tbl(l_new_index).attribute10 := NULL;
528         p_rec_nrec_dist_tbl(l_new_index).attribute11 := NULL;
529         p_rec_nrec_dist_tbl(l_new_index).attribute12 := NULL;
530         p_rec_nrec_dist_tbl(l_new_index).attribute13 := NULL;
531         p_rec_nrec_dist_tbl(l_new_index).attribute14 := NULL;
532         p_rec_nrec_dist_tbl(l_new_index).attribute15 := NULL;
533         p_rec_nrec_dist_tbl(l_new_index).attribute_category := NULL;
534         -- End Bug 7117340 -- DFF ER
535 
536       END IF;    -- freeze_flag = 'Y'
537     END LOOP;    -- i IN p_rnd_begin_Index .. p_rnd_end_Index
538 
539     IF l_new_index IS NOT NULL THEN
540        p_rnd_end_index:= l_new_index;
541     END IF;
542 
543     get_tax_related_columns_var(
544                     p_detail_tax_line_tbl,
545                     p_tax_line_index,
546                     p_trx_line_dist_index,
547                     p_rec_nrec_dist_tbl,
548                     p_rnd_begin_index,
549                     p_rnd_end_index,
550                     p_return_status,
551                     p_error_buffer);
552 
553       IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
554         IF (g_level_statement >= g_current_runtime_level ) THEN
555           FND_LOG.STRING(g_level_statement,
556                       'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.calc_tax_dist',
557                       'Incorrect return_status after calling ' ||
558                       'ZX_TRD_INTERNAL_SERVICES_PVT.get_tax_related_columns_var()'||p_return_status);
559         END IF;
560         RETURN;
561       END IF;
562 
563     IF ZX_TRD_SERVICES_PUB_PKG.g_variance_calc_flag = 'Y' THEN
564       get_variance_related_columns(
565                   p_detail_tax_line_tbl,
566                   p_tax_line_index,
567                   p_rec_nrec_dist_tbl,
568                   p_rnd_begin_index,
569                   p_rnd_end_index,
570                   p_return_status,
571                   p_error_buffer);
572 
573       IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
574         IF (g_level_statement >= g_current_runtime_level ) THEN
575           FND_LOG.STRING(g_level_statement,
576                       'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.calc_tax_dist',
577                       'Incorrect return_status after calling ' ||
578                       'ZX_TRD_INTERNAL_SERVICES_PVT.get_variance_related_columns()'||p_return_status);
579         END IF;
580         RETURN;
581       END IF;
582 
583     END IF;
584 
585     get_rec_rate(
586                     p_detail_tax_line_tbl,
587                     p_tax_line_index,
588                     p_trx_line_dist_index,
589                     p_event_class_rec,
590                     p_rec_nrec_dist_tbl,
591                     p_rnd_begin_index,
592                     p_rnd_end_index,
593                     p_return_status,
594                     p_error_buffer);
595     IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
596         IF (g_level_statement >= g_current_runtime_level ) THEN
597           FND_LOG.STRING(g_level_statement,
598                       'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.calc_tax_dist',
599                       'Incorrect return_status after calling ' ||
600                       'ZX_TRD_INTERNAL_SERVICES_PVT.get_rec_rate()'||p_return_status);
601         END IF;
602         RETURN;
603     END IF;
604 
605 
606   END IF; -- no row found
607 
608   IF (g_level_procedure >= g_current_runtime_level ) THEN
609     FND_LOG.STRING(g_level_procedure,
610                   'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.CALC_TAX_DIST.END',
611                   'ZX_TRD_INTERNAL_SERVICES_PVT.calc_tax_dist (-)');
612   END IF;
613 
614 EXCEPTION
615   WHEN OTHERS THEN
616     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
617     p_error_buffer := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
618 
619     IF (g_level_unexpected >= g_current_runtime_level ) THEN
620       FND_LOG.STRING(g_level_unexpected,
621                     'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.calc_tax_dist',
622                      p_error_buffer);
623       FND_LOG.STRING(g_level_unexpected,
624                     'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.CALC_TAX_DIST.END',
625                     'ZX_TRD_INTERNAL_SERVICES_PVT.calc_tax_dist (-)');
626     END IF;
627 
628 END calc_tax_dist;
629 
630 PROCEDURE cancel_tax_line(
631  p_detail_tax_line_tbl        IN      ZX_TRD_SERVICES_PUB_PKG.TAX_LINE_TBL_TYPE,
632  p_tax_line_index             IN      NUMBER,
633  p_rec_nrec_dist_tbl          IN OUT NOCOPY  ZX_TRD_SERVICES_PUB_PKG.REC_NREC_DIST_TBL_TYPE,
634  p_rnd_begin_index            IN      NUMBER,
635  p_rnd_end_index              IN OUT NOCOPY  NUMBER,
636  p_event_class_rec      IN       ZX_API_PUB.event_class_rec_type,
637  p_return_status              OUT NOCOPY     VARCHAR2,
638  p_error_buffer               OUT NOCOPY     VARCHAR2)
639 IS
640   i          	number;
641   i1		number;
642 
643  l_max_tax_dist_number          NUMBER;
644  l_old_trx_line_dist_id             NUMBER;
645 
646  CURSOR  get_maximum_tax_dist_num_csr (
647                      c_tax_line_id         NUMBER,
648                      c_trx_line_dist_id    NUMBER) IS
649   SELECT max(rec_nrec_tax_dist_number)
650     FROM zx_rec_nrec_dist
651    WHERE tax_line_id = c_tax_line_id
652      AND trx_line_dist_id = c_trx_line_dist_id;
653 
654  Cursor get_tax_distributions_cur IS
655    SELECT * FROM zx_rec_nrec_dist
656    WHERE  trx_id =  p_event_class_rec.trx_id
657      AND  application_id = p_event_class_rec.application_id
658      AND  entity_code = p_event_class_rec.entity_code
659      AND  event_class_code = p_event_class_rec.event_class_code
660      AND  tax_line_id = p_detail_tax_line_tbl(p_tax_line_index).tax_line_id
661      AND  NVL(reverse_flag ,'N') = 'N'
662      AND  freeze_flag = 'Y'
663      ORDER BY trx_line_dist_id;
664 
665 
666 begin
667 
668  g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
669  IF (g_level_procedure >= g_current_runtime_level ) THEN
670     FND_LOG.STRING(g_level_procedure,
671                   'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.cancel_tax_line.BEGIN',
672                   'ZX_TRD_INTERNAL_SERVICES_PVT.cancel_tax_line (+)');
673   END IF;
674 
675  p_return_status:= FND_API.G_RET_STS_SUCCESS;
676  i:= p_rnd_begin_index;
677  l_old_trx_line_dist_id := NULL;
678 
679  OPEN get_tax_distributions_cur;
680 
681  LOOP
682         FETCH get_tax_distributions_cur INTO p_rec_nrec_dist_tbl(i);
683 
684         exit when get_tax_distributions_cur%notfound;
685 
686         p_rec_nrec_dist_tbl(i).reverse_flag:= 'Y';
687 
688         -- bug 6906427
689         --
690         p_rec_nrec_dist_tbl(i).tax_line_number :=
691                        p_detail_tax_line_tbl(p_tax_line_index).tax_line_number;
692 
693 	i1 := i;
694         i:= i1 + 1;
695         p_rec_nrec_dist_tbl(i):= p_rec_nrec_dist_tbl(i1);
696 
697         SELECT zx_rec_nrec_dist_s.NEXTVAL INTO p_rec_nrec_dist_tbl(i).rec_nrec_tax_dist_id FROM DUAL;
698 
699         p_rec_nrec_dist_tbl(i).reversed_tax_dist_id:= p_rec_nrec_dist_tbl(i1).rec_nrec_tax_dist_id;
700 	p_rec_nrec_dist_tbl(i).rec_nrec_tax_amt:= -p_rec_nrec_dist_tbl(i1).rec_nrec_tax_amt;
701 	p_rec_nrec_dist_tbl(i).REC_NREC_TAX_AMT_TAX_CURR:= -p_rec_nrec_dist_tbl(i1).REC_NREC_TAX_AMT_TAX_CURR;
702 	p_rec_nrec_dist_tbl(i).REC_NREC_TAX_AMT_FUNCL_CURR:= -p_rec_nrec_dist_tbl(i1).REC_NREC_TAX_AMT_FUNCL_CURR;
703 	p_rec_nrec_dist_tbl(i).TRX_LINE_DIST_AMT:= -p_rec_nrec_dist_tbl(i1).TRX_LINE_DIST_AMT;
704 	p_rec_nrec_dist_tbl(i).TRX_LINE_DIST_TAX_AMT:= -p_rec_nrec_dist_tbl(i1).TRX_LINE_DIST_TAX_AMT;
705 	p_rec_nrec_dist_tbl(i).TAXABLE_AMT := -p_rec_nrec_dist_tbl(i1).TAXABLE_AMT;
706 	p_rec_nrec_dist_tbl(i).TAXABLE_AMT_TAX_CURR := -p_rec_nrec_dist_tbl(i1).TAXABLE_AMT_TAX_CURR;
707 	p_rec_nrec_dist_tbl(i).TAXABLE_AMT_FUNCL_CURR := -p_rec_nrec_dist_tbl(i1).TAXABLE_AMT_FUNCL_CURR;
708 	p_rec_nrec_dist_tbl(i).ORIG_REC_NREC_TAX_AMT:= -p_rec_nrec_dist_tbl(i1).ORIG_REC_NREC_TAX_AMT;
709 	p_rec_nrec_dist_tbl(i).ORIG_REC_NREC_TAX_AMT_TAX_CURR:= -p_rec_nrec_dist_tbl(i1).ORIG_REC_NREC_TAX_AMT_TAX_CURR;
710 	p_rec_nrec_dist_tbl(i).UNROUNDED_REC_NREC_TAX_AMT:= -p_rec_nrec_dist_tbl(i1).UNROUNDED_REC_NREC_TAX_AMT;
711 	p_rec_nrec_dist_tbl(i).REC_NREC_TAX_DIST_NUMBER:= -p_rec_nrec_dist_tbl(i1).REC_NREC_TAX_DIST_NUMBER;
712         --p_rec_nrec_dist_tbl(i).INVOICE_PRICE_VARIANCE:= -p_rec_nrec_dist_tbl(i1).INVOICE_PRICE_VARIANCE;
713         --p_rec_nrec_dist_tbl(i).BASE_INVOICE_PRICE_VARIANCE:= -p_rec_nrec_dist_tbl(i1).BASE_INVOICE_PRICE_VARIANCE;
714         --p_rec_nrec_dist_tbl(i).EXCHANGE_RATE_VARIANCE:= -p_rec_nrec_dist_tbl(i1).EXCHANGE_RATE_VARIANCE;
715 	p_rec_nrec_dist_tbl(i).freeze_flag := 'N';
716 	p_rec_nrec_dist_tbl(i).posting_flag := 'N';
717 
718         -- bug 6706941: populate gl_date for the reversed tax distribution
719         --
720         p_rec_nrec_dist_tbl(i).gl_date :=
721               AP_UTILITIES_PKG.get_reversal_gl_date(
722                  p_date   => p_rec_nrec_dist_tbl(i1).gl_date,
723                  p_org_id => p_rec_nrec_dist_tbl(i1).internal_organization_id);
724 
725         -- 6881847
726         p_rec_nrec_dist_tbl(i).trx_line_dist_qty := -p_rec_nrec_dist_tbl(i1).trx_line_dist_qty;
727 
728         -- bug 6906427
729         --
730         p_rec_nrec_dist_tbl(i).tax_line_number := p_rec_nrec_dist_tbl(i1).tax_line_number;
731 
732         IF l_old_trx_line_dist_id IS NULL OR
733            l_old_trx_line_dist_id <> p_rec_nrec_dist_tbl(i).trx_line_dist_id
734         THEN
735           -- get the maximum rec_nrec_tax_dist_number
736           --
737           OPEN  get_maximum_tax_dist_num_csr
738                             (p_rec_nrec_dist_tbl(i).tax_line_id,
739                              p_rec_nrec_dist_tbl(i).trx_line_dist_id);
740           FETCH get_maximum_tax_dist_num_csr INTO l_max_tax_dist_number;
741           CLOSE get_maximum_tax_dist_num_csr;
742 
743           l_max_tax_dist_number := NVL(l_max_tax_dist_number, 0);
744           l_old_trx_line_dist_id := p_rec_nrec_dist_tbl(i).trx_line_dist_id;
745 
746         ELSE
747 
748           l_max_tax_dist_number := l_max_tax_dist_number + 1;
749 
750         END IF;
751 
752         p_rec_nrec_dist_tbl(i).rec_nrec_tax_dist_number := l_max_tax_dist_number + 1;
753 
754         i:= i+1;
755 
756     END LOOP;
757 
758     CLOSE get_tax_distributions_cur;
759 
760     p_rnd_end_index:= i-1;
761 
762   IF (g_level_procedure >= g_current_runtime_level ) THEN
763     FND_LOG.STRING(g_level_procedure,
764                   'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.cancel_tax_line.BEGIN',
765                   'ZX_TRD_INTERNAL_SERVICES_PVT.cancel_tax_line (-)');
766   END IF;
767 
768 EXCEPTION
769   WHEN OTHERS THEN
770     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
771     p_error_buffer := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
772 
773     IF (g_level_unexpected >= g_current_runtime_level ) THEN
774       FND_LOG.STRING(g_level_unexpected,
775                      'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.cancel_tax_line',
776                       p_error_buffer);
777       FND_LOG.STRING(g_level_unexpected,
778                     'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.cancel_tax_line.END',
779                     'ZX_TRD_INTERNAL_SERVICES_PVT.cancel_tax_line(-)');
780     END IF;
781 
782 end cancel_tax_line;
783 
784 
785 PROCEDURE det_appl_rec_type(
786  p_detail_tax_line_tbl  IN             zx_trd_services_pub_pkg.tax_line_tbl_type,
787  p_tax_line_index       IN             NUMBER,
788  p_trx_line_dist_index  IN             NUMBER,
789  p_rec_nrec_dist_tbl    IN OUT NOCOPY  zx_trd_services_pub_pkg.rec_nrec_dist_tbl_type,
790  p_rnd_begin_index      IN             NUMBER,
791  p_rnd_end_index           OUT NOCOPY  NUMBER,
792  p_return_status           OUT NOCOPY  VARCHAR2,
793  p_error_buffer            OUT NOCOPY  VARCHAR2)  IS
794 
795  l_tax                              ZX_TAXES_B.tax%TYPE;
796  l_tax_id                           NUMBER;
797  l_tax_apportionment_line_num       NUMBER;
798  l_index                            NUMBER;
799  l_tax_regime_code                  ZX_STATUS_B.tax_regime_code%TYPE;
800  l_rec_nrec_tax_dist_number         NUMBER;
801 
802  CURSOR  get_tax_recovery_info_cur(
803           c_tax_id                  zx_taxes_b.tax_id%TYPE) IS
804   SELECT allow_recoverability_flag,
805          primary_recovery_type_code,
806          primary_rec_type_rule_flag,
807          secondary_recovery_type_code,
808          secondary_rec_type_rule_flag,
809          primary_rec_rate_det_rule_flag,
810          sec_rec_rate_det_rule_flag,
811          def_primary_rec_rate_code,
812          def_secondary_rec_rate_code,
813          effective_from,
814          effective_to,
815          def_rec_settlement_option_code,
816          tax_account_source_tax
817     FROM ZX_TAXES_B
818    WHERE tax_id =  c_tax_id;
819 
820    CURSOR  get_maximum_tax_dist_num_csr is
821    SELECT max(rec_nrec_tax_dist_number)
822    FROM zx_rec_nrec_dist
823    WHERE tax_line_id = p_detail_tax_line_tbl(p_tax_line_index).tax_line_id
824    AND trx_line_dist_id = ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.trx_line_dist_id(
825                                                       p_trx_line_dist_index);
826 
827    l_max_tax_dist_number  NUMBER;
828 
829 BEGIN
830 
831   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
832 
833   IF (g_level_procedure >= g_current_runtime_level ) THEN
834    FND_LOG.STRING(g_level_procedure,
835                   'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.DET_APPL_REC_TYPE.BEGIN',
836                   'ZX_TRD_INTERNAL_SERVICES_PVT.DET_APPL_REC_TYPE(+)');
837   END IF;
838 
839   p_return_status := FND_API.G_RET_STS_SUCCESS;
840 
841   OPEN  get_maximum_tax_dist_num_csr;
842   FETCH get_maximum_tax_dist_num_csr INTO l_max_tax_dist_number;
843   CLOSE get_maximum_tax_dist_num_csr;
844 
845   l_max_tax_dist_number := NVL(l_max_tax_dist_number, 0);
846 
847   l_rec_nrec_tax_dist_number := l_max_tax_dist_number + 1;
848   l_index := p_rnd_begin_index;
849 
850   -- Bug 13147482
851   --IF p_detail_tax_line_tbl(p_tax_line_index).tax_provider_id IS NULL THEN
852 
853     l_tax_id := p_detail_tax_line_tbl(p_tax_line_index).tax_id;
854     l_tax := p_detail_tax_line_tbl(p_tax_line_index).tax;
855     l_tax_regime_code := p_detail_tax_line_tbl(p_tax_line_index).tax_regime_code;
856     l_tax_apportionment_line_num := p_detail_tax_line_tbl(p_tax_line_index).tax_apportionment_line_number;
857 
858     -- for applied_from(prepayment)/adjusted_to(credit memo) document ,
859     --  get the recovery types from applied_from /adjusted_to document.
860     --
861     IF ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.applied_from_application_id(
862                                            p_trx_line_dist_index) IS NOT NULL THEN
863       -- If applied_from_application_id IS NOT NULL,
864       -- get detail tax lines from applied_from document.
865       --
866       get_recovery_from_applied(
867          l_tax_id,
868          l_tax_apportionment_line_num,
869          p_detail_tax_line_tbl(p_tax_line_index).prd_total_tax_amt,
870          p_trx_line_dist_index,
871          p_rec_nrec_dist_tbl,
872          p_rnd_begin_index,
873          p_rnd_end_index,
874          p_return_status,
875          p_error_buffer);
876 
877       IF NVL(p_return_status, FND_API.G_RET_STS_ERROR) <> FND_API.G_RET_STS_SUCCESS
878       THEN
879         IF (g_level_error >= g_current_runtime_level ) THEN
880           FND_LOG.STRING(g_level_error,
881                     'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.det_appl_rec_type',
882                     'Incorrect return_status after calling ' ||
883                     'ZX_TRD_INTERNAL_SERVICES_PVT.get_recovery_from_applied()');
884           FND_LOG.STRING(g_level_error,
885                         'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.det_appl_rec_type.END',
886                         'ZX_TRD_INTERNAL_SERVICES_PVT.det_appl_rec_type(-)'||p_return_status);
887         END IF;
888       END IF;
889       RETURN;
890 
891     ELSIF ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.adjusted_doc_application_id(
892                                                 p_trx_line_dist_index) IS NOT NULL
893     THEN
894       -- If adjusted_to_application_id IS NOT NULL,
895       -- get detail tax lines from adjusted_to document.
896       --
897       get_recovery_from_adjusted(
898          l_tax_id,
899          l_tax_apportionment_line_num,
900          p_trx_line_dist_index,
901          p_rec_nrec_dist_tbl,
902          p_rnd_begin_index,
903          p_rnd_end_index,
904          p_return_status,
905          p_error_buffer);
906 
907       IF NVL(p_return_status, FND_API.G_RET_STS_ERROR) <> FND_API.G_RET_STS_SUCCESS
908       THEN
909         IF (g_level_error >= g_current_runtime_level ) THEN
910           FND_LOG.STRING(g_level_error,
911                     'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.det_appl_rec_type',
912                     'Incorrect return_status after calling ' ||
913                     'ZX_TRD_INTERNAL_SERVICES_PVT.get_recovery_from_adjusted()');
914           FND_LOG.STRING(g_level_error,
915                         'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.det_appl_rec_type.END',
916                         'ZX_TRD_INTERNAL_SERVICES_PVT.det_appl_rec_type(-)'||p_return_status);
917         END IF;
918       END IF;
919 
920       -- return to the calling point, the normal recovery type determination
921       -- process will be skipped.
922       --
923       RETURN;
924     END IF;  -- applied_from_application_id/adjusted_doc_application_id NOT NULL
925 
926     -- Populate tax recovery info cache
927     -- g_tax_recovery_info_tbl
928     --
929 
930     --Bug 13147482
931     IF p_detail_tax_line_tbl(p_tax_line_index).tax_provider_id IS NULL THEN
932 
933     IF NOT g_tax_recovery_info_tbl.EXISTS(l_tax_id) THEN
934 
935       OPEN  get_tax_recovery_info_cur(l_tax_id);
936       FETCH get_tax_recovery_info_cur INTO
937               g_tax_recovery_info_tbl(l_tax_id).allow_recoverability_flag,
938               g_tax_recovery_info_tbl(l_tax_id).primary_recovery_type_code,
939               g_tax_recovery_info_tbl(l_tax_id).primary_rec_type_rule_flag,
940               g_tax_recovery_info_tbl(l_tax_id).secondary_recovery_type_code,
941               g_tax_recovery_info_tbl(l_tax_id).secondary_rec_type_rule_flag,
942               g_tax_recovery_info_tbl(l_tax_id).primary_rec_rate_det_rule_flag,
943               g_tax_recovery_info_tbl(l_tax_id).sec_rec_rate_det_rule_flag,
944               g_tax_recovery_info_tbl(l_tax_id).def_primary_rec_rate_code,
945               g_tax_recovery_info_tbl(l_tax_id).def_secondary_rec_rate_code,
946               g_tax_recovery_info_tbl(l_tax_id).effective_from,
947               g_tax_recovery_info_tbl(l_tax_id).effective_to,
948               g_tax_recovery_info_tbl(l_tax_id).def_rec_settlement_option_code,
949               g_tax_recovery_info_tbl(l_tax_id).tax_account_source_tax;
950 
951       IF get_tax_recovery_info_cur%NOTFOUND THEN
952         p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
953 
954         IF (g_level_procedure >= g_current_runtime_level ) THEN
955           FND_LOG.STRING(g_level_procedure,
956                          'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.DET_APPL_REC_TYPE.END',
957                          'ZX_TRD_INTERNAL_SERVICES_PVT.DET_APPL_REC_TYPE(-)'||'error: can not find tax info for ' || l_tax_id);
958         END IF;
959         CLOSE get_tax_recovery_info_cur;
960         RETURN;
961       END IF;
962 
963       CLOSE get_tax_recovery_info_cur;
964 
965       g_tax_recovery_info_tbl(l_tax_id).tax_regime_code := l_tax_regime_code;
966       g_tax_recovery_info_tbl(l_tax_id).tax := l_tax;
967       g_tax_recovery_info_tbl(l_tax_id).tax_id := l_tax_id;
968 
969     END IF;
970 
971     IF g_tax_recovery_info_tbl(l_tax_id).allow_recoverability_flag = 'Y' THEN
972 
973        p_rec_nrec_dist_tbl(l_index).recoverable_flag:= 'Y';
974        p_rec_nrec_dist_tbl(l_index).recovery_type_code
975            := g_tax_recovery_info_tbl(l_tax_id).primary_recovery_type_code;
976        p_rec_nrec_dist_tbl(l_index).rec_type_rule_flag
977            := g_tax_recovery_info_tbl(l_tax_id).primary_rec_type_rule_flag;
978        p_rec_nrec_dist_tbl(l_index).rec_rate_det_rule_flag
979            := g_tax_recovery_info_tbl(l_tax_id).primary_rec_rate_det_rule_flag;
980        p_rec_nrec_dist_tbl(l_index).rec_nrec_tax_dist_number:= l_rec_nrec_tax_dist_number;
981 
982 
983        l_index:= l_index + 1;
984        l_rec_nrec_tax_dist_number:= l_rec_nrec_tax_dist_number + 1;
985 
986        IF g_tax_recovery_info_tbl(l_tax_id).secondary_recovery_type_code IS NOT NULL THEN
987 
988           p_rec_nrec_dist_tbl(l_index).recoverable_flag:= 'Y';
989           p_rec_nrec_dist_tbl(l_index).recovery_type_code
990               := g_tax_recovery_info_tbl(l_tax_id).secondary_recovery_type_code;
991           p_rec_nrec_dist_tbl(l_index).rec_type_rule_flag
992               := g_tax_recovery_info_tbl(l_tax_id).secondary_rec_type_rule_flag;
993           p_rec_nrec_dist_tbl(l_index).rec_rate_det_rule_flag
994               := g_tax_recovery_info_tbl(l_tax_id).sec_rec_rate_det_rule_flag;
995           p_rec_nrec_dist_tbl(l_index).rec_nrec_tax_dist_number:= l_rec_nrec_tax_dist_number;
996 
997           l_index:= l_index + 1;    --reserved for non-recoverable line
998           l_rec_nrec_tax_dist_number:= l_rec_nrec_tax_dist_number + 1;
999 
1000        END IF;
1001 
1002     ELSE  -- no recovery allowed
1003 
1004      IF (g_level_statement >= g_current_runtime_level ) THEN
1005       FND_LOG.STRING(g_level_statement,
1006                      'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.DET_APPL_REC_TYPE',
1007                      'No applicable recovery type found');
1008      END IF;
1009 
1010     END IF;
1011   ELSE  --provider calculated tax lines should be 100% non-recoverable.
1012     IF (g_level_statement >= g_current_runtime_level ) THEN
1013       FND_LOG.STRING(g_level_statement,
1014                      'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.DET_APPL_REC_TYPE',
1015                      'Provider calculated tax lines are 100% non-recoverable.');
1016     END IF;
1017 
1018   END IF;
1019 
1020  p_rnd_end_index:= l_index;
1021  p_rec_nrec_dist_tbl(l_index).recoverable_flag:= 'N';
1022  p_rec_nrec_dist_tbl(l_index).rec_nrec_tax_dist_number:= l_rec_nrec_tax_dist_number;
1023 
1024  IF (g_level_procedure >= g_current_runtime_level ) THEN
1025 
1026    FND_LOG.STRING(g_level_procedure,
1027                   'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.DET_APPL_REC_TYPE.END',
1028                   'ZX_TRD_INTERNAL_SERVICES_PVT.DET_APPL_REC_TYPE(-)'||
1029                   ' begin index = ' || p_rnd_end_index||
1030                   ' end index = ' || p_rnd_end_index);
1031   END IF;
1032 
1033 EXCEPTION
1034   WHEN OTHERS THEN
1035     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1036     p_error_buffer := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
1037 
1038     IF (g_level_unexpected >= g_current_runtime_level ) THEN
1039       FND_LOG.STRING(g_level_unexpected,
1040                      'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.DET_APPL_REC_TYPE',
1041                       p_error_buffer);
1042       FND_LOG.STRING(g_level_unexpected,
1043                   'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.DET_APPL_REC_TYPE.END',
1044                   'ZX_TRD_INTERNAL_SERVICES_PVT.DET_APPL_REC_TYPE(-)');
1045     END IF;
1046 
1047 END DET_APPL_REC_TYPE;
1048 
1049 PROCEDURE get_tax_related_columns_sta(
1050  p_detail_tax_line_tbl  IN             ZX_TRD_SERVICES_PUB_PKG.tax_line_tbl_type,
1051  p_tax_line_index       IN             NUMBER,
1052  p_trx_line_dist_index  IN             NUMBER,
1053  p_rec_nrec_dist_tbl    IN OUT NOCOPY  ZX_TRD_SERVICES_PUB_PKG.rec_nrec_dist_tbl_type,
1054  p_rnd_begin_index      IN             NUMBER,
1055  p_rnd_end_index        IN             NUMBER,
1056  p_return_status           OUT NOCOPY  VARCHAR2,
1057  p_error_buffer            OUT NOCOPY  VARCHAR2) IS
1058 
1059 BEGIN
1060 
1061   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
1062 
1063   IF (g_level_procedure >= g_current_runtime_level ) THEN
1064     FND_LOG.STRING(g_level_procedure,
1065            'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.GET_TAX_RELATED_COLUMNS_STA.BEGIN',
1066            'ZX_TRD_INTERNAL_SERVICES_PVT.GET_TAX_RELATED_COLUMNS_STA(+)');
1067   END IF;
1068 
1069   p_return_status:= FND_API.G_RET_STS_SUCCESS;
1070 
1071   FOR i IN p_rnd_begin_index..p_rnd_end_index  LOOP
1072 
1073     p_rec_nrec_dist_tbl(i).application_id :=
1074         ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.application_id(p_trx_line_dist_index);
1075 
1076     p_rec_nrec_dist_tbl(i).entity_code :=
1077            ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.entity_code(p_trx_line_dist_index);
1078 
1079     p_rec_nrec_dist_tbl(i).event_class_code :=
1080       ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.event_class_code(p_trx_line_dist_index);
1081 
1082     p_rec_nrec_dist_tbl(i).event_type_code :=
1083        ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.event_type_code(p_trx_line_dist_index);
1084 
1085     p_rec_nrec_dist_tbl(i).tax_event_class_code :=
1086       ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.tax_event_class_code(p_trx_line_dist_index);
1087 
1088     p_rec_nrec_dist_tbl(i).tax_event_type_code :=
1089       ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.tax_event_type_code(p_trx_line_dist_index);
1090 
1091     p_rec_nrec_dist_tbl(i).trx_id :=
1092                 ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.trx_id(p_trx_line_dist_index);
1093 
1094     p_rec_nrec_dist_tbl(i).trx_number :=
1095                               p_detail_tax_line_tbl(p_tax_line_index).trx_number;
1096 
1097     p_rec_nrec_dist_tbl(i).trx_line_id :=
1098                               p_detail_tax_line_tbl(p_tax_line_index).trx_line_id;
1099 
1100     p_rec_nrec_dist_tbl(i).trx_level_type :=
1101                               p_detail_tax_line_tbl(p_tax_line_index).trx_level_type;
1102 
1103     p_rec_nrec_dist_tbl(i).trx_line_number :=
1104                               p_detail_tax_line_tbl(p_tax_line_index).trx_line_number;
1105     p_rec_nrec_dist_tbl(i).trx_line_dist_id :=
1106       ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.trx_line_dist_id(p_trx_line_dist_index);
1107 
1108 
1109     p_rec_nrec_dist_tbl(i).item_dist_number :=
1110       ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.item_dist_number(p_trx_line_dist_index);
1111 
1112 --    need to add later
1113 --    p_rec_nrec_dist_tbl(i).tax_line_dist_number :=
1114 --    ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.tax_line_dist_number(p_trx_line_dist_index);
1115 
1116     p_rec_nrec_dist_tbl(i).content_owner_id :=
1117                               p_detail_tax_line_tbl(p_tax_line_index).content_owner_id;
1118 
1119     p_rec_nrec_dist_tbl(i).ref_doc_application_id :=
1120       ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.ref_doc_application_id(p_trx_line_dist_index);
1121 
1122     p_rec_nrec_dist_tbl(i).ref_doc_entity_code :=
1123          ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.ref_doc_entity_code(p_trx_line_dist_index);
1124 
1125     p_rec_nrec_dist_tbl(i).ref_doc_event_class_code :=
1126       ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.ref_doc_event_class_code(p_trx_line_dist_index);
1127 
1128     p_rec_nrec_dist_tbl(i).ref_doc_trx_id :=
1129         ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.ref_doc_trx_id(p_trx_line_dist_index);
1130 
1131     p_rec_nrec_dist_tbl(i).ref_doc_line_id :=
1132        ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.ref_doc_line_id(p_trx_line_dist_index);
1133 
1134     p_rec_nrec_dist_tbl(i).ref_doc_trx_level_type :=
1135      ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.ref_doc_trx_level_type(p_trx_line_dist_index);
1136 
1137     p_rec_nrec_dist_tbl(i).ref_doc_dist_id :=
1138        ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.ref_doc_dist_id(p_trx_line_dist_index);
1139 
1140 /*
1141     p_rec_nrec_dist_tbl(i).hdr_trx_user_key1 :=
1142        ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.hdr_trx_user_key1(p_trx_line_dist_index);
1143     p_rec_nrec_dist_tbl(i).hdr_trx_user_key2 :=
1144        ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.hdr_trx_user_key2(p_trx_line_dist_index);
1145     p_rec_nrec_dist_tbl(i).hdr_trx_user_key3 :=
1146        ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.hdr_trx_user_key3(p_trx_line_dist_index);
1147     p_rec_nrec_dist_tbl(i).hdr_trx_user_key4 :=
1148        ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.hdr_trx_user_key4(p_trx_line_dist_index);
1149     p_rec_nrec_dist_tbl(i).hdr_trx_user_key5 :=
1150        ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.hdr_trx_user_key5(p_trx_line_dist_index);
1151     p_rec_nrec_dist_tbl(i).hdr_trx_user_key6 :=
1152        ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.hdr_trx_user_key6(p_trx_line_dist_index);
1153     p_rec_nrec_dist_tbl(i).line_trx_user_key1 :=
1154        ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.line_trx_user_key1(p_trx_line_dist_index);
1155     p_rec_nrec_dist_tbl(i).line_trx_user_key2 :=
1156        ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.line_trx_user_key2(p_trx_line_dist_index);
1157     p_rec_nrec_dist_tbl(i).line_trx_user_key3 :=
1158        ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.line_trx_user_key3(p_trx_line_dist_index);
1159     p_rec_nrec_dist_tbl(i).line_trx_user_key4 :=
1160        ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.line_trx_user_key4(p_trx_line_dist_index);
1161     p_rec_nrec_dist_tbl(i).line_trx_user_key5 :=
1162        ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.line_trx_user_key5(p_trx_line_dist_index);
1163     p_rec_nrec_dist_tbl(i).line_trx_user_key6 :=
1164        ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.line_trx_user_key6(p_trx_line_dist_index);
1165     p_rec_nrec_dist_tbl(i).dist_trx_user_key1 :=
1166        ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.dist_trx_user_key1(p_trx_line_dist_index);
1167     p_rec_nrec_dist_tbl(i).dist_trx_user_key2 :=
1168        ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.dist_trx_user_key2(p_trx_line_dist_index);
1169     p_rec_nrec_dist_tbl(i).dist_trx_user_key3 :=
1170        ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.dist_trx_user_key3(p_trx_line_dist_index);
1171     p_rec_nrec_dist_tbl(i).dist_trx_user_key4 :=
1172        ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.dist_trx_user_key4(p_trx_line_dist_index);
1173     p_rec_nrec_dist_tbl(i).dist_trx_user_key5 :=
1174        ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.dist_trx_user_key5(p_trx_line_dist_index);
1175     p_rec_nrec_dist_tbl(i).dist_trx_user_key6 :=
1176        ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.dist_trx_user_key6(p_trx_line_dist_index);
1177 */
1178     p_rec_nrec_dist_tbl(i).tax_regime_id :=
1179                               p_detail_tax_line_tbl(p_tax_line_index).tax_regime_id;
1180 
1181     p_rec_nrec_dist_tbl(i).tax_regime_code :=
1182                             p_detail_tax_line_tbl(p_tax_line_index).tax_regime_code;
1183     p_rec_nrec_dist_tbl(i).tax_id := p_detail_tax_line_tbl(p_tax_line_index).tax_id;
1184     p_rec_nrec_dist_tbl(i).tax := p_detail_tax_line_tbl(p_tax_line_index).tax;
1185 
1186     p_rec_nrec_dist_tbl(i).tax_line_id :=
1187                                 p_detail_tax_line_tbl(p_tax_line_index).tax_line_id;
1188     --Bug 14251332, to fetch tax distributions for adjusted tax lines.
1189     p_rec_nrec_dist_tbl(i).tax_apportionment_line_number :=
1190                                 p_detail_tax_line_tbl(p_tax_line_index).tax_apportionment_line_number;
1191     --Bug 14251332
1192     p_rec_nrec_dist_tbl(i).ledger_id :=
1193                                   p_detail_tax_line_tbl(p_tax_line_index).ledger_id;
1194     p_rec_nrec_dist_tbl(i).record_type_code :=
1195                            p_detail_tax_line_tbl(p_tax_line_index).record_type_code;
1196 
1197     p_rec_nrec_dist_tbl(i).legal_entity_id :=
1198                             p_detail_tax_line_tbl(p_tax_line_index).legal_entity_id;
1199 
1200     p_rec_nrec_dist_tbl(i).mrc_tax_dist_flag :=
1201                             p_detail_tax_line_tbl(p_tax_line_index).mrc_tax_line_flag;
1202 
1203     -- Bug 7117340 -- DFF ER
1204     p_rec_nrec_dist_tbl(i).attribute1         := p_detail_tax_line_tbl(p_tax_line_index).attribute1;
1205     p_rec_nrec_dist_tbl(i).attribute2         := p_detail_tax_line_tbl(p_tax_line_index).attribute2;
1206     p_rec_nrec_dist_tbl(i).attribute3         := p_detail_tax_line_tbl(p_tax_line_index).attribute3;
1207     p_rec_nrec_dist_tbl(i).attribute4         := p_detail_tax_line_tbl(p_tax_line_index).attribute4;
1208     p_rec_nrec_dist_tbl(i).attribute5         := p_detail_tax_line_tbl(p_tax_line_index).attribute5;
1209     p_rec_nrec_dist_tbl(i).attribute6         := p_detail_tax_line_tbl(p_tax_line_index).attribute6;
1210     p_rec_nrec_dist_tbl(i).attribute7         := p_detail_tax_line_tbl(p_tax_line_index).attribute7;
1211     p_rec_nrec_dist_tbl(i).attribute8         := p_detail_tax_line_tbl(p_tax_line_index).attribute8;
1212     p_rec_nrec_dist_tbl(i).attribute9         := p_detail_tax_line_tbl(p_tax_line_index).attribute9;
1213     p_rec_nrec_dist_tbl(i).attribute10        := p_detail_tax_line_tbl(p_tax_line_index).attribute10;
1214     p_rec_nrec_dist_tbl(i).attribute11        := p_detail_tax_line_tbl(p_tax_line_index).attribute11;
1215     p_rec_nrec_dist_tbl(i).attribute12        := p_detail_tax_line_tbl(p_tax_line_index).attribute12;
1216     p_rec_nrec_dist_tbl(i).attribute13        := p_detail_tax_line_tbl(p_tax_line_index).attribute13;
1217     p_rec_nrec_dist_tbl(i).attribute14        := p_detail_tax_line_tbl(p_tax_line_index).attribute14;
1218     p_rec_nrec_dist_tbl(i).attribute15        := p_detail_tax_line_tbl(p_tax_line_index).attribute15;
1219     p_rec_nrec_dist_tbl(i).attribute_category := p_detail_tax_line_tbl(p_tax_line_index).attribute_category;
1220     -- End Bug 7117340 -- DFF ER
1221 
1222     -- IF applied_amt_handling_flag = 'R', copy prd_total_tax_amt,
1223     -- prd_total_tax_amt_tax_curr, prd_total_tax_amt_funcl_curr from zx_lines
1224     --
1225     IF p_rec_nrec_dist_tbl(p_rnd_begin_index).applied_from_tax_dist_id IS NOT NULL THEN
1226 
1227       IF NOT ZX_TDS_UTILITIES_PKG.g_tax_rec_tbl.exists(p_detail_tax_line_tbl(
1228                     p_tax_line_index).tax_id) then
1229 
1230          ZX_TDS_UTILITIES_PKG.populate_tax_cache (
1231                 p_tax_id         => p_detail_tax_line_tbl(p_tax_line_index).tax_id,
1232                 p_return_status  => p_return_status,
1233                 p_error_buffer   => p_error_buffer);
1234       END IF;
1235 
1236 
1237        IF ZX_TDS_UTILITIES_PKG.g_tax_rec_tbl(p_detail_tax_line_tbl(
1238                     p_tax_line_index).tax_id).applied_amt_handling_flag = 'R'
1239        THEN
1240         	p_rec_nrec_dist_tbl(i).prd_total_tax_amt :=
1241                      p_detail_tax_line_tbl(p_tax_line_index).prd_total_tax_amt;
1242       		p_rec_nrec_dist_tbl(i).prd_total_tax_amt_tax_curr :=
1243         	    p_detail_tax_line_tbl(p_tax_line_index).prd_total_tax_amt_tax_curr;
1244       		p_rec_nrec_dist_tbl(i).prd_total_tax_amt_funcl_curr :=
1245           		p_detail_tax_line_tbl(p_tax_line_index).prd_total_tax_amt_funcl_curr;
1246        END IF;
1247 
1248     END IF;
1249 
1250   END LOOP;        -- i in p_rnd_begin_index..p_rnd_end_index
1251 
1252   IF (g_level_procedure >= g_current_runtime_level ) THEN
1253     FND_LOG.STRING(g_level_procedure,
1254            'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.GET_TAX_RELATED_COLUMNS_STA.END',
1255            'ZX_TRD_INTERNAL_SERVICES_PVT.GET_TAX_RELATED_COLUMNS_STA(-)');
1256   END IF;
1257 
1258 EXCEPTION
1259   WHEN OTHERS THEN
1260     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1261     p_error_buffer := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
1262 
1263     IF (g_level_unexpected >= g_current_runtime_level ) THEN
1264       FND_LOG.STRING(g_level_unexpected,
1265              'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.GET_TAX_RELATED_COLUMNS_STA',
1266               p_error_buffer);
1267       FND_LOG.STRING(g_level_unexpected,
1268              'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.GET_TAX_RELATED_COLUMNS_STA.END',
1269              'ZX_TRD_INTERNAL_SERVICES_PVT.GET_TAX_RELATED_COLUMNS_STA(-)');
1270     END IF;
1271 END get_tax_related_columns_sta;
1272 
1273 
1274 PROCEDURE get_tax_related_columns_var(
1275  p_detail_tax_line_tbl  IN             ZX_TRD_SERVICES_PUB_PKG.tax_line_tbl_type,
1276  p_tax_line_index       IN             NUMBER,
1277  p_trx_line_dist_index  IN             NUMBER,
1278  p_rec_nrec_dist_tbl    IN OUT NOCOPY  ZX_TRD_SERVICES_PUB_PKG.rec_nrec_dist_tbl_type,
1279  p_rnd_begin_index      IN             NUMBER,
1280  p_rnd_end_index        IN             NUMBER,
1281  p_return_status           OUT NOCOPY  VARCHAR2,
1282  p_error_buffer            OUT NOCOPY  VARCHAR2) IS
1283 
1284  l_temp_line_amt           NUMBER;
1285  --l_period_name             gl_period_statuses.period_name%TYPE := '';
1286 
1287 BEGIN
1288 
1289   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
1290 
1291   IF (g_level_procedure >= g_current_runtime_level ) THEN
1292    FND_LOG.STRING(g_level_procedure,
1293                   'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.GET_TAX_RELATED_COLUMNS_VAR.BEGIN',
1294                   'ZX_TRD_INTERNAL_SERVICES_PVT.GET_TAX_RELATED_COLUMNS_VAR(+)');
1295   END IF;
1296   p_return_status:= FND_API.G_RET_STS_SUCCESS;
1297 
1298   FOR i in p_rnd_begin_index..p_rnd_end_index
1299   LOOP
1300 
1301     IF NVL(p_rec_nrec_dist_tbl(i).reverse_flag, 'N') <> 'Y' AND
1302        NVL(p_rec_nrec_dist_tbl(i).freeze_flag, 'N') <> 'Y'
1303     THEN
1304       IF (g_level_statement >= g_current_runtime_level ) THEN
1305           FND_LOG.STRING(g_level_statement,
1306                      'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.GET_TAX_RELATED_COLUMNS_VAR',
1307                       'Reverse flag and freeze flag are not Y');
1308       END IF;
1309 
1310 
1311       p_rec_nrec_dist_tbl(i).INTENDED_USE:= ZX_GLOBAL_STRUCTURES_PKG.TRX_LINE_DIST_TBL.LINE_INTENDED_USE(p_trx_line_dist_index);
1312       p_rec_nrec_dist_tbl(i).PROJECT_ID:= ZX_GLOBAL_STRUCTURES_PKG.TRX_LINE_DIST_TBL.PROJECT_ID(p_trx_line_dist_index);
1313       p_rec_nrec_dist_tbl(i).TASK_ID:= ZX_GLOBAL_STRUCTURES_PKG.TRX_LINE_DIST_TBL.TASK_ID(p_trx_line_dist_index);
1314       p_rec_nrec_dist_tbl(i).AWARD_ID:= ZX_GLOBAL_STRUCTURES_PKG.TRX_LINE_DIST_TBL.AWARD_ID(p_trx_line_dist_index);
1315       p_rec_nrec_dist_tbl(i).EXPENDITURE_TYPE:= ZX_GLOBAL_STRUCTURES_PKG.TRX_LINE_DIST_TBL.EXPENDITURE_TYPE(p_trx_line_dist_index);
1316       p_rec_nrec_dist_tbl(i).EXPENDITURE_ORGANIZATION_ID:= ZX_GLOBAL_STRUCTURES_PKG.TRX_LINE_DIST_TBL.EXPENDITURE_ORGANIZATION_ID(p_trx_line_dist_index);
1317       p_rec_nrec_dist_tbl(i).EXPENDITURE_ITEM_DATE:= ZX_GLOBAL_STRUCTURES_PKG.TRX_LINE_DIST_TBL.EXPENDITURE_ITEM_DATE(p_trx_line_dist_index);
1318       p_rec_nrec_dist_tbl(i).ACCOUNT_CCID:= ZX_GLOBAL_STRUCTURES_PKG.TRX_LINE_DIST_TBL.ACCOUNT_CCID(p_trx_line_dist_index);
1319       p_rec_nrec_dist_tbl(i).ACCOUNT_STRING:= ZX_GLOBAL_STRUCTURES_PKG.TRX_LINE_DIST_TBL.ACCOUNT_STRING(p_trx_line_dist_index);
1320 
1321       p_rec_nrec_dist_tbl(i).TRX_LINE_DIST_AMT := ZX_GLOBAL_STRUCTURES_PKG.TRX_LINE_DIST_TBL.TRX_LINE_DIST_AMT(p_trx_line_dist_index);
1322       p_rec_nrec_dist_tbl(i).TRX_LINE_DIST_QTY := ZX_GLOBAL_STRUCTURES_PKG.TRX_LINE_DIST_TBL.TRX_LINE_DIST_QUANTITY(p_trx_line_dist_index);
1323       --p_rec_nrec_dist_tbl(i).GL_DATE := ZX_GLOBAL_STRUCTURES_PKG.TRX_LINE_DIST_TBL.TRX_LINE_GL_DATE(p_trx_line_dist_index);  -- copy gl date
1324 
1325       /*AP_UTILITIES_PKG.get_open_gl_date(ZX_GLOBAL_STRUCTURES_PKG.TRX_LINE_DIST_TBL.TRX_LINE_GL_DATE(p_trx_line_dist_index),
1326                                         l_period_name,
1327                                         p_rec_nrec_dist_tbl(i).GL_DATE,
1328                                         ZX_GLOBAL_STRUCTURES_PKG.TRX_LINE_DIST_TBL.INTERNAL_ORGANIZATION_ID(p_trx_line_dist_index));
1329 
1330       IF p_rec_nrec_dist_tbl(i).GL_DATE IS NULL THEN
1331 
1332 	      p_return_status := FND_API.G_RET_STS_ERROR;
1333         FND_MESSAGE.SET_NAME('SQLAP', 'AP_CANCEL_NO_OPEN_FUT_PERIOD');
1334         FND_MESSAGE.SET_TOKEN('DATE', to_char(ZX_GLOBAL_STRUCTURES_PKG.TRX_LINE_DIST_TBL.TRX_LINE_GL_DATE(p_trx_line_dist_index), 'dd-mon-yyyy'));
1335 
1336 	      ZX_TDS_CALC_SERVICES_PUB_PKG.g_msg_context_info_rec.trx_line_id := p_detail_tax_line_tbl(p_tax_line_index).trx_line_id;
1337         ZX_TDS_CALC_SERVICES_PUB_PKG.g_msg_context_info_rec.trx_level_type := p_detail_tax_line_tbl(p_tax_line_index).trx_level_type;
1338         ZX_TDS_CALC_SERVICES_PUB_PKG.g_msg_context_info_rec.tax_line_id := p_detail_tax_line_tbl(p_tax_line_index).tax_line_id;
1339         ZX_TDS_CALC_SERVICES_PUB_PKG.g_msg_context_info_rec.trx_line_dist_id := p_rec_nrec_dist_tbl(i).trx_line_dist_id;
1340         ZX_API_PUB.add_msg(ZX_TDS_CALC_SERVICES_PUB_PKG.g_msg_context_info_rec);
1341 
1342 	      IF (g_level_statement >= g_current_runtime_level ) THEN
1343           FND_LOG.STRING(g_level_statement,
1344                      'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.GET_TAX_RELATED_COLUMNS_VAR',
1345                       'No Open Period or future period found for the accounting date passed by Payables');
1346           FND_LOG.STRING(g_level_statement,
1347                    'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.GET_TAX_RELATED_COLUMNS_VAR.END',
1348                    'ZX_TRD_INTERNAL_SERVICES_PVT.GET_TAX_RELATED_COLUMNS_VAR(-)');
1349         END IF;
1350 	      RETURN;
1351       END IF;*/
1352 
1353       -- tax only line
1354       IF p_rec_nrec_dist_tbl(i).Tax_Only_Line_Flag = 'Y' THEN
1355         IF (g_level_statement >= g_current_runtime_level ) THEN
1356           FND_LOG.STRING(g_level_statement,
1357                      'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.GET_TAX_RELATED_COLUMNS_VAR',
1358                       'Tax only line flag is Y');
1359         END IF;
1360 
1361    	    p_rec_nrec_dist_tbl(i).TRX_LINE_DIST_TAX_AMT := p_detail_tax_line_tbl(p_tax_line_index).TAX_AMT;
1362       	p_rec_nrec_dist_tbl(i).UNROUNDED_TAXABLE_AMT := p_detail_tax_line_tbl(p_tax_line_index).TAXABLE_AMT;
1363      ELSE
1364         IF (g_level_statement >= g_current_runtime_level ) THEN
1365           FND_LOG.STRING(g_level_statement,
1366                      'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.GET_TAX_RELATED_COLUMNS_VAR',
1367                       'Tax only line flag is not Y');
1368         END IF;
1369 
1370         IF p_detail_tax_line_tbl(p_tax_line_index).applied_from_event_class_code = 'PREPAYMENT INVOICES' THEN
1371           IF (g_level_statement >= g_current_runtime_level ) THEN
1372             FND_LOG.STRING(g_level_statement,
1373                      'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.GET_TAX_RELATED_COLUMNS_VAR',
1374                       'Prepayment Invoice application');
1375           END IF;
1376           l_temp_line_amt := p_detail_tax_line_tbl(p_tax_line_index).line_amt -
1377                              NVL(ZX_GLOBAL_STRUCTURES_PKG.TRX_LINE_DIST_TBL.total_inc_tax_amt(p_trx_line_dist_index), 0);
1378 
1379         ELSE
1380           -- bug 5019399
1381 	        -- bug 6670955
1382           l_temp_line_amt := p_detail_tax_line_tbl(p_tax_line_index).line_amt;
1383           --NVL(ZX_GLOBAL_STRUCTURES_PKG.TRX_LINE_DIST_TBL.total_inc_tax_amt(p_trx_line_dist_index), 0);
1384         END IF;
1385 
1386         IF l_temp_line_amt <> 0 THEN   -- Bug 4932210, 5019399
1387 
1388           --Bug 15866615, use unrounded_tax_amt to stamp trx_line_dist_tax_amt so that unrounded_rec_nrec_tax_amt is correctly generated
1389           p_rec_nrec_dist_tbl(i).TRX_LINE_DIST_TAX_AMT :=
1390            NVL(p_detail_tax_line_tbl(p_tax_line_index).UNROUNDED_TAX_AMT, p_detail_tax_line_tbl(p_tax_line_index).TAX_AMT) *
1391            ZX_GLOBAL_STRUCTURES_PKG.TRX_LINE_DIST_TBL.TRX_LINE_DIST_AMT(p_trx_line_dist_index) /l_temp_line_amt;
1392 
1393           -- comment out for bug 3795178
1394           /*ZX_GLOBAL_STRUCTURES_PKG.TRX_LINE_DIST_TBL.TRX_LINE_DIST_QUANTITY(p_trx_line_dist_index) /
1395            ZX_GLOBAL_STRUCTURES_PKG.TRX_LINE_DIST_TBL.TRX_LINE_QUANTITY(p_trx_line_dist_index); */
1396 
1397           p_rec_nrec_dist_tbl(i).UNROUNDED_TAXABLE_AMT :=
1398            p_detail_tax_line_tbl(p_tax_line_index).TAXABLE_AMT *
1399            ZX_GLOBAL_STRUCTURES_PKG.TRX_LINE_DIST_TBL.TRX_LINE_DIST_AMT(p_trx_line_dist_index) /l_temp_line_amt;
1400 
1401           -- comment out for bug 3795178
1402           /*ZX_GLOBAL_STRUCTURES_PKG.TRX_LINE_DIST_TBL.TRX_LINE_DIST_QUANTITY(p_trx_line_dist_index) /
1403            ZX_GLOBAL_STRUCTURES_PKG.TRX_LINE_DIST_TBL.TRX_LINE_QUANTITY(p_trx_line_dist_index); */
1404 
1405         ELSE
1406           -- Bug 5195602: For reversed item distributions, line_amt is 0,
1407           -- but TRX_LINE_DIST_AMT might not be 0.
1408           --
1409           --Bug 15866615
1410           p_rec_nrec_dist_tbl(i).trx_line_dist_tax_amt :=
1411                               NVL(p_detail_tax_line_tbl(p_tax_line_index).unrounded_tax_amt,p_detail_tax_line_tbl(p_tax_line_index).tax_amt);
1412           p_rec_nrec_dist_tbl(i).unrounded_taxable_amt := p_detail_tax_line_tbl(p_tax_line_index).taxable_amt;
1413 
1414         END IF;
1415       END IF;
1416 
1417       p_rec_nrec_dist_tbl(i).TAX_RATE_ID:= p_detail_tax_line_tbl(p_tax_line_index).TAX_RATE_ID;
1418       p_rec_nrec_dist_tbl(i).TAX_RATE_CODE:= p_detail_tax_line_tbl(p_tax_line_index).TAX_RATE_CODE;
1419       p_rec_nrec_dist_tbl(i).TAX_RATE:= p_detail_tax_line_tbl(p_tax_line_index).TAX_RATE;
1420       p_rec_nrec_dist_tbl(i).Inclusive_Flag:= p_detail_tax_line_tbl(p_tax_line_index).Tax_Amt_Included_Flag;
1421       -- bug#6709478
1422       --p_rec_nrec_dist_tbl(i).SUMMARY_TAX_LINE_ID:= p_detail_tax_line_tbl(p_tax_line_index).SUMMARY_TAX_LINE_ID;
1423       p_rec_nrec_dist_tbl(i).CURRENCY_CONVERSION_DATE:= p_detail_tax_line_tbl(p_tax_line_index).CURRENCY_CONVERSION_DATE;
1424       p_rec_nrec_dist_tbl(i).CURRENCY_CONVERSION_TYPE:= p_detail_tax_line_tbl(p_tax_line_index).CURRENCY_CONVERSION_TYPE;
1425       p_rec_nrec_dist_tbl(i).CURRENCY_CONVERSION_RATE:= p_detail_tax_line_tbl(p_tax_line_index).CURRENCY_CONVERSION_RATE;
1426       p_rec_nrec_dist_tbl(i).TAX_CURRENCY_CONVERSION_DATE:= p_detail_tax_line_tbl(p_tax_line_index).TAX_CURRENCY_CONVERSION_DATE;
1427       p_rec_nrec_dist_tbl(i).TAX_CURRENCY_CONVERSION_TYPE:= p_detail_tax_line_tbl(p_tax_line_index).TAX_CURRENCY_CONVERSION_TYPE;
1428       p_rec_nrec_dist_tbl(i).TAX_CURRENCY_CONVERSION_RATE:= p_detail_tax_line_tbl(p_tax_line_index).TAX_CURRENCY_CONVERSION_RATE;
1429       p_rec_nrec_dist_tbl(i).MINIMUM_ACCOUNTABLE_UNIT:= p_detail_tax_line_tbl(p_tax_line_index).MINIMUM_ACCOUNTABLE_UNIT;
1430       p_rec_nrec_dist_tbl(i).PRECISION:= p_detail_tax_line_tbl(p_tax_line_index).PRECISION;
1431       p_rec_nrec_dist_tbl(i).Rounding_Rule_Code:= p_detail_tax_line_tbl(p_tax_line_index).ROUNDING_RULE_CODE;
1432       p_rec_nrec_dist_tbl(i).TAX_STATUS_ID:= p_detail_tax_line_tbl(p_tax_line_index).TAX_STATUS_ID;
1433       p_rec_nrec_dist_tbl(i).TAX_STATUS_CODE:= p_detail_tax_line_tbl(p_tax_line_index).TAX_STATUS_CODE;
1434       p_rec_nrec_dist_tbl(i).TRX_CURRENCY_CODE:= p_detail_tax_line_tbl(p_tax_line_index).TRX_CURRENCY_CODE;
1435       p_rec_nrec_dist_tbl(i).TAX_CURRENCY_CODE:= p_detail_tax_line_tbl(p_tax_line_index).TAX_CURRENCY_CODE;
1436       p_rec_nrec_dist_tbl(i).unit_price:= p_detail_tax_line_tbl(p_tax_line_index).unit_price;
1437       p_rec_nrec_dist_tbl(i).self_assessed_flag := p_detail_tax_line_tbl(p_tax_line_index).self_assessed_flag;
1438       p_rec_nrec_dist_tbl(i).tax_only_line_flag := p_detail_tax_line_tbl(p_tax_line_index).tax_only_line_flag;
1439 
1440       -- bug 5508356
1441       p_rec_nrec_dist_tbl(i).internal_organization_id := p_detail_tax_line_tbl(p_tax_line_index).internal_organization_id;
1442       p_rec_nrec_dist_tbl(i).tax_jurisdiction_id := p_detail_tax_line_tbl(p_tax_line_index).tax_jurisdiction_id;
1443 
1444       -- bug 6879755
1445       IF ZX_GLOBAL_STRUCTURES_PKG.TRX_LINE_DIST_TBL.APPLICATION_ID(p_trx_line_dist_index) = 200 THEN
1446       BEGIN
1447         IF p_rec_nrec_dist_tbl(i).orig_gl_date IS NOT NULL THEN
1448           p_rec_nrec_dist_tbl(i).gl_date :=
1449               AP_UTILITIES_PKG.get_reversal_gl_date(
1450                  p_date   => p_rec_nrec_dist_tbl(i).gl_date,
1451                  p_org_id => ZX_GLOBAL_STRUCTURES_PKG.TRX_LINE_DIST_TBL.INTERNAL_ORGANIZATION_ID(p_trx_line_dist_index));
1452         ELSE
1453           p_rec_nrec_dist_tbl(i).gl_date :=
1454               AP_UTILITIES_PKG.get_reversal_gl_date(
1455                  p_date   => ZX_GLOBAL_STRUCTURES_PKG.TRX_LINE_DIST_TBL.TRX_LINE_GL_DATE(p_trx_line_dist_index),
1456                  p_org_id => ZX_GLOBAL_STRUCTURES_PKG.TRX_LINE_DIST_TBL.INTERNAL_ORGANIZATION_ID(p_trx_line_dist_index));
1457         END IF;
1458       EXCEPTION
1459         WHEN OTHERS THEN
1460         IF nvl(ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.tax_reporting_flag(p_trx_line_dist_index),'N') = 'Y' THEN
1461           p_return_status := FND_API.G_RET_STS_ERROR;
1462           FND_MESSAGE.SET_NAME('SQLAP', 'AP_CANCEL_NO_OPEN_FUT_PERIOD');
1463           FND_MESSAGE.SET_TOKEN('DATE', to_char(ZX_GLOBAL_STRUCTURES_PKG.TRX_LINE_DIST_TBL.TRX_LINE_GL_DATE(p_trx_line_dist_index), 'dd-mon-yyyy'));
1464 
1465 	        ZX_TDS_CALC_SERVICES_PUB_PKG.g_msg_context_info_rec.trx_line_id := p_detail_tax_line_tbl(p_tax_line_index).trx_line_id;
1466           ZX_TDS_CALC_SERVICES_PUB_PKG.g_msg_context_info_rec.trx_level_type := p_detail_tax_line_tbl(p_tax_line_index).trx_level_type;
1467           ZX_TDS_CALC_SERVICES_PUB_PKG.g_msg_context_info_rec.tax_line_id := p_detail_tax_line_tbl(p_tax_line_index).tax_line_id;
1468           ZX_TDS_CALC_SERVICES_PUB_PKG.g_msg_context_info_rec.trx_line_dist_id := p_rec_nrec_dist_tbl(i).trx_line_dist_id;
1469           ZX_API_PUB.add_msg(ZX_TDS_CALC_SERVICES_PUB_PKG.g_msg_context_info_rec);
1470 
1471 	        IF (g_level_statement >= g_current_runtime_level ) THEN
1472             FND_LOG.STRING(g_level_statement,
1473                      'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.GET_TAX_RELATED_COLUMNS_VAR',
1474                       'No Open Period or future period found for the accounting date passed by Payables');
1475             FND_LOG.STRING(g_level_statement,
1476                    'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.GET_TAX_RELATED_COLUMNS_VAR.END',
1477                    'ZX_TRD_INTERNAL_SERVICES_PVT.GET_TAX_RELATED_COLUMNS_VAR(-)');
1478           END IF;
1479 	        RETURN;
1480         END IF;
1481       END;
1482       ELSIF ZX_GLOBAL_STRUCTURES_PKG.TRX_LINE_DIST_TBL.APPLICATION_ID(p_trx_line_dist_index) = 201 THEN
1483 
1484       p_rec_nrec_dist_tbl(i).gl_date :=
1485            ZX_GLOBAL_STRUCTURES_PKG.TRX_LINE_DIST_TBL.TRX_LINE_GL_DATE(p_trx_line_dist_index);
1486 
1487     END IF;
1488 
1489       IF nvl(ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.tax_reporting_flag(p_trx_line_dist_index),'N') = 'Y' THEN
1490         IF p_rec_nrec_dist_tbl(i).GL_DATE IS NULL THEN
1491 
1492           p_return_status := FND_API.G_RET_STS_ERROR;
1493           FND_MESSAGE.SET_NAME('SQLAP', 'AP_CANCEL_NO_OPEN_FUT_PERIOD');
1494           FND_MESSAGE.SET_TOKEN('DATE', to_char(ZX_GLOBAL_STRUCTURES_PKG.TRX_LINE_DIST_TBL.TRX_LINE_GL_DATE(p_trx_line_dist_index), 'dd-mon-yyyy'));
1495 
1496 	  ZX_TDS_CALC_SERVICES_PUB_PKG.g_msg_context_info_rec.trx_line_id := p_detail_tax_line_tbl(p_tax_line_index).trx_line_id;
1497           ZX_TDS_CALC_SERVICES_PUB_PKG.g_msg_context_info_rec.trx_level_type := p_detail_tax_line_tbl(p_tax_line_index).trx_level_type;
1498           ZX_TDS_CALC_SERVICES_PUB_PKG.g_msg_context_info_rec.tax_line_id := p_detail_tax_line_tbl(p_tax_line_index).tax_line_id;
1499           ZX_TDS_CALC_SERVICES_PUB_PKG.g_msg_context_info_rec.trx_line_dist_id := p_rec_nrec_dist_tbl(i).trx_line_dist_id;
1500           ZX_API_PUB.add_msg(ZX_TDS_CALC_SERVICES_PUB_PKG.g_msg_context_info_rec);
1501 
1502           IF (g_level_statement >= g_current_runtime_level ) THEN
1503             FND_LOG.STRING(g_level_statement,
1504                      'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.GET_TAX_RELATED_COLUMNS_VAR',
1505                       'No Open Period or future period found for the accounting date passed by Payables');
1506             FND_LOG.STRING(g_level_statement,
1507                    'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.GET_TAX_RELATED_COLUMNS_VAR.END',
1508                    'ZX_TRD_INTERNAL_SERVICES_PVT.GET_TAX_RELATED_COLUMNS_VAR(-)');
1509           END IF;
1510 	RETURN;
1511        END IF;
1512       END IF;
1513 
1514     END IF;    -- reverse_flag, 'N') <> 'Y' AND  freeze_flag <> 'Y'
1515 
1516     -- bug#6709478 : populate summary tax line id from detail tax line
1517     p_rec_nrec_dist_tbl(i).summary_tax_line_id := p_detail_tax_line_tbl(p_tax_line_index).summary_tax_line_id;
1518     p_rec_nrec_dist_tbl(i).tax_line_number := p_detail_tax_line_tbl(p_tax_line_index).tax_line_number;
1519 
1520   END LOOP;
1521 
1522   IF (g_level_procedure >= g_current_runtime_level ) THEN
1523     FND_LOG.STRING(g_level_procedure,
1524                    'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.GET_TAX_RELATED_COLUMNS_VAR.END',
1525                    'ZX_TRD_INTERNAL_SERVICES_PVT.GET_TAX_RELATED_COLUMNS_VAR(-)');
1526   END IF;
1527 
1528 EXCEPTION
1529   WHEN OTHERS THEN
1530     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1531     p_error_buffer := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
1532 
1533     IF (g_level_unexpected >= g_current_runtime_level ) THEN
1534       FND_LOG.STRING(g_level_unexpected,
1535                      'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.GET_TAX_RELATED_COLUMNS_VAR',
1536                       p_error_buffer);
1537       FND_LOG.STRING(g_level_unexpected,
1538                    'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.GET_TAX_RELATED_COLUMNS_VAR.END',
1539                    'ZX_TRD_INTERNAL_SERVICES_PVT.GET_TAX_RELATED_COLUMNS_VAR(-)');
1540     END IF;
1541 
1542 END GET_TAX_RELATED_COLUMNS_VAR;
1543 
1544 
1545 PROCEDURE get_rec_rate(
1546  p_detail_tax_line_tbl  IN             ZX_TRD_SERVICES_PUB_PKG.tax_line_tbl_type,
1547  p_tax_line_index       IN             NUMBER,
1548  p_trx_line_dist_index  IN             NUMBER,
1549  p_event_class_rec      IN             ZX_API_PUB.event_class_rec_type,
1550  p_rec_nrec_dist_tbl    IN OUT NOCOPY  ZX_TRD_SERVICES_PUB_PKG.rec_nrec_dist_tbl_type,
1551  p_rnd_begin_index      IN             NUMBER,
1552  p_rnd_end_index        IN OUT NOCOPY  NUMBER,
1553  p_return_status           OUT NOCOPY  VARCHAR2,
1554  p_error_buffer            OUT NOCOPY  VARCHAR2) IS
1555 
1556  l_rec_rule_code           VARCHAR2(30);
1557  l_rec_type_code           VARCHAR2(30);
1558  l_rec_rate_id             NUMBER;
1559  l_tax_rate_id             NUMBER;
1560  l_tax_id                  NUMBER;
1561  l_non_rec_index           NUMBER;
1562  l_rec_rate                NUMBER;
1563  l_total_rec_rate          NUMBER;
1564  l_tax_determine_date      DATE;
1565  l_tax_date                DATE;
1566  l_rec_rate_code           ZX_RATES_B.TAX_RATE_CODE%TYPE;
1567  l_tax                     ZX_TAXES_B.tax%TYPE;
1568  l_tax_regime_code         ZX_STATUS_B.tax_regime_code%TYPE;
1569  l_tax_status_code         ZX_STATUS_B.tax_status_code%TYPE;
1570  l_content_owner_id        ZX_RATES_B.content_owner_id%TYPE;  -- Added for Bug#14038095 --
1571  l_tax_jurisdiction_code   ZX_RATES_B.tax_jurisdiction_code%TYPE;
1572  l_tax_rate_code           ZX_RATES_B.tax_rate_code%TYPE;
1573  l_def_rec_rate_code       ZX_RATES_B.tax_rate_code%TYPE;     -- Added for Bug#5395277 --
1574  l_tax_class               ZX_RATES_B.tax_class%TYPE;
1575  l_acct_source_tax_rate_id ZX_RATES_B.tax_rate_id%TYPE;
1576  l_def_rec_settlement_code ZX_RATES_B.def_rec_settlement_option_code%TYPE;
1577  l_def_rec_type_code       ZX_RATES_B.recovery_type_code%TYPE;
1578  l_zx_result_rec           ZX_PROCESS_RESULTS%ROWTYPE;
1579  l_tbl_index               BINARY_INTEGER;
1580  l_rec_rate_adhoc_flag     VARCHAR2(1);
1581 
1582   -- Commented for Bug#5395227
1583   -- CURSOR get_rec_rule_code_csr(
1584   --         c_tax_regime_code       ZX_STATUS_B.tax_regime_code%TYPE,
1585   --         c_tax                   ZX_STATUS_B.tax%TYPE,
1586   --         c_tax_status_code       ZX_STATUS_B.tax_status_code%TYPE,
1587   --         c_tax_rate_code         VARCHAR2,
1588   --         c_tax_date              DATE) IS
1589   -- SELECT recovery_rule_code
1590   --   FROM ZX_SCO_RATES_B_V
1591   --  WHERE tax_regime_code = c_tax_regime_code
1592   --    AND tax = c_tax
1593   --    AND tax_status_code = c_tax_status_code
1594   --    AND tax_rate_code = c_tax_rate_code
1595   --    AND active_flag   = 'Y'
1596   --    AND rate_type_code <> 'RECOVERY'
1597   --    AND effective_from <= c_tax_date
1598   --    AND (effective_to >= c_tax_date OR effective_to IS NULL)
1599   --    --AND rownum = 1
1600   --  ORDER BY subscription_level_code;
1601 
1602   -- Commented for Bug#5395227 - use get_rec_info_csr
1603   -- CURSOR get_def_rec_rate_from_rate_csr(
1604   --         c_tax_status_code       ZX_STATUS_B.tax_status_code%TYPE,
1605   --         c_tax                   ZX_STATUS_B.tax%TYPE,
1606   --         c_tax_regime_code       ZX_STATUS_B.tax_regime_code%TYPE,
1607   --         c_tax_date              DATE,
1608   --         c_recovery_type_code    zx_rates_b.default_rec_type_code%TYPE,
1609   --         c_tax_rate_code         zx_rates_b.tax_rate_code%TYPE) IS
1610   -- SELECT default_rec_rate_code
1611   --   FROM ZX_SCO_RATES_B_V  rate
1612   --  WHERE rate.effective_from <= c_tax_date
1613   --    AND (rate.effective_to >= c_tax_date  OR  rate.effective_to IS NULL)
1614   --    AND rate.tax_rate_code = c_tax_rate_code
1615   --    AND rate.tax_status_code = c_tax_status_code
1616   --    AND rate.tax = c_tax
1617   --    AND rate.active_flag = 'Y'
1618   --    AND rate_type_code <> 'RECOVERY'
1619   --    AND rate.default_rec_type_code = c_recovery_type_code
1620   --    AND rate.tax_regime_code = c_tax_regime_code
1621   --    --AND rownum = 1
1622   --  ORDER BY rate.subscription_level_code;
1623 
1624   -- Bug#5395227- replace above cursor
1625   --
1626   CURSOR get_rec_info_csr(
1627           c_tax_rate_id       ZX_RATES_B.tax_rate_id%TYPE) IS
1628   SELECT recovery_rule_code,
1629          default_rec_rate_code,
1630          def_rec_settlement_option_code,
1631          default_rec_type_code
1632     FROM ZX_RATES_B
1633    WHERE tax_rate_id = c_tax_rate_id;
1634 
1635   CURSOR get_rec_rate_csr(
1636           c_tax                   ZX_STATUS_B.tax%TYPE,
1637           c_tax_regime_code       ZX_STATUS_B.tax_regime_code%TYPE,
1638           c_tax_date              DATE,
1639           c_recovery_type_code    ZX_RATES_B.recovery_type_code%TYPE,
1640           c_tax_class             ZX_RATES_B.tax_class%TYPE,
1641           c_tax_rate_code         ZX_RATES_B.tax_rate_code%TYPE) IS
1642   SELECT tax_rate_id,
1643          percentage_rate,
1644          allow_adhoc_tax_rate_flag
1645     FROM ZX_SCO_RATES_B_V
1646    WHERE tax_regime_code = c_tax_regime_code
1647      AND tax = c_tax
1648      AND tax_rate_code = c_tax_rate_code
1649      AND rate_type_code = 'RECOVERY'
1650      AND recovery_type_code = c_recovery_type_code
1651      AND active_flag = 'Y'
1652      AND (tax_class = c_tax_class or tax_class IS NULL)
1653      AND effective_from <= c_tax_date
1654      AND (effective_to >= c_tax_date OR effective_to IS NULL)
1655    ORDER BY tax_class NULLS LAST, subscription_level_code;
1656 
1657   CURSOR get_def_rec_rate_from_type_csr(
1658           c_tax                 ZX_STATUS_B.tax%TYPE,
1659           c_tax_regime_code     ZX_STATUS_B.tax_regime_code%TYPE,
1660           c_tax_date            DATE,
1661           c_tax_class           ZX_RATES_B.tax_class%TYPE,
1662           c_recovery_type_code  ZX_RATES_B.recovery_type_code%TYPE) IS
1663   SELECT rate.tax_rate_id,
1664          rate.tax_rate_code,
1665          rate.percentage_rate,
1666          rate.allow_adhoc_tax_rate_flag
1667     FROM ZX_SCO_RATES_B_V  rate
1668    WHERE tax = c_tax
1669      AND tax_regime_code = c_tax_regime_code
1670      AND active_flag = 'Y'
1671      AND default_flg_effective_from <= c_tax_date
1672      AND (default_flg_effective_to >= c_tax_date OR
1673           default_flg_effective_to IS NULL)
1674      AND rate_type_code = 'RECOVERY'
1675      AND rate.recovery_type_code = c_recovery_type_code
1676      AND (rate.tax_class = c_tax_class or rate.tax_class IS NULL)
1677      AND default_rate_flag = 'Y'
1678    ORDER BY rate.tax_class NULLS LAST, rate.subscription_level_code;
1679 
1680   CURSOR get_tax_rec_info_from_tax_csr(
1681           c_tax_id                  ZX_TAXES_B.tax_id%TYPE) IS
1682   SELECT allow_recoverability_flag,
1683          primary_recovery_type_code,
1684          primary_rec_type_rule_flag,
1685          secondary_recovery_type_code,
1686          secondary_rec_type_rule_flag,
1687          primary_rec_rate_det_rule_flag,
1688          sec_rec_rate_det_rule_flag,
1689          def_primary_rec_rate_code,
1690          def_secondary_rec_rate_code,
1691          effective_from,
1692          effective_to,
1693          def_rec_settlement_option_code,
1694          tax_account_source_tax
1695     FROM ZX_TAXES_B
1696    WHERE tax_id =  c_tax_id;
1697 
1698   -- Added for Bug#5508356
1699   CURSOR get_tax_account_entity_id_csr(
1700           c_recovery_rate_id      zx_rec_nrec_dist.recovery_rate_id%TYPE,
1701           c_ledger_id             zx_rec_nrec_dist.ledger_id%TYPE,
1702           c_internal_org_id       zx_rec_nrec_dist.internal_organization_id%TYPE) IS
1703   SELECT tax_account_entity_id
1704     FROM zx_accounts
1705    WHERE  tax_account_entity_id = c_recovery_rate_id
1706      AND  tax_account_entity_code = 'RATES'
1707      AND  ledger_id = c_ledger_id
1708      AND  internal_organization_id = c_internal_org_id;
1709 
1710   -- Added for Bug#14038095 --
1711   CURSOR get_adhoc_rec_rate_id_csr(
1712           c_tax                   ZX_RATES_B.tax%TYPE,
1713           c_tax_regime_code       ZX_RATES_B.tax_regime_code%TYPE,
1714           c_content_owner_id      ZX_RATES_B.content_owner_id%TYPE,
1715           c_tax_class             ZX_RATES_B.tax_class%TYPE) IS
1716   SELECT tax_rate_id
1717     FROM zx_rates_b
1718    WHERE tax = c_tax
1719      AND tax_regime_code = c_tax_regime_code
1720      AND content_owner_id IN (c_content_owner_id,-99)
1721      AND tax_rate_code = 'AD_HOC_RECOVERY'
1722      AND rate_type_code = 'RECOVERY'
1723      AND recovery_type_code = 'STANDARD'
1724      AND record_type_code = 'MIGRATED'
1725      AND active_flag = 'Y'
1726      AND (tax_class = c_tax_class OR tax_class IS NULL)
1727    ORDER BY tax_class NULLS LAST, content_owner_id DESC;
1728 
1729 BEGIN
1730 
1731   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
1732 
1733   IF (g_level_procedure >= g_current_runtime_level ) THEN
1734     FND_LOG.STRING(g_level_procedure,
1735                   'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_rec_rate.BEGIN',
1736                   'ZX_TRD_INTERNAL_SERVICES_PVT.get_rec_rate(+)');
1737   END IF;
1738 
1739   p_return_status:= FND_API.G_RET_STS_SUCCESS;
1740 
1741   l_tax_id:= p_detail_tax_line_tbl(p_tax_line_index).tax_id;
1742   l_tax := p_detail_tax_line_tbl(p_tax_line_index).tax;
1743   l_tax_regime_code := p_detail_tax_line_tbl(p_tax_line_index).tax_regime_code;
1744 
1745   IF (g_level_statement >= g_current_runtime_level ) THEN
1746        FND_LOG.STRING(g_level_statement,
1747                       'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_rec_rate',
1748                       'Tax : '|| l_tax || ', Tax Regime code : '|| l_tax_regime_code);
1749   END IF;
1750 
1751   -- Bug#5417753- determine tax_class value
1752   IF p_event_class_rec.prod_family_grp_code = 'O2C' THEN
1753     l_tax_class := 'OUTPUT';
1754   ELSIF p_event_class_rec.prod_family_grp_code = 'P2P' THEN
1755     l_tax_class := 'INPUT';
1756   END IF;
1757 
1758   -- if recovery info is not exist in the global structure for this tax,
1759   -- populate the structure for the future usage.
1760   IF NOT g_tax_recovery_info_tbl.EXISTS(l_tax_id)
1761   THEN
1762     IF (g_level_statement >= g_current_runtime_level ) THEN
1763        FND_LOG.STRING(g_level_statement,
1764                       'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_rec_rate',
1765                       'Populating tax cache information ');
1766     END IF;
1767 
1768 
1769     OPEN  get_tax_rec_info_from_tax_csr(l_tax_id);
1770     FETCH get_tax_rec_info_from_tax_csr INTO
1771       g_tax_recovery_info_tbl(l_tax_id).allow_recoverability_flag,
1772       g_tax_recovery_info_tbl(l_tax_id).primary_recovery_type_code,
1773       g_tax_recovery_info_tbl(l_tax_id).primary_rec_type_rule_flag,
1774       g_tax_recovery_info_tbl(l_tax_id).secondary_recovery_type_code,
1775       g_tax_recovery_info_tbl(l_tax_id).secondary_rec_type_rule_flag,
1776       g_tax_recovery_info_tbl(l_tax_id).primary_rec_rate_det_rule_flag,
1777       g_tax_recovery_info_tbl(l_tax_id).sec_rec_rate_det_rule_flag,
1778       g_tax_recovery_info_tbl(l_tax_id).def_primary_rec_rate_code,
1779       g_tax_recovery_info_tbl(l_tax_id).def_secondary_rec_rate_code,
1780       g_tax_recovery_info_tbl(l_tax_id).effective_from,
1781       g_tax_recovery_info_tbl(l_tax_id).effective_to,
1782       g_tax_recovery_info_tbl(l_tax_id).def_rec_settlement_option_code,
1783       g_tax_recovery_info_tbl(l_tax_id).tax_account_source_tax;
1784 
1785     IF get_tax_rec_info_from_tax_csr%NOTFOUND THEN
1786       p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1787       IF (g_level_statement >= g_current_runtime_level ) THEN
1788         FND_LOG.STRING(g_level_statement,
1789                'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_rec_rate',
1790                'error: ' || 'no tax info can be found for '||l_tax_id);
1791       END IF;
1792       CLOSE get_tax_rec_info_from_tax_csr;
1793       RETURN;
1794     END IF;
1795 
1796     CLOSE get_tax_rec_info_from_tax_csr;
1797 
1798     g_tax_recovery_info_tbl(l_tax_id).tax_regime_code := l_tax_regime_code;
1799     g_tax_recovery_info_tbl(l_tax_id).tax := l_tax;
1800     g_tax_recovery_info_tbl(l_tax_id).tax_id := l_tax_id;
1801 
1802   END IF;
1803 
1804   IF NOT ZX_TDS_UTILITIES_PKG.g_tax_rec_tbl.exists(l_tax_id) then
1805      ZX_TDS_UTILITIES_PKG.populate_tax_cache (
1806               p_tax_id         => l_tax_id,
1807               p_return_status  => p_return_status,
1808               p_error_buffer   => p_error_buffer);
1809   END IF;
1810 
1811   IF (g_level_statement >= g_current_runtime_level ) THEN
1812        FND_LOG.STRING(g_level_statement,
1813                       'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_rec_rate',
1814                       'Populated tax cache information ');
1815   END IF;
1816 
1817 
1818   -- (If applied_from_application_id IS NOT NULL and
1819   -- applied_amt_handling_flag = 'P'), or adjusted_doc_application_id is not
1820   -- null, copy tax recovery rate percentage from applied_from/adjusted_to
1821   -- document. Skip the tax recovery rate determination process.
1822   --
1823   IF ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.adjusted_doc_application_id(
1824                                            p_trx_line_dist_index) IS NOT NULL OR
1825     (ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.applied_from_application_id(
1826                                           p_trx_line_dist_index) IS NOT NULL AND
1827      ZX_TDS_UTILITIES_PKG.g_tax_rec_tbl(l_tax_id).applied_amt_handling_flag ='P')
1828   THEN
1829 
1830     IF (g_level_procedure >= g_current_runtime_level ) THEN
1831 
1832       FND_LOG.STRING(g_level_procedure,
1833                     'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_rec_rate.END',
1834                     'ZX_TRD_INTERNAL_SERVICES_PVT.get_rec_rate(-)'||
1835                     'tax recovery rate is copied from applied_from or adjusted_to document');
1836     END IF;
1837     RETURN;
1838 
1839   END IF;
1840   IF (g_level_statement >= g_current_runtime_level ) THEN
1841        FND_LOG.STRING(g_level_statement,
1842                       'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_rec_rate',
1843                       'Adjusted doc, applied from doc information is null ');
1844   END IF;
1845 
1846 
1847   l_tax_rate_code := p_detail_tax_line_tbl(p_tax_line_index).tax_rate_code;
1848   l_tax_rate_id := p_detail_tax_line_tbl(p_tax_line_index).tax_rate_id;
1849   l_tax_determine_date :=
1850                    p_detail_tax_line_tbl(p_tax_line_index).tax_determine_date;
1851   l_tax_status_code := p_detail_tax_line_tbl(p_tax_line_index).tax_status_code;
1852   l_tax_jurisdiction_code :=
1853                 p_detail_tax_line_tbl(p_tax_line_index).tax_jurisdiction_code;
1854   l_tax_date := p_detail_tax_line_tbl(p_tax_line_index).tax_date;
1855 
1856   -- Added for Bug#14038095 --
1857   l_content_owner_id := p_detail_tax_line_tbl(p_tax_line_index).content_owner_id;
1858 
1859   l_total_rec_rate:= 0;
1860 
1861   IF p_rnd_begin_index IS NULL OR p_rnd_end_index IS NULL OR
1862      p_rnd_begin_index > p_rnd_end_index
1863   THEN
1864     IF (g_level_statement >= g_current_runtime_level ) THEN
1865        FND_LOG.STRING(g_level_statement,
1866                       'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_rec_rate',
1867                       'begin or end index is null, or begin index > end index');
1868     END IF;
1869     RETURN;
1870   END IF;
1871 
1872   FOR i IN p_rnd_begin_index..p_rnd_end_index LOOP
1873 
1874     IF NVL(p_rec_nrec_dist_tbl(i).reverse_flag, 'N') <> 'Y' AND
1875        NVL(p_rec_nrec_dist_tbl(i).freeze_flag, 'N') <> 'Y'
1876     THEN
1877       IF (g_level_statement >= g_current_runtime_level ) THEN
1878         FND_LOG.STRING(g_level_statement,
1879                       'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_rec_rate',
1880                       'Reverse flag and freeze flag are not Y.');
1881       END IF;
1882 
1883 
1884       IF NVL(p_rec_nrec_dist_tbl(i).recoverable_flag,'N') = 'N' THEN
1885         IF (g_level_statement >= g_current_runtime_level ) THEN
1886           FND_LOG.STRING(g_level_statement,
1887                       'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_rec_rate',
1888                       'Recoverable flag is N');
1889         END IF;
1890 
1891         l_non_rec_index := i;
1892         IF  p_rec_nrec_dist_tbl(l_non_rec_index).account_source_tax_rate_id IS NULL THEN
1893            OPEN  get_tax_account_entity_id_csr(
1894             p_rec_nrec_dist_tbl(l_non_rec_index).tax_rate_id,
1895             p_rec_nrec_dist_tbl(l_non_rec_index).ledger_id,
1896             p_rec_nrec_dist_tbl(l_non_rec_index).internal_organization_id);
1897             FETCH get_tax_account_entity_id_csr INTO l_acct_source_tax_rate_id;
1898             CLOSE get_tax_account_entity_id_csr;
1899          IF l_acct_source_tax_rate_id IS NOT NULL THEN
1900           p_rec_nrec_dist_tbl(l_non_rec_index).account_source_tax_rate_id := l_acct_source_tax_rate_id;
1901          ELSE
1902            p_rec_nrec_dist_tbl(l_non_rec_index).account_source_tax_rate_id :=
1903               p_detail_tax_line_tbl(p_tax_line_index).account_source_tax_rate_id;
1904 
1905          END IF;
1906 
1907         END IF;
1908 
1909       ELSE -- recoverable line
1910         IF (g_level_statement >= g_current_runtime_level ) THEN
1911           FND_LOG.STRING(g_level_statement,
1912                       'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_rec_rate',
1913                       'Recoverable flag is Y');
1914         END IF;
1915 
1916 
1917         l_rec_type_code:= p_rec_nrec_dist_tbl(i).recovery_type_code;
1918         l_rec_rate_code:= NULL;
1919         l_rec_rate_id:= NULL;
1920         l_rec_rate:= NULL;
1921         l_rec_rate_adhoc_flag := NULL;
1922         l_def_rec_settlement_code := NULL;
1923         l_acct_source_tax_rate_id := NULL;
1924 
1925         IF NVL(p_rec_nrec_dist_tbl(i).historical_flag, 'N') = 'Y' OR
1926            NVL(p_rec_nrec_dist_tbl(i).last_manual_entry, 'X') =
1927                                                        'RECOVERY_RATE_CODE' OR
1928            NVL(p_rec_nrec_dist_tbl(i).last_manual_entry, 'X') =
1929                                                        'RECOVERY_RATE' THEN --Bug7250287
1930 
1931           -- For migrated recovery tax distrabutions, or RECOVERY_RATE_CODE
1932           -- is overridden, accumulate total recovery rate
1933           --
1934           l_total_rec_rate := l_total_rec_rate + p_rec_nrec_dist_tbl(i).rec_nrec_rate;
1935           l_rec_rate_code  := p_rec_nrec_dist_tbl(i).recovery_rate_code;
1936 
1937           IF (g_level_statement >= g_current_runtime_level ) THEN
1938             FND_LOG.STRING(g_level_statement,
1939                            'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_rec_rate',
1940                            'Last Manual Entry : '||p_rec_nrec_dist_tbl(i).last_manual_entry);
1941           END IF;
1942 
1943           IF (g_level_statement >= g_current_runtime_level ) THEN
1944             FND_LOG.STRING(g_level_statement,
1945                            'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_rec_rate',
1946                            'B. TAX_DIST_ID : '|| to_char(p_rec_nrec_dist_tbl(i).rec_nrec_tax_dist_id)||
1947                            ', RECOVERY_RATE_CODE : '|| p_rec_nrec_dist_tbl(i).recovery_rate_code||
1948                            ', RECOVERY_RATE_ID : '|| to_char(p_rec_nrec_dist_tbl(i).recovery_rate_id)||
1949                            ', RECOVERY_RATE : '|| to_char(p_rec_nrec_dist_tbl(i).rec_nrec_rate));
1950           END IF;
1951 
1952           IF p_rec_nrec_dist_tbl(i).recovery_rate_id IS NULL THEN
1953             OPEN get_rec_rate_csr(l_tax,
1954                                   l_tax_regime_code,
1955                                   l_tax_determine_date,
1956                                   l_rec_type_code,
1957                                   l_tax_class,
1958                                   l_rec_rate_code);
1959             FETCH get_rec_rate_csr INTO l_rec_rate_id,
1960                                         l_rec_rate,
1961                                         l_rec_rate_adhoc_flag;
1962             CLOSE get_rec_rate_csr;
1963 
1964             IF l_rec_rate_id IS NOT NULL THEN
1965               p_rec_nrec_dist_tbl(i).recovery_rate_id := l_rec_rate_id;
1966               p_rec_nrec_dist_tbl(i).rec_nrec_rate := l_rec_rate;
1967             END IF;
1968           END IF;
1969 
1970           IF (g_level_statement >= g_current_runtime_level ) THEN
1971             FND_LOG.STRING(g_level_statement,
1972                            'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_rec_rate',
1973                            'A. TAX_DIST_ID : '|| to_char(p_rec_nrec_dist_tbl(i).rec_nrec_tax_dist_id)||
1974                            ', RECOVERY_RATE_CODE : '|| p_rec_nrec_dist_tbl(i).recovery_rate_code||
1975                            ', RECOVERY_RATE_ID : '|| to_char(p_rec_nrec_dist_tbl(i).recovery_rate_id)||
1976                            ', RECOVERY_RATE : '|| to_char(p_rec_nrec_dist_tbl(i).rec_nrec_rate));
1977           END IF;
1978 
1979         ELSE
1980 
1981           IF ((NVL(p_event_class_rec.enforce_tax_from_ref_doc_flag,'N') = 'Y' AND
1982                ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.ref_doc_application_id(p_trx_line_dist_index) IS NOT NULL
1983               )
1984                OR -- Added following conditions for Bug#13012588
1985               (p_detail_tax_line_tbl(p_tax_line_index).other_doc_source = 'REFERENCE' AND
1986                p_detail_tax_line_tbl(p_tax_line_index).unrounded_tax_amt = 0 AND
1987                p_detail_tax_line_tbl(p_tax_line_index).unrounded_taxable_amt = 0 AND
1988                p_detail_tax_line_tbl(p_tax_line_index).manually_entered_flag = 'Y' AND
1989                p_detail_tax_line_tbl(p_tax_line_index).freeze_until_overridden_flag ='Y'
1990               )
1991              )
1992              AND p_rec_nrec_dist_tbl(i).recovery_rate_code IS NOT NULL
1993           THEN
1994 
1995             l_rec_rate_code := p_rec_nrec_dist_tbl(i).recovery_rate_code;
1996 
1997             IF (g_level_statement >= g_current_runtime_level ) THEN
1998               FND_LOG.STRING(g_level_statement,
1999                      'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_rec_rate',
2000                      'Enforce Tax Recovery Code from Reference Document.'||
2001                      'ENFORCE_TAX_FROM_REF_DOC_FLAG : '||
2002                       NVL(p_event_class_rec.enforce_tax_from_ref_doc_flag,'N'));
2003 
2004               FND_LOG.STRING(g_level_statement,
2005                      'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_rec_rate',
2006                      'Recovery Rate Code : '||l_rec_rate_code);
2007             END IF;
2008 
2009 
2010           ELSE
2011             -- bug 9760322
2012             --
2013             IF l_rec_type_code = g_tax_recovery_info_tbl(
2014                                         l_tax_id).primary_recovery_type_code
2015             THEN
2016               p_rec_nrec_dist_tbl(i).rec_rate_det_rule_flag :=
2017                g_tax_recovery_info_tbl(l_tax_id).primary_rec_rate_det_rule_flag;
2018 
2019             ELSIF l_rec_type_code = g_tax_recovery_info_tbl(
2020                                       l_tax_id).secondary_recovery_type_code
2021             THEN
2022                p_rec_nrec_dist_tbl(i).rec_rate_det_rule_flag :=
2023                    g_tax_recovery_info_tbl(l_tax_id).sec_rec_rate_det_rule_flag;
2024             END IF;
2025 
2026             IF p_rec_nrec_dist_tbl(i).rec_rate_det_rule_flag = 'Y' THEN
2027 
2028               -- Bug#5395227- get recovery rule code and default
2029               -- recovery rate code from zx_rates_b
2030               --
2031               OPEN  get_rec_info_csr(l_tax_rate_id);
2032               FETCH get_rec_info_csr INTO l_rec_rule_code,
2033                                           l_def_rec_rate_code,
2034                                           l_def_rec_settlement_code,
2035                                           l_def_rec_type_code;
2036               CLOSE get_rec_info_csr;
2037 
2038               -- Bug 6813467 - Removed the check IF l_rec_rule_code IS NOT NULL, it should enter
2039               -- rules processing unconditionally. Rules Engine will process for the rec_rule_code
2040               -- that is passed and if not found then will process further.
2041               IF (g_level_statement >= g_current_runtime_level ) THEN
2042                       FND_LOG.STRING(g_level_statement,
2043                              'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_rec_rate',
2044                              'l_rec_rule_code : '|| l_rec_rule_code);
2045                       FND_LOG.STRING(g_level_statement,
2046                              'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_rec_rate',
2047                              'l_def_rec_rate_code : ' || l_def_rec_rate_code);
2048                       FND_LOG.STRING(g_level_statement,
2049                              'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_rec_rate',
2050                              'l_def_rec_settlement_code : ' ||l_def_rec_settlement_code );
2051                       FND_LOG.STRING(g_level_statement,
2052                              'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_rec_rate',
2053                              'l_rec_type_code : ' || l_rec_type_code );
2054                       FND_LOG.STRING(g_level_statement,
2055                              'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_rec_rate',
2056                              'l_def_rec_rate_code : ' || l_def_rec_rate_code );
2057               END IF;
2058 
2059                 ZX_TDS_RULE_BASE_DETM_PVT.rule_base_process(
2060                               'DET_RECOVERY_RATE',
2061                               'TRX_LINE_DIST_TBL',
2062                                p_trx_line_dist_index,
2063                                p_event_class_rec,
2064                                l_tax_id,
2065                                NULL,-- l_tax_status_code
2066                                l_tax_determine_date,
2067                                l_rec_rule_code,
2068                                l_rec_type_code,
2069                                l_zx_result_rec,
2070                                p_return_status,
2071                                p_error_buffer);
2072 
2073                 l_rec_rate_code:= l_zx_result_rec.alphanumeric_result;
2074                 l_rec_rate_id:= l_zx_result_rec.numeric_result;
2075                 IF (g_level_statement >= g_current_runtime_level ) THEN
2076                       FND_LOG.STRING(g_level_statement,
2077                              'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_rec_rate',
2078                              'l_rec_rate_code : '||l_rec_rate_code );
2079                       FND_LOG.STRING(g_level_statement,
2080                              'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_rec_rate',
2081                              'l_rec_rate_id : ' || to_char(l_rec_rate_id));
2082 
2083                 END IF;
2084 
2085 
2086                 -- bug 5716167
2087                 IF l_rec_rate_code IS NULL THEN
2088                   -- bug 9759983
2089                   IF l_def_rec_type_code <> p_rec_nrec_dist_tbl(i).recovery_type_code THEN
2090                     NULL;
2091                   ELSE
2092                     l_rec_rate_code := l_def_rec_rate_code;
2093                   END IF;
2094                 END IF;
2095 
2096                 -- bug 5386805: populate rec_rate_result_id;
2097                 --
2098                 p_rec_nrec_dist_tbl(i).rec_rate_result_id := l_zx_result_rec.result_id;
2099 
2100             END IF;  -- rec_rate_det_rule_flag
2101 
2102             IF l_rec_rate_code IS NULL THEN
2103                 -- Bug#5457916- need to fetch l_def_rec_rate_code
2104                 -- if rec_rate_det_rule_flag is 'N', the cursor
2105                 -- has not been fetched earlier, the l_rec_rule_code
2106                 -- is fetched in this case but not used
2107                 --
2108               IF NVL(p_rec_nrec_dist_tbl(i).rec_rate_det_rule_flag, 'N')  = 'N' THEN
2109                 IF (g_level_statement >= g_current_runtime_level ) THEN
2110                    FND_LOG.STRING(g_level_statement,
2111                       'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_rec_rate',
2112                       'rec_rate_det_rule_flag is N ');
2113                 END IF;
2114 
2115                 OPEN  get_rec_info_csr(l_tax_rate_id);
2116                 FETCH get_rec_info_csr INTO l_rec_rule_code,
2117                                               l_def_rec_rate_code,
2118                                               l_def_rec_settlement_code,
2119                                               l_def_rec_type_code;
2120                 CLOSE get_rec_info_csr;
2121               END IF;
2122               -- bug 9759983
2123 
2124               IF (g_level_statement >= g_current_runtime_level ) THEN
2125                       FND_LOG.STRING(g_level_statement,
2126                              'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_rec_rate',
2127                              'l_rec_rule_code : '|| l_rec_rule_code);
2128                       FND_LOG.STRING(g_level_statement,
2129                              'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_rec_rate',
2130                              'l_def_rec_rate_code : ' || l_def_rec_rate_code);
2131                       FND_LOG.STRING(g_level_statement,
2132                              'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_rec_rate',
2133                              'l_def_rec_settlement_code : ' ||l_def_rec_settlement_code );
2134                       FND_LOG.STRING(g_level_statement,
2135                              'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_rec_rate',
2136                              'l_def_rec_rate_code : ' || l_def_rec_rate_code );
2137               END IF;
2138 
2139               IF l_def_rec_type_code <> p_rec_nrec_dist_tbl(i).recovery_type_code THEN
2140                 NULL;
2141               ELSE
2142                 l_rec_rate_code := l_def_rec_rate_code;
2143               END IF;
2144 
2145              IF l_rec_rate_code IS NULL THEN
2146 
2147                OPEN get_def_rec_rate_from_type_csr(
2148                                 l_tax,
2149                                 l_tax_regime_code,
2150                                 l_tax_determine_date,
2151                                 l_tax_class,
2152                                 l_rec_type_code);
2153 
2154               FETCH get_def_rec_rate_from_type_csr INTO l_rec_rate_id,
2155                     l_rec_rate_code, l_rec_rate, l_rec_rate_adhoc_flag;
2156 
2157               CLOSE get_def_rec_rate_from_type_csr;
2158 
2159 
2160               IF l_rec_rate_code IS NULL THEN
2161 
2162 
2163                /*** Bug#5395227
2164                 OPEN get_def_rec_rate_from_rate_csr(
2165                                            l_tax_status_code,
2166                                            l_tax,
2167                                            l_tax_regime_code,
2168                                            l_tax_determine_date,
2169                                            l_rec_type_code,
2170                                            l_tax_rate_code);
2171 
2172                 FETCH get_def_rec_rate_from_rate_csr INTO l_rec_rate_code;
2173                 CLOSE get_def_rec_rate_from_rate_csr;
2174                 ***/
2175 
2176                 --
2177                 -- Bug#5457916- need to fetch l_def_rec_rate_code
2178                 -- if rec_rate_det_rule_flag is 'N', the cursor
2179                 -- has not been fetched earlier, the l_rec_rule_code
2180                 -- is fetched in this case but not used
2181                 --
2182                 /***IF NVL(p_rec_nrec_dist_tbl(i).rec_rate_det_rule_flag, 'N')  = 'N' THEN
2183                   OPEN  get_rec_info_csr(l_tax_rate_id);
2184                   FETCH get_rec_info_csr INTO l_rec_rule_code,
2185                                               l_def_rec_rate_code,
2186                                               l_def_rec_settlement_code;
2187                   CLOSE get_rec_info_csr;
2188                 END IF;
2189 
2190                 l_rec_rate_code := l_def_rec_rate_code;
2191                 ***/
2192 
2193 
2194                   -- get def_primary_rec_rate_code or def_secondary_rec_rate_code
2195                   -- From g_tax_recovery_info_tbl.
2196                   --
2197 
2198                   IF l_rec_type_code = g_tax_recovery_info_tbl(
2199                                         l_tax_id).primary_recovery_type_code THEN
2200 
2201                     l_rec_rate_code :=
2202                       g_tax_recovery_info_tbl(l_tax_id).def_primary_rec_rate_code;
2203 
2204                   ELSIF l_rec_type_code = g_tax_recovery_info_tbl(
2205                                       l_tax_id).secondary_recovery_type_code THEN
2206 
2207                     l_rec_rate_code := g_tax_recovery_info_tbl(
2208                                             l_tax_id).def_secondary_rec_rate_code;
2209                   END IF;
2210 
2211                   IF l_rec_rate_code IS NULL THEN
2212                     p_return_status := FND_API.G_RET_STS_ERROR;
2213 
2214                     FND_MESSAGE.SET_NAME('ZX','ZX_REC_RATE_CODE_NOT_FOUND');
2215                     FND_MESSAGE.SET_TOKEN('REGIME_NAME', l_tax_regime_code);
2216                     FND_MESSAGE.SET_TOKEN('CONTENT_OWNER_NAME',
2217                            p_detail_tax_line_tbl(p_tax_line_index).content_owner_id);
2218 
2219                     FND_MESSAGE.SET_TOKEN('TAX_NAME', l_tax);
2220                     FND_MESSAGE.SET_TOKEN('RECOVERY_TYPE', l_rec_type_code);
2221 
2222                     ZX_TDS_CALC_SERVICES_PUB_PKG.g_msg_context_info_rec.trx_line_id :=
2223                        p_detail_tax_line_tbl(p_tax_line_index).trx_line_id;
2224                     ZX_TDS_CALC_SERVICES_PUB_PKG.g_msg_context_info_rec.trx_level_type :=
2225                        p_detail_tax_line_tbl(p_tax_line_index).trx_level_type;
2226                     ZX_TDS_CALC_SERVICES_PUB_PKG.g_msg_context_info_rec.tax_line_id :=
2227                        p_detail_tax_line_tbl(p_tax_line_index).tax_line_id;
2228                     ZX_TDS_CALC_SERVICES_PUB_PKG.g_msg_context_info_rec.trx_line_dist_id :=
2229                        p_rec_nrec_dist_tbl(i).trx_line_dist_id;
2230                     ZX_API_PUB.add_msg(
2231                           ZX_TDS_CALC_SERVICES_PUB_PKG.g_msg_context_info_rec);
2232 
2233                     IF (g_level_statement >= g_current_runtime_level ) THEN
2234                       FND_LOG.STRING(g_level_statement,
2235                              'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_rec_rate',
2236                              'Cannot find default rec rate code');
2237                       FND_LOG.STRING(g_level_statement,
2238                              'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_rec_rate',
2239                              'p_return_status := ' || p_return_status);
2240                       FND_LOG.STRING(g_level_statement,
2241                              'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_rec_rate.END',
2242                              'ZX_TRD_INTERNAL_SERVICES_PVT.get_rec_rate(-)');
2243                     END IF;
2244                     RETURN;
2245                   END IF; -- default tax recovery rate code not found, raise error
2246                 END IF;   -- default tax recovery rate code at Tax level
2247               END IF;     -- default tax recovery rate code at recovery type level
2248             END IF;       -- default tax recovery rate code for Tax Rate
2249 
2250             IF (g_level_statement >= g_current_runtime_level ) THEN
2251               FND_LOG.STRING(g_level_statement,
2252                             'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_rec_rate',
2253                             'l_rec_rate_code = ' || l_rec_rate_code);
2254             END IF;
2255           END IF;     -- p_event_class_rec.enforce_tax_from_ref_doc_flag
2256 
2257           -- Bug 12870975 : Added code to Copy the rec_nrec_rate and recovery_rate_id
2258           -- from PO in case of Zero Amount reference tax line
2259           IF p_detail_tax_line_tbl(p_tax_line_index).other_doc_source = 'REFERENCE' AND
2260              p_detail_tax_line_tbl(p_tax_line_index).unrounded_tax_amt = 0 AND
2261              p_detail_tax_line_tbl(p_tax_line_index).unrounded_taxable_amt = 0 AND
2262              p_detail_tax_line_tbl(p_tax_line_index).manually_entered_flag = 'Y' AND
2263              p_detail_tax_line_tbl(p_tax_line_index).freeze_until_overridden_flag ='Y'
2264           THEN
2265 
2266             l_rec_rate := p_rec_nrec_dist_tbl(i).rec_nrec_rate;
2267             l_rec_rate_id := p_rec_nrec_dist_tbl(i).recovery_rate_id;
2268 
2269             IF (g_level_statement >= g_current_runtime_level ) THEN
2270               FND_LOG.STRING(g_level_statement,
2271                      'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_rec_rate',
2272                      'Assigned Recovery Rate Percentage and Recovery_Rate_Id '||
2273                      'for Zero Amount Reference Tax Line');
2274               FND_LOG.STRING(g_level_statement,
2275                      'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_rec_rate',
2276                      'Recovery_Rate : '||l_rec_rate ||', Recovery_Rate_Id : '||l_rec_rate_id);
2277             END IF;
2278 
2279             -- Start : Added for Bug#14038095 --
2280             IF l_rec_rate_id IS NULL AND l_rec_rate_code = 'AD_HOC_RECOVERY' THEN
2281               IF (g_level_statement >= g_current_runtime_level ) THEN
2282                 FND_LOG.STRING(g_level_statement,
2283                        'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_rec_rate',
2284                        'Recovery_Rate_Id from the PO is NULL for Recovery Rate Code AD_HOC_RECOVERY');
2285                 FND_LOG.STRING(g_level_statement,
2286                        'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_rec_rate',
2287                        'Getting Recovery_Rate_Id for Recovery Rate Code AD_HOC_RECOVERY...');
2288               END IF;
2289 
2290               OPEN get_adhoc_rec_rate_id_csr(
2291                                 l_tax,
2292                                 l_tax_regime_code,
2293                                 l_content_owner_id,
2294                                 l_tax_class);
2295               FETCH get_adhoc_rec_rate_id_csr INTO l_rec_rate_id;
2296               CLOSE get_adhoc_rec_rate_id_csr;
2297 
2298               IF (g_level_statement >= g_current_runtime_level ) THEN
2299                 FND_LOG.STRING(g_level_statement,
2300                        'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_rec_rate',
2301                        'Recovery_Rate_Id for Recovery Rate Code AD_HOC_RECOVERY : '||l_rec_rate_id);
2302               END IF;
2303             END IF;
2304             -- END : Added for Bug#14038095 --
2305 
2306           ELSIF l_rec_rate IS NULL THEN
2307             -- get l_rec_rate if it is null
2308             --
2309             OPEN get_rec_rate_csr(l_tax,
2310                                   l_tax_regime_code,
2311                                   l_tax_determine_date,
2312                                   l_rec_type_code,
2313                                   l_tax_class,
2314                                   l_rec_rate_code);
2315 
2316             FETCH get_rec_rate_csr INTO l_rec_rate_id, l_rec_rate,
2317                   l_rec_rate_adhoc_flag;
2318             CLOSE get_rec_rate_csr;
2319           END IF;   -- _rec_rate IS NULL
2320 
2321           -- Bug 4012677: Support PO item distribution level tax recovery
2322           -- rate override
2323           --
2324           IF ZX_GLOBAL_STRUCTURES_PKG.TRX_LINE_DIST_TBL.overriding_recovery_rate(
2325                                            p_trx_line_dist_index) IS NOT NULL AND
2326              p_rec_nrec_dist_tbl(i).recovery_type_code =
2327                  g_tax_recovery_info_tbl(l_tax_id).primary_recovery_type_code AND
2328              l_rec_rate_adhoc_flag = 'Y'
2329           THEN
2330 
2331             p_rec_nrec_dist_tbl(i).orig_rec_nrec_rate := l_rec_rate;
2332             l_rec_rate :=
2333              ZX_GLOBAL_STRUCTURES_PKG.TRX_LINE_DIST_TBL.overriding_recovery_rate(
2334                                                            p_trx_line_dist_index);
2335           END IF;
2336 
2337           -- For invoice matched to PO and rec_nrec_rate overidden by user in PO,
2338           -- copy rec_nrec_rate if tax recovery rate is adhoc
2339           --
2340           IF NVL(p_event_class_rec.enforce_tax_from_ref_doc_flag,'N') = 'Y' AND
2341              ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.ref_doc_application_id(
2342                                          p_trx_line_dist_index) IS NOT NULL AND
2343              p_rec_nrec_dist_tbl(i).rec_nrec_rate IS NOT NULL AND
2344              l_rec_rate_adhoc_flag = 'Y'
2345           THEN
2346 
2347             l_rec_rate := p_rec_nrec_dist_tbl(i).rec_nrec_rate;
2348 
2349           END IF;   -- End Bug 4012677
2350 
2351           -- populate l_rec_rate_id, l_rec_rate_code, l_rec_rate on
2352           -- this recovery tax distribution
2353           --
2354           IF l_rec_rate IS NOT NULL THEN
2355 
2356             p_rec_nrec_dist_tbl(i).recovery_rate_id := l_rec_rate_id;
2357             p_rec_nrec_dist_tbl(i).recovery_rate_code := l_rec_rate_code;
2358             p_rec_nrec_dist_tbl(i).rec_nrec_rate := l_rec_rate;
2359 
2360             l_total_rec_rate:= l_total_rec_rate + l_rec_rate;
2361 
2362           ELSE      -- l_rec_rate NULL
2363 
2364             p_return_status := FND_API.G_RET_STS_ERROR;
2365 
2366             FND_MESSAGE.SET_NAME('ZX','ZX_REC_RATE_NOT_FOUND');
2367             FND_MESSAGE.SET_TOKEN('REGIME_NAME', l_tax_regime_code);
2368             FND_MESSAGE.SET_TOKEN('CONTENT_OWNER_NAME',
2369                                   p_detail_tax_line_tbl(p_tax_line_index).content_owner_id);
2370 
2371             FND_MESSAGE.SET_TOKEN('TAX_NAME', l_tax);
2372             FND_MESSAGE.SET_TOKEN('RECOVERY_TYPE', l_rec_type_code);
2373             FND_MESSAGE.SET_TOKEN('RECOVERY_RATE_CODE', l_rec_rate_code);
2374 
2375             ZX_TDS_CALC_SERVICES_PUB_PKG.g_msg_context_info_rec.trx_line_id :=
2376                      p_detail_tax_line_tbl(p_tax_line_index).trx_line_id;
2377             ZX_TDS_CALC_SERVICES_PUB_PKG.g_msg_context_info_rec.trx_level_type :=
2378                      p_detail_tax_line_tbl(p_tax_line_index).trx_level_type;
2379             ZX_TDS_CALC_SERVICES_PUB_PKG.g_msg_context_info_rec.tax_line_id :=
2380                      p_detail_tax_line_tbl(p_tax_line_index).tax_line_id;
2381             ZX_TDS_CALC_SERVICES_PUB_PKG.g_msg_context_info_rec.trx_line_dist_id :=
2382                      p_rec_nrec_dist_tbl(i).trx_line_dist_id;
2383 
2384             ZX_API_PUB.add_msg(
2385                         ZX_TDS_CALC_SERVICES_PUB_PKG.g_msg_context_info_rec);
2386 
2387 
2388             IF (g_level_statement >= g_current_runtime_level ) THEN
2389               FND_LOG.STRING(g_level_statement,
2390                             'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_rec_rate',
2391                             'error: Recovery rate is not found.');
2392 
2393               FND_LOG.STRING(g_level_statement,
2394                             'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_rec_rate.END',
2395                             'ZX_TRD_INTERNAL_SERVICES_PVT.get_rec_rate(-)');
2396             END IF;
2397             RETURN;
2398           END IF;
2399         END IF;     -- LME <> 'RECOVERY_RATE_CODE' OR historical_flag <> 'Y'
2400 
2401         -- bug 5508356: populate def_rec_settlement_option_code
2402         --
2403         IF l_def_rec_settlement_code IS NULL THEN
2404 
2405           OPEN  get_rec_info_csr(l_tax_rate_id);
2406           FETCH get_rec_info_csr INTO l_rec_rule_code,
2407                                       l_def_rec_rate_code,
2408                                       l_def_rec_settlement_code,
2409                                       l_def_rec_type_code;
2410           CLOSE get_rec_info_csr;
2411 
2412           IF l_def_rec_settlement_code IS NULL THEN
2413             l_def_rec_settlement_code :=
2414               g_tax_recovery_info_tbl(l_tax_id).def_rec_settlement_option_code;
2415 
2416             IF l_def_rec_settlement_code IS NULL THEN
2417               l_def_rec_settlement_code := 'IMMEDIATE';
2418             END IF;
2419           END IF;
2420         END IF;     -- l_def_rec_settlement_code IS NULL
2421 
2422         p_rec_nrec_dist_tbl(i).def_rec_settlement_option_code :=
2423                                                       l_def_rec_settlement_code;
2424 
2425         -- bug 5508356: populate account_source_tax_rate_id
2426         --
2427         OPEN  get_tax_account_entity_id_csr(
2428                        p_rec_nrec_dist_tbl(i).recovery_rate_id,
2429                        p_rec_nrec_dist_tbl(i).ledger_id,
2430                        p_rec_nrec_dist_tbl(i).internal_organization_id);
2431         FETCH get_tax_account_entity_id_csr INTO l_acct_source_tax_rate_id;
2432         CLOSE get_tax_account_entity_id_csr;
2433 
2434         IF l_acct_source_tax_rate_id IS NOT NULL THEN
2435             p_rec_nrec_dist_tbl(i).account_source_tax_rate_id :=
2436                                                     l_acct_source_tax_rate_id;
2437           IF (g_level_statement >= g_current_runtime_level ) THEN
2438               FND_LOG.STRING(g_level_statement,
2439                       'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_rec_rate',
2440                       'Tax accounts defined for recovery rate id '|| to_char(p_rec_nrec_dist_tbl(i).recovery_rate_id));
2441 
2442           END IF;
2443 
2444         ELSE
2445         -- 6900725
2446         --    p_rec_nrec_dist_tbl(i).account_source_tax_rate_id :=
2447         --       p_detail_tax_line_tbl(p_tax_line_index).account_source_tax_rate_id;
2448         -- This ELSE part contains the fix for bug 6900725
2449           IF (g_level_statement >= g_current_runtime_level ) THEN
2450               FND_LOG.STRING(g_level_statement,
2451                       'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_rec_rate',
2452                       'Tax accounts not defined for recovery rate id '|| to_char(p_rec_nrec_dist_tbl(i).recovery_rate_id));
2453 
2454           END IF;
2455 
2456           IF g_tax_recovery_info_tbl(l_tax_id).tax_account_source_tax IS NOT NULL THEN
2457             IF (g_level_statement >= g_current_runtime_level ) THEN
2458               FND_LOG.STRING(g_level_statement,
2459                       'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_rec_rate',
2460                       'Getting account source tax rate id from Tax Accounts Source Tax '|| g_tax_recovery_info_tbl(l_tax_id).tax_account_source_tax );
2461 
2462             END IF;
2463 
2464 
2465             FOR j in p_rec_nrec_dist_tbl.first..p_rec_nrec_dist_tbl.last LOOP
2466               IF p_rec_nrec_dist_tbl(j).tax = g_tax_recovery_info_tbl(l_tax_id).tax_account_source_tax AND
2467                  p_rec_nrec_dist_tbl(j).tax_regime_code = p_rec_nrec_dist_tbl(i).tax_regime_code AND
2468                  p_rec_nrec_dist_tbl(j).trx_line_dist_id = p_rec_nrec_dist_tbl(i).trx_line_dist_id AND
2469                  p_rec_nrec_dist_tbl(j).recovery_type_code = g_tax_recovery_info_tbl(p_rec_nrec_dist_tbl(j).tax_id).primary_recovery_type_code AND
2470                  p_rec_nrec_dist_tbl(i).recovery_type_code = g_tax_recovery_info_tbl(l_tax_id).primary_recovery_type_code
2471               THEN
2472 
2473                  p_rec_nrec_dist_tbl(i).account_source_tax_rate_id := p_rec_nrec_dist_tbl(j).account_source_tax_rate_id;
2474 
2475               ELSIF p_rec_nrec_dist_tbl(j).tax = g_tax_recovery_info_tbl(l_tax_id).tax_account_source_tax AND
2476                     p_rec_nrec_dist_tbl(j).tax_regime_code = p_rec_nrec_dist_tbl(i).tax_regime_code AND
2477                  p_rec_nrec_dist_tbl(j).trx_line_dist_id = p_rec_nrec_dist_tbl(i).trx_line_dist_id AND
2478                  p_rec_nrec_dist_tbl(j).recovery_type_code = g_tax_recovery_info_tbl(p_rec_nrec_dist_tbl(j).tax_id).secondary_recovery_type_code AND
2479                  p_rec_nrec_dist_tbl(i).recovery_type_code = g_tax_recovery_info_tbl(l_tax_id).secondary_recovery_type_code
2480               THEN
2481 
2482                  p_rec_nrec_dist_tbl(i).account_source_tax_rate_id := p_rec_nrec_dist_tbl(j).account_source_tax_rate_id;
2483 
2484               END IF;
2485             END LOOP;
2486             IF p_rec_nrec_dist_tbl(i).account_source_tax_rate_id IS NULL THEN
2487               FOR j in p_rec_nrec_dist_tbl.first..p_rec_nrec_dist_tbl.last LOOP
2488                 IF p_rec_nrec_dist_tbl(j).tax = g_tax_recovery_info_tbl(l_tax_id).tax_account_source_tax AND
2489                    p_rec_nrec_dist_tbl(j).tax_regime_code = p_rec_nrec_dist_tbl(i).tax_regime_code AND
2490                   p_rec_nrec_dist_tbl(j).trx_line_dist_id = p_rec_nrec_dist_tbl(i).trx_line_dist_id AND
2491                   p_rec_nrec_dist_tbl(i).recovery_type_code = g_tax_recovery_info_tbl(l_tax_id).secondary_recovery_type_code AND
2492                   g_tax_recovery_info_tbl(p_rec_nrec_dist_tbl(j).tax_id).secondary_recovery_type_code IS NULL AND
2493                   p_rec_nrec_dist_tbl(j).recovery_type_code = g_tax_recovery_info_tbl(p_rec_nrec_dist_tbl(j).tax_id).primary_recovery_type_code
2494                 THEN
2495 
2496                   p_rec_nrec_dist_tbl(i).account_source_tax_rate_id := p_rec_nrec_dist_tbl(j).account_source_tax_rate_id;
2497 
2498                 END IF;
2499               END LOOP;
2500             END IF;
2501             IF (g_level_statement >= g_current_runtime_level ) THEN
2502               FND_LOG.STRING(g_level_statement,
2503                       'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_rec_rate',
2504                       'Account source tax rate id for recovery rate '|| to_char(p_rec_nrec_dist_tbl(i).account_source_tax_rate_id));
2505 
2506             END IF;
2507 
2508 
2509             IF  p_rec_nrec_dist_tbl(i).account_source_tax_rate_id IS NULL THEN
2510               OPEN  get_tax_account_entity_id_csr(
2511                        p_rec_nrec_dist_tbl(i).tax_rate_id,
2512                        p_rec_nrec_dist_tbl(i).ledger_id,
2513                        p_rec_nrec_dist_tbl(i).internal_organization_id);
2514               FETCH get_tax_account_entity_id_csr INTO l_acct_source_tax_rate_id;
2515               CLOSE get_tax_account_entity_id_csr;
2516               IF l_acct_source_tax_rate_id IS NOT NULL THEN
2517                 p_rec_nrec_dist_tbl(i).account_source_tax_rate_id := l_acct_source_tax_rate_id;
2518               ELSE
2519                 p_rec_nrec_dist_tbl(i).account_source_tax_rate_id := p_detail_tax_line_tbl(p_tax_line_index).account_source_tax_rate_id;
2520 
2521               END IF;
2522               IF (g_level_statement >= g_current_runtime_level ) THEN
2523                  FND_LOG.STRING(g_level_statement,
2524                       'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_rec_rate',
2525                       'Final Account source tax rate id '|| to_char(p_rec_nrec_dist_tbl(i).account_source_tax_rate_id));
2526 
2527               END IF;
2528 
2529 
2530 
2531             END IF;
2532 
2533           END IF;
2534 
2535         END IF;     -- l_account_source_tax_rate_id IS NOT NULL
2536       END IF;       -- recoverable_flag = 'N' OR ELSE
2537     END IF;         -- reverse_flag <> 'Y AND freeze_flag <> 'Y'
2538   END LOOP;         -- i IN p_rnd_begin_index..p_rnd_end_index
2539 
2540   IF l_non_rec_index IS NULL THEN
2541 
2542     p_rnd_end_index:= p_rnd_end_index + 1;
2543     l_non_rec_index:= p_rnd_end_index;
2544 
2545     p_rec_nrec_dist_tbl(p_rnd_end_index):= p_rec_nrec_dist_tbl(p_rnd_end_index - 1);
2546 
2547     -- bug 5417252
2548     SELECT zx_rec_nrec_dist_s.nextval INTO
2549             p_rec_nrec_dist_tbl(p_rnd_end_index).rec_nrec_tax_dist_id from dual;
2550 
2551     p_rec_nrec_dist_tbl(p_rnd_end_index).rec_nrec_tax_dist_number :=
2552           p_rec_nrec_dist_tbl(p_rnd_end_index-1).rec_nrec_tax_dist_number + 1;
2553 
2554     p_rec_nrec_dist_tbl(p_rnd_end_index).recoverable_flag := 'N';
2555     p_rec_nrec_dist_tbl(p_rnd_end_index).recovery_type_id := NULL;
2556     p_rec_nrec_dist_tbl(p_rnd_end_index).recovery_type_code := NULL;
2557     p_rec_nrec_dist_tbl(p_rnd_end_index).historical_flag := 'N';
2558     p_rec_nrec_dist_tbl(p_rnd_end_index).recovery_rate_id := NULL;
2559     p_rec_nrec_dist_tbl(p_rnd_end_index).recovery_rate_code := NULL;
2560 --6900725
2561     p_rec_nrec_dist_tbl(p_rnd_end_index).account_source_tax_rate_id := NULL;
2562 
2563 
2564 
2565   END IF;     -- l_non_rec_index IS NULL
2566   -- 6900725
2567   p_rec_nrec_dist_tbl(l_non_rec_index).account_source_tax_rate_id := NULL;
2568   l_acct_source_tax_rate_id := null;
2569   IF  p_rec_nrec_dist_tbl(l_non_rec_index).account_source_tax_rate_id IS NULL THEN
2570     OPEN  get_tax_account_entity_id_csr(
2571           p_rec_nrec_dist_tbl(l_non_rec_index).tax_rate_id,
2572           p_rec_nrec_dist_tbl(l_non_rec_index).ledger_id,
2573           p_rec_nrec_dist_tbl(l_non_rec_index).internal_organization_id);
2574     FETCH get_tax_account_entity_id_csr INTO l_acct_source_tax_rate_id;
2575     CLOSE get_tax_account_entity_id_csr;
2576     IF l_acct_source_tax_rate_id IS NOT NULL THEN
2577       p_rec_nrec_dist_tbl(l_non_rec_index).account_source_tax_rate_id := l_acct_source_tax_rate_id;
2578     ELSE
2579       p_rec_nrec_dist_tbl(l_non_rec_index).account_source_tax_rate_id := p_detail_tax_line_tbl(p_tax_line_index).account_source_tax_rate_id;
2580 
2581     END IF;
2582 
2583   END IF;
2584   IF (g_level_statement >= g_current_runtime_level ) THEN
2585     FND_LOG.STRING(g_level_statement,
2586                       'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_rec_rate',
2587                       'Account source tax rate id for non recoverable dist '||p_rec_nrec_dist_tbl(l_non_rec_index).account_source_tax_rate_id);
2588 
2589   END IF;
2590 
2591 
2592 
2593   p_rec_nrec_dist_tbl(l_non_rec_index).rec_nrec_rate:= 100 - l_total_rec_rate;
2594   IF p_rec_nrec_dist_tbl(l_non_rec_index).rec_nrec_rate < 0 THEN
2595     p_return_status := FND_API.G_RET_STS_ERROR;
2596 
2597     FND_MESSAGE.SET_NAME('ZX','ZX_SUM_REC_RATE_OVER');
2598 
2599     FND_MESSAGE.SET_TOKEN('RECOVERY_TYPE_1',
2600                           g_tax_recovery_info_tbl(
2601                                     l_tax_id).primary_recovery_type_code);
2602     FND_MESSAGE.SET_TOKEN('RECOVERY_TYPE_2',
2603                           g_tax_recovery_info_tbl(
2604                                   l_tax_id).secondary_recovery_type_code);
2605     FND_MESSAGE.SET_TOKEN('REGIME_NAME', l_tax_regime_code);
2606     FND_MESSAGE.SET_TOKEN('TAX_NAME', l_tax);
2607 
2608     ZX_TDS_CALC_SERVICES_PUB_PKG.g_msg_context_info_rec.trx_line_id :=
2609            p_detail_tax_line_tbl(p_tax_line_index).trx_line_id;
2610     ZX_TDS_CALC_SERVICES_PUB_PKG.g_msg_context_info_rec.trx_level_type :=
2611            p_detail_tax_line_tbl(p_tax_line_index).trx_level_type;
2612     ZX_TDS_CALC_SERVICES_PUB_PKG.g_msg_context_info_rec.tax_line_id :=
2613            p_detail_tax_line_tbl(p_tax_line_index).tax_line_id;
2614     ZX_TDS_CALC_SERVICES_PUB_PKG.g_msg_context_info_rec.trx_line_dist_id :=
2615            p_rec_nrec_dist_tbl(l_non_rec_index).trx_line_dist_id;
2616 
2617     ZX_API_PUB.add_msg(
2618            ZX_TDS_CALC_SERVICES_PUB_PKG.g_msg_context_info_rec);
2619 
2620     IF (g_level_statement >= g_current_runtime_level ) THEN
2621       FND_LOG.STRING(g_level_statement,
2622                      'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_rec_rate',
2623                      'Error: Total Recovery Rate is greater than 100');
2624     END IF;
2625     RETURN;
2626 
2627   END IF;
2628 
2629   IF (g_level_statement >= g_current_runtime_level ) THEN
2630     FND_LOG.STRING(g_level_statement,
2631                    'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_rec_rate',
2632                    'p_rec_nrec_dist_tbl(' || l_non_rec_index ||
2633                    ').rec_nrec_rate = '
2634                    || p_rec_nrec_dist_tbl(l_non_rec_index).rec_nrec_rate);
2635   END IF;
2636 
2637   IF (g_level_procedure >= g_current_runtime_level ) THEN
2638     FND_LOG.STRING(g_level_procedure,
2639                   'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_rec_rate.END',
2640                   'ZX_TRD_INTERNAL_SERVICES_PVT.get_rec_rate(-)');
2641   END IF;
2642 
2643 EXCEPTION
2644   WHEN OTHERS THEN
2645     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2646     p_error_buffer := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
2647 
2648     IF (g_level_unexpected >= g_current_runtime_level ) THEN
2649       FND_LOG.STRING(g_level_unexpected,
2650                      'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_rec_rate',
2651                       p_error_buffer);
2652       FND_LOG.STRING(g_level_unexpected,
2653                   'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_rec_rate.END',
2654                   'ZX_TRD_INTERNAL_SERVICES_PVT.get_rec_rate(-)');
2655     END IF;
2656 END get_rec_rate;
2657 
2658 PROCEDURE GET_REC_NREC_DIST_AMT(
2659  p_detail_tax_line_tbl        IN      ZX_TRD_SERVICES_PUB_PKG.TAX_LINE_TBL_TYPE,
2660  p_tax_line_index             IN      NUMBER,
2661  p_rec_nrec_dist_tbl          IN OUT NOCOPY  ZX_TRD_SERVICES_PUB_PKG.REC_NREC_DIST_TBL_TYPE,
2662  p_rnd_begin_index            IN      NUMBER,
2663  p_rnd_end_index              IN      NUMBER,
2664  p_return_status              OUT NOCOPY     VARCHAR2,
2665  p_error_buffer               OUT NOCOPY     VARCHAR2)
2666 IS
2667 
2668 BEGIN
2669  g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
2670  IF (g_level_procedure >= g_current_runtime_level ) THEN
2671    FND_LOG.STRING(g_level_procedure,
2672                   'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.GET_REC_NREC_DIST_AMT.BEGIN',
2673                   'ZX_TRD_INTERNAL_SERVICES_PVT.GET_REC_NREC_DIST_AMT(+)');
2674  END IF;
2675    p_return_status:= FND_API.G_RET_STS_SUCCESS;
2676 
2677  For i in p_rnd_begin_index..p_rnd_end_index
2678  LOOP
2679    IF NVL(p_rec_nrec_dist_tbl(i).reverse_flag,'N') = 'N' THEN
2680 
2681       -- Bug 10069028, For PO, even if the recovery rate is 100 or 0, unrounded_rec_nrec_tax_amt should be populated as unrounded.
2682       -- Not as trx_line_dist_tax_amt which is rounded tax amt
2683       -- Bug 14346100, added AND condition. When, trx_line_dist_tax_amt is 0, unrounded_rec_nrec_tax_amt should not be non zero.
2684      /* IF (p_rec_nrec_dist_tbl(i).application_id = 201 AND p_rec_nrec_dist_tbl(i).trx_line_dist_tax_amt <> 0)  THEN
2685          p_rec_nrec_dist_tbl(i).unrounded_rec_nrec_tax_amt :=
2686           (p_rec_nrec_dist_tbl(i).trx_line_dist_amt * p_rec_nrec_dist_tbl(i).tax_rate/100) * p_rec_nrec_dist_tbl(i).rec_nrec_rate/100;
2687       --Bug 15866615, removed conditions used in bug 10069028 and 14346100, now trx_line_dist_tax_amt is stamped using unrounded_tax_amt
2688       ELSE  */
2689          p_rec_nrec_dist_tbl(i).unrounded_rec_nrec_tax_amt:=
2690              p_rec_nrec_dist_tbl(i).trx_line_dist_tax_amt * p_rec_nrec_dist_tbl(i).rec_nrec_rate/100;
2691     --  END IF; --application_id
2692 
2693    END IF;
2694  END LOOP;
2695 
2696  IF (g_level_procedure >= g_current_runtime_level ) THEN
2697    FND_LOG.STRING(g_level_procedure,
2698                   'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.GET_REC_NREC_DIST_AMT.END',
2699                   'ZX_TRD_INTERNAL_SERVICES_PVT.GET_REC_NREC_DIST_AMT(-)');
2700  END IF;
2701 
2702 EXCEPTION
2703   WHEN OTHERS THEN
2704     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2705     p_error_buffer := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
2706 
2707     IF (g_level_unexpected >= g_current_runtime_level ) THEN
2708       FND_LOG.STRING(g_level_unexpected,
2709                      'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.GET_REC_NREC_DIST_AMT',
2710                       p_error_buffer);
2711       FND_LOG.STRING(g_level_unexpected,
2712                   'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.GET_REC_NREC_DIST_AMT.END',
2713                   'ZX_TRD_INTERNAL_SERVICES_PVT.GET_REC_NREC_DIST_AMT(-)');
2714     END IF;
2715 
2716 END GET_REC_NREC_DIST_AMT;
2717 
2718 
2719 PROCEDURE round_rec_nrec_amt(
2720  p_rec_nrec_dist_tbl       IN OUT NOCOPY ZX_TRD_SERVICES_PUB_PKG.REC_NREC_DIST_TBL_TYPE,
2721  p_rnd_begin_index         IN            NUMBER,
2722  p_rnd_end_index           IN            NUMBER,
2723  p_tax_line_amt            IN            NUMBER,
2724  p_tax_line_amt_tax_curr   IN            NUMBER,
2725  p_tax_line_amt_funcl_curr IN            NUMBER,
2726  p_return_status              OUT NOCOPY VARCHAR2,
2727  p_error_buffer               OUT NOCOPY VARCHAR2)  IS
2728 
2729  l_rounding_rule_code       zx_taxes_b.rounding_rule_code%TYPE;
2730  l_min_acct_unit            zx_taxes_b.minimum_accountable_unit%TYPE;
2731  l_precision                zx_taxes_b.tax_precision%TYPE;
2732  l_trx_currency_code        zx_rec_nrec_dist.trx_currency_code%TYPE;
2733  l_tax_currency_code        zx_rec_nrec_dist.tax_currency_code%TYPE;
2734  l_tax_currency_date        zx_rec_nrec_dist.tax_currency_conversion_date%TYPE;
2735  l_tax_currency_type        zx_rec_nrec_dist.tax_currency_conversion_type%TYPE;
2736  l_tax_currency_rate        zx_rec_nrec_dist.tax_currency_conversion_rate%TYPE;
2737  l_tax_amt_tax_currency     zx_rec_nrec_dist.rec_nrec_tax_amt_tax_curr%TYPE;
2738  l_taxable_amt_tax_currency zx_rec_nrec_dist.taxable_amt_tax_curr%TYPE;
2739  l_tax_id			     zx_taxes_b.tax_id%TYPE;
2740 
2741 BEGIN
2742   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
2743   IF (g_level_procedure >= g_current_runtime_level ) THEN
2744     FND_LOG.STRING(g_level_procedure,
2745                    'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.ROUND_REC_NREC_AMT.BEGIN',
2746                    'ZX_TRD_INTERNAL_SERVICES_PVT.ROUND_REC_NREC_AMT(+)');
2747   END IF;
2748 
2749   p_return_status:= FND_API.G_RET_STS_SUCCESS;
2750 
2751   IF p_rnd_begin_index IS NULL OR p_rnd_end_index IS NULL OR
2752      p_rnd_begin_index > p_rnd_end_index THEN
2753 
2754     --p_return_status:= FND_API.G_RET_STS_ERROR;
2755     IF (g_level_statement >= g_current_runtime_level ) THEN
2756       FND_LOG.STRING(g_level_statement,
2757                     'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.ROUND_REC_NREC_AMT',
2758                     'begin or end index is null, or begin index > end index');
2759     END IF;
2760     RETURN;
2761   END IF;
2762 
2763   -- this procedure is called FOR each tax line so rounding rule etc are the same FOR the tax dists.
2764 
2765   l_rounding_rule_code:= p_rec_nrec_dist_tbl(p_rnd_begin_index).rounding_rule_code;
2766   l_min_acct_unit:= p_rec_nrec_dist_tbl(p_rnd_begin_index).minimum_accountable_unit;
2767   l_precision:= p_rec_nrec_dist_tbl(p_rnd_begin_index).precision;
2768 
2769   -- call procedure round_tax_dists_trx_curr to round tax amount.
2770   -- and taxable amount and adjust tax amount rounding difference.
2771   --
2772   round_tax_dists_trx_curr ( p_rec_nrec_dist_tbl,
2773   			     p_rnd_begin_index,
2774   			     p_rnd_end_index,
2775   			     p_tax_line_amt,
2776   			     p_return_status,
2777   			     p_error_buffer);
2778 
2779   IF p_rec_nrec_dist_tbl(p_rnd_begin_index).mrc_tax_dist_flag = 'N' THEN
2780     -- call procedure convert_tax_dists to convert and round tax amount
2781     -- and taxable amount INTO tax currency and functional curremcy.
2782     --
2783     convert_tax_dists ( p_rec_nrec_dist_tbl,
2784           	      p_rnd_begin_index,
2785       		      p_rnd_end_index,
2786   		      p_tax_line_amt_tax_curr,
2787     		      p_tax_line_amt_funcl_curr,
2788           	      p_return_status,
2789           	      p_error_buffer);
2790 
2791     IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2792       IF (g_level_error >= g_current_runtime_level ) THEN
2793         FND_LOG.STRING(g_level_error,
2794                       'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.round_rec_nrec_amt',
2795                       'Incorrect return_status after calling ' ||
2796                       'ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists()');
2797         FND_LOG.STRING(g_level_error,
2798                       'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.round_rec_nrec_amt.END',
2799                       'ZX_TRD_INTERNAL_SERVICES_PVT.round_rec_nrec_amt(-)'||p_return_status);
2800       END IF;
2801       RETURN;
2802     END IF;
2803 
2804     IF p_rec_nrec_dist_tbl(p_rnd_begin_index).applied_from_tax_dist_id IS NOT NULL
2805     THEN
2806       l_tax_id := p_rec_nrec_dist_tbl(p_rnd_begin_index).tax_id;
2807       IF ZX_TDS_UTILITIES_PKG.g_tax_rec_tbl(l_tax_id).applied_amt_handling_flag='R'
2808       THEN
2809         -- call round_and_adjust_prd_tax_amts to round and adjust prd_tax_amt,
2810         -- prd_tax_amt_tax_curr, and prd_tax_amt_funcl_curr
2811         --
2812         round_and_adjust_prd_tax_amts (
2813                 p_rec_nrec_dist_tbl  => p_rec_nrec_dist_tbl,
2814                 p_rnd_begin_index    => p_rnd_begin_index,
2815                 p_rnd_end_index      => p_rnd_end_index,
2816                 p_return_status      => p_return_status,
2817                 p_error_buffer       => p_error_buffer);
2818 
2819         IF NVL(p_return_status, FND_API.G_RET_STS_ERROR) <> FND_API.G_RET_STS_SUCCESS THEN
2820           IF (g_level_statement >= g_current_runtime_level ) THEN
2821             FND_LOG.STRING(g_level_statement,
2822                           'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.ROUND_REC_NREC_AMT',
2823                           'Incorrect return_status after calling ' ||
2824                           'ZX_TRD_INTERNAL_SERVICES_PVT.round_and_adjust_prd_tax_amts');
2825             FND_LOG.STRING(g_level_statement,
2826                           'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.ROUND_REC_NREC_AMT',
2827                           'RETURN_STATUS = ' || p_return_status);
2828             FND_LOG.STRING(g_level_statement,
2829                           'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.ROUND_REC_NREC_AMT.END',
2830                           'ZX_TRD_INTERNAL_SERVICES_PVT.ROUND_REC_NREC_AMT(-)');
2831           END IF;
2832           RETURN;
2833         END IF;
2834 
2835       ELSIF ZX_TDS_UTILITIES_PKG.g_tax_rec_tbl(l_tax_id).applied_amt_handling_flag='P'
2836       THEN
2837         -- copy rec_nrec_tax_amt, rec_nrec_tax_amt_tax_curr,
2838         -- rec_nrec_tax_amt_funcl_curr to prd_tax_amt, prd_tax_amt_tax_curr,
2839         -- prd_tax_amt_funcl_curr.
2840 
2841         FOR i IN p_rec_nrec_dist_tbl.FIRST.. p_rec_nrec_dist_tbl.LAST LOOP
2842           p_rec_nrec_dist_tbl(i).prd_tax_amt :=
2843                                         p_rec_nrec_dist_tbl(i).rec_nrec_tax_amt;
2844           p_rec_nrec_dist_tbl(i).prd_tax_amt_tax_curr :=
2845                                p_rec_nrec_dist_tbl(i).rec_nrec_tax_amt_tax_curr;
2846           p_rec_nrec_dist_tbl(i).prd_tax_amt_funcl_curr :=
2847                              p_rec_nrec_dist_tbl(i).rec_nrec_tax_amt_funcl_curr;
2848         END LOOP;
2849       END IF;     -- applied_amt_handling_flag = 'R' or 'P'
2850     END IF;       -- applied_from_tax_dist_id IS NOT NULL
2851   END IF;         -- mrc_tax_dist_flag = 'N'
2852 
2853   IF (g_level_procedure >= g_current_runtime_level ) THEN
2854 
2855     FND_LOG.STRING(g_level_procedure,
2856                   'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.ROUND_REC_NREC_AMT.END',
2857                   'ZX_TRD_INTERNAL_SERVICES_PVT.ROUND_REC_NREC_AMT(-)'||p_return_status);
2858   END IF;
2859 
2860 EXCEPTION
2861   WHEN OTHERS THEN
2862     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2863     p_error_buffer := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
2864 
2865     IF (g_level_unexpected >= g_current_runtime_level ) THEN
2866       FND_LOG.STRING(g_level_unexpected,
2867                      'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.ROUND_REC_NREC_AMT',
2868                       p_error_buffer);
2869       FND_LOG.STRING(g_level_unexpected,
2870                   'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.ROUND_REC_NREC_AMT.END',
2871                   'ZX_TRD_INTERNAL_SERVICES_PVT.ROUND_REC_NREC_AMT(-)');
2872     END IF;
2873 
2874 END ROUND_REC_NREC_AMT;
2875 
2876 PROCEDURE round_tax_dists_trx_curr (
2877  p_rec_nrec_dist_tbl IN OUT NOCOPY ZX_TRD_SERVICES_PUB_PKG.REC_NREC_DIST_TBL_TYPE,
2878  p_rnd_begin_index   IN            NUMBER,
2879  p_rnd_end_index     IN            NUMBER,
2880  p_tax_line_amt	     IN            NUMBER,
2881  p_return_status     OUT NOCOPY    VARCHAR2,
2882  p_error_buffer      OUT NOCOPY    VARCHAR2) IS
2883 
2884  l_non_zero_rec_tax_dists_tbl 	     index_amt_tbl_type;
2885  l_non_zero_nrec_tax_dists_tbl 	     index_amt_tbl_type;
2886 
2887  l_rec_tax_dists_tbl_sort_flg 	     VARCHAR2(1);
2888  l_nrec_tax_dists_tbl_sort_flg 	     VARCHAR2(1);
2889 
2890  l_non_zero_rec_tax_index	     NUMBER		:= 0;
2891  l_non_zero_nrec_tax_index	     NUMBER		:= 0;
2892 
2893  l_rec_tax_rnd_diff      	     NUMBER		:= 0;
2894  l_nrec_tax_rnd_diff    	     NUMBER		:= 0;
2895  l_tax_line_rnd_diff		     NUMBER;
2896 
2897  l_rnd_total_rec_tax_amt  	     NUMBER		:= 0;
2898  l_rnd_total_nrec_tax_amt            NUMBER		:= 0;
2899 
2900  l_max_rec_tax_index	     	     NUMBER		:=NULL;
2901  l_max_nrec_tax_index		     NUMBER		:=NULL;
2902 
2903  l_rec_amt_largest	     	     NUMBER		:= 0;
2904  l_nrec_amt_largest		     NUMBER		:= 0;
2905 
2906  l_index			     NUMBER;
2907  l_min_acct_unit                     zx_taxes_b.minimum_accountable_unit%TYPE;
2908  l_precision                         zx_taxes_b.tax_precision%TYPE;
2909  l_round_nrec_flag  VARCHAR2(1);
2910 
2911 BEGIN
2912 
2913   IF (g_level_procedure >= g_current_runtime_level ) THEN
2914     FND_LOG.STRING(g_level_procedure,
2915                   'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.round_tax_dists_trx_curr.BEGIN',
2916                   'ZX_TRD_INTERNAL_SERVICES_PVT.round_tax_dists_trx_curr(+)');
2917   END IF;
2918 
2919   p_return_status:= FND_API.G_RET_STS_SUCCESS;
2920 
2921   IF p_rnd_begin_index IS NULL OR p_rnd_end_index IS NULL OR
2922                                   p_rnd_begin_index > p_rnd_end_index THEN
2923 
2924     --p_return_status:= FND_API.G_RET_STS_ERROR;
2925     IF (g_level_statement >= g_current_runtime_level ) THEN
2926       FND_LOG.STRING(g_level_statement,
2927                      'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.round_tax_dists_trx_curr',
2928                      'begin or end index is null, or begin index > end index');
2929     END IF;
2930     RETURN;
2931   END IF;
2932 
2933   FOR i IN p_rnd_begin_index .. p_rnd_end_index LOOP
2934     -- round rec_nrec_tax_amt and taxable_amt
2935     --
2936 
2937    -- Bugfix: 5388586, do not round reversal pair of tax distributions
2938 
2939    IF NVL(p_rec_nrec_dist_tbl(i).reverse_flag, 'N') = 'N' THEN
2940 
2941     p_rec_nrec_dist_tbl(i).rec_nrec_tax_amt :=
2942       ZX_TDS_TAX_ROUNDING_PKG.round_tax(
2943         p_amount             => p_rec_nrec_dist_tbl(i).unrounded_rec_nrec_tax_amt,
2944         p_Rounding_Rule_Code => p_rec_nrec_dist_tbl(i).rounding_rule_code,
2945         p_min_acct_unit      => p_rec_nrec_dist_tbl(i).minimum_accountable_unit,
2946         p_precision          => p_rec_nrec_dist_tbl(i).precision,
2947         p_return_status      => p_return_status,
2948         p_error_buffer       => p_error_buffer);
2949 
2950     IF (g_level_statement >= g_current_runtime_level ) THEN
2951       FND_LOG.STRING(g_level_statement,
2952                      'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.round_tax_dists_trx_curr',
2953                      ' i = '||to_char(i) || ' round '|| p_rec_nrec_dist_tbl(i).unrounded_rec_nrec_tax_amt ||
2954                      ' to '|| p_rec_nrec_dist_tbl(i).rec_nrec_tax_amt);
2955     END IF;
2956 
2957     p_rec_nrec_dist_tbl(i).taxable_amt :=
2958       ZX_TDS_TAX_ROUNDING_PKG.round_tax(
2959         p_amount             => p_rec_nrec_dist_tbl(i).unrounded_taxable_amt,
2960         p_Rounding_Rule_Code => p_rec_nrec_dist_tbl(i).rounding_rule_code,
2961         p_min_acct_unit      => p_rec_nrec_dist_tbl(i).minimum_accountable_unit,
2962         p_precision          => p_rec_nrec_dist_tbl(i).precision,
2963         p_return_status      => p_return_status,
2964         p_error_buffer       => p_error_buffer);
2965    END IF;
2966 
2967    IF NVL(p_return_status, FND_API.G_RET_STS_ERROR) <> FND_API.G_RET_STS_SUCCESS
2968     THEN
2969       IF (g_level_error >= g_current_runtime_level ) THEN
2970         FND_LOG.STRING(g_level_error,
2971                       'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.round_tax_dists_trx_curr',
2972                       'Incorrect return_status after calling ' ||
2973                       'ZX_TDS_TAX_ROUNDING_PKG.round_tax()');
2974         FND_LOG.STRING(g_level_error,
2975                       'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.round_tax_dists_trx_curr.END',
2976                       'ZX_TRD_INTERNAL_SERVICES_PVT.round_tax_dists_trx_curr(-)'||p_return_status);
2977       END IF;
2978       RETURN;
2979     END IF;
2980 
2981    -- Bugfix: 5388586, do not adjust reversal pair of tax distributions
2982     IF NVL(p_rec_nrec_dist_tbl(i).recoverable_flag, 'N') = 'Y' AND NVL(p_rec_nrec_dist_tbl(i).reverse_flag, 'N') = 'N' THEN
2983 
2984       -- Accumulate l_rnd_total_rec_tax_amt
2985       --
2986       l_rnd_total_rec_tax_amt := l_rnd_total_rec_tax_amt +
2987                                        p_rec_nrec_dist_tbl(i).rec_nrec_tax_amt;
2988 
2989       -- Accumulate rounding diffrence of recoverable tax dists
2990       --
2991       l_rec_tax_rnd_diff := l_rec_tax_rnd_diff +
2992            p_rec_nrec_dist_tbl(i).unrounded_rec_nrec_tax_amt -
2993                         p_rec_nrec_dist_tbl(i).rec_nrec_tax_amt;
2994 
2995       IF p_rec_nrec_dist_tbl(i).rec_nrec_tax_amt <> 0 THEN
2996         -- Record non-zero recoverable tax dists
2997         --
2998         l_non_zero_rec_tax_index := l_non_zero_rec_tax_index + 1;
2999 
3000         l_non_zero_rec_tax_dists_tbl(l_non_zero_rec_tax_index).tbl_index := i;
3001         l_non_zero_rec_tax_dists_tbl(l_non_zero_rec_tax_index).tbl_amt :=
3002                                       p_rec_nrec_dist_tbl(i).rec_nrec_tax_amt;
3003 
3004         -- Record the largest rec_nrec_tax_amt of non-zero recoverable tax dists
3005         --
3006         IF ABS(p_rec_nrec_dist_tbl(i).rec_nrec_tax_amt) >= ABS(l_rec_amt_largest)
3007         THEN
3008           l_max_rec_tax_index := i;
3009           l_rec_amt_largest := p_rec_nrec_dist_tbl(i).rec_nrec_tax_amt;
3010         END IF;
3011       END IF;
3012 
3013    -- Bugfix: 5388586, do not adjust reversal pair of tax distributions
3014     ELSIF NVL(p_rec_nrec_dist_tbl(i).recoverable_flag, 'N') = 'N' AND
3015           NVL(p_rec_nrec_dist_tbl(i).reverse_flag, 'N') = 'N'  THEN
3016 
3017       -- Accumulate l_rnd_total_nrec_tax_amt
3018       --
3019       l_rnd_total_nrec_tax_amt := l_rnd_total_nrec_tax_amt +
3020                                        p_rec_nrec_dist_tbl(i).rec_nrec_tax_amt;
3021 
3022       -- Accumulate rounding diffrence of non-recoverable tax dists
3023       --
3024       l_nrec_tax_rnd_diff := l_nrec_tax_rnd_diff +
3025            p_rec_nrec_dist_tbl(i).unrounded_rec_nrec_tax_amt -
3026                         p_rec_nrec_dist_tbl(i).rec_nrec_tax_amt;
3027 
3028       IF p_rec_nrec_dist_tbl(i).rec_nrec_tax_amt <> 0 THEN
3029 
3030         -- Record non-zero non-recoverable tax dists
3031         --
3032         l_non_zero_nrec_tax_index := l_non_zero_nrec_tax_index + 1;
3033 
3034         l_non_zero_nrec_tax_dists_tbl(l_non_zero_nrec_tax_index).tbl_index := i;
3035         l_non_zero_nrec_tax_dists_tbl(l_non_zero_nrec_tax_index).tbl_amt :=
3036                                         p_rec_nrec_dist_tbl(i).rec_nrec_tax_amt;
3037 
3038         -- Record the largest rec_nrec_tax_amt of non-zero non-recoverable tax
3039         -- dists
3040         --
3041         IF ABS(p_rec_nrec_dist_tbl(i).rec_nrec_tax_amt) >= ABS(l_nrec_amt_largest)
3042         THEN
3043           l_max_nrec_tax_index := i;
3044           l_nrec_amt_largest := p_rec_nrec_dist_tbl(i).rec_nrec_tax_amt;
3045         END IF;
3046       END IF;
3047     END IF;      -- recoverable_flag
3048 
3049   END LOOP;
3050 
3051   -- round l_rec_tax_rnd_diff
3052   --
3053   l_rec_tax_rnd_diff := ZX_TDS_TAX_ROUNDING_PKG.round_tax(
3054 		l_rec_tax_rnd_diff,
3055 		p_rec_nrec_dist_tbl(p_rnd_begin_index).Rounding_Rule_Code,
3056 		p_rec_nrec_dist_tbl(p_rnd_begin_index).minimum_accountable_unit,
3057 		p_rec_nrec_dist_tbl(p_rnd_begin_index).precision,
3058 		p_return_status,
3059 		p_error_buffer);
3060 
3061   -- round l_nrec_tax_rnd_diff
3062   --
3063   l_nrec_tax_rnd_diff := ZX_TDS_TAX_ROUNDING_PKG.round_tax(
3064 		l_nrec_tax_rnd_diff,
3065 		p_rec_nrec_dist_tbl(p_rnd_begin_index).Rounding_Rule_Code,
3066 		p_rec_nrec_dist_tbl(p_rnd_begin_index).minimum_accountable_unit,
3067 		p_rec_nrec_dist_tbl(p_rnd_begin_index).precision,
3068 		p_return_status,
3069 		p_error_buffer);
3070 
3071   IF NVL(p_return_status, FND_API.G_RET_STS_ERROR) <> FND_API.G_RET_STS_SUCCESS
3072   THEN
3073     IF (g_level_error >= g_current_runtime_level ) THEN
3074       FND_LOG.STRING(g_level_error,
3075                     'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.round_tax_dists_trx_curr',
3076                     'Incorrect return_status after calling ' ||
3077                     'ZX_TDS_TAX_ROUNDING_PKG.round_tax()');
3078       FND_LOG.STRING(g_level_error,
3079                     'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.round_tax_dists_trx_curr.END',
3080                     'ZX_TRD_INTERNAL_SERVICES_PVT.round_tax_dists_trx_curr(-)'||p_return_status);
3081     END IF;
3082     RETURN;
3083    END IF;
3084 
3085   IF l_rec_tax_rnd_diff <> 0 THEN
3086 
3087     -- calculate minimum accountable unit if it is not available
3088     --
3089     l_precision := p_rec_nrec_dist_tbl(p_rnd_begin_index).precision;
3090     l_min_acct_unit :=
3091           NVL(p_rec_nrec_dist_tbl(p_rnd_begin_index).minimum_accountable_unit,
3092               POWER(10,l_precision*(-1)));
3093 
3094     IF l_non_zero_rec_tax_dists_tbl.COUNT = 0 AND l_non_zero_nrec_tax_dists_tbl.COUNT = 0 THEN
3095       FOR i IN p_rnd_begin_index .. p_rnd_end_index LOOP
3096         IF NVL(p_rec_nrec_dist_tbl(i).recoverable_flag, 'N') = 'Y' AND NVL(p_rec_nrec_dist_tbl(i).reverse_flag, 'N') = 'N' THEN
3097         -- Record one of the zero recoverable tax dists incase all the rec lines are zero lines
3098         --
3099           l_non_zero_rec_tax_index := l_non_zero_rec_tax_index + 1;
3100           l_non_zero_rec_tax_dists_tbl(l_non_zero_rec_tax_index).tbl_index := i;
3101           l_non_zero_rec_tax_dists_tbl(l_non_zero_rec_tax_index).tbl_amt :=
3102                                           p_rec_nrec_dist_tbl(i).rec_nrec_tax_amt;
3103 
3104           l_max_rec_tax_index := i;
3105           l_rec_amt_largest := p_rec_nrec_dist_tbl(i).rec_nrec_tax_amt;
3106           exit;
3107         END IF;
3108       END LOOP;
3109     END IF;
3110 
3111     -- Adjust l_rec_tax_rnd_diff to recoverable tax dists first. If no
3112     -- non-zero recoverable tax dists exist, adjust rounding_diff to
3113     -- nonrecoverable tax dists.
3114     --
3115     IF l_non_zero_rec_tax_dists_tbl.COUNT > 0 THEN
3116       -- sort l_non_zero_rec_tax_dists_tbl
3117       --
3118       sort_tbl_amt_desc (
3119      		p_index_amt_tbl    => l_non_zero_rec_tax_dists_tbl,
3120      		p_return_status    => p_return_status,
3121      		p_error_buffer     => p_error_buffer);
3122 
3123       IF NVL(p_return_status, FND_API.G_RET_STS_ERROR) <> FND_API.G_RET_STS_SUCCESS
3124       THEN
3125         IF (g_level_error >= g_current_runtime_level ) THEN
3126           FND_LOG.STRING(g_level_error,
3127                         'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.round_tax_dists_trx_curr',
3128                         'Incorrect return_status after calling ' ||
3129                         'ZX_TRD_INTERNAL_SERVICES_PVT.sort_tbl_amt_desc()');
3130           FND_LOG.STRING(g_level_error,
3131                         'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.round_tax_dists_trx_curr.END',
3132                         'ZX_TRD_INTERNAL_SERVICES_PVT.round_tax_dists_trx_curr(-)'||p_return_status);
3133         END IF;
3134         RETURN;
3135       END IF;
3136 
3137       -- set the sort flag for l_non_zero_rec_tax_dists_tbl
3138       --
3139       l_rec_tax_dists_tbl_sort_flg := 'Y';
3140 
3141       -- distribute rounding difference
3142       --
3143       ZX_TRD_INTERNAL_SERVICES_PVT.distribute_rounding_diff (
3144            p_index_amt_tbl => l_non_zero_rec_tax_dists_tbl,
3145            p_rounding_diff => l_rec_tax_rnd_diff,
3146  	   p_min_acct_unit => l_min_acct_unit,
3147  	   p_return_status => p_return_status,
3148  	   p_error_buffer  => p_error_buffer);
3149 
3150       IF NVL(p_return_status, FND_API.G_RET_STS_ERROR) <> FND_API.G_RET_STS_SUCCESS
3151       THEN
3152         IF (g_level_error >= g_current_runtime_level ) THEN
3153           FND_LOG.STRING(g_level_error,
3154                  'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.round_tax_dists_trx_curr',
3155                  'Incorrect return_status after calling ' ||
3156                  'ZX_TRD_INTERNAL_SERVICES_PVT.distribute_rounding_diff()');
3157           FND_LOG.STRING(g_level_error,
3158                         'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.round_tax_dists_trx_curr.END',
3159                         'ZX_TRD_INTERNAL_SERVICES_PVT.round_tax_dists_trx_curr(-)'||p_return_status);
3160         END IF;
3161         RETURN;
3162       END IF;
3163 
3164       -- update the amount of other currency in p_rec_nrec_dist_tbl
3165       --
3166       FOR i IN l_non_zero_rec_tax_dists_tbl.FIRST ..
3167                                      l_non_zero_rec_tax_dists_tbl.LAST  LOOP
3168         l_index := l_non_zero_rec_tax_dists_tbl(i).tbl_index;
3169         p_rec_nrec_dist_tbl(l_index).rec_nrec_tax_amt :=
3170                                       l_non_zero_rec_tax_dists_tbl(i).tbl_amt;
3171       END LOOP;
3172 
3173     ELSIF l_non_zero_nrec_tax_dists_tbl.COUNT > 0 THEN
3174 
3175       -- sort l_non_zero_nrec_tax_dists_tbl
3176       --
3177       sort_tbl_amt_desc (
3178      		p_index_amt_tbl    => l_non_zero_nrec_tax_dists_tbl,
3179      		p_return_status    => p_return_status,
3180      		p_error_buffer     => p_error_buffer);
3181 
3182       IF NVL(p_return_status, FND_API.G_RET_STS_ERROR) <> FND_API.G_RET_STS_SUCCESS
3183       THEN
3184         IF (g_level_error >= g_current_runtime_level ) THEN
3185           FND_LOG.STRING(g_level_error,
3186                         'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.round_tax_dists_trx_curr',
3187                         'Incorrect return_status after calling ' ||
3188                         'ZX_TRD_INTERNAL_SERVICES_PVT.sort_tbl_amt_desc()');
3189           FND_LOG.STRING(g_level_error,
3190                         'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.round_tax_dists_trx_curr.END',
3191                         'ZX_TRD_INTERNAL_SERVICES_PVT.round_tax_dists_trx_curr(-)'||p_return_status);
3192         END IF;
3193         RETURN;
3194       END IF;
3195 
3196       -- set the sort flag for l_non_zero_nrec_tax_dists_tbl
3197       --
3198       l_nrec_tax_dists_tbl_sort_flg := 'Y';
3199 
3200       -- distribute rounding difference
3201       --
3202       ZX_TRD_INTERNAL_SERVICES_PVT.distribute_rounding_diff (
3203          	l_non_zero_nrec_tax_dists_tbl,
3204          	l_rec_tax_rnd_diff,
3205  	 	l_min_acct_unit,
3206  	 	p_return_status,
3207  	 	p_error_buffer);
3208 
3209       IF NVL(p_return_status, FND_API.G_RET_STS_ERROR) <> FND_API.G_RET_STS_SUCCESS
3210       THEN
3211         IF (g_level_error >= g_current_runtime_level ) THEN
3212           FND_LOG.STRING(g_level_error,
3213                  'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.round_tax_dists_trx_curr',
3214                  'Incorrect return_status after calling ' ||
3215                  'ZX_TRD_INTERNAL_SERVICES_PVT.distribute_rounding_diff()');
3216           FND_LOG.STRING(g_level_error,
3217                         'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.round_tax_dists_trx_curr.END',
3218                         'ZX_TRD_INTERNAL_SERVICES_PVT.round_tax_dists_trx_curr(-)');
3219         END IF;
3220         RETURN;
3221       END IF;
3222 
3223       -- update the amount of other currency in p_rec_nrec_dist_tbl
3224       --
3225       FOR i IN l_non_zero_nrec_tax_dists_tbl.FIRST ..
3226                                        l_non_zero_nrec_tax_dists_tbl.LAST  LOOP
3227         l_index := l_non_zero_nrec_tax_dists_tbl(i).tbl_index;
3228         p_rec_nrec_dist_tbl(l_index).rec_nrec_tax_amt :=
3229                                        l_non_zero_nrec_tax_dists_tbl(i).tbl_amt;
3230       END LOOP;
3231     END IF;
3232 
3233   END IF;      -- l_rec_tax_rnd_diff <> 0
3234 
3235   IF l_nrec_tax_rnd_diff <> 0 THEN
3236 
3237     -- calculate minimum accountable unit if it is not available
3238     --
3239     l_precision := p_rec_nrec_dist_tbl(p_rnd_begin_index).precision;
3240     l_min_acct_unit :=
3241           NVL(p_rec_nrec_dist_tbl(p_rnd_begin_index).minimum_accountable_unit,
3242               POWER(10,l_precision*(-1)));
3243 
3244     IF l_non_zero_nrec_tax_dists_tbl.COUNT = 0 AND l_non_zero_rec_tax_dists_tbl.COUNT = 0 THEN
3245       FOR i IN p_rnd_begin_index .. p_rnd_end_index LOOP
3246         IF NVL(p_rec_nrec_dist_tbl(i).recoverable_flag, 'N') = 'N' AND NVL(p_rec_nrec_dist_tbl(i).reverse_flag, 'N') = 'N'  THEN
3247         -- Record one of zero non-recoverable tax dists incase all the non-rec lines are zero lines
3248         --
3249           l_non_zero_nrec_tax_index := l_non_zero_nrec_tax_index + 1;
3250           l_non_zero_nrec_tax_dists_tbl(l_non_zero_nrec_tax_index).tbl_index := i;
3251           l_non_zero_nrec_tax_dists_tbl(l_non_zero_nrec_tax_index).tbl_amt :=
3252                                             p_rec_nrec_dist_tbl(i).rec_nrec_tax_amt;
3253 
3254           l_max_nrec_tax_index := i;
3255           l_nrec_amt_largest := p_rec_nrec_dist_tbl(i).rec_nrec_tax_amt;
3256           exit;
3257         END IF;
3258       END LOOP;
3259     END IF;
3260 
3261     -- Adjust rounding_diff to nonrecoverable tax dists first. if there is no
3262     -- non-zero nonrecoverable tax dists, adjust rounding_diff to recoverable
3263     -- tax dists.
3264     --
3265     IF l_non_zero_nrec_tax_dists_tbl.COUNT > 0 THEN
3266 
3267       IF NVL(l_nrec_tax_dists_tbl_sort_flg, 'N') <> 'Y' THEN
3268         -- sort l_non_zero_nrec_tax_dists_tbl
3269         --
3270         sort_tbl_amt_desc (
3271 	       	p_index_amt_tbl    => l_non_zero_nrec_tax_dists_tbl,
3272        		p_return_status    => p_return_status,
3273        		p_error_buffer     => p_error_buffer);
3274 
3275         IF NVL(p_return_status, FND_API.G_RET_STS_ERROR) <> FND_API.G_RET_STS_SUCCESS
3276         THEN
3277           IF (g_level_error >= g_current_runtime_level ) THEN
3278             FND_LOG.STRING(g_level_error,
3279                           'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.round_tax_dists_trx_curr',
3280                           'Incorrect return_status after calling ' ||
3281                           'ZX_TRD_INTERNAL_SERVICES_PVT.sort_tbl_amt_desc()');
3282             FND_LOG.STRING(g_level_error,
3283                           'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.round_tax_dists_trx_curr.END',
3284                           'ZX_TRD_INTERNAL_SERVICES_PVT.round_tax_dists_trx_curr(-)');
3285           END IF;
3286           RETURN;
3287         END IF;
3288 
3289         -- set the sort flag for l_non_zero_nrec_tax_dists_tbl
3290         --
3291         l_nrec_tax_dists_tbl_sort_flg := 'Y';
3292 
3293       END IF;      -- l_nrec_tax_dists_tbl_sort_flg <> 'Y'
3294 
3295       -- distribute rounding difference
3296       --
3297       ZX_TRD_INTERNAL_SERVICES_PVT.distribute_rounding_diff (
3298  	     l_non_zero_nrec_tax_dists_tbl,
3299  	     l_nrec_tax_rnd_diff,
3300  	     l_min_acct_unit,
3301  	     p_return_status,
3302  	     p_error_buffer);
3303 
3304       IF NVL(p_return_status,FND_API.G_RET_STS_ERROR)<>FND_API.G_RET_STS_SUCCESS
3305       THEN
3306         IF (g_level_error >= g_current_runtime_level ) THEN
3307           FND_LOG.STRING(g_level_error,
3308                  'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.round_tax_dists_trx_curr',
3309                   'Incorrect return_status after calling ' ||
3310                   'ZX_TRD_INTERNAL_SERVICES_PVT.distribute_rounding_diff()');
3311           FND_LOG.STRING(g_level_error,
3312                   'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.round_tax_dists_trx_curr.END',
3313                   'ZX_TRD_INTERNAL_SERVICES_PVT.round_tax_dists_trx_curr(-)');
3314         END IF;
3315         RETURN;
3316       END IF;
3317 
3318       -- update the amount of other currency in p_rec_nrec_dist_tbl
3319       --
3320       FOR i IN l_non_zero_nrec_tax_dists_tbl.FIRST ..
3321                                         l_non_zero_nrec_tax_dists_tbl.LAST  LOOP
3322         l_index := l_non_zero_nrec_tax_dists_tbl(i).tbl_index;
3323         p_rec_nrec_dist_tbl(l_index).rec_nrec_tax_amt :=
3324                                        l_non_zero_nrec_tax_dists_tbl(i).tbl_amt;
3325       END LOOP;
3326 
3327     ELSIF l_non_zero_rec_tax_dists_tbl.COUNT > 0 THEN
3328 
3329       IF NVL(l_rec_tax_dists_tbl_sort_flg, 'N') <> 'Y' THEN
3330         -- sort l_non_zero_nrec_tax_dists_tbl
3331         --
3332         sort_tbl_amt_desc (
3333 		p_index_amt_tbl    => l_non_zero_rec_tax_dists_tbl,
3334 		p_return_status    => p_return_status,
3335 		p_error_buffer     => p_error_buffer);
3336 
3337         IF NVL(p_return_status, FND_API.G_RET_STS_ERROR) <> FND_API.G_RET_STS_SUCCESS
3338         THEN
3339           IF (g_level_error >= g_current_runtime_level ) THEN
3340             FND_LOG.STRING(g_level_error,
3341                           'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.round_tax_dists_trx_curr',
3342                           'Incorrect return_status after calling ' ||
3343                           'ZX_TRD_INTERNAL_SERVICES_PVT.sort_tbl_amt_desc()');
3344             FND_LOG.STRING(g_level_error,
3345                           'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.round_tax_dists_trx_curr.END',
3346                           'ZX_TRD_INTERNAL_SERVICES_PVT.round_tax_dists_trx_curr(-)');
3347           END IF;
3348           RETURN;
3349         END IF;
3350 
3351         -- set the sort flag for l_non_zero_rec_tax_dists_tbl
3352         --
3353         l_rec_tax_dists_tbl_sort_flg := 'Y';
3354 
3355       END IF;      -- l_nrec_tax_dists_tbl_sort_flg <> 'Y'
3356 
3357       -- distribute rounding difference
3358       --
3359       ZX_TRD_INTERNAL_SERVICES_PVT.distribute_rounding_diff (
3360  	 l_non_zero_rec_tax_dists_tbl,
3361  	 l_nrec_tax_rnd_diff,
3362  	 l_min_acct_unit,
3363  	 p_return_status,
3364  	 p_error_buffer);
3365 
3366       IF NVL(p_return_status, FND_API.G_RET_STS_ERROR) <> FND_API.G_RET_STS_SUCCESS
3367       THEN
3368         IF (g_level_error >= g_current_runtime_level ) THEN
3369           FND_LOG.STRING(g_level_error,
3370                   'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.round_tax_dists_trx_curr',
3371                   'Incorrect return_status after calling ' ||
3372                   'ZX_TRD_INTERNAL_SERVICES_PVT.distribute_rounding_diff()');
3373           FND_LOG.STRING(g_level_error,
3374                         'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.round_tax_dists_trx_curr.END',
3375                         'ZX_TRD_INTERNAL_SERVICES_PVT.round_tax_dists_trx_curr(-)'||p_return_status);
3376         END IF;
3377         RETURN;
3378       END IF;
3379 
3380       -- update the amount of other currency in p_rec_nrec_dist_tbl
3381       --
3382       FOR i IN l_non_zero_rec_tax_dists_tbl.FIRST ..
3383                                        l_non_zero_rec_tax_dists_tbl.LAST  LOOP
3384         l_index := l_non_zero_rec_tax_dists_tbl(i).tbl_index;
3385         p_rec_nrec_dist_tbl(l_index).rec_nrec_tax_amt :=
3386                                        l_non_zero_rec_tax_dists_tbl(i).tbl_amt;
3387       END LOOP;
3388     END IF;
3389   END IF;      -- l_nrec_tax_rnd_diff <> 0
3390 
3391   -- check rounding difference between tax line in zx_lines and
3392   -- the tax distributions in zx_rec_nrec_tax_dist with the same
3393   -- tax_line_id.
3394   --
3395   IF p_tax_line_amt IS NOT NULL THEN
3396     -- calculate rounding difference for tax line amount
3397     --
3398     l_tax_line_rnd_diff := p_tax_line_amt -
3399                         (( l_rnd_total_rec_tax_amt + l_rec_tax_rnd_diff ) +
3400                         (l_rnd_total_nrec_tax_amt + l_nrec_tax_rnd_diff));
3401 
3402 
3403     --IF l_tax_line_rnd_diff < 0 THEN
3404 
3405       -- Adjust rounding difference to the largest recoverable tax dists first.
3406       -- If there is no recoverable tax dists, adjust rounding
3407       -- difference to the largest nonrecoverable tax dists.
3408       --
3409       --IF l_max_rec_tax_index IS NOT NULL THEN
3410 
3411         --p_rec_nrec_dist_tbl(l_max_rec_tax_index).rec_nrec_tax_amt :=
3412           --p_rec_nrec_dist_tbl(l_max_rec_tax_index).rec_nrec_tax_amt + l_tax_line_rnd_diff;
3413 
3414       --ELSIF l_max_nrec_tax_index IS NOT NULL THEN
3415 
3416         --p_rec_nrec_dist_tbl(l_max_nrec_tax_index).rec_nrec_tax_amt :=
3417           --p_rec_nrec_dist_tbl(l_max_nrec_tax_index).rec_nrec_tax_amt + l_tax_line_rnd_diff;
3418 
3419       --END IF;
3420 
3421     --ELSIF l_tax_line_rnd_diff > 0 THEN
3422 
3423       -- Adjust rounding_diff to the largest nonrecoverable tax dists first.
3424       -- if there is no nonrecoverable tax dists, adjust rounding_diff to the
3425       -- largest recoverable tax dists.
3426       --
3427       --IF l_max_nrec_tax_index IS NOT NULL THEN
3428 
3429         --p_rec_nrec_dist_tbl(l_max_nrec_tax_index).rec_nrec_tax_amt :=
3430           --p_rec_nrec_dist_tbl(l_max_nrec_tax_index).rec_nrec_tax_amt + l_tax_line_rnd_diff;
3431 
3432       --ELSIF l_max_rec_tax_index IS NOT NULL THEN
3433 
3434         --p_rec_nrec_dist_tbl(l_max_rec_tax_index).rec_nrec_tax_amt :=
3435           --p_rec_nrec_dist_tbl(l_max_rec_tax_index).rec_nrec_tax_amt + l_tax_line_rnd_diff;
3436 
3437       --END IF;
3438     --END IF;   -- l_tax_line_rnd_diff > 0 OR < 0
3439 
3440     IF p_rec_nrec_dist_tbl(p_rnd_begin_index).Rounding_Rule_Code = 'UP' THEN
3441 
3442       -- When rounding rule code is UP
3443       -- Adjust rounding difference to the largest non-recoverable tax dists first.
3444       -- If there is no recoverable tax dists, adjust rounding
3445       -- difference to the largest recoverable tax dists.
3446       --
3447       IF l_max_nrec_tax_index IS NOT NULL THEN
3448 
3449         p_rec_nrec_dist_tbl(l_max_nrec_tax_index).rec_nrec_tax_amt :=
3450           p_rec_nrec_dist_tbl(l_max_nrec_tax_index).rec_nrec_tax_amt + l_tax_line_rnd_diff;
3451 
3452       ELSIF l_max_rec_tax_index IS NOT NULL THEN
3453 
3454         p_rec_nrec_dist_tbl(l_max_rec_tax_index).rec_nrec_tax_amt :=
3455           p_rec_nrec_dist_tbl(l_max_rec_tax_index).rec_nrec_tax_amt + l_tax_line_rnd_diff;
3456 
3457       END IF;
3458 
3459     ELSIF p_rec_nrec_dist_tbl(p_rnd_begin_index).Rounding_Rule_Code = 'DOWN' THEN
3460 
3461       -- When rounding rule code is DOWN
3462       -- Adjust rounding difference to the largest recoverable tax dists first.
3463       -- If there is no non-recoverable tax dists, adjust rounding
3464       -- difference to the largest recoverable tax dists.
3465       --
3466       IF l_max_rec_tax_index IS NOT NULL THEN
3467 
3468         p_rec_nrec_dist_tbl(l_max_rec_tax_index).rec_nrec_tax_amt :=
3469           p_rec_nrec_dist_tbl(l_max_rec_tax_index).rec_nrec_tax_amt + l_tax_line_rnd_diff;
3470 
3471       ELSIF l_max_nrec_tax_index IS NOT NULL THEN
3472 
3473         p_rec_nrec_dist_tbl(l_max_nrec_tax_index).rec_nrec_tax_amt :=
3474           p_rec_nrec_dist_tbl(l_max_nrec_tax_index).rec_nrec_tax_amt + l_tax_line_rnd_diff;
3475 
3476       END IF;
3477 
3478     ELSIF NVL(p_rec_nrec_dist_tbl(p_rnd_begin_index).Rounding_Rule_Code,'NEAREST') = 'NEAREST' THEN
3479 
3480       IF p_rec_nrec_dist_tbl(p_rnd_begin_index).Minimum_Accountable_unit IS NOT NULL THEN
3481 
3482         -- When rounding rule code is NEAREST
3483         -- Adjust rounding difference to the largest non-recoverable tax dists first.
3484         -- for 0.5 and above
3485         -- If there is no recoverable tax dists, adjust rounding
3486         -- difference to the largest recoverable tax dists.
3487         --
3488 
3489         IF ABS(l_tax_line_rnd_diff)/p_rec_nrec_dist_tbl(p_rnd_begin_index).Minimum_Accountable_unit >= 5 THEN
3490           l_round_nrec_flag := 'Y';
3491         ELSE
3492           l_round_nrec_flag := 'N';
3493         END IF;
3494       ELSE
3495 
3496         -- When rounding rule code is NEAREST
3497         -- Adjust rounding difference to the largest recoverable tax dists first.
3498         -- for below 0.5
3499         -- If there is no non-recoverable tax dists, adjust rounding
3500         -- difference to the largest recoverable tax dists.
3501         --
3502 
3503         IF ABS(l_tax_line_rnd_diff)/ POWER(10, (-1) * p_rec_nrec_dist_tbl(p_rnd_begin_index).precision) >= 5 THEN
3504           l_round_nrec_flag := 'Y';
3505         ELSE
3506           l_round_nrec_flag := 'N';
3507         END IF;
3508       END IF;
3509       IF l_round_nrec_flag = 'N' THEN
3510         IF l_max_rec_tax_index IS NOT NULL THEN
3511 
3512           p_rec_nrec_dist_tbl(l_max_rec_tax_index).rec_nrec_tax_amt :=
3513             p_rec_nrec_dist_tbl(l_max_rec_tax_index).rec_nrec_tax_amt + l_tax_line_rnd_diff;
3514 
3515         ELSIF l_max_nrec_tax_index IS NOT NULL THEN
3516 
3517           p_rec_nrec_dist_tbl(l_max_nrec_tax_index).rec_nrec_tax_amt :=
3518             p_rec_nrec_dist_tbl(l_max_nrec_tax_index).rec_nrec_tax_amt + l_tax_line_rnd_diff;
3519 
3520         END IF;
3521       ELSE
3522         IF l_max_nrec_tax_index IS NOT NULL THEN
3523 
3524           p_rec_nrec_dist_tbl(l_max_nrec_tax_index).rec_nrec_tax_amt :=
3525             p_rec_nrec_dist_tbl(l_max_nrec_tax_index).rec_nrec_tax_amt + l_tax_line_rnd_diff;
3526 
3527         ELSIF l_max_rec_tax_index IS NOT NULL THEN
3528 
3529         p_rec_nrec_dist_tbl(l_max_rec_tax_index).rec_nrec_tax_amt :=
3530           p_rec_nrec_dist_tbl(l_max_rec_tax_index).rec_nrec_tax_amt + l_tax_line_rnd_diff;
3531 
3532         END IF;
3533       END IF;
3534     END IF;   -- Rounding_Rule_Code up, down, nearest
3535   END IF;     -- p_tax_line_amt IS NOT NULL
3536 
3537    IF (g_level_procedure >= g_current_runtime_level ) THEN
3538 
3539     FND_LOG.STRING(g_level_procedure,
3540                   'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.round_tax_dists_trx_curr.END',
3541                   'ZX_TRD_INTERNAL_SERVICES_PVT.round_tax_dists_trx_curr(-)'||p_return_status);
3542   END IF;
3543 
3544 EXCEPTION
3545 
3546   WHEN OTHERS THEN
3547     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3548     p_error_buffer := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
3549 
3550     IF (g_level_unexpected >= g_current_runtime_level ) THEN
3551       FND_LOG.STRING(g_level_unexpected,
3552                     'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.round_tax_dists_trx_curr',
3553                      p_error_buffer);
3554       FND_LOG.STRING(g_level_unexpected,
3555                     'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.round_tax_dists_trx_curr.END',
3556                     'ZX_TRD_INTERNAL_SERVICES_PVT.round_tax_dists_trx_curr(-)');
3557       END IF;
3558 
3559 END round_tax_dists_trx_curr;
3560 
3561 PROCEDURE convert_tax_dists (
3562  p_rec_nrec_dist_tbl IN OUT NOCOPY ZX_TRD_SERVICES_PUB_PKG.REC_NREC_DIST_TBL_TYPE,
3563  p_rnd_begin_index          IN            NUMBER,
3564  p_rnd_end_index            IN            NUMBER,
3565  p_tax_line_amt_tax_curr    IN            NUMBER,
3566  p_tax_line_amt_funcl_curr  IN            NUMBER,
3567  p_return_status            OUT NOCOPY    VARCHAR2,
3568  p_error_buffer             OUT NOCOPY    VARCHAR2) IS
3569 
3570  l_non_zero_rec_tax_dists_tbl 	     index_amt_tbl_type;
3571  l_non_zero_nrec_tax_dists_tbl 	     index_amt_tbl_type;
3572 
3573  l_rec_tax_dists_tbl_sort_flg 	     VARCHAR2(1);
3574  l_nrec_tax_dists_tbl_sort_flg 	     VARCHAR2(1);
3575 
3576  l_non_zero_rec_tax_index	     NUMBER		:= 0;
3577  l_non_zero_nrec_tax_index	     NUMBER		:= 0;
3578 
3579  l_total_rec_tax_amt_trx_curr	     NUMBER		:= 0;
3580  l_total_nrec_tax_amt_trx_curr       NUMBER		:= 0;
3581 
3582  l_sum_of_rnd_rec_tax_amt	     NUMBER		:= 0;
3583  l_sum_of_rnd_nrec_tax_amt	     NUMBER		:= 0;
3584 
3585  l_total_unrnd_rec_tax_amt           NUMBER		:= 0;
3586  l_total_unrnd_nrec_tax_amt          NUMBER		:= 0;
3587  l_rnd_total_rec_tax_amt  	     NUMBER		:= 0;
3588  l_rnd_total_nrec_tax_amt            NUMBER		:= 0;
3589 
3590  l_rec_tax_rnd_diff_tax_curr	     NUMBER;
3591  l_nrec_tax_rnd_diff_tax_curr	     NUMBER;
3592  l_rec_tax_rnd_diff_funcl_curr	     NUMBER;
3593  l_nrec_tax_rnd_diff_funcl_curr	     NUMBER;
3594 
3595  l_tax_line_rnd_diff_tax_curr	     NUMBER;
3596  l_tax_line_rnd_diff_funcl_curr	     NUMBER;
3597 
3598  l_min_acct_unit_tax_curr      	     zx_taxes_b.minimum_accountable_unit%TYPE;
3599  l_precision_tax_curr          	     zx_taxes_b.tax_precision%TYPE;
3600 -- l_rounding_rule_tax_curr	     zx_taxes_b.Rounding_Rule_Code%TYPE;
3601  l_min_acct_unit_funcl_curr    	     zx_taxes_b.minimum_accountable_unit%TYPE;
3602  l_precision_funcl_curr        	     zx_taxes_b.tax_precision%TYPE;
3603  l_funcl_currency_code	     	     fnd_currencies.currency_code%TYPE;
3604  l_ledger_id		             gl_sets_of_books.set_of_books_id%TYPE;
3605 
3606  l_index			     NUMBER;
3607  l_tax_id			     zx_taxes_b.tax_id%TYPE;
3608 
3609 
3610 
3611 BEGIN
3612 
3613   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
3614 
3615   IF (g_level_procedure >= g_current_runtime_level ) THEN
3616     FND_LOG.STRING(g_level_procedure,
3617                   'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists.BEGIN',
3618                   'ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists(+)');
3619   END IF;
3620 
3621   p_return_status:= FND_API.G_RET_STS_SUCCESS;
3622 
3623   IF p_rnd_begin_index IS NULL OR p_rnd_end_index IS NULL OR
3624                                   p_rnd_begin_index > p_rnd_end_index THEN
3625 
3626     --p_return_status:= FND_API.G_RET_STS_ERROR;
3627     IF (g_level_statement >= g_current_runtime_level ) THEN
3628       FND_LOG.STRING(g_level_statement,
3629                      'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists',
3630                      'begin or end index is null, or begin index > end index');
3631     END IF;
3632     RETURN;
3633   END IF;
3634 
3635   -- /******** START OF CONVERSION AND ROUNDING FOR TAX CURRENCY ********/
3636   --
3637   IF p_rec_nrec_dist_tbl(p_rnd_begin_index).tax_currency_code =
3638                    p_rec_nrec_dist_tbl(p_rnd_begin_index).trx_currency_code THEN
3639 
3640     -- if tax_currency_code is the same as the trx currency_code, it is not
3641     -- necessary to convert tax amount and taxable amount to tax currency.
3642     -- Set the following amounts: taxable_amt_tax_curr = taxable_amt (rounded)
3643     -- and rec_nrec_tax_amt_tax_curr = rec_nrec_tax_amt(rounded)
3644     --
3645     FOR i IN p_rnd_begin_index .. p_rnd_end_index LOOP
3646       p_rec_nrec_dist_tbl(i).rec_nrec_tax_amt_tax_curr :=
3647                         p_rec_nrec_dist_tbl(i).rec_nrec_tax_amt;
3648       p_rec_nrec_dist_tbl(i).taxable_amt_tax_curr :=
3649                              p_rec_nrec_dist_tbl(i).taxable_amt;
3650     END LOOP;
3651   ELSE
3652 
3653     IF p_rec_nrec_dist_tbl(p_rnd_begin_index).tax_currency_code IS NULL THEN
3654         p_return_status:= FND_API.G_RET_STS_UNEXP_ERROR;
3655       IF (g_level_error >= g_current_runtime_level ) THEN
3656         FND_LOG.STRING(g_level_error,
3657                        'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists',
3658                        'Tax currency code is NULL');
3659         FND_LOG.STRING(g_level_error,
3660                        'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists',
3661                        'p_return_status = ' || p_return_status);
3662       END IF;
3663       RETURN;
3664     END IF;
3665 
3666     -- get l_min_acct_unit_tax_curr l_precision_tax_curr and
3667     -- l_rounding_rule_tax_curr
3668     --
3669     l_tax_id := p_rec_nrec_dist_tbl(p_rnd_begin_index).tax_id;
3670     ZX_TDS_UTILITIES_PKG.populate_tax_cache (
3671     				p_tax_id	 => l_tax_id,
3672     				p_return_status  => p_return_status,
3673     				p_error_buffer   => p_error_buffer);
3674     l_precision_tax_curr :=
3675             ZX_TDS_UTILITIES_PKG.g_tax_rec_tbl(l_tax_id).tax_precision;
3676     l_min_acct_unit_tax_curr :=
3677       NVL(ZX_TDS_UTILITIES_PKG.g_tax_rec_tbl(l_tax_id).minimum_accountable_unit,
3678           POWER(10,l_precision_tax_curr*(-1)));
3679 
3680 --    l_rounding_rule_tax_curr :=
3681 --                      ZX_TDS_UTILITIES_PKG.g_tax_rec_tbl(l_tax_id).rounding_rule_code;
3682 
3683     FOR i IN p_rnd_begin_index .. p_rnd_end_index LOOP
3684 
3685       IF NVL(p_rec_nrec_dist_tbl(i).reverse_flag,'N') = 'N' THEN
3686         -- If rec_nrec_tax_amt is zero, set rec_nrec_tax_amt_tax_curr to zero.
3687         -- Otherwise, convert rec_nrec_tax_amt to tax currency with
3688         -- unrounded_rec_nrec_tax_amt.
3689         --
3690         IF p_rec_nrec_dist_tbl(i).rec_nrec_tax_amt = 0 THEN
3691 
3692           p_rec_nrec_dist_tbl(i).rec_nrec_tax_amt_tax_curr := 0;
3693           p_rec_nrec_dist_tbl(i).rec_nrec_tax_amt_funcl_curr := 0;
3694 
3695         ELSE
3696           -- convert tax dist amount to rec_nrec_tax_amt_tax_curr
3697           --
3698           ZX_TDS_TAX_ROUNDING_PKG.convert_to_currency(
3699                p_rec_nrec_dist_tbl(i).trx_currency_code,
3700                p_rec_nrec_dist_tbl(i).tax_currency_code,
3701                p_rec_nrec_dist_tbl(i).tax_currency_conversion_date,
3702                p_rec_nrec_dist_tbl(i).tax_currency_conversion_type,
3703                p_rec_nrec_dist_tbl(i).currency_conversion_type,
3704                p_rec_nrec_dist_tbl(i).tax_currency_conversion_rate,
3705                p_rec_nrec_dist_tbl(i).unrounded_rec_nrec_tax_amt,   -- IN  param
3706                p_rec_nrec_dist_tbl(i).rec_nrec_tax_amt_tax_curr,    -- OUT param
3707                p_return_status,
3708                p_error_buffer,
3709                p_rec_nrec_dist_tbl(i).currency_conversion_date);  --Bug7183884
3710 
3711           IF NVL(p_return_status, FND_API.G_RET_STS_ERROR) <> FND_API.G_RET_STS_SUCCESS
3712           THEN
3713             IF (g_level_error >= g_current_runtime_level ) THEN
3714               FND_LOG.STRING(g_level_error,
3715                             'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists',
3716                             'Incorrect return_status after calling ' ||
3717                             'ZX_TDS_TAX_ROUNDING_PKG.convert_to_currency()');
3718               FND_LOG.STRING(g_level_error,
3719                             'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists.END',
3720                             'ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists(-)');
3721             END IF;
3722             RETURN;
3723           END IF;
3724 
3725           -- round the converted tax dist amount in tax currency
3726           --
3727           p_rec_nrec_dist_tbl(i).rec_nrec_tax_amt_tax_curr :=
3728           	 		ZX_TDS_TAX_ROUNDING_PKG.round_tax(
3729     				p_rec_nrec_dist_tbl(i).rec_nrec_tax_amt_tax_curr,
3730     				p_rec_nrec_dist_tbl(i).Rounding_Rule_Code,
3731     				l_min_acct_unit_tax_curr,
3732     				l_precision_tax_curr,
3733     				p_return_status,
3734     				p_error_buffer);
3735 
3736           IF NVL(p_return_status, FND_API.G_RET_STS_ERROR) <> FND_API.G_RET_STS_SUCCESS
3737           THEN
3738             IF (g_level_error >= g_current_runtime_level ) THEN
3739               FND_LOG.STRING(g_level_error,
3740                             'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists',
3741                             'Incorrect return_status after calling ' ||
3742                             'ZX_TDS_TAX_ROUNDING_PKG.round_tax()');
3743               FND_LOG.STRING(g_level_error,
3744                             'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists.END',
3745                             'ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists(-)');
3746             END IF;
3747             RETURN;
3748           END IF;
3749 
3750           IF NVL(p_rec_nrec_dist_tbl(i).recoverable_flag, 'N') = 'N' THEN
3751 
3752             -- Accumulate tax amount of converted non-recoverable tax dists
3753             --
3754             l_sum_of_rnd_nrec_tax_amt := l_sum_of_rnd_nrec_tax_amt +
3755                               p_rec_nrec_dist_tbl(i).rec_nrec_tax_amt_tax_curr;
3756 
3757             -- Record the non-zero non-recoverable tax dists
3758             --
3759             l_non_zero_nrec_tax_index := l_non_zero_nrec_tax_index + 1;
3760 
3761             l_non_zero_nrec_tax_dists_tbl(l_non_zero_nrec_tax_index).tbl_index := i;
3762              l_non_zero_nrec_tax_dists_tbl(
3763                        l_non_zero_nrec_tax_index).tbl_amt :=
3764                             p_rec_nrec_dist_tbl(i).rec_nrec_tax_amt_tax_curr;
3765 
3766 
3767           ELSIF NVL(p_rec_nrec_dist_tbl(i).recoverable_flag, 'N') = 'Y' THEN
3768 
3769             -- Accumulate amount of converted recoverable tax dists
3770             --
3771             l_sum_of_rnd_rec_tax_amt := l_sum_of_rnd_rec_tax_amt +
3772                                p_rec_nrec_dist_tbl(i).rec_nrec_tax_amt_tax_curr;
3773 
3774             -- Record the non-zero recoverable tax dists
3775             --
3776             l_non_zero_rec_tax_index := l_non_zero_rec_tax_index + 1;
3777 
3778             l_non_zero_rec_tax_dists_tbl(l_non_zero_rec_tax_index).tbl_index := i;
3779             l_non_zero_rec_tax_dists_tbl(
3780                        l_non_zero_rec_tax_index).tbl_amt :=
3781                                  p_rec_nrec_dist_tbl(i).rec_nrec_tax_amt_tax_curr;
3782 
3783           END IF;      -- recoverable_flag
3784         END IF;        -- rec_nrec_tax_amt = 0 OR <> 0
3785 
3786         IF NVL(p_rec_nrec_dist_tbl(i).recoverable_flag, 'N') = 'N' THEN
3787 
3788           -- Accumulate rounded non-recoverable tax amount(not converted)
3789           --
3790           l_total_nrec_tax_amt_trx_curr := l_total_nrec_tax_amt_trx_curr +
3791                                        p_rec_nrec_dist_tbl(i).rec_nrec_tax_amt;
3792 
3793           -- Accumulate unrounded non-recoverable tax amount(not converted)
3794           --
3795           l_total_unrnd_nrec_tax_amt := l_total_unrnd_nrec_tax_amt +
3796                               p_rec_nrec_dist_tbl(i).unrounded_rec_nrec_tax_amt;
3797 
3798         ELSIF NVL(p_rec_nrec_dist_tbl(i).recoverable_flag, 'N') = 'Y' THEN
3799 
3800           -- Accumulate rounded recoverable tax amount(not converted)
3801           --
3802           l_total_rec_tax_amt_trx_curr := l_total_rec_tax_amt_trx_curr +
3803                                        p_rec_nrec_dist_tbl(i).rec_nrec_tax_amt;
3804 
3805           -- Accumulate unrounded recoverable tax amount(not converted)
3806           --
3807           l_total_unrnd_rec_tax_amt := l_total_unrnd_rec_tax_amt +
3808                               p_rec_nrec_dist_tbl(i).unrounded_rec_nrec_tax_amt;
3809         END IF;
3810       END IF;      -- NVL(p_rec_nrec_dist_tbl(i).reverse_flag,'N') = 'N'
3811     END LOOP;      -- i IN p_rnd_begin_index .. p_rnd_end_index
3812 
3813     -- convert l_total_unrnd_nrec_tax_amt to tax currency
3814     --
3815     ZX_TDS_TAX_ROUNDING_PKG.convert_to_currency(
3816   	p_rec_nrec_dist_tbl(p_rnd_begin_index).trx_currency_code,
3817   	p_rec_nrec_dist_tbl(p_rnd_begin_index).tax_currency_code,
3818   	p_rec_nrec_dist_tbl(p_rnd_begin_index).tax_currency_conversion_date,
3819   	p_rec_nrec_dist_tbl(p_rnd_begin_index).tax_currency_conversion_type,
3820         p_rec_nrec_dist_tbl(p_rnd_begin_index).currency_conversion_type,
3821   	p_rec_nrec_dist_tbl(p_rnd_begin_index).tax_currency_conversion_rate,
3822   	l_total_unrnd_nrec_tax_amt,    			    -- IN  param
3823   	l_rnd_total_nrec_tax_amt,     		            -- OUT param
3824   	p_return_status,
3825   	p_error_buffer,
3826     p_rec_nrec_dist_tbl(p_rnd_begin_index).currency_conversion_date);--Bug7183884
3827 
3828     -- convert l_total_unrnd_rec_tax_amt in tax currency
3829     --
3830     ZX_TDS_TAX_ROUNDING_PKG.convert_to_currency(
3831   	p_rec_nrec_dist_tbl(p_rnd_begin_index).trx_currency_code,
3832   	p_rec_nrec_dist_tbl(p_rnd_begin_index).tax_currency_code,
3833   	p_rec_nrec_dist_tbl(p_rnd_begin_index).tax_currency_conversion_date,
3834   	p_rec_nrec_dist_tbl(p_rnd_begin_index).tax_currency_conversion_type,
3835         p_rec_nrec_dist_tbl(p_rnd_begin_index).currency_conversion_type,
3836   	p_rec_nrec_dist_tbl(p_rnd_begin_index).tax_currency_conversion_rate,
3837   	l_total_unrnd_rec_tax_amt,    			    -- IN  param
3838   	l_rnd_total_rec_tax_amt,     		            -- OUT param
3839   	p_return_status,
3840   	p_error_buffer,
3841     p_rec_nrec_dist_tbl(p_rnd_begin_index).currency_conversion_date); --Bug7183884
3842 
3843     IF NVL(p_return_status, FND_API.G_RET_STS_ERROR) <> FND_API.G_RET_STS_SUCCESS
3844     THEN
3845       IF (g_level_error >= g_current_runtime_level ) THEN
3846         FND_LOG.STRING(g_level_error,
3847                       'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists',
3848                       'Incorrect return_status after calling ' ||
3849                       'ZX_TDS_TAX_ROUNDING_PKG.convert_to_currency()');
3850         FND_LOG.STRING(g_level_error,
3851                       'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists.END',
3852                       'ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists(-)');
3853       END IF;
3854       RETURN;
3855     END IF;
3856 
3857     -- round the converted l_rnd_total_nrec_tax_amt
3858     --
3859     l_rnd_total_nrec_tax_amt := ZX_TDS_TAX_ROUNDING_PKG.round_tax(
3860   			l_rnd_total_nrec_tax_amt,
3861   			p_rec_nrec_dist_tbl(p_rnd_begin_index).Rounding_Rule_Code,
3862   			l_min_acct_unit_tax_curr,
3863   			l_precision_tax_curr,
3864   			p_return_status,
3865   			p_error_buffer);
3866 
3867     -- round the converted l_rnd_total_rec_tax_amt
3868     --
3869     l_rnd_total_rec_tax_amt := ZX_TDS_TAX_ROUNDING_PKG.round_tax(
3870   			l_rnd_total_rec_tax_amt,
3871   			p_rec_nrec_dist_tbl(p_rnd_begin_index).Rounding_Rule_Code,
3872   			l_min_acct_unit_tax_curr,
3873   			l_precision_tax_curr,
3874   			p_return_status,
3875   			p_error_buffer);
3876 
3877     IF NVL(p_return_status, FND_API.G_RET_STS_ERROR) <> FND_API.G_RET_STS_SUCCESS
3878     THEN
3879       IF (g_level_error >= g_current_runtime_level ) THEN
3880         FND_LOG.STRING(g_level_error,
3881                       'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists',
3882                       'Incorrect return_status after calling ' ||
3883                       'ZX_TDS_TAX_ROUNDING_PKG.round_tax()');
3884         FND_LOG.STRING(g_level_error,
3885                       'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists.END',
3886                       'ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists(-)');
3887       END IF;
3888       RETURN;
3889      END IF;
3890 
3891 
3892     -- calculate rounding difference in tax currency for recoverable and
3893     -- non-recoverable tax distributions
3894     --
3895     l_rec_tax_rnd_diff_tax_curr := l_rnd_total_rec_tax_amt -
3896                                                        l_sum_of_rnd_rec_tax_amt;
3897     l_nrec_tax_rnd_diff_tax_curr :=l_rnd_total_nrec_tax_amt -
3898                                                       l_sum_of_rnd_nrec_tax_amt;
3899 
3900     IF l_rec_tax_rnd_diff_tax_curr <> 0 THEN
3901 
3902       -- Adjust rounding_diff to recoverable tax dists first. If there is no
3903       -- non-zero recoverable tax dists, adjust rounding_diff to nonrecoverable
3904       -- tax dists.
3905       --
3906       IF l_non_zero_rec_tax_dists_tbl.COUNT > 0 THEN
3907 
3908         -- sort l_non_zero_rec_tax_dists_tbl
3909         --
3910         ZX_TRD_INTERNAL_SERVICES_PVT.sort_tbl_amt_desc (
3911        		p_index_amt_tbl    => l_non_zero_rec_tax_dists_tbl,
3912        		p_return_status    => p_return_status,
3913        		p_error_buffer     => p_error_buffer);
3914 
3915         IF NVL(p_return_status, FND_API.G_RET_STS_ERROR) <> FND_API.G_RET_STS_SUCCESS
3916         THEN
3917           IF (g_level_error >= g_current_runtime_level ) THEN
3918             FND_LOG.STRING(g_level_error,
3919                           'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists',
3920                           'Incorrect return_status after calling ' ||
3921                           'ZX_TRD_INTERNAL_SERVICES_PVT.sort_tbl_amt_desc()');
3922             FND_LOG.STRING(g_level_error,
3923                           'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists.END',
3924                           'ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists(-)');
3925           END IF;
3926           RETURN;
3927         END IF;
3928 
3929         -- set the sort flag for l_non_zero_rec_tax_dists_tbl
3930         --
3931         l_rec_tax_dists_tbl_sort_flg := 'Y';
3932 
3933         -- distribute rounding difference
3934         --
3935         ZX_TRD_INTERNAL_SERVICES_PVT.distribute_rounding_diff (
3936    		p_index_amt_tbl => l_non_zero_rec_tax_dists_tbl,
3937    		p_rounding_diff => l_rec_tax_rnd_diff_tax_curr,
3938    		p_min_acct_unit => l_min_acct_unit_tax_curr,
3939    		p_return_status => p_return_status,
3940    		p_error_buffer  => p_error_buffer);
3941 
3942         IF NVL(p_return_status, FND_API.G_RET_STS_ERROR) <> FND_API.G_RET_STS_SUCCESS
3943         THEN
3944           IF (g_level_error >= g_current_runtime_level ) THEN
3945             FND_LOG.STRING(g_level_error,
3946                    'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists',
3947                    'Incorrect return_status after calling ' ||
3948                    'ZX_TRD_INTERNAL_SERVICES_PVT.distribute_rounding_diff()');
3949             FND_LOG.STRING(g_level_error,
3950                           'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists.END',
3951                           'ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists(-)'||p_return_status);
3952           END IF;
3953           RETURN;
3954         END IF;
3955 
3956         -- update rec_nrec_tax_amt_tax_curr
3957         --
3958         FOR i IN l_non_zero_rec_tax_dists_tbl.FIRST ..
3959                                        l_non_zero_rec_tax_dists_tbl.LAST  LOOP
3960           l_index := l_non_zero_rec_tax_dists_tbl(i).tbl_index;
3961           p_rec_nrec_dist_tbl(l_index).rec_nrec_tax_amt_tax_curr :=
3962                                         l_non_zero_rec_tax_dists_tbl(i).tbl_amt;
3963         END LOOP;
3964 
3965       ELSIF l_non_zero_nrec_tax_dists_tbl.COUNT > 0 THEN
3966 
3967         -- sort l_non_zero_nrec_tax_dists_tbl
3968         --
3969         ZX_TRD_INTERNAL_SERVICES_PVT.sort_tbl_amt_desc (
3970        		p_index_amt_tbl    => l_non_zero_nrec_tax_dists_tbl,
3971        		p_return_status    => p_return_status,
3972        		p_error_buffer     => p_error_buffer);
3973 
3974         IF NVL(p_return_status, FND_API.G_RET_STS_ERROR) <> FND_API.G_RET_STS_SUCCESS
3975         THEN
3976           IF (g_level_error >= g_current_runtime_level ) THEN
3977             FND_LOG.STRING(g_level_error,
3978                           'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists',
3979                           'Incorrect return_status after calling ' ||
3980                           'ZX_TRD_INTERNAL_SERVICES_PVT.sort_tbl_amt_desc()');
3981             FND_LOG.STRING(g_level_error,
3982                           'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists.END',
3983                           'ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists(-)'||p_return_status);
3984           END IF;
3985           RETURN;
3986         END IF;
3987 
3988         -- set the sort flag for l_non_zero_nrec_tax_dists_tbl
3989         --
3990         l_nrec_tax_dists_tbl_sort_flg := 'Y';
3991 
3992         -- distribute rounding difference
3993         --
3994         ZX_TRD_INTERNAL_SERVICES_PVT.distribute_rounding_diff (
3995    		p_index_amt_tbl => l_non_zero_nrec_tax_dists_tbl,
3996    		p_rounding_diff => l_rec_tax_rnd_diff_tax_curr,
3997    		p_min_acct_unit => l_min_acct_unit_tax_curr,
3998    		p_return_status => p_return_status,
3999    		p_error_buffer  => p_error_buffer);
4000 
4001         IF NVL(p_return_status, FND_API.G_RET_STS_ERROR) <> FND_API.G_RET_STS_SUCCESS
4002         THEN
4003           IF (g_level_error >= g_current_runtime_level ) THEN
4004             FND_LOG.STRING(g_level_error,
4005                    'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists',
4006                    'Incorrect return_status after calling ' ||
4007                    'ZX_TRD_INTERNAL_SERVICES_PVT.distribute_rounding_diff()');
4008             FND_LOG.STRING(g_level_error,
4009                           'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists.END',
4010                           'ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists(-)'||p_return_status);
4011           END IF;
4012           RETURN;
4013         END IF;
4014 
4015         -- update rec_nrec_tax_amt_tax_curr
4016         --
4017         FOR i IN l_non_zero_nrec_tax_dists_tbl.FIRST ..
4018                                          l_non_zero_nrec_tax_dists_tbl.LAST  LOOP
4019           l_index := l_non_zero_nrec_tax_dists_tbl(i).tbl_index;
4020           p_rec_nrec_dist_tbl(l_index).rec_nrec_tax_amt_tax_curr :=
4021                                          l_non_zero_nrec_tax_dists_tbl(i).tbl_amt;
4022         END LOOP;
4023       END IF;
4024 
4025     END IF;      -- l_rec_tax_rnd_diff_tax_curr <> 0
4026 
4027     IF l_nrec_tax_rnd_diff_tax_curr <> 0 THEN
4028 
4029       -- Adjust rounding_diff to nonrecoverable tax dists first. if there is no
4030       -- non-zero nonrecoverable tax dists, adjust rounding_diff to recoverable
4031       -- tax dists.
4032       --
4033       IF l_non_zero_nrec_tax_dists_tbl.COUNT > 0 THEN
4034 
4035         IF NVL(l_nrec_tax_dists_tbl_sort_flg, 'N') <> 'Y' THEN
4036           -- sort l_non_zero_nrec_tax_dists_tbl
4037           --
4038           ZX_TRD_INTERNAL_SERVICES_PVT.sort_tbl_amt_desc (
4039          		p_index_amt_tbl    => l_non_zero_nrec_tax_dists_tbl,
4040          		p_return_status    => p_return_status,
4041          		p_error_buffer     => p_error_buffer);
4042 
4043           IF NVL(p_return_status, FND_API.G_RET_STS_ERROR) <> FND_API.G_RET_STS_SUCCESS
4044           THEN
4045             IF (g_level_error >= g_current_runtime_level ) THEN
4046               FND_LOG.STRING(g_level_error,
4047                             'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists',
4048                             'Incorrect return_status after calling ' ||
4049                             'ZX_TRD_INTERNAL_SERVICES_PVT.sort_tbl_amt_desc()');
4050               FND_LOG.STRING(g_level_error,
4051                             'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists.END',
4052                             'ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists(-)');
4053             END IF;
4054             RETURN;
4055           END IF;
4056 
4057           -- set the sort flag for l_non_zero_nrec_tax_dists_tbl
4058           --
4059           l_nrec_tax_dists_tbl_sort_flg := 'Y';
4060 
4061         END IF;      -- l_nrec_tax_dists_tbl_sort_flg <> 'Y'
4062 
4063         -- distribute rounding difference
4064         --
4065         ZX_TRD_INTERNAL_SERVICES_PVT.distribute_rounding_diff (
4066    		p_index_amt_tbl => l_non_zero_nrec_tax_dists_tbl,
4067    		p_rounding_diff => l_nrec_tax_rnd_diff_tax_curr,
4068    		p_min_acct_unit => l_min_acct_unit_tax_curr,
4069    		p_return_status => p_return_status,
4070    		p_error_buffer  => p_error_buffer);
4071 
4072         IF NVL(p_return_status, FND_API.G_RET_STS_ERROR) <> FND_API.G_RET_STS_SUCCESS
4073         THEN
4074           IF (g_level_error >= g_current_runtime_level ) THEN
4075             FND_LOG.STRING(g_level_error,
4076                    'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists',
4077                     'Incorrect return_status after calling ' ||
4078                     'ZX_TRD_INTERNAL_SERVICES_PVT.distribute_rounding_diff()');
4079             FND_LOG.STRING(g_level_error,
4080                           'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists.END',
4081                           'ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists(-)'||p_return_status);
4082           END IF;
4083           RETURN;
4084         END IF;
4085 
4086         -- update rec_nrec_tax_amt_tax_curr
4087         --
4088         FOR i IN l_non_zero_nrec_tax_dists_tbl.FIRST ..
4089                                           l_non_zero_nrec_tax_dists_tbl.LAST  LOOP
4090           l_index := l_non_zero_nrec_tax_dists_tbl(i).tbl_index;
4091           p_rec_nrec_dist_tbl(l_index).rec_nrec_tax_amt_tax_curr :=
4092                                          l_non_zero_nrec_tax_dists_tbl(i).tbl_amt;
4093         END LOOP;
4094 
4095       ELSIF l_non_zero_rec_tax_dists_tbl.COUNT > 0 THEN
4096 
4097         IF NVL(l_rec_tax_dists_tbl_sort_flg, 'N') <> 'Y' THEN
4098           -- sort l_non_zero_nrec_tax_dists_tbl
4099           --
4100           ZX_TRD_INTERNAL_SERVICES_PVT.sort_tbl_amt_desc (
4101          		p_index_amt_tbl    => l_non_zero_rec_tax_dists_tbl,
4102          		p_return_status    => p_return_status,
4103          		p_error_buffer     => p_error_buffer);
4104 
4105           IF NVL(p_return_status, FND_API.G_RET_STS_ERROR) <> FND_API.G_RET_STS_SUCCESS
4106           THEN
4107             IF (g_level_error >= g_current_runtime_level ) THEN
4108               FND_LOG.STRING(g_level_error,
4109                             'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists',
4110                             'Incorrect return_status after calling ' ||
4111                             'ZX_TRD_INTERNAL_SERVICES_PVT.sort_tbl_amt_desc()');
4112               FND_LOG.STRING(g_level_error,
4113                             'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists.END',
4114                             'ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists(-)'||p_return_status);
4115             END IF;
4116             RETURN;
4117           END IF;
4118 
4119           -- set the sort flag for l_non_zero_rec_tax_dists_tbl
4120           --
4121           l_rec_tax_dists_tbl_sort_flg := 'Y';
4122 
4123         END IF;      -- l_nrec_tax_dists_tbl_sort_flg <> 'Y'
4124 
4125         -- distribute rounding difference
4126         --
4127         ZX_TRD_INTERNAL_SERVICES_PVT.distribute_rounding_diff (
4128    		p_index_amt_tbl => l_non_zero_rec_tax_dists_tbl,
4129    		p_rounding_diff => l_nrec_tax_rnd_diff_tax_curr,
4130    		p_min_acct_unit => l_min_acct_unit_tax_curr,
4131    		p_return_status => p_return_status,
4132    		p_error_buffer  => p_error_buffer);
4133 
4134         IF NVL(p_return_status, FND_API.G_RET_STS_ERROR) <> FND_API.G_RET_STS_SUCCESS
4135         THEN
4136           IF (g_level_error >= g_current_runtime_level ) THEN
4137             FND_LOG.STRING(g_level_error,
4138                     'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists',
4139                     'Incorrect return_status after calling ' ||
4140                     'ZX_TRD_INTERNAL_SERVICES_PVT.distribute_rounding_diff()');
4141             FND_LOG.STRING(g_level_error,
4142                           'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists.END',
4143                           'ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists(-)'||p_return_status);
4144           END IF;
4145           RETURN;
4146         END IF;
4147 
4148         -- update rec_nrec_tax_amt_tax_curr
4149         --
4150         FOR i IN l_non_zero_rec_tax_dists_tbl.FIRST ..
4151                                          l_non_zero_rec_tax_dists_tbl.LAST  LOOP
4152           l_index := l_non_zero_rec_tax_dists_tbl(i).tbl_index;
4153           p_rec_nrec_dist_tbl(l_index).rec_nrec_tax_amt_tax_curr :=
4154                                          l_non_zero_rec_tax_dists_tbl(i).tbl_amt;
4155         END LOOP;
4156       END IF;
4157     END IF;      -- l_nrec_tax_rnd_diff_tax_curr <> 0
4158 
4159     -- check rounding difference between tax line in zx_lines and
4160     -- the tax distributions in zx_rec_nrec_tax_dist with the same
4161     -- tax_line_id.
4162     --
4163     IF p_tax_line_amt_tax_curr IS NOT NULL THEN
4164       -- calculate rounding difference for tax line amount
4165       --
4166       l_tax_line_rnd_diff_tax_curr := p_tax_line_amt_tax_curr -
4167                           (l_rnd_total_rec_tax_amt + l_rnd_total_nrec_tax_amt);
4168 
4169       IF l_tax_line_rnd_diff_tax_curr > 0 THEN
4170 
4171         -- Adjust this rounding difference to the largest non-zero
4172         -- non-recoverabletax distribution (check first), or adjust it to
4173         -- the largest non-zero recoverable tax distribution.
4174         --
4175         IF l_non_zero_nrec_tax_dists_tbl.COUNT > 0 THEN
4176 
4177           l_index := l_non_zero_nrec_tax_dists_tbl(
4178                                      l_non_zero_nrec_tax_dists_tbl.FIRST).tbl_index;
4179           p_rec_nrec_dist_tbl(l_index).rec_nrec_tax_amt_tax_curr :=
4180                   p_rec_nrec_dist_tbl(l_index).rec_nrec_tax_amt_tax_curr +
4181                                                      l_tax_line_rnd_diff_tax_curr;
4182 
4183 
4184         ELSIF l_non_zero_rec_tax_dists_tbl.COUNT > 0 THEN
4185 
4186           l_index := l_non_zero_rec_tax_dists_tbl(
4187                                      l_non_zero_rec_tax_dists_tbl.FIRST).tbl_index;
4188           p_rec_nrec_dist_tbl(l_index).rec_nrec_tax_amt_tax_curr :=
4189                   p_rec_nrec_dist_tbl(l_index).rec_nrec_tax_amt_tax_curr +
4190                                                      l_tax_line_rnd_diff_tax_curr;
4191 
4192         END IF;
4193 
4194       ELSIF l_tax_line_rnd_diff_tax_curr < 0 THEN
4195 
4196         -- Adjust this rounding difference to the largest non-zero
4197         -- recoverabletax distribution (check first), or adjust it to
4198         -- the largest non-zero non-recoverable tax distribution.
4199         --
4200         IF l_non_zero_rec_tax_dists_tbl.COUNT > 0  THEN
4201 
4202           l_index := l_non_zero_rec_tax_dists_tbl(
4203                                      l_non_zero_rec_tax_dists_tbl.FIRST).tbl_index;
4204           p_rec_nrec_dist_tbl(l_index).rec_nrec_tax_amt_tax_curr :=
4205                   p_rec_nrec_dist_tbl(l_index).rec_nrec_tax_amt_tax_curr +
4206                                                        l_tax_line_rnd_diff_tax_curr;
4207 
4208 
4209         ELSIF  l_non_zero_nrec_tax_dists_tbl.COUNT > 0  THEN
4210 
4211           l_index := l_non_zero_nrec_tax_dists_tbl(
4212                                      l_non_zero_nrec_tax_dists_tbl.FIRST).tbl_index;
4213 
4214           p_rec_nrec_dist_tbl(l_index).rec_nrec_tax_amt_tax_curr :=
4215                   p_rec_nrec_dist_tbl(l_index).rec_nrec_tax_amt_tax_curr +
4216                                                        l_tax_line_rnd_diff_tax_curr;
4217 
4218         END IF;
4219       END IF;   -- l_tax_line_rnd_diff_tax_curr > 0 OR < 0
4220     END IF;     -- p_tax_line_amt_tax_curr IS NOT NULL
4221 
4222 
4223     -- convert taxable amount to tax currency
4224     --
4225     FOR i IN p_rnd_begin_index .. p_rnd_end_index LOOP
4226 
4227       IF NVL(p_rec_nrec_dist_tbl(i).reverse_flag,'N') = 'N' THEN
4228 
4229         ZX_TDS_TAX_ROUNDING_PKG.convert_to_currency(
4230   		p_rec_nrec_dist_tbl(i).trx_currency_code,
4231   		p_rec_nrec_dist_tbl(i).tax_currency_code,
4232   		p_rec_nrec_dist_tbl(i).tax_currency_conversion_date,
4233   		p_rec_nrec_dist_tbl(i).tax_currency_conversion_type,
4234                 p_rec_nrec_dist_tbl(i).currency_conversion_type,
4235   		p_rec_nrec_dist_tbl(i).tax_currency_conversion_rate,
4236   		p_rec_nrec_dist_tbl(i).unrounded_taxable_amt,	 -- IN  param
4237   		p_rec_nrec_dist_tbl(i).taxable_amt_tax_curr,   	 -- OUT param
4238   		p_return_status,
4239   		p_error_buffer,
4240       p_rec_nrec_dist_tbl(i).currency_conversion_date);--Bug7183884
4241 
4242         IF NVL(p_return_status,FND_API.G_RET_STS_ERROR)<>FND_API.G_RET_STS_SUCCESS
4243         THEN
4244           IF (g_level_error >= g_current_runtime_level ) THEN
4245             FND_LOG.STRING(g_level_error,
4246                           'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists',
4247                           'Incorrect return_status after calling ' ||
4248                           'ZX_TDS_TAX_ROUNDING_PKG.convert_to_currency()');
4249             FND_LOG.STRING(g_level_error,
4250                           'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists.END',
4251                           'ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists(-)'||p_return_status);
4252           END IF;
4253           RETURN;
4254         END IF;
4255 
4256         -- do rounding
4257         --
4258         p_rec_nrec_dist_tbl(i).taxable_amt_tax_curr :=
4259   	      ZX_TDS_TAX_ROUNDING_PKG.round_tax(
4260   			p_rec_nrec_dist_tbl(i).taxable_amt_tax_curr,
4261   			p_rec_nrec_dist_tbl(i).Rounding_Rule_Code,
4262   			l_min_acct_unit_tax_curr,
4263   			l_precision_tax_curr,
4264   			p_return_status,
4265   			p_error_buffer);
4266 
4267         IF NVL(p_return_status,FND_API.G_RET_STS_ERROR)<>FND_API.G_RET_STS_SUCCESS
4268         THEN
4269           IF (g_level_error >= g_current_runtime_level ) THEN
4270             FND_LOG.STRING(g_level_error,
4271                           'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists',
4272                           'Incorrect return_status after calling ' ||
4273                           'ZX_TDS_TAX_ROUNDING_PKG.round_tax()');
4274             FND_LOG.STRING(g_level_error,
4275                           'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists.END',
4276                           'ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists(-)'||p_return_status);
4277           END IF;
4278           RETURN;
4279         END IF;
4280       END IF;     -- NVL(p_rec_nrec_dist_tbl(i).reverse_flag,'N') = 'N'
4281      END LOOP;
4282   END IF;       -- tax_currency_code <> trx_currency_code
4283   --
4284   -- /******** END OF CONVERSION AND ROUNDING FOR TAX CURRENCY ********/
4285 
4286 
4287   -- /****** START OF CONVERSION AND ROUNDING FOR FUNCTIONAL CURRENCY ******/
4288   --
4289   IF p_rec_nrec_dist_tbl(p_rnd_begin_index).ledger_id IS NOT NULL THEN
4290 
4291     -- initialize some local varialbles and data structures
4292     --
4293     l_sum_of_rnd_rec_tax_amt := 0;
4294     l_sum_of_rnd_nrec_tax_amt := 0;
4295 
4296     l_rnd_total_rec_tax_amt := 0;
4297     l_rnd_total_nrec_tax_amt := 0;
4298 
4299     -- get l_min_acct_unit and l_precision and l_funcl_currency_code
4300     --
4301     l_ledger_id := p_rec_nrec_dist_tbl(p_rnd_begin_index).ledger_id;
4302 
4303     IF NOT ZX_TDS_UTILITIES_PKG.g_currency_rec_tbl.EXISTS(l_ledger_id) THEN
4304 
4305        ZX_TDS_UTILITIES_PKG.populate_currency_cache (
4306           p_ledger_id      => l_ledger_id,
4307           p_return_status  => p_return_status,
4308           p_error_buffer   => p_error_buffer);
4309 
4310       IF NVL(p_return_status,FND_API.G_RET_STS_ERROR)<>FND_API.G_RET_STS_SUCCESS
4311       THEN
4312         IF (g_level_error  >= g_current_runtime_level ) THEN
4313           FND_LOG.STRING(g_level_error,
4314                         'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists',
4315                         'Incorrect return_status after calling ' ||
4316                         'ZX_TDS_UTILITIES_PKG.populate_currency_cache()');
4317           FND_LOG.STRING(g_level_error,
4318                         'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists.END',
4319                         'ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists(-)'||p_return_status);
4320         END IF;
4321         RETURN;
4322       END IF;
4323     END IF;
4324 
4325     l_funcl_currency_code := ZX_TDS_UTILITIES_PKG.g_currency_rec_tbl(
4326                                                   l_ledger_id).currency_code;
4327     l_precision_funcl_curr := ZX_TDS_UTILITIES_PKG.g_currency_rec_tbl(
4328                                                        l_ledger_id).precision;
4329     l_min_acct_unit_funcl_curr :=
4330       NVL(ZX_TDS_UTILITIES_PKG.g_currency_rec_tbl(
4331                                         l_ledger_id).minimum_accountable_unit,
4332           POWER(10,l_precision_funcl_curr*(-1)));
4333 
4334     IF l_funcl_currency_code =
4335        p_rec_nrec_dist_tbl(p_rnd_begin_index).trx_currency_code  THEN
4336 
4337       -- if l_funcl_currency_code = trx_currency_code, it is not necessary to
4338       -- convert tax amount and taxable amount to functional currency.
4339       -- Set the followings: taxable_amt_funcl_curr = taxable_amt(rounded)
4340       -- and rec_nrec_tax_amt_funcl_curr = rec_nrec_tax_amt(rounded)
4341       --
4342       FOR i IN p_rnd_begin_index .. p_rnd_end_index LOOP
4343         IF NVL(p_rec_nrec_dist_tbl(i).reverse_flag, 'N') = 'N' THEN
4344           p_rec_nrec_dist_tbl(i).rec_nrec_tax_amt_funcl_curr :=
4345                           p_rec_nrec_dist_tbl(i).rec_nrec_tax_amt;
4346           p_rec_nrec_dist_tbl(i).taxable_amt_funcl_curr :=
4347                                p_rec_nrec_dist_tbl(i).taxable_amt;
4348         END IF;
4349 
4350         -- set func_curr_rounding_adjustment = 0
4351         --
4352         p_rec_nrec_dist_tbl(i).func_curr_rounding_adjustment := 0;
4353 
4354       END LOOP;
4355 
4356       IF (g_level_procedure >= g_current_runtime_level ) THEN
4357 
4358         FND_LOG.STRING(g_level_procedure,
4359                       'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists.END',
4360                       'ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists(-)'||
4361                       'Functional currency is the same as transaction currency, no conversion is performed');
4362       END IF;
4363       RETURN;
4364     END IF;
4365 
4366     -- l_funcl_currency_code <> trx_currency_code: need to convert tax amount
4367     -- and taxable amount to functional currency
4368     --
4369     IF p_rec_nrec_dist_tbl(p_rnd_begin_index).trx_currency_code =
4370                  p_rec_nrec_dist_tbl(p_rnd_begin_index).tax_currency_code THEN
4371 
4372       -- trx_currency_code = tax_currency_code: l_non_zero_nrec_tax_dists_tbl
4373       -- and l_non_zero_rec_tax_dists_tbl etc need to be built here
4374       --
4375       l_non_zero_rec_tax_dists_tbl.DELETE;
4376       l_non_zero_nrec_tax_dists_tbl.DELETE;
4377 
4378       l_non_zero_rec_tax_index := 0;
4379       l_non_zero_nrec_tax_index:= 0;
4380 
4381       l_total_unrnd_rec_tax_amt := 0;
4382       l_total_unrnd_nrec_tax_amt := 0;
4383 
4384       l_total_nrec_tax_amt_trx_curr := 0;
4385       l_total_rec_tax_amt_trx_curr := 0;
4386 
4387       FOR i IN p_rnd_begin_index .. p_rnd_end_index LOOP
4388         IF NVL(p_rec_nrec_dist_tbl(i).reverse_flag, 'N') = 'N' THEN
4389           IF p_rec_nrec_dist_tbl(i).rec_nrec_tax_amt = 0 THEN
4390               p_rec_nrec_dist_tbl(i).rec_nrec_tax_amt_funcl_curr := 0;
4391           ELSE
4392             IF NVL(p_rec_nrec_dist_tbl(i).recoverable_flag, 'N') = 'N' THEN
4393 
4394               -- Record the non-zero non-recoverable tax dists
4395               --
4396               l_non_zero_nrec_tax_index := l_non_zero_nrec_tax_index + 1;
4397 
4398               l_non_zero_nrec_tax_dists_tbl(l_non_zero_nrec_tax_index).tbl_index := i;
4399 --               l_non_zero_nrec_tax_dists_tbl(
4400 --                         l_non_zero_nrec_tax_index).tbl_amt :=
4401 --                              p_rec_nrec_dist_tbl(i).rec_nrec_tax_amt_tax_curr;
4402 
4403 
4404             ELSIF NVL(p_rec_nrec_dist_tbl(i).recoverable_flag, 'N') = 'Y' THEN
4405 
4406               -- Record the non-zero recoverable tax dists
4407               --
4408               l_non_zero_rec_tax_index := l_non_zero_rec_tax_index + 1;
4409 
4410               l_non_zero_rec_tax_dists_tbl(l_non_zero_rec_tax_index).tbl_index := i;
4411 --              l_non_zero_rec_tax_dists_tbl(
4412 --                         l_non_zero_rec_tax_index).tbl_amt :=
4413 --                                   p_rec_nrec_dist_tbl(i).rec_nrec_tax_amt_tax_curr;
4414 
4415             END IF;      -- recoverable_flag = 'N' or 'Y'
4416           END IF;        -- rec_nrec_tax_amt = 0 or not
4417 
4418           IF NVL(p_rec_nrec_dist_tbl(i).recoverable_flag, 'N') = 'N' THEN
4419 
4420             -- Accumulate rounded non-recoverable tax amount(not converted)
4421             --
4422             l_total_nrec_tax_amt_trx_curr := l_total_nrec_tax_amt_trx_curr +
4423                                          p_rec_nrec_dist_tbl(i).rec_nrec_tax_amt;
4424 
4425             -- Accumulate unrounded non-recoverable tax amount(not converted)
4426             --
4427             l_total_unrnd_nrec_tax_amt := l_total_unrnd_nrec_tax_amt +
4428                                 p_rec_nrec_dist_tbl(i).unrounded_rec_nrec_tax_amt;
4429 
4430           ELSIF NVL(p_rec_nrec_dist_tbl(i).recoverable_flag, 'N') = 'Y' THEN
4431 
4432             -- Accumulate rounded recoverable tax amount(not converted)
4433             --
4434             l_total_rec_tax_amt_trx_curr := l_total_rec_tax_amt_trx_curr +
4435                                          p_rec_nrec_dist_tbl(i).rec_nrec_tax_amt;
4436 
4437             -- Accumulate unrounded recoverable tax amount(not converted)
4438             --
4439             l_total_unrnd_rec_tax_amt := l_total_unrnd_rec_tax_amt +
4440                                 p_rec_nrec_dist_tbl(i).unrounded_rec_nrec_tax_amt;
4441           END IF;
4442         END IF;        -- NVL(p_rec_nrec_dist_tbl(i).reverse_flag, 'N') = 'N'
4443 
4444         -- set func_curr_rounding_adjustment = 0. It may be adjusted later.
4445         --
4446         p_rec_nrec_dist_tbl(i).func_curr_rounding_adjustment := 0;
4447 
4448       END LOOP;        -- i IN p_rnd_begin_index .. p_rnd_end_index
4449     END IF;            -- trx_currency_code = tax_currency_code or ELSE
4450 
4451     IF l_non_zero_rec_tax_dists_tbl.COUNT > 0 THEN
4452       FOR i IN l_non_zero_rec_tax_dists_tbl.FIRST ..
4453                                          l_non_zero_rec_tax_dists_tbl.LAST LOOP
4454 
4455         -- convert tax amount to functional currency and perform rounding for
4456         -- rec_nrec_tax_amt_funcl_curr
4457         --
4458         l_index := l_non_zero_rec_tax_dists_tbl(i).tbl_index;
4459         p_rec_nrec_dist_tbl(l_index).rec_nrec_tax_amt_funcl_curr :=
4460               p_rec_nrec_dist_tbl(l_index).unrounded_rec_nrec_tax_amt *
4461                          p_rec_nrec_dist_tbl(l_index).currency_conversion_rate;
4462 
4463         p_rec_nrec_dist_tbl(l_index).rec_nrec_tax_amt_funcl_curr :=
4464               round(p_rec_nrec_dist_tbl(l_index).rec_nrec_tax_amt_funcl_curr/
4465                           l_min_acct_unit_funcl_curr)*l_min_acct_unit_funcl_curr;
4466 
4467         -- Accumulate tax amount of converted recoverable tax dists
4468         --
4469         l_sum_of_rnd_rec_tax_amt := l_sum_of_rnd_rec_tax_amt +
4470                          p_rec_nrec_dist_tbl(l_index).rec_nrec_tax_amt_funcl_curr;
4471 
4472         -- Refresh l_non_zero_rec_tax_dists_tbl(i).tbl_amt with
4473         -- rec_nrec_tax_amt_funcl_curr.
4474         --
4475         l_non_zero_rec_tax_dists_tbl(i).tbl_amt :=
4476                         p_rec_nrec_dist_tbl(l_index).rec_nrec_tax_amt_funcl_curr;
4477 
4478       END LOOP;
4479     END IF;
4480 
4481     IF l_non_zero_nrec_tax_dists_tbl.COUNT > 0 THEN
4482       FOR i IN l_non_zero_nrec_tax_dists_tbl.FIRST ..
4483                                          l_non_zero_nrec_tax_dists_tbl.LAST LOOP
4484         -- convert tax amount to functional currency and perform rounding for
4485         -- rec_nrec_tax_amt_funcl_curr
4486         --
4487         l_index := l_non_zero_nrec_tax_dists_tbl(i).tbl_index;
4488         p_rec_nrec_dist_tbl(l_index).rec_nrec_tax_amt_funcl_curr :=
4489               p_rec_nrec_dist_tbl(l_index).unrounded_rec_nrec_tax_amt *
4490                          p_rec_nrec_dist_tbl(l_index).currency_conversion_rate;
4491 
4492         p_rec_nrec_dist_tbl(l_index).rec_nrec_tax_amt_funcl_curr :=
4493               round(p_rec_nrec_dist_tbl(l_index).rec_nrec_tax_amt_funcl_curr/
4494                           l_min_acct_unit_funcl_curr)*l_min_acct_unit_funcl_curr;
4495 
4496         -- Accumulate tax amount of converted non-recoverable tax dists
4497         --
4498         l_sum_of_rnd_nrec_tax_amt := l_sum_of_rnd_nrec_tax_amt +
4499                        p_rec_nrec_dist_tbl(l_index).rec_nrec_tax_amt_funcl_curr;
4500 
4501         -- Refresh l_non_zero_rec_tax_dists_tbl(i).tbl_amt with
4502         -- rec_nrec_tax_amt_funcl_curr.
4503         --
4504         l_non_zero_nrec_tax_dists_tbl(i).tbl_amt :=
4505                         p_rec_nrec_dist_tbl(l_index).rec_nrec_tax_amt_funcl_curr;
4506       END LOOP;
4507     END IF;
4508 
4509     -- convert l_rnd_total_rec_tax_amt to functional currency and
4510     -- perform rounding for l_total_unrnd_rec_tax_amt
4511     --
4512     l_rnd_total_rec_tax_amt := l_total_unrnd_rec_tax_amt *
4513                 p_rec_nrec_dist_tbl(p_rnd_begin_index).currency_conversion_rate;
4514     l_rnd_total_rec_tax_amt := round(l_rnd_total_rec_tax_amt/
4515                          l_min_acct_unit_funcl_curr)*l_min_acct_unit_funcl_curr;
4516 
4517     -- convert l_rnd_total_nrec_tax_amt to functional currency and
4518     -- perform rounding for l_total_unrnd_nrec_tax_amt
4519     --
4520     l_rnd_total_nrec_tax_amt := l_total_unrnd_nrec_tax_amt *
4521                  p_rec_nrec_dist_tbl(p_rnd_begin_index).currency_conversion_rate;
4522 
4523     l_rnd_total_nrec_tax_amt := round(l_rnd_total_nrec_tax_amt/
4524                           l_min_acct_unit_funcl_curr)*l_min_acct_unit_funcl_curr;
4525 
4526 
4527     -- calculate rounding difference in functional currency for recoverable and
4528     -- non-recoverable tax distributions
4529     --
4530     l_rec_tax_rnd_diff_funcl_curr :=
4531                                l_rnd_total_rec_tax_amt - l_sum_of_rnd_rec_tax_amt;
4532     l_nrec_tax_rnd_diff_funcl_curr :=
4533                                l_rnd_total_nrec_tax_amt-l_sum_of_rnd_nrec_tax_amt;
4534 
4535     IF l_rec_tax_rnd_diff_funcl_curr <> 0 THEN
4536 
4537       -- Adjust rounding_diff to recoverable tax dists first. if there is no
4538       -- non-zero recoverable tax dists, adjust rounding_diff to nonrecoverable
4539       -- tax dists.
4540       --
4541       IF l_non_zero_rec_tax_dists_tbl.COUNT > 0 THEN
4542 
4543         IF NVL(l_rec_tax_dists_tbl_sort_flg, 'N') <> 'Y' THEN
4544 
4545           -- sort l_non_zero_rec_tax_dists_tbl
4546           --
4547           ZX_TRD_INTERNAL_SERVICES_PVT.sort_tbl_amt_desc (
4548          		p_index_amt_tbl    => l_non_zero_rec_tax_dists_tbl,
4549          		p_return_status    => p_return_status,
4550          		p_error_buffer     => p_error_buffer);
4551 
4552           IF NVL(p_return_status, FND_API.G_RET_STS_ERROR) <> FND_API.G_RET_STS_SUCCESS
4553           THEN
4554             IF (g_level_error >= g_current_runtime_level ) THEN
4555               FND_LOG.STRING(g_level_error,
4556                             'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists',
4557                             'Incorrect return_status after calling ' ||
4558                             'ZX_TRD_INTERNAL_SERVICES_PVT.sort_tbl_amt_desc()');
4559               FND_LOG.STRING(g_level_error,
4560                             'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists.END',
4561                             'ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists(-)'||p_return_status);
4562             END IF;
4563             RETURN;
4564           END IF;
4565 
4566           -- set the sort flag for l_non_zero_rec_tax_dists_tbl
4567           --
4568           l_rec_tax_dists_tbl_sort_flg := 'Y';
4569 
4570         END IF;      -- l_rec_tax_dists_tbl_sort_flg <> 'Y'
4571 
4572         ZX_TRD_INTERNAL_SERVICES_PVT.distribute_rounding_diff (
4573  	  	p_index_amt_tbl => l_non_zero_rec_tax_dists_tbl,
4574  	  	p_rounding_diff => l_rec_tax_rnd_diff_funcl_curr,
4575  	  	p_min_acct_unit => l_min_acct_unit_funcl_curr,
4576  	  	p_return_status => p_return_status,
4577  	  	p_error_buffer  => p_error_buffer);
4578 
4579         -- update rec_nrec_tax_amt_funcl_curr
4580         --
4581         FOR i IN l_non_zero_rec_tax_dists_tbl.FIRST ..
4582                                           l_non_zero_rec_tax_dists_tbl.LAST LOOP
4583           l_index := l_non_zero_rec_tax_dists_tbl(i).tbl_index;
4584 
4585           p_rec_nrec_dist_tbl(l_index).rec_nrec_tax_amt_funcl_curr :=
4586                                          l_non_zero_rec_tax_dists_tbl(i).tbl_amt;
4587         END LOOP;
4588 
4589       ELSIF l_non_zero_nrec_tax_dists_tbl.COUNT > 0 THEN
4590 
4591         IF NVL(l_nrec_tax_dists_tbl_sort_flg, 'N') <> 'Y' THEN
4592           -- sort l_non_zero_nrec_tax_dists_tbl
4593           --
4594           ZX_TRD_INTERNAL_SERVICES_PVT.sort_tbl_amt_desc (
4595          		p_index_amt_tbl    => l_non_zero_nrec_tax_dists_tbl,
4596          		p_return_status    => p_return_status,
4597          		p_error_buffer     => p_error_buffer);
4598 
4599           IF NVL(p_return_status, FND_API.G_RET_STS_ERROR) <> FND_API.G_RET_STS_SUCCESS
4600           THEN
4601             IF (g_level_error >= g_current_runtime_level ) THEN
4602               FND_LOG.STRING(g_level_error,
4603                             'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists',
4604                             'Incorrect return_status after calling ' ||
4605                             'ZX_TRD_INTERNAL_SERVICES_PVT.sort_tbl_amt_desc()');
4606               FND_LOG.STRING(g_level_error,
4607                             'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists.END',
4608                             'ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists(-)'||p_return_status);
4609             END IF;
4610             RETURN;
4611           END IF;
4612 
4613           -- set the sort flag for l_non_zero_rec_tax_dists_tbl
4614           --
4615           l_nrec_tax_dists_tbl_sort_flg := 'Y';
4616 
4617         END IF;      -- l_nrec_tax_dists_tbl_sort_flg <> 'Y'
4618 
4619         ZX_TRD_INTERNAL_SERVICES_PVT.distribute_rounding_diff (
4620  	  	p_index_amt_tbl => l_non_zero_nrec_tax_dists_tbl,
4621  	  	p_rounding_diff => l_rec_tax_rnd_diff_funcl_curr,
4622  	  	p_min_acct_unit => l_min_acct_unit_funcl_curr,
4623  	  	p_return_status => p_return_status,
4624  	  	p_error_buffer  => p_error_buffer);
4625 
4626         IF NVL(p_return_status, FND_API.G_RET_STS_ERROR) <> FND_API.G_RET_STS_SUCCESS
4627         THEN
4628           IF (g_level_error >= g_current_runtime_level ) THEN
4629             FND_LOG.STRING(g_level_error,
4630                           'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists',
4631                           'Incorrect return_status after calling ' ||
4632                           'ZX_TRD_INTERNAL_SERVICES_PVT.distribute_rounding_diff()');
4633             FND_LOG.STRING(g_level_error,
4634                           'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists',
4635                           'RETURN_STATUS = ' || p_return_status);
4636             FND_LOG.STRING(g_level_error,
4637                           'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists.END',
4638                           'ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists(-)');
4639           END IF;
4640           RETURN;
4641         END IF;
4642 
4643         -- update rec_nrec_tax_amt_funcl_curr
4644         --
4645         FOR i IN l_non_zero_nrec_tax_dists_tbl.FIRST ..
4646                                            l_non_zero_nrec_tax_dists_tbl.LAST LOOP
4647 
4648           l_index := l_non_zero_nrec_tax_dists_tbl(i).tbl_index;
4649           p_rec_nrec_dist_tbl(l_index).rec_nrec_tax_amt_funcl_curr :=
4650                                          l_non_zero_nrec_tax_dists_tbl(i).tbl_amt;
4651         END LOOP;
4652       END IF;
4653     END IF;      -- l_rec_tax_rnd_diff_funcl_curr <> 0
4654 
4655     IF l_nrec_tax_rnd_diff_funcl_curr <> 0 THEN
4656 
4657       -- Adjust rounding_diff to nonrecoverable tax dists first. if there is no
4658       -- nonrecoverable tax dists, adjust rounding_diff to recoverable tax dists.
4659       --
4660       IF l_non_zero_nrec_tax_dists_tbl.COUNT > 0 THEN
4661 
4662         IF NVL(l_nrec_tax_dists_tbl_sort_flg, 'N') <> 'Y' THEN
4663           -- sort l_non_zero_nrec_tax_dists_tbl
4664           --
4665           ZX_TRD_INTERNAL_SERVICES_PVT.sort_tbl_amt_desc (
4666          		p_index_amt_tbl    => l_non_zero_nrec_tax_dists_tbl,
4667          		p_return_status    => p_return_status,
4668          		p_error_buffer     => p_error_buffer);
4669 
4670           IF NVL(p_return_status, FND_API.G_RET_STS_ERROR) <> FND_API.G_RET_STS_SUCCESS
4671           THEN
4672             IF (g_level_error >= g_current_runtime_level ) THEN
4673               FND_LOG.STRING(g_level_error,
4674                             'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists',
4675                             'Incorrect return_status after calling ' ||
4676                             'ZX_TRD_INTERNAL_SERVICES_PVT.sort_tbl_amt_desc()');
4677               FND_LOG.STRING(g_level_error,
4678                             'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists',
4679                             'RETURN_STATUS = ' || p_return_status);
4680               FND_LOG.STRING(g_level_error,
4681                             'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists.END',
4682                             'ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists(-)');
4683             END IF;
4684             RETURN;
4685           END IF;
4686 
4687           -- set the sort flag for l_non_zero_nrec_tax_dists_tbl
4688           --
4689           l_nrec_tax_dists_tbl_sort_flg := 'Y';
4690 
4691         END IF;      -- l_nrec_tax_dists_tbl_sort_flg <> 'Y'
4692 
4693         ZX_TRD_INTERNAL_SERVICES_PVT.distribute_rounding_diff (
4694  	  	p_index_amt_tbl => l_non_zero_nrec_tax_dists_tbl,
4695  	  	p_rounding_diff => l_nrec_tax_rnd_diff_funcl_curr,
4696  	  	p_min_acct_unit => l_min_acct_unit_funcl_curr,
4697  	  	p_return_status => p_return_status,
4698  	  	p_error_buffer  => p_error_buffer);
4699 
4700         IF NVL(p_return_status, FND_API.G_RET_STS_ERROR) <> FND_API.G_RET_STS_SUCCESS
4701         THEN
4702           IF (g_level_error >= g_current_runtime_level ) THEN
4703             FND_LOG.STRING(g_level_error,
4704                           'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists',
4705                           'Incorrect return_status after calling ' ||
4706                           'ZX_TRD_INTERNAL_SERVICES_PVT.distribute_rounding_diff()');
4707             FND_LOG.STRING(g_level_error,
4708                           'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists',
4709                           'RETURN_STATUS = ' || p_return_status);
4710             FND_LOG.STRING(g_level_error,
4711                           'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists.END',
4712                           'ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists(-)');
4713           END IF;
4714           RETURN;
4715         END IF;
4716 
4717         -- update rec_nrec_tax_amt_funcl_curr
4718         --
4719         FOR i IN l_non_zero_nrec_tax_dists_tbl.FIRST ..
4720                                          l_non_zero_nrec_tax_dists_tbl.LAST LOOP
4721 
4722           l_index := l_non_zero_nrec_tax_dists_tbl(i).tbl_index;
4723           p_rec_nrec_dist_tbl(l_index).rec_nrec_tax_amt_funcl_curr :=
4724                                          l_non_zero_nrec_tax_dists_tbl(i).tbl_amt;
4725         END LOOP;
4726 
4727       ELSIF l_non_zero_rec_tax_dists_tbl.COUNT > 0 THEN
4728 
4729         IF NVL(l_rec_tax_dists_tbl_sort_flg, 'N') <> 'Y' THEN
4730           -- sort l_non_zero_rec_tax_dists_tbl
4731           --
4732           ZX_TRD_INTERNAL_SERVICES_PVT.sort_tbl_amt_desc (
4733          		p_index_amt_tbl    => l_non_zero_rec_tax_dists_tbl,
4734          		p_return_status    => p_return_status,
4735          		p_error_buffer     => p_error_buffer);
4736 
4737           IF NVL(p_return_status, FND_API.G_RET_STS_ERROR) <> FND_API.G_RET_STS_SUCCESS
4738           THEN
4739             IF (g_level_error >= g_current_runtime_level ) THEN
4740               FND_LOG.STRING(g_level_error,
4741                             'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists',
4742                             'Incorrect return_status after calling ' ||
4743                             'ZX_TRD_INTERNAL_SERVICES_PVT.sort_tbl_amt_desc()');
4744               FND_LOG.STRING(g_level_error,
4745                             'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists',
4746                             'RETURN_STATUS = ' || p_return_status);
4747               FND_LOG.STRING(g_level_error,
4748                             'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists.END',
4749                             'ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists(-)');
4750             END IF;
4751             RETURN;
4752           END IF;
4753 
4754           -- set the sort flag for l_non_zero_rec_tax_dists_tbl
4755           --
4756           l_rec_tax_dists_tbl_sort_flg := 'Y';
4757 
4758         END IF;      -- l_rec_tax_dists_tbl_sort_flg <> 'Y'
4759 
4760         ZX_TRD_INTERNAL_SERVICES_PVT.distribute_rounding_diff (
4761  	  	p_index_amt_tbl => l_non_zero_rec_tax_dists_tbl,
4762  	  	p_rounding_diff => l_nrec_tax_rnd_diff_funcl_curr,
4763  	  	p_min_acct_unit => l_min_acct_unit_funcl_curr,
4764  	  	p_return_status => p_return_status,
4765  	  	p_error_buffer  => p_error_buffer);
4766 
4767         IF NVL(p_return_status, FND_API.G_RET_STS_ERROR) <> FND_API.G_RET_STS_SUCCESS
4768         THEN
4769           IF (g_level_error >= g_current_runtime_level ) THEN
4770             FND_LOG.STRING(g_level_error,
4771                           'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists',
4772                           'Incorrect return_status after calling ' ||
4773                           'ZX_TRD_INTERNAL_SERVICES_PVT.distribute_rounding_diff()');
4774             FND_LOG.STRING(g_level_error,
4775                           'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists',
4776                           'RETURN_STATUS = ' || p_return_status);
4777             FND_LOG.STRING(g_level_error,
4778                           'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists.END',
4779                           'ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists(-)');
4780           END IF;
4781           RETURN;
4782         END IF;
4783 
4784         -- update rec_nrec_tax_amt_funcl_curr
4785         --
4786         FOR i IN l_non_zero_rec_tax_dists_tbl.FIRST ..
4787                                             l_non_zero_rec_tax_dists_tbl.LAST LOOP
4788 
4789           l_index := l_non_zero_rec_tax_dists_tbl(i).tbl_index;
4790           p_rec_nrec_dist_tbl(l_index).rec_nrec_tax_amt_funcl_curr :=
4791                                          l_non_zero_rec_tax_dists_tbl(i).tbl_amt;
4792         END LOOP;
4793       END IF;
4794     END IF;      -- l_nrec_tax_rnd_diff_funcl_curr <> 0
4795 
4796     IF p_tax_line_amt_funcl_curr IS NOT NULL THEN
4797 
4798       -- calculate rounding difference for amount of tax line
4799       --
4800       l_tax_line_rnd_diff_funcl_curr := p_tax_line_amt_funcl_curr -
4801                            (l_rnd_total_rec_tax_amt + l_rnd_total_nrec_tax_amt);
4802 
4803 
4804       IF l_tax_line_rnd_diff_funcl_curr > 0 THEN
4805 
4806         -- Adjust this rounding difference to the largest non-zero
4807         -- non-recoverabletax distribution (check first), or adjust it to
4808         -- the largest non-zero recoverable tax distribution.
4809         --
4810         IF l_non_zero_nrec_tax_dists_tbl.COUNT > 0 THEN
4811 
4812           l_index := l_non_zero_nrec_tax_dists_tbl(
4813                                      l_non_zero_nrec_tax_dists_tbl.FIRST).tbl_index;
4814           p_rec_nrec_dist_tbl(l_index).rec_nrec_tax_amt_funcl_curr :=
4815                   p_rec_nrec_dist_tbl(l_index).rec_nrec_tax_amt_funcl_curr +
4816                                                      l_tax_line_rnd_diff_funcl_curr;
4817 
4818           -- store rounding adjustment
4819           --
4820           p_rec_nrec_dist_tbl(l_index).func_curr_rounding_adjustment :=
4821                                                      l_tax_line_rnd_diff_funcl_curr;
4822 
4823 
4824           IF (g_level_statement >= g_current_runtime_level ) THEN
4825             FND_LOG.STRING(g_level_statement,
4826                           'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists',
4827                           'Rounding Dif adjusted to the largest non-rec tax dist '||l_index);
4828           END IF;
4829 
4830         ELSIF l_non_zero_rec_tax_dists_tbl.COUNT > 0 THEN
4831 
4832           l_index := l_non_zero_rec_tax_dists_tbl(
4833                                      l_non_zero_rec_tax_dists_tbl.FIRST).tbl_index;
4834           p_rec_nrec_dist_tbl(l_index).rec_nrec_tax_amt_funcl_curr :=
4835                   p_rec_nrec_dist_tbl(l_index).rec_nrec_tax_amt_funcl_curr +
4836                                                      l_tax_line_rnd_diff_funcl_curr;
4837 
4838           -- store rounding adjustment
4839           --
4840           p_rec_nrec_dist_tbl(l_index).func_curr_rounding_adjustment :=
4841                                                      l_tax_line_rnd_diff_funcl_curr;
4842 
4843           IF (g_level_statement >= g_current_runtime_level ) THEN
4844             FND_LOG.STRING(g_level_statement,
4845                           'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists',
4846                           'Rounding Dif adjusted to the largest rec tax dist '||l_index);
4847           END IF;
4848 
4849         END IF;
4850 
4851       ELSIF l_tax_line_rnd_diff_funcl_curr < 0 THEN
4852 
4853         -- Adjust this rounding difference to the largest non-zero
4854         -- recoverabletax distribution (check first), or adjust it to
4855         -- the largest non-zero non-recoverable tax distribution.
4856         --
4857         IF l_non_zero_rec_tax_dists_tbl.COUNT > 0  THEN
4858 
4859           l_index := l_non_zero_rec_tax_dists_tbl(
4860                                      l_non_zero_rec_tax_dists_tbl.FIRST).tbl_index;
4861           p_rec_nrec_dist_tbl(l_index).rec_nrec_tax_amt_funcl_curr :=
4862                   p_rec_nrec_dist_tbl(l_index).rec_nrec_tax_amt_funcl_curr +
4863                                                        l_tax_line_rnd_diff_funcl_curr;
4864 
4865           -- store rounding adjustment
4866           --
4867           p_rec_nrec_dist_tbl(l_index).func_curr_rounding_adjustment :=
4868                                                      l_tax_line_rnd_diff_funcl_curr;
4869 
4870 
4871           IF (g_level_statement >= g_current_runtime_level ) THEN
4872             FND_LOG.STRING(g_level_statement,
4873                           'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists',
4874                           'Rounding Dif adjusted to the largest rec tax dist '||l_index);
4875           END IF;
4876 
4877 
4878         ELSIF  l_non_zero_nrec_tax_dists_tbl.COUNT > 0  THEN
4879 
4880           l_index := l_non_zero_nrec_tax_dists_tbl(
4881                                      l_non_zero_nrec_tax_dists_tbl.FIRST).tbl_index;
4882 
4883           p_rec_nrec_dist_tbl(l_index).rec_nrec_tax_amt_funcl_curr :=
4884                   p_rec_nrec_dist_tbl(l_index).rec_nrec_tax_amt_funcl_curr +
4885                                                        l_tax_line_rnd_diff_funcl_curr;
4886 
4887           -- store rounding adjustment
4888           --
4889           p_rec_nrec_dist_tbl(l_index).func_curr_rounding_adjustment :=
4890                                                      l_tax_line_rnd_diff_funcl_curr;
4891 
4892           IF (g_level_statement >= g_current_runtime_level ) THEN
4893             FND_LOG.STRING(g_level_statement,
4894                           'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists',
4895                           'Rounding Dif adjusted to the largest non-rec tax dist '||l_index);
4896           END IF;
4897 
4898         END IF;
4899       END IF;   -- l_tax_line_rnd_diff_tax_curr > 0 OR < 0
4900     END IF;      -- p_tax_line_amt_funcl_curr IS NOT NULL
4901 
4902     -- converting taxable_amt to functional currency.
4903     --
4904     FOR i IN p_rnd_begin_index .. p_rnd_end_index LOOP
4905       IF NVL(p_rec_nrec_dist_tbl(i).reverse_flag, 'N') = 'N' THEN
4906         IF l_funcl_currency_code <>  p_rec_nrec_dist_tbl(i).trx_currency_code THEN
4907           -- convert to functional currency
4908           --
4909           p_rec_nrec_dist_tbl(i).taxable_amt_funcl_curr :=
4910                 p_rec_nrec_dist_tbl(i).unrounded_taxable_amt *
4911                                   p_rec_nrec_dist_tbl(i).currency_conversion_rate;
4912           -- round
4913           p_rec_nrec_dist_tbl(i).taxable_amt_funcl_curr :=
4914                 round(p_rec_nrec_dist_tbl(i).taxable_amt_funcl_curr/
4915                            l_min_acct_unit_funcl_curr)*l_min_acct_unit_funcl_curr;
4916         ELSE
4917           p_rec_nrec_dist_tbl(i).taxable_amt_funcl_curr :=
4918                                               p_rec_nrec_dist_tbl(i).taxable_amt;
4919         END IF;
4920       END IF;
4921     END LOOP;
4922 
4923   ELSE    -- p_rec_nrec_dist_tbl(i).ledger_id IS NULL
4924     IF (g_level_procedure >= g_current_runtime_level ) THEN
4925 
4926       FND_LOG.STRING(g_level_procedure,
4927                     'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists.END',
4928                     'ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists(-)'||
4929                     ' null Ledger_id cannot perform conversion to functional currency');
4930     END IF;
4931   END IF;
4932   --
4933   --   /****** END OF CONVERSION AND ROUNDING OF FUNCTIONAL CURRENCY ******/
4934 
4935   IF (g_level_procedure >= g_current_runtime_level ) THEN
4936 
4937     FND_LOG.STRING(g_level_procedure,
4938                   'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists.END',
4939                   'ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists(-)'||p_return_status);
4940   END IF;
4941 
4942 EXCEPTION
4943 
4944   WHEN OTHERS THEN
4945     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4946     p_error_buffer := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
4947 
4948     IF (g_level_unexpected >= g_current_runtime_level ) THEN
4949       FND_LOG.STRING(g_level_unexpected,
4950                     'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists',
4951                      p_error_buffer);
4952       FND_LOG.STRING(g_level_unexpected,
4953                     'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists.END',
4954                     'ZX_TRD_INTERNAL_SERVICES_PVT.convert_tax_dists(-)');
4955       END IF;
4956 
4957 END convert_tax_dists;
4958 
4959 
4960 PROCEDURE distribute_rounding_diff (
4961  p_index_amt_tbl   	IN OUT NOCOPY	index_amt_tbl_type,
4962  p_rounding_diff	IN 		NUMBER,
4963  p_min_acct_unit	IN		NUMBER,
4964  p_return_status        OUT NOCOPY     VARCHAR2,
4965  p_error_buffer	        OUT NOCOPY     VARCHAR2) IS
4966 
4967  l_num_of_min_units		NUMBER;
4968  l_num_of_multiples		NUMBER;
4969  l_remainder                  	NUMBER;
4970 
4971 BEGIN
4972 
4973   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
4974 
4975   IF (g_level_procedure >= g_current_runtime_level ) THEN
4976     FND_LOG.STRING(g_level_procedure,
4977                   'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.distribute_rounding_diff.BEGIN',
4978                   'ZX_TRD_INTERNAL_SERVICES_PVT.distribute_rounding_diff(+)'||
4979                    'p_rounding_diff = ' || p_rounding_diff);
4980   END IF;
4981 
4982   p_return_status:= FND_API.G_RET_STS_SUCCESS;
4983 
4984   -- Adjust rounding difference
4985   --
4986   IF p_rounding_diff = 0 THEN
4987     IF (g_level_procedure >= g_current_runtime_level ) THEN
4988 
4989       FND_LOG.STRING(g_level_procedure,
4990                     'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.distribute_rounding_diff.END',
4991                     'ZX_TRD_INTERNAL_SERVICES_PVT.distribute_rounding_diff(-)'||'no diff');
4992     END IF;
4993     RETURN;
4994 
4995   ELSE
4996 
4997     l_num_of_min_units := ABS(TRUNC(p_rounding_diff/p_min_acct_unit));
4998 
4999     IF p_index_amt_tbl.COUNT > 0 THEN
5000 
5001       l_num_of_multiples := TRUNC(l_num_of_min_units/ p_index_amt_tbl.COUNT);
5002       l_remainder := MOD(l_num_of_min_units, p_index_amt_tbl.COUNT);
5003 
5004       IF l_num_of_multiples <> 0 THEN
5005 
5006         FOR i IN p_index_amt_tbl.FIRST .. p_index_amt_tbl.LAST LOOP
5007 
5008           p_index_amt_tbl(i).tbl_amt := p_index_amt_tbl(i).tbl_amt +
5009                    p_min_acct_unit * l_num_of_multiples * SIGN(p_rounding_diff);
5010 
5011         END LOOP;  -- IN p_index_amt_tbl.FIRST .. p_index_amt_tbl.LAST LOOP
5012 
5013       END IF;      -- l_num_of_multiples <> 0
5014 
5015       IF l_remainder <> 0 THEN
5016 
5017         FOR i IN 1 .. l_remainder LOOP
5018           p_index_amt_tbl(i).tbl_amt := p_index_amt_tbl(i).tbl_amt +
5019                                        p_min_acct_unit *  SIGN(p_rounding_diff);
5020 
5021         END LOOP;    -- IN 1 .. l_remainder LOOP
5022 
5023       END IF;        -- l_remainder <> 0
5024     ELSE             -- p_index_amt_tbl.COUNT = 0
5025       IF (g_level_procedure >= g_current_runtime_level ) THEN
5026 
5027         FND_LOG.STRING(g_level_procedure,
5028                       'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.distribute_rounding_diff.END',
5029                       'ZX_TRD_INTERNAL_SERVICES_PVT.distribute_rounding_diff(-)'||
5030                       'p_index_amt_tbl is empty');
5031       END IF;
5032       RETURN;
5033     END IF;          -- p_index_amt_tbl.COUNT > 0 OR NOT
5034   END IF;            -- p_rounding_diff <> 0 OR NOT
5035 
5036   IF (g_level_procedure >= g_current_runtime_level ) THEN
5037     FND_LOG.STRING(g_level_procedure,
5038                   'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.distribute_rounding_diff.END',
5039                   'ZX_TRD_INTERNAL_SERVICES_PVT.distribute_rounding_diff(-)'||
5040                    p_return_status);
5041   END IF;
5042 
5043 EXCEPTION
5044 
5045   WHEN OTHERS THEN
5046     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5047     p_error_buffer := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
5048 
5049     IF (g_level_unexpected >= g_current_runtime_level ) THEN
5050       FND_LOG.STRING(g_level_unexpected,
5051                     'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.distribute_rounding_diff',
5052                      p_error_buffer);
5053       FND_LOG.STRING(g_level_unexpected,
5054                     'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.distribute_rounding_diff.END',
5055                     'ZX_TRD_INTERNAL_SERVICES_PVT.distribute_rounding_diff(-)');
5056     END IF;
5057 
5058 END distribute_rounding_diff;
5059 
5060 PROCEDURE sort_tbl_amt_desc (
5061  p_index_amt_tbl   	IN OUT NOCOPY  index_amt_tbl_type,
5062  p_return_status        OUT NOCOPY     VARCHAR2,
5063  p_error_buffer	        OUT NOCOPY     VARCHAR2) IS
5064 
5065  l_length			NUMBER;
5066  l_incr 			NUMBER;
5067  l_first        		NUMBER;
5068  l_temp_amt 			NUMBER;
5069  l_temp_index			NUMBER;
5070  l_temp_num     		NUMBER;
5071 
5072 BEGIN
5073 
5074   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
5075 
5076   IF (g_level_procedure >= g_current_runtime_level ) THEN
5077     FND_LOG.STRING(g_level_procedure,
5078                   'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.sort_tbl_amt_desc.BEGIN',
5079                   'ZX_TRD_INTERNAL_SERVICES_PVT.sort_tbl_amt_desc(+)');
5080   END IF;
5081 
5082   p_return_status:= FND_API.G_RET_STS_SUCCESS;
5083 
5084   --  initialize local variables
5085   --
5086   l_length := p_index_amt_tbl.COUNT;
5087   l_incr := TRUNC(l_length/2);
5088   l_first := p_index_amt_tbl.FIRST;
5089 
5090   -- sorting p_index_amt_tbl using SHELL sort method
5091   --
5092   WHILE l_incr >= 1 LOOP
5093 
5094     FOR i IN l_incr + l_first .. l_first + l_length - 1 LOOP
5095 
5096       -- hold the values at the current index intemporary variables
5097       --
5098       l_temp_index := p_index_amt_tbl(i).tbl_index;
5099       l_temp_amt := p_index_amt_tbl(i).tbl_amt;
5100       l_temp_num := i;
5101 
5102       WHILE ( l_temp_num  >= l_incr + l_first AND l_temp_amt >
5103               p_index_amt_tbl(l_temp_num - l_incr).tbl_amt ) LOOP
5104 
5105 
5106         p_index_amt_tbl(l_temp_num).tbl_index :=
5107                          p_index_amt_tbl(l_temp_num - l_incr).tbl_index;
5108 
5109         p_index_amt_tbl(l_temp_num).tbl_amt :=
5110                          p_index_amt_tbl(l_temp_num - l_incr).tbl_amt;
5111 
5112         l_temp_num := l_temp_num - l_incr;
5113 
5114       END LOOP;
5115 
5116       p_index_amt_tbl(l_temp_num).tbl_index := l_temp_index;
5117       p_index_amt_tbl(l_temp_num).tbl_amt := l_temp_amt;
5118 
5119     END LOOP;    --
5120 
5121     l_incr := trunc(l_incr/2);
5122 
5123   END LOOP;
5124 
5125   IF (g_level_procedure >= g_current_runtime_level ) THEN
5126 
5127     FND_LOG.STRING(g_level_procedure,
5128                   'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.sort_tbl_amt_desc.END',
5129                   'ZX_TRD_INTERNAL_SERVICES_PVT.sort_tbl_amt_desc(-)'||p_return_status);
5130   END IF;
5131 
5132 EXCEPTION
5133 
5134   WHEN OTHERS THEN
5135     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5136     p_error_buffer := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
5137 
5138     IF (g_level_unexpected >= g_current_runtime_level ) THEN
5139       FND_LOG.STRING(g_level_unexpected,
5140                     'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.sort_tbl_amt_desc',
5141                      p_error_buffer);
5142       FND_LOG.STRING(g_level_unexpected,
5143                     'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.sort_tbl_amt_desc.END',
5144                     'ZX_TRD_INTERNAL_SERVICES_PVT.sort_tbl_amt_desc(-)');
5145     END IF;
5146 
5147 END sort_tbl_amt_desc;
5148 
5149 PROCEDURE get_recovery_from_applied(
5150  p_tax_id                     IN            NUMBER,
5151  p_tax_apportionment_line_num IN            NUMBER,
5152  p_prd_total_tax_amt          IN            NUMBER,
5153  p_trx_line_dist_index        IN            NUMBER,
5154  p_rec_nrec_dist_tbl          IN OUT NOCOPY ZX_TRD_SERVICES_PUB_PKG.REC_NREC_DIST_TBL_TYPE,
5155  p_rnd_begin_index            IN            NUMBER,
5156  p_rnd_end_index              OUT NOCOPY    NUMBER,
5157  p_return_status              OUT NOCOPY    VARCHAR2,
5158  p_error_buffer               OUT NOCOPY    VARCHAR2) IS
5159 
5160  CURSOR  get_tax_dists_csr IS
5161   SELECT recoverable_flag,
5162          recovery_type_code,
5163          rec_type_rule_flag,
5164          rec_rate_det_rule_flag,
5165          recovery_rate_id,
5166          recovery_rate_code,
5167          rec_nrec_rate,
5168          rec_nrec_tax_dist_id,
5169          rec_nrec_tax_amt,
5170          rec_nrec_tax_amt_tax_curr,
5171          rec_nrec_tax_amt_funcl_curr,
5172          trx_line_dist_amt,
5173          def_rec_settlement_option_code,
5174          account_source_tax_rate_id
5175     FROM zx_rec_nrec_dist
5176    WHERE application_id =
5177           ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.applied_from_application_id(
5178                                                            p_trx_line_dist_index)
5179      AND entity_code =
5180            ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.applied_from_entity_code(
5181                                                           p_trx_line_dist_index)
5182      AND event_class_code  =
5183            ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.applied_from_event_class_code(
5184                                                               p_trx_line_dist_index)
5185      AND trx_id =
5186            ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.applied_from_trx_id(
5187                                                               p_trx_line_dist_index)
5188      AND trx_line_id =
5189            ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.applied_from_line_id(
5190                                                                p_trx_line_dist_index)
5191      AND trx_level_type =
5192            ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.applied_from_trx_level_type(
5193                                                                p_trx_line_dist_index)
5194      AND trx_line_dist_id =
5195            ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.applied_from_dist_id(
5196                                                                p_trx_line_dist_index)
5197      AND tax_id = p_tax_id
5198      -- Modified the condition for Bug#16601146
5199      AND NVL(tax_apportionment_line_number,p_tax_apportionment_line_num) = p_tax_apportionment_line_num
5200      -- AND NVL(tax_apportionment_line_number,-99) =
5201      --     DECODE(historical_flag,'Y',p_tax_apportionment_line_num,NVL(tax_apportionment_line_number,-99))
5202      AND NVL(reverse_flag, 'N') <> 'Y'
5203    ORDER BY rec_nrec_tax_dist_id, recoverable_flag;
5204 
5205   l_rec_nrec_tax_dist_number		NUMBER;
5206 
5207 BEGIN
5208 
5209   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
5210   IF (g_level_procedure >= g_current_runtime_level ) THEN
5211     FND_LOG.STRING(g_level_procedure,
5212                   'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_recovery_from_applied.BEGIN',
5213                   'ZX_TRD_INTERNAL_SERVICES_PVT.get_recovery_from_applied(+)');
5214   END IF;
5215 
5216   p_return_status := FND_API.G_RET_STS_SUCCESS;
5217 
5218   p_rnd_end_index := p_rnd_begin_index -1;
5219   l_rec_nrec_tax_dist_number:= 0;
5220 
5221   ZX_TDS_UTILITIES_PKG.populate_tax_cache (
5222     				p_tax_id	 => p_tax_id,
5223     				p_return_status  => p_return_status,
5224     				p_error_buffer   => p_error_buffer);
5225 
5226   IF (g_level_statement >= g_current_runtime_level ) THEN
5227     FND_LOG.STRING(g_level_statement,
5228                   'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_recovery_from_applied',
5229                   'Fetching Tax Dists for: '||
5230                   'APPLIED_FROM_APPLICATION_ID : '||TO_CHAR(ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.applied_from_application_id(p_trx_line_dist_index)) ||', '||
5231                   'APPLIED_FROM_ENTITY_CODE : '||ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.applied_from_entity_code(p_trx_line_dist_index)                ||', '||
5232                   'APPLIED_FROM_EVENT_CLASS_CODE : '||ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.applied_from_event_class_code(p_trx_line_dist_index)      ||', '||
5233                   'APPLIED_FROM_TRX_ID : '||TO_CHAR(ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.applied_from_trx_id(p_trx_line_dist_index))                 ||', '||
5234                   'APPLIED_FROM_LINE_ID : '||TO_CHAR(ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.applied_from_line_id(p_trx_line_dist_index))               ||', '||
5235                   'APPLIED_FROM_TRX_LEVEL_TYPE : '||ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.applied_from_trx_level_type(p_trx_line_dist_index)          ||', '||
5236                   'APPLIED_FROM_DIST_ID : '||TO_CHAR(ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.applied_from_dist_id(p_trx_line_dist_index))               ||', '||
5237                   'TAX_ID : '||TO_CHAR(p_tax_id) ||', '||
5238                   'TAX_APPORTIONMENT_LINE_NUMBER : '||TO_CHAR(p_tax_apportionment_line_num)
5239                   );
5240   END IF;
5241 
5242   IF (g_level_statement >= g_current_runtime_level ) THEN
5243     FND_LOG.STRING(g_level_statement,
5244                    'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_recovery_from_applied',
5245                    'Updating Tax_Apportionment_Line_Number in the tax distributions of Applied_From Doc...');
5246   END IF;
5247 
5248   UPDATE zx_rec_nrec_dist zd
5249      SET tax_apportionment_line_number =
5250                 (SELECT tax_apportionment_line_number
5251                    FROM zx_lines zl
5252                   WHERE zl.tax_line_id = zd.tax_line_id)
5253    WHERE application_id = ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.applied_from_application_id(p_trx_line_dist_index)
5254      AND entity_code = ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.applied_from_entity_code(p_trx_line_dist_index)
5255      AND event_class_code  = ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.applied_from_event_class_code(p_trx_line_dist_index)
5256      AND trx_id = ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.applied_from_trx_id(p_trx_line_dist_index)
5257      AND trx_line_id = ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.applied_from_line_id(p_trx_line_dist_index)
5258      AND trx_level_type = ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.applied_from_trx_level_type(p_trx_line_dist_index)
5259      AND trx_line_dist_id = ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.applied_from_dist_id(p_trx_line_dist_index)
5260      AND tax_apportionment_line_number IS NULL
5261      AND NVL(reverse_flag, 'N') <> 'Y';
5262 
5263   IF (g_level_statement >= g_current_runtime_level ) THEN
5264     FND_LOG.STRING(g_level_statement,
5265                    'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_recovery_from_applied',
5266                    '  Rows updated : '|| TO_CHAR(SQL%ROWCOUNT));
5267   END IF;
5268 
5269   FOR tax_dist_rec in get_tax_dists_csr LOOP
5270 
5271     IF (g_level_statement >= g_current_runtime_level ) THEN
5272       FND_LOG.STRING(g_level_statement,
5273                     'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_recovery_from_applied',
5274                     'Fetched Record: '||
5275                     'REC_NREC_TAX_DIST_ID : '|| TO_CHAR(tax_dist_rec.rec_nrec_tax_dist_id) ||', '||
5276                     'RECOVERY_RATE_CODE : '|| tax_dist_rec.Recovery_rate_code ||', '||
5277                     'RECOVERY_RATE_ID : '|| TO_CHAR(tax_dist_rec.recovery_rate_id) ||', '||
5278                     'REC_NREC_RATE : '|| TO_CHAR(tax_dist_rec.rec_nrec_rate) ||', '||
5279                     'RECOVERABLE_FLAG : '|| tax_dist_rec.recoverable_flag ||', '||
5280                     'RECOVERY_TYPE_CODE : '|| tax_dist_rec.recovery_type_code ||', '||
5281                     'REC_TYPE_RULE_FLAG : '|| tax_dist_rec.rec_type_rule_flag ||', '||
5282                     'REC_RATE_DET_RULE_FLAG : '|| tax_dist_rec.rec_rate_det_rule_flag ||', '||
5283                     'REC_NREC_TAX_AMT : '|| TO_CHAR(tax_dist_rec.rec_nrec_tax_amt) ||', '||
5284                     'REC_NREC_TAX_AMT_TAX_CURR : '|| TO_CHAR(tax_dist_rec.rec_nrec_tax_amt_tax_curr) ||', '||
5285                     'REC_NREC_TAX_AMT_FUNCL_CURR : '|| TO_CHAR(tax_dist_rec.rec_nrec_tax_amt_funcl_curr) ||', '||
5286                     'TRX_LINE_DIST_AMT : '|| TO_CHAR(tax_dist_rec.trx_line_dist_amt) ||', '||
5287                     'DEF_REC_SETTLEMENT_OPTION_CODE : '|| tax_dist_rec.def_rec_settlement_option_code ||', '||
5288                     'ACCOUNT_SOURCE_TAX_RATE_ID : '|| TO_CHAR(tax_dist_rec.account_source_tax_rate_id)
5289                     );
5290     END IF;
5291 
5292     l_rec_nrec_tax_dist_number := l_rec_nrec_tax_dist_number + 1;
5293     p_rnd_end_index := p_rnd_end_index + 1;
5294 
5295     p_rec_nrec_dist_tbl(p_rnd_end_index).recoverable_flag :=
5296                                                  tax_dist_rec.recoverable_flag;
5297     p_rec_nrec_dist_tbl(p_rnd_end_index).recovery_type_code :=
5298                                               tax_dist_rec.recovery_type_code;
5299     p_rec_nrec_dist_tbl(p_rnd_end_index).rec_type_rule_flag :=
5300                                               tax_dist_rec.rec_type_rule_flag;
5301     p_rec_nrec_dist_tbl(p_rnd_end_index).rec_rate_det_rule_flag :=
5302                                            tax_dist_rec.rec_rate_det_rule_flag;
5303     p_rec_nrec_dist_tbl(p_rnd_end_index).applied_from_tax_dist_id :=
5304                                             tax_dist_rec.rec_nrec_tax_dist_id;
5305     p_rec_nrec_dist_tbl(p_rnd_end_index).rec_nrec_tax_dist_number:=
5306                                                    l_rec_nrec_tax_dist_number;
5307 
5308     -- 1. If applied_amt_handling_flag ='P', populate recovery_rate_code,
5309     --    recovery_rate_id and rec_nrec_rate from applied from document.
5310     --    Tax distributions are proarted based the amount applied.
5311     -- 2. If applied_amt_handling_flag ='R', populate recovery_rate_code from
5312     --    applied document. recovery_rate_id and rec_nrec_rate are determined
5313     --    in the current document. Tax distributions are recalculated based on
5314     --    the rec_nrec_ratein the current document.
5315     --
5316     IF ZX_TDS_UTILITIES_PKG.g_tax_rec_tbl(
5317                               p_tax_id).applied_amt_handling_flag = 'P' THEN
5318       p_rec_nrec_dist_tbl(p_rnd_end_index).recovery_rate_code :=
5319                                               tax_dist_rec.recovery_rate_code;
5320       p_rec_nrec_dist_tbl(p_rnd_end_index).recovery_rate_id :=
5321                                                 tax_dist_rec.recovery_rate_id;
5322       p_rec_nrec_dist_tbl(p_rnd_end_index).rec_nrec_rate :=
5323                                                    tax_dist_rec.rec_nrec_rate;
5324       -- populate prd_total_tax_amt
5325       p_rec_nrec_dist_tbl(p_rnd_end_index).prd_total_tax_amt :=
5326                                                           p_prd_total_tax_amt;
5327       p_rec_nrec_dist_tbl(p_rnd_end_index).def_rec_settlement_option_code :=
5328                                   tax_dist_rec.def_rec_settlement_option_code;
5329       p_rec_nrec_dist_tbl(p_rnd_end_index).account_source_tax_rate_id :=
5330                                       tax_dist_rec.account_source_tax_rate_id;
5331 
5332     ELSIF ZX_TDS_UTILITIES_PKG.g_tax_rec_tbl(
5333                                 p_tax_id).applied_amt_handling_flag = 'R' THEN
5334       p_rec_nrec_dist_tbl(p_rnd_end_index).recovery_rate_code :=
5335                                               tax_dist_rec.recovery_rate_code;
5336 
5337       p_rec_nrec_dist_tbl(p_rnd_end_index).prd_tax_amt :=
5338         tax_dist_rec.rec_nrec_tax_amt *
5339         ZX_GLOBAL_STRUCTURES_PKG.TRX_LINE_DIST_TBL.TRX_LINE_DIST_AMT(p_trx_line_dist_index)/
5340         tax_dist_rec.trx_line_dist_amt;
5341 
5342       p_rec_nrec_dist_tbl(p_rnd_end_index).prd_tax_amt_tax_curr :=
5343         tax_dist_rec.rec_nrec_tax_amt_tax_curr *
5344         ZX_GLOBAL_STRUCTURES_PKG.TRX_LINE_DIST_TBL.TRX_LINE_DIST_AMT(p_trx_line_dist_index)/
5345         tax_dist_rec.trx_line_dist_amt;
5346 
5347       IF tax_dist_rec.rec_nrec_tax_amt_funcl_curr IS NOT NULL THEN
5348         p_rec_nrec_dist_tbl(p_rnd_end_index).prd_tax_amt_funcl_curr :=
5349           tax_dist_rec.rec_nrec_tax_amt_funcl_curr *
5350           ZX_GLOBAL_STRUCTURES_PKG.TRX_LINE_DIST_TBL.TRX_LINE_DIST_AMT(p_trx_line_dist_index)/
5351           tax_dist_rec.trx_line_dist_amt;
5352       END IF;
5353     END IF;
5354 
5355   END LOOP;
5356 
5357   IF (g_level_procedure >= g_current_runtime_level) THEN
5358 
5359     FND_LOG.STRING(g_level_procedure,
5360                   'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_recovery_from_applied.END',
5361                   'ZX_TRD_INTERNAL_SERVICES_PVT.get_recovery_from_applied(-)'||p_return_status);
5362   END IF;
5363 
5364 EXCEPTION
5365   WHEN OTHERS THEN
5366     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5367     p_error_buffer := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
5368 
5369     IF (g_level_unexpected >= g_current_runtime_level ) THEN
5370       FND_LOG.STRING(g_level_unexpected,
5371                      'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_recovery_from_applied',
5372                       p_error_buffer);
5373       FND_LOG.STRING(g_level_unexpected,
5374                     'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_recovery_from_applied.END',
5375                     'ZX_TRD_INTERNAL_SERVICES_PVT.get_recovery_from_applied(-)');
5376     END IF;
5377 
5378 END get_recovery_from_applied;
5379 
5380 PROCEDURE get_recovery_from_adjusted(
5381  p_tax_id                     IN            NUMBER,
5382  p_tax_apportionment_line_num IN            NUMBER,
5383  p_trx_line_dist_index        IN            NUMBER,
5384  p_rec_nrec_dist_tbl          IN OUT NOCOPY ZX_TRD_SERVICES_PUB_PKG.REC_NREC_DIST_TBL_TYPE,
5385  p_rnd_begin_index            IN            NUMBER,
5386  p_rnd_end_index              OUT NOCOPY    NUMBER,
5387  p_return_status              OUT NOCOPY    VARCHAR2,
5388  p_error_buffer               OUT NOCOPY    VARCHAR2) IS
5389 
5390  CURSOR  get_tax_dists_csr IS
5391   SELECT recoverable_flag,
5392          recovery_type_code,
5393          rec_type_rule_flag,
5394          rec_rate_det_rule_flag,
5395          recovery_rate_id,
5396          recovery_rate_code,
5397          rec_nrec_rate,
5398          rec_nrec_tax_dist_id,
5399          def_rec_settlement_option_code,
5400          account_source_tax_rate_id
5401     FROM zx_rec_nrec_dist
5402    WHERE application_id =
5403           ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.adjusted_doc_application_id(
5404                                                            p_trx_line_dist_index)
5405      AND entity_code =
5406           ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.adjusted_doc_entity_code(
5407                                                          p_trx_line_dist_index)
5408      AND event_class_code  =
5409           ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.adjusted_doc_event_class_code(
5410                                                              p_trx_line_dist_index)
5411      AND trx_id =
5412           ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.adjusted_doc_trx_id(
5413                                                    p_trx_line_dist_index)
5414      AND trx_line_id =
5415           ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.adjusted_doc_line_id(
5416                                                              p_trx_line_dist_index)
5417      AND trx_level_type =
5418           ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.adjusted_doc_trx_level_type(
5419                                                              p_trx_line_dist_index)
5420      AND trx_line_dist_id =
5421           ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.adjusted_doc_dist_id(
5422                                                              p_trx_line_dist_index)
5423      AND tax_id = p_tax_id
5424      -- Modified the following condition for Bug#16601146
5425      AND NVL(tax_apportionment_line_number,p_tax_apportionment_line_num) = p_tax_apportionment_line_num
5426      -- AND NVL(tax_apportionment_line_number,-99) =
5427      --         DECODE(historical_flag,'Y',p_tax_apportionment_line_num,NVL(tax_apportionment_line_number,-99))
5428      AND NVL(reverse_flag, 'N') <> 'Y'
5429    ORDER BY rec_nrec_tax_dist_id, recoverable_flag;
5430 
5431   l_rec_nrec_tax_dist_number		NUMBER;
5432 
5433 BEGIN
5434 
5435   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
5436   IF (g_level_procedure >= g_current_runtime_level ) THEN
5437     FND_LOG.STRING(g_level_procedure,
5438                   'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_recovery_from_adjusted.BEGIN',
5439                   'ZX_TRD_INTERNAL_SERVICES_PVT.get_recovery_from_adjusted(+)');
5440   END IF;
5441 
5442   p_return_status := FND_API.G_RET_STS_SUCCESS;
5443 
5444   p_rnd_end_index := p_rnd_begin_index - 1;
5445 
5446   l_rec_nrec_tax_dist_number := 0;
5447 
5448   ZX_TDS_UTILITIES_PKG.populate_tax_cache (
5449     				p_tax_id	 => p_tax_id,
5450     				p_return_status  => p_return_status,
5451     				p_error_buffer   => p_error_buffer);
5452 
5453   IF (g_level_statement >= g_current_runtime_level ) THEN
5454     FND_LOG.STRING(g_level_statement,
5455                   'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_recovery_from_adjusted',
5456                   'Fetching Tax Dists for: '||
5457                   'ADJUSTED_DOC_APPLICATION_ID : '||TO_CHAR(ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.adjusted_doc_application_id(p_trx_line_dist_index)) ||', '||
5458                   'ADJUSTED_DOC_ENTITY_CODE : '||ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.adjusted_doc_entity_code(p_trx_line_dist_index)                ||', '||
5459                   'ADJUSTED_DOC_EVENT_CLASS_CODE : '||ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.adjusted_doc_event_class_code(p_trx_line_dist_index)      ||', '||
5460                   'ADJUSTED_DOC_TRX_ID : '||TO_CHAR(ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.adjusted_doc_trx_id(p_trx_line_dist_index))                 ||', '||
5461                   'ADJUSTED_DOC_LINE_ID : '||TO_CHAR(ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.adjusted_doc_line_id(p_trx_line_dist_index))               ||', '||
5462                   'ADJUSTED_DOC_TRX_LEVEL_TYPE : '||ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.adjusted_doc_trx_level_type(p_trx_line_dist_index)          ||', '||
5463                   'ADJUSTED_DOC_DIST_ID : '||TO_CHAR(ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.adjusted_doc_dist_id(p_trx_line_dist_index))               ||', '||
5464                   'TAX_ID : '||TO_CHAR(p_tax_id) ||', '||
5465                   'TAX_APPORTIONMENT_LINE_NUMBER : '||TO_CHAR(p_tax_apportionment_line_num)
5466                   );
5467   END IF;
5468 
5469   IF (g_level_statement >= g_current_runtime_level ) THEN
5470     FND_LOG.STRING(g_level_statement,
5471                    'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_recovery_from_adjusted',
5472                    'Updating Tax_Apportionment_Line_Number in the tax distributions of Adjusted Doc...');
5473   END IF;
5474 
5475   UPDATE zx_rec_nrec_dist zd
5476      SET tax_apportionment_line_number =
5477                 (SELECT tax_apportionment_line_number
5478                    FROM zx_lines zl
5479                   WHERE zl.tax_line_id = zd.tax_line_id)
5480    WHERE application_id = ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.adjusted_doc_application_id(p_trx_line_dist_index)
5481      AND entity_code = ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.adjusted_doc_entity_code(p_trx_line_dist_index)
5482      AND event_class_code  = ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.adjusted_doc_event_class_code(p_trx_line_dist_index)
5483      AND trx_id = ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.adjusted_doc_trx_id(p_trx_line_dist_index)
5484      AND trx_line_id = ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.adjusted_doc_line_id(p_trx_line_dist_index)
5485      AND trx_level_type = ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.adjusted_doc_trx_level_type(p_trx_line_dist_index)
5486      AND trx_line_dist_id = ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.adjusted_doc_dist_id(p_trx_line_dist_index)
5487      AND tax_apportionment_line_number IS NULL
5488      AND NVL(reverse_flag, 'N') <> 'Y';
5489 
5490   IF (g_level_statement >= g_current_runtime_level ) THEN
5491     FND_LOG.STRING(g_level_statement,
5492                    'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_recovery_from_adjusted',
5493                    '  Rows updated : '|| TO_CHAR(SQL%ROWCOUNT));
5494   END IF;
5495 
5496   FOR tax_dist_rec in get_tax_dists_csr LOOP
5497 
5498     IF (g_level_statement >= g_current_runtime_level ) THEN
5499       FND_LOG.STRING(g_level_statement,
5500                     'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_recovery_from_adjusted',
5501                     'Fetched Record: '||
5502                     'REC_NREC_TAX_DIST_ID : '|| TO_CHAR(tax_dist_rec.rec_nrec_tax_dist_id) ||', '||
5503                     'RECOVERY_RATE_CODE : '|| tax_dist_rec.Recovery_rate_code ||', '||
5504                     'RECOVERY_RATE_ID : '|| TO_CHAR(tax_dist_rec.recovery_rate_id) ||', '||
5505                     'REC_NREC_RATE : '|| TO_CHAR(tax_dist_rec.rec_nrec_rate) ||', '||
5506                     'RECOVERABLE_FLAG : '|| tax_dist_rec.recoverable_flag ||', '||
5507                     'RECOVERY_TYPE_CODE : '|| tax_dist_rec.recovery_type_code ||', '||
5508                     'REC_TYPE_RULE_FLAG : '|| tax_dist_rec.rec_type_rule_flag ||', '||
5509                     'REC_RATE_DET_RULE_FLAG : '|| tax_dist_rec.rec_rate_det_rule_flag ||', '||
5510                     'DEF_REC_SETTLEMENT_OPTION_CODE : '|| tax_dist_rec.def_rec_settlement_option_code ||', '||
5511                     'ACCOUNT_SOURCE_TAX_RATE_ID : '|| TO_CHAR(tax_dist_rec.account_source_tax_rate_id)
5512                     );
5513     END IF;
5514 
5515     l_rec_nrec_tax_dist_number := l_rec_nrec_tax_dist_number + 1;
5516     p_rnd_end_index := p_rnd_end_index + 1;
5517 
5518     p_rec_nrec_dist_tbl(p_rnd_end_index).recoverable_flag :=
5519                                                 tax_dist_rec.recoverable_flag;
5520     p_rec_nrec_dist_tbl(p_rnd_end_index).recovery_type_code :=
5521                                              tax_dist_rec.recovery_type_code;
5522     p_rec_nrec_dist_tbl(p_rnd_end_index).rec_type_rule_flag :=
5523                                              tax_dist_rec.rec_type_rule_flag;
5524     p_rec_nrec_dist_tbl(p_rnd_end_index).rec_rate_det_rule_flag:=
5525                                           tax_dist_rec.rec_rate_det_rule_flag;
5526     p_rec_nrec_dist_tbl(p_rnd_end_index).recovery_rate_id :=
5527                                                tax_dist_rec.recovery_rate_id;
5528     p_rec_nrec_dist_tbl(p_rnd_end_index).recovery_rate_code :=
5529                                              tax_dist_rec.recovery_rate_code;
5530     p_rec_nrec_dist_tbl(p_rnd_end_index).rec_nrec_rate :=
5531                                                   tax_dist_rec.rec_nrec_rate;
5532     p_rec_nrec_dist_tbl(p_rnd_end_index).adjusted_doc_tax_dist_id :=
5533                                            tax_dist_rec.rec_nrec_tax_dist_id;
5534     p_rec_nrec_dist_tbl(p_rnd_end_index).rec_nrec_tax_dist_number :=
5535                                                   l_rec_nrec_tax_dist_number;
5536     p_rec_nrec_dist_tbl(p_rnd_end_index).def_rec_settlement_option_code :=
5537                                   tax_dist_rec.def_rec_settlement_option_code;
5538     p_rec_nrec_dist_tbl(p_rnd_end_index).account_source_tax_rate_id :=
5539                                       tax_dist_rec.account_source_tax_rate_id;
5540 
5541   END LOOP;
5542 
5543   IF (g_level_procedure >= g_current_runtime_level ) THEN
5544 
5545     FND_LOG.STRING(g_level_procedure,
5546                   'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_recovery_from_adjusted.END',
5547                   'ZX_TRD_INTERNAL_SERVICES_PVT.get_recovery_from_adjusted(-)'||p_return_status);
5548   END IF;
5549 
5550 EXCEPTION
5551   WHEN OTHERS THEN
5552     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5553     p_error_buffer := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
5554 
5555     IF (g_level_unexpected >= g_current_runtime_level ) THEN
5556       FND_LOG.STRING(g_level_unexpected,
5557                     'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_recovery_from_adjusted',
5558                      p_error_buffer);
5559       FND_LOG.STRING(g_level_unexpected,
5560                   'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_recovery_from_adjusted.END',
5561                   'ZX_TRD_INTERNAL_SERVICES_PVT.get_recovery_from_adjusted(-)');
5562     END IF;
5563 
5564 END get_recovery_from_adjusted;
5565 
5566 PROCEDURE enforce_recovery_from_ref(
5567  p_detail_tax_line_tbl        IN   ZX_TRD_SERVICES_PUB_PKG.TAX_LINE_TBL_TYPE,
5568  p_tax_line_index       IN NUMBER,
5569  p_trx_line_dist_index  IN            NUMBER,
5570  p_rec_nrec_dist_tbl    IN OUT NOCOPY ZX_TRD_SERVICES_PUB_PKG.REC_NREC_DIST_TBL_TYPE,
5571  p_rnd_begin_index      IN            NUMBER,
5572  p_rnd_end_index        OUT NOCOPY    NUMBER,
5573  p_return_status        OUT NOCOPY    VARCHAR2,
5574  p_error_buffer         OUT NOCOPY    VARCHAR2) IS
5575 
5576   CURSOR get_tax_dists_csr IS
5577   SELECT recoverable_flag,
5578          recovery_type_code,
5579          rec_type_rule_flag,
5580          rec_rate_det_rule_flag,
5581          recovery_rate_code,
5582          rec_nrec_tax_dist_id,
5583          rec_nrec_rate,
5584          orig_rec_nrec_rate,
5585          rec_rate_result_id,
5586          recovery_rate_id
5587     FROM zx_rec_nrec_dist
5588    WHERE application_id =
5589           ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.ref_doc_application_id(
5590                                                           p_trx_line_dist_index)
5591      AND entity_code =
5592            ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.ref_doc_entity_code(
5593                                                           p_trx_line_dist_index)
5594      AND event_class_code  =
5595            ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.ref_doc_event_class_code(
5596                                                           p_trx_line_dist_index)
5597      AND trx_id =
5598            ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.ref_doc_trx_id(
5599                                                           p_trx_line_dist_index)
5600      AND trx_line_id =
5601            ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.ref_doc_line_id(
5602                                                           p_trx_line_dist_index)
5603      AND trx_level_type =
5604            ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.ref_doc_trx_level_type(
5605                                                           p_trx_line_dist_index)
5606      AND trx_line_dist_id =
5607            ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.ref_doc_dist_id(
5608                                                           p_trx_line_dist_index)
5609      AND tax  = p_detail_tax_line_tbl(p_tax_line_index).tax
5610      AND tax_regime_code = p_detail_tax_line_tbl(p_tax_line_index).tax_regime_code
5611      AND NVL(reverse_flag, 'N') <> 'Y'
5612    ORDER BY rec_nrec_tax_dist_id, recoverable_flag;
5613 
5614   -- Added the cursor for Bug#14038095 --
5615   CURSOR get_tax_recovery_info_cur(c_tax_id  ZX_TAXES_B.tax_id%TYPE) IS
5616   SELECT allow_recoverability_flag,
5617          primary_recovery_type_code,
5618          primary_rec_type_rule_flag,
5619          secondary_recovery_type_code,
5620          secondary_rec_type_rule_flag,
5621          primary_rec_rate_det_rule_flag,
5622          sec_rec_rate_det_rule_flag,
5623          def_primary_rec_rate_code,
5624          def_secondary_rec_rate_code,
5625          effective_from,
5626          effective_to,
5627          def_rec_settlement_option_code,
5628          tax_account_source_tax
5629     FROM ZX_TAXES_B
5630    WHERE tax_id =  c_tax_id;
5631 
5632   CURSOR get_maximum_tax_dist_num_csr is
5633   SELECT max(rec_nrec_tax_dist_number)
5634     FROM zx_rec_nrec_dist
5635    WHERE tax_line_id = p_detail_tax_line_tbl(p_tax_line_index).tax_line_id
5636      AND trx_line_dist_id = ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.trx_line_dist_id(p_trx_line_dist_index);
5637 
5638   l_rec_nrec_tax_dist_number   NUMBER;
5639   l_po_dist_count              NUMBER;
5640   l_rnd_begin_index            NUMBER;
5641   l_max_tax_dist_number        NUMBER;
5642 
5643   -- Added these variables for Bug#14038095 --
5644   l_tax                        ZX_TAXES_B.tax%TYPE;
5645   l_tax_id                     NUMBER;
5646   l_tax_regime_code            ZX_STATUS_B.tax_regime_code%TYPE;
5647 
5648 BEGIN
5649 
5650   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
5651   IF (g_level_procedure >= g_current_runtime_level ) THEN
5652     FND_LOG.STRING(g_level_procedure,
5653            'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.enforce_recovery_from_ref.BEGIN',
5654            'ZX_TRD_INTERNAL_SERVICES_PVT.enforce_recovery_from_ref(+)');
5655   END IF;
5656 
5657   p_return_status := FND_API.G_RET_STS_SUCCESS;
5658 
5659   p_rnd_end_index := p_rnd_begin_index -1;
5660 
5661   IF (g_level_procedure >= g_current_runtime_level ) THEN
5662      FND_LOG.STRING(g_level_procedure,
5663            'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.enforce_recovery_from_ref',
5664            'Begin Index : '||TO_CHAR(p_rnd_begin_index)||', End Index : '||TO_CHAR(p_rnd_end_index));
5665   END IF;
5666 
5667   OPEN  get_maximum_tax_dist_num_csr;
5668   FETCH get_maximum_tax_dist_num_csr INTO l_max_tax_dist_number;
5669   CLOSE get_maximum_tax_dist_num_csr;
5670 
5671   l_max_tax_dist_number := NVL(l_max_tax_dist_number, 0);
5672 
5673   l_rec_nrec_tax_dist_number:= l_max_tax_dist_number;
5674 
5675   -- Start : Code Changes for Bug#14038095 --
5676   -- Do not populate plsql structure for tax distributions --
5677   -- with recoverable tax distribution info from PO if the --
5678   -- Allow tax recoverability is No at the Tax setup level --
5679   l_tax_id := p_detail_tax_line_tbl(p_tax_line_index).tax_id;
5680   l_tax := p_detail_tax_line_tbl(p_tax_line_index).tax;
5681   l_tax_regime_code := p_detail_tax_line_tbl(p_tax_line_index).tax_regime_code;
5682 
5683   ZX_TDS_UTILITIES_PKG.populate_tax_cache (
5684     	 p_tax_id         => l_tax_id,
5685     	 p_return_status  => p_return_status,
5686     	 p_error_buffer   => p_error_buffer);
5687 
5688   IF NOT g_tax_recovery_info_tbl.EXISTS(l_tax_id) THEN
5689 
5690     OPEN  get_tax_recovery_info_cur(l_tax_id);
5691     FETCH get_tax_recovery_info_cur INTO
5692             g_tax_recovery_info_tbl(l_tax_id).allow_recoverability_flag,
5693             g_tax_recovery_info_tbl(l_tax_id).primary_recovery_type_code,
5694             g_tax_recovery_info_tbl(l_tax_id).primary_rec_type_rule_flag,
5695             g_tax_recovery_info_tbl(l_tax_id).secondary_recovery_type_code,
5696             g_tax_recovery_info_tbl(l_tax_id).secondary_rec_type_rule_flag,
5697             g_tax_recovery_info_tbl(l_tax_id).primary_rec_rate_det_rule_flag,
5698             g_tax_recovery_info_tbl(l_tax_id).sec_rec_rate_det_rule_flag,
5699             g_tax_recovery_info_tbl(l_tax_id).def_primary_rec_rate_code,
5700             g_tax_recovery_info_tbl(l_tax_id).def_secondary_rec_rate_code,
5701             g_tax_recovery_info_tbl(l_tax_id).effective_from,
5702             g_tax_recovery_info_tbl(l_tax_id).effective_to,
5703             g_tax_recovery_info_tbl(l_tax_id).def_rec_settlement_option_code,
5704             g_tax_recovery_info_tbl(l_tax_id).tax_account_source_tax;
5705 
5706     IF get_tax_recovery_info_cur%NOTFOUND THEN
5707       p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5708       IF (g_level_procedure >= g_current_runtime_level ) THEN
5709          FND_LOG.STRING(g_level_procedure,
5710                         'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.enforce_recovery_from_ref.END',
5711                         'ZX_TRD_INTERNAL_SERVICES_PVT.enforce_recovery_from_ref(-)'||'error: can not find tax info for ' || l_tax_id);
5712       END IF;
5713       CLOSE get_tax_recovery_info_cur;
5714       RETURN;
5715     END IF;
5716 
5717     CLOSE get_tax_recovery_info_cur;
5718 
5719     g_tax_recovery_info_tbl(l_tax_id).tax_regime_code := l_tax_regime_code;
5720     g_tax_recovery_info_tbl(l_tax_id).tax := l_tax;
5721     g_tax_recovery_info_tbl(l_tax_id).tax_id := l_tax_id;
5722 
5723   END IF;
5724 
5725   IF (g_level_statement >= g_current_runtime_level ) THEN
5726     FND_LOG.STRING(g_level_statement,
5727                    'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.enforce_recovery_from_ref',
5728                    'Allow Tax Recoverability for Tax '||l_tax||' is '||
5729                    NVL(g_tax_recovery_info_tbl(l_tax_id).allow_recoverability_flag,'N'));
5730   END IF;
5731   -- End : Code Changes for Bug#14038095 --
5732 
5733   l_rnd_begin_index := p_rnd_end_index;
5734   l_po_dist_count   := p_rnd_end_index;
5735 
5736 
5737   FOR tax_dist_rec in get_tax_dists_csr LOOP
5738 
5739     -- Start : Code Changes for Bug#14038095 --
5740     --
5741     -- Do not populate plsql structure for tax distributions --
5742     -- with recoverable tax distribution info from PO if the --
5743     -- Allow tax recoverability is No at the Tax setup level --
5744     --
5745     IF NVL(g_tax_recovery_info_tbl(l_tax_id).allow_recoverability_flag,'N') = 'N' THEN
5746       --
5747       -- Populate only Non-Recoverable tax distribution from PO
5748       --
5749       IF NVL(tax_dist_rec.recoverable_flag,'N') = 'Y' THEN
5750         IF (g_level_statement >= g_current_runtime_level ) THEN
5751            FND_LOG.STRING(g_level_statement,
5752               'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.enforce_recovery_from_ref',
5753               'Do not copy the recoverable tax distribution from PO');
5754         END IF;
5755         NULL;
5756 
5757       ELSE
5758         l_rec_nrec_tax_dist_number := l_rec_nrec_tax_dist_number + 1;
5759         p_rnd_end_index := p_rnd_end_index + 1;
5760 
5761         IF (g_level_statement >= g_current_runtime_level ) THEN
5762            FND_LOG.STRING(g_level_statement,
5763               'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.enforce_recovery_from_ref',
5764               'Copy only the non-recoverable tax distribution from PO at index '||
5765               TO_CHAR(p_rnd_end_index));
5766         END IF;
5767 
5768         p_rec_nrec_dist_tbl(p_rnd_end_index).recoverable_flag :=
5769                                                  tax_dist_rec.recoverable_flag;
5770         p_rec_nrec_dist_tbl(p_rnd_end_index).recovery_type_code :=
5771                                                tax_dist_rec.recovery_type_code;
5772         p_rec_nrec_dist_tbl(p_rnd_end_index).rec_type_rule_flag :=
5773                                                tax_dist_rec.rec_type_rule_flag;
5774         p_rec_nrec_dist_tbl(p_rnd_end_index).rec_rate_det_rule_flag :=
5775                                            tax_dist_rec.rec_rate_det_rule_flag;
5776         p_rec_nrec_dist_tbl(p_rnd_end_index).recovery_rate_code :=
5777                                                tax_dist_rec.recovery_rate_code;
5778         p_rec_nrec_dist_tbl(p_rnd_end_index).ref_doc_tax_dist_id :=
5779                                              tax_dist_rec.rec_nrec_tax_dist_id;
5780         p_rec_nrec_dist_tbl(p_rnd_end_index).rec_nrec_tax_dist_number:=
5781                                                     l_rec_nrec_tax_dist_number;
5782         -- bug 5386805: populate rec_rate_result_id from ref_document
5783         p_rec_nrec_dist_tbl(p_rnd_end_index).rec_rate_result_id :=
5784                                                tax_dist_rec.rec_rate_result_id;
5785       END IF;
5786       -- End : Code Changes for Bug#14038095 --
5787     ELSE
5788       --
5789       -- populate the both Recoverable and Non-Recoverable tax distributions
5790       --
5791       l_rec_nrec_tax_dist_number := l_rec_nrec_tax_dist_number + 1;
5792       p_rnd_end_index := p_rnd_end_index + 1;
5793 
5794       IF (g_level_statement >= g_current_runtime_level ) THEN
5795          FND_LOG.STRING(g_level_statement,
5796             'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.enforce_recovery_from_ref',
5797             'Copy tax distribution from PO at index '||
5798             TO_CHAR(p_rnd_end_index));
5799       END IF;
5800 
5801       p_rec_nrec_dist_tbl(p_rnd_end_index).recoverable_flag :=
5802                                                tax_dist_rec.recoverable_flag;
5803       p_rec_nrec_dist_tbl(p_rnd_end_index).recovery_type_code :=
5804                                              tax_dist_rec.recovery_type_code;
5805       p_rec_nrec_dist_tbl(p_rnd_end_index).rec_type_rule_flag :=
5806                                              tax_dist_rec.rec_type_rule_flag;
5807       p_rec_nrec_dist_tbl(p_rnd_end_index).rec_rate_det_rule_flag :=
5808                                          tax_dist_rec.rec_rate_det_rule_flag;
5809       p_rec_nrec_dist_tbl(p_rnd_end_index).recovery_rate_code :=
5810                                              tax_dist_rec.recovery_rate_code;
5811       p_rec_nrec_dist_tbl(p_rnd_end_index).ref_doc_tax_dist_id :=
5812                                            tax_dist_rec.rec_nrec_tax_dist_id;
5813       p_rec_nrec_dist_tbl(p_rnd_end_index).rec_nrec_tax_dist_number:=
5814                                                   l_rec_nrec_tax_dist_number;
5815       -- bug 5386805: populate rec_rate_result_id from ref_document
5816       p_rec_nrec_dist_tbl(p_rnd_end_index).rec_rate_result_id :=
5817                                              tax_dist_rec.rec_rate_result_id;
5818     END IF;
5819 
5820     IF l_po_dist_count <> p_rnd_end_index THEN -- Added this IF condition for Bug#14038095 --
5821     -- This means that new tax distribution record is added to plsql structure --
5822     --
5823       IF (g_level_statement >= g_current_runtime_level ) THEN
5824          FND_LOG.STRING(g_level_statement,
5825                 'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.enforce_recovery_from_ref',
5826                 'Index : '||TO_CHAR(p_rnd_end_index) ||
5827                 ', Ref_Doc_Tax_Dist_Id : '||TO_CHAR(tax_dist_rec.rec_nrec_tax_dist_id) ||
5828                 ', Recoverable_Flag : '||tax_dist_rec.recoverable_flag ||
5829                 ', Rec_Nrec_Rate : '||TO_CHAR(tax_dist_rec.rec_nrec_rate) ||
5830                 ', Recovery_Rate_Code : '||tax_dist_rec.recovery_rate_code ||
5831                 ', Recovery_Rate_Id : '||TO_CHAR(tax_dist_rec.recovery_rate_id));
5832       END IF;
5833 
5834       -- Bug 12870975 : Added code to Copy the rec_nrec_rate and recovery_rate_id
5835       -- from PO in case of Zero Amount reference tax line for recoverable tax dist
5836       --
5837       IF (p_detail_tax_line_tbl(p_tax_line_index).other_doc_source = 'REFERENCE' AND
5838           p_detail_tax_line_tbl(p_tax_line_index).unrounded_tax_amt = 0 AND
5839           p_detail_tax_line_tbl(p_tax_line_index).unrounded_taxable_amt = 0 AND
5840           p_detail_tax_line_tbl(p_tax_line_index).manually_entered_flag = 'Y' AND
5841           p_detail_tax_line_tbl(p_tax_line_index).freeze_until_overridden_flag ='Y')
5842          AND
5843          NVL(p_rec_nrec_dist_tbl(p_rnd_end_index).recoverable_flag,'N') = 'Y'
5844       THEN
5845         IF (g_level_statement >= g_current_runtime_level ) THEN
5846           FND_LOG.STRING(g_level_statement,
5847                 'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.enforce_recovery_from_ref',
5848                 'Copy Rec_Nrec_Rate and Recovery_Rate_Id from PO for recoverable '||
5849                 'tax distribution of zero amount reference tax line');
5850         END IF;
5851 
5852         p_rec_nrec_dist_tbl(p_rnd_end_index).rec_nrec_rate :=
5853                                                      tax_dist_rec.rec_nrec_rate;
5854         p_rec_nrec_dist_tbl(p_rnd_end_index).recovery_rate_id :=
5855                                                   tax_dist_rec.recovery_rate_id;
5856       END IF;
5857 
5858       -- bug 4012677: If user had overridden recovery rate %, the overridden
5859       -- rate % needs to be copied to invoice tax distributions
5860       --
5861       IF tax_dist_rec.orig_rec_nrec_rate IS NOT NULL THEN
5862         p_rec_nrec_dist_tbl(p_rnd_end_index).rec_nrec_rate :=
5863                                                     tax_dist_rec.rec_nrec_rate;
5864 
5865         IF (g_level_statement >= g_current_runtime_level ) THEN
5866           FND_LOG.STRING(g_level_statement,
5867                 'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.enforce_recovery_from_ref',
5868                 'User had overridden recovery rate on PO, so copy the PO '||
5869                 'recovery rate % to invoice tax distributions.');
5870         END IF;
5871       END IF;
5872 
5873       l_po_dist_count := p_rnd_end_index;   -- Added for Bug#14038095 --
5874 
5875     END IF; -- l_count <> p_rnd_end_index
5876   END LOOP;
5877 
5878   -- bugfix: 5166933. some tax lines on invoice are not present on PO,
5879   -- need to det appliacble recovery types for those tax lines.
5880 
5881   IF l_rnd_begin_index = p_rnd_end_index THEN
5882 
5883       IF (g_level_statement >= g_current_runtime_level ) THEN
5884         FND_LOG.STRING(g_level_statement,
5885                     'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.enforce_recovery_from_ref',
5886                     'Can not find tax distribution on PO, have to call the ' ||
5887                     'normal det_appl_rec_type() to determine recovery type.');
5888       END IF;
5889 
5890       det_appl_rec_type(
5891                   p_detail_tax_line_tbl,
5892                   p_tax_line_index,
5893                   p_trx_line_dist_index,
5894                   p_rec_nrec_dist_tbl,
5895                   p_rnd_begin_index,
5896                   p_rnd_end_index,
5897                   p_return_status,
5898                   p_error_buffer);
5899 
5900       IF NVL(p_return_status,FND_API.G_RET_STS_ERROR)<>FND_API.G_RET_STS_SUCCESS
5901       THEN
5902         IF (g_level_error >= g_current_runtime_level ) THEN
5903           FND_LOG.STRING(g_level_error,
5904                  'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.enforce_recovery_from_ref',
5905                  'Incorrect return_status after calling ' ||
5906                  'ZX_TDS_UTILITIES_PKG.det_appl_rec_type()');
5907           FND_LOG.STRING(g_level_error,
5908                  'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.enforce_recovery_from_ref',
5909                  'RETURN_STATUS = ' || p_return_status);
5910           FND_LOG.STRING(g_level_error,
5911                  'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.enforce_recovery_from_ref.END',
5912                  'ZX_TRD_INTERNAL_SERVICES_PVT.enforce_recovery_from_ref(-)');
5913         END IF;
5914         RETURN;
5915       END IF;
5916   END IF;
5917 
5918   IF (g_level_procedure >= g_current_runtime_level) THEN
5919     FND_LOG.STRING(g_level_procedure,
5920            'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.enforce_recovery_from_ref',
5921            'Begin Index : '||TO_CHAR(p_rnd_begin_index)||', End Index : '||TO_CHAR(p_rnd_end_index));
5922     FND_LOG.STRING(g_level_procedure,
5923            'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.enforce_recovery_from_ref.END',
5924            'ZX_TRD_INTERNAL_SERVICES_PVT.enforce_recovery_from_ref(-)'||p_return_status);
5925   END IF;
5926 
5927 EXCEPTION
5928   WHEN OTHERS THEN
5929     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5930     p_error_buffer := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
5931 
5932     IF (g_level_unexpected >= g_current_runtime_level ) THEN
5933       FND_LOG.STRING(g_level_unexpected,
5934              'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.enforce_recovery_from_ref',
5935               p_error_buffer);
5936       FND_LOG.STRING(g_level_unexpected,
5937              'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.enforce_recovery_from_ref.END',
5938              'ZX_TRD_INTERNAL_SERVICES_PVT.enforce_recovery_from_ref(-)');
5939     END IF;
5940 
5941 END enforce_recovery_from_ref;
5942 
5943 PROCEDURE round_and_adjust_prd_tax_amts  (
5944  p_rec_nrec_dist_tbl  IN OUT NOCOPY  ZX_TRD_SERVICES_PUB_PKG.REC_NREC_DIST_TBL_TYPE,
5945  p_rnd_begin_index    IN             NUMBER,
5946  p_rnd_end_index      IN             NUMBER,
5947  p_return_status      OUT NOCOPY     VARCHAR2,
5948  p_error_buffer       OUT NOCOPY     VARCHAR2) IS
5949 
5950  l_rec_tax_index	     	     NUMBER		:=NULL;
5951  l_nrec_tax_index		     NUMBER		:=NULL;
5952 
5953  l_rec_amt_largest	     	     NUMBER		:= 0;
5954  l_nrec_amt_largest		     NUMBER		:= 0;
5955  l_rec_amt_tax_curr_largest    	     NUMBER		:= 0;
5956  l_nrec_amt_tax_curr_largest	     NUMBER		:= 0;
5957  l_rec_amt_funcl_curr_largest	     NUMBER		:= 0;
5958  l_nrec_amt_funcl_curr_largest	     NUMBER		:= 0;
5959 
5960  l_total_prd_tax_amt		     NUMBER		:= 0;
5961  l_total_prd_tax_amt_tax_curr	     NUMBER		:= 0;
5962  l_total_prd_tax_amt_funcl_curr	     NUMBER		:= 0;
5963 
5964  l_prd_tax_rnd_diff	     	     NUMBER;
5965  l_prd_tax_rnd_diff_tax_curr	     NUMBER;
5966  l_prd_tax_rnd_diff_funcl_curr	     NUMBER;
5967 
5968  l_min_acct_unit_tax_curr      	     zx_taxes_b.minimum_accountable_unit%TYPE;
5969  l_precision_tax_curr          	     zx_taxes_b.tax_precision%TYPE;
5970  l_min_acct_unit_funcl_curr    	     zx_taxes_b.minimum_accountable_unit%TYPE;
5971  l_precision_funcl_curr              zx_taxes_b.tax_precision%TYPE;
5972  l_ledger_id		             gl_sets_of_books.set_of_books_id%TYPE;
5973 
5974  l_error_buffer			     VARCHAR2(200);
5975  l_index			     NUMBER;
5976  l_tax_id			     zx_taxes_b.tax_id%TYPE;
5977 
5978 BEGIN
5979 
5980   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
5981 
5982   IF (g_level_procedure >= g_current_runtime_level ) THEN
5983     FND_LOG.STRING(g_level_procedure,
5984                   'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.round_and_adjust_prd_tax_amts.BEGIN',
5985                   'ZX_TRD_INTERNAL_SERVICES_PVT.round_and_adjust_prd_tax_amts(+)');
5986   END IF;
5987 
5988   p_return_status:= FND_API.G_RET_STS_SUCCESS;
5989 
5990   IF p_rnd_begin_index IS NULL OR p_rnd_end_index IS NULL OR
5991                                   p_rnd_begin_index > p_rnd_end_index THEN
5992 
5993     --p_return_status:= FND_API.G_RET_STS_ERROR;
5994     IF (g_level_error >= g_current_runtime_level ) THEN
5995       FND_LOG.STRING(g_level_error,
5996                      'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.round_and_adjust_prd_tax_amts ',
5997                      'begin or end index is null, or begin index > end index');
5998     END IF;
5999     RETURN;
6000   END IF;
6001 
6002   -- get minimum_accountable_unit and precision in functional currency
6003   --
6004   l_ledger_id := p_rec_nrec_dist_tbl(p_rnd_begin_index).ledger_id;
6005   IF p_rec_nrec_dist_tbl(p_rnd_begin_index).ledger_id IS NOT NULL THEN
6006     IF NOT ZX_TDS_UTILITIES_PKG.g_currency_rec_tbl.EXISTS(l_ledger_id) THEN
6007 
6008        ZX_TDS_UTILITIES_PKG.populate_currency_cache (
6009           p_ledger_id      => l_ledger_id,
6010           p_return_status  => p_return_status,
6011           p_error_buffer   => p_error_buffer);
6012 
6013       IF NVL(p_return_status,FND_API.G_RET_STS_ERROR)<>FND_API.G_RET_STS_SUCCESS
6014       THEN
6015         IF (g_level_error >= g_current_runtime_level ) THEN
6016           FND_LOG.STRING(g_level_error,
6017                  'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.round_and_adjust_prd_tax_amts',
6018                  'Incorrect return_status after calling ' ||
6019                  'ZX_TDS_UTILITIES_PKG.populate_currency_cache()');
6020           FND_LOG.STRING(g_level_error,
6021                  'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.round_and_adjust_prd_tax_amts',
6022                  'RETURN_STATUS = ' || p_return_status);
6023           FND_LOG.STRING(g_level_error,
6024                  'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.round_and_adjust_prd_tax_amts.END',
6025                  'ZX_TRD_INTERNAL_SERVICES_PVT.round_and_adjust_prd_tax_amts(-)');
6026         END IF;
6027         RETURN;
6028       END IF;
6029     END IF;
6030 
6031     l_min_acct_unit_funcl_curr := ZX_TDS_UTILITIES_PKG.g_currency_rec_tbl(
6032                                         l_ledger_id).minimum_accountable_unit;
6033     l_precision_funcl_curr := ZX_TDS_UTILITIES_PKG.g_currency_rec_tbl(
6034                                                        l_ledger_id).precision;
6035   END IF;
6036 
6037   FOR i IN p_rnd_begin_index .. p_rnd_end_index LOOP
6038     -- populate g_tax_rec_tbl if this tax_id has not been populated
6039     --
6040     l_tax_id := p_rec_nrec_dist_tbl(i).tax_id;
6041 
6042     -- get l_min_acct_unit_tax_curr and l_precision_tax_curr from g_tax_rec_tbl
6043     --
6044     l_min_acct_unit_tax_curr :=
6045             ZX_TDS_UTILITIES_PKG.g_tax_rec_tbl(l_tax_id).minimum_accountable_unit;
6046     l_precision_tax_curr :=
6047             ZX_TDS_UTILITIES_PKG.g_tax_rec_tbl(l_tax_id).tax_precision;
6048 
6049     -- round prd_tax_amt
6050     --
6051     p_rec_nrec_dist_tbl(i).prd_tax_amt :=
6052  		ZX_TDS_TAX_ROUNDING_PKG.round_tax(
6053 			p_rec_nrec_dist_tbl(i).prd_tax_amt,
6054 			p_rec_nrec_dist_tbl(i).Rounding_Rule_Code,
6055 			p_rec_nrec_dist_tbl(i).minimum_accountable_unit,
6056 			p_rec_nrec_dist_tbl(i).precision,
6057 			p_return_status,
6058 			p_error_buffer);
6059 
6060     -- round prd_tax_amt_tax_curr
6061     --
6062     p_rec_nrec_dist_tbl(i).prd_tax_amt_tax_curr :=
6063     	 	ZX_TDS_TAX_ROUNDING_PKG.round_tax(
6064 			p_rec_nrec_dist_tbl(i).prd_tax_amt_tax_curr,
6065 			p_rec_nrec_dist_tbl(i).Rounding_Rule_Code,
6066 			l_min_acct_unit_tax_curr,
6067 			l_precision_tax_curr,
6068 			p_return_status,
6069 			p_error_buffer);
6070 
6071     IF NVL(p_return_status, FND_API.G_RET_STS_ERROR) <> FND_API.G_RET_STS_SUCCESS
6072     THEN
6073       IF (g_level_error >= g_current_runtime_level ) THEN
6074         FND_LOG.STRING(g_level_error,
6075                       'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.round_and_adjust_prd_tax_amts ',
6076                       'Incorrect return_status after calling ' ||
6077                       'ZX_TDS_TAX_ROUNDING_PKG.round_tax()');
6078         FND_LOG.STRING(g_level_error,
6079                       'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.round_and_adjust_prd_tax_amts ',
6080                       'RETURN_STATUS = ' || p_return_status);
6081         FND_LOG.STRING(g_level_error,
6082                       'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.round_and_adjust_prd_tax_amts.END',
6083                       'ZX_TRD_INTERNAL_SERVICES_PVT.round_and_adjust_prd_tax_amts (-)');
6084       END IF;
6085       RETURN;
6086     END IF;
6087 
6088     -- round prd_tax_amt_funcl_curr
6089     --
6090     IF p_rec_nrec_dist_tbl(i).prd_tax_amt_funcl_curr IS NOT NULL THEN
6091       p_rec_nrec_dist_tbl(i).prd_tax_amt_funcl_curr :=
6092     	round( p_rec_nrec_dist_tbl(i).prd_tax_amt_funcl_curr/
6093   	              l_min_acct_unit_funcl_curr) * l_min_acct_unit_funcl_curr;
6094     END IF;
6095 
6096     -- Accumulate prd_tax_amt, prd_tax_amt_tax_curr, prd_tax_amt_funcl_curr
6097     --
6098     l_total_prd_tax_amt := l_total_prd_tax_amt +
6099                                              p_rec_nrec_dist_tbl(i).prd_tax_amt;
6100     l_total_prd_tax_amt_tax_curr := l_total_prd_tax_amt_tax_curr +
6101                                     p_rec_nrec_dist_tbl(i).prd_tax_amt_tax_curr;
6102     l_total_prd_tax_amt_funcl_curr := l_total_prd_tax_amt_funcl_curr +
6103                                   p_rec_nrec_dist_tbl(i).prd_tax_amt_funcl_curr;
6104 
6105     IF NVL(p_rec_nrec_dist_tbl(i).recoverable_flag, 'N') = 'N' THEN
6106       -- Record the largest prd_tax_amt, prd_tax_amt_tax_curr,
6107       -- prd_tax_amt_funcl_curr of non-recoverable tax dists
6108       --
6109       IF ABS(p_rec_nrec_dist_tbl(i).prd_tax_amt) >= ABS(l_nrec_amt_largest) THEN
6110         l_nrec_tax_index := i;
6111         l_nrec_amt_largest := p_rec_nrec_dist_tbl(i).prd_tax_amt;
6112       END IF;
6113 
6114     ELSIF NVL(p_rec_nrec_dist_tbl(i).recoverable_flag, 'N') = 'Y' THEN
6115 
6116       -- Record the largest prd_tax_amt, prd_tax_amt_tax_curr,
6117       -- prd_tax_amt_funcl_curr of non-zero recoverable tax dists
6118       --
6119       IF ABS(p_rec_nrec_dist_tbl(i).prd_tax_amt) >= ABS(l_rec_amt_largest) THEN
6120         l_rec_tax_index := i;
6121         l_rec_amt_largest := p_rec_nrec_dist_tbl(i).prd_tax_amt;
6122       END IF;
6123     END IF;      -- recoverable_flag
6124   END LOOP;
6125 
6126   l_prd_tax_rnd_diff :=
6127     p_rec_nrec_dist_tbl(p_rnd_begin_index).prd_total_tax_amt-l_total_prd_tax_amt;
6128 
6129   IF l_prd_tax_rnd_diff < 0 THEN
6130 
6131     -- Adjust rounding difference to the largest recoverable tax dists first.
6132     -- If there is no recoverable tax dists, adjust rounding
6133     -- difference to the largest nonrecoverable tax dists.
6134     --
6135     IF l_rec_tax_index IS NOT NULL THEN
6136 
6137       p_rec_nrec_dist_tbl(l_rec_tax_index).prd_tax_amt :=
6138         p_rec_nrec_dist_tbl(l_rec_tax_index).prd_tax_amt + l_prd_tax_rnd_diff;
6139 
6140     ELSIF l_nrec_tax_index IS NOT NULL THEN
6141 
6142       p_rec_nrec_dist_tbl(l_nrec_tax_index).prd_tax_amt :=
6143         p_rec_nrec_dist_tbl(l_nrec_tax_index).prd_tax_amt + l_prd_tax_rnd_diff;
6144 
6145     END IF;
6146 
6147   ELSIF l_prd_tax_rnd_diff > 0 THEN
6148 
6149     -- Adjust rounding_diff to the largest nonrecoverable tax dists first.
6150     -- if there is no nonrecoverable tax dists, adjust rounding_diff to the
6151     -- largest recoverable tax dists.
6152     --
6153     IF l_nrec_tax_index IS NOT NULL THEN
6154 
6155       p_rec_nrec_dist_tbl(l_nrec_tax_index).prd_tax_amt :=
6156         p_rec_nrec_dist_tbl(l_nrec_tax_index).prd_tax_amt + l_prd_tax_rnd_diff;
6157 
6158     ELSIF l_rec_tax_index IS NOT NULL THEN
6159 
6160       p_rec_nrec_dist_tbl(l_rec_tax_index).prd_tax_amt :=
6161         p_rec_nrec_dist_tbl(l_rec_tax_index).prd_tax_amt + l_prd_tax_rnd_diff;
6162 
6163     END IF;
6164   END IF;      -- l_prd_tax_rnd_diff <> 0
6165 
6166   l_prd_tax_rnd_diff_tax_curr :=
6167         p_rec_nrec_dist_tbl(p_rnd_begin_index).prd_total_tax_amt_tax_curr -
6168                                                   l_total_prd_tax_amt_tax_curr;
6169   IF l_prd_tax_rnd_diff_tax_curr < 0 THEN
6170 
6171     -- Adjust rounding_diff to the largest recoverable tax dists first.
6172     -- If there is no recoverable tax dists, adjust rounding_diff to the largest
6173     -- nonrecoverable tax dists.
6174     --
6175     IF l_rec_tax_index IS NOT NULL THEN
6176 
6177       p_rec_nrec_dist_tbl(l_rec_tax_index).prd_tax_amt_tax_curr :=
6178         p_rec_nrec_dist_tbl(l_rec_tax_index).prd_tax_amt_tax_curr +
6179                                                     l_prd_tax_rnd_diff_tax_curr;
6180     ELSIF l_nrec_tax_index IS NOT NULL THEN
6181 
6182       p_rec_nrec_dist_tbl(l_nrec_tax_index).prd_tax_amt :=
6183                  p_rec_nrec_dist_tbl(l_nrec_tax_index).prd_tax_amt +
6184                                                     l_prd_tax_rnd_diff_tax_curr;
6185     END IF;
6186 
6187   ELSIF l_prd_tax_rnd_diff_tax_curr > 0 THEN
6188 
6189     -- Adjust rounding_diff to the largest nonrecoverable tax dists first.
6190     -- if there is no nonrecoverable tax dists, adjust rounding_diff to the
6191     -- largest recoverable tax dists.
6192     --
6193     IF l_nrec_tax_index IS NOT NULL THEN
6194 
6195       p_rec_nrec_dist_tbl(l_nrec_tax_index).prd_tax_amt_tax_curr :=
6196         p_rec_nrec_dist_tbl(l_nrec_tax_index).prd_tax_amt_tax_curr +
6197                                                     l_prd_tax_rnd_diff_tax_curr;
6198     ELSIF l_rec_tax_index IS NOT NULL THEN
6199 
6200       p_rec_nrec_dist_tbl(l_rec_tax_index).prd_tax_amt_tax_curr :=
6201         p_rec_nrec_dist_tbl(l_rec_tax_index).prd_tax_amt_tax_curr +
6202                                                     l_prd_tax_rnd_diff_tax_curr;
6203     END IF;
6204   END IF;      -- l_prd_tax_rnd_diff_tax_curr <> 0
6205 
6206   -- Functional currency
6207   --
6208   IF p_rec_nrec_dist_tbl(p_rnd_begin_index).prd_total_tax_amt_funcl_curr
6209                                                                IS NOT NULL THEN
6210     l_prd_tax_rnd_diff_funcl_curr :=
6211       p_rec_nrec_dist_tbl(p_rnd_begin_index).prd_total_tax_amt_funcl_curr -
6212                                                  l_total_prd_tax_amt_funcl_curr;
6213 
6214     IF l_prd_tax_rnd_diff_funcl_curr < 0 THEN
6215       -- Adjust rounding_diff to the largest recoverable tax dists first.
6216       -- If there is no recoverable tax dists, adjust rounding_diff to
6217       -- the largest nonrecoverable tax dists.
6218       --
6219       IF l_rec_tax_index IS NOT NULL THEN
6220 
6221         p_rec_nrec_dist_tbl(l_rec_tax_index).prd_tax_amt_funcl_curr :=
6222           p_rec_nrec_dist_tbl(l_rec_tax_index).prd_tax_amt_funcl_curr +
6223                                                   l_prd_tax_rnd_diff_funcl_curr;
6224 
6225       ELSIF l_nrec_tax_index IS NOT NULL THEN
6226 
6227         p_rec_nrec_dist_tbl(l_nrec_tax_index).prd_tax_amt_funcl_curr :=
6228           p_rec_nrec_dist_tbl(l_nrec_tax_index).prd_tax_amt_funcl_curr +
6229                                                   l_prd_tax_rnd_diff_funcl_curr;
6230       END IF;
6231 
6232     ELSIF l_prd_tax_rnd_diff_funcl_curr > 0 THEN
6233 
6234       -- Adjust rounding_diff to the largest nonrecoverable tax dists first.
6235       -- if there is no nonrecoverable tax dists, adjust rounding_diff to
6236       -- the largest recoverable tax dists.
6237       --
6238       IF l_nrec_tax_index IS NOT NULL THEN
6239 
6240         p_rec_nrec_dist_tbl(l_nrec_tax_index).prd_tax_amt_funcl_curr :=
6241           p_rec_nrec_dist_tbl(l_nrec_tax_index).prd_tax_amt_funcl_curr+
6242                                                   l_prd_tax_rnd_diff_funcl_curr;
6243 
6244       ELSIF l_rec_tax_index IS NOT NULL THEN
6245 
6246         p_rec_nrec_dist_tbl(l_rec_tax_index).prd_tax_amt_funcl_curr :=
6247           p_rec_nrec_dist_tbl(l_rec_tax_index).prd_tax_amt_funcl_curr+
6248                                                   l_prd_tax_rnd_diff_funcl_curr;
6249       END IF;
6250     END IF;      -- l_prd_tax_rnd_diff_funcl_curr <> 0
6251   END IF;
6252 
6253   IF (g_level_procedure >= g_current_runtime_level ) THEN
6254 
6255     FND_LOG.STRING(g_level_procedure,
6256                   'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.round_and_adjust_prd_tax_amts.END',
6257                   'ZX_TRD_INTERNAL_SERVICES_PVT.round_and_adjust_prd_tax_amts (-)'||p_return_status);
6258   END IF;
6259 
6260 EXCEPTION
6261 
6262   WHEN OTHERS THEN
6263     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6264     l_error_buffer := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
6265 
6266     IF (g_level_unexpected >= g_current_runtime_level ) THEN
6267       FND_LOG.STRING(g_level_unexpected,
6268                     'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.round_and_adjust_prd_tax_amts',
6269                      l_error_buffer);
6270       FND_LOG.STRING(g_level_unexpected,
6271                     'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.round_and_adjust_prd_tax_amts.END',
6272                     'ZX_TRD_INTERNAL_SERVICES_PVT.round_and_adjust_prd_tax_amts (-)');
6273       END IF;
6274 
6275 END round_and_adjust_prd_tax_amts;
6276 
6277 PROCEDURE get_variance_related_columns(
6278  p_detail_tax_line_tbl  IN            ZX_TRD_SERVICES_PUB_PKG.TAX_LINE_TBL_TYPE,
6279  p_tax_line_index       IN            NUMBER,
6280  p_rec_nrec_dist_tbl    IN OUT NOCOPY ZX_TRD_SERVICES_PUB_PKG.REC_NREC_DIST_TBL_TYPE,
6281  p_rnd_begin_index      IN            NUMBER,
6282  p_rnd_end_index        IN            NUMBER,
6283  p_return_status           OUT NOCOPY VARCHAR2,
6284  p_error_buffer            OUT NOCOPY VARCHAR2) IS
6285 
6286  l_dist_id              NUMBER;
6287 
6288 BEGIN
6289   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
6290   IF (g_level_procedure >= g_current_runtime_level ) THEN
6291     FND_LOG.STRING(g_level_procedure,
6292            'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_variance_related_columns.BEGIN',
6293            'ZX_TRD_INTERNAL_SERVICES_PVT.get_variance_related_columns(+)');
6294   END IF;
6295 
6296   p_return_status:= FND_API.G_RET_STS_SUCCESS;
6297 
6298   IF p_rnd_begin_index IS NULL OR p_rnd_end_index IS NULL OR
6299      p_rnd_begin_index > p_rnd_end_index THEN
6300 
6301     --p_return_status:= FND_API.G_RET_STS_ERROR;
6302     IF (g_level_statement >= g_current_runtime_level ) THEN
6303       FND_LOG.STRING(g_level_statement,
6304              'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_variance_related_columns',
6305              'begin or end index is null, or begin index > end index');
6306     END IF;
6307     RETURN;
6308   END IF;
6309 
6310   -- Bug 3631551: Populate variance determining factors that products pass in.
6311   --
6312   FOR i IN p_rnd_begin_index .. p_rnd_end_index LOOP
6313 
6314     IF p_rec_nrec_dist_tbl(i).ref_doc_application_id IS NOT NULL THEN
6315 
6316       IF p_rec_nrec_dist_tbl(i).recoverable_flag = 'N' THEN
6317         IF (g_level_statement >= g_current_runtime_level ) THEN
6318           FND_LOG.STRING(g_level_statement,
6319              'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_variance_related_columns',
6320              'recoverable_flag is N ');
6321         END IF;
6322 
6323 
6324       l_dist_id := p_rec_nrec_dist_tbl(i).trx_line_dist_id;
6325 
6326       -- bug 6709478
6327       IF NVL(p_rec_nrec_dist_tbl(i).reverse_flag, 'N') <> 'Y' AND
6328          NVL(p_rec_nrec_dist_tbl(i).freeze_flag, 'N') <> 'Y'
6329       THEN
6330         IF (g_level_statement >= g_current_runtime_level ) THEN
6331           FND_LOG.STRING(g_level_statement,
6332              'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_variance_related_columns',
6333              'Reverse flag and Freeze flag are not Y ');
6334         END IF;
6335 
6336         p_rec_nrec_dist_tbl(i).trx_line_dist_qty :=
6337               ZX_TRD_SERVICES_PUB_PKG.g_tax_variance_info_tbl(
6338                                                   l_dist_id).trx_line_dist_qty;
6339       END IF;
6340 
6341       p_rec_nrec_dist_tbl(i).ref_doc_trx_line_dist_qty :=
6342                  ZX_TRD_SERVICES_PUB_PKG.g_tax_variance_info_tbl(
6343                                            l_dist_id).ref_doc_trx_line_dist_qty;
6344       p_rec_nrec_dist_tbl(i).price_diff :=
6345           ZX_TRD_SERVICES_PUB_PKG.g_tax_variance_info_tbl(l_dist_id).price_diff;
6346 
6347       p_rec_nrec_dist_tbl(i).qty_diff :=
6348          p_rec_nrec_dist_tbl(i).trx_line_dist_qty -
6349                               p_rec_nrec_dist_tbl(i).ref_doc_trx_line_dist_qty;
6350       p_rec_nrec_dist_tbl(i).ref_doc_curr_conv_rate :=
6351                  ZX_TRD_SERVICES_PUB_PKG.g_tax_variance_info_tbl(
6352                                               l_dist_id).ref_doc_curr_conv_rate;
6353       p_rec_nrec_dist_tbl(i).applied_to_doc_curr_conv_rate :=
6354                  ZX_TRD_SERVICES_PUB_PKG.g_tax_variance_info_tbl(
6355                                        l_dist_id).applied_to_doc_curr_conv_rate;
6356 
6357       -- set rate_tax_factor
6358       --
6359       IF p_detail_tax_line_tbl(p_tax_line_index).tax_rate_type = 'PERCENTAGE' THEN
6360         p_rec_nrec_dist_tbl(i).rate_tax_factor := 1;
6361       ELSE       -- quantity based tax rate
6362         p_rec_nrec_dist_tbl(i).rate_tax_factor := 0;
6363       END IF;
6364     END IF;   -- p_rec_nrec_dist_tbl(i).recoverable_flag = 'N'
6365    ELSE
6366      IF (g_level_statement >= g_current_runtime_level ) THEN
6367           FND_LOG.STRING(g_level_statement,
6368              'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_variance_related_columns',
6369              'Ref doc application id is null');
6370      END IF;
6371 
6372    END IF; -- ref_doc_application_id is not null
6373   END LOOP;  -- i IN p_rnd_begin_index .. p_rnd_end_index
6374 
6375   IF (g_level_procedure >= g_current_runtime_level ) THEN
6376 
6377     FND_LOG.STRING(g_level_procedure,
6378            'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_variance_related_columns.END',
6379            'ZX_TRD_INTERNAL_SERVICES_PVT.get_variance_related_columns(-)'||p_return_status);
6380   END IF;
6381 
6382 EXCEPTION
6383   WHEN OTHERS THEN
6384     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6385     p_error_buffer := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
6386 
6387     IF (g_level_unexpected >= g_current_runtime_level ) THEN
6388       FND_LOG.STRING(g_level_unexpected,
6389              'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_variance_related_columns',
6390               p_error_buffer);
6391       FND_LOG.STRING(g_level_unexpected,
6392              'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.get_variance_related_columns.END',
6393              'ZX_TRD_INTERNAL_SERVICES_PVT.get_variance_related_columns(-)');
6394     END IF;
6395 
6396 END get_variance_related_columns;
6397 
6398 PROCEDURE calc_variance_factors(
6399  p_return_status              OUT NOCOPY     VARCHAR2,
6400  p_error_buffer               OUT NOCOPY     VARCHAR2) IS
6401 
6402 BEGIN
6403 
6404   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
6405 
6406   IF (g_level_procedure >= g_current_runtime_level ) THEN
6407    FND_LOG.STRING(g_level_procedure,
6408           'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.calc_variance_factors.BEGIN',
6409           'ZX_TRD_INTERNAL_SERVICES_PVT.calc_variance_factors(+)');
6410   END IF;
6411 
6412   p_return_status:= FND_API.G_RET_STS_SUCCESS;
6413 
6414 
6415   -- Bugfix 5035461: added recoverable_flag and reverse_flag condition in
6416   --                 the subquery.
6417 
6418   -- Bug 11675911 / Bug 10621602, formula changes for retainage release invoices and standard invoice
6419   -- with retainage line. g_ret_doc_type will be 'R' or 'S'. g_retained_value is the retained percent.
6420 
6421   IF ZX_TRD_SERVICES_PUB_PKG.g_retained_value is NOT NULL THEN
6422 
6423       IF (g_level_procedure >= g_current_runtime_level ) THEN
6424       FND_LOG.STRING(g_level_procedure,
6425           'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.calc_variance_factors',
6426            'g_retained_value is not NULL - Retainage flow');
6427       END IF;
6428 
6429       IF ZX_TRD_SERVICES_PUB_PKG.g_ret_doc_type is NOT NULL AND
6430           ZX_TRD_SERVICES_PUB_PKG.g_ret_doc_type = 'S' THEN
6431 
6432       IF (g_level_procedure >= g_current_runtime_level ) THEN
6433       FND_LOG.STRING(g_level_procedure,
6434           'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.calc_variance_factors',
6435           'Flow - Standard invoice with retainage line');
6436       END IF;
6437 
6438    -- Bug 11808769,For PO matched invoices, where quantity, price is NULL from purchase order,stamp AMOUNT as value for variance columns
6439    -- ref_per_trx_curr_unit_nr_amt, ref_doc_per_unit_nrec_tax_amt
6440 
6441          UPDATE zx_rec_nrec_dist_gt gt
6442          SET  per_trx_curr_unit_nr_amt =
6443          -- Bugfix 5218651: for amount based matching, when dist qty is 0 or null, return rec_nrec_tax_amt as per unit nr amount
6444                 DECODE(gt.trx_line_dist_qty*gt.unit_price,0, NVL(gt.unrounded_rec_nrec_tax_amt,gt.rec_nrec_tax_amt),
6445                       NVL(gt.unrounded_rec_nrec_tax_amt,gt.rec_nrec_tax_amt)/(gt.trx_line_dist_qty * gt.unit_price * (1 - (ZX_TRD_SERVICES_PUB_PKG.g_retained_value/100)))),
6446               per_unit_nrec_tax_amt =
6447                 DECODE(gt.trx_line_dist_qty, 0, NVL(gt.unrounded_rec_nrec_tax_amt,gt.rec_nrec_tax_amt),
6448                        NVL(gt.unrounded_rec_nrec_tax_amt,gt.rec_nrec_tax_amt)/gt.trx_line_dist_qty),
6449               (ref_doc_tax_dist_id,
6450                ref_doc_unit_price,
6451                ref_per_trx_curr_unit_nr_amt,
6452                ref_doc_per_unit_nrec_tax_amt)=
6453             (SELECT
6454                rec_nrec_tax_dist_id,
6455                --Bug 9470313
6456                Nvl(unit_price,0),
6457                DECODE(gt.ref_doc_trx_line_dist_qty,
6458                       NULL, DECODE(Nvl(dist.unit_price,0), 0, NVL(dist.unrounded_rec_nrec_tax_amt,dist.rec_nrec_tax_amt)/dist.trx_line_dist_amt, NVL(dist.unrounded_rec_nrec_tax_amt,dist.rec_nrec_tax_amt)/dist.unit_price),
6459                             DECODE(gt.ref_doc_trx_line_dist_qty*dist.unit_price, 0,  NVL(dist.unrounded_rec_nrec_tax_amt,dist.rec_nrec_tax_amt),
6460                                    NVL(dist.unrounded_rec_nrec_tax_amt,dist.rec_nrec_tax_amt)/(gt.ref_doc_trx_line_dist_qty*dist.unit_price))),
6461                DECODE(Nvl(gt.ref_doc_trx_line_dist_qty,0), 0, NVL(dist.unrounded_rec_nrec_tax_amt,dist.rec_nrec_tax_amt)/dist.trx_line_dist_amt,
6462                      NVL(dist.unrounded_rec_nrec_tax_amt,dist.rec_nrec_tax_amt)/gt.ref_doc_trx_line_dist_qty)
6463              FROM zx_rec_nrec_dist dist
6464              WHERE dist.application_id = gt.ref_doc_application_id
6465                AND dist.entity_code = gt.ref_doc_entity_code
6466                AND dist.event_class_code = gt.ref_doc_event_class_code
6467                AND dist.trx_id = gt.ref_doc_trx_id
6468                AND dist.trx_line_id = gt.ref_doc_line_id
6469                AND dist.trx_level_type = gt.ref_doc_trx_level_type
6470                AND (dist.trx_line_dist_id = gt.ref_doc_dist_id OR
6471                     gt.tax_only_line_flag = 'Y')
6472                AND dist.tax_regime_code  = gt.tax_regime_code
6473                AND dist.tax = gt.tax
6474                AND dist.recoverable_flag = 'N'
6475                AND NVL(dist.reverse_flag,'N') = 'N'
6476                AND dist.mrc_tax_dist_flag = 'N'
6477             )
6478          WHERE ref_doc_application_id IS NOT NULL
6479          AND recoverable_flag = 'N'
6480          AND NVL(reverse_flag,'N')='N'
6481          AND mrc_tax_dist_flag = 'N';
6482 
6483   -- update ref_doc_unit_price if it is null (PO has no tax)
6484   --
6485          UPDATE zx_rec_nrec_dist_gt gt
6486          SET ref_doc_unit_price =
6487             (SELECT  unit_price
6488                FROM zx_lines_det_factors line
6489                WHERE line.application_id = gt.ref_doc_application_id
6490                AND line.entity_code = gt.ref_doc_entity_code
6491                AND line.event_class_code = gt.ref_doc_event_class_code
6492                AND line.trx_id = gt.ref_doc_trx_id
6493                AND line.trx_line_id = gt.ref_doc_line_id
6494                AND line.trx_level_type = gt.ref_doc_trx_level_type
6495             ),
6496              ref_per_trx_curr_unit_nr_amt = 0,
6497              ref_doc_per_unit_nrec_tax_amt = 0
6498          WHERE ref_doc_application_id IS NOT NULL
6499          AND recoverable_flag = 'N'
6500          AND NVL(reverse_flag,'N')='N'
6501          AND mrc_tax_dist_flag = 'N'
6502          AND ref_doc_tax_dist_id IS NULL;
6503 
6504       END IF; -- g_ret_doc_type 'S'
6505 
6506       IF ZX_TRD_SERVICES_PUB_PKG.g_ret_doc_type is NOT NULL AND
6507          ZX_TRD_SERVICES_PUB_PKG.g_ret_doc_type = 'R' THEN
6508 
6509       IF (g_level_procedure >= g_current_runtime_level ) THEN
6510       FND_LOG.STRING(g_level_procedure,
6511           'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.calc_variance_factors',
6512           'Flow - retainage release invoice');
6513       END IF;
6514 
6515         UPDATE zx_rec_nrec_dist_gt gt
6516          SET  per_trx_curr_unit_nr_amt =
6517        -- Bugfix 5218651: for amount based matching, when dist qty is 0 or null, return rec_nrec_tax_amt as per unit nr amount
6518                  DECODE(gt.trx_line_dist_qty*gt.unit_price,0, NVL(gt.unrounded_rec_nrec_tax_amt,gt.rec_nrec_tax_amt),
6519                      NVL(gt.unrounded_rec_nrec_tax_amt,gt.rec_nrec_tax_amt)/(gt.trx_line_dist_qty * gt.unit_price * (ZX_TRD_SERVICES_PUB_PKG.g_retained_value/100))),
6520               per_unit_nrec_tax_amt =
6521                  DECODE(gt.trx_line_dist_qty, 0, NVL(gt.unrounded_rec_nrec_tax_amt,gt.rec_nrec_tax_amt),
6522                         NVL(gt.unrounded_rec_nrec_tax_amt,gt.rec_nrec_tax_amt)/gt.trx_line_dist_qty),
6523               (ref_doc_tax_dist_id,
6524                ref_doc_unit_price,
6525                ref_per_trx_curr_unit_nr_amt,
6526               ref_doc_per_unit_nrec_tax_amt)=
6527                 (SELECT
6528                  rec_nrec_tax_dist_id,
6529                  --Bug 9470313
6530                  Nvl(unit_price,0),
6531                  DECODE(gt.ref_doc_trx_line_dist_qty,
6532                          NULL, DECODE(Nvl(dist.unit_price,0), 0, NVL(dist.unrounded_rec_nrec_tax_amt,dist.rec_nrec_tax_amt)/dist.trx_line_dist_amt, NVL(dist.unrounded_rec_nrec_tax_amt,dist.rec_nrec_tax_amt)/dist.unit_price),
6533                          DECODE(gt.ref_doc_trx_line_dist_qty*dist.unit_price, 0,  NVL(dist.unrounded_rec_nrec_tax_amt,dist.rec_nrec_tax_amt),
6534                                (NVL(dist.unrounded_rec_nrec_tax_amt,dist.rec_nrec_tax_amt))*(ZX_TRD_SERVICES_PUB_PKG.g_retained_value/100)/(gt.ref_doc_trx_line_dist_qty*dist.unit_price*(ZX_TRD_SERVICES_PUB_PKG.g_retained_value/100)))),
6535                  DECODE(Nvl(gt.ref_doc_trx_line_dist_qty,0), 0, NVL(dist.unrounded_rec_nrec_tax_amt,dist.rec_nrec_tax_amt)/dist.trx_line_dist_amt,
6536                              NVL(dist.unrounded_rec_nrec_tax_amt, dist.rec_nrec_tax_amt)/gt.ref_doc_trx_line_dist_qty)
6537                  FROM zx_rec_nrec_dist dist
6538                  WHERE dist.application_id = gt.ref_doc_application_id
6539                    AND dist.entity_code = gt.ref_doc_entity_code
6540                    AND dist.event_class_code = gt.ref_doc_event_class_code
6541                    AND dist.trx_id = gt.ref_doc_trx_id
6542                    AND dist.trx_line_id = gt.ref_doc_line_id
6543                    AND dist.trx_level_type = gt.ref_doc_trx_level_type
6544                    AND (dist.trx_line_dist_id = gt.ref_doc_dist_id OR
6545                         gt.tax_only_line_flag = 'Y')
6546                    AND dist.tax_regime_code  = gt.tax_regime_code
6547                    AND dist.tax = gt.tax
6548                    AND dist.recoverable_flag = 'N'
6549                    AND NVL(dist.reverse_flag,'N') = 'N'
6550                    AND dist.mrc_tax_dist_flag = 'N'
6551                  )
6552          WHERE ref_doc_application_id IS NOT NULL
6553          AND recoverable_flag = 'N'
6554          AND NVL(reverse_flag,'N')='N'
6555          AND mrc_tax_dist_flag = 'N';
6556 
6557         -- update ref_doc_unit_price if it is null (PO has no tax)
6558         --
6559          UPDATE zx_rec_nrec_dist_gt gt
6560          SET ref_doc_unit_price =
6561             (SELECT  unit_price
6562              FROM zx_lines_det_factors line
6563              WHERE line.application_id = gt.ref_doc_application_id
6564                AND line.entity_code = gt.ref_doc_entity_code
6565                AND line.event_class_code = gt.ref_doc_event_class_code
6566                AND line.trx_id = gt.ref_doc_trx_id
6567                AND line.trx_line_id = gt.ref_doc_line_id
6568                AND line.trx_level_type = gt.ref_doc_trx_level_type
6569             ),
6570             ref_per_trx_curr_unit_nr_amt = 0,
6571             ref_doc_per_unit_nrec_tax_amt = 0
6572          WHERE ref_doc_application_id IS NOT NULL
6573           AND recoverable_flag = 'N'
6574           AND NVL(reverse_flag,'N')='N'
6575           AND mrc_tax_dist_flag = 'N'
6576           AND ref_doc_tax_dist_id IS NULL;
6577 
6578       END IF; -- g_ret_doc_type 'R'
6579 
6580   ELSE
6581   IF (g_level_procedure >= g_current_runtime_level ) THEN
6582       FND_LOG.STRING(g_level_procedure,
6583           'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.calc_variance_factors',
6584           'No Retainage - Normal Flow');
6585   END IF;
6586 
6587   -- Bug 10069028, As per PM, use unrounded_rec_nrec_tax_amt for variance calculation
6588 
6589   UPDATE zx_rec_nrec_dist_gt gt
6590      SET  per_trx_curr_unit_nr_amt =
6591   -- Bugfix 5218651: for amount based matching, when dist qty is 0 or null, return rec_nrec_tax_amt as per unit nr amount
6592             DECODE(gt.trx_line_dist_qty*gt.unit_price,0, NVL(gt.unrounded_rec_nrec_tax_amt,gt.rec_nrec_tax_amt),
6593                    NVL(gt.unrounded_rec_nrec_tax_amt,gt.rec_nrec_tax_amt)/(gt.trx_line_dist_qty*gt.unit_price)),
6594           per_unit_nrec_tax_amt =
6595              DECODE(gt.trx_line_dist_qty, 0, NVL(gt.unrounded_rec_nrec_tax_amt,gt.rec_nrec_tax_amt),
6596                     NVL(gt.unrounded_rec_nrec_tax_amt,gt.rec_nrec_tax_amt)/gt.trx_line_dist_qty),
6597           (ref_doc_tax_dist_id,
6598           ref_doc_unit_price,
6599           ref_per_trx_curr_unit_nr_amt,
6600           ref_doc_per_unit_nrec_tax_amt)=
6601          (SELECT
6602            rec_nrec_tax_dist_id,
6603            --Bug 9470313
6604            Nvl(unit_price,0),
6605            DECODE(gt.ref_doc_trx_line_dist_qty,
6606                   NULL, DECODE(Nvl(dist.unit_price,0), 0, NVL(dist.unrounded_rec_nrec_tax_amt, dist.rec_nrec_tax_amt)/dist.trx_line_dist_amt, NVL(dist.unrounded_rec_nrec_tax_amt,dist.rec_nrec_tax_amt)/dist.unit_price),
6607                         DECODE(gt.ref_doc_trx_line_dist_qty*dist.unit_price, 0,  NVL(dist.unrounded_rec_nrec_tax_amt,dist.rec_nrec_tax_amt),
6608                                NVL(dist.unrounded_rec_nrec_tax_amt,dist.rec_nrec_tax_amt)/(gt.ref_doc_trx_line_dist_qty*dist.unit_price))),
6609            DECODE(Nvl(gt.ref_doc_trx_line_dist_qty,0), 0, NVL(dist.unrounded_rec_nrec_tax_amt,dist.rec_nrec_tax_amt)/dist.trx_line_dist_amt,
6610                              NVL(dist.unrounded_rec_nrec_tax_amt,dist.rec_nrec_tax_amt)/gt.ref_doc_trx_line_dist_qty)
6611             FROM zx_rec_nrec_dist dist
6612            WHERE dist.application_id = gt.ref_doc_application_id
6613              AND dist.entity_code = gt.ref_doc_entity_code
6614              AND dist.event_class_code = gt.ref_doc_event_class_code
6615              AND dist.trx_id = gt.ref_doc_trx_id
6616              AND dist.trx_line_id = gt.ref_doc_line_id
6617              AND dist.trx_level_type = gt.ref_doc_trx_level_type
6618              AND (dist.trx_line_dist_id = gt.ref_doc_dist_id OR
6619                   gt.tax_only_line_flag = 'Y')
6620              AND dist.tax_regime_code  = gt.tax_regime_code
6621              AND dist.tax = gt.tax
6622              AND dist.recoverable_flag = 'N'
6623              AND NVL(dist.reverse_flag,'N') = 'N'
6624              AND dist.mrc_tax_dist_flag = 'N'
6625          )
6626    WHERE ref_doc_application_id IS NOT NULL
6627      AND recoverable_flag = 'N'
6628      AND NVL(reverse_flag,'N')='N'
6629      AND mrc_tax_dist_flag = 'N';
6630 
6631   -- update ref_doc_unit_price if it is null (PO has no tax)
6632   --
6633   -- Bug 10406032, update ref_per_trx_curr_unit_nr_amt and ref_doc_per_unit_nrec_tax_amt to 0 if PO has no tax.
6634   -- Bug 14648916, update per_trx_curr_unit_nr_amt and per_unit_nrec_tax_amt based on rounded rec_nrec_tax_amt
6635 
6636   UPDATE zx_rec_nrec_dist_gt gt
6637      SET ref_doc_unit_price =
6638          (SELECT  unit_price
6639             FROM zx_lines_det_factors line
6640            WHERE line.application_id = gt.ref_doc_application_id
6641              AND line.entity_code = gt.ref_doc_entity_code
6642              AND line.event_class_code = gt.ref_doc_event_class_code
6643              AND line.trx_id = gt.ref_doc_trx_id
6644              AND line.trx_line_id = gt.ref_doc_line_id
6645              AND line.trx_level_type = gt.ref_doc_trx_level_type
6646          ),
6647          ref_per_trx_curr_unit_nr_amt = 0,
6648          ref_doc_per_unit_nrec_tax_amt = 0,
6649 	 per_trx_curr_unit_nr_amt =
6650                DECODE(gt.trx_line_dist_qty*gt.unit_price,0, gt.rec_nrec_tax_amt,
6651                    gt.rec_nrec_tax_amt/(gt.trx_line_dist_qty*gt.unit_price)),
6652          per_unit_nrec_tax_amt =
6653              DECODE(gt.trx_line_dist_qty, 0, gt.rec_nrec_tax_amt,
6654                     gt.rec_nrec_tax_amt/gt.trx_line_dist_qty)
6655      WHERE ref_doc_application_id IS NOT NULL
6656      AND recoverable_flag = 'N'
6657      AND NVL(reverse_flag,'N')='N'
6658      AND mrc_tax_dist_flag = 'N'
6659      AND ref_doc_tax_dist_id IS NULL;
6660 
6661   END IF; --ZX_TRD_SERVICES_PUB_PKG.g_retained_value
6662 
6663   IF (g_level_procedure >= g_current_runtime_level ) THEN
6664    FND_LOG.STRING(g_level_procedure,
6665           'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.calc_variance_factors.END',
6666           'ZX_TRD_INTERNAL_SERVICES_PVT.calc_variance_factors(-)'||p_return_status);
6667   END IF;
6668 
6669 EXCEPTION
6670   WHEN OTHERS THEN
6671     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6672     p_error_buffer := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
6673 
6674     IF (g_level_unexpected >= g_current_runtime_level ) THEN
6675       FND_LOG.STRING(g_level_unexpected,
6676              'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.calc_variance_factors',
6677               p_error_buffer);
6678       FND_LOG.STRING(g_level_unexpected,
6679              'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.calc_variance_factors.END',
6680              'ZX_TRD_INTERNAL_SERVICES_PVT.calc_variance_factors(-)');
6681     END IF;
6682 
6683 END calc_variance_factors;
6684 
6685 /* =====================================================================*
6686  |  Public Procedures create_mrc_tax_dists creates tax distributions    |
6687  |   for each reporting currency                                        |
6688  * =====================================================================*/
6689 PROCEDURE create_mrc_tax_dists (
6690  p_event_class_rec   IN             zx_api_pub.event_class_rec_type,
6691  p_rec_nrec_dist_tbl IN OUT NOCOPY  ZX_TRD_SERVICES_PUB_PKG.rec_nrec_dist_tbl_type,
6692  p_rnd_begin_index   IN             NUMBER,
6693  p_rnd_end_index     IN OUT NOCOPY  NUMBER,
6694  p_return_status        OUT NOCOPY  VARCHAR2,
6695  p_error_buffer         OUT NOCOPY  VARCHAR2) IS
6696 
6697  CURSOR  get_mrc_tax_line_info_csr(
6698          c_trx_line_id          zx_lines.trx_line_id%TYPE,
6699          c_trx_level_type       zx_lines.trx_level_type%TYPE,
6700          c_tax_line_number      zx_lines.tax_line_number%TYPE) IS
6701   SELECT ledger_id,
6702          reporting_currency_code,
6703          currency_conversion_rate,
6704          currency_conversion_date,
6705          currency_conversion_type,
6706          minimum_accountable_unit,
6707          precision,
6708          tax_line_id,
6709          summary_tax_line_id,
6710          tax_amt
6711     FROM zx_lines
6712    WHERE application_id = p_event_class_rec.application_id
6713      AND entity_code = p_event_class_rec.entity_code
6714      AND event_class_code = p_event_class_rec.event_class_code
6715      AND trx_id = p_event_class_rec.trx_id
6716      AND trx_line_id = c_trx_line_id
6717      AND trx_level_type = c_trx_level_type
6718      AND tax_line_number = c_tax_line_number
6719      AND mrc_tax_line_flag = 'Y';
6720 
6721  l_rnd_begin_index          NUMBER;
6722  l_end_index                NUMBER;
6723 
6724 BEGIN
6725 
6726   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
6727 
6728   IF (g_level_statement >= g_current_runtime_level ) THEN
6729     FND_LOG.STRING(g_level_statement,
6730            'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.create_mrc_tax_dists.BEGIN',
6731            'ZX_TRD_INTERNAL_SERVICES_PVT.create_mrc_tax_dists(+)');
6732   END IF;
6733 
6734   p_return_status := FND_API.G_RET_STS_SUCCESS;
6735 
6736   IF p_rnd_begin_index IS NULL OR p_rnd_end_index IS NULL OR
6737      p_rnd_begin_index > p_rnd_end_index THEN
6738 
6739     --p_return_status := FND_API.G_RET_STS_ERROR;
6740     IF (g_level_statement >= g_current_runtime_level ) THEN
6741       FND_LOG.STRING(g_level_statement,
6742              'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.create_mrc_tax_dists',
6743              'begin or end index is null, or begin index > end index');
6744     END IF;
6745     RETURN;
6746   END IF;
6747 
6748   l_end_index := p_rnd_end_index;
6749 
6750   -- create tax distributions in Reporting Currency
6751   --
6752   FOR mrc_line_rec IN get_mrc_tax_line_info_csr (
6753             p_rec_nrec_dist_tbl(p_rnd_begin_index).trx_line_id,
6754             p_rec_nrec_dist_tbl(p_rnd_begin_index).trx_level_type,
6755             p_rec_nrec_dist_tbl(p_rnd_begin_index).tax_line_number) LOOP
6756 
6757     l_rnd_begin_index := p_rnd_end_index + 1;
6758 
6759     FOR j IN p_rnd_begin_index .. l_end_index LOOP
6760 
6761       p_rnd_end_index := p_rnd_end_index + 1;
6762       p_rec_nrec_dist_tbl(p_rnd_end_index) := p_rec_nrec_dist_tbl(j);
6763 
6764       -- set MRC related columns
6765       --
6766       SELECT zx_rec_nrec_dist_s.NEXTVAL INTO
6767              p_rec_nrec_dist_tbl(p_rnd_end_index).rec_nrec_tax_dist_id FROM DUAL;
6768 
6769       p_rec_nrec_dist_tbl(p_rnd_end_index).unrounded_rec_nrec_tax_amt :=
6770             p_rec_nrec_dist_tbl(j).unrounded_rec_nrec_tax_amt *
6771                                          mrc_line_rec.currency_conversion_rate;
6772 
6773       p_rec_nrec_dist_tbl(p_rnd_end_index).unrounded_taxable_amt :=
6774             p_rec_nrec_dist_tbl(j).unrounded_taxable_amt *
6775                                          mrc_line_rec.currency_conversion_rate;
6776 
6777       p_rec_nrec_dist_tbl(p_rnd_end_index).ledger_id := mrc_line_rec.ledger_id;
6778       p_rec_nrec_dist_tbl(p_rnd_end_index).currency_conversion_date :=
6779                                          mrc_line_rec.currency_conversion_date;
6780       p_rec_nrec_dist_tbl(p_rnd_end_index).currency_conversion_type :=
6781                                          mrc_line_rec.currency_conversion_type;
6782       p_rec_nrec_dist_tbl(p_rnd_end_index).currency_conversion_rate :=
6783                                          mrc_line_rec.currency_conversion_rate;
6784       p_rec_nrec_dist_tbl(p_rnd_end_index).minimum_accountable_unit :=
6785                                          mrc_line_rec.minimum_accountable_unit;
6786       p_rec_nrec_dist_tbl(p_rnd_end_index).precision := mrc_line_rec.precision;
6787       p_rec_nrec_dist_tbl(p_rnd_end_index).trx_currency_code :=
6788                                           mrc_line_rec.reporting_currency_code;
6789       p_rec_nrec_dist_tbl(p_rnd_end_index).tax_line_id :=
6790                                                       mrc_line_rec.tax_line_id;
6791       p_rec_nrec_dist_tbl(p_rnd_end_index).summary_tax_line_id :=
6792                                               mrc_line_rec.summary_tax_line_id;
6793 
6794       p_rec_nrec_dist_tbl(p_rnd_end_index).mrc_tax_dist_flag := 'Y';
6795       p_rec_nrec_dist_tbl(p_rnd_end_index).mrc_link_to_tax_dist_id :=
6796                                   p_rec_nrec_dist_tbl(j).rec_nrec_tax_dist_id;
6797 
6798       p_rec_nrec_dist_tbl(p_rnd_end_index).reversed_tax_dist_id := NULL;
6799       p_rec_nrec_dist_tbl(p_rnd_end_index).rec_nrec_tax_amt_tax_curr := NULL;
6800       p_rec_nrec_dist_tbl(p_rnd_end_index).rec_nrec_tax_amt_funcl_curr := NULL;
6801       p_rec_nrec_dist_tbl(p_rnd_end_index).tax_currency_conversion_date := NULL;
6802       p_rec_nrec_dist_tbl(p_rnd_end_index).tax_currency_conversion_type := NULL;
6803       p_rec_nrec_dist_tbl(p_rnd_end_index).tax_currency_conversion_rate := NULL;
6804       p_rec_nrec_dist_tbl(p_rnd_end_index).tax_currency_code := NULL;
6805       p_rec_nrec_dist_tbl(p_rnd_end_index).taxable_amt_tax_curr := NULL;
6806       p_rec_nrec_dist_tbl(p_rnd_end_index).taxable_amt_funcl_curr := NULL;
6807       p_rec_nrec_dist_tbl(p_rnd_end_index).prd_tax_amt := NULL;
6808       p_rec_nrec_dist_tbl(p_rnd_end_index).prd_tax_amt_tax_curr := NULL;
6809       p_rec_nrec_dist_tbl(p_rnd_end_index).prd_tax_amt_funcl_curr := NULL;
6810       p_rec_nrec_dist_tbl(p_rnd_end_index).prd_total_tax_amt := NULL;
6811       p_rec_nrec_dist_tbl(p_rnd_end_index).prd_total_tax_amt_tax_curr := NULL;
6812       p_rec_nrec_dist_tbl(p_rnd_end_index).prd_total_tax_amt_funcl_curr := NULL;
6813       p_rec_nrec_dist_tbl(p_rnd_end_index).func_curr_rounding_adjustment := NULL;
6814 
6815       p_rec_nrec_dist_tbl(p_rnd_end_index).trx_line_dist_tax_amt := NULL;
6816       p_rec_nrec_dist_tbl(p_rnd_end_index).orig_rec_nrec_rate:= NULL;
6817       p_rec_nrec_dist_tbl(p_rnd_end_index).orig_rec_rate_code := NULL;
6818       p_rec_nrec_dist_tbl(p_rnd_end_index).orig_rec_nrec_tax_amt := NULL;
6819       p_rec_nrec_dist_tbl(p_rnd_end_index).orig_rec_nrec_tax_amt_tax_curr := NULL;
6820       p_rec_nrec_dist_tbl(p_rnd_end_index).price_diff := NULL;
6821       p_rec_nrec_dist_tbl(p_rnd_end_index).qty_diff := NULL;
6822       p_rec_nrec_dist_tbl(p_rnd_end_index).per_trx_curr_unit_nr_amt := NULL;
6823       p_rec_nrec_dist_tbl(p_rnd_end_index).ref_per_trx_curr_unit_nr_amt := NULL;
6824       p_rec_nrec_dist_tbl(p_rnd_end_index).unit_price := NULL;
6825       p_rec_nrec_dist_tbl(p_rnd_end_index).ref_doc_unit_price := NULL;
6826       p_rec_nrec_dist_tbl(p_rnd_end_index).per_unit_nrec_tax_amt:= NULL;
6827       p_rec_nrec_dist_tbl(p_rnd_end_index).ref_doc_per_unit_nrec_tax_amt := NULL;
6828 
6829     END LOOP;        -- j IN p_rnd_begin_index .. l_end_index LOOP
6830 
6831     ZX_TRD_INTERNAL_SERVICES_PVT.round_rec_nrec_amt(
6832 		p_rec_nrec_dist_tbl,
6833       		l_rnd_begin_index,
6834       		p_rnd_end_index,
6835       		mrc_line_rec.tax_amt,
6836       		NULL,
6837       		NULL,
6838       		p_return_status,
6839       		p_error_buffer);
6840 
6841     IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
6842       IF (g_level_statement >= g_current_runtime_level ) THEN
6843         FND_LOG.STRING(g_level_statement,
6844                       'ZX.PLSQL.ZX_TRD_SERVICES_PUB_PKG.create_mrc_tax_dists',
6845                       'After calling ROUND_REC_NREC_AMT p_return_status = '
6846                        || p_return_status);
6847   	FND_LOG.STRING(g_level_statement,
6848                       'ZX.PLSQL.ZX_TRD_SERVICES_PUB_PKG.create_mrc_tax_dists.END',
6849                       'ZX_TRD_SERVICES_PUB_PKG.create_mrc_tax_dists(-)');
6850       END IF;
6851       RETURN;
6852     END IF;
6853   END LOOP;          -- mrc_line_rec IN get_mrc_tax_line_info_csr LOOP
6854 
6855   IF (g_level_procedure >= g_current_runtime_level ) THEN
6856     FND_LOG.STRING(g_level_procedure,
6857            'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.create_mrc_tax_dists.END',
6858            'ZX_TRD_INTERNAL_SERVICES_PVT.create_mrc_tax_dists(-)');
6859   END IF;
6860 
6861 EXCEPTION
6862   WHEN OTHERS THEN
6863     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6864 
6865     IF (g_level_unexpected >= g_current_runtime_level ) THEN
6866       FND_LOG.STRING(g_level_unexpected,
6867              'ZX.PLSQL.ZX_TDS_MRC_PROCESSING_PKG.create_mrc_det_tax_lines',
6868               sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80));
6869       FND_LOG.STRING(g_level_unexpected,
6870              'ZX.PLSQL.ZX_TRD_INTERNAL_SERVICES_PVT.create_mrc_tax_dists.END',
6871              'ZX_TRD_INTERNAL_SERVICES_PVT.create_mrc_tax_dists(-)');
6872     END IF;
6873 END create_mrc_tax_dists;
6874 
6875 END ZX_TRD_INTERNAL_SERVICES_PVT;