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