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