DBA Data[Home] [Help]

PACKAGE BODY: APPS.ZX_TRD_SERVICES_PUB_PKG

Source


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