DBA Data[Home] [Help]

PACKAGE BODY: APPS.ZX_TDS_TAX_ROUNDING_PKG

Source


1 package body  ZX_TDS_TAX_ROUNDING_PKG as
2 /* $Header: zxdiroundtaxpkgb.pls 120.101.12020000.4 2013/03/12 08:49:04 ssanka ship $ */
3 
4 /* ======================================================================*
5   |  Global Variable                                                     |
6   * =====================================================================*/
7 
8 g_hdr_rounding_info_tbl     hdr_rounding_info_tbl;
9 g_hdr_rounding_curr_tbl     hdr_rounding_curr_tbl;
10 
11 g_current_runtime_level     NUMBER;
12 g_level_statement           CONSTANT  NUMBER   := FND_LOG.LEVEL_STATEMENT;
13 g_level_procedure           CONSTANT  NUMBER   := FND_LOG.LEVEL_PROCEDURE;
14 g_level_error               CONSTANT  NUMBER   := FND_LOG.LEVEL_ERROR;
15 g_level_unexpected          CONSTANT  NUMBER   := FND_LOG.LEVEL_UNEXPECTED;
16 
17 
18 /* ======================================================================*
19   |  Private Procedures                                                  |
20   * =====================================================================*/
21 
22 PROCEDURE get_currency_info(
23                 p_currency              IN      VARCHAR2,
24                 p_eff_date              IN       DATE,
25                 p_derive_effective         OUT NOCOPY  DATE,
26                 p_derive_type              OUT NOCOPY  VARCHAR2,
27                 p_conversion_rate          OUT NOCOPY  NUMBER,
28                 p_mau                      OUT NOCOPY  NUMBER,
29                 p_precision                OUT NOCOPY  NUMBER,
30                 p_currency_type            OUT NOCOPY  VARCHAR2,
31                 p_return_status            OUT NOCOPY  VARCHAR2,
32                 p_error_buffer             OUT NOCOPY  VARCHAR2 );
33 
34 PROCEDURE  get_currency_info_for_rounding(
35              p_currency_code     IN     ZX_LINES.TRX_CURRENCY_CODE%TYPE,
36              p_conversion_date   IN     ZX_LINES.CURRENCY_CONVERSION_DATE%TYPE,
37              p_return_status     OUT NOCOPY VARCHAR2,
38              p_error_buffer      OUT NOCOPY VARCHAR2);
39 
40 FUNCTION get_other_rate (
41                 p_from_currency       IN     VARCHAR2,
42                 p_to_currency         IN     VARCHAR2,
43                 p_conversion_date     IN     Date,
44                 p_tax_conversion_type IN     VARCHAR2,
45                 p_trx_conversion_type IN     VARCHAR2,
46                 p_return_status       OUT NOCOPY VARCHAR2,
47                 p_error_buffer        OUT NOCOPY VARCHAR2,
48                 p_trx_conversion_date IN DATE DEFAULT NULL) RETURN NUMBER; --Bug7183884
49 
50 FUNCTION get_euro_code(p_return_status OUT NOCOPY VARCHAR2,
51                        p_error_buffer  OUT NOCOPY VARCHAR2) RETURN VARCHAR2;
52 
53 FUNCTION convert_amount (
54                 p_from_currency         IN  VARCHAR2,
55                 p_to_currency           IN  VARCHAR2,
56                 p_conversion_date       IN  DATE,
57                 p_tax_conversion_type   IN  VARCHAR2,
58                 p_trx_conversion_type   IN  VARCHAR2,
59                 p_amount                IN  NUMBER,
60                 p_rate_index            IN  BINARY_INTEGER,
61                 p_return_status         OUT NOCOPY VARCHAR2,
62                 p_error_buffer          OUT NOCOPY VARCHAR2,
63                 p_trx_conversion_date IN DATE DEFAULT NULL) RETURN NUMBER; --Bug7183884
64 
65 FUNCTION get_rate_index(
66                 p_from_currency   IN     VARCHAR2,
67                 p_to_currency     IN     VARCHAR2,
68                 p_conversion_date IN     Date,
69                 p_conversion_type IN     VARCHAR2)
70 RETURN BINARY_INTEGER ;
71 
72 PROCEDURE get_funcl_curr_info(
73              p_ledger_id           IN             ZX_LINES.LEDGER_ID%TYPE,
74              p_funcl_currency_code    OUT NOCOPY FND_CURRENCIES.CURRENCY_CODE%TYPE,
75              p_funcl_min_acct_unit    OUT NOCOPY FND_CURRENCIES.MINIMUM_ACCOUNTABLE_UNIT%TYPE,
76              p_funcl_precision        OUT NOCOPY FND_CURRENCIES.PRECISION%TYPE,
77 
78              p_return_status          OUT NOCOPY VARCHAR2,
79              p_error_buffer           OUT NOCOPY VARCHAR2);
80 
81 PROCEDURE Get_Supplier_Site(
82               p_account_id           IN   ZX_REGISTRATIONS.ACCOUNT_ID%TYPE,
83               p_account_site_id      IN   ZX_REGISTRATIONS.ACCOUNT_SITE_ID%TYPE,
84               p_rounding_level_code  OUT NOCOPY  ZX_PARTY_TAX_PROFILE.ROUNDING_LEVEL_CODE%TYPE,
85               p_rounding_rule_code   OUT NOCOPY  ZX_PARTY_TAX_PROFILE.ROUNDING_RULE_CODE%TYPE,
86 
87               p_return_status        OUT  NOCOPY VARCHAR2);
88 
89 PROCEDURE  Get_Reg_Site_Uses (
90               p_account_id            IN   ZX_REGISTRATIONS.ACCOUNT_ID%TYPE,
91               p_account_site_id       IN   ZX_REGISTRATIONS.ACCOUNT_SITE_ID%TYPE,
92               p_site_use_id           IN   HZ_CUST_SITE_USES_ALL.CUST_ACCT_SITE_ID%TYPE,
93               p_rounding_level_code   OUT NOCOPY  ZX_PARTY_TAX_PROFILE.ROUNDING_LEVEL_CODE%TYPE,
94               p_rounding_rule_code    OUT NOCOPY  ZX_PARTY_TAX_PROFILE.ROUNDING_RULE_CODE%TYPE,
95               p_return_status         OUT NOCOPY  VARCHAR2);
96 
97 PROCEDURE  Get_Registration_Accts(
98              p_account_id             IN   ZX_REGISTRATIONS.ACCOUNT_ID%TYPE,
99              p_rounding_level_code    OUT NOCOPY  ZX_PARTY_TAX_PROFILE.ROUNDING_LEVEL_CODE%TYPE,
100              p_rounding_rule_code     OUT NOCOPY  ZX_PARTY_TAX_PROFILE.ROUNDING_RULE_CODE%TYPE,
101              p_return_status          OUT NOCOPY  VARCHAR2 );
102 
103 PROCEDURE  Get_Registration_Party(
104              p_party_tax_profile_id   IN  ZX_PARTY_TAX_PROFILE.PARTY_TAX_PROFILE_ID%TYPE,
105              p_rounding_level_code    OUT NOCOPY  ZX_PARTY_TAX_PROFILE.ROUNDING_LEVEL_CODE%TYPE,
106              p_rounding_rule_code     OUT NOCOPY  ZX_PARTY_TAX_PROFILE.ROUNDING_RULE_CODE%TYPE,
107              p_return_status          OUT NOCOPY  VARCHAR2 );
108 
109 
110 PROCEDURE get_rounding_level(
111 
112             p_parent_ptp_id          IN  zx_party_tax_profile.party_tax_profile_id%TYPE,
113             p_site_ptp_id            IN  zx_party_tax_profile.party_tax_profile_id%TYPE,
114             p_account_Type_Code      IN  zx_registrations.account_type_code%TYPE,
115             p_account_id             IN  ZX_REGISTRATIONS.ACCOUNT_ID%TYPE,
116             p_account_site_id        IN  ZX_REGISTRATIONS.ACCOUNT_SITE_ID%TYPE,
117             p_site_use_id            IN  HZ_CUST_SITE_USES_ALL.SITE_USE_ID%TYPE,
118             p_rounding_level_code    OUT NOCOPY  ZX_PARTY_TAX_PROFILE.ROUNDING_LEVEL_CODE%TYPE,
119             p_rounding_rule_code     OUT NOCOPY  ZX_PARTY_TAX_PROFILE.ROUNDING_RULE_CODE%TYPE,
120            p_return_status           OUT NOCOPY  VARCHAR2,
121            p_error_buffer            OUT NOCOPY  VARCHAR2
122          );
123 
124 PROCEDURE det_rounding_level_basis(
125             p_Party_Type_Code      IN     VARCHAR2,
126             p_rounding_level_basis    OUT NOCOPY  VARCHAR2,
127             p_return_status           OUT NOCOPY  VARCHAR2,
128             p_error_buffer            OUT NOCOPY  VARCHAR2
129            );
130 
131 PROCEDURE determine_round_level_and_rule(
132             p_Party_Type_Code      IN     VARCHAR2,
133             p_event_class_rec      IN     ZX_API_PUB.EVENT_CLASS_REC_TYPE,
134             p_tax_prof_id             OUT NOCOPY ZX_PARTY_TAX_PROFILE.PARTY_TAX_PROFILE_ID%TYPE,
135             p_rounding_level_code     OUT NOCOPY  ZX_PARTY_TAX_PROFILE.ROUNDING_LEVEL_CODE%TYPE,
136             p_rounding_rule_code      OUT NOCOPY  ZX_PARTY_TAX_PROFILE.ROUNDING_RULE_CODE%TYPE,
137             p_return_status           OUT NOCOPY  VARCHAR2,
138             p_error_buffer            OUT NOCOPY  VARCHAR2,
139             p_ship_third_pty_acct_id        IN NUMBER,
140             p_bill_third_pty_acct_id        IN NUMBER,
141             p_ship_third_pty_acct_site_id   IN NUMBER,
142             p_bill_third_pty_acct_site_id   IN NUMBER,
143             p_ship_to_cust_acct_st_use_id   IN NUMBER,
144             p_bill_to_cust_acct_st_use_id   IN NUMBER,
145             p_tax_determine_date            IN DATE
146            );
147 
148 PROCEDURE determine_rounding_rule(
149   p_trx_line_index     IN            BINARY_INTEGER,
150   p_event_class_rec    IN            ZX_API_PUB.EVENT_CLASS_REC_TYPE,
151   p_party_type_code    IN            VARCHAR2,
152   p_tax_regime_code    IN            VARCHAR2,
153   p_tax                IN            VARCHAR2,
154   p_jurisdiction_code  IN            VARCHAR2,
155   p_tax_determine_date IN            DATE,
156   p_rounding_rule_code    OUT NOCOPY ZX_PARTY_TAX_PROFILE.ROUNDING_RULE_CODE%TYPE,
157   p_return_status         OUT NOCOPY VARCHAR2,
158   p_error_buffer          OUT NOCOPY VARCHAR2);
159 
160 PROCEDURE get_rounding_info(
161             p_tax_id                        IN ZX_TAXES_B.TAX_ID%TYPE,
162             p_tax_currency_code             OUT NOCOPY ZX_LINES.TAX_CURRENCY_CODE%TYPE,
163             p_tax_currency_conversion_date  IN OUT NOCOPY ZX_LINES.TAX_CURRENCY_CONVERSION_DATE%TYPE, --bug#6526550
164             p_trx_currency_code             IN ZX_LINES.TRX_CURRENCY_CODE%TYPE,
165             p_currency_conversion_date      IN ZX_LINES.CURRENCY_CONVERSION_DATE%TYPE,
166             p_min_acct_unit                 IN OUT NOCOPY ZX_LINES.MINIMUM_ACCOUNTABLE_UNIT%TYPE,
167             p_precision                     IN OUT NOCOPY ZX_LINES.PRECISION%TYPE,
168             p_tax_min_acct_unit             OUT NOCOPY ZX_TAXES_B.MINIMUM_ACCOUNTABLE_UNIT%TYPE,
169             p_tax_precision                 OUT NOCOPY ZX_TAXES_B.TAX_PRECISION%TYPE,
170             p_tax_currency_conversion_type  OUT NOCOPY ZX_TAXES_B.EXCHANGE_RATE_TYPE%TYPE,
171             p_return_status                 OUT NOCOPY VARCHAR2,
172             p_error_buffer                  OUT NOCOPY VARCHAR2
173          );
174 
175 PROCEDURE round_line_level(
176              p_tax_amt               IN OUT NOCOPY ZX_LINES.TAX_AMT%TYPE,
177              p_taxable_amt              OUT NOCOPY ZX_LINES.TAXABLE_AMT%TYPE,
178              p_prd_total_tax_amt     IN OUT NOCOPY ZX_LINES.PRD_TOTAL_TAX_AMT%TYPE,
179              p_Rounding_Rule_Code    IN            ZX_LINES.Rounding_Rule_Code%TYPE,
180              p_trx_min_acct_unit     IN OUT NOCOPY ZX_LINES.MINIMUM_ACCOUNTABLE_UNIT%TYPE,
181              p_trx_precision         IN OUT NOCOPY ZX_LINES.PRECISION%TYPE,
182              p_trx_currency_code     IN            ZX_LINES.TRX_CURRENCY_CODE%TYPE,
183              p_application_id           IN            ZX_LINES.APPLICATION_ID%TYPE,
184              p_internal_organization_id IN            ZX_LINES.INTERNAL_ORGANIZATION_ID%TYPE,
185              p_event_class_mapping_id   IN            ZX_LINES_DET_FACTORS.EVENT_CLASS_MAPPING_ID%TYPE,
186              p_unrounded_taxable_amt IN ZX_LINES.UNROUNDED_TAXABLE_AMT%TYPE,
187              p_unrounded_tax_amt     IN ZX_LINES.UNROUNDED_TAX_AMT%TYPE,
188              p_return_status            OUT NOCOPY VARCHAR2,
189              p_error_buffer             OUT NOCOPY VARCHAR2
190          );
191 
192 PROCEDURE  init_header_group(
193              p_hdr_grp_rec       OUT NOCOPY HDR_GRP_REC_TYPE,
194              p_return_status     OUT NOCOPY VARCHAR2,
195              p_error_buffer      OUT NOCOPY VARCHAR2
196          );
197 
198 PROCEDURE  determine_header_group(
199              p_prev_hdr_grp_rec         IN            HDR_GRP_REC_TYPE,
200              p_curr_hdr_grp_rec         IN            HDR_GRP_REC_TYPE,
201              p_same_tax                    OUT NOCOPY VARCHAR2,
202              p_return_status               OUT NOCOPY VARCHAR2,
203              p_error_buffer                OUT NOCOPY VARCHAR2
204          );
205 
206 PROCEDURE  conv_rnd_tax_tax_curr(
207              p_from_currency        IN     ZX_LINES.TRX_CURRENCY_CODE%TYPE,
208              p_to_currency          IN     ZX_LINES.TAX_CURRENCY_CODE%TYPE,
209              p_conversion_date      IN     ZX_LINES.TAX_CURRENCY_CONVERSION_DATE%TYPE,
210              p_tax_conversion_type  IN     ZX_LINES.TAX_CURRENCY_CONVERSION_TYPE%TYPE,
211              p_trx_conversion_type  IN     ZX_LINES.CURRENCY_CONVERSION_TYPE%TYPE,
212              p_tax_curr_conv_rate   IN OUT NOCOPY ZX_LINES.TAX_CURRENCY_CONVERSION_RATE%TYPE,
213              p_amt                  IN     ZX_LINES.TAX_AMT%TYPE,
214              p_convert_round_amt        OUT NOCOPY ZX_LINES.TAX_AMT_TAX_CURR%TYPE,
215              p_Rounding_Rule_Code        IN     ZX_TAXES_B.Rounding_Rule_Code%TYPE,
216              p_tax_min_acct_unit    IN     ZX_TAXES_B.MINIMUM_ACCOUNTABLE_UNIT%TYPE,
217              p_tax_precision        IN     ZX_TAXES_B.TAX_PRECISION%TYPE,
218              p_return_status           OUT NOCOPY VARCHAR2,
219              p_error_buffer            OUT NOCOPY VARCHAR2,
220              p_trx_conversion_date  IN     ZX_LINES.CURRENCY_CONVERSION_DATE%TYPE DEFAULT NULL); --Bug7183884
221 
222 
223 PROCEDURE  conv_rnd_tax_funcl_curr(
224              p_funcl_curr_conv_rate IN     ZX_LINES.CURRENCY_CONVERSION_RATE%TYPE,
225              p_amt                  IN     ZX_LINES.TAX_AMT%TYPE,
226              p_convert_round_amt        OUT NOCOPY ZX_LINES.TAX_AMT_TAX_CURR%TYPE,
227              p_ledger_id            IN     ZX_LINES.LEDGER_ID%TYPE,
228              p_return_status           OUT NOCOPY VARCHAR2,
229              p_error_buffer            OUT NOCOPY VARCHAR2
230          );
231 
232 
233 PROCEDURE  conv_rnd_taxable_tax_curr(
234              p_from_currency        IN     ZX_LINES.TRX_CURRENCY_CODE%TYPE,
235              p_to_currency          IN     ZX_LINES.TAX_CURRENCY_CODE%TYPE,
236              p_conversion_date      IN     ZX_LINES.TAX_CURRENCY_CONVERSION_DATE%TYPE,
237              p_tax_conversion_type  IN     ZX_LINES.TAX_CURRENCY_CONVERSION_TYPE%TYPE,
238              p_trx_conversion_type  IN     ZX_LINES.CURRENCY_CONVERSION_TYPE%TYPE,
239              p_tax_curr_conv_rate   IN OUT NOCOPY ZX_LINES.TAX_CURRENCY_CONVERSION_RATE%TYPE,
240              p_amt                  IN     ZX_LINES.TAX_AMT%TYPE,
241              p_convert_round_amt        OUT NOCOPY ZX_LINES.TAX_AMT_TAX_CURR%TYPE,
242              p_Rounding_Rule_Code        IN     ZX_TAXES_B.Rounding_Rule_Code%TYPE,
243              p_tax_min_acct_unit    IN     ZX_TAXES_B.MINIMUM_ACCOUNTABLE_UNIT%TYPE,
244              p_tax_precision        IN     ZX_TAXES_B.TAX_PRECISION%TYPE,
245              p_tax_calculation_formula IN         ZX_LINES.TAX_CALCULATION_FORMULA%TYPE,
246              p_tax_rate                IN         ZX_LINES.TAX_RATE%TYPE,
247              p_tax_rate_id             IN         ZX_RATES_B.TAX_RATE_ID%TYPE,
248              p_rounded_amt_tax_curr IN     ZX_LINES.TAX_AMT_TAX_CURR%TYPE,
249              p_return_status           OUT NOCOPY VARCHAR2,
250              p_error_buffer            OUT NOCOPY VARCHAR2,
251              p_trx_conversion_date  IN     ZX_LINES.CURRENCY_CONVERSION_DATE%TYPE DEFAULT NULL);--Bug7183884
252 
253 
254 PROCEDURE  conv_rnd_taxable_funcl_curr(
255              p_funcl_curr_conv_rate IN     ZX_LINES.CURRENCY_CONVERSION_RATE%TYPE,
256              p_amt                  IN     ZX_LINES.TAX_AMT%TYPE,
257              p_convert_round_amt        OUT NOCOPY ZX_LINES.TAX_AMT_TAX_CURR%TYPE,
258              p_ledger_id            IN     ZX_LINES.LEDGER_ID%TYPE,
259              p_tax_calculation_formula IN     ZX_LINES.TAX_CALCULATION_FORMULA%TYPE,
260              p_tax_rate             IN     ZX_LINES.TAX_RATE%TYPE,
261              p_tax_rate_id          IN     ZX_RATES_B.TAX_RATE_ID%TYPE,
262              p_rounded_amt_funcl_curr IN     ZX_LINES.TAX_AMT_FUNCL_CURR%TYPE,
263              p_return_status           OUT NOCOPY VARCHAR2,
264              p_error_buffer            OUT NOCOPY VARCHAR2
265          );
266 
267 PROCEDURE do_rounding(
268            p_tax_id                        IN            ZX_TAXES_B.TAX_ID%TYPE,
269            p_tax_rate_id                   IN            ZX_RATES_B.TAX_RATE_ID%TYPE,
270            p_tax_amt                       IN OUT NOCOPY ZX_LINES.TAX_AMT%TYPE,
271            p_taxable_amt                   IN OUT NOCOPY ZX_LINES.TAXABLE_AMT%TYPE,
272            p_orig_tax_amt                  IN OUT NOCOPY ZX_LINES.TAX_AMT%TYPE,
273            p_orig_taxable_amt              IN OUT NOCOPY ZX_LINES.TAXABLE_AMT%TYPE,
274            p_orig_tax_amt_tax_curr         IN OUT NOCOPY ZX_LINES.TAX_AMT%TYPE,
275            p_orig_taxable_amt_tax_curr     IN OUT NOCOPY ZX_LINES.TAXABLE_AMT%TYPE,
276            p_cal_tax_amt                   IN OUT NOCOPY ZX_LINES.CAL_TAX_AMT%TYPE,
277            p_tax_amt_tax_curr              IN OUT NOCOPY ZX_LINES.TAX_AMT_TAX_CURR%TYPE,
278            p_taxable_amt_tax_curr             OUT NOCOPY ZX_LINES.TAXABLE_AMT_TAX_CURR%TYPE,
279            p_cal_tax_amt_tax_curr             OUT NOCOPY ZX_LINES.CAL_TAX_AMT_TAX_CURR%TYPE,
280            p_tax_amt_funcl_curr               OUT NOCOPY ZX_LINES.TAX_AMT_FUNCL_CURR%TYPE,
281            p_taxable_amt_funcl_curr           OUT NOCOPY ZX_LINES.TAXABLE_AMT_FUNCL_CURR%TYPE,
282            p_cal_tax_amt_funcl_curr           OUT NOCOPY ZX_LINES.CAL_TAX_AMT_FUNCL_CURR%TYPE,
283            p_trx_currency_code             IN            ZX_LINES.TRX_CURRENCY_CODE%TYPE,
284            p_tax_currency_code                OUT NOCOPY ZX_LINES.TAX_CURRENCY_CODE%TYPE,
285            p_tax_currency_conversion_type  IN            ZX_LINES.TAX_CURRENCY_CONVERSION_TYPE%TYPE,
286            p_tax_currency_conversion_rate  IN OUT NOCOPY ZX_LINES.TAX_CURRENCY_CONVERSION_RATE%TYPE,
287            p_tax_currency_conversion_date  IN            ZX_LINES.TAX_CURRENCY_CONVERSION_DATE%TYPE,
288            p_currency_conversion_type      IN            ZX_LINES.CURRENCY_CONVERSION_TYPE%TYPE,
289            p_currency_conversion_rate      IN            ZX_LINES.CURRENCY_CONVERSION_RATE%TYPE,
290            p_currency_conversion_date      IN            ZX_LINES.CURRENCY_CONVERSION_DATE%TYPE,
291            p_Rounding_Rule_Code            IN            ZX_LINES.Rounding_Rule_Code%TYPE,
292            p_ledger_id                     IN            ZX_LINES.LEDGER_ID%TYPE,
293            p_min_acct_unit                 IN OUT NOCOPY ZX_LINES.MINIMUM_ACCOUNTABLE_UNIT%TYPE,
294            p_precision                     IN OUT NOCOPY ZX_LINES.PRECISION%TYPE,
295            p_application_id                IN            ZX_LINES.APPLICATION_ID%TYPE,
296            p_internal_organization_id      IN            ZX_LINES.INTERNAL_ORGANIZATION_ID%TYPE,
297            p_event_class_mapping_id        IN            ZX_LINES_DET_FACTORS.EVENT_CLASS_MAPPING_ID%TYPE,
298            p_tax_calculation_formula       IN            ZX_LINES.TAX_CALCULATION_FORMULA%TYPE,
299            p_tax_rate                      IN            ZX_LINES.TAX_RATE%TYPE,
300            p_prd_total_tax_amt             IN OUT NOCOPY ZX_LINES.PRD_TOTAL_TAX_AMT%TYPE,
301            p_prd_total_tax_amt_tax_curr       OUT NOCOPY ZX_LINES.PRD_TOTAL_TAX_AMT_TAX_CURR%TYPE,
302            p_prd_total_tax_amt_funcl_curr     OUT NOCOPY ZX_LINES.PRD_TOTAL_TAX_AMT_FUNCL_CURR%TYPE,
303            p_unrounded_taxable_amt         IN ZX_LINES.UNROUNDED_TAXABLE_AMT%TYPE,
304            p_unrounded_tax_amt             IN ZX_LINES.UNROUNDED_TAX_AMT%TYPE,
305            p_mrc_tax_line_flag             IN zx_lines.mrc_tax_line_flag%TYPE,
306            p_tax_provider_id               IN zx_lines.tax_provider_id%TYPE,
307            --p_quote_flag                    IN VARCHAR2,
308            p_return_status                    OUT NOCOPY VARCHAR2,
309            p_error_buffer                     OUT NOCOPY VARCHAR2
310          );
311 
312 PROCEDURE update_header_rounding_curr(
313            p_tax_line_id              IN            ZX_LINES.TAX_LINE_ID%TYPE,
314            p_unrounded_tax_amt        IN            ZX_LINES.UNROUNDED_TAX_AMT%TYPE,
315            p_tax_amt_curr             IN            ZX_LINES.TAX_AMT_FUNCL_CURR%TYPE,
316            p_taxable_amt_curr         IN            ZX_LINES.TAXABLE_AMT_FUNCL_CURR%TYPE,
317            p_currency_conversion_rate IN            ZX_LINES.CURRENCY_CONVERSION_RATE%TYPE,
318            p_prev_hdr_grp_rec         IN OUT NOCOPY HDR_GRP_REC_TYPE,
319            p_curr_hdr_grp_rec         IN            HDR_GRP_REC_TYPE,
320            p_same_tax                 IN            VARCHAR2,
321            p_ledger_id                IN            ZX_LINES.LEDGER_ID%TYPE,
322            p_return_status               OUT NOCOPY VARCHAR2,
323            p_error_buffer                OUT NOCOPY VARCHAR2
324          );
325 
326 PROCEDURE update_header_rounding_info(
327            p_tax_line_id              IN            ZX_LINES.TAX_LINE_ID%TYPE,
328            p_tax_id                   IN            ZX_TAXES_B.TAX_ID%TYPE,
329            p_Rounding_Rule_Code       IN            ZX_LINES.Rounding_Rule_Code%TYPE,
330            p_min_acct_unit            IN            ZX_LINES.MINIMUM_ACCOUNTABLE_UNIT%TYPE,
331            p_precision                IN            ZX_LINES.PRECISION%TYPE,
332            p_unrounded_tax_amt        IN            ZX_LINES.UNROUNDED_TAX_AMT%TYPE,
333            p_tax_amt                  IN            ZX_LINES.TAX_AMT%TYPE,
334            p_tax_amt_tax_curr         IN            ZX_LINES.TAX_AMT_TAX_CURR%TYPE,
335            p_tax_amt_funcl_curr       IN            ZX_LINES.TAX_AMT_FUNCL_CURR%TYPE,
336            p_taxable_amt_tax_curr     IN            ZX_LINES.TAXABLE_AMT_TAX_CURR%TYPE,
337            p_taxable_amt_funcl_curr   IN            ZX_LINES.TAXABLE_AMT_FUNCL_CURR%TYPE,
338            p_tax_curr_conv_rate       IN            ZX_LINES.TAX_CURRENCY_CONVERSION_RATE%TYPE,
339            p_currency_conversion_rate IN            ZX_LINES.CURRENCY_CONVERSION_RATE%TYPE,
340            p_prev_hdr_grp_rec         IN OUT NOCOPY HDR_GRP_REC_TYPE,
341            p_curr_hdr_grp_rec         IN            HDR_GRP_REC_TYPE,
342            p_same_tax                 IN            VARCHAR2,
343            p_sum_unrnd_tax_amt        IN            NUMBER,
344            p_sum_rnd_tax_amt          IN            NUMBER,
345            p_sum_rnd_tax_curr         IN            NUMBER,
346            p_sum_rnd_funcl_curr       IN            NUMBER,
347            p_ledger_id                IN            ZX_LINES.LEDGER_ID%TYPE,
348            p_return_status               OUT NOCOPY VARCHAR2,
349            p_error_buffer                OUT NOCOPY VARCHAR2
350          );
351 
352 PROCEDURE process_tax_line_create(
353             p_sum_unrnd_tax_amt     OUT NOCOPY NUMBER,
354             p_sum_rnd_tax_amt       OUT NOCOPY NUMBER,
355             p_sum_rnd_tax_curr       OUT NOCOPY NUMBER,
356             p_sum_rnd_funcl_curr    OUT NOCOPY NUMBER,
357             p_return_status         OUT NOCOPY VARCHAR2,
358             p_error_buffer          OUT NOCOPY VARCHAR2
359          );
360 
361 PROCEDURE process_tax_line_upd_override(
362            p_curr_hdr_grp_rec        IN            HDR_GRP_REC_TYPE,
363            p_sum_unrnd_tax_amt          OUT NOCOPY NUMBER,
364            p_sum_rnd_tax_amt            OUT NOCOPY NUMBER,
365            p_sum_rnd_tax_curr            OUT NOCOPY NUMBER,
366            p_sum_rnd_funcl_curr         OUT NOCOPY NUMBER,
367            p_event_class_rec         IN            ZX_API_PUB.EVENT_CLASS_REC_TYPE,
368            p_return_status              OUT NOCOPY VARCHAR2,
369            p_error_buffer               OUT NOCOPY VARCHAR2
370          );
371 
372 PROCEDURE handle_header_rounding_curr(
373            p_tax_line_id              IN            ZX_LINES.TAX_LINE_ID%TYPE,
374            p_unrounded_tax_amt        IN            ZX_LINES.UNROUNDED_TAX_AMT%TYPE,
375            p_tax_amt_curr             IN            ZX_LINES.TAX_AMT_FUNCL_CURR%TYPE,
376            p_taxable_amt_curr         IN            ZX_LINES.TAXABLE_AMT_FUNCL_CURR%TYPE,
377            p_currency_conversion_rate IN            ZX_LINES.CURRENCY_CONVERSION_RATE%TYPE,
378            p_prev_hdr_grp_rec         IN OUT NOCOPY HDR_GRP_REC_TYPE,
379            p_curr_hdr_grp_rec         IN            HDR_GRP_REC_TYPE,
380            p_ledger_id                IN            ZX_LINES.LEDGER_ID%TYPE,
381            p_return_status               OUT NOCOPY VARCHAR2,
382            p_error_buffer                OUT NOCOPY VARCHAR2
383          );
384 
385 PROCEDURE adjust_rounding_diff_curr(
386             p_return_status                 OUT NOCOPY VARCHAR2,
387             p_error_buffer                  OUT NOCOPY VARCHAR2
388          );
389 
390 PROCEDURE adjust_rounding_diff(
391             p_return_status                 OUT NOCOPY VARCHAR2,
392             p_error_buffer                  OUT NOCOPY VARCHAR2
393          );
394 
395 PROCEDURE  chk_mandatory_col_after_round(
396              p_trx_currency_code    IN            ZX_LINES.TRX_CURRENCY_CODE%TYPE,
397              p_tax_currency_code    IN            ZX_LINES.TAX_CURRENCY_CODE%TYPE,
398              p_tax_amt              IN            ZX_LINES.TAX_AMT%TYPE,
399              p_tax_amt_tax_curr     IN            ZX_LINES.TAX_AMT_TAX_CURR%TYPE,
400              p_taxable_amt          IN            ZX_LINES.TAXABLE_AMT%TYPE,
401              p_taxable_amt_tax_curr IN            ZX_LINES.TAXABLE_AMT_TAX_CURR%TYPE,
402              p_mrc_tax_line_flag    IN            zx_lines.mrc_tax_line_flag%TYPE,
403              p_rate_type_code       IN            ZX_RATES_B.RATE_TYPE_CODE%TYPE,
404              p_return_status           OUT NOCOPY VARCHAR2,
405              p_error_buffer            OUT NOCOPY VARCHAR2
406          );
407 
408 PROCEDURE  update_detail_tax_lines_gt(
409              p_min_acct_unit_tbl                IN MIN_ACCT_UNIT_TBL,
410              p_precision_tbl                    IN PRECISION_TBL,
411              p_tax_currency_code_tbl            IN TAX_CURRENCY_CODE_TBL,
412              p_tax_curr_conv_rate_tbl           IN TAX_CURR_CONV_RATE_TBL,
413              p_tax_amt_tbl                      IN TAX_AMT_TBL,
414              p_taxable_amt_tbl                  IN TAXABLE_AMT_TBL,
415              p_tax_amt_tax_curr_tbl             IN TAX_AMT_TAX_CURR_TBL,
416              p_taxable_amt_tax_curr_tbl         IN  TAXABLE_AMT_TAX_CURR_TBL,
417              p_tax_amt_funcl_curr_tbl           IN TAX_AMT_FUNCL_CURR_TBL,
418              p_taxable_amt_funcl_curr_tbl       IN TAXABLE_AMT_FUNCL_CURR_TBL,
419              p_prd_total_tax_amt_tbl            IN PRD_TOTAL_TAX_AMT_TBL,
420              p_prd_tot_tax_amt_tax_curr_tbl     IN PRD_TOTAL_TAX_AMT_TAX_CURR_TBL,
421              p_prd_tot_tax_amt_fcl_curr_tbl     IN PRD_TOTAL_TAX_AMT_FCL_CURR_TBL,
422              p_cal_tax_amt_funcl_curr_tbl       IN CAL_TAX_AMT_FUNCL_CURR_TBL,
423              p_orig_tax_amt_tax_curr_tbl        IN TAX_AMT_TBL,
424              p_orig_taxable_amt_tax_cur_tbl     IN TAXABLE_AMT_TBL,
425              p_tax_line_id_tbl                  IN TAX_LINE_ID_TBL,
426              p_return_status                    OUT NOCOPY VARCHAR2,
427              p_error_buffer                     OUT NOCOPY VARCHAR2
428          );
429 
430 PROCEDURE  update_zx_lines(
431                 p_conversion_rate            IN            NUMBER,
432                 p_conversion_type            IN            VARCHAR2,
433                 p_conversion_date            IN            DATE,
434                 p_tax_amt_funcl_curr_tbl     IN            TAX_AMT_FUNCL_CURR_TBL,
435                 p_taxable_amt_funcl_curr_tbl IN            TAXABLE_AMT_FUNCL_CURR_TBL,
436                 p_cal_tax_amt_funcl_curr_tbl IN            CAL_TAX_AMT_FUNCL_CURR_TBL,
437                 p_tax_line_id_tbl            IN            TAX_LINE_ID_TBL,
438                 p_return_status                 OUT NOCOPY VARCHAR2,
439                 p_error_buffer                  OUT NOCOPY VARCHAR2
440          );
441 
442 PROCEDURE convert_and_round_for_curr(
443             p_curr_conv_rate          IN            ZX_LINES.CURRENCY_CONVERSION_RATE%TYPE,
444             p_rounded_tax_amt         IN            ZX_LINES.TAX_AMT%TYPE,
445             p_rounded_taxable_amt     IN            ZX_LINES.TAXABLE_AMT%TYPE,
446             p_unrounded_tax_amt       IN            ZX_LINES.TAX_AMT%TYPE,
447             p_unrounded_taxable_amt   IN            ZX_LINES.TAXABLE_AMT%TYPE,
448             p_conv_rnd_tax_amt_curr      OUT NOCOPY ZX_LINES.TAX_AMT_TAX_CURR%TYPE,
449             p_conv_rnd_taxable_amt_curr  OUT NOCOPY ZX_LINES.TAXABLE_AMT_TAX_CURR%TYPE,
450             p_ledger_id               IN            ZX_LINES.LEDGER_ID%TYPE,
451             p_tax_calculation_formula IN            ZX_LINES.TAX_CALCULATION_FORMULA%TYPE,
452             p_tax_rate                IN            ZX_LINES.TAX_RATE%TYPE,
453             p_tax_rate_id             IN            ZX_RATES_B.TAX_RATE_ID%TYPE,
454             p_return_status              OUT NOCOPY VARCHAR2,
455             p_error_buffer               OUT NOCOPY VARCHAR2
456          );
457 
458 PROCEDURE convert_and_round_lin_lvl_curr(
459            p_conversion_rate  IN            NUMBER,
460            p_conversion_type  IN            VARCHAR2,
461            p_conversion_date  IN            DATE,
462            p_event_class_rec  IN            ZX_API_PUB.EVENT_CLASS_REC_TYPE,
463            p_return_status       OUT NOCOPY VARCHAR2,
464            p_error_buffer        OUT NOCOPY VARCHAR2
465          );
466 
467 PROCEDURE convert_and_round_hdr_lvl_curr(
468            p_conversion_rate  IN            NUMBER,
469            p_conversion_type  IN            VARCHAR2,
470            p_conversion_date  IN            DATE,
471            p_event_class_rec  IN            ZX_API_PUB.EVENT_CLASS_REC_TYPE,
472            p_return_status       OUT NOCOPY VARCHAR2,
473            p_error_buffer        OUT NOCOPY VARCHAR2
474          );
475 
476 PROCEDURE get_round_level_ptp_id(
477             p_Party_Type_Code      IN     VARCHAR2,
478             p_event_class_rec      IN     ZX_API_PUB.EVENT_CLASS_REC_TYPE,
479             p_tax_prof_id             OUT NOCOPY ZX_PARTY_TAX_PROFILE.PARTY_TAX_PROFILE_ID%TYPE,
480             p_return_status           OUT NOCOPY  VARCHAR2,
481             p_error_buffer            OUT NOCOPY  VARCHAR2
482            );
483 
484 -----------------------------------------------------------------------
485 
486   -- PRIVATE FUNCTION convert_amount
487   --
488   --  DESCRIPTION
489   --    Returns the amount converted from the from currency into the
490   --    to currency for a given conversion date and conversion type.
491   --    Conversion rate is then stored in the cache structure
492   --
493 FUNCTION convert_amount (
494                 p_from_currency         IN  VARCHAR2,
495                 p_to_currency           IN  VARCHAR2,
496                 p_conversion_date       IN  DATE,
497                 p_tax_conversion_type   IN  VARCHAR2,
498                 p_trx_conversion_type   IN  VARCHAR2,
499                 p_amount                IN  NUMBER,
500                 p_rate_index            IN  BINARY_INTEGER,
501                 p_return_status         OUT NOCOPY  VARCHAR2,
502                 p_error_buffer          OUT NOCOPY  VARCHAR2,
503                 p_trx_conversion_date   IN  DATE DEFAULT NULL ) RETURN NUMBER IS --Bug7183884
504 
505     l_to_type                     VARCHAR2(30);
506     l_from_type                   VARCHAR2(30);
507     l_to_rate                     NUMBER;
508     l_from_rate                   NUMBER;
509     l_other_rate                  NUMBER;
510     l_rate_index                  BINARY_INTEGER;
511     l_converted_amount            NUMBER;
512 BEGIN
513 
514   IF (g_level_statement >= g_current_runtime_level ) THEN
515     FND_LOG.STRING(g_level_statement,
516                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.convert_amount.BEGIN',
517                    'ZX_TDS_TAX_ROUNDING_PKG: convert_amount(+)');
518     FND_LOG.STRING(g_level_statement,
519                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.convert_amount',
520                    'p_from_currency = ' || p_from_currency||
521                    'p_to_currency = ' || p_to_currency||
522                    'p_conversion_date = ' ||
523                     to_char(p_conversion_date, 'DD-MON-YY')||
524                    'p_tax_conversion_type = ' || p_tax_conversion_type||
525                    'p_trx_conversion_type = ' || p_trx_conversion_type);
526   END IF;
527 
528   p_return_status :=  FND_API.G_RET_STS_SUCCESS;
529 
530    -- Check if both currencies are identical
531    IF ( p_from_currency = p_to_currency ) THEN
532       g_tax_curr_conv_rate_tbl(p_rate_index) :=  1;
533       RETURN( p_amount );
534    END IF;
535 
536    -- Get currency information from the from_currency
537 
538    -- Bug#6865855: check cache structure before access
539    IF g_currency_tbl.EXISTS(p_from_currency) THEN
540      l_from_type := g_currency_tbl(p_from_currency).currency_type;
541      l_from_rate := g_currency_tbl(p_from_currency).conversion_rate;
542    ELSE
543      -- not exist in cache, need to populate it
544      get_currency_info_for_rounding(
545             p_from_currency,
546             p_conversion_date,
547             p_return_status,
548             p_error_buffer);
549      IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
550        RETURN NULL;
551      END IF;
552 
553      l_from_type := g_currency_tbl(p_from_currency).currency_type;
554      l_from_rate := g_currency_tbl(p_from_currency).conversion_rate;
555    END IF;
556 
557    -- Get currency information from the to_currency
558 
559    -- Bug#6865855: check cache structure before access
560    IF g_currency_tbl.EXISTS(p_to_currency) THEN
561      l_to_type := g_currency_tbl(p_to_currency).currency_type;
562      l_to_rate := g_currency_tbl(p_to_currency).conversion_rate;
563    ELSE
564      -- not exist in cache, need to populate it
565      get_currency_info_for_rounding(
566             p_to_currency,
567             p_conversion_date,
568             p_return_status,
569             p_error_buffer);
570      IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
571        RETURN NULL;
572      END IF;
573 
574      l_to_type := g_currency_tbl(p_to_currency).currency_type;
575      l_to_rate := g_currency_tbl(p_to_currency).conversion_rate;
576    END IF;
577 
578 
579    -- Calculate the conversion rate according to both currency types
580 
581    IF ( l_from_type = 'EMU' ) THEN
582      IF ( l_to_type = 'EMU' ) THEN
583        l_converted_amount := ( p_amount / l_from_rate ) * l_to_rate;
584        g_tax_curr_conv_rate_tbl(p_rate_index) :=  l_to_rate/l_from_rate;
585 
586      ELSIF ( l_to_type = 'EURO' ) THEN
587        l_converted_amount := p_amount / l_from_rate;
588        g_tax_curr_conv_rate_tbl(p_rate_index) := 1/l_from_rate;
589 
590      ELSIF ( l_to_type = 'OTHER' ) THEN
591        -- Find out conversion rate from EURO to p_to_currency
592        IF g_euro_code IS NULL THEN
593          g_euro_code := get_euro_code(p_return_status,
594                                       p_error_buffer );
595        END IF;
596        IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
597          RETURN NULL;
598        END IF;
599 
600        l_other_rate := get_other_rate(
601                          g_euro_code,
602                          p_to_currency,
603                          p_conversion_date,
604                          p_tax_conversion_type,
605                          p_trx_conversion_type,
606                          p_return_status,
607                          p_error_buffer,
608                          p_trx_conversion_date); --Bug7183884
609 
610        IF p_return_status =  FND_API.G_RET_STS_SUCCESS THEN
611          -- Get conversion amt by converting EMU -> EURO -> OTHER
612          l_converted_amount := ( p_amount / l_from_rate ) * l_other_rate;
613          g_tax_curr_conv_rate_tbl(p_rate_index) := l_other_rate /l_from_rate;
614        END IF;
615      END IF;
616 
617      ELSIF ( l_from_type = 'EURO' ) THEN
618        IF ( l_to_type = 'EMU' ) THEN
619          l_converted_amount := p_amount * l_to_rate;
620          g_tax_curr_conv_rate_tbl(p_rate_index) := l_to_rate;
621 
622        ELSIF ( l_to_type = 'EURO' ) THEN
623           -- We should never comes to this case as it should be
624           -- caught when we check if both to and from currency
625           -- is the same at the beginning of this function
626           l_converted_amount := p_amount;
627           g_tax_curr_conv_rate_tbl(p_rate_index) := 1;
628 
629        ELSIF ( l_to_type = 'OTHER' ) THEN
630           l_other_rate := get_other_rate(
631                             p_from_currency,
632                             p_to_currency,
633                             p_conversion_date,
634                             p_tax_conversion_type,
635                             p_trx_conversion_type,
636                             p_return_status,
637                             p_error_buffer,
638                             p_trx_conversion_date);--Bug7183884
639           IF p_return_status = FND_API.G_RET_STS_SUCCESS THEN
640             l_converted_amount := p_amount * l_other_rate;
641             g_tax_curr_conv_rate_tbl(p_rate_index) := l_other_rate;
642           END IF;
643         END IF;
644 
645      ELSIF ( l_from_type = 'OTHER' ) THEN
646        IF ( l_to_type = 'EMU' ) THEN
647          -- Find out conversion rate from x_from_currency to EURO
648          IF g_euro_code IS NULL THEN
649            g_euro_code  := get_euro_code(p_return_status,
650                                          p_error_buffer );
651          END IF;
652 
653          IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
654            RETURN NULL;
655          END IF;
656          l_other_rate := get_other_rate(
657                            p_from_currency,
658                            g_euro_code,
659                            p_conversion_date,
660                            p_tax_conversion_type,
661                            p_trx_conversion_type,
662                            p_return_status,
663                            p_error_buffer,
664                            p_trx_conversion_date);--Bug7183884
665 
666 
667          IF p_return_status = FND_API.G_RET_STS_SUCCESS THEN
668            -- Get conversion amt by converting OTHER -> EURO -> EMU
669            l_converted_amount := ( p_amount * l_other_rate ) * l_to_rate;
670            g_tax_curr_conv_rate_tbl(p_rate_index) := l_other_rate * l_to_rate;
671          END IF;
672        ELSIF ( l_to_type = 'EURO' ) THEN
673           l_other_rate := get_other_rate(
674                             p_from_currency,
675                             p_to_currency,
676                             p_conversion_date,
677                             p_tax_conversion_type,
678                             p_trx_conversion_type,
679                             p_return_status,
680                             p_error_buffer,
681                             p_trx_conversion_date);--Bug7183884
682 
683 
684           IF p_return_status = FND_API.G_RET_STS_SUCCESS THEN
685             l_converted_amount := p_amount * l_other_rate;
686             g_tax_curr_conv_rate_tbl(p_rate_index) :=  l_other_rate;
687           END IF;
688        ELSIF ( l_to_type = 'OTHER' ) THEN
689           l_other_rate := get_other_rate(
690                             p_from_currency,
691                             p_to_currency,
692                             p_conversion_date,
693                             p_tax_conversion_type,
694                             p_trx_conversion_type,
695                             p_return_status,
696                             p_error_buffer ,
697                             p_trx_conversion_date);--Bug7183884
698 
699 
700           IF p_return_status = FND_API.G_RET_STS_SUCCESS THEN
701             l_converted_amount := p_amount * l_other_rate;
702             g_tax_curr_conv_rate_tbl(p_rate_index) :=  l_other_rate;
703           END IF;
704         END IF;
705      END IF;
706 
707      IF (g_level_statement >= g_current_runtime_level ) THEN
708 
709        FND_LOG.STRING(g_level_statement,
710                       'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.convert_amount.END',
711                       'converted amount = '||l_converted_amount);
712        FND_LOG.STRING(g_level_statement,
713                       'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.convert_amount.END',
714                       'ZX_TDS_TAX_ROUNDING_PKG: convert_amount(-)'||p_return_status);
715      END IF;
716 
717      RETURN l_converted_amount;
718 
719 EXCEPTION
720   WHEN OTHERS THEN
721     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
722     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
723 
724     IF (g_level_unexpected >= g_current_runtime_level ) THEN
725       FND_LOG.STRING(g_level_unexpected,
726                      'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.convert_amount',
727                       p_error_buffer);
728     END IF;
729 
730 END convert_amount;
731 
732 ----------------------------------------------------------------------------
733 -- PRIVATE FUNCTION
734 --  get_rate_index
735 --
736 --  DESCRIPTION
737 --    returns the hash table index from a currency conversion rate structure
738 --
739 FUNCTION get_rate_index(
740                 p_from_currency   IN     VARCHAR2,
741                 p_to_currency     IN     VARCHAR2,
742                 p_conversion_date IN     Date,
743                 p_conversion_type IN     VARCHAR2)
744 RETURN BINARY_INTEGER IS
745   l_tbl_index      BINARY_INTEGER;
746 
747 BEGIN
748 
749   IF (g_level_statement >= g_current_runtime_level ) THEN
750     FND_LOG.STRING(g_level_statement,
751                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.get_rate_index.BEGIN',
752                    'ZX_TDS_TAX_ROUNDING_PKG: get_rate_index(+)');
753   END IF;
754 
755   l_tbl_index := dbms_utility.get_hash_value(
756                     p_from_currency||
757                     p_to_currency||
758                     to_char(p_conversion_date, 'DD-MON-YY') ||
759                     p_conversion_type,
760                     1,
761                     8192);
762 
763 
764   IF (g_level_statement >= g_current_runtime_level ) THEN
765     FND_LOG.STRING(g_level_statement,
766                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.get_rate_index',
767                    'rate index = ' || to_char(l_tbl_index));
768     FND_LOG.STRING(g_level_statement,
769                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.get_rate_index.END',
770                    'ZX_TDS_TAX_ROUNDING_PKG: get_rate_index(-)');
771   END IF;
772 
773   RETURN l_tbl_index;
774 
775 EXCEPTION
776   WHEN OTHERS THEN
777 
778     IF (g_level_unexpected >= g_current_runtime_level ) THEN
779       FND_LOG.STRING(g_level_unexpected,
780                      'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.get_rate_index',
781                       sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80));
782     END IF;
783     RAISE;
784 END get_rate_index;
785 ----------------------------------------------------------------------------
786 --  PRIVATE PROCEDURE
787 --   get_currency_info
788 --
789 --  DESCRIPTION
790 --    Gets currency type and rounding information for a given currency.
791 --
792 --
793 PROCEDURE get_currency_info(
794                 p_currency              IN      VARCHAR2,
795                 p_eff_date              IN      DATE,
796                 p_derive_effective         OUT NOCOPY  DATE,
797                 p_derive_type              OUT NOCOPY  VARCHAR2,
798                 p_conversion_rate          OUT NOCOPY  NUMBER,
799                 p_mau                      OUT NOCOPY  NUMBER,
800                 p_precision                OUT NOCOPY  NUMBER,
801                 p_currency_type            OUT NOCOPY  VARCHAR2,
802                 p_return_status            OUT NOCOPY  VARCHAR2,
803                 p_error_buffer             OUT NOCOPY  VARCHAR2 ) IS
804 
805 ----added for Bug 7519288
806 cursor getCurrencyInfo(c_currency varchar2) is
807  SELECT decode( derive_type,
808                     'EURO', 'EURO',
809                     'EMU', decode( sign( trunc(p_eff_date) -
810                                          trunc(derive_effective)),
811                                    -1, 'OTHER',
812                                    'EMU'),
813                     'OTHER' ),
814             decode( derive_type, 'EURO', 1,
815                                  'EMU', derive_factor,
816                                  'OTHER', -1 ),
817             derive_type,
818             derive_effective,
819             minimum_accountable_unit,
820             precision
821      FROM   FND_CURRENCIES
822      WHERE  currency_code = c_currency;
823 
824 BEGIN
825 
826   IF (g_level_statement >= g_current_runtime_level ) THEN
827     FND_LOG.STRING(g_level_statement,
828                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.get_currency_info.BEGIN',
829                    'ZX_TDS_TAX_ROUNDING_PKG: get_currency_info(+)'||
830                    'p_currency = ' || p_currency||
831                    'p_eff_date = ' || to_char(p_eff_date, 'DD-MON-YY'));
832   END IF;
833 
834   p_return_status :=  FND_API.G_RET_STS_SUCCESS;
835 
836      -- Get currency information from FND_CURRENCIES table
837 --Commented for Bug 7519288
838 /*     SELECT decode( derive_type,
839                     'EURO', 'EURO',
840                     'EMU', decode( sign( trunc(p_eff_date) -
841                                          trunc(derive_effective)),
842                                    -1, 'OTHER',
843                                    'EMU'),
844                     'OTHER' ),
845             decode( derive_type, 'EURO', 1,
846                                  'EMU', derive_factor,
847                                  'OTHER', -1 ),
848             derive_type,
849             derive_effective,
850             minimum_accountable_unit,
851             precision
852      INTO   p_currency_type,
853             p_conversion_rate,
854             p_derive_type,
855             p_derive_effective,
856             p_mau,
857             p_precision
858      FROM   FND_CURRENCIES
859      WHERE  currency_code = p_currency;*/
860 
861    Open getCurrencyInfo(p_currency);
862    Fetch getCurrencyInfo
863      INTO   p_currency_type,
864             p_conversion_rate,
865             p_derive_type,
866             p_derive_effective,
867             p_mau,
868             p_precision;
869 
870       if getCurrencyInfo%notfound then
871 
872          IF (g_level_statement >= g_current_runtime_level ) THEN
873             FND_LOG.STRING(g_level_statement,
874                          'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.get_currency_info',
875                          'No currency info found for : ' ||p_currency);
876          END IF;
877 
878        end if;
879 
880    Close getCurrencyInfo;
881 
882   IF (g_level_statement >= g_current_runtime_level ) THEN
883     FND_LOG.STRING(g_level_statement,
884                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.get_currency_info',
885                    'p_currency_type = ' || p_currency_type||
886                    'p_derive_type = ' || p_derive_type||
887                    'p_derive_effective = ' ||
888                     to_char(p_derive_effective, 'DD-MON-YY')||
889                    'p_conversion_rate = ' || to_char(p_conversion_rate)||
890                    'p_mau = ' || to_char(p_mau)||
891                    'p_precision = ' || to_char(p_precision));
892     FND_LOG.STRING(g_level_statement,
893                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.get_currency_info.END',
894                    'ZX_TDS_TAX_ROUNDING_PKG: get_currency_info(-)');
895   END IF;
896 
897   EXCEPTION
898     WHEN NO_DATA_FOUND THEN
899        p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
900        p_error_buffer  := 'Currency type and Currency rate not found in FND_CURRENCIES';
901        IF (g_level_unexpected >= g_current_runtime_level ) THEN
902          FND_LOG.STRING(g_level_unexpected,
903                         'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.get_currency_info',
904                          p_error_buffer);
905        END IF;
906 
907     WHEN OTHERS THEN
908       p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
909       p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
910 
911       IF (g_level_unexpected >= g_current_runtime_level ) THEN
912         FND_LOG.STRING(g_level_unexpected,
913                        'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.get_currency_info',
914                         p_error_buffer);
915       END IF;
916 
917 END get_currency_info;
918 ----------------------------------------------------------------------------
919 -- PRIVATE FUNCTION
920 --   get_other_rate
921 --
922 --  DESCRIPTION
923 --    Returns conversion rate between two currencies where both currencies
924 --    are not the EURO, or EMU currencies.
925 --
926 FUNCTION get_other_rate (
927                 p_from_currency       IN     VARCHAR2,
928                 p_to_currency         IN     VARCHAR2,
929                 p_conversion_date     IN     Date,
930                 p_tax_conversion_type IN     VARCHAR2,
931                 p_trx_conversion_type IN     VARCHAR2,
932                 p_return_status       OUT NOCOPY VARCHAR2,
933                 p_error_buffer        OUT NOCOPY VARCHAR2,
934                 p_trx_conversion_date IN  DATE DEFAULT NULL) RETURN NUMBER IS  --Bug7183884
935 
936    l_rate NUMBER;
937 
938   CURSOR get_rate_info_csr
939     (c_from_currency     ZX_LINES.trx_currency_code%TYPE,
940      c_to_currency       ZX_LINES.tax_currency_code%TYPE,
941      c_conversion_date   ZX_LINES.currency_conversion_date%TYPE,
942      c_conversion_type   ZX_LINES.currency_conversion_type%TYPE)
943   IS
944      SELECT     conversion_rate
945      FROM       GL_DAILY_RATES
946      WHERE      from_currency = c_from_currency
947      AND        to_currency = c_to_currency
948      AND        conversion_date = trunc(c_conversion_date)
949      AND        conversion_type = c_conversion_type;
950 BEGIN
951 
952   IF (g_level_statement >= g_current_runtime_level ) THEN
953     FND_LOG.STRING(g_level_statement,
954                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.get_other_rate.BEGIN',
955                    'ZX_TDS_TAX_ROUNDING_PKG: get_other_rate(+)'||
956                    'p_from_currency = ' || p_from_currency||
957                    'p_to_currency = ' || p_to_currency||
958                    'p_conversion_date = ' ||
959                       to_char(p_conversion_date, 'DD-MON-YY')||
960                    'P_trx_conversion_date = '||
961                       to_char(p_trx_conversion_date, 'DD-MON-YY')||
962                    'p_tax_conversion_type = ' || p_tax_conversion_type||
963                    'p_trx_conversion_type = ' || p_trx_conversion_type);
964   END IF;
965 
966   p_return_status :=  FND_API.G_RET_STS_SUCCESS;
967   l_rate := NULL;
968 
969   IF p_tax_conversion_type IS NOT NULL THEN
970     --
971     -- use tax exchange rate type 1st
972     --
973     OPEN get_rate_info_csr(
974               p_from_currency,
975               p_to_currency,
976               p_conversion_date,
977               p_tax_conversion_type);
978     FETCH get_rate_info_csr INTO l_rate;
979     IF get_rate_info_csr%NOTFOUND THEN
980       IF (g_level_statement >= g_current_runtime_level ) THEN
981           FND_LOG.STRING(g_level_statement,
982                          'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.get_other_rate',
983                          'No rate found for tax  conversion type: ' ||
984                          p_tax_conversion_type||
985                          ' p_conversion_date = ' ||
986                          to_char(p_conversion_date, 'DD-MON-YY'));
987       END IF;
988     END IF;
989 
990     CLOSE get_rate_info_csr;
991 
992   END IF; -- Tax Conversion Type ends
993 
994   IF l_rate IS NOT NULL THEN
995     IF (g_level_statement >= g_current_runtime_level ) THEN
996         FND_LOG.STRING(g_level_statement,
997                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.get_other_rate.END',
998                    'ZX_TDS_TAX_ROUNDING_PKG: get_other_rate(-)'||
999                        'rate = ' || to_char(l_rate));
1000     END IF;
1001     RETURN (l_rate);
1002   END IF;
1003 
1004   --
1005   -- get here either tax_conversion_type is null or
1006   -- l_rate is still NULL, try to get rate based on
1007   -- trx_conversion_type
1008   --
1009 
1010 
1011   OPEN get_rate_info_csr(
1012               p_from_currency,
1013               p_to_currency,
1014               p_conversion_date,
1015               p_trx_conversion_type);
1016   FETCH get_rate_info_csr INTO l_rate;
1017     IF get_rate_info_csr%NOTFOUND THEN
1018       IF (g_level_statement >= g_current_runtime_level ) THEN
1019           FND_LOG.STRING(g_level_statement,
1020                          'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.get_other_rate',
1021                          'No rate found for trx conversion type: ' ||
1022                          p_tax_conversion_type||
1023                          ' p_conversion_date = ' ||
1024                          to_char(p_conversion_date, 'DD-MON-YY'));
1025       END IF;
1026      END IF;
1027 
1028   CLOSE get_rate_info_csr;
1029 
1030 
1031 
1032   IF l_rate IS NOT NULL THEN
1033     IF (g_level_statement >= g_current_runtime_level ) THEN
1034         FND_LOG.STRING(g_level_statement,
1035                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.get_other_rate.END',
1036                    'ZX_TDS_TAX_ROUNDING_PKG: get_other_rate(-)'||
1037                        'rate = ' || to_char(l_rate));
1038     END IF;
1039     RETURN (l_rate);
1040   END IF;
1041 
1042   --Bug7183884
1043 
1044   IF p_trx_conversion_date IS NOT NULL THEN
1045 
1046      IF (g_level_statement >= g_current_runtime_level ) THEN
1047        FND_LOG.STRING(g_level_statement,
1048                     'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.get_other_rate',
1049                     'Getting Rate information based on Currency Converion Date '||
1050                     ' P_trx_conversion_date = '||
1051                               to_char(p_trx_conversion_date, 'DD-MON-YY'));
1052      END IF;
1053 
1054      IF p_tax_conversion_type IS NOT NULL THEN
1055 
1056         OPEN get_rate_info_csr(
1057                 p_from_currency,
1058                 p_to_currency,
1059                 p_trx_conversion_date,
1060                 p_tax_conversion_type);
1061        FETCH get_rate_info_csr INTO l_rate;
1062 
1063        IF get_rate_info_csr%NOTFOUND THEN
1064           IF (g_level_statement >= g_current_runtime_level ) THEN
1065              FND_LOG.STRING(g_level_statement,
1066                             'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.get_other_rate',
1067                              'No rate found for tax  conversion type: ' ||
1068                               p_tax_conversion_type||
1069                               ' P_trx_conversion_date = '||
1070                               to_char(p_trx_conversion_date, 'DD-MON-YY'));
1071          END IF;
1072        END IF;
1073 
1074        CLOSE get_rate_info_csr;
1075     END IF;
1076 
1077     IF l_rate IS NOT NULL THEN
1078       IF (g_level_statement >= g_current_runtime_level ) THEN
1079           FND_LOG.STRING(g_level_statement,
1080                      'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.get_other_rate.END',
1081                      'ZX_TDS_TAX_ROUNDING_PKG: get_other_rate(-)'||
1082                          'rate = ' || to_char(l_rate));
1083       END IF;
1084       RETURN (l_rate);
1085     END IF;
1086 
1087     OPEN get_rate_info_csr(
1088                p_from_currency,
1089                p_to_currency,
1090                p_trx_conversion_date,
1091                p_trx_conversion_type);
1092     FETCH get_rate_info_csr INTO l_rate;
1093     IF get_rate_info_csr%NOTFOUND THEN
1094        p_return_status := FND_API.G_RET_STS_ERROR;
1095 
1096        -- Conversion rate not found in GL_DAILY_RATES
1097        FND_MESSAGE.SET_NAME('ZX','ZX_ROUND_NO_EXCH_RATE');
1098        FND_MESSAGE.SET_TOKEN('FROM_CURRENCY', p_from_currency);
1099        FND_MESSAGE.SET_TOKEN('TO_CURRENCY', p_to_currency);
1100        FND_MESSAGE.SET_TOKEN('CURRENCY_CONV_DATE', p_conversion_date);
1101        FND_MESSAGE.SET_TOKEN('TRX_CURRENCY_CONV_DATE',p_trx_conversion_date);
1102        IF ZX_TDS_CALC_SERVICES_PUB_PKG.g_msg_context_info_rec.trx_id IS NOT NULL THEN
1103          ZX_API_PUB.add_msg(
1104            ZX_TDS_CALC_SERVICES_PUB_PKG.g_msg_context_info_rec);
1105        ELSE
1106          FND_MSG_PUB.Add;
1107        END IF;
1108 
1109        IF (g_level_error >= g_current_runtime_level ) THEN
1110          FND_LOG.STRING(g_level_error,
1111                         'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.get_other_rate',
1112                          p_error_buffer);
1113        END IF;
1114 
1115      END IF;
1116 
1117     CLOSE get_rate_info_csr;
1118 
1119   END IF;  --p_trx_conversion_date check ends
1120 
1121 
1122   IF (g_level_statement >= g_current_runtime_level ) THEN
1123         FND_LOG.STRING(g_level_statement,
1124                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.get_other_rate.END',
1125                    'ZX_TDS_TAX_ROUNDING_PKG: get_other_rate(-)'||
1126                        'rate = ' || to_char(l_rate));
1127   END IF;
1128 
1129   RETURN( l_rate );
1130 
1131 
1132   EXCEPTION
1133     WHEN OTHERS THEN
1134       p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1135       p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
1136 
1137       IF (g_level_unexpected >= g_current_runtime_level ) THEN
1138         FND_LOG.STRING(g_level_unexpected,
1139                        'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.get_other_rate',
1140                         p_error_buffer);
1141       END IF;
1142 
1143 END get_other_rate;
1144 --------------------------------------------------------------------
1145 -- PRIVATE FUNCTION
1146 --  get_euro_code
1147 --
1148 --  DESCRIPTION
1149 --  This function returns the euro code
1150 --
1151 FUNCTION get_euro_code(p_return_status OUT NOCOPY VARCHAR2,
1152                        p_error_buffer  OUT NOCOPY VARCHAR2)
1153  RETURN VARCHAR2 IS
1154     euro_code   VARCHAR2(15);
1155 
1156 BEGIN
1157 
1158   IF (g_level_statement >= g_current_runtime_level ) THEN
1159     FND_LOG.STRING(g_level_statement,
1160                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.get_euro_code.BEGIN',
1161                    'ZX_TDS_TAX_ROUNDING_PKG: get_euro_code(+)');
1162   END IF;
1163 
1164   p_return_status :=  FND_API.G_RET_STS_SUCCESS;
1165 
1166     -- Get currency code of the EURO currency
1167     SELECT      currency_code
1168     INTO        euro_code
1169     FROM        FND_CURRENCIES
1170     WHERE       derive_type = 'EURO';
1171 
1172 
1173   IF (g_level_statement >= g_current_runtime_level ) THEN
1174 
1175     FND_LOG.STRING(g_level_statement,
1176                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.get_euro_code.END',
1177                    'ZX_TDS_TAX_ROUNDING_PKG: get_euro_code(-)'||' euro_code = ' || euro_code);
1178   END IF;
1179 
1180   RETURN( euro_code );
1181 
1182   EXCEPTION
1183      WHEN NO_DATA_FOUND THEN
1184        p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1185        p_error_buffer  := 'EURO code not found in FND_CURRENCIES';
1186        FND_MESSAGE.SET_NAME('ZX','ZX_UNEXPECTED_ERROR');
1187        IF ZX_TDS_CALC_SERVICES_PUB_PKG.g_msg_context_info_rec.trx_id IS NOT NULL THEN
1188          ZX_API_PUB.add_msg(
1189           ZX_TDS_CALC_SERVICES_PUB_PKG.g_msg_context_info_rec);
1190        ELSE
1191          FND_MSG_PUB.Add;
1192        END IF;
1193 
1194        IF (g_level_unexpected >= g_current_runtime_level ) THEN
1195          FND_LOG.STRING(g_level_unexpected,
1196                         'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.get_euro_code',
1197                          p_error_buffer);
1198        END IF;
1199 
1200     WHEN OTHERS THEN
1201       p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1202       p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
1203 
1204       IF (g_level_unexpected >= g_current_runtime_level ) THEN
1205         FND_LOG.STRING(g_level_unexpected,
1206                        'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.get_euro_code',
1207                         p_error_buffer);
1208       END IF;
1209 
1210 END get_euro_code;
1211 
1212 -----------------------------------------------------------------------
1213 --  PUBLIC FUNCTION
1214 --  round_tax
1215 --
1216 --  DESCRIPTION
1217 --  The function is used to round an amount according to the
1218 --  rounding rules
1219 --
1220 
1221 FUNCTION round_tax(
1222            p_amount        IN     NUMBER,
1223            p_Rounding_Rule_Code IN     ZX_TAXES_B.Rounding_Rule_Code%TYPE,
1224            p_min_acct_unit IN     ZX_TAXES_B.MINIMUM_ACCOUNTABLE_UNIT%TYPE,
1225            p_precision     IN     ZX_TAXES_B.TAX_PRECISION%TYPE,
1226            p_return_status OUT NOCOPY VARCHAR2,
1227            p_error_buffer  OUT NOCOPY VARCHAR2
1228          )
1229 RETURN NUMBER IS
1230   l_rounded_amt     NUMBER;
1231 BEGIN
1232 
1233   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
1234 
1235   IF (g_level_procedure >= g_current_runtime_level ) THEN
1236     FND_LOG.STRING(g_level_procedure,
1237                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.round_tax.BEGIN',
1238                    'ZX_TDS_TAX_ROUNDING_PKG: round_tax(+)'||
1239                    'round rule = ' || p_Rounding_Rule_Code||
1240                    'p_min_acct_unit = ' || to_char(p_min_acct_unit)||
1241                    'p_precision = ' || to_char(p_precision));
1242   END IF;
1243 
1244   p_return_status :=  FND_API.G_RET_STS_SUCCESS;
1245 
1246   --
1247   -- check if all require info are available for rounding
1248   --
1249   IF (p_amount IS NULL OR
1250       (p_min_acct_unit IS NULL AND p_precision IS NULL)) THEN
1251 
1252     IF (g_level_statement >= g_current_runtime_level ) THEN
1253 
1254           FND_LOG.STRING(g_level_statement,
1255                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.round_tax.END',
1256                    'ZX_TDS_TAX_ROUNDING_PKG: round_tax(-)'||
1257                    'Not enough info to perform rounding '||
1258                    'Amount, Rounding rule, Mau, or Precison is NULL');
1259     END IF;
1260 
1261     RETURN p_amount;
1262   END IF;
1263   --
1264   -- round UP
1265   --
1266   IF p_Rounding_Rule_Code = 'UP' THEN
1267     IF p_min_acct_unit is NOT NULL THEN
1268       -- Use Minimum Accountable Unit
1269       l_rounded_amt := SIGN(p_amount) *
1270             (CEIL(ABS(p_amount)/p_min_acct_unit) * p_min_acct_unit);
1271      ELSE
1272        -- Use precision
1273       IF (p_amount = TRUNC(p_amount, p_precision)) THEN
1274         l_rounded_amt := p_amount;
1275       ELSE
1276         l_rounded_amt := ROUND(p_amount+(SIGN(p_amount) *
1277                          (POWER(10,(p_precision * (-1)))/2)), p_precision);
1278        END IF;
1279      END IF;
1280    --
1281    -- round DOWN
1282    --
1283   ELSIF p_Rounding_Rule_Code = 'DOWN' THEN
1284     IF p_min_acct_unit is NOT NULL THEN
1285       -- Use Minimum Accountable Unit
1286       -- currently in AR:
1287       -- l_rounded_amt := TRUNC(p_amount/p_min_acct_unit) * p_min_acct_unit);
1288       -- currently in AP:
1289       l_rounded_amt := SIGN(p_amount)*
1290                     (FLOOR(ABS(p_amount)/p_min_acct_unit) * p_min_acct_unit);
1291     ELSE
1292       -- Use precision
1293       l_rounded_amt := TRUNC(p_amount, p_precision);
1294     END IF;
1295   --
1296   -- round NEAREST
1297   --
1298   ELSIF (p_Rounding_Rule_Code = 'NEAREST' OR
1299          p_Rounding_Rule_Code IS NULL) THEN
1300     IF p_min_acct_unit is NOT NULL THEN
1301       -- Use Minimum Accountable Unit
1302       l_rounded_amt := ROUND(p_amount/p_min_acct_unit) * p_min_acct_unit;
1303     ELSE
1304       -- Use precision
1305       l_rounded_amt := ROUND(p_amount, p_precision);
1306     END IF;
1307   ELSE
1308     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1309     p_error_buffer  := 'Unknown Rounding Rule Code';
1310   END IF;
1311 
1312   IF (g_level_procedure >= g_current_runtime_level ) THEN
1313 
1314     FND_LOG.STRING(g_level_procedure,
1315                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.round_tax.END',
1316                    'ZX_TDS_TAX_ROUNDING_PKG: round_tax(-)'||p_return_status);
1317   END IF;
1318 
1319   RETURN l_rounded_amt;
1320 
1321 EXCEPTION
1322   WHEN ZERO_DIVIDE THEN
1323     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1324     p_error_buffer  := 'Minimum Accountable Unit can not be 0';
1325     FND_MESSAGE.SET_NAME('ZX','GENERIC_MESSAGE');
1326     FND_MESSAGE.SET_TOKEN('GENERIC_TEXT','round_tax- '|| p_error_buffer);
1327     FND_MSG_PUB.Add;
1328     IF (g_level_unexpected >= g_current_runtime_level ) THEN
1329          FND_LOG.STRING(g_level_unexpected,
1330                         'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.round_tax',
1331                          p_error_buffer);
1332     END IF;
1333 
1334     WHEN OTHERS THEN
1335       p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1336       p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
1337       IF (g_level_unexpected >= g_current_runtime_level ) THEN
1338         FND_LOG.STRING(g_level_unexpected,
1339                        'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.round_tax',
1340                         p_error_buffer);
1341       END IF;
1342 
1343 END round_tax;
1344 -----------------------------------------------------------------------
1345 --  PRIVATE PROCEDURE
1346 --  det_rounding_level_basis
1347 --
1348 --  DESCRIPTION
1349 --
1350 --  This procedure determines the rounding level basis
1351 --  based on the party type passed in
1352 --
1353 --
1354 
1355 PROCEDURE det_rounding_level_basis(
1356             p_Party_Type_Code      IN     VARCHAR2,
1357             p_rounding_level_basis    OUT NOCOPY  VARCHAR2,
1358             p_return_status           OUT NOCOPY  VARCHAR2,
1359             p_error_buffer            OUT NOCOPY  VARCHAR2
1360            )
1361 IS
1362 
1363 BEGIN
1364 
1365   IF (g_level_statement >= g_current_runtime_level ) THEN
1366     FND_LOG.STRING(g_level_statement,
1367                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.det_rounding_level_basis.BEGIN',
1368                    'ZX_TDS_TAX_ROUNDING_PKG: det_rounding_level_basis(+)'||
1369                    'Party_Type_Code = ' || p_Party_Type_Code);
1370   END IF;
1371 
1372   p_return_status :=  FND_API.G_RET_STS_SUCCESS;
1373 
1374   --
1375   -- determine the rounding party type
1376   --
1377   IF p_Party_Type_Code IN ('SHIP_TO_PTY',
1378                       'SHIP_FROM_PTY',
1379                       'BILL_TO_PTY',
1380                       'BILL_FROM_PTY') THEN
1381     p_rounding_level_basis := 'PARTY';
1382   ELSIF p_Party_Type_Code IN ('SHIP_TO_PTY_SITE',
1383                          'SHIP_FROM_PTY_SITE',
1384                          'BILL_TO_PTY_SITE',
1385                          'BILL_FROM_PTY_SITE') THEN
1386     p_rounding_level_basis := 'SITE';
1387   ELSE
1388     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1389     p_error_buffer  := 'Invalid Rounding Level Hierarchy';
1390 
1391     IF (g_level_statement >= g_current_runtime_level ) THEN
1392         FND_LOG.STRING(g_level_statement,
1393                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.det_rounding_level_basis.END',
1394                    'ZX_TDS_TAX_ROUNDING_PKG: det_rounding_level_basis(-)'||
1395                    'p_return_status = ' || p_return_status||
1396                    'p_error_buffer  = ' || p_error_buffer);
1397     END IF;
1398 
1399     RETURN;
1400   END IF;
1401 
1402   IF (g_level_statement >= g_current_runtime_level ) THEN
1403 
1404     FND_LOG.STRING(g_level_statement,
1405                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.det_rounding_level_basis.END',
1406                    'ZX_TDS_TAX_ROUNDING_PKG: det_rounding_level_basis(-)'||
1407                     'p_rounding_level_basis = ' || p_rounding_level_basis);
1408   END IF;
1409 
1410 EXCEPTION
1411   WHEN OTHERS THEN
1412     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1413     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
1414 
1415     IF (g_level_unexpected >= g_current_runtime_level ) THEN
1416       FND_LOG.STRING(g_level_unexpected,
1417                      'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.det_rounding_level_basis',
1418                       p_error_buffer);
1419     END IF;
1420 
1421 END det_rounding_level_basis;
1422 -----------------------------------------------------------------------
1423 --  PRIVATE PROCEDURE
1424 --  determine_round_level_and_rule
1425 --
1426 --  DESCRIPTION
1427 --
1428 --  This procedure determines the party_tax_profile_id used to get the
1429 --  rounding level code and rounding rule code from zx_party_tax_profile
1430 --
1431 PROCEDURE determine_round_level_and_rule(
1432             p_Party_Type_Code               IN VARCHAR2,
1433             p_event_class_rec               IN ZX_API_PUB.EVENT_CLASS_REC_TYPE,
1434             p_tax_prof_id                   OUT NOCOPY  ZX_PARTY_TAX_PROFILE.PARTY_TAX_PROFILE_ID%TYPE,
1435             p_rounding_level_code           OUT NOCOPY  ZX_PARTY_TAX_PROFILE.ROUNDING_LEVEL_CODE%TYPE,
1436             p_rounding_rule_code            OUT NOCOPY  ZX_PARTY_TAX_PROFILE.ROUNDING_RULE_CODE%TYPE,
1437             p_return_status                 OUT NOCOPY  VARCHAR2,
1438             p_error_buffer                  OUT NOCOPY  VARCHAR2,
1439             p_ship_third_pty_acct_id        IN NUMBER,
1440             p_bill_third_pty_acct_id        IN NUMBER,
1441             p_ship_third_pty_acct_site_id   IN NUMBER,
1442             p_bill_third_pty_acct_site_id   IN NUMBER,
1443             p_ship_to_cust_acct_st_use_id   IN NUMBER,
1444             p_bill_to_cust_acct_st_use_id   IN NUMBER,
1445             p_tax_determine_date            IN DATE
1446            )
1447 IS
1448   l_tax_prof_name                  VARCHAR(30);
1449   l_rounding_level_basis           VARCHAR(8);
1450   l_account_site_id        hz_cust_acct_sites_all.cust_acct_site_id%TYPE;
1451   l_site_use_id            hz_cust_site_uses_all.site_use_id%TYPE;
1452   l_account_id             hz_cust_accounts.cust_account_id%TYPE;
1453   l_parent_ptp_id          zx_party_tax_profile.party_tax_profile_id%TYPE;
1454   l_site_ptp_id            zx_party_tax_profile.party_tax_profile_id%TYPE;
1455   l_registration_rec       zx_tcm_control_pkg.zx_registration_info_rec;
1456   l_tax_service_type_code  zx_rules_b.service_type_code%TYPE;
1457   l_ret_record_level       VARCHAR2(30);
1458 
1459 
1460 BEGIN
1461 
1462   IF (g_level_procedure >= g_current_runtime_level ) THEN
1463     FND_LOG.STRING(g_level_procedure,
1464                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.determine_round_level_and_rule.BEGIN',
1465                    'ZX_TDS_TAX_ROUNDING_PKG: determine_round_level_and_rule(+)');
1466   END IF;
1467 
1468   p_return_status :=  FND_API.G_RET_STS_SUCCESS;
1469 
1470   --
1471   -- determine the rounding party type
1472   --
1473   det_rounding_level_basis(
1474            p_Party_Type_Code,
1475            l_rounding_level_basis,
1476            p_return_status,
1477            p_error_buffer);
1478 
1479   IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1480     RETURN;
1481   END IF;
1482 
1483   IF l_rounding_level_basis = 'PARTY' THEN
1484     l_tax_prof_name := 'RDNG' || '_'||p_Party_Type_Code ||'_'|| 'TX_PROF_ID';
1485   ELSE
1486     --
1487     -- party site
1488     --
1489     l_tax_prof_name := RTRIM(p_Party_Type_Code, 'SITE');
1490     l_tax_prof_name := 'RDNG' || '_' || l_tax_prof_name || 'TX_P_ST_ID';
1491   END IF;
1492   --
1493   -- get party/party_site tax_prof_id based on the name
1494   --
1495   IF l_tax_prof_name = 'RDNG_SHIP_TO_PTY_TX_PROF_ID' THEN
1496     p_tax_prof_id := p_event_class_rec.rdng_ship_to_pty_tx_prof_id;
1497     l_parent_ptp_id := p_tax_prof_id;
1498     l_site_ptp_id := NULL;
1499   ELSIF l_tax_prof_name = 'RDNG_SHIP_FROM_PTY_TX_PROF_ID' THEN
1500     p_tax_prof_id := p_event_class_rec.rdng_ship_from_pty_tx_prof_id;
1501     l_parent_ptp_id := p_tax_prof_id;
1502     l_site_ptp_id := NULL;
1503   ELSIF l_tax_prof_name = 'RDNG_BILL_TO_PTY_TX_PROF_ID' THEN
1504     p_tax_prof_id := p_event_class_rec.rdng_bill_to_pty_tx_prof_id;
1505     l_parent_ptp_id := p_tax_prof_id;
1506     l_site_ptp_id := NULL;
1507   ELSIF l_tax_prof_name = 'RDNG_BILL_FROM_PTY_TX_PROF_ID' THEN
1508     p_tax_prof_id := p_event_class_rec.rdng_bill_from_pty_tx_prof_id;
1509     l_parent_ptp_id := p_tax_prof_id;
1510     l_site_ptp_id := NULL;
1511   ELSIF l_tax_prof_name = 'RDNG_SHIP_TO_PTY_TX_P_ST_ID' THEN
1512     p_tax_prof_id := p_event_class_rec.rdng_ship_to_pty_tx_p_st_id;
1513     l_parent_ptp_id := p_event_class_rec.rdng_ship_to_pty_tx_prof_id;
1514     l_site_ptp_id := p_tax_prof_id;
1515   ELSIF l_tax_prof_name = 'RDNG_SHIP_FROM_PTY_TX_P_ST_ID' THEN
1516     p_tax_prof_id := p_event_class_rec.rdng_ship_from_pty_tx_p_st_id;
1517     l_parent_ptp_id := p_event_class_rec.rdng_ship_from_pty_tx_prof_id;
1518     l_site_ptp_id := p_tax_prof_id;
1519   ELSIF l_tax_prof_name = 'RDNG_BILL_TO_PTY_TX_P_ST_ID' THEN
1520     p_tax_prof_id := p_event_class_rec.rdng_bill_to_pty_tx_p_st_id;
1521     l_parent_ptp_id := p_event_class_rec.rdng_bill_to_pty_tx_prof_id;
1522     l_site_ptp_id := p_tax_prof_id;
1523   ELSIF l_tax_prof_name = 'RDNG_BILL_FROM_PTY_TX_P_ST_ID' THEN
1524     p_tax_prof_id := p_event_class_rec.rdng_bill_from_pty_tx_p_st_id;
1525     l_parent_ptp_id := p_event_class_rec.rdng_bill_from_pty_tx_prof_id;
1526     l_site_ptp_id := p_tax_prof_id;
1527   END IF;
1528 
1529 -- Following line commented out for Bug 4939819 fix
1530 --  IF p_tax_prof_id IS NOT NULL THEN
1531 
1532     IF SUBSTR(p_Party_Type_Code, 1, 4) = 'SHIP' THEN
1533 
1534       l_account_id := p_ship_third_pty_acct_id;
1535       l_account_site_id := p_ship_third_pty_acct_site_id;
1536       l_site_use_id := p_ship_to_cust_acct_st_use_id;
1537 
1538     ELSIF SUBSTR(p_Party_Type_Code, 1, 4) = 'BILL' THEN
1539 
1540       l_account_id := p_bill_third_pty_acct_id;
1541       l_account_site_id := p_bill_third_pty_acct_site_id;
1542       l_site_use_id := p_bill_to_cust_acct_st_use_id;
1543 
1544     ELSE
1545       p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1546       p_error_buffer  := 'Invalid Rounding Level Hierarchy';
1547 
1548       IF (g_level_statement >= g_current_runtime_level ) THEN
1549         FND_LOG.STRING(g_level_statement,
1550                      'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.determine_round_level_and_rule',
1551                      'p_return_status = ' || p_return_status);
1552         FND_LOG.STRING(g_level_statement,
1553                      'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.determine_round_level_and_rule',
1554                      'p_error_buffer  = ' || p_error_buffer);
1555       END IF;
1556       RETURN;
1557     END IF;
1558 
1559     --
1560     -- Bug#5501788- get rounding level and rule at document level
1561     --
1562     get_rounding_level(
1563            p_parent_ptp_id        => l_parent_ptp_id,
1564            p_site_ptp_id          => l_site_ptp_id,
1565            p_account_type_code    => p_event_class_rec.sup_cust_acct_type,
1566            p_account_id           => l_account_id,
1567            p_account_site_id      => l_account_site_id,
1568            p_site_use_id          => l_site_use_id,
1569            p_rounding_level_code  => p_rounding_level_code,
1570            p_rounding_rule_code   => p_rounding_rule_code,
1571            p_return_status        => p_return_status,
1572            p_error_buffer         => p_error_buffer
1573          );
1574 
1575     /*** Bug#5501788- do not need to call this any more
1576     -- Call TCM API to get the rounding level and rounding rule
1577     --
1578     ZX_TCM_CONTROL_PKG.get_tax_registration (
1579            p_parent_ptp_id        => l_parent_ptp_id,
1580            p_site_ptp_id          => l_site_ptp_id,
1581            p_account_type_code    => p_event_class_rec.sup_cust_acct_type,
1582            p_tax_determine_date   => p_tax_determine_date,
1583            p_tax                  => NULL,
1584            p_tax_regime_code      => NULL,
1585            p_jurisdiction_code    => NULL,
1586            p_account_id           => l_account_id,
1587            p_account_site_id      => l_account_site_id,
1588            p_site_use_id          => l_site_use_id,
1589            p_zx_registration_rec  => l_registration_rec,
1590            p_ret_record_level     => l_ret_record_level,
1591            p_return_status        => P_return_status);
1592 
1593     **********/
1594 
1595     IF p_return_status <> FND_API.G_RET_STS_SUCCESS  THEN
1596       IF (g_level_statement >= g_current_runtime_level ) THEN
1597         FND_LOG.STRING(g_level_statement,
1598                'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.determine_round_level_and_rule',
1599                'Incorrect return_status after calling ' ||
1600                'get_rounding_level()');
1601 
1602       END IF;
1603       p_rounding_level_code := NULL;
1604       p_rounding_rule_code := NULL;
1605       p_return_status := FND_API.G_RET_STS_SUCCESS;
1606     END IF;
1607 
1608     -- populate rounding_level_code and rounding_rule_code
1609     --
1610     -- Bug#5501788- rounding level code and rule should come from
1611     -- get_rounding_level procedure
1612     --p_rounding_level_code := l_registration_rec.rounding_level_code;
1613 
1614     --p_rounding_rule_code := l_registration_rec.rounding_rule_code;
1615 
1616 -- Fix for Bug 4939819 - PTP setup is not mandatory. So, check for existence of
1617 -- account_id also
1618 
1619 --  ELSE
1620   IF (p_tax_prof_id IS NULL) and (l_account_id IS NULL) THEN
1621     -- p_tax_prof_id IS NULL, skip this rounding hierarchy
1622     --
1623     p_rounding_level_code := NULL;
1624     p_rounding_rule_code := NULL;
1625 
1626     IF (g_level_statement >= g_current_runtime_level ) THEN
1627       FND_LOG.STRING(g_level_statement,
1628                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.determine_round_level_and_rule',
1629                    'p_tax_prof_id IS NULL.');
1630     END IF;
1631   END IF;   -- p_tax_prof_id IS NOT NULL, OR ELSE
1632 
1633   IF (g_level_procedure >= g_current_runtime_level ) THEN
1634 
1635     FND_LOG.STRING(g_level_procedure,
1636                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.determine_round_level_and_rule.END',
1637                    'ZX_TDS_TAX_ROUNDING_PKG: determine_round_level_and_rule(-)'||
1638                    'p_rounding_level_code = ' || p_rounding_level_code||
1639                    'p_rounding_rule_code = ' || p_rounding_rule_code);
1640   END IF;
1641 
1642 EXCEPTION
1643   WHEN OTHERS THEN
1644     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1645     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
1646 
1647     IF (g_level_unexpected >= g_current_runtime_level ) THEN
1648       FND_LOG.STRING(g_level_unexpected,
1649                      'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.determine_round_level_and_rule',
1650                       p_error_buffer);
1651     END IF;
1652 
1653 END determine_round_level_and_rule;
1654 
1655 -----------------------------------------------------------------------
1656 --  PUBLIC PROCEDURE
1657 --  determine_rounding_rule
1658 --
1659 --  DESCRIPTION
1660 --
1661 --  This procedure determines the party_tax_profile_id used to get the
1662 --  rounding rule code from zx_party_tax_profile
1663 --
1664 --
1665 PROCEDURE determine_rounding_rule(
1666   p_trx_line_index     IN            BINARY_INTEGER,
1667   p_event_class_rec    IN            ZX_API_PUB.EVENT_CLASS_REC_TYPE,
1668   p_party_type_code    IN            VARCHAR2,
1669   p_tax_regime_code    IN            VARCHAR2,
1670   p_tax                IN            VARCHAR2,
1671   p_jurisdiction_code  IN            VARCHAR2,
1672   p_tax_determine_date IN            DATE,
1673   p_rounding_rule_code    OUT NOCOPY ZX_PARTY_TAX_PROFILE.ROUNDING_RULE_CODE%TYPE,
1674   p_return_status         OUT NOCOPY VARCHAR2,
1675   p_error_buffer          OUT NOCOPY VARCHAR2) IS
1676 
1677   l_tax_prof_id          ZX_PARTY_TAX_PROFILE.PARTY_TAX_PROFILE_ID%TYPE;
1678   l_tax_prof_name        VARCHAR(30);
1679   l_rounding_level_basis VARCHAR(8);
1680 
1681   l_account_site_id        hz_cust_acct_sites_all.cust_acct_site_id%TYPE;
1682   l_site_use_id            hz_cust_site_uses_all.site_use_id%TYPE;
1683   l_account_id             hz_cust_accounts.cust_account_id%TYPE;
1684   l_parent_ptp_id          zx_party_tax_profile.party_tax_profile_id%TYPE;
1685   l_site_ptp_id            zx_party_tax_profile.party_tax_profile_id%TYPE;
1686   l_registration_rec       zx_tcm_control_pkg.zx_registration_info_rec;
1687   l_tax_service_type_code  zx_rules_b.service_type_code%TYPE;
1688   l_ret_record_level       VARCHAR2(30);
1689 
1690 BEGIN
1691 
1692   IF (g_level_procedure >= g_current_runtime_level ) THEN
1693     FND_LOG.STRING(g_level_procedure,
1694                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.determine_rounding_rule.BEGIN',
1695                    'ZX_TDS_TAX_ROUNDING_PKG: determine_rounding_rule(+)');
1696   END IF;
1697 
1698   p_return_status :=  FND_API.G_RET_STS_SUCCESS;
1699 
1700   --
1701   -- determine the rounding party type
1702   --
1703   det_rounding_level_basis(
1704            p_party_type_code,
1705            l_rounding_level_basis,
1706            p_return_status,
1707            p_error_buffer);
1708 
1709   IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1710     RETURN;
1711   END IF;
1712 
1713   IF l_rounding_level_basis = 'PARTY' THEN
1714     l_tax_prof_name := RTRIM(p_Party_Type_Code, '_PTY');
1715     l_tax_prof_name := l_tax_prof_name ||'_'|| 'PARTY_TAX_PROF_ID';
1716   ELSE
1717     --
1718     -- party site
1719     --
1720     l_tax_prof_name := RTRIM(p_Party_Type_Code, '_PTY_SITE');
1721     l_tax_prof_name := l_tax_prof_name || '_' || 'SITE_TAX_PROF_ID';
1722   END IF;
1723 
1724   -- get party/party_site tax_prof_id
1725   --
1726 
1727   IF l_tax_prof_name = 'SHIP_TO_PARTY_TAX_PROF_ID' THEN
1728     l_tax_prof_id :=
1729       ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.ship_to_party_tax_prof_id(p_trx_line_index);
1730     l_parent_ptp_id := l_tax_prof_id;
1731     l_site_ptp_id := NULL;
1732   ELSIF l_tax_prof_name = 'SHIP_FROM_PARTY_TAX_PROF_ID' THEN
1733     l_tax_prof_id :=
1734       ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.ship_from_party_tax_prof_id(p_trx_line_index);
1735     l_parent_ptp_id := l_tax_prof_id;
1736     l_site_ptp_id := NULL;
1737   ELSIF l_tax_prof_name = 'BILL_TO_PARTY_TAX_PROF_ID' THEN
1738     l_tax_prof_id :=
1739       ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.bill_to_party_tax_prof_id(p_trx_line_index);
1740     l_parent_ptp_id := l_tax_prof_id;
1741     l_site_ptp_id := NULL;
1742   ELSIF l_tax_prof_name = 'BILL_FROM_PARTY_TAX_PROF_ID' THEN
1743     l_tax_prof_id :=
1744       ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.bill_from_party_tax_prof_id(p_trx_line_index);
1745     l_parent_ptp_id := l_tax_prof_id;
1746     l_site_ptp_id := NULL;
1747   ELSIF l_tax_prof_name = 'SHIP_TO_SITE_TAX_PROF_ID' THEN
1748     l_tax_prof_id :=
1749       ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.ship_to_site_tax_prof_id(p_trx_line_index);
1750     l_parent_ptp_id :=
1751       ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.ship_to_party_tax_prof_id(p_trx_line_index);
1752     l_site_ptp_id := l_tax_prof_id;
1753   ELSIF l_tax_prof_name = 'SHIP_FROM_SITE_TAX_PROF_ID' THEN
1754     l_tax_prof_id :=
1755       ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.ship_from_site_tax_prof_id(p_trx_line_index);
1756     l_parent_ptp_id :=
1757       ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.ship_from_party_tax_prof_id(p_trx_line_index);
1758     l_site_ptp_id := l_tax_prof_id;
1759   ELSIF l_tax_prof_name = 'BILL_TO_SITE_TAX_PROF_ID' THEN
1760     l_tax_prof_id :=
1761       ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.bill_to_site_tax_prof_id(p_trx_line_index);
1762     l_parent_ptp_id :=
1763       ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.bill_to_party_tax_prof_id(p_trx_line_index);
1764     l_site_ptp_id := l_tax_prof_id;
1765   ELSIF l_tax_prof_name = 'BILL_FROM_SITE_TAX_PROF_ID' THEN
1766     l_tax_prof_id :=
1767       ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.bill_from_site_tax_prof_id(p_trx_line_index);
1768     l_parent_ptp_id :=
1769       ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.bill_from_party_tax_prof_id(p_trx_line_index);
1770     l_site_ptp_id := l_tax_prof_id;
1771   END IF;
1772 
1773   IF (g_level_statement >= g_current_runtime_level ) THEN
1774     FND_LOG.STRING(g_level_statement,
1775                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.determine_rounding_rule',
1776                    'l_tax_prof_id = ' || to_char(l_tax_prof_id));
1777   END IF;
1778 
1779 -- Following line commented out for Bug 4939819 fix
1780 --  IF l_tax_prof_id IS NOT NULL THEN
1781 
1782   -- determine account, account_site, account_site_use information
1783   -- from transaction line
1784   --
1785   IF SUBSTR(p_Party_Type_Code, 1, 4) = 'SHIP' THEN
1786 
1787     l_account_id :=
1788       ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.ship_third_pty_acct_id(p_trx_line_index);
1789     l_account_site_id :=
1790       ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.ship_third_pty_acct_site_id(p_trx_line_index);
1791     l_site_use_id :=
1792       ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.ship_to_cust_acct_site_use_id(p_trx_line_index);
1793 
1794   ELSIF SUBSTR(p_Party_Type_Code, 1, 4) = 'BILL' THEN
1795 
1796     l_account_id :=
1797       ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.bill_third_pty_acct_id(p_trx_line_index);
1798     l_account_site_id :=
1799       ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.bill_third_pty_acct_site_id(p_trx_line_index);
1800     l_site_use_id :=
1801       ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.bill_to_cust_acct_site_use_id(p_trx_line_index);
1802 
1803   ELSE
1804     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1805     p_error_buffer  := 'Invalid Rounding Level Hierarchy';
1806 
1807     IF (g_level_statement >= g_current_runtime_level ) THEN
1808       FND_LOG.STRING(g_level_statement,
1809                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.determine_rounding_rule',
1810                    'p_return_status = ' || p_return_status);
1811       FND_LOG.STRING(g_level_statement,
1812                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.determine_rounding_rule',
1813                    'p_error_buffer  = ' || p_error_buffer);
1814     END IF;
1815     RETURN;
1816   END IF;
1817 
1818     -- Call TCM API to determine rounding rule
1819     --
1820     ZX_TCM_CONTROL_PKG.get_tax_registration (
1821            p_parent_ptp_id        => l_parent_ptp_id,
1822            p_site_ptp_id          => l_site_ptp_id,
1823            p_account_type_code    => p_event_class_rec.sup_cust_acct_type,
1824            p_tax_determine_date   => p_tax_determine_date,
1825            p_tax                  => p_tax,
1826            p_tax_regime_code      => p_tax_regime_code,
1827            p_jurisdiction_code    => p_jurisdiction_code,
1828            p_account_id           => l_account_id,
1829            p_account_site_id      => l_account_site_id,
1830            p_site_use_id          => l_site_use_id,
1831            p_zx_registration_rec  => l_registration_rec,
1832            p_ret_record_level     => l_ret_record_level,
1833            p_return_status        => P_return_status);
1834 
1835     IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1836       IF (g_level_error >= g_current_runtime_level ) THEN
1837         FND_LOG.STRING(g_level_error,
1838                'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.determine_rounding_rule',
1839                'Incorrect return_status after calling ' ||
1840                'ZX_TCM_CONTROL_PKG.get_tax_registration()');
1841         FND_LOG.STRING(g_level_error,
1842                'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.determine_rounding_rule',
1843                'Continue processing ...');
1844       END IF;
1845       p_rounding_rule_code := NULL;
1846       p_return_status := FND_API.G_RET_STS_SUCCESS;
1847       RETURN;
1848     END IF;
1849 
1850     -- populate rounding_rule_code
1851     --
1852     p_rounding_rule_code := l_registration_rec.rounding_rule_code;
1853 
1854 -- Fix for Bug 4939819 - PTP setup is not mandatory. So, check for existence of
1855 -- account_id also
1856 --  ELSE
1857   IF (l_tax_prof_id IS NULL) and (l_account_id IS NULL) THEN
1858     -- l_tax_prof_id IS NULL, skip this rounding hierarchy
1859     --
1860     p_rounding_rule_code := NULL;
1861 
1862     IF (g_level_statement >= g_current_runtime_level ) THEN
1863       FND_LOG.STRING(g_level_statement,
1864                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.determine_rounding_rule',
1865                    'l_tax_prof_id IS NULL.');
1866     END IF;
1867   END IF;   -- l_tax_prof_id IS NOT NULL, OR ELSE
1868 
1869   IF (g_level_procedure >= g_current_runtime_level ) THEN
1870 
1871     FND_LOG.STRING(g_level_procedure,
1872                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.determine_rounding_rule.END',
1873                    'ZX_TDS_TAX_ROUNDING_PKG: determine_rounding_rule(-)'||
1874                    'p_rounding_rule_code = ' || p_rounding_rule_code);
1875   END IF;
1876 
1877 EXCEPTION
1878   WHEN OTHERS THEN
1879     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1880     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
1881 
1882     IF (g_level_unexpected >= g_current_runtime_level ) THEN
1883       FND_LOG.STRING(g_level_unexpected,
1884                      'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.determine_rounding_rule',
1885                       p_error_buffer);
1886     END IF;
1887 
1888 END determine_rounding_rule;
1889 
1890 -----------------------------------------------------------------------
1891 --  PUBLIC PROCEDURE
1892 --  get_rounding_rule
1893 --
1894 --  DESCRIPTION
1895 --
1896 --  This procedure gets the rounding rule through party hierachy
1897 --
1898 PROCEDURE get_rounding_rule(
1899   p_trx_line_index      IN             BINARY_INTEGER,
1900   p_event_class_rec     IN             ZX_API_PUB.EVENT_CLASS_REC_TYPE,
1901   p_tax_regime_code     IN             VARCHAR2,
1902   p_tax                 IN             VARCHAR2,
1903   p_jurisdiction_code   IN             VARCHAR2,
1904   p_tax_determine_date  IN             DATE,
1905   p_rounding_rule_code     OUT NOCOPY  ZX_PARTY_TAX_PROFILE.ROUNDING_RULE_CODE%TYPE,
1906   p_return_status          OUT NOCOPY  VARCHAR2,
1907   p_error_buffer           OUT NOCOPY  VARCHAR2) IS
1908 
1909 BEGIN
1910 
1911   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
1912 
1913   IF (g_level_procedure >= g_current_runtime_level ) THEN
1914     FND_LOG.STRING(g_level_procedure,
1915                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.get_rounding_rule.BEGIN',
1916                    'ZX_TDS_TAX_ROUNDING_PKG: get_rounding_rule(+)');
1917   END IF;
1918 
1919   p_return_status :=  FND_API.G_RET_STS_SUCCESS;
1920 
1921   IF p_event_class_rec.rounding_level_hier_1_code IS NOT NULL THEN
1922 
1923     determine_rounding_rule(
1924                              p_trx_line_index,
1925                              p_event_class_rec,
1926                              p_event_class_rec.rounding_level_hier_1_code,
1927                              p_tax_regime_code,
1928                              p_tax,
1929                              p_jurisdiction_code,
1930                              p_tax_determine_date,
1931                              p_rounding_rule_code,
1932                              p_return_status,
1933                              p_error_buffer);
1934 
1935     IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1936       RETURN;
1937     ELSE
1938       IF p_rounding_rule_code IS NOT NULL THEN
1939         RETURN;
1940       END IF;
1941     END IF;
1942   END IF;
1943 
1944   IF p_event_class_rec.rounding_level_hier_2_code IS NOT NULL THEN
1945 
1946     determine_rounding_rule(
1947                              p_trx_line_index,
1948                              p_event_class_rec,
1949                              p_event_class_rec.rounding_level_hier_2_code,
1950                              p_tax_regime_code,
1951                              p_tax,
1952                              p_jurisdiction_code,
1953                              p_tax_determine_date,
1954                              p_rounding_rule_code,
1955                              p_return_status,
1956                              p_error_buffer);
1957 
1958     IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1959       RETURN;
1960     ELSE
1961       IF p_rounding_rule_code IS NOT NULL THEN
1962         RETURN;
1963       END IF;
1964     END IF;
1965   END IF;
1966 
1967   IF p_event_class_rec.rounding_level_hier_3_code IS NOT NULL THEN
1968 
1969     determine_rounding_rule(
1970                              p_trx_line_index,
1971                              p_event_class_rec,
1972                              p_event_class_rec.rounding_level_hier_3_code,
1973                              p_tax_regime_code,
1974                              p_tax,
1975                              p_jurisdiction_code,
1976                              p_tax_determine_date,
1977                              p_rounding_rule_code,
1978                              p_return_status,
1979                              p_error_buffer);
1980 
1981     IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1982       RETURN;
1983     ELSE
1984       IF p_rounding_rule_code IS NOT NULL THEN
1985         RETURN;
1986       END IF;
1987     END IF;
1988   END IF;
1989 
1990   IF p_event_class_rec.rounding_level_hier_4_code IS NOT NULL THEN
1991 
1992     determine_rounding_rule(
1993                              p_trx_line_index,
1994                              p_event_class_rec,
1995                              p_event_class_rec.rounding_level_hier_4_code,
1996                              p_tax_regime_code,
1997                              p_tax,
1998                              p_jurisdiction_code,
1999                              p_tax_determine_date,
2000                              p_rounding_rule_code,
2001                              p_return_status,
2002                              p_error_buffer);
2003 
2004     IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2005       RETURN;
2006     ELSE
2007       IF p_rounding_rule_code IS NOT NULL THEN
2008         RETURN;
2009       END IF;
2010     END IF;
2011   END IF;
2012 
2013   IF (g_level_procedure >= g_current_runtime_level ) THEN
2014     FND_LOG.STRING(g_level_procedure,
2015                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.get_rounding_rule.END',
2016                    'ZX_TDS_TAX_ROUNDING_PKG: get_rounding_rule(-)');
2017   END IF;
2018 
2019 EXCEPTION
2020   WHEN OTHERS THEN
2021     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2022     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
2023 
2024     IF (g_level_unexpected >= g_current_runtime_level ) THEN
2025       FND_LOG.STRING(g_level_unexpected,
2026                      'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.get_rounding_rule',
2027                       p_error_buffer);
2028     END IF;
2029 
2030 END get_rounding_rule;
2031 
2032 -----------------------------------------------------------------------
2033 --  PRIVATE PROCEDURE
2034 --  get_round_level_ptp_id
2035 --
2036 --  DESCRIPTION
2037 --
2038 --  This procedure determines the party_tax_profile_id.
2039 --
2040 PROCEDURE get_round_level_ptp_id(
2041             p_Party_Type_Code      IN     VARCHAR2,
2042             p_event_class_rec      IN     ZX_API_PUB.EVENT_CLASS_REC_TYPE,
2043             p_tax_prof_id             OUT NOCOPY ZX_PARTY_TAX_PROFILE.PARTY_TAX_PROFILE_ID%TYPE,
2044             p_return_status           OUT NOCOPY  VARCHAR2,
2045             p_error_buffer            OUT NOCOPY  VARCHAR2
2046            )
2047 IS
2048   l_tax_prof_name                  VARCHAR(30);
2049   l_rounding_level_basis           VARCHAR(8);
2050 
2051 BEGIN
2052 
2053   IF (g_level_procedure >= g_current_runtime_level ) THEN
2054     FND_LOG.STRING(g_level_procedure,
2055                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.get_round_level_ptp_id.BEGIN',
2056                    'ZX_TDS_TAX_ROUNDING_PKG: get_round_level_ptp_id(+)');
2057   END IF;
2058 
2059   p_return_status :=  FND_API.G_RET_STS_SUCCESS;
2060 
2061   --
2062   -- determine the rounding party type
2063   --
2064   det_rounding_level_basis(
2065            p_Party_Type_Code,
2066            l_rounding_level_basis,
2067            p_return_status,
2068            p_error_buffer);
2069 
2070   IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2071     RETURN;
2072   END IF;
2073 
2074   IF l_rounding_level_basis = 'PARTY' THEN
2075     l_tax_prof_name := 'RDNG' || '_'||p_Party_Type_Code ||'_'|| 'TX_PROF_ID';
2076   ELSE
2077     --
2078     -- party site
2079     --
2080     l_tax_prof_name := RTRIM(p_Party_Type_Code, 'SITE');
2081     l_tax_prof_name := 'RDNG' || '_' || l_tax_prof_name || 'TX_P_ST_ID';
2082   END IF;
2083   --
2084   -- get party/party_site tax_prof_id based on the name
2085   --
2086   IF l_tax_prof_name = 'RDNG_SHIP_TO_PTY_TX_PROF_ID' THEN
2087     p_tax_prof_id := p_event_class_rec.rdng_ship_to_pty_tx_prof_id;
2088   ELSIF l_tax_prof_name = 'RDNG_SHIP_FROM_PTY_TX_PROF_ID' THEN
2089     p_tax_prof_id := p_event_class_rec.rdng_ship_from_pty_tx_prof_id;
2090   ELSIF l_tax_prof_name = 'RDNG_BILL_TO_PTY_TX_PROF_ID' THEN
2091     p_tax_prof_id := p_event_class_rec.rdng_bill_to_pty_tx_prof_id;
2092   ELSIF l_tax_prof_name = 'RDNG_BILL_FROM_PTY_TX_PROF_ID' THEN
2093     p_tax_prof_id := p_event_class_rec.rdng_bill_from_pty_tx_prof_id;
2094   ELSIF l_tax_prof_name = 'RDNG_SHIP_TO_PTY_TX_P_ST_ID' THEN
2095     p_tax_prof_id := p_event_class_rec.rdng_ship_to_pty_tx_p_st_id;
2096   ELSIF l_tax_prof_name = 'RDNG_SHIP_FROM_PTY_TX_P_ST_ID' THEN
2097     p_tax_prof_id := p_event_class_rec.rdng_ship_from_pty_tx_p_st_id;
2098   ELSIF l_tax_prof_name = 'RDNG_BILL_TO_PTY_TX_P_ST_ID' THEN
2099     p_tax_prof_id := p_event_class_rec.rdng_bill_to_pty_tx_p_st_id;
2100   ELSIF l_tax_prof_name = 'RDNG_BILL_FROM_PTY_TX_P_ST_ID' THEN
2101     p_tax_prof_id := p_event_class_rec.rdng_bill_from_pty_tx_p_st_id;
2102   END IF;
2103 
2104   IF (g_level_procedure >= g_current_runtime_level ) THEN
2105     FND_LOG.STRING(g_level_procedure,
2106                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.get_round_level_ptp_id.END',
2107                    'ZX_TDS_TAX_ROUNDING_PKG: get_round_level_ptp_id(-)'||
2108                    'p_tax_prof_id = ' || to_char(p_tax_prof_id));
2109   END IF;
2110 
2111 EXCEPTION
2112   WHEN OTHERS THEN
2113     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2114     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
2115 
2116     IF (g_level_unexpected >= g_current_runtime_level ) THEN
2117       FND_LOG.STRING(g_level_unexpected,
2118                      'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.get_round_level_ptp_id',
2119                       p_error_buffer);
2120     END IF;
2121 
2122 END get_round_level_ptp_id;
2123 
2124 -----------------------------------------------------------------------
2125 --  PUBLIC PROCEDURE
2126 --  get_rounding_level_and_rule
2127 --
2128 --  DESCRIPTION
2129 --
2130 --  This procedure determines the rounding level for a whole document
2131 --  and the rounding_rule based on rounding party hierarchy
2132 --
2133 
2134 PROCEDURE get_rounding_level_and_rule(
2135            p_event_class_rec      IN      ZX_API_PUB.EVENT_CLASS_REC_TYPE,
2136            p_rounding_level_code     OUT NOCOPY  ZX_PARTY_TAX_PROFILE.ROUNDING_LEVEL_CODE%TYPE,
2137            p_rounding_rule_code      OUT NOCOPY  ZX_PARTY_TAX_PROFILE.ROUNDING_RULE_CODE%TYPE,
2138            p_rnd_lvl_party_tax_prof_id
2139                          OUT NOCOPY ZX_LINES.ROUNDING_LVL_PARTY_TAX_PROF_ID%TYPE,
2140            p_rounding_lvl_party_type OUT NOCOPY  ZX_LINES.ROUNDING_LVL_PARTY_TYPE%TYPE,
2141            p_return_status           OUT NOCOPY  VARCHAR2,
2142            p_error_buffer            OUT NOCOPY  VARCHAR2
2143          )
2144 IS
2145   l_tax_prof_id           ZX_PARTY_TAX_PROFILE.PARTY_TAX_PROFILE_ID%TYPE;
2146   l_rounding_level_code   ZX_PARTY_TAX_PROFILE.ROUNDING_LEVEL_CODE%TYPE;
2147   l_rounding_rule_code    ZX_PARTY_TAX_PROFILE.ROUNDING_RULE_CODE%TYPE;
2148   l_rounding_level_found  BOOLEAN;
2149   l_rounding_rule_found   BOOLEAN;
2150 
2151 
2152     CURSOR  get_acct_site_info_csr IS
2153    SELECT /*+ INDEX ( HEADER ZX_TRX_HEADERS_GT_U1 ) INDEX ( TRXLINES ZX_TRANSACTION_LINES_GT_U1 ) */
2154           NVL(trxlines.ship_third_pty_acct_id,
2155               header.ship_third_pty_acct_id) ship_third_pty_acct_id,
2156           NVL(trxlines.bill_third_pty_acct_id,
2157               header.bill_third_pty_acct_id) bill_third_pty_acct_id,
2158           NVL(trxlines.ship_third_pty_acct_site_id,
2159               header.ship_third_pty_acct_site_id) ship_third_pty_acct_site_id,
2160           NVL(trxlines.bill_third_pty_acct_site_id,
2161               header.bill_third_pty_acct_site_id) bill_third_pty_acct_site_id,
2162           NVL(trxlines.ship_to_cust_acct_site_use_id,
2163               header.ship_to_cust_acct_site_use_id) ship_to_cust_acct_site_use_id,
2164           NVL(trxlines.bill_to_cust_acct_site_use_id,
2165               header.bill_to_cust_acct_site_use_id) bill_to_cust_acct_site_use_id,
2166           NVL(header.related_doc_date, NVL(header.provnl_tax_determination_date,
2167               NVL(trxlines.adjusted_doc_date,
2168                   NVL(trxlines.trx_line_date, header.trx_date)))) tax_determine_date
2169      FROM ZX_TRANSACTION_LINES_GT trxlines, ZX_TRX_HEADERS_GT header
2170     WHERE header.application_id = p_event_class_rec.application_id
2171       AND header.entity_code = p_event_class_rec.entity_code
2172       AND header.event_class_code = p_event_class_rec.event_class_code
2173       AND header.trx_id = p_event_class_rec.trx_id
2174       AND trxlines.application_id = header.application_id
2175       AND trxlines.entity_code = header.entity_code
2176       AND trxlines.event_class_code = header.event_class_code
2177       AND trxlines.trx_id = header.trx_id
2178       AND rownum = 1;
2179 
2180 --Bug 5103375
2181     CURSOR get_lines_det_factors  IS
2182     select SHIP_THIRD_PTY_ACCT_ID,
2183            BILL_THIRD_PTY_ACCT_ID,
2184            SHIP_THIRD_PTY_ACCT_SITE_ID,
2185            BILL_THIRD_PTY_ACCT_SITE_ID,
2186            SHIP_TO_CUST_ACCT_SITE_USE_ID,
2187            BILL_TO_CUST_ACCT_SITE_USE_ID,
2188 	   coalesce(related_doc_date,
2189 	            provnl_tax_determination_date,
2190 		    adjusted_doc_date,
2191 		    trx_line_date,
2192 		    trx_date) tax_determine_date
2193       FROM ZX_LINES_DET_FACTORS
2194      WHERE application_id = p_event_class_rec.application_id
2195 	   AND entity_code = p_event_class_rec.entity_code
2196 	   AND event_class_code = p_event_class_rec.event_class_code
2197 	   AND trx_id = p_event_class_rec.trx_id
2198            AND ROWNUM = 1 ;
2199 
2200   l_ship_third_pty_acct_id              NUMBER;
2201   l_bill_third_pty_acct_id              NUMBER;
2202   l_ship_third_pty_acct_site_id         NUMBER;
2203   l_bill_third_pty_acct_site_id         NUMBER;
2204   l_ship_to_cust_acct_st_use_id         NUMBER;
2205   l_bill_to_cust_acct_st_use_id         NUMBER;
2206   l_tax_determine_date                  DATE;
2207   l_tax_date                            DATE;
2208   l_tax_point_date                      DATE;
2209 
2210 
2211 BEGIN
2212 
2213   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
2214 
2215   IF (g_level_procedure >= g_current_runtime_level ) THEN
2216     FND_LOG.STRING(g_level_procedure,
2217                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.get_rounding_level_and_rule.BEGIN',
2218                    'ZX_TDS_TAX_ROUNDING_PKG: get_rounding_level_and_rule(+)');
2219 
2220   END IF;
2221 
2222   p_return_status :=  FND_API.G_RET_STS_SUCCESS;
2223 
2224   --
2225   -- check if trx_currency_code is available at header level
2226   -- if not, that means trx_currency_code can be different
2227   -- accross transaction lines, in this case, just set
2228   -- rounding level to 'LINE' and don't get rounding rule
2229   --
2230 
2231   IF p_event_class_rec.header_level_currency_flag IS NULL THEN
2232     p_rounding_level_code := 'LINE';
2233     p_rounding_rule_code := NULL;
2234 
2235     IF p_event_class_rec.rounding_level_hier_1_code IS NOT NULL THEN
2236 
2237       get_round_level_ptp_id(
2238           p_event_class_rec.rounding_level_hier_1_code,
2239           p_event_class_rec,
2240           l_tax_prof_id,
2241           p_return_status,
2242           p_error_buffer);
2243 
2244       IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2245         RETURN;
2246       ELSE
2247         IF l_tax_prof_id IS NOT NULL THEN
2248           p_rnd_lvl_party_tax_prof_id := l_tax_prof_id;
2249           p_rounding_lvl_party_type := p_event_class_rec.rounding_level_hier_1_code;
2250 
2251           IF (g_level_statement >= g_current_runtime_level ) THEN
2252             FND_LOG.STRING(g_level_statement,
2253                  'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.get_rounding_level_and_rule',
2254                  'from rounding_level_hier_1_code p_rnd_lvl_party_tax_prof_id: '||
2255                  p_rnd_lvl_party_tax_prof_id ||' p_rounding_lvl_party_type: '||
2256                  p_rounding_lvl_party_type );
2257           END IF;
2258           RETURN;
2259         END IF;
2260       END IF;
2261     END IF;
2262 
2263     IF p_event_class_rec.rounding_level_hier_2_code IS NOT NULL THEN
2264 
2265 
2266       get_round_level_ptp_id(
2267           p_event_class_rec.rounding_level_hier_2_code,
2268           p_event_class_rec,
2269           l_tax_prof_id,
2270           p_return_status,
2271           p_error_buffer);
2272 
2273       IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2274         RETURN;
2275       ELSE
2276         IF l_tax_prof_id IS NOT NULL THEN
2277           p_rnd_lvl_party_tax_prof_id := l_tax_prof_id;
2278           p_rounding_lvl_party_type := p_event_class_rec.rounding_level_hier_2_code;
2279 
2280           IF (g_level_statement >= g_current_runtime_level ) THEN
2281             FND_LOG.STRING(g_level_statement,
2282                  'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.get_rounding_level_and_rule',
2283                  'from rounding_level_hier_2_code p_rnd_lvl_party_tax_prof_id: '||
2284                  p_rnd_lvl_party_tax_prof_id ||' p_rounding_lvl_party_type: '||
2285                  p_rounding_lvl_party_type );
2286           END IF;
2287           RETURN;
2288         END IF;
2289       END IF;
2290     END IF;
2291 
2292     IF p_event_class_rec.rounding_level_hier_3_code IS NOT NULL THEN
2293 
2294       get_round_level_ptp_id(
2295           p_event_class_rec.rounding_level_hier_3_code,
2296           p_event_class_rec,
2297           l_tax_prof_id,
2298           p_return_status,
2299           p_error_buffer);
2300 
2301       IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2302         RETURN;
2303       ELSE
2304         IF l_tax_prof_id IS NOT NULL THEN
2305           p_rnd_lvl_party_tax_prof_id := l_tax_prof_id;
2306           p_rounding_lvl_party_type := p_event_class_rec.rounding_level_hier_3_code;
2307 
2308           IF (g_level_statement >= g_current_runtime_level ) THEN
2309             FND_LOG.STRING(g_level_statement,
2310                  'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.get_rounding_level_and_rule',
2311                  'from rounding_level_hier_3_code p_rnd_lvl_party_tax_prof_id: '||
2312                  p_rnd_lvl_party_tax_prof_id ||' p_rounding_lvl_party_type: '||
2313                  p_rounding_lvl_party_type );
2314           END IF;
2315           RETURN;
2316         END IF;
2317       END IF;
2318     END IF;
2319 
2320     IF p_event_class_rec.rounding_level_hier_4_code IS NOT NULL THEN
2321 
2322       get_round_level_ptp_id(
2323           p_event_class_rec.rounding_level_hier_4_code,
2324           p_event_class_rec,
2325           l_tax_prof_id,
2326           p_return_status,
2327           p_error_buffer);
2328 
2329       IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2330         RETURN;
2331       ELSE
2332         IF l_tax_prof_id IS NOT NULL THEN
2333           p_rnd_lvl_party_tax_prof_id := l_tax_prof_id;
2334           p_rounding_lvl_party_type := p_event_class_rec.rounding_level_hier_4_code;
2335 
2336           IF (g_level_statement >= g_current_runtime_level ) THEN
2337             FND_LOG.STRING(g_level_statement,
2338                  'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.get_rounding_level_and_rule',
2339                  'from rounding_level_hier_4_code p_rnd_lvl_party_tax_prof_id: '||
2340                  p_rnd_lvl_party_tax_prof_id ||' p_rounding_lvl_party_type: '||
2341                  p_rounding_lvl_party_type );
2342           END IF;
2343           RETURN;
2344         END IF;
2345       END IF;
2346     END IF;
2347 
2348   END IF;
2349 
2350   --
2351   -- trx_currency_code is the same accross transaction
2352   -- lines, get the rounding level and rule
2353   --
2354 
2355   l_rounding_level_code  := NULL;
2356   l_rounding_rule_code   := NULL;
2357 
2358   l_rounding_level_found := FALSE;
2359   l_rounding_rule_found  := FALSE;
2360 
2361     -- determine account, account_site, account_site_use information
2362     -- from first transaction line
2363     --
2364     IF ZX_API_PUB.G_DATA_TRANSFER_MODE = 'TAB' THEN
2365       OPEN  get_acct_site_info_csr;
2366       FETCH get_acct_site_info_csr INTO
2367              l_ship_third_pty_acct_id, l_bill_third_pty_acct_id,
2368              l_ship_third_pty_acct_site_id, l_bill_third_pty_acct_site_id,
2369              l_ship_to_cust_acct_st_use_id, l_bill_to_cust_acct_st_use_id,
2370              l_tax_determine_date;
2371       CLOSE get_acct_site_info_csr;
2372     ELSE
2373 
2374       IF ( ZX_API_PUB.G_DATA_TRANSFER_MODE = 'WIN' ) THEN  --Bug 5103375
2375          OPEN get_lines_det_factors;
2376 	 FETCH get_lines_det_factors INTO
2377 	     l_ship_third_pty_acct_id, l_bill_third_pty_acct_id,
2378              l_ship_third_pty_acct_site_id, l_bill_third_pty_acct_site_id,
2379              l_ship_to_cust_acct_st_use_id, l_bill_to_cust_acct_st_use_id,
2380              l_tax_determine_date;
2381 	 CLOSE get_lines_det_factors ;
2382 
2383       ELSE --PLS --Bug 5103375
2384 
2385 			      FOR i IN ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.application_id.FIRST ..
2386 				       ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.application_id.LAST
2387 			      LOOP
2388 
2389 				IF p_event_class_rec.application_id =
2390 				       ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.application_id(i) AND
2391 				   p_event_class_rec.entity_code =
2392 					  ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.entity_code(i) AND
2393 				   p_event_class_rec.event_class_code =
2394 				     ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.event_class_code(i) AND
2395 				   p_event_class_rec.trx_id =
2396 					       ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.trx_id(i)
2397 				THEN
2398 
2399 				  l_ship_third_pty_acct_id :=
2400 				    ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.ship_third_pty_acct_id(i);
2401 				  l_bill_third_pty_acct_id :=
2402 				    ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.bill_third_pty_acct_id(i);
2403 				  l_ship_third_pty_acct_site_id :=
2404 				    ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.ship_third_pty_acct_site_id(i);
2405 				  l_bill_third_pty_acct_site_id :=
2406 				    ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.bill_third_pty_acct_site_id(i);
2407 				  l_ship_to_cust_acct_st_use_id :=
2408 				    ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.ship_to_cust_acct_site_use_id(i);
2409 				  l_bill_to_cust_acct_st_use_id :=
2410 				    ZX_GLOBAL_STRUCTURES_PKG.trx_line_dist_tbl.bill_to_cust_acct_site_use_id(i);
2411 
2412 				  ZX_TDS_APPLICABILITY_DETM_PKG.get_tax_date(
2413 					i,
2414 					l_tax_date,
2415 					l_tax_determine_date,
2416 					l_tax_point_date,
2417 					p_return_status);
2418 
2419 				  IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2420 				    IF (g_level_error >= g_current_runtime_level ) THEN
2421 				      FND_LOG.STRING(g_level_error,
2422 					     'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.get_rounding_level_and_rule',
2423 					     'Incorrect return_status after calling ' ||
2424 					     'ZX_TDS_APPLICABILITY_DETM_PKG.get_tax_date()');
2425 				      FND_LOG.STRING(g_level_error,
2426 					     'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.get_rounding_level_and_rule',
2427 					     'RETURN_STATUS = ' || p_return_status);
2428 				      FND_LOG.STRING(g_level_error,
2429 					     'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.get_rounding_level_and_rule.END',
2430 					     'ZX_TDS_TAX_ROUNDING_PKG.get_rounding_level_and_rule(-)');
2431 				    END IF;
2432 				    RETURN;
2433 				  END IF;
2434 
2435 				  EXIT;
2436 				END IF;
2437 			      END LOOP;
2438 	END IF ; -- PLSQL Version
2439     END IF;
2440 
2441 
2442   IF p_event_class_rec.rounding_level_hier_1_code IS NOT NULL THEN
2443 
2444     determine_round_level_and_rule(
2445                              p_event_class_rec.rounding_level_hier_1_code,
2446                              p_event_class_rec,
2447                              l_tax_prof_id,
2448                              l_rounding_level_code,
2449                              l_rounding_rule_code,
2450                              p_return_status,
2451                              p_error_buffer,
2452                              l_ship_third_pty_acct_id,
2453                              l_bill_third_pty_acct_id,
2454                              l_ship_third_pty_acct_site_id,
2455                              l_bill_third_pty_acct_site_id,
2456                              l_ship_to_cust_acct_st_use_id,
2457                              l_bill_to_cust_acct_st_use_id,
2458                              l_tax_determine_date );
2459 
2460     IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2461       RETURN;
2462     ELSE
2463       IF l_rounding_level_code IS NOT NULL THEN
2464         p_rnd_lvl_party_tax_prof_id := l_tax_prof_id;
2465         p_rounding_lvl_party_type := p_event_class_rec.rounding_level_hier_1_code;
2466         p_rounding_level_code := l_rounding_level_code;
2467         l_rounding_level_found := TRUE;
2468       END IF;
2469       IF l_rounding_rule_code IS NOT NULL THEN
2470         p_rounding_rule_code := l_rounding_rule_code;
2471         l_rounding_rule_found := TRUE;
2472       END IF;
2473       IF l_rounding_level_found AND l_rounding_rule_found THEN
2474         RETURN;
2475       END IF;
2476     END IF;
2477   END IF;
2478 
2479   IF p_event_class_rec.rounding_level_hier_2_code IS NOT NULL THEN
2480 
2481     determine_round_level_and_rule(
2482                              p_event_class_rec.rounding_level_hier_2_code,
2483                              p_event_class_rec,
2484                              l_tax_prof_id,
2485                              l_rounding_level_code,
2486                              l_rounding_rule_code,
2487                              p_return_status,
2488                              p_error_buffer,
2489                              l_ship_third_pty_acct_id,
2490                              l_bill_third_pty_acct_id,
2491                              l_ship_third_pty_acct_site_id,
2492                              l_bill_third_pty_acct_site_id,
2493                              l_ship_to_cust_acct_st_use_id,
2494                              l_bill_to_cust_acct_st_use_id,
2495                              l_tax_determine_date );
2496 
2497     IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2498       RETURN;
2499     ELSE
2500       IF (NOT l_rounding_level_found AND
2501           l_rounding_level_code IS NOT NULL) THEN
2502        p_rnd_lvl_party_tax_prof_id := l_tax_prof_id;
2503        p_rounding_lvl_party_type := p_event_class_rec.rounding_level_hier_2_code;
2504        p_rounding_level_code := l_rounding_level_code;
2505        l_rounding_level_found := TRUE;
2506       END IF;
2507       IF (NOT l_rounding_rule_found AND
2508           l_rounding_rule_code IS NOT NULL) THEN
2509         p_rounding_rule_code := l_rounding_rule_code;
2510         l_rounding_rule_found := TRUE;
2511       END IF;
2512       IF l_rounding_level_found AND l_rounding_rule_found THEN
2513         RETURN;
2514       END IF;
2515     END IF;
2516   END IF;
2517 
2518   IF p_event_class_rec.rounding_level_hier_3_code IS NOT NULL THEN
2519 
2520     determine_round_level_and_rule(
2521                              p_event_class_rec.rounding_level_hier_3_code,
2522                              p_event_class_rec,
2523                              l_tax_prof_id,
2524                              l_rounding_level_code,
2525                              l_rounding_rule_code,
2526                              p_return_status,
2527                              p_error_buffer,
2528                              l_ship_third_pty_acct_id,
2529                              l_bill_third_pty_acct_id,
2530                              l_ship_third_pty_acct_site_id,
2531                              l_bill_third_pty_acct_site_id,
2532                              l_ship_to_cust_acct_st_use_id,
2533                              l_bill_to_cust_acct_st_use_id,
2534                              l_tax_determine_date );
2535 
2536     IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2537       RETURN;
2538     ELSE
2539       IF (NOT l_rounding_level_found  AND
2540           l_rounding_level_code IS NOT NULL) THEN
2541         p_rnd_lvl_party_tax_prof_id := l_tax_prof_id;
2542         p_rounding_lvl_party_type := p_event_class_rec.rounding_level_hier_3_code;
2543         p_rounding_level_code := l_rounding_level_code;
2544         l_rounding_level_found := TRUE;
2545       END IF;
2546       IF (NOT l_rounding_rule_found AND
2547           l_rounding_rule_code IS NOT NULL) THEN
2548         p_rounding_rule_code := l_rounding_rule_code;
2549         l_rounding_rule_found := TRUE;
2550       END IF;
2551       IF l_rounding_level_found AND l_rounding_rule_found THEN
2552         RETURN;
2553       END IF;
2554     END IF;
2555   END IF;
2556 
2557   IF p_event_class_rec.rounding_level_hier_4_code IS NOT NULL THEN
2558 
2559     determine_round_level_and_rule(
2560                              p_event_class_rec.rounding_level_hier_4_code,
2561                              p_event_class_rec,
2562                              l_tax_prof_id,
2563                              l_rounding_level_code,
2564                              l_rounding_rule_code,
2565                              p_return_status,
2566                              p_error_buffer,
2567                              l_ship_third_pty_acct_id,
2568                              l_bill_third_pty_acct_id,
2569                              l_ship_third_pty_acct_site_id,
2570                              l_bill_third_pty_acct_site_id,
2571                              l_ship_to_cust_acct_st_use_id,
2572                              l_bill_to_cust_acct_st_use_id,
2573                              l_tax_determine_date );
2574 
2575     IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2576       RETURN;
2577     ELSE
2578       IF (NOT l_rounding_level_found AND
2579           l_rounding_level_code IS NOT NULL) THEN
2580         p_rnd_lvl_party_tax_prof_id := l_tax_prof_id;
2581         p_rounding_lvl_party_type := p_event_class_rec.rounding_level_hier_4_code;
2582         p_rounding_level_code := l_rounding_level_code;
2583         l_rounding_level_found := TRUE;
2584       END IF;
2585       IF (NOT l_rounding_rule_found AND
2586           l_rounding_rule_code IS NOT NULL) THEN
2587         p_rounding_rule_code := l_rounding_rule_code;
2588         l_rounding_rule_found := TRUE;
2589       END IF;
2590       IF l_rounding_level_found AND l_rounding_rule_found THEN
2591         RETURN;
2592       END IF;
2593     END IF;
2594   END IF;
2595 
2596   --
2597   -- get default rounding level from event class record
2598   --
2599 
2600   IF NOT l_rounding_level_found THEN
2601     p_rounding_level_code := p_event_class_rec.Default_Rounding_Level_Code;
2602     IF (g_level_procedure >= g_current_runtime_level ) THEN
2603     	FND_LOG.STRING(g_level_procedure,
2604                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.get_rounding_level_and_rule',
2605                    'get default rounding level from event class record '||p_rounding_level_code);
2606     END IF;
2607   END IF;
2608 
2609   IF (g_level_procedure >= g_current_runtime_level ) THEN
2610     FND_LOG.STRING(g_level_procedure,
2611                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.get_rounding_level_and_rule.END',
2612                    'ZX_TDS_TAX_ROUNDING_PKG: get_rounding_level_and_rule(-)'||'rounding level code :'||p_rounding_level_code);
2613   END IF;
2614 
2615 EXCEPTION
2616   WHEN OTHERS THEN
2617     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2618     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
2619 
2620     IF (g_level_unexpected >= g_current_runtime_level ) THEN
2621       FND_LOG.STRING(g_level_unexpected,
2622                      'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.get_rounding_level_and_rule',
2623                       p_error_buffer);
2624     END IF;
2625 
2626 END get_rounding_level_and_rule;
2627 
2628 -----------------------------------------------------------------------
2629 --  PRIVATE PROCEDURE
2630 --  init_header_group
2631 --
2632 --  DESCRIPTION
2633 --  This procedure initializes the values belonged to a group used by
2634 --  header level rounding
2635 --
2636 
2637 PROCEDURE  init_header_group(
2638              p_hdr_grp_rec       OUT NOCOPY HDR_GRP_REC_TYPE,
2639              p_return_status     OUT NOCOPY VARCHAR2,
2640              p_error_buffer      OUT NOCOPY VARCHAR2
2641          )
2642 IS
2643 
2644 BEGIN
2645 
2646   IF (g_level_procedure >= g_current_runtime_level ) THEN
2647     FND_LOG.STRING(g_level_procedure,
2648                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.init_header_group.BEGIN',
2649                    'ZX_TDS_TAX_ROUNDING_PKG: init_header_group(+)');
2650   END IF;
2651 
2652   p_return_status  := FND_API.G_RET_STS_SUCCESS;
2653 
2654   p_hdr_grp_rec.tax_regime_code               := 'X';
2655   p_hdr_grp_rec.tax                           := 'X';
2656   p_hdr_grp_rec.tax_status_code               := 'X';
2657   p_hdr_grp_rec.tax_rate_code                 := 'X';
2658   p_hdr_grp_rec.tax_rate                      := -999;
2659   p_hdr_grp_rec.tax_rate_id                   := -999;
2660   p_hdr_grp_rec.tax_jurisdiction_code         := 'X';
2661   p_hdr_grp_rec.taxable_basis_formula         := 'X';
2662   p_hdr_grp_rec.tax_calculation_formula       := 'X';
2663   p_hdr_grp_rec.Tax_Amt_Included_Flag         := 'X';
2664   p_hdr_grp_rec.compounding_tax_flag          := 'X';
2665   p_hdr_grp_rec.historical_flag               := 'X';
2666   p_hdr_grp_rec.self_assessed_flag            := 'X';
2667   p_hdr_grp_rec.overridden_flag               := 'X';
2668   p_hdr_grp_rec.manually_entered_flag         := 'X';
2669   p_hdr_grp_rec.Copied_From_Other_Doc_Flag    := 'X';
2670   p_hdr_grp_rec.associated_child_frozen_flag  := 'X';
2671   p_hdr_grp_rec.tax_only_line_flag            := 'X';
2672   p_hdr_grp_rec.mrc_tax_line_flag             := 'X';
2673   p_hdr_grp_rec.reporting_only_flag           := 'X';
2674   p_hdr_grp_rec.applied_from_application_id   := -999;
2675   p_hdr_grp_rec.applied_from_event_class_code := 'X';
2676   p_hdr_grp_rec.applied_from_entity_code      := 'X';
2677   p_hdr_grp_rec.applied_from_trx_id           := -999;
2678   p_hdr_grp_rec.applied_from_line_id          := -999;
2679   p_hdr_grp_rec.adjusted_doc_application_id   := -999;
2680   p_hdr_grp_rec.adjusted_doc_entity_code      := 'X';
2681   p_hdr_grp_rec.adjusted_doc_event_class_code := 'X';
2682   p_hdr_grp_rec.adjusted_doc_trx_id           := -999;
2683   -- bug6773534 p_hdr_grp_rec.applied_to_application_id     := -999;
2684   -- bug6773534 p_hdr_grp_rec.applied_to_event_class_code   := 'X';
2685   -- bug6773534 p_hdr_grp_rec.applied_to_entity_code        := 'X';
2686   -- bug6773534 p_hdr_grp_rec.applied_to_trx_id             := -999;
2687   -- bug6773534 p_hdr_grp_rec.applied_to_line_id            := -999;
2688   p_hdr_grp_rec.tax_exemption_id              := -999;
2689   p_hdr_grp_rec.tax_rate_before_exemption     := -999;
2690   p_hdr_grp_rec.tax_rate_name_before_exemption := 'X';
2691   p_hdr_grp_rec.exempt_rate_modifier          := -999;
2692   p_hdr_grp_rec.exempt_certificate_number     := 'X';
2693   p_hdr_grp_rec.exempt_reason                 := 'X';
2694   p_hdr_grp_rec.exempt_reason_code            := 'X';
2695   p_hdr_grp_rec.tax_exception_id              := -999;
2696   p_hdr_grp_rec.tax_rate_before_exception     := -999;
2697   p_hdr_grp_rec.tax_rate_name_before_exception := 'X';
2698   p_hdr_grp_rec.exception_rate                := -999;
2699   p_hdr_grp_rec.ledger_id                     := -999;
2700   p_hdr_grp_rec.legal_entity_id               := -999;
2701   p_hdr_grp_rec.establishment_id              := -999;
2702   p_hdr_grp_rec.currency_conversion_date      := SYSDATE;
2703   p_hdr_grp_rec.currency_conversion_type      := 'X';
2704   p_hdr_grp_rec.currency_conversion_rate      := -999;
2705   p_hdr_grp_rec.record_type_code              := 'X';
2706 
2707   IF (g_level_procedure >= g_current_runtime_level ) THEN
2708 
2709     FND_LOG.STRING(g_level_procedure,
2710                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.init_header_group.END',
2711                    'ZX_TDS_TAX_ROUNDING_PKG: init_header_group(-)'||p_return_status);
2712   END IF;
2713 
2714 EXCEPTION
2715   WHEN OTHERS THEN
2716     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2717     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
2718 
2719     IF (g_level_unexpected >= g_current_runtime_level ) THEN
2720       FND_LOG.STRING(g_level_unexpected,
2721                      'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.init_header_group ',
2722                       p_error_buffer);
2723     END IF;
2724 
2725 END init_header_group;
2726 -----------------------------------------------------------------------
2727 --  PRIVATE PROCEDURE
2728 --  determine_header_group
2729 --
2730 --  DESCRIPTION
2731 --  This procedure determines if the current grouping criterias belong to
2732 --  the same header rounding group or not
2733 --
2734 
2735 PROCEDURE  determine_header_group(
2736              p_prev_hdr_grp_rec         IN            HDR_GRP_REC_TYPE,
2737              p_curr_hdr_grp_rec         IN            HDR_GRP_REC_TYPE,
2738              p_same_tax                    OUT NOCOPY VARCHAR2,
2739              p_return_status               OUT NOCOPY VARCHAR2,
2740              p_error_buffer                OUT NOCOPY VARCHAR2
2741          )
2742 IS
2743 
2744 BEGIN
2745 
2746   IF (g_level_procedure >= g_current_runtime_level ) THEN
2747     FND_LOG.STRING(g_level_procedure,
2748                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.determine_header_group.BEGIN',
2749                    'ZX_TDS_TAX_ROUNDING_PKG: determine_header_group(+)');
2750   END IF;
2751 
2752   p_return_status  := FND_API.G_RET_STS_SUCCESS;
2753 
2754   -- bug6773534: remove applied_to information from header grouping critera
2755 
2756   IF (NVL(p_prev_hdr_grp_rec.tax_regime_code, 'X')              <>
2757                      NVL(p_curr_hdr_grp_rec.tax_regime_code , 'X')OR
2758       NVL(p_prev_hdr_grp_rec.tax, 'X')                          <>
2759                      NVL(p_curr_hdr_grp_rec.tax, 'X') OR
2760       NVL(p_prev_hdr_grp_rec.tax_status_code, 'X')              <>
2761                      NVL(p_curr_hdr_grp_rec.tax_status_code, 'X') OR
2762       NVL(p_prev_hdr_grp_rec.tax_rate_code, 'X')                <>
2763                      NVL(p_curr_hdr_grp_rec.tax_rate_code, 'X') OR
2764       NVL(p_prev_hdr_grp_rec.tax_rate, -999)                     <>
2765                      NVL(p_curr_hdr_grp_rec.tax_rate, -999)  OR
2766       NVL(p_prev_hdr_grp_rec.tax_rate_id, -999)                     <>
2767                      NVL(p_curr_hdr_grp_rec.tax_rate_id, -999)  OR
2768       NVL(p_prev_hdr_grp_rec.tax_jurisdiction_code, 'X')                     <>
2769                      NVL(p_curr_hdr_grp_rec.tax_jurisdiction_code, 'X')  OR
2770       NVL(p_prev_hdr_grp_rec.taxable_basis_formula, 'X')        <>
2771                      NVL(p_curr_hdr_grp_rec.taxable_basis_formula, 'X')  OR
2772       NVL(p_prev_hdr_grp_rec.tax_calculation_formula, 'X')      <>
2773                      NVL(p_curr_hdr_grp_rec.tax_calculation_formula, 'X') OR
2774       NVL(p_prev_hdr_grp_rec.Tax_Amt_Included_Flag,'X')   <>
2775                      NVL(p_curr_hdr_grp_rec.Tax_Amt_Included_Flag,'X') OR
2776       NVL(p_prev_hdr_grp_rec.compounding_tax_flag,'X')    <>
2777                      NVL(p_curr_hdr_grp_rec.compounding_tax_flag,'X')  OR
2778       NVL(p_prev_hdr_grp_rec.historical_flag,'X')              <>
2779                      NVL(p_curr_hdr_grp_rec.historical_flag,'X')  OR
2780       NVL(p_prev_hdr_grp_rec.self_assessed_flag,'X')           <>
2781                      NVL(p_curr_hdr_grp_rec.self_assessed_flag,'X')  OR
2782    -- NVL(p_prev_hdr_grp_rec.overridden_flag,'X')              <>
2783    --                  NVL(p_curr_hdr_grp_rec.overridden_flag,'X')  OR
2784       NVL(p_prev_hdr_grp_rec.manually_entered_flag,'X')        <>
2785                      NVL(p_curr_hdr_grp_rec.manually_entered_flag,'X')  OR
2786       --NVL(p_prev_hdr_grp_rec.Copied_From_Other_Doc_Flag,'X')     <>
2787        --              NVL(p_curr_hdr_grp_rec.Copied_From_Other_Doc_Flag,'X')  OR
2788       --NVL(p_prev_hdr_grp_rec.associated_child_frozen_flag,'X') <>
2789       --               NVL(p_curr_hdr_grp_rec.associated_child_frozen_flag,'X')  OR
2790       NVL(p_prev_hdr_grp_rec.tax_only_line_flag,'X')        <>
2791                      NVL(p_curr_hdr_grp_rec.tax_only_line_flag,'X')   OR
2792       NVL(p_prev_hdr_grp_rec.mrc_tax_line_flag,'X')  <>
2793                      NVL(p_curr_hdr_grp_rec.mrc_tax_line_flag,'X') OR
2794       NVL(p_prev_hdr_grp_rec.reporting_only_flag,'X')  <>
2795                      NVL(p_curr_hdr_grp_rec.reporting_only_flag,'X')  OR
2796       NVL(p_prev_hdr_grp_rec.applied_from_application_id, -999)        <>
2797                      NVL(p_curr_hdr_grp_rec.applied_from_application_id, -999)    OR
2798       NVL(p_prev_hdr_grp_rec.applied_from_event_class_code, 'X')        <>
2799                      NVL(p_curr_hdr_grp_rec.applied_from_event_class_code, 'X')    OR
2800       NVL(p_prev_hdr_grp_rec.applied_from_entity_code, 'X')        <>
2801                      NVL(p_curr_hdr_grp_rec.applied_from_entity_code, 'X')    OR
2802       NVL(p_prev_hdr_grp_rec.applied_from_trx_id, -999)        <>
2803                      NVL(p_curr_hdr_grp_rec.applied_from_trx_id, -999)    OR
2804       NVL(p_prev_hdr_grp_rec.applied_from_line_id, -999)        <>
2805                      NVL(p_curr_hdr_grp_rec.applied_from_line_id, -999)    OR
2806       NVL(p_prev_hdr_grp_rec.adjusted_doc_application_id, -999)      <>
2807                      NVL(p_curr_hdr_grp_rec.adjusted_doc_application_id, -999)    OR
2808       NVL(p_prev_hdr_grp_rec.adjusted_doc_entity_code, 'X')      <>
2809                      NVL(p_curr_hdr_grp_rec.adjusted_doc_entity_code, 'X')    OR
2810       NVL(p_prev_hdr_grp_rec.adjusted_doc_event_class_code, 'X')      <>
2811                      NVL(p_curr_hdr_grp_rec.adjusted_doc_event_class_code, 'X')    OR
2812       NVL(p_prev_hdr_grp_rec.adjusted_doc_trx_id, -999)      <>
2813                      NVL(p_curr_hdr_grp_rec.adjusted_doc_trx_id, -999)    OR
2814       --  NVL(p_prev_hdr_grp_rec.applied_to_application_id, -999)      <>
2815       --  NVL(p_curr_hdr_grp_rec.applied_to_application_id, -999)    OR
2816       -- NVL(p_prev_hdr_grp_rec.applied_to_event_class_code, 'X')      <>
2817       --                NVL(p_curr_hdr_grp_rec.applied_to_event_class_code, 'X')    OR
2818       -- NVL(p_prev_hdr_grp_rec.applied_to_entity_code, 'X')      <>
2819       --                NVL(p_curr_hdr_grp_rec.applied_to_entity_code, 'X')    OR
2820       -- NVL(p_prev_hdr_grp_rec.applied_to_trx_id, -999)      <>
2821       --                NVL(p_curr_hdr_grp_rec.applied_to_trx_id, -999)    OR
2822       -- NVL(p_prev_hdr_grp_rec.applied_to_line_id, -999)      <>
2823       --                NVL(p_curr_hdr_grp_rec.applied_to_line_id, -999)    OR
2824       NVL(p_prev_hdr_grp_rec.tax_exemption_id, -999)      <>
2825                      NVL(p_curr_hdr_grp_rec.tax_exemption_id, -999)    OR
2826     --  NVL(p_prev_hdr_grp_rec.tax_rate_before_exemption, -999)      <>
2827     --                 NVL(p_curr_hdr_grp_rec.tax_rate_before_exemption, -999)    OR
2828     --  NVL(p_prev_hdr_grp_rec.tax_rate_name_before_exemption, 'X')      <>
2829    --                  NVL(p_curr_hdr_grp_rec.tax_rate_name_before_exemption, 'X')    OR
2830   --    NVL(p_prev_hdr_grp_rec.exempt_rate_modifier, -999)      <>
2831   --                   NVL(p_curr_hdr_grp_rec.exempt_rate_modifier, -999)    OR
2832       NVL(p_prev_hdr_grp_rec.exempt_certificate_number, 'X')      <>
2833                      NVL(p_curr_hdr_grp_rec.exempt_certificate_number, 'X')    OR
2834  --     NVL(p_prev_hdr_grp_rec.exempt_reason, 'X')      <>
2835  --                    NVL(p_curr_hdr_grp_rec.exempt_reason, 'X')    OR
2836       NVL(p_prev_hdr_grp_rec.exempt_reason_code, 'X')      <>
2837                      NVL(p_curr_hdr_grp_rec.exempt_reason_code, 'X')    OR
2838       NVL(p_prev_hdr_grp_rec.tax_exception_id, -999)      <>
2839                      NVL(p_curr_hdr_grp_rec.tax_exception_id, -999)    OR
2840  --   NVL(p_prev_hdr_grp_rec.tax_rate_before_exception, -999)      <>
2841  --                    NVL(p_curr_hdr_grp_rec.tax_rate_before_exception, -999)    OR
2842  --     NVL(p_prev_hdr_grp_rec.tax_rate_name_before_exception, 'X')      <>
2843  --                    NVL(p_curr_hdr_grp_rec.tax_rate_name_before_exception, 'X')    OR
2844  --     NVL(p_prev_hdr_grp_rec.exception_rate, -999) <>
2845  --                    NVL(p_curr_hdr_grp_rec.exception_rate, -999) OR
2846       NVL(p_prev_hdr_grp_rec.ledger_id, -999)   <>
2847                      NVL(p_curr_hdr_grp_rec.ledger_id, -999) OR
2848       NVL(p_prev_hdr_grp_rec.legal_entity_id, -999)   <>
2849                      NVL(p_curr_hdr_grp_rec.legal_entity_id, -999) OR
2850       NVL(p_prev_hdr_grp_rec.establishment_id, -999)   <>
2851                      NVL(p_curr_hdr_grp_rec.establishment_id, -999) OR
2852       TRUNC(NVL(p_prev_hdr_grp_rec.currency_conversion_date, SYSDATE ) ) <>
2853                      TRUNC(NVL(p_curr_hdr_grp_rec.currency_conversion_date, SYSDATE )) OR
2854       NVL(p_prev_hdr_grp_rec.currency_conversion_type, 'X')  <>
2855                      NVL(p_curr_hdr_grp_rec.currency_conversion_type, 'X')  OR
2856       NVL(p_prev_hdr_grp_rec.currency_conversion_rate, -999)   <>
2857                      NVL(p_curr_hdr_grp_rec.currency_conversion_rate, -999) OR
2858       NVL(p_prev_hdr_grp_rec.record_type_code,'X')   <>
2859                      NVL(p_curr_hdr_grp_rec.record_type_code,'X')
2860    )   THEN
2861     IF (g_level_statement >= g_current_runtime_level ) THEN
2862       FND_LOG.STRING(g_level_statement,
2863                      'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.determine_header_group',
2864                      ' SAME tax N');
2865    END IF;
2866     p_same_tax := 'N';
2867   ELSE
2868     IF (g_level_statement >= g_current_runtime_level ) THEN
2869       FND_LOG.STRING(g_level_statement,
2870                      'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.determine_header_group',
2871                      ' SAME tax Y');
2872    END IF;
2873     p_same_tax := 'Y';
2874   END IF;
2875 
2876   IF p_same_tax = 'N' THEN
2877     --
2878     -- this is a new header group
2879     --
2880 
2881     IF (g_level_statement >= g_current_runtime_level ) THEN
2882       FND_LOG.STRING(g_level_statement,
2883                      'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.determine_header_group',
2884                      ' New header rounding group '||
2885                      'tax_regime_code = ' || p_curr_hdr_grp_rec.tax_regime_code||
2886                      'tax = ' || p_curr_hdr_grp_rec.tax||
2887                      'tax_status_code = ' || p_curr_hdr_grp_rec.tax_status_code||
2888                      'tax_rate_code = ' || p_curr_hdr_grp_rec.tax_rate_code||
2889                      'tax_rate = ' || to_char(p_curr_hdr_grp_rec.tax_rate)||
2890                      'tax_rate_id = ' || to_char(p_curr_hdr_grp_rec.tax_rate_id)||
2891                      'tax_jurisdiction_code = ' ||
2892                      p_curr_hdr_grp_rec.tax_jurisdiction_code||
2893                      'taxable_basis_formula = ' ||
2894                      p_curr_hdr_grp_rec.taxable_basis_formula||
2895                      'tax_calculation_formula = ' ||
2896                      p_curr_hdr_grp_rec.tax_calculation_formula||
2897                      'Tax_Amt_Included_Flag = ' ||
2898                      p_curr_hdr_grp_rec.Tax_Amt_Included_Flag||
2899                      'compounding_tax_flag = ' ||
2900                      p_curr_hdr_grp_rec.compounding_tax_flag ||
2901                      'historical_flag = ' || p_curr_hdr_grp_rec.historical_flag ||
2902                      'self_assessed_flag = ' ||
2903                      p_curr_hdr_grp_rec.self_assessed_flag||
2904                      'overridden_flag = ' || p_curr_hdr_grp_rec.overridden_flag ||
2905                      'manually_entered_flag = ' ||
2906                      p_curr_hdr_grp_rec.manually_entered_flag ||
2907                      'Copied_From_Other_Doc_Flag = ' ||
2908                      p_curr_hdr_grp_rec.Copied_From_Other_Doc_Flag||
2909                      'associated_child_frozen_flag = ' ||
2910                       p_curr_hdr_grp_rec.associated_child_frozen_flag ||
2911                      'tax_only_line_flag = ' ||
2912                      p_curr_hdr_grp_rec.tax_only_line_flag||
2913                      'mrc_tax_line_flag = ' ||
2914                      p_curr_hdr_grp_rec.mrc_tax_line_flag||
2915                      'reporting_only_flag = ' ||
2916                      p_curr_hdr_grp_rec.reporting_only_flag||
2917                      'applied_from_application_id        = ' ||
2918                      to_char(p_curr_hdr_grp_rec.applied_from_application_id ) ||
2919                      'applied_from_event_class_code        = ' ||
2920                      p_curr_hdr_grp_rec.applied_from_event_class_code  ||
2921                      'applied_from_entity_code        = ' ||
2922                      p_curr_hdr_grp_rec.applied_from_entity_code  ||
2923                      'applied_from_trx_id        = ' ||
2924                      to_char(p_curr_hdr_grp_rec.applied_from_trx_id  ) ||
2925                      'applied_from_line_id = ' ||
2926                      to_char(p_curr_hdr_grp_rec.applied_from_line_id  ) ||
2927                      'adjusted_doc_application_id  = ' ||
2928                      to_char(p_curr_hdr_grp_rec.adjusted_doc_application_id )  ||
2929                      'adjusted_doc_entity_code  = ' ||
2930                      p_curr_hdr_grp_rec.adjusted_doc_entity_code   ||
2931                      'adjusted_doc_event_class_code      = ' ||
2932                      p_curr_hdr_grp_rec.adjusted_doc_event_class_code ||
2933                      'adjusted_doc_trx_id = ' ||
2934                      to_char(p_curr_hdr_grp_rec.adjusted_doc_trx_id   ) );
2935 
2936       FND_LOG.STRING(g_level_statement,
2937                      'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.determine_header_group',
2938                      'tax_exemption_id = ' ||
2939                      to_char(p_curr_hdr_grp_rec.tax_exemption_id ) ||
2940                      'tax_rate_before_exemption = ' ||
2941                      to_char(p_curr_hdr_grp_rec.tax_rate_before_exemption  )||
2942                      'tax_rate_name_before_exemption = ' ||
2943                      p_curr_hdr_grp_rec.tax_rate_name_before_exemption ||
2944                      'exempt_rate_modifier = ' ||
2945                      to_char(p_curr_hdr_grp_rec.exempt_rate_modifier ) ||
2946                      'exempt_certificate_number = ' ||
2947                      p_curr_hdr_grp_rec.exempt_certificate_number ||
2948                      'exempt_reason = ' ||
2949                      p_curr_hdr_grp_rec.exempt_reason ||
2950                      'exempt_reason_code = ' ||
2951                      p_curr_hdr_grp_rec.exempt_reason_code ||
2952                      'tax_exception_id = ' ||
2953                      to_char(p_curr_hdr_grp_rec.tax_exception_id    )||
2954                      'tax_rate_before_exception = ' ||
2955                      to_char(p_curr_hdr_grp_rec.tax_rate_before_exception    )||
2956                      'tax_rate_name_before_exception = ' ||
2957                      p_curr_hdr_grp_rec.tax_rate_name_before_exception||
2958                      'exception_rate = ' ||
2959                      to_char(p_curr_hdr_grp_rec.exception_rate)||
2960                      'ledger_id = ' ||
2961                      to_char(p_curr_hdr_grp_rec.ledger_id)||
2962                      'legal_entity_id = ' ||
2963                      to_char(p_curr_hdr_grp_rec.legal_entity_id)||
2964                      'establishment_id = ' ||
2965                      to_char(p_curr_hdr_grp_rec.establishment_id)||
2966                      'currency_conversion_date = ' ||
2967                      to_char(p_curr_hdr_grp_rec.currency_conversion_date, 'DD-MON-YY')||
2968                      'currency_conversion_type = ' ||
2969                      p_curr_hdr_grp_rec.currency_conversion_type||
2970                      'currency_conversion_rate = ' ||
2971                      to_char(p_curr_hdr_grp_rec.currency_conversion_rate)||
2972                      'record_type_code  = ' ||
2973                      p_curr_hdr_grp_rec.record_type_code );
2974 
2975     END IF;
2976 
2977   END IF;
2978 
2979   IF (g_level_procedure >= g_current_runtime_level ) THEN
2980 
2981     FND_LOG.STRING(g_level_procedure,
2982                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.determine_header_group.END',
2983                    'ZX_TDS_TAX_ROUNDING_PKG: determine_header_group(-)'||
2984                    p_return_status);
2985   END IF;
2986 
2987 EXCEPTION
2988   WHEN OTHERS THEN
2989     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2990     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
2991     IF (g_level_unexpected >= g_current_runtime_level ) THEN
2992       FND_LOG.STRING(g_level_unexpected,
2993                      'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.determine_header_group' ,
2994                       p_error_buffer);
2995     END IF;
2996 
2997 END determine_header_group;
2998 -----------------------------------------------------------------------
2999 --  PRIVATE PROCEDURE
3000 --  get_currency_info_for_rounding
3001 --
3002 --  DESCRIPTION
3003 --  This procedure gets all information about  a  given currency
3004 --  to be used later for conversion and rounding
3005 --
3006 
3007 PROCEDURE  get_currency_info_for_rounding(
3008              p_currency_code     IN     ZX_LINES.TRX_CURRENCY_CODE%TYPE,
3009              p_conversion_date   IN     ZX_LINES.CURRENCY_CONVERSION_DATE%TYPE,
3010              p_return_status     OUT NOCOPY VARCHAR2,
3011              p_error_buffer      OUT NOCOPY VARCHAR2
3012          )
3013 IS
3014   l_currency_type              VARCHAR2(30);
3015   l_derive_effective           DATE;
3016   l_derive_type                VARCHAR2(30);
3017   l_mau                        NUMBER;
3018   l_precision                  NUMBER;
3019   l_conversion_rate            NUMBER;
3020 
3021 BEGIN
3022 
3023   IF (g_level_statement >= g_current_runtime_level ) THEN
3024     FND_LOG.STRING(g_level_statement,
3025                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.get_currency_info_for_rounding.BEGIN',
3026                    'ZX_TDS_TAX_ROUNDING_PKG: get_currency_info_for_rounding(+)'||
3027                    'p_currency_code = ' || p_currency_code);
3028   END IF;
3029 
3030   p_return_status :=  FND_API.G_RET_STS_SUCCESS;
3031 
3032   --
3033   -- first check if currency info can be obtained from the cache structure
3034   -- if not, call get_currency_info to get it
3035   --
3036   IF g_currency_tbl.EXISTS(p_currency_code) THEN
3037     IF (g_currency_tbl(p_currency_code).derive_type = 'EMU' AND
3038         (p_conversion_date <>
3039          g_currency_tbl(p_currency_code).conversion_date))  THEN
3040       l_derive_effective := g_currency_tbl(p_currency_code).derive_effective;
3041       g_currency_tbl(p_currency_code).conversion_date := p_conversion_date;
3042       IF ( trunc(p_conversion_date) < trunc(l_derive_effective))  THEN
3043         g_currency_tbl(p_currency_code).currency_type := 'OTHER';
3044       ELSE
3045         g_currency_tbl(p_currency_code).currency_type := 'EMU';
3046       END IF;
3047     END IF;
3048   ELSE
3049     get_currency_info(p_currency_code,
3050                       p_conversion_date,
3051                       l_derive_effective,
3052                       l_derive_type,
3053                       l_conversion_rate,
3054                       l_mau,
3055                       l_precision,
3056                       l_currency_type,
3057                       p_return_status,
3058                       p_error_buffer);
3059     IF p_return_status = FND_API.G_RET_STS_SUCCESS THEN
3060       g_currency_tbl(p_currency_code).min_acct_unit := l_mau;
3061       g_currency_tbl(p_currency_code).precision := l_precision;
3062       g_currency_tbl(p_currency_code).conversion_rate := l_conversion_rate;
3063       g_currency_tbl(p_currency_code).currency_type := l_currency_type;
3064       g_currency_tbl(p_currency_code).derive_effective := l_derive_effective;
3065       g_currency_tbl(p_currency_code).derive_type := l_derive_type;
3066       g_currency_tbl(p_currency_code).conversion_date := p_conversion_date;
3067     END IF;
3068   END IF;
3069 
3070   IF (g_level_statement >= g_current_runtime_level ) THEN
3071 
3072     FND_LOG.STRING(g_level_statement,
3073                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.get_currency_info_for_rounding.END',
3074                    'ZX_TDS_TAX_ROUNDING_PKG: get_currency_info_for_rounding(-)'||p_return_status);
3075   END IF;
3076 
3077 EXCEPTION
3078   WHEN OTHERS THEN
3079     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3080     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
3081 
3082     IF (g_level_unexpected >= g_current_runtime_level ) THEN
3083       FND_LOG.STRING(g_level_unexpected,
3084                      'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.get_currency_info_for_rounding',
3085                       p_error_buffer);
3086     END IF;
3087 
3088 END get_currency_info_for_rounding;
3089 -----------------------------------------------------------------------
3090 --  PUBLIC PROCEDURE
3091 --  convert_to_currency
3092 --
3093 --  DESCRIPTION
3094 --  This procedure converts amount from from_currency to to_currency
3095 --
3096 
3097 PROCEDURE  convert_to_currency(
3098              p_from_currency        IN     ZX_LINES.TRX_CURRENCY_CODE%TYPE,
3099              p_to_currency          IN     ZX_LINES.TAX_CURRENCY_CODE%TYPE,
3100              p_conversion_date      IN     ZX_LINES.tax_currency_conversion_date%TYPE,
3101              p_tax_conversion_type  IN     ZX_LINES.TAX_CURRENCY_CONVERSION_TYPE%TYPE,
3102              p_trx_conversion_type  IN     ZX_LINES.CURRENCY_CONVERSION_TYPE%TYPE,
3103              p_to_curr_conv_rate    IN OUT NOCOPY ZX_LINES.TAX_CURRENCY_CONVERSION_RATE%TYPE,
3104              p_from_amt             IN     ZX_LINES.TAX_AMT%TYPE,
3105              p_to_amt                  OUT NOCOPY ZX_LINES.TAX_AMT_TAX_CURR%TYPE,
3106              p_return_status           OUT NOCOPY VARCHAR2,
3107              p_error_buffer            OUT NOCOPY VARCHAR2,
3108              p_trx_conversion_date  IN ZX_LINES.CURRENCY_CONVERSION_DATE%TYPE DEFAULT NULL) --Bug7183884
3109 IS
3110   l_rate_index                      BINARY_INTEGER;
3111 BEGIN
3112 
3113   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
3114 
3115   IF (g_level_statement >= g_current_runtime_level ) THEN
3116     FND_LOG.STRING(g_level_statement,
3117                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.convert_to_currency.BEGIN',
3118                    'ZX_TDS_TAX_ROUNDING_PKG: convert_to_currency(+)'||
3119                    'p_to_curr_conv_rate = ' || to_char(p_to_curr_conv_rate));
3120   END IF;
3121 
3122   p_return_status :=  FND_API.G_RET_STS_SUCCESS;
3123 
3124   --
3125   -- if currency conversion rate is available, use it, otherwise,
3126   -- check if it exists in cache, if not, call convert_amount to get
3127   -- the currency conversion rate
3128   --
3129   IF (p_to_curr_conv_rate IS NOT NULL ) THEN
3130    p_to_amt     := p_from_amt * p_to_curr_conv_rate;
3131   ELSE
3132     --
3133     -- conversion rate is not available
3134     -- check if conversion type is available
3135     --
3136     IF p_tax_conversion_type IS NULL THEN
3137       p_to_amt := NULL;
3138 
3139       IF (g_level_statement >= g_current_runtime_level ) THEN
3140         FND_LOG.STRING(g_level_statement,
3141                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.convert_to_currency',
3142                    'ZX_TDS_TAX_ROUNDING_PKG: convert_to_currency(+)'||
3143                    ' both conversion type and rate are NULL ' );
3144       END IF;
3145 
3146       RETURN;
3147     END IF;
3148 
3149     l_rate_index := get_rate_index(p_from_currency,
3150                                    p_to_currency,
3151                                    p_conversion_date,
3152                                    p_tax_conversion_type);
3153     IF g_tax_curr_conv_rate_tbl.EXISTS(l_rate_index) THEN
3154 
3155       IF (g_level_statement >= g_current_runtime_level ) THEN
3156         FND_LOG.STRING(g_level_statement,
3157                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.convert_to_currency',
3158                    'get rate from cache, at index = ' ||
3159                     to_char(l_rate_index));
3160       END IF;
3161 
3162       p_to_curr_conv_rate    := g_tax_curr_conv_rate_tbl(l_rate_index);
3163       p_to_amt               := p_from_amt * p_to_curr_conv_rate;
3164     ELSE
3165       p_to_amt := convert_amount(
3166                                 p_from_currency,
3167                                 p_to_currency,
3168                                 p_conversion_date,
3169                                 p_tax_conversion_type,
3170                                 p_trx_conversion_type,
3171                                 p_from_amt,
3172                                 l_rate_index,
3173                                 p_return_status,
3174                                 p_error_buffer,
3175                                 p_trx_conversion_date);--Bug7183884
3176       IF p_return_status = FND_API.G_RET_STS_SUCCESS THEN
3177         p_to_curr_conv_rate   := g_tax_curr_conv_rate_tbl(l_rate_index);
3178       END IF;
3179     END IF;
3180   END IF;
3181 
3182   IF (g_level_statement >= g_current_runtime_level ) THEN
3183 
3184     FND_LOG.STRING(g_level_statement,
3185                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.convert_to_currency.END',
3186                    'ZX_TDS_TAX_ROUNDING_PKG: convert_to_currency(-)'||
3187                     'conversion rate = ' || to_char(p_to_curr_conv_rate)||
3188                     'p_return_status = ' || p_return_status);
3189   END IF;
3190 
3191 EXCEPTION
3192   WHEN OTHERS THEN
3193     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3194     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
3195 
3196     IF (g_level_unexpected >= g_current_runtime_level ) THEN
3197       FND_LOG.STRING(g_level_unexpected,
3198                      'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.convert_to_currency',
3199                       p_error_buffer);
3200     END IF;
3201 
3202 END convert_to_currency;
3203 -----------------------------------------------------------------------
3204 --  PUBLIC  FUNCTION
3205 --  round_tax_funcl_curr
3206 --
3207 --  DESCRIPTION
3208 --  This function gets the minimum accountable unit and precision of
3209 --  a functional currency from fnd_currencies based on the ledger id,
3210 --  then rounds the tax amount in functional currency using ROUND function
3211 
3212 FUNCTION round_tax_funcl_curr(
3213              p_unround_amt   IN             ZX_LINES.TAX_AMT%TYPE,
3214              p_ledger_id     IN             ZX_LINES.LEDGER_ID%TYPE,
3215              p_return_status     OUT NOCOPY VARCHAR2,
3216              p_error_buffer      OUT NOCOPY VARCHAR2
3217          )  RETURN NUMBER
3218 IS
3219   l_round_amt             ZX_LINES.TAX_AMT_TAX_CURR%TYPE;
3220   l_min_acct_unit         FND_CURRENCIES.MINIMUM_ACCOUNTABLE_UNIT%TYPE;
3221   l_precision             FND_CURRENCIES.PRECISION%TYPE;
3222   l_currency_code         FND_CURRENCIES.CURRENCY_CODE%TYPE;
3223 
3224 BEGIN
3225 
3226   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
3227 
3228   IF (g_level_procedure >= g_current_runtime_level ) THEN
3229     FND_LOG.STRING(g_level_procedure,
3230                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.round_tax_funcl_curr.BEGIN',
3231                    'ZX_TDS_TAX_ROUNDING_PKG: round_tax_funcl_curr(+)'||
3232                    ' unround amount in functional currency = ' ||
3233                     to_char(p_unround_amt));
3234 
3235   END IF;
3236 
3237   p_return_status :=  FND_API.G_RET_STS_SUCCESS;
3238 
3239   --
3240   -- perform rounding for amount in  functional currency
3241   --
3242 
3243   get_funcl_curr_info(
3244                     p_ledger_id,
3245                     l_currency_code,
3246                     l_min_acct_unit,
3247                     l_precision,
3248                     p_return_status,
3249                     p_error_buffer );
3250 
3251 
3252   IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
3253     --
3254     -- error getting min acct unit and precision
3255     -- return original unround amount to caller
3256     --
3257     RETURN p_unround_amt;
3258   END IF;
3259 
3260   --
3261   -- l_min_acct_unit will contain the precision if
3262   -- min acct unit of this functional currency is null
3263   --
3264   IF (g_level_statement >= g_current_runtime_level ) THEN
3265     FND_LOG.STRING(g_level_statement,
3266                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.round_tax_funcl_curr',
3267                    'l_min_acct_unit = '  || to_char(l_min_acct_unit)||
3268                    ' l_precision = '  || to_char(l_precision) );
3269   END IF;
3270 
3271   l_round_amt := ROUND(p_unround_amt/l_min_acct_unit) * l_min_acct_unit;
3272 
3273 
3274   IF (g_level_procedure >= g_current_runtime_level ) THEN
3275 
3276     FND_LOG.STRING(g_level_procedure,
3277                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.round_tax_funcl_curr.END',
3278                    'ZX_TDS_TAX_ROUNDING_PKG: round_tax_funcl_curr(-)'||
3279                    'unround amount in functional currency = ' ||
3280                     to_char(p_unround_amt)||
3281                    'rounded amount in functional currency = ' ||
3282                     to_char(l_round_amt));
3283   END IF;
3284 
3285 
3286   RETURN l_round_amt;
3287 
3288 EXCEPTION
3289   WHEN OTHERS THEN
3290     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3291     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
3292 
3293     IF (g_level_unexpected >= g_current_runtime_level ) THEN
3294       FND_LOG.STRING(g_level_unexpected,
3295                      'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.round_tax_funcl_curr',
3296                       p_error_buffer);
3297     END IF;
3298 
3299 END round_tax_funcl_curr;
3300 -----------------------------------------------------------------------
3301 --  PRIVATE PROCEDURE
3302 --  conv_rnd_tax_tax_curr
3303 --
3304 --  DESCRIPTION
3305 --  This procedure converts the tax amount in transaction currency to tax
3306 --  currency and then round the converted amount
3307 --
3308 
3309 PROCEDURE  conv_rnd_tax_tax_curr(
3310              p_from_currency        IN     ZX_LINES.TRX_CURRENCY_CODE%TYPE,
3311              p_to_currency          IN     ZX_LINES.TAX_CURRENCY_CODE%TYPE,
3312              p_conversion_date      IN     ZX_LINES.TAX_CURRENCY_CONVERSION_DATE%TYPE,
3313              p_tax_conversion_type  IN     ZX_LINES.TAX_CURRENCY_CONVERSION_TYPE%TYPE,
3314              p_trx_conversion_type  IN     ZX_LINES.CURRENCY_CONVERSION_TYPE%TYPE,
3315              p_tax_curr_conv_rate   IN OUT NOCOPY ZX_LINES.TAX_CURRENCY_CONVERSION_RATE%TYPE,
3316              p_amt                  IN     ZX_LINES.TAX_AMT%TYPE,
3317              p_convert_round_amt        OUT NOCOPY ZX_LINES.TAX_AMT_TAX_CURR%TYPE,
3318              p_Rounding_Rule_Code        IN     ZX_TAXES_B.Rounding_Rule_Code%TYPE,
3319              p_tax_min_acct_unit    IN     ZX_TAXES_B.MINIMUM_ACCOUNTABLE_UNIT%TYPE,
3320              p_tax_precision        IN     ZX_TAXES_B.TAX_PRECISION%TYPE,
3321              p_return_status           OUT NOCOPY VARCHAR2,
3322              p_error_buffer            OUT NOCOPY VARCHAR2,
3323              p_trx_conversion_date  IN ZX_LINES.CURRENCY_CONVERSION_DATE%TYPE DEFAULT NULL)--Bug7183884
3324 IS
3325   l_amt_tax_curr                 NUMBER;
3326 
3327 BEGIN
3328 
3329   IF (g_level_statement >= g_current_runtime_level ) THEN
3330     FND_LOG.STRING(g_level_statement,
3331                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.conv_rnd_tax_tax_curr.BEGIN',
3332                    'ZX_TDS_TAX_ROUNDING_PKG: conv_rnd_tax_tax_curr(+)'||
3333                    'p_tax_curr_conv_rate = ' || to_char(p_tax_curr_conv_rate));
3334 
3335   END IF;
3336 
3337   p_return_status :=  FND_API.G_RET_STS_SUCCESS;
3338 
3339   --
3340   -- convert tax amt to tax currency
3341   --
3342   convert_to_currency(
3343                       p_from_currency,
3344                       p_to_currency,
3345                       p_conversion_date,
3346                       p_tax_conversion_type,
3347                       p_trx_conversion_type,
3348                       p_tax_curr_conv_rate,
3349                       p_amt,
3350                       l_amt_tax_curr,
3351                       p_return_status,
3352                       p_error_buffer,
3353                       p_trx_conversion_date);--Bug7183884
3354 
3355   IF (g_level_statement >= g_current_runtime_level ) THEN
3356     FND_LOG.STRING(g_level_statement,
3357                  'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.conv_rnd_tax_tax_curr',
3358                   'tax conversion rate = ' || to_char(p_tax_curr_conv_rate)||
3359                  'unround tax amt tax currency = ' || to_char(l_amt_tax_curr));
3360   END IF;
3361 
3362   IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
3363     RETURN;
3364   END IF;
3365 
3366   --
3367   -- round the converted amount
3368   --
3369   p_convert_round_amt := round_tax(l_amt_tax_curr,
3370                                    p_Rounding_Rule_Code,
3371                                    p_tax_min_acct_unit,
3372                                    p_tax_precision,
3373                                    p_return_status,
3374                                    p_error_buffer);
3375 
3376   IF (g_level_statement >= g_current_runtime_level ) THEN
3377 
3378     FND_LOG.STRING(g_level_statement,
3379                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.conv_rnd_tax_tax_curr.END',
3380                    'ZX_TDS_TAX_ROUNDING_PKG: conv_rnd_tax_tax_curr(-)'||
3381                    'rounded amount = ' || to_char(p_convert_round_amt));
3382   END IF;
3383 
3384 EXCEPTION
3385   WHEN OTHERS THEN
3386     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3387     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
3388 
3389     IF (g_level_unexpected >= g_current_runtime_level ) THEN
3390       FND_LOG.STRING(g_level_unexpected,
3391                      'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.conv_rnd_tax_tax_curr',
3392                       p_error_buffer);
3393     END IF;
3394 
3395 END conv_rnd_tax_tax_curr;
3396 
3397 -----------------------------------------------------------------------
3398 --  PRIVATE PROCEDURE
3399 --  conv_rnd_tax_funcl_curr
3400 --
3401 --  DESCRIPTION
3402 --  This procedure converts the tax amount in transaction currency to
3403 --  functional  currency and then round the converted amount
3404 --
3405 
3406 PROCEDURE  conv_rnd_tax_funcl_curr(
3407              p_funcl_curr_conv_rate IN     ZX_LINES.CURRENCY_CONVERSION_RATE%TYPE,
3408              p_amt                  IN     ZX_LINES.TAX_AMT%TYPE,
3409              p_convert_round_amt        OUT NOCOPY ZX_LINES.TAX_AMT_TAX_CURR%TYPE,
3410              p_ledger_id            IN     ZX_LINES.LEDGER_ID%TYPE,
3411              p_return_status           OUT NOCOPY VARCHAR2,
3412              p_error_buffer            OUT NOCOPY VARCHAR2
3413          )
3414 IS
3415   l_amt_funcl_curr        NUMBER;
3416   l_min_acct_unit         FND_CURRENCIES.MINIMUM_ACCOUNTABLE_UNIT%TYPE;
3417   l_precision             FND_CURRENCIES.PRECISION%TYPE;
3418 
3419 BEGIN
3420   IF (g_level_statement >= g_current_runtime_level ) THEN
3421     FND_LOG.STRING(g_level_statement,
3422                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.conv_rnd_tax_funcl_curr.BEGIN',
3423                    'ZX_TDS_TAX_ROUNDING_PKG: conv_rnd_tax_funcl_curr(+)'||
3424                    'p_funcl_curr_conv_rate = ' || to_char(p_funcl_curr_conv_rate));
3425 
3426   END IF;
3427 
3428   p_return_status :=  FND_API.G_RET_STS_SUCCESS;
3429 
3430   l_amt_funcl_curr     :=  p_amt * p_funcl_curr_conv_rate;
3431 
3432   IF l_amt_funcl_curr IS NOT NULL THEN
3433     p_convert_round_amt := round_tax_funcl_curr(
3434                l_amt_funcl_curr,
3435                p_ledger_id,
3436                p_return_status,
3437                p_error_buffer);
3438 
3439      IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
3440        RETURN;
3441      END IF;
3442 
3443   ELSE
3444     --
3445     -- it is okay if functional currency conversion rate is not
3446     -- available, just set the functional currency amount to NULL
3447     --
3448     p_convert_round_amt := NULL;
3449   END IF;
3450 
3451   IF (g_level_statement >= g_current_runtime_level ) THEN
3452 
3453     FND_LOG.STRING(g_level_statement,
3454                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.conv_rnd_tax_funcl_curr.END',
3455                    'ZX_TDS_TAX_ROUNDING_PKG: conv_rnd_tax_funcl_curr(-)'||'convert round amt: '||p_convert_round_amt);
3456   END IF;
3457 
3458 EXCEPTION
3459   WHEN OTHERS THEN
3460     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3461     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
3462 
3463     IF (g_level_unexpected >= g_current_runtime_level ) THEN
3464       FND_LOG.STRING(g_level_unexpected,
3465                      'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.conv_rnd_tax_funcl_curr',
3466                       p_error_buffer);
3467     END IF;
3468 
3469 END conv_rnd_tax_funcl_curr;
3470 -----------------------------------------------------------------------
3471 --  PRIVATE PROCEDURE
3472 --  conv_rnd_taxable_tax_curr
3473 --
3474 --  DESCRIPTION
3475 --  This procedure converts the taxable amount in transaction currency to
3476 --  tax currency and then round the converted amount
3477 --
3478 
3479 PROCEDURE  conv_rnd_taxable_tax_curr(
3480              p_from_currency        IN     ZX_LINES.TRX_CURRENCY_CODE%TYPE,
3481              p_to_currency          IN     ZX_LINES.TAX_CURRENCY_CODE%TYPE,
3482              p_conversion_date      IN     ZX_LINES.TAX_CURRENCY_CONVERSION_DATE%TYPE,
3483              p_tax_conversion_type  IN     ZX_LINES.TAX_CURRENCY_CONVERSION_TYPE%TYPE,
3484              p_trx_conversion_type  IN     ZX_LINES.CURRENCY_CONVERSION_TYPE%TYPE,
3485              p_tax_curr_conv_rate   IN OUT NOCOPY ZX_LINES.TAX_CURRENCY_CONVERSION_RATE%TYPE,
3486              p_amt                  IN     ZX_LINES.TAX_AMT%TYPE,
3487              p_convert_round_amt        OUT NOCOPY ZX_LINES.TAX_AMT_TAX_CURR%TYPE,
3488              p_Rounding_Rule_Code        IN     ZX_TAXES_B.Rounding_Rule_Code%TYPE,
3489              p_tax_min_acct_unit    IN     ZX_TAXES_B.MINIMUM_ACCOUNTABLE_UNIT%TYPE,
3490              p_tax_precision        IN     ZX_TAXES_B.TAX_PRECISION%TYPE,
3491              p_tax_calculation_formula IN         ZX_LINES.TAX_CALCULATION_FORMULA%TYPE,
3492              p_tax_rate                IN         ZX_LINES.TAX_RATE%TYPE,
3493              p_tax_rate_id             IN         ZX_RATES_B.TAX_RATE_ID%TYPE,
3494              p_rounded_amt_tax_curr IN     ZX_LINES.TAX_AMT_TAX_CURR%TYPE,
3495              p_return_status           OUT NOCOPY VARCHAR2,
3496              p_error_buffer            OUT NOCOPY VARCHAR2,
3497              p_trx_conversion_date  IN     ZX_LINES.CURRENCY_CONVERSION_DATE%TYPE DEFAULT NULL) --Bug7183884
3498 
3499 IS
3500   l_amt_tax_curr                 NUMBER;
3501   l_rate_type_code               ZX_RATES_B.RATE_TYPE_CODE%TYPE;
3502   l_tax_rate_rec                  ZX_TDS_UTILITIES_PKG.ZX_RATE_INFO_REC_TYPE;
3503 
3504 BEGIN
3505 
3506   IF (g_level_statement >= g_current_runtime_level ) THEN
3507     FND_LOG.STRING(g_level_statement,
3508                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.conv_rnd_taxable_tax_curr.BEGIN',
3509                    'ZX_TDS_TAX_ROUNDING_PKG: conv_rnd_taxable_tax_curr(+)'||
3510                    'p_tax_curr_conv_rate = ' || to_char(p_tax_curr_conv_rate));
3511 
3512   END IF;
3513 
3514   p_return_status :=  FND_API.G_RET_STS_SUCCESS;
3515 
3516   IF ZX_TDS_UTILITIES_PKG.g_tax_rate_info_tbl.EXISTS(p_tax_rate_id) THEN
3517      l_rate_type_code :=
3518         ZX_TDS_UTILITIES_PKG.g_tax_rate_info_tbl(p_tax_rate_id).rate_type_code;
3519   ELSE
3520     ZX_TDS_UTILITIES_PKG.get_tax_rate_info(
3521        p_tax_rate_id      => p_tax_rate_id,
3522        p_tax_rate_rec     => l_tax_rate_rec,
3523        p_return_status    => p_return_status,
3524        p_error_buffer     => p_error_buffer);
3525 
3526       IF p_return_status = FND_API.G_RET_STS_SUCCESS THEN
3527         l_rate_type_code := l_tax_rate_rec.rate_type_code;
3528       END IF;
3529   END IF;
3530 
3531   IF p_amt IS NOT NULL THEN
3532     convert_to_currency(
3533                       p_from_currency,
3534                       p_to_currency,
3535                       p_conversion_date,
3536                       p_tax_conversion_type,
3537                       p_trx_conversion_type,
3538                       p_tax_curr_conv_rate,
3539                       p_amt,
3540                       l_amt_tax_curr,
3541                       p_return_status,
3542                       p_error_buffer,
3543                       p_trx_conversion_date); --Bug7183884
3544     IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
3545       RETURN;
3546     END IF;
3547   ELSIF (p_tax_calculation_formula IS NULL AND p_tax_rate <> 0 ) THEN
3548     l_amt_tax_curr := (p_rounded_amt_tax_curr/p_tax_rate);
3549 
3550     IF l_rate_type_code = 'PERCENTAGE' THEN
3551       l_amt_tax_curr := l_amt_tax_curr * 100;
3552     ELSIF l_rate_type_code = 'QUANTITY' THEN
3553       l_amt_tax_curr := p_amt;
3554     END IF;
3555   END IF;
3556 
3557   --
3558   -- round the converted amount
3559   --
3560   p_convert_round_amt := round_tax(l_amt_tax_curr,
3561                                    p_Rounding_Rule_Code,
3562                                    p_tax_min_acct_unit,
3563                                    p_tax_precision,
3564                                    p_return_status,
3565                                    p_error_buffer);
3566 
3567   IF (g_level_statement >= g_current_runtime_level ) THEN
3568 
3569     FND_LOG.STRING(g_level_statement,
3570                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.conv_rnd_taxable_tax_curr.END',
3571                    'ZX_TDS_TAX_ROUNDING_PKG: conv_rnd_taxable_tax_curr(-)'||
3572                    'rounded taxable amt tax currency = ' ||
3573                     to_char(p_convert_round_amt));
3574   END IF;
3575 
3576 EXCEPTION
3577   WHEN OTHERS THEN
3578     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3579     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
3580     IF (g_level_unexpected >= g_current_runtime_level ) THEN
3581       FND_LOG.STRING(g_level_unexpected,
3582                      'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.conv_rnd_taxable_tax_curr',
3583                       p_error_buffer);
3584     END IF;
3585 
3586 END conv_rnd_taxable_tax_curr;
3587 
3588 -----------------------------------------------------------------------
3589 --  PRIVATE PROCEDURE
3590 --  conv_rnd_taxable_funcl_curr
3591 --
3592 --  DESCRIPTION
3593 --  This procedure converts the taxable amount in transaction currency to
3594 --  functional  currency and then round the converted amount
3595 --
3596 
3597 PROCEDURE  conv_rnd_taxable_funcl_curr(
3598              p_funcl_curr_conv_rate IN     ZX_LINES.CURRENCY_CONVERSION_RATE%TYPE,
3599              p_amt                  IN     ZX_LINES.TAX_AMT%TYPE,
3600              p_convert_round_amt        OUT NOCOPY ZX_LINES.TAX_AMT_TAX_CURR%TYPE,
3601              p_ledger_id            IN     ZX_LINES.LEDGER_ID%TYPE,
3602              p_tax_calculation_formula IN     ZX_LINES.TAX_CALCULATION_FORMULA%TYPE,
3603              p_tax_rate             IN     ZX_LINES.TAX_RATE%TYPE,
3604              p_tax_rate_id          IN     ZX_RATES_B.TAX_RATE_ID%TYPE,
3605              p_rounded_amt_funcl_curr IN     ZX_LINES.TAX_AMT_FUNCL_CURR%TYPE,
3606              p_return_status           OUT NOCOPY VARCHAR2,
3607              p_error_buffer            OUT NOCOPY VARCHAR2
3608          )
3609 IS
3610   l_amt_funcl_curr                 NUMBER;
3611   l_rate_type_code                ZX_RATES_B.RATE_TYPE_CODE%TYPE;
3612   l_tax_rate_rec                  ZX_TDS_UTILITIES_PKG.ZX_RATE_INFO_REC_TYPE;
3613 
3614 BEGIN
3615   IF (g_level_statement >= g_current_runtime_level ) THEN
3616     FND_LOG.STRING(g_level_statement,
3617                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.conv_rnd_taxable_funcl_curr.BEGIN',
3618                    'ZX_TDS_TAX_ROUNDING_PKG: conv_rnd_taxable_funcl_curr(+)'||
3619                    'p_funcl_curr_conv_rate = ' || to_char(p_funcl_curr_conv_rate));
3620 
3621   END IF;
3622 
3623   p_return_status :=  FND_API.G_RET_STS_SUCCESS;
3624 
3625   IF ZX_TDS_UTILITIES_PKG.g_tax_rate_info_tbl.EXISTS(p_tax_rate_id) THEN
3626      l_rate_type_code :=
3627         ZX_TDS_UTILITIES_PKG.g_tax_rate_info_tbl(p_tax_rate_id).rate_type_code;
3628   ELSE
3629     ZX_TDS_UTILITIES_PKG.get_tax_rate_info(
3630        p_tax_rate_id      => p_tax_rate_id,
3631        p_tax_rate_rec     => l_tax_rate_rec,
3632        p_return_status    => p_return_status,
3633        p_error_buffer     => p_error_buffer);
3634 
3635       IF p_return_status = FND_API.G_RET_STS_SUCCESS THEN
3636         l_rate_type_code := l_tax_rate_rec.rate_type_code;
3637       END IF;
3638   END IF;
3639 
3640   IF p_amt IS NOT NULL THEN
3641     l_amt_funcl_curr   :=  p_amt * p_funcl_curr_conv_rate;
3642   ELSIF (p_tax_calculation_formula IS NULL AND p_tax_rate <> 0 ) THEN
3643       l_amt_funcl_curr := (p_rounded_amt_funcl_curr/p_tax_rate);
3644 
3645       IF l_rate_type_code = 'PERCENTAGE' THEN
3646         l_amt_funcl_curr := l_amt_funcl_curr * 100;
3647       ELSIF l_rate_type_code = 'QUANTITY' THEN
3648         l_amt_funcl_curr := p_amt;
3649       END IF;
3650   END IF;
3651 
3652   IF l_amt_funcl_curr IS NOT NULL THEN
3653     --
3654     -- perform rounding for amount in  functional currency
3655     --
3656     p_convert_round_amt := round_tax_funcl_curr(
3657                l_amt_funcl_curr,
3658                p_ledger_id,
3659                p_return_status,
3660                p_error_buffer);
3661 
3662      IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
3663        RETURN;
3664      END IF;
3665 
3666   ELSE
3667     --
3668     -- it is okay if functional currency conversion rate is not
3669     -- available, just set the functional currency amount to NULL
3670     --
3671     p_convert_round_amt := NULL;
3672   END IF;
3673 
3674   IF (g_level_statement >= g_current_runtime_level ) THEN
3675 
3676     FND_LOG.STRING(g_level_statement,
3677                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.conv_rnd_taxable_funcl_curr.END',
3678                    'ZX_TDS_TAX_ROUNDING_PKG: conv_rnd_taxable_funcl_curr(-)'||
3679                    'rounded taxable amt tax currency = ' ||
3680                     to_char(p_convert_round_amt));
3681   END IF;
3682 
3683 EXCEPTION
3684   WHEN OTHERS THEN
3685     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3686     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
3687 
3688     IF (g_level_unexpected >= g_current_runtime_level ) THEN
3689       FND_LOG.STRING(g_level_unexpected,
3690                      'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.conv_rnd_taxable_funcl_curr',
3691                       p_error_buffer);
3692     END IF;
3693 
3694 END conv_rnd_taxable_funcl_curr;
3695 -----------------------------------------------------------------------
3696 --  PRIVATE PROCEDURE
3697 --  round_line_level
3698 --
3699 --  DESCRIPTION
3700 --  This procedure is used to round tax lines at line level
3701 --
3702 
3703 PROCEDURE round_line_level(
3704              p_tax_amt               IN OUT NOCOPY ZX_LINES.TAX_AMT%TYPE,
3705              p_taxable_amt              OUT NOCOPY ZX_LINES.TAXABLE_AMT%TYPE,
3706              p_prd_total_tax_amt     IN OUT NOCOPY ZX_LINES.PRD_TOTAL_TAX_AMT%TYPE,
3707              p_Rounding_Rule_Code    IN            ZX_LINES.Rounding_Rule_Code%TYPE,
3708              p_trx_min_acct_unit     IN OUT NOCOPY ZX_LINES.MINIMUM_ACCOUNTABLE_UNIT%TYPE,
3709              p_trx_precision         IN OUT NOCOPY ZX_LINES.PRECISION%TYPE,
3710              p_trx_currency_code     IN            ZX_LINES.TRX_CURRENCY_CODE%TYPE,
3711              p_application_id           IN            ZX_LINES.APPLICATION_ID%TYPE,
3712              p_internal_organization_id IN            ZX_LINES.INTERNAL_ORGANIZATION_ID%TYPE,
3713              p_event_class_mapping_id   IN            ZX_LINES_DET_FACTORS.EVENT_CLASS_MAPPING_ID%TYPE,
3714              p_unrounded_taxable_amt IN ZX_LINES.UNROUNDED_TAXABLE_AMT%TYPE,
3715              p_unrounded_tax_amt     IN ZX_LINES.UNROUNDED_TAX_AMT%TYPE,
3716              p_return_status            OUT NOCOPY VARCHAR2,
3717              p_error_buffer             OUT NOCOPY VARCHAR2
3718          )
3719 IS
3720 
3721   l_zx_proudct_options_rec          ZX_GLOBAL_STRUCTURES_PKG.zx_product_options_rec_type;
3722   l_min_acct_unit                   ZX_LINES.MINIMUM_ACCOUNTABLE_UNIT%TYPE;
3723   l_precision                       ZX_LINES.PRECISION%TYPE;
3724 
3725 BEGIN
3726 
3727   IF (g_level_statement >= g_current_runtime_level ) THEN
3728     FND_LOG.STRING(g_level_statement,
3729                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.round_line_level.BEGIN',
3730                    'ZX_TDS_TAX_ROUNDING_PKG: round_line_level(+)'||
3731                    'unround tax_amt = ' || to_char(p_unrounded_tax_amt)||
3732                    'unround taxable_amt = ' || to_char(p_unrounded_taxable_amt)||
3733                    'unround prd_total_tax_amt = ' || to_char(p_prd_total_tax_amt)||
3734                    'p_trx_precision = ' || to_char(p_trx_precision)||
3735                    'p_trx_min_acct_unit = ' || to_char(p_trx_min_acct_unit));
3736   END IF;
3737 
3738   p_return_status :=  FND_API.G_RET_STS_SUCCESS;
3739 
3740   -- Bug 8969799
3741   --
3742   -- perform rounding for taxable amount
3743   p_taxable_amt := round_tax(p_unrounded_taxable_amt,
3744                              p_Rounding_Rule_Code,
3745                              p_trx_min_acct_unit,
3746                              p_trx_precision,
3747                              p_return_status,
3748                              p_error_buffer);
3749 
3750   -- perform rounding for prorated total amount
3751   IF p_prd_total_tax_amt IS NOT NULL THEN
3752     p_prd_total_tax_amt := round_tax(
3753                              p_prd_total_tax_amt,
3754                              p_Rounding_Rule_Code,
3755                              p_trx_min_acct_unit,
3756                              p_trx_precision,
3757                              p_return_status,
3758                              p_error_buffer);
3759   END IF;
3760 
3761   -- Code for taking precision from application tax option
3762   --
3763   ZX_GLOBAL_STRUCTURES_PKG.get_product_options_info
3764                    (p_application_id         => p_application_id,
3765                     p_org_id                 => p_internal_organization_id,
3766                     p_event_class_mapping_id => p_event_class_mapping_id,
3767                     x_product_options_rec    => l_zx_proudct_options_rec,
3768                     x_return_status          => p_return_status);
3769 
3770   IF p_return_status <>  FND_API.G_RET_STS_SUCCESS THEN
3771     IF (g_level_statement >= g_current_runtime_level ) THEN
3772       FND_LOG.STRING(g_level_statement,
3773                      'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.round_line_level',
3774                      'p_return_status = ' || p_return_status);
3775     END IF;
3776     RETURN;
3777   END IF;
3778 
3779   IF p_trx_currency_code = l_zx_proudct_options_rec.tax_currency_code THEN
3780     l_precision := l_zx_proudct_options_rec.tax_precision;
3781     l_min_acct_unit := l_zx_proudct_options_rec.tax_minimum_accountable_unit;
3782 
3783     p_trx_min_acct_unit := GREATEST(NVL(p_trx_min_acct_unit,l_min_acct_unit),
3784                                     NVL(l_min_acct_unit,p_trx_min_acct_unit));
3785     p_trx_precision := LEAST(NVL(p_trx_precision, l_precision),
3786                              NVL(l_precision,p_trx_precision));
3787   END IF;
3788 
3789   --
3790   -- perform rounding for tax amount
3791   --
3792   --
3793   IF p_tax_amt IS NULL THEN
3794     p_tax_amt := round_tax(p_unrounded_tax_amt,
3795                            p_Rounding_Rule_Code,
3796                            p_trx_min_acct_unit,
3797                            p_trx_precision,
3798                            p_return_status,
3799                            p_error_buffer);
3800   ELSE
3801     p_tax_amt := round_tax(p_tax_amt,
3802                            p_Rounding_Rule_Code,
3803                            p_trx_min_acct_unit,
3804                            p_trx_precision,
3805                            p_return_status,
3806                            p_error_buffer);
3807   END IF;
3808 
3809   IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
3810     RETURN;
3811   END IF;
3812 
3813   -- moved the rounding of taxable amount and prorated total amount
3814   -- before tax amount rounding to ensure that they are rounded
3815   -- using the trx currency mau and precision.
3816   -- tax will be rounded based on tax setup/trx currency setup.
3817 
3818   --
3819   -- update recalculate flag
3820   --
3821   -- p_tax_line_rec.Recalc_Required_Flag := 'N';
3822 
3823   -- perform rounding for taxable amount
3824   --p_taxable_amt := round_tax(p_unrounded_taxable_amt,
3825   --                           p_Rounding_Rule_Code,
3826   --                           p_trx_min_acct_unit,
3827   --                           p_trx_precision,
3828   --                           p_return_status,
3829   --                           p_error_buffer);
3830 
3831   -- perform rounding for prorated total amount
3832   --IF p_prd_total_tax_amt IS NOT NULL THEN
3833   --  p_prd_total_tax_amt := round_tax(
3834   --                           p_prd_total_tax_amt,
3835   --                           p_Rounding_Rule_Code,
3836   --                           p_trx_min_acct_unit,
3837   --                           p_trx_precision,
3838   --                           p_return_status,
3839   --                           p_error_buffer);
3840 
3841   --END IF;
3842 
3843 
3844   IF (g_level_statement >= g_current_runtime_level ) THEN
3845     FND_LOG.STRING(g_level_statement,
3846                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.round_line_level.END',
3847                    'ZX_TDS_TAX_ROUNDING_PKG: round_line_level(-)'||
3848                    'rounded tax amt = ' ||
3849                     to_char(p_tax_amt)||
3850                    'rounded taxable_amt = ' ||
3851                     to_char(p_taxable_amt)||
3852                     'rounded prd_total_tax_amt = ' ||
3853                     to_char(p_prd_total_tax_amt));
3854   END IF;
3855 
3856 EXCEPTION
3857   WHEN OTHERS THEN
3858     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3859     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
3860 
3861     IF (g_level_unexpected >= g_current_runtime_level ) THEN
3862       FND_LOG.STRING(g_level_unexpected,
3863                      'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.round_line_level',
3864                       p_error_buffer);
3865     END IF;
3866 
3867 END round_line_level;
3868 
3869 ------------------------------------------------------------------------
3870 --  PRIVATE PROCEDURE
3871 --  handle_header_rounding_curr
3872 --
3873 --  DESCRIPTION
3874 --  This procedure handles header level rounding for functional currency
3875 --  or any other currency when the conversion rate is passed  from products
3876 --  This procedure is incomplete due to handling of MRC is not clear now
3877 
3878 
3879 PROCEDURE handle_header_rounding_curr(
3880            p_tax_line_id              IN            ZX_LINES.TAX_LINE_ID%TYPE,
3881            p_unrounded_tax_amt        IN            ZX_LINES.UNROUNDED_TAX_AMT%TYPE,
3882            p_tax_amt_curr             IN            ZX_LINES.TAX_AMT_FUNCL_CURR%TYPE,
3883            p_taxable_amt_curr         IN            ZX_LINES.TAXABLE_AMT_FUNCL_CURR%TYPE,
3884            p_currency_conversion_rate IN            ZX_LINES.CURRENCY_CONVERSION_RATE%TYPE,
3885            p_prev_hdr_grp_rec         IN OUT NOCOPY HDR_GRP_REC_TYPE,
3886            p_curr_hdr_grp_rec         IN            HDR_GRP_REC_TYPE,
3887            p_ledger_id                IN            ZX_LINES.LEDGER_ID%TYPE,
3888            p_return_status               OUT NOCOPY VARCHAR2,
3889            p_error_buffer                OUT NOCOPY VARCHAR2
3890          )
3891 IS
3892   l_same_tax                        VARCHAR2(1);
3893 BEGIN
3894 
3895   IF (g_level_statement >= g_current_runtime_level ) THEN
3896     FND_LOG.STRING(g_level_statement,
3897                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.handle_header_rounding_curr.BEGIN',
3898                    'ZX_TDS_TAX_ROUNDING_PKG: handle_header_rounding_curr(+)');
3899   END IF;
3900 
3901   --
3902   -- init return status
3903   --
3904   p_return_status  := FND_API.G_RET_STS_SUCCESS;
3905 
3906   --
3907   -- check whether it is in the same group of tax for
3908   -- header rounding level.  l_same_tax is used for header
3909   -- rounding level only
3910   --
3911   determine_header_group(p_prev_hdr_grp_rec,
3912                          p_curr_hdr_grp_rec,
3913                          l_same_tax,
3914                          p_return_status,
3915                          p_error_buffer);
3916 
3917   IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
3918     RETURN;
3919   END IF;
3920 
3921   --
3922   -- update  header rounding info to new values
3923   --
3924   update_header_rounding_curr(
3925                                 p_tax_line_id,
3926                                 p_unrounded_tax_amt,
3927                                 p_tax_amt_curr,
3928                                 p_taxable_amt_curr,
3929                                 p_currency_conversion_rate,
3930                                 p_prev_hdr_grp_rec,
3931                                 p_curr_hdr_grp_rec,
3932                                 l_same_tax,
3933                                 p_ledger_id,
3934                                 p_return_status,
3935                                 p_error_buffer);
3936 
3937   IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
3938     RETURN;
3939   END IF;
3940 
3941    IF (g_level_statement >= g_current_runtime_level ) THEN
3942 
3943     FND_LOG.STRING(g_level_statement,
3944                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.handle_header_rounding_curr.END',
3945                    'ZX_TDS_TAX_ROUNDING_PKG: handle_header_rounding_curr(-)'||p_return_status);
3946   END IF;
3947 
3948 EXCEPTION
3949   WHEN OTHERS THEN
3950     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3951     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
3952     IF (g_level_unexpected >= g_current_runtime_level ) THEN
3953       FND_LOG.STRING(g_level_unexpected,
3954                      'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.handle_header_rounding_curr',
3955                       p_error_buffer);
3956     END IF;
3957 
3958 END handle_header_rounding_curr;
3959 
3960 -----------------------------------------------------------------------
3961 --  PRIVATE PROCEDURE
3962 --  get_rounding_info
3963 --
3964 --  DESCRIPTION
3965 --  This procedure gets rounding information for transaction currency
3966 --  and tax currency
3967 
3968 PROCEDURE get_rounding_info(
3969             p_tax_id                        IN ZX_TAXES_B.TAX_ID%TYPE,
3970             p_tax_currency_code             OUT NOCOPY ZX_LINES.TAX_CURRENCY_CODE%TYPE,
3971             p_tax_currency_conversion_date  IN OUT NOCOPY ZX_LINES.TAX_CURRENCY_CONVERSION_DATE%TYPE,
3972             p_trx_currency_code             IN ZX_LINES.TRX_CURRENCY_CODE%TYPE,
3973             p_currency_conversion_date      IN ZX_LINES.CURRENCY_CONVERSION_DATE%TYPE,
3974             p_min_acct_unit                 IN OUT NOCOPY ZX_LINES.MINIMUM_ACCOUNTABLE_UNIT%TYPE,
3975             p_precision                     IN OUT NOCOPY ZX_LINES.PRECISION%TYPE,
3976             p_tax_min_acct_unit             OUT NOCOPY ZX_TAXES_B.MINIMUM_ACCOUNTABLE_UNIT%TYPE,
3977             p_tax_precision                 OUT NOCOPY ZX_TAXES_B.TAX_PRECISION%TYPE,
3978             p_tax_currency_conversion_type  OUT NOCOPY ZX_TAXES_B.EXCHANGE_RATE_TYPE%TYPE,
3979             p_return_status                 OUT NOCOPY VARCHAR2,
3980             p_error_buffer                  OUT NOCOPY VARCHAR2
3981          )
3982 IS
3983   l_tax_id                          ZX_TAXES_B.TAX_ID%TYPE;
3984   l_tax_rec                         ZX_TDS_UTILITIES_PKG.ZX_TAX_INFO_CACHE_REC;
3985 
3986 BEGIN
3987 
3988   IF (g_level_statement >= g_current_runtime_level ) THEN
3989     FND_LOG.STRING(g_level_statement,
3990                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.get_rounding_info.BEGIN',
3991                    'ZX_TDS_TAX_ROUNDING_PKG: get_rounding_info(+)');
3992   END IF;
3993 
3994   p_return_status :=  FND_API.G_RET_STS_SUCCESS;
3995 
3996   l_tax_id            := p_tax_id;
3997 
3998   --
3999   -- Bug#5410271- populate cache structure if not exist
4000   --
4001   IF NOT ZX_TDS_UTILITIES_PKG.g_tax_rec_tbl.EXISTS(p_tax_id) THEN
4002     ZX_TDS_UTILITIES_PKG.populate_tax_cache(
4003                        p_tax_id,
4004                        p_return_status,
4005                        p_error_buffer);
4006 
4007     IF p_return_status <>  FND_API.G_RET_STS_SUCCESS THEN
4008       IF (g_level_statement >= g_current_runtime_level ) THEN
4009         FND_LOG.STRING(g_level_statement,
4010                        'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.rule_base_process',
4011                        'p_return_status = ' || p_return_status ||
4012                        ', p_error_buffer  = ' || p_error_buffer);
4013       END IF;
4014       RETURN;
4015     END IF;
4016   END IF;
4017 
4018   l_tax_rec                      := ZX_TDS_UTILITIES_PKG.g_tax_rec_tbl(l_tax_id);
4019   p_tax_precision                := l_tax_rec.tax_precision;
4020   p_tax_min_acct_unit            := l_tax_rec.minimum_accountable_unit;
4021   p_tax_currency_code            := l_tax_rec.tax_currency_code;
4022   p_tax_currency_conversion_type := l_tax_rec.exchange_rate_type;
4023   --bug#6526550
4024   IF p_tax_currency_conversion_date IS NULL AND p_currency_conversion_date IS NOT NULL THEN
4025     p_tax_currency_conversion_date := p_currency_conversion_date;
4026   END IF;
4027 
4028   IF (g_level_statement >= g_current_runtime_level ) THEN
4029     FND_LOG.STRING(g_level_statement,
4030                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.get_rounding_info',
4031                    'perform rounding for tax_id = ' ||
4032                     to_char(l_tax_id)||
4033                    'tax precision     = ' || p_tax_precision||
4034                    'tax min_acct_unit = ' || p_tax_min_acct_unit||
4035                    'tax Rounding_Rule_Code = ' || l_tax_rec.rounding_rule_code||
4036                    'tax currency_code = ' || l_tax_rec.tax_currency_code||
4037 		   'p_tax_currency_conversion_date = '||p_tax_currency_conversion_date); --bug#6526550
4038  END IF;
4039 
4040   --
4041   -- get tax currency info
4042   --
4043   get_currency_info_for_rounding(
4044             p_tax_currency_code,
4045             p_tax_currency_conversion_date,
4046             p_return_status,
4047             p_error_buffer);
4048   IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
4049     RETURN;
4050   END IF;
4051 
4052   --
4053   -- get tax precision and min acct unit if they are null
4054   --
4055   IF (p_tax_min_acct_unit IS NULL AND p_tax_precision IS NULL) THEN
4056      p_tax_min_acct_unit :=
4057             g_currency_tbl(p_tax_currency_code).min_acct_unit;
4058      p_tax_precision :=
4059             g_currency_tbl(p_tax_currency_code).precision;
4060   END IF;
4061 
4062   --
4063   -- get transaction  currency info
4064   --
4065   get_currency_info_for_rounding(
4066             p_trx_currency_code,
4067             p_currency_conversion_date,
4068             p_return_status,
4069             p_error_buffer);
4070   IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
4071     RETURN;
4072   END IF;
4073 
4074   --
4075   -- check if have min acct unit and precision for trx currency
4076   --
4077   IF (p_min_acct_unit IS NULL AND p_precision IS NULL) THEN
4078     p_min_acct_unit :=
4079          g_currency_tbl(p_trx_currency_code).min_acct_unit;
4080     p_precision :=
4081          g_currency_tbl(p_trx_currency_code).precision;
4082   END IF;
4083 
4084   IF (g_level_statement >= g_current_runtime_level ) THEN
4085     FND_LOG.STRING(g_level_statement,
4086                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.get_rounding_info.END',
4087                    'ZX_TDS_TAX_ROUNDING_PKG: get_rounding_info(-)');
4088   END IF;
4089 
4090 EXCEPTION
4091   WHEN OTHERS THEN
4092     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4093     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
4094     IF (g_level_unexpected >= g_current_runtime_level ) THEN
4095       FND_LOG.STRING(g_level_unexpected,
4096                      'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.get_rounding_info',
4097                       p_error_buffer);
4098     END IF;
4099 
4100 END get_rounding_info;
4101 ----------------------------------------------------------------------
4102 --  PRIVATE PROCEDURE
4103 --  adjust_rounding_diff_curr
4104 --
4105 --  DESCRIPTION
4106 --  This procedure adjusts the rounding differences to the largest line
4107 --  for tax amount and taxable amount  in functional/other currency,
4108 --  for each group belonged to a document.
4109 --  the adjustment is needed for HEADER level rounding only
4110 --  This procedure is incomplete due to handling of MRC is not clear now
4111 
4112 PROCEDURE adjust_rounding_diff_curr(
4113             p_return_status                 OUT NOCOPY VARCHAR2,
4114             p_error_buffer                  OUT NOCOPY VARCHAR2
4115          )
4116 IS
4117   l_rnd_sum_unrnd_curr            NUMBER;
4118   i                               BINARY_INTEGER;
4119   l_count                         NUMBER;
4120 
4121   l_tax_line_id_tbl              TAX_LINE_ID_TBL;
4122   l_tax_amt_curr_tbl             TAX_AMT_FUNCL_CURR_TBL;
4123   l_taxable_amt_curr_tbl         TAXABLE_AMT_FUNCL_CURR_TBL;
4124 
4125 
4126 BEGIN
4127 
4128   IF (g_level_statement >= g_current_runtime_level ) THEN
4129     FND_LOG.STRING(g_level_statement,
4130                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.adjust_rounding_diff_curr.BEGIN',
4131                    'ZX_TDS_TAX_ROUNDING_PKG: adjust_rounding_diff_curr(+)');
4132   END IF;
4133 
4134   p_return_status :=  FND_API.G_RET_STS_SUCCESS;
4135 
4136   l_count := g_hdr_rounding_curr_tbl.COUNT;
4137 
4138   IF (g_level_statement >= g_current_runtime_level ) THEN
4139     FND_LOG.STRING(g_level_statement,
4140                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.adjust_rounding_diff_curr',
4141                    'number of rows to adjust  = ' || to_char(l_count));
4142   END IF;
4143 
4144   FOR  i IN 1 .. l_count LOOP
4145 
4146     IF  g_hdr_rounding_info_tbl(i).total_rec_in_grp > 1 THEN
4147       --
4148       -- do the adjustment if the total number of records in this
4149       -- group is more than 1, if it is the only record in the
4150       -- group no need to do any adjustment
4151       --
4152       --
4153       --  round and adjust the max line
4154       --
4155 
4156       l_rnd_sum_unrnd_curr := round(g_hdr_rounding_curr_tbl(i).sum_unrnd_tax_amt *
4157                                   g_hdr_rounding_curr_tbl(i).currency_conversion_rate,20);
4158 
4159       l_rnd_sum_unrnd_curr := round_tax_funcl_curr(
4160                                       l_rnd_sum_unrnd_curr,
4161                                       g_hdr_rounding_curr_tbl(i).ledger_id,
4162                                       p_return_status,
4163                                       p_error_buffer);
4164 
4165       IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
4166         RETURN;
4167       END IF;
4168 
4169       g_hdr_rounding_curr_tbl(i).rnd_tax_amt_curr :=
4170          g_hdr_rounding_curr_tbl(i).rnd_tax_amt_curr +
4171          (l_rnd_sum_unrnd_curr -
4172           g_hdr_rounding_curr_tbl(i).sum_rnd_curr);
4173 
4174       IF (g_hdr_rounding_curr_tbl(i).tax_calculation_formula IS NULL AND
4175           g_hdr_rounding_curr_tbl(i).tax_rate <> 0) THEN
4176         --
4177         -- need to adjust the taxable amount
4178         --
4179         g_hdr_rounding_curr_tbl(i).rnd_taxable_amt_curr :=
4180           round_tax_funcl_curr(
4181               (g_hdr_rounding_curr_tbl(i).rnd_tax_amt_curr/
4182                g_hdr_rounding_curr_tbl(i).tax_rate),
4183                g_hdr_rounding_info_tbl(i).ledger_id,
4184                p_return_status,
4185                p_error_buffer);
4186         IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
4187           RETURN;
4188         END IF;
4189       END IF;
4190     END IF;  -- total_rec_in_grp > 1
4191   END LOOP;
4192 
4193   --
4194   -- do bulk update
4195   --
4196 
4197   FOR i IN   1 .. l_count LOOP
4198     l_tax_amt_curr_tbl(i)     := g_hdr_rounding_curr_tbl(i).rnd_tax_amt_curr;
4199     l_taxable_amt_curr_tbl(i) := g_hdr_rounding_curr_tbl(i).rnd_taxable_amt_curr;
4200     l_tax_line_id_tbl(i)      := g_hdr_rounding_curr_tbl(i).tax_line_id;
4201   END LOOP;
4202 
4203   IF (g_level_statement >= g_current_runtime_level ) THEN
4204     FND_LOG.STRING(g_level_statement,
4205                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.adjust_rounding_diff_curr',
4206                    'update the adjustments to the largest lines ....');
4207   END IF;
4208 
4209   FORALL i IN  1 .. l_count
4210     UPDATE  ZX_LINES
4211       SET tax_amt_funcl_curr = l_tax_amt_curr_tbl(i),
4212           taxable_amt_funcl_curr = l_taxable_amt_curr_tbl(i)
4213       WHERE tax_line_id = l_tax_line_id_tbl(i);
4214 
4215   IF (g_level_statement >= g_current_runtime_level ) THEN
4216     FND_LOG.STRING(g_level_statement,
4217                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.adjust_rounding_diff_curr.END',
4218                    'ZX_TDS_TAX_ROUNDING_PKG: adjust_rounding_diff_curr(-)');
4219   END IF;
4220 
4221 EXCEPTION
4222   WHEN OTHERS THEN
4223     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4224     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
4225 
4226     IF (g_level_unexpected >= g_current_runtime_level ) THEN
4227       FND_LOG.STRING(g_level_unexpected,
4228                      'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.adjust_rounding_diff_curr',
4229                       p_error_buffer);
4230     END IF;
4231 
4232 END adjust_rounding_diff_curr;
4233 
4234 ----------------------------------------------------------------------
4235 --  PRIVATE PROCEDURE
4236 --  adjust_rounding_diff
4237 --
4238 --  DESCRIPTION
4239 --  This procedure adjusts the rounding differences to the largest line
4240 --  for tax amount in trx currency, tax/taxable amount in tax currency and
4241 --  tax/taxable amount in functional currency for each group belonged to a document
4242 --  the adjustment is needed for HEADER level rounding only
4243 --
4244 
4245 PROCEDURE adjust_rounding_diff(
4246             p_return_status                 OUT NOCOPY VARCHAR2,
4247             p_error_buffer                  OUT NOCOPY VARCHAR2
4248          )
4249 IS
4250   l_rnd_sum_unrnd_tax_amt         NUMBER;
4251   l_rnd_sum_unrnd_tx_curr         NUMBER;
4252   l_rnd_sum_unrnd_funcl_curr      NUMBER;
4253   i                               BINARY_INTEGER;
4254   j                               BINARY_INTEGER;
4255   l_count                         NUMBER;
4256   l_tax_min_acct_unit             ZX_TAXES_B.MINIMUM_ACCOUNTABLE_UNIT%TYPE;
4257   l_tax_precision                 ZX_TAXES_B.TAX_PRECISION%TYPE;
4258 
4259   l_tax_line_id_tbl              TAX_LINE_ID_TBL;
4260   l_tax_amt_tbl                  TAX_AMT_TBL;
4261   l_tax_amt_tax_curr_tbl         TAX_AMT_TAX_CURR_TBL;
4262   l_taxable_amt_tax_curr_tbl     TAXABLE_AMT_TAX_CURR_TBL;
4263   l_tax_amt_funcl_curr_tbl       TAX_AMT_FUNCL_CURR_TBL;
4264   l_taxable_amt_funcl_curr_tbl   TAXABLE_AMT_FUNCL_CURR_TBL;
4265 
4266 
4267 BEGIN
4268 
4269   IF (g_level_statement >= g_current_runtime_level ) THEN
4270     FND_LOG.STRING(g_level_statement,
4271                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.adjust_rounding_diff.BEGIN',
4272                    'ZX_TDS_TAX_ROUNDING_PKG: adjust_rounding_diff(+)');
4273   END IF;
4274 
4275   p_return_status :=  FND_API.G_RET_STS_SUCCESS;
4276 
4277   l_count := g_hdr_rounding_info_tbl.COUNT;
4278 
4279   IF (g_level_statement >= g_current_runtime_level ) THEN
4280     FND_LOG.STRING(g_level_statement,
4281                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.adjust_rounding_diff',
4282                    'number of rows to adjust  = ' || to_char(l_count));
4283   END IF;
4284 
4285   FOR  i IN 1 .. l_count LOOP
4286 
4287     IF  g_hdr_rounding_info_tbl(i).total_rec_in_grp > 1 THEN
4288       --
4289       -- do the adjustment if the total number of records in this
4290       -- group is more than 1, if it is the only record in the
4291       -- group no need to do any adjustment
4292       --
4293 
4294       l_rnd_sum_unrnd_tax_amt := round(g_hdr_rounding_info_tbl(i).sum_unrnd_tax_amt,20);
4295 
4296       l_rnd_sum_unrnd_tax_amt := round_tax(
4297                                     l_rnd_sum_unrnd_tax_amt,
4298                                     g_hdr_rounding_info_tbl(i).Rounding_Rule_Code,
4299                                     g_hdr_rounding_info_tbl(i).min_acct_unit,
4300                                     g_hdr_rounding_info_tbl(i).precision,
4301                                     p_return_status,
4302                                     p_error_buffer);
4303 
4304       IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
4305         RETURN;
4306       END IF;
4307 
4308   IF (g_level_statement >= g_current_runtime_level ) THEN
4309     FND_LOG.STRING(g_level_statement,
4310                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.adjust_rounding_diff',
4311                    'Rounded Tax amt before ' ||to_char(g_hdr_rounding_info_tbl(i).rnd_tax_amt));
4312   END IF;
4313 
4314   IF (g_level_statement >= g_current_runtime_level ) THEN
4315     FND_LOG.STRING(g_level_statement,
4316                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.adjust_rounding_diff',
4317                    'number of rows to adjust  = ' || to_char(l_count));
4318   END IF;
4319       --
4320       -- adjust tax amt
4321       --
4322 
4323   IF (g_level_statement >= g_current_runtime_level ) THEN
4324     FND_LOG.STRING(g_level_statement,
4325                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.adjust_rounding_diff',
4326                    'sum_rnd_tax_amt' ||to_char(g_hdr_rounding_info_tbl(i).sum_rnd_tax_amt));
4327   END IF;
4328 
4329       g_hdr_rounding_info_tbl(i).rnd_tax_amt :=
4330          g_hdr_rounding_info_tbl(i).rnd_tax_amt +
4331          (l_rnd_sum_unrnd_tax_amt - g_hdr_rounding_info_tbl(i).sum_rnd_tax_amt);
4332 
4333   IF (g_level_statement >= g_current_runtime_level ) THEN
4334     FND_LOG.STRING(g_level_statement,
4335                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.adjust_rounding_diff',
4336                    'Rounded Tax amt after ' ||to_char(g_hdr_rounding_info_tbl(i).rnd_tax_amt));
4337   END IF;
4338 
4339       IF g_hdr_rounding_info_tbl(i).mrc_tax_line_flag = 'N' THEN
4340         --
4341         -- adjust tax amt tax currency
4342         --
4343         l_rnd_sum_unrnd_tx_curr := round(g_hdr_rounding_info_tbl(i).sum_unrnd_tax_amt *
4344                                    g_hdr_rounding_info_tbl(i).tax_curr_conv_rate,20);
4345         j := g_hdr_rounding_info_tbl(i).tax_id;
4346 
4347         l_tax_precision := ZX_TDS_UTILITIES_PKG.g_tax_rec_tbl(j).tax_precision;
4348         l_tax_min_acct_unit := ZX_TDS_UTILITIES_PKG.g_tax_rec_tbl(j).minimum_accountable_unit;
4349 
4350         l_rnd_sum_unrnd_tx_curr := round_tax(
4351                                   l_rnd_sum_unrnd_tx_curr,
4352                                   g_hdr_rounding_info_tbl(i).Rounding_Rule_Code,
4353                                   l_tax_min_acct_unit,
4354                                   l_tax_precision,
4355                                   p_return_status,
4356                                   p_error_buffer);
4357 
4358         IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
4359           RETURN;
4360         END IF;
4361 
4362         g_hdr_rounding_info_tbl(i).rnd_tax_amt_tax_curr :=
4363            g_hdr_rounding_info_tbl(i).rnd_tax_amt_tax_curr +
4364            (l_rnd_sum_unrnd_tx_curr -
4365             g_hdr_rounding_info_tbl(i).sum_rnd_tax_curr);
4366 
4367         --
4368         -- adjust tax amt functional currency
4369           --
4370         IF g_hdr_rounding_info_tbl(i).currency_conversion_rate IS NOT NULL THEN
4371           l_rnd_sum_unrnd_funcl_curr := round(g_hdr_rounding_info_tbl(i).sum_unrnd_tax_amt *
4372                                         g_hdr_rounding_info_tbl(i).currency_conversion_rate,20);
4373 
4374           l_rnd_sum_unrnd_funcl_curr := round_tax_funcl_curr(
4375                                           l_rnd_sum_unrnd_funcl_curr,
4376                                           g_hdr_rounding_info_tbl(i).ledger_id,
4377                                           p_return_status,
4378                                           p_error_buffer);
4379 
4380           IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
4381             RETURN;
4382           END IF;
4383 
4384           g_hdr_rounding_info_tbl(i).rnd_tax_amt_funcl_curr :=
4385              g_hdr_rounding_info_tbl(i).rnd_tax_amt_funcl_curr +
4386              (l_rnd_sum_unrnd_funcl_curr -
4387               g_hdr_rounding_info_tbl(i).sum_rnd_funcl_curr);
4388         END IF;
4389 
4390         --
4391         -- adjust taxable amt in tax currency and functional currency
4392         -- leave taxable amt as is
4393         --
4394 
4395         IF (g_hdr_rounding_info_tbl(i).tax_calculation_formula IS NULL AND
4396             g_hdr_rounding_info_tbl(i).tax_rate <> 0) THEN
4397           --
4398           -- need to adjust the taxable amount for tax currency
4399           -- and functional currency
4400           --
4401           g_hdr_rounding_info_tbl(i).rnd_taxable_amt_tax_curr :=
4402             round_tax(
4403                   (g_hdr_rounding_info_tbl(i).rnd_tax_amt_tax_curr/
4404                    g_hdr_rounding_info_tbl(i).tax_rate),
4405                    g_hdr_rounding_info_tbl(i).Rounding_Rule_Code,
4406                    l_tax_min_acct_unit,
4407                    l_tax_precision,
4408                    p_return_status,
4409                    p_error_buffer);
4410           IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
4411             RETURN;
4412           END IF;
4413 
4414           g_hdr_rounding_info_tbl(i).rnd_taxable_amt_funcl_curr :=
4415             round_tax_funcl_curr(
4416                   (g_hdr_rounding_info_tbl(i).rnd_tax_amt_funcl_curr/
4417                    g_hdr_rounding_info_tbl(i).tax_rate),
4418                    g_hdr_rounding_info_tbl(i).ledger_id,
4419                    p_return_status,
4420                    p_error_buffer);
4421 
4422           IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
4423             RETURN;
4424           END IF;
4425         END IF;
4426       END IF;   -- g_hdr_rounding_info_tbl(i).mrc_tax_line_flag = 'Y'
4427     END IF; -- total_num_in_grp > 1
4428   END LOOP;
4429 
4430   --
4431   -- do bulk update
4432   --
4433 
4434   FOR i IN   1 .. l_count LOOP
4435 
4436   IF (g_level_statement >= g_current_runtime_level ) THEN
4437     FND_LOG.STRING(g_level_statement,
4438                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.adjust_rounding_diff',
4439                    'Tax line id' ||to_char(g_hdr_rounding_info_tbl(i).tax_line_id));
4440   END IF;
4441 
4442     l_tax_amt_tbl(i)                := g_hdr_rounding_info_tbl(i).rnd_tax_amt;
4443     l_tax_amt_tax_curr_tbl(i)       := g_hdr_rounding_info_tbl(i).rnd_tax_amt_tax_curr;
4444     l_tax_amt_funcl_curr_tbl(i)     := g_hdr_rounding_info_tbl(i).rnd_tax_amt_funcl_curr;
4445     l_taxable_amt_tax_curr_tbl(i)   := g_hdr_rounding_info_tbl(i).rnd_taxable_amt_tax_curr;
4446     l_taxable_amt_funcl_curr_tbl(i) := g_hdr_rounding_info_tbl(i).rnd_taxable_amt_funcl_curr;
4447     l_tax_line_id_tbl(i)            := g_hdr_rounding_info_tbl(i).tax_line_id;
4448   END LOOP;
4449 
4450   IF (g_level_statement >= g_current_runtime_level ) THEN
4451     FND_LOG.STRING(g_level_statement,
4452                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.adjust_rounding_diff',
4453                    'update the adjustments to the largest lines ....');
4454   END IF;
4455 
4456   FORALL i IN  1 .. l_count
4457     UPDATE  /*+ INDEX(ZX_DETAIL_TAX_LINES_GT ZX_DETAIL_TAX_LINES_GT_U2) */
4458             ZX_DETAIL_TAX_LINES_GT
4459       SET   tax_amt                = l_tax_amt_tbl(i),
4460             tax_amt_tax_curr       = l_tax_amt_tax_curr_tbl(i),
4461             tax_amt_funcl_curr     = l_tax_amt_funcl_curr_tbl(i),
4462             taxable_amt_tax_curr   = l_taxable_amt_tax_curr_tbl(i),
4463             taxable_amt_funcl_curr = l_taxable_amt_funcl_curr_tbl(i)
4464       WHERE tax_line_id = l_tax_line_id_tbl(i);
4465 
4466   IF (g_level_statement >= g_current_runtime_level ) THEN
4467     FND_LOG.STRING(g_level_statement,
4468                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.adjust_rounding_diff.END',
4469                    'ZX_TDS_TAX_ROUNDING_PKG: adjust_rounding_diff(-)');
4470   END IF;
4471 
4472 EXCEPTION
4473   WHEN OTHERS THEN
4474     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4475     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
4476 
4477     IF (g_level_unexpected >= g_current_runtime_level ) THEN
4478       FND_LOG.STRING(g_level_unexpected,
4479                      'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.adjust_rounding_diff',
4480                       p_error_buffer);
4481     END IF;
4482 
4483 END adjust_rounding_diff;
4484 ----------------------------------------------------------------
4485 --  PRIVATE PROCEDURE
4486 --  update_header_rounding_curr
4487 --
4488 --  DESCRIPTION
4489 --  This procedure stores header rounding info for each group which will be
4490 --  used later for rounding adjustments.
4491 --  This procedure is incomplete due to handling of MRC is not clear now
4492 
4493 PROCEDURE update_header_rounding_curr(
4494            p_tax_line_id              IN            ZX_LINES.TAX_LINE_ID%TYPE,
4495            p_unrounded_tax_amt        IN            ZX_LINES.UNROUNDED_TAX_AMT%TYPE,
4496            p_tax_amt_curr             IN            ZX_LINES.TAX_AMT_FUNCL_CURR%TYPE,
4497            p_taxable_amt_curr         IN            ZX_LINES.TAXABLE_AMT_FUNCL_CURR%TYPE,
4498            p_currency_conversion_rate IN            ZX_LINES.CURRENCY_CONVERSION_RATE%TYPE,
4499            p_prev_hdr_grp_rec         IN OUT NOCOPY HDR_GRP_REC_TYPE,
4500            p_curr_hdr_grp_rec         IN            HDR_GRP_REC_TYPE,
4501            p_same_tax                 IN            VARCHAR2,
4502            p_ledger_id                IN            ZX_LINES.LEDGER_ID%TYPE,
4503            p_return_status               OUT NOCOPY VARCHAR2,
4504            p_error_buffer                OUT NOCOPY VARCHAR2
4505          )
4506 IS
4507   j               BINARY_INTEGER;
4508 BEGIN
4509 
4510   IF (g_level_statement >= g_current_runtime_level ) THEN
4511     FND_LOG.STRING(g_level_statement,
4512                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.update_header_rounding_curr.BEGIN',
4513                    'ZX_TDS_TAX_ROUNDING_PKG: update_header_rounding_curr(+)');
4514   END IF;
4515 
4516   --
4517   -- init return status
4518   --
4519   p_return_status  := FND_API.G_RET_STS_SUCCESS;
4520 
4521   j := g_hdr_rounding_curr_tbl.COUNT;
4522 
4523   IF p_same_tax = 'N' THEN
4524     --
4525     -- update the previous header group with values of current
4526     -- header group information, in case p_same_tax is 'Y',
4527     -- p_prev_hdr_grp_rec would pass out the original IN values
4528     --
4529     p_prev_hdr_grp_rec := p_curr_hdr_grp_rec;
4530 
4531     --
4532     -- this is a new group
4533     --
4534     j := j  + 1;
4535 
4536     --
4537     -- store rounding info  for later use
4538     --
4539     g_hdr_rounding_curr_tbl(j).max_unrnd_tax_amt    := 0;
4540     g_hdr_rounding_curr_tbl(j).sum_unrnd_tax_amt    := 0;
4541     g_hdr_rounding_curr_tbl(j).sum_rnd_curr         := 0;
4542     g_hdr_rounding_curr_tbl(j).ledger_id            := p_ledger_id;
4543     g_hdr_rounding_curr_tbl(j).total_rec_in_grp     := 0;
4544 
4545   END IF;
4546 
4547   g_hdr_rounding_curr_tbl(j).sum_unrnd_tax_amt :=
4548        g_hdr_rounding_curr_tbl(j).sum_unrnd_tax_amt + p_unrounded_tax_amt;
4549   g_hdr_rounding_curr_tbl(j).sum_rnd_curr :=
4550        g_hdr_rounding_curr_tbl(j).sum_rnd_curr + p_tax_amt_curr;
4551   g_hdr_rounding_curr_tbl(j).total_rec_in_grp     :=
4552        g_hdr_rounding_curr_tbl(j).total_rec_in_grp + 1;
4553 
4554   IF g_hdr_rounding_curr_tbl(j).max_unrnd_tax_amt <= ABS(p_unrounded_tax_amt)  THEN
4555     g_hdr_rounding_curr_tbl(j).max_unrnd_tax_amt := ABS(p_unrounded_tax_amt);
4556     g_hdr_rounding_curr_tbl(j).tax_line_id := p_tax_line_id;
4557     g_hdr_rounding_curr_tbl(j).currency_conversion_rate := p_currency_conversion_rate;
4558     g_hdr_rounding_curr_tbl(j).rnd_tax_amt_curr := p_tax_amt_curr;
4559     g_hdr_rounding_curr_tbl(j).rnd_taxable_amt_curr := p_taxable_amt_curr;
4560     g_hdr_rounding_curr_tbl(j).tax_calculation_formula :=
4561                                  p_curr_hdr_grp_rec.tax_calculation_formula;
4562     g_hdr_rounding_curr_tbl(j).tax_rate := p_curr_hdr_grp_rec.tax_rate;
4563 
4564   END IF;
4565 
4566   IF (g_level_statement >= g_current_runtime_level ) THEN
4567     FND_LOG.STRING(g_level_statement,
4568                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.update_header_rounding_curr.END',
4569                    'ZX_TDS_TAX_ROUNDING_PKG: update_header_rounding_curr(-)');
4570   END IF;
4571 EXCEPTION
4572   WHEN OTHERS THEN
4573     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4574     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
4575 
4576     IF (g_level_unexpected >= g_current_runtime_level ) THEN
4577       FND_LOG.STRING(g_level_unexpected,
4578                      'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.update_header_rounding_curr',
4579                       sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80));
4580     END IF;
4581 
4582 END update_header_rounding_curr;
4583 
4584 ----------------------------------------------------------------
4585 --  PRIVATE PROCEDURE
4586 --  update_header_rounding_info
4587 --
4588 --  DESCRIPTION
4589 --  This procedure stores header rounding info for each group which will be
4590 --  used later for rounding adjustments.
4591 
4592 PROCEDURE update_header_rounding_info(
4593            p_tax_line_id              IN            ZX_LINES.TAX_LINE_ID%TYPE,
4594            p_tax_id                   IN            ZX_TAXES_B.TAX_ID%TYPE,
4595            p_Rounding_Rule_Code       IN            ZX_LINES.Rounding_Rule_Code%TYPE,
4596            p_min_acct_unit            IN            ZX_LINES.MINIMUM_ACCOUNTABLE_UNIT%TYPE,
4597            p_precision                IN            ZX_LINES.PRECISION%TYPE,
4598            p_unrounded_tax_amt        IN            ZX_LINES.UNROUNDED_TAX_AMT%TYPE,
4599            p_tax_amt                  IN            ZX_LINES.TAX_AMT%TYPE,
4600            p_tax_amt_tax_curr         IN            ZX_LINES.TAX_AMT_TAX_CURR%TYPE,
4601            p_tax_amt_funcl_curr       IN            ZX_LINES.TAX_AMT_FUNCL_CURR%TYPE,
4602            p_taxable_amt_tax_curr     IN            ZX_LINES.TAXABLE_AMT_TAX_CURR%TYPE,
4603            p_taxable_amt_funcl_curr   IN            ZX_LINES.TAXABLE_AMT_FUNCL_CURR%TYPE,
4604            p_tax_curr_conv_rate       IN            ZX_LINES.TAX_CURRENCY_CONVERSION_RATE%TYPE,
4605            p_currency_conversion_rate IN            ZX_LINES.CURRENCY_CONVERSION_RATE%TYPE,
4606            p_prev_hdr_grp_rec         IN OUT NOCOPY HDR_GRP_REC_TYPE,
4607            p_curr_hdr_grp_rec         IN            HDR_GRP_REC_TYPE,
4608            p_same_tax                 IN            VARCHAR2,
4609            p_sum_unrnd_tax_amt        IN            NUMBER,
4610            p_sum_rnd_tax_amt          IN            NUMBER,
4611            p_sum_rnd_tax_curr         IN            NUMBER,
4612            p_sum_rnd_funcl_curr       IN            NUMBER,
4613            p_ledger_id                IN            ZX_LINES.LEDGER_ID%TYPE,
4614            p_return_status               OUT NOCOPY VARCHAR2,
4615            p_error_buffer                OUT NOCOPY VARCHAR2
4616          )
4617 IS
4618   j               BINARY_INTEGER;
4619 BEGIN
4620 
4621   IF (g_level_statement >= g_current_runtime_level ) THEN
4622     FND_LOG.STRING(g_level_statement,
4623                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.update_header_rounding_info.BEGIN',
4624                    'ZX_TDS_TAX_ROUNDING_PKG: update_header_rounding_info(+)');
4625   END IF;
4626 
4627   --
4628   -- init  return status
4629   --
4630   p_return_status  := FND_API.G_RET_STS_SUCCESS;
4631 
4632   j := g_hdr_rounding_info_tbl.COUNT;
4633 
4634   --
4635   -- update header group info only if this is
4636   -- a new rounding group
4637   --
4638   IF p_same_tax = 'N' THEN
4639     --
4640     -- update the previous header group with values of current
4641     -- header group information, in case p_same_tax is 'Y',
4642     -- p_prev_hdr_grp_rec would pass out the original IN values
4643     --
4644     p_prev_hdr_grp_rec := p_curr_hdr_grp_rec;
4645 
4646     --
4647     -- this is a new group
4648     --
4649     j := j + 1;
4650 
4651     --
4652     -- store rounding info  for later use
4653     --
4654     g_hdr_rounding_info_tbl(j).Rounding_Rule_Code :=  p_Rounding_Rule_Code;
4655     g_hdr_rounding_info_tbl(j).min_acct_unit :=  p_min_acct_unit;
4656     g_hdr_rounding_info_tbl(j).precision     := p_precision;
4657     g_hdr_rounding_info_tbl(j).max_unrnd_tax_amt    := 0;
4658     g_hdr_rounding_info_tbl(j).sum_unrnd_tax_amt := p_sum_unrnd_tax_amt;
4659     g_hdr_rounding_info_tbl(j).sum_rnd_tax_amt := p_sum_rnd_tax_amt;
4660     g_hdr_rounding_info_tbl(j).sum_rnd_tax_curr := p_sum_rnd_tax_curr;
4661     g_hdr_rounding_info_tbl(j).sum_rnd_funcl_curr := p_sum_rnd_funcl_curr;
4662     g_hdr_rounding_info_tbl(j).ledger_id := p_ledger_id;
4663     g_hdr_rounding_info_tbl(j).total_rec_in_grp := 0;
4664 
4665   END IF;
4666 
4667   --
4668   -- sum of unround tax amounts in the group so far
4669   --
4670   g_hdr_rounding_info_tbl(j).sum_unrnd_tax_amt :=
4671        g_hdr_rounding_info_tbl(j).sum_unrnd_tax_amt + p_unrounded_tax_amt;
4672   --
4673   -- sum of rounded tax amounts in the group so far
4674   --
4675   g_hdr_rounding_info_tbl(j).sum_rnd_tax_amt :=
4676        g_hdr_rounding_info_tbl(j).sum_rnd_tax_amt + p_tax_amt;
4677   --
4678   -- sum of rounded tax amounts in tax currency in the group so far
4679   --
4680   g_hdr_rounding_info_tbl(j).sum_rnd_tax_curr :=
4681        g_hdr_rounding_info_tbl(j).sum_rnd_tax_curr + p_tax_amt_tax_curr;
4682   --
4683   -- sum of rounded tax amounts in functional currency in the group so far
4684   --
4685   g_hdr_rounding_info_tbl(j).sum_rnd_funcl_curr :=
4686        g_hdr_rounding_info_tbl(j).sum_rnd_funcl_curr + p_tax_amt_funcl_curr;
4687   --
4688   -- total number of records in the group so far
4689   --
4690   g_hdr_rounding_info_tbl(j).total_rec_in_grp :=
4691        g_hdr_rounding_info_tbl(j).total_rec_in_grp + 1;
4692 
4693   --
4694   -- store the rounding info for the tax line that has the largest
4695   -- absolute unround tax amount for using in adjustment later on
4696   --
4697   IF g_hdr_rounding_info_tbl(j).max_unrnd_tax_amt <= ABS(p_unrounded_tax_amt)  THEN
4698     g_hdr_rounding_info_tbl(j).max_unrnd_tax_amt := ABS(p_unrounded_tax_amt);
4699     g_hdr_rounding_info_tbl(j).tax_line_id := p_tax_line_id;
4700     g_hdr_rounding_info_tbl(j).tax_id      := p_tax_id;
4701     g_hdr_rounding_info_tbl(j).tax_curr_conv_rate := p_tax_curr_conv_rate;
4702     g_hdr_rounding_info_tbl(j).currency_conversion_rate := p_currency_conversion_rate;
4703     g_hdr_rounding_info_tbl(j).rnd_tax_amt := p_tax_amt;
4704     g_hdr_rounding_info_tbl(j).rnd_tax_amt_tax_curr := p_tax_amt_tax_curr;
4705     g_hdr_rounding_info_tbl(j).rnd_tax_amt_funcl_curr := p_tax_amt_funcl_curr;
4706     g_hdr_rounding_info_tbl(j).rnd_taxable_amt_tax_curr := p_taxable_amt_tax_curr;
4707     g_hdr_rounding_info_tbl(j).rnd_taxable_amt_funcl_curr := p_taxable_amt_funcl_curr;
4708     g_hdr_rounding_info_tbl(j).tax_calculation_formula :=
4709                                  p_curr_hdr_grp_rec.tax_calculation_formula;
4710     g_hdr_rounding_info_tbl(j).tax_rate := p_curr_hdr_grp_rec.tax_rate;
4711     g_hdr_rounding_info_tbl(j).mrc_tax_line_flag :=
4712                                       p_curr_hdr_grp_rec.mrc_tax_line_flag;
4713 
4714   END IF;
4715 
4716   IF (g_level_statement >= g_current_runtime_level ) THEN
4717     FND_LOG.STRING(g_level_statement,
4718                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.update_header_rounding_info.END',
4719                    'ZX_TDS_TAX_ROUNDING_PKG: update_header_rounding_info(-)');
4720   END IF;
4721 EXCEPTION
4722   WHEN OTHERS THEN
4723     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4724     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
4725 
4726     IF (g_level_unexpected >= g_current_runtime_level ) THEN
4727       FND_LOG.STRING(g_level_unexpected,
4728                      'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.update_header_rounding_info',
4729                       sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80));
4730     END IF;
4731 
4732 END update_header_rounding_info;
4733 
4734 -----------------------------------------------------------------------
4735 --  PRIVATE PROCEDURE
4736 --  do_rounding
4737 --
4738 --  DESCRIPTION
4739 --  This procedure gathers rounding information needed to round tax
4740 --  in transaction currency and tax currency and then does LINE level
4741 --  rounding for tax amount and taxable amount in transaction currency,
4742 --  tax currency and functional currency.  Prorated amount is also
4743 --  handled here
4744 --
4745 
4746 PROCEDURE do_rounding(
4747            p_tax_id                        IN            ZX_TAXES_B.TAX_ID%TYPE,
4748            p_tax_rate_id                   IN            ZX_RATES_B.TAX_RATE_ID%TYPE,
4749            p_tax_amt                       IN OUT NOCOPY ZX_LINES.TAX_AMT%TYPE,
4750            p_taxable_amt                   IN OUT NOCOPY ZX_LINES.TAXABLE_AMT%TYPE,
4751            p_orig_tax_amt                  IN OUT NOCOPY ZX_LINES.TAX_AMT%TYPE,
4752            p_orig_taxable_amt              IN OUT NOCOPY ZX_LINES.TAXABLE_AMT%TYPE,
4753            p_orig_tax_amt_tax_curr         IN OUT NOCOPY ZX_LINES.TAX_AMT%TYPE,
4754            p_orig_taxable_amt_tax_curr     IN OUT NOCOPY ZX_LINES.TAXABLE_AMT%TYPE,
4755            p_cal_tax_amt                   IN OUT NOCOPY ZX_LINES.CAL_TAX_AMT%TYPE,
4756            p_tax_amt_tax_curr              IN OUT NOCOPY ZX_LINES.TAX_AMT_TAX_CURR%TYPE,
4757            p_taxable_amt_tax_curr             OUT NOCOPY ZX_LINES.TAXABLE_AMT_TAX_CURR%TYPE,
4758            p_cal_tax_amt_tax_curr             OUT NOCOPY ZX_LINES.CAL_TAX_AMT_TAX_CURR%TYPE,
4759            p_tax_amt_funcl_curr               OUT NOCOPY ZX_LINES.TAX_AMT_FUNCL_CURR%TYPE,
4760            p_taxable_amt_funcl_curr           OUT NOCOPY ZX_LINES.TAXABLE_AMT_FUNCL_CURR%TYPE,
4761            p_cal_tax_amt_funcl_curr           OUT NOCOPY ZX_LINES.CAL_TAX_AMT_FUNCL_CURR%TYPE,
4762            p_trx_currency_code             IN            ZX_LINES.TRX_CURRENCY_CODE%TYPE,
4763            p_tax_currency_code                OUT NOCOPY ZX_LINES.TAX_CURRENCY_CODE%TYPE,
4764            p_tax_currency_conversion_type  IN            ZX_LINES.TAX_CURRENCY_CONVERSION_TYPE%TYPE,
4765            p_tax_currency_conversion_rate  IN OUT NOCOPY ZX_LINES.TAX_CURRENCY_CONVERSION_RATE%TYPE,
4766            p_tax_currency_conversion_date  IN            ZX_LINES.TAX_CURRENCY_CONVERSION_DATE%TYPE,
4767            p_currency_conversion_type      IN            ZX_LINES.CURRENCY_CONVERSION_TYPE%TYPE,
4768            p_currency_conversion_rate      IN            ZX_LINES.CURRENCY_CONVERSION_RATE%TYPE,
4769            p_currency_conversion_date      IN            ZX_LINES.CURRENCY_CONVERSION_DATE%TYPE,
4770            p_Rounding_Rule_Code            IN            ZX_LINES.Rounding_Rule_Code%TYPE,
4771            p_ledger_id                     IN            ZX_LINES.LEDGER_ID%TYPE,
4772            p_min_acct_unit                 IN OUT NOCOPY ZX_LINES.MINIMUM_ACCOUNTABLE_UNIT%TYPE,
4773            p_precision                     IN OUT NOCOPY ZX_LINES.PRECISION%TYPE,
4774            p_application_id                IN            ZX_LINES.APPLICATION_ID%TYPE,
4775            p_internal_organization_id      IN            ZX_LINES.INTERNAL_ORGANIZATION_ID%TYPE,
4776            p_event_class_mapping_id        IN            ZX_LINES_DET_FACTORS.EVENT_CLASS_MAPPING_ID%TYPE,
4777            p_tax_calculation_formula       IN            ZX_LINES.TAX_CALCULATION_FORMULA%TYPE,
4778            p_tax_rate                      IN            ZX_LINES.TAX_RATE%TYPE,
4779            p_prd_total_tax_amt             IN OUT NOCOPY ZX_LINES.prd_total_tax_amt%TYPE,
4780            p_prd_total_tax_amt_tax_curr       OUT NOCOPY ZX_LINES.prd_total_tax_amt_tax_curr%TYPE,
4781            p_prd_total_tax_amt_funcl_curr     OUT NOCOPY ZX_LINES.prd_total_tax_amt_funcl_curr%TYPE,
4782            p_unrounded_taxable_amt         IN ZX_LINES.UNROUNDED_TAXABLE_AMT%TYPE,
4783            p_unrounded_tax_amt             IN ZX_LINES.UNROUNDED_TAX_AMT%TYPE,
4784            p_mrc_tax_line_flag             IN zx_lines.mrc_tax_line_flag%TYPE,
4785            p_tax_provider_id               IN zx_lines.tax_provider_id%TYPE,
4786            --p_quote_flag                    IN VARCHAR2,
4787            p_return_status                    OUT NOCOPY VARCHAR2,
4788            p_error_buffer                     OUT NOCOPY VARCHAR2
4789          )
4790 IS
4791   l_tax_min_acct_unit            ZX_TAXES_B.MINIMUM_ACCOUNTABLE_UNIT%TYPE;
4792   l_tax_precision                ZX_TAXES_B.TAX_PRECISION%TYPE;
4793   l_tax_currency_conversion_type ZX_TAXES_B.EXCHANGE_RATE_TYPE%TYPE;
4794   l_prd_total_tax_amt            ZX_LINES.prd_total_tax_amt%TYPE;
4795   l_currency_conversion_type     ZX_LINES.CURRENCY_CONVERSION_TYPE%TYPE;
4796   l_tax_currency_conversion_date ZX_LINES.TAX_CURRENCY_CONVERSION_DATE%TYPE; --bug#6526550
4797   l_trx_currency_conversion_date ZX_LINES.CURRENCY_CONVERSION_DATE%TYPE; --Bug7183884
4798   l_funcl_min_acct_unit          FND_CURRENCIES.MINIMUM_ACCOUNTABLE_UNIT%TYPE;
4799   l_funcl_precision              FND_CURRENCIES.PRECISION%TYPE;
4800   l_funcl_currency_code          FND_CURRENCIES.CURRENCY_CODE%TYPE;
4801 
4802 BEGIN
4803 
4804   IF (g_level_statement >= g_current_runtime_level ) THEN
4805     FND_LOG.STRING(g_level_statement,
4806                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.do_rounding.BEGIN',
4807                    'ZX_TDS_TAX_ROUNDING_PKG: do_rounding(+)');
4808   END IF;
4809 
4810   --
4811   -- init return status
4812   --
4813   p_return_status  := FND_API.G_RET_STS_SUCCESS;
4814   --
4815   -- get unround  amt
4816   --
4817   l_prd_total_tax_amt := p_prd_total_tax_amt;
4818   l_tax_currency_conversion_date := p_tax_currency_conversion_date; --bug#6526550
4819   l_trx_currency_conversion_date := p_currency_conversion_date; --Bug7183884
4820    --
4821    -- get rounding info for non-mrc tax lines
4822    -- (rounding info is available for MRC tax lines)
4823    --
4824    IF p_mrc_tax_line_flag = 'N' THEN
4825      get_rounding_info(p_tax_id,
4826                        p_tax_currency_code,
4827                        --p_tax_currency_conversion_date, --bug#6526550
4828                        l_tax_currency_conversion_date, --bug#6526550
4829                        p_trx_currency_code,
4830                        p_currency_conversion_date,
4831                        p_min_acct_unit,
4832                        p_precision,
4833                        l_tax_min_acct_unit,
4834                        l_tax_precision,
4835                        l_tax_currency_conversion_type,
4836                        p_return_status,
4837                        p_error_buffer);
4838 
4839      IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
4840        RETURN;
4841      END IF;
4842 
4843      IF (g_level_statement >= g_current_runtime_level ) THEN
4844        FND_LOG.STRING(g_level_statement,
4845                       'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.do_rounding',
4846                       'l_tax_precision = ' || to_char(l_tax_precision)||
4847                       'l_tax_min_acct_unit = ' || to_char(l_tax_min_acct_unit) ||
4848                       ' tax curr conv type = ' || l_tax_currency_conversion_type ||
4849                       ' tax curr conv type passed in = ' ||
4850                        p_tax_currency_conversion_type||
4851 		      'l_tax_currency_conversion_date = '||
4852 		       l_tax_currency_conversion_date); --bug#6526550
4853      END IF;
4854    END IF;      -- p_mrc_tax_line_flag = 'N'
4855 
4856 
4857 
4858    -- Bug 7138306: Revert the changes in revision 120.64.12000000.14
4859    -- for bug 6969126. The passed-in p_min_acct_unit and p_precision
4860    -- should be used for trx currency instead of tax settings
4861    --
4862    -- perform Line level rounding for tax amount and taxable amount
4863    -- using Tax Level settings eventhough the amount is in trx currency.
4864    --
4865    round_line_level(p_tax_amt,
4866                     p_taxable_amt,
4867                     p_prd_total_tax_amt,
4868                     p_Rounding_Rule_Code,
4869                     p_min_acct_unit,
4870                     p_precision,
4871                     p_trx_currency_code,
4872                     p_application_id,
4873                     p_internal_organization_id,
4874                     p_event_class_mapping_id,
4875                     p_unrounded_taxable_amt,
4876                     p_unrounded_tax_amt,
4877                     p_return_status,
4878                     p_error_buffer);
4879 
4880   IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
4881     RETURN;
4882   END IF;
4883 
4884   --
4885   -- Bug#5506495- determine tax_currency_conversion_type
4886   -- if it is not available
4887   --
4888   -- if p_tax_currency_conversion_type is not available, get
4889   -- the exchange rate type from zx_taxes_b
4890   --
4891   l_tax_currency_conversion_type := NVL(p_tax_currency_conversion_type, l_tax_currency_conversion_type);
4892 
4893   get_funcl_curr_info(
4894                 p_ledger_id,
4895                 l_funcl_currency_code,
4896                 l_funcl_min_acct_unit,
4897                 l_funcl_precision,
4898                 p_return_status,
4899                 p_error_buffer );
4900 
4901   IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
4902     RETURN;
4903   END IF;
4904 
4905   IF l_tax_currency_conversion_type IS NULL THEN
4906     IF p_tax_currency_code = p_trx_currency_code THEN
4907       -- in this case, tax currency conversion type is
4908       -- irrelevant as conversion rate is 1
4909       l_currency_conversion_type     := p_currency_conversion_type;
4910       p_tax_currency_conversion_rate := 1;
4911     ELSE
4912       -- check if tax currency is the same as
4913       -- functional currency
4914       --
4915       IF p_tax_currency_code = l_funcl_currency_code THEN
4916         l_currency_conversion_type     := p_currency_conversion_type;
4917         p_tax_currency_conversion_rate := p_currency_conversion_rate;
4918       ELSE
4919         -- tax currency is not the same as functional currency
4920         -- set tax conversion type from zx_taxes_b which is
4921         -- NULL in this case
4922         l_currency_conversion_type     := NULL;
4923       END IF;
4924     END IF;
4925   ELSE
4926     -- tax currency conversion type is available either
4927     -- from passed in or in zx_taxes_b
4928     l_currency_conversion_type := l_tax_currency_conversion_type;
4929   END IF;
4930 
4931   -- bug 5636132 convert orig_tax_amt to orig_tax_amt_tax_curr
4932   -- convert orig_taxable_amt to orig_taxable_amt_tax_curr
4933 
4934   IF p_orig_tax_amt is NOT NULL AND p_orig_tax_amt_tax_curr is NULL THEN
4935     IF p_tax_currency_code = l_funcl_currency_code
4936       AND p_tax_currency_conversion_rate IS NULL
4937       AND p_currency_conversion_rate IS NULL THEN
4938         -- Tax Currency Conversion is NULL. Ignore the conversion to avoid the error.
4939         NULL;
4940     ELSE
4941   	  convert_to_currency(
4942              p_from_currency        =>  p_trx_currency_code,
4943              p_to_currency          =>  p_tax_currency_code,
4944              --p_conversion_date      =>  p_tax_currency_conversion_date, --bug#6526550
4945       	     p_conversion_date      => l_tax_currency_conversion_date, --bug#6526550
4946              p_tax_conversion_type  =>  l_currency_conversion_type,
4947              p_trx_conversion_type  =>  NULL,
4948              p_to_curr_conv_rate    =>  p_tax_currency_conversion_rate,
4949              p_from_amt             =>  p_orig_tax_amt,
4950              p_to_amt               =>  p_orig_tax_amt_tax_curr,
4951              p_return_status        =>  p_return_status,
4952              p_error_buffer         =>  p_error_buffer,
4953              p_trx_conversion_date => l_trx_currency_conversion_date);--Bug7183884
4954 
4955       --Bug 7109899
4956 
4957       IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
4958         RETURN;
4959       END IF;
4960     END IF;
4961   END IF;
4962 
4963   IF p_orig_taxable_amt is NOT NULL AND p_orig_taxable_amt_tax_curr is NULL THEN
4964     IF p_tax_currency_code = l_funcl_currency_code
4965       AND p_tax_currency_conversion_rate IS NULL
4966       AND p_currency_conversion_rate IS NULL THEN
4967         -- Tax Currency Conversion is NULL. Ignore the conversion to avoid the error.
4968         NULL;
4969     ELSE
4970   	  convert_to_currency(
4971              p_from_currency        =>  p_trx_currency_code,
4972              p_to_currency          =>  p_tax_currency_code,
4973              --p_conversion_date      =>  l_tax_currency_conversion_date, --bug#6526550
4974       	     p_conversion_date      =>  l_tax_currency_conversion_date, --bug#6526550
4975              p_tax_conversion_type  =>  l_currency_conversion_type,
4976              p_trx_conversion_type  =>  NULL,
4977              p_to_curr_conv_rate    =>  p_tax_currency_conversion_rate,
4978              p_from_amt             =>  p_orig_taxable_amt,
4979              p_to_amt               =>  p_orig_taxable_amt_tax_curr,
4980              p_return_status        =>  p_return_status,
4981              p_error_buffer         =>  p_error_buffer,
4982              p_trx_conversion_date => l_trx_currency_conversion_date); --Bug7183884
4983 
4984       -- Bug 7109899
4985 
4986       IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
4987         RETURN;
4988       END IF;
4989     END IF;
4990   END IF;
4991 
4992   --
4993   -- covert to tax currency and functional currency for non-mrc tax lines
4994   --
4995   IF p_mrc_tax_line_flag = 'N' THEN
4996 
4997     IF p_tax_amt = 0 THEN
4998       --
4999       -- if rounded tax amt is zero, set tax currency
5000       -- and functional currency of tax amount to zero
5001       --
5002       p_tax_amt_tax_curr       := 0;
5003       p_tax_amt_funcl_curr     := 0;
5004       p_cal_tax_amt_tax_curr   := 0;
5005       p_cal_tax_amt_funcl_curr := 0;
5006     ELSE
5007 
5008       -- bug fix 3551605, add the following if condition
5009       -- convert the round the tax_amount_tax_curr conditionally.
5010       IF p_tax_provider_id IS NULL
5011        OR (p_tax_provider_id IS NOT NULL AND p_tax_amt_tax_curr IS NULL) THEN
5012         IF p_tax_currency_code = l_funcl_currency_code
5013           AND p_tax_currency_conversion_rate IS NULL
5014           AND p_currency_conversion_rate IS NULL THEN
5015             -- Tax Currency Conversion is NULL. Ignore the conversion to avoid the error.
5016             NULL;
5017         ELSE
5018           --
5019           -- convert to tax amt tax currency based
5020           -- on unrounded tax amt
5021           --
5022           conv_rnd_tax_tax_curr(
5023                               p_trx_currency_code,
5024                               p_tax_currency_code,
5025                               --p_tax_currency_conversion_date, --bug#6526550
5026              		      l_tax_currency_conversion_date, --bug#6526550
5027                               --p_tax_currency_conversion_type,
5028                               l_currency_conversion_type,
5029                               p_currency_conversion_type,
5030                               p_tax_currency_conversion_rate,
5031                               p_unrounded_tax_amt,
5032                               p_tax_amt_tax_curr,
5033                               p_Rounding_Rule_Code,
5034                               l_tax_min_acct_unit,
5035                               l_tax_precision,
5036                               p_return_status,
5037                               p_error_buffer,
5038                               l_trx_currency_conversion_date);--Bug7183884
5039 
5040           IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
5041             RETURN;
5042           END IF;
5043         END IF;
5044       END IF;
5045 
5046           -- round cal tax amt ???????????????
5047           -- convert to cal tax amt tax currency based
5048           -- on unrounded cal tax amt
5049           -- ???????????????????????????????
5050 
5051 --
5052 -- convert to tax amt functional currency based
5053 -- on unrounded tax amt
5054 --
5055 -- Bug 12329231 Starts
5056 
5057 --      IF l_funcl_currency_code IS NULL THEN
5058 --
5059 --        IF (g_level_statement >= g_current_runtime_level ) THEN
5060 --          FND_LOG.STRING(g_level_statement,
5061 --                          'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.do_rounding',
5062 --                          'l_funcl_currency_code is NULL, deriving the functional currency');
5063 --        END IF;
5064 
5065 --        get_funcl_curr_info(
5066 --                    p_ledger_id,
5067 --                    l_funcl_currency_code,
5068 --                    l_funcl_min_acct_unit,
5069 --                    l_funcl_precision,
5070 --                    p_return_status,
5071 --                    p_error_buffer );
5072 
5073 --      END IF;
5074 
5075 --      IF (g_level_statement >= g_current_runtime_level ) THEN
5076 --        FND_LOG.STRING(g_level_statement,
5077 --                        'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.do_rounding',
5078 --                        'l_funcl_currency_code is:'||l_funcl_currency_code||
5079 --                        ':p_trx_currency_code is:'||p_trx_currency_code||
5080 --                        ':p_currency_conversion_rate is:'||p_currency_conversion_rate||
5081 --                        ':Quote Flag: '||Nvl(p_quote_flag,'X'));
5082 --      END IF;
5083 
5084 
5085 --      IF Nvl(p_quote_flag,'N') = 'Y' THEN
5086 --        IF (g_level_statement >= g_current_runtime_level ) THEN
5087 --          FND_LOG.STRING(g_level_statement,
5088 --                          'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.do_rounding',
5089 --                          'Skipping the Preventive Check for currency_conversion_rate in Quote Mode');
5090 --        END IF;
5091 --      ELSIF (l_funcl_currency_code <> p_trx_currency_code) AND p_currency_conversion_rate IS NULL THEN
5092 
5093 --        p_return_status := FND_API.G_RET_STS_ERROR;
5094 
5095 --        FND_MESSAGE.SET_NAME('ZX','ZX_ROUND_NO_EXCH_RATE');
5096 --        FND_MESSAGE.SET_TOKEN('FROM_CURRENCY', p_trx_currency_code);
5097 --        FND_MESSAGE.SET_TOKEN('TO_CURRENCY', l_funcl_currency_code);
5098 --        FND_MESSAGE.SET_TOKEN('CURRENCY_CONV_DATE', p_currency_conversion_date);
5099 
5100 --        IF ZX_TDS_CALC_SERVICES_PUB_PKG.g_msg_context_info_rec.trx_id IS NOT NULL THEN
5101 --          ZX_API_PUB.add_msg(ZX_TDS_CALC_SERVICES_PUB_PKG.g_msg_context_info_rec);
5102 --        ELSE
5103 --          FND_MSG_PUB.Add;
5104 --        END IF;
5105 
5106 --        IF (g_level_statement >= g_current_runtime_level ) THEN
5107 --          FND_LOG.STRING(g_level_statement,
5108 --                          'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.do_rounding',
5109 --                          p_error_buffer);
5110 --        END IF;
5111 
5112 --        RETURN;
5113 --      END IF;
5114       -- Bug 12329231 Ends
5115 
5116       conv_rnd_tax_funcl_curr(
5117                             p_currency_conversion_rate,
5118                             p_unrounded_tax_amt,
5119                             p_tax_amt_funcl_curr,
5120                             p_ledger_id,
5121                             p_return_status,
5122                             p_error_buffer);
5123 
5124 
5125       IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
5126         RETURN;
5127       END IF;
5128 
5129       --
5130       -- convert to cal tax amt functional currency based
5131       -- on unrounded cal tax amt
5132       -- ????? not sure what to do with cal tax amt now
5133       --
5134       conv_rnd_tax_funcl_curr(
5135                             p_currency_conversion_rate,
5136                             p_cal_tax_amt,
5137                             p_cal_tax_amt_funcl_curr,
5138                             p_ledger_id,
5139                             p_return_status,
5140                             p_error_buffer);
5141 
5142       IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
5143         RETURN;
5144       END IF;
5145     END IF;
5146 
5147     IF p_taxable_amt = 0 THEN
5148       --
5149       -- if rounded taxable amt is zero, set tax currency
5150       -- and functional currency of taxable amount to zero
5151       --
5152       p_taxable_amt_tax_curr   := 0;
5153       p_taxable_amt_funcl_curr := 0;
5154     ELSE
5155       IF p_tax_currency_code = l_funcl_currency_code
5156         AND p_tax_currency_conversion_rate IS NULL
5157         AND p_currency_conversion_rate IS NULL THEN
5158             -- Tax Currency Conversion is NULL. Ignore the conversion to avoid the error.
5159             NULL;
5160       ELSE
5161         --
5162         -- convert to taxable amt tax currency based
5163         -- on unrounded taxable amt
5164         --
5165         conv_rnd_taxable_tax_curr(
5166                             p_trx_currency_code,
5167                             p_tax_currency_code,
5168                             --p_tax_currency_conversion_date, --bug#6526550
5169                             l_tax_currency_conversion_date, --bug#6526550
5170                             --p_tax_currency_conversion_type,
5171                             l_currency_conversion_type,
5172                             p_currency_conversion_type,
5173                             p_tax_currency_conversion_rate,
5174                             p_unrounded_taxable_amt,
5175                             p_taxable_amt_tax_curr,
5176                             p_Rounding_Rule_Code,
5177                             l_tax_min_acct_unit,
5178                             l_tax_precision,
5179                             p_tax_calculation_formula,
5180                             p_tax_rate,
5181                             p_tax_rate_id,
5182                             p_tax_amt_tax_curr,
5183                             p_return_status,
5184                             p_error_buffer,
5185                             l_trx_currency_conversion_date); --Bug7183884
5186         IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
5187           RETURN;
5188         END IF;
5189       END IF;
5190       --
5191       -- convert to taxable amt functional currency based
5192       -- on unrounded taxable amt
5193       --
5194       conv_rnd_taxable_funcl_curr(
5195                             p_currency_conversion_rate,
5196                             p_unrounded_taxable_amt,
5197                             p_taxable_amt_funcl_curr,
5198                             p_ledger_id,
5199                             p_tax_calculation_formula,
5200                             p_tax_rate,
5201                             p_tax_rate_id,
5202                             p_tax_amt_funcl_curr,
5203                             p_return_status,
5204                             p_error_buffer);
5205       IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
5206         RETURN;
5207       END IF;
5208 
5209     END IF;
5210 
5211     --
5212     -- perform rounding for prorated total tax amount if
5213     -- it is not null
5214     --
5215     IF p_prd_total_tax_amt IS NOT NULL THEN
5216       IF p_prd_total_tax_amt = 0 THEN
5217         --
5218         -- if rounded prorated tax amt is zero, set prorated tax
5219         -- currency and functional currency to zero
5220         --
5221         p_prd_total_tax_amt_tax_curr       := 0;
5222         p_prd_total_tax_amt_funcl_curr     := 0;
5223       ELSE
5224         IF p_tax_currency_code = l_funcl_currency_code
5225           AND p_tax_currency_conversion_rate IS NULL
5226           AND p_currency_conversion_rate IS NULL THEN
5227             -- Tax Currency Conversion is NULL. Ignore the conversion to avoid the error.
5228             NULL;
5229         ELSE
5230           --
5231           -- convert to tax currency based
5232           -- on unrounded prorated  amt
5233           --
5234           conv_rnd_tax_tax_curr(
5235                             p_trx_currency_code,
5236                             p_tax_currency_code,
5237                             --p_tax_currency_conversion_date, --bug#6526550
5238              		    l_tax_currency_conversion_date, --bug#6526550
5239                             --p_tax_currency_conversion_type,
5240                             l_currency_conversion_type,
5241                             p_currency_conversion_type,
5242                             p_tax_currency_conversion_rate,
5243                             l_prd_total_tax_amt,
5244                             p_prd_total_tax_amt_tax_curr,
5245                             p_Rounding_Rule_Code,
5246                             l_tax_min_acct_unit,
5247                             l_tax_precision,
5248                             p_return_status,
5249                             p_error_buffer,
5250                             l_trx_currency_conversion_date);--Bug7183884
5251           IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
5252             RETURN;
5253           END IF;
5254         END IF;
5255         --
5256         -- convert to functional currency based
5257         -- on unrounded prorated  amt
5258         --
5259         conv_rnd_tax_funcl_curr(
5260                             p_currency_conversion_rate,
5261                             l_prd_total_tax_amt,
5262                             p_prd_total_tax_amt_funcl_curr,
5263                             p_ledger_id,
5264                             p_return_status,
5265                             p_error_buffer);
5266         IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
5267           RETURN;
5268         END IF;
5269       END IF;
5270     END IF;
5271   END IF;      -- p_mrc_tax_line_flag = 'N'
5272 
5273   IF (g_level_statement >= g_current_runtime_level ) THEN
5274 
5275     FND_LOG.STRING(g_level_statement,
5276                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.do_rounding.END',
5277                    'ZX_TDS_TAX_ROUNDING_PKG: do_rounding(-)'||p_return_status);
5278   END IF;
5279 
5280 EXCEPTION
5281   WHEN OTHERS THEN
5282     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5283     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
5284 
5285     IF (g_level_unexpected >= g_current_runtime_level ) THEN
5286       FND_LOG.STRING(g_level_unexpected,
5287                      'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.do_rounding',
5288                       p_error_buffer);
5289     END IF;
5290 
5291 END do_rounding;
5292 
5293 -----------------------------------------------------------------------
5294 --  PRIVATE PROCEDURE
5295 --  process_tax_line_create
5296 --
5297 --  DESCRIPTION
5298 --  This procedure  initializes sum of unrounded tax amounts,
5299 --  sum of rounded tax amounts, sum of rounded tax amounts in
5300 --  tax currency and sum of rounded tax amounts in functional
5301 --  currency for  fresh created tax line
5302 
5303 PROCEDURE process_tax_line_create(
5304             p_sum_unrnd_tax_amt     OUT NOCOPY NUMBER,
5305             p_sum_rnd_tax_amt       OUT NOCOPY NUMBER,
5306             p_sum_rnd_tax_curr       OUT NOCOPY NUMBER,
5307             p_sum_rnd_funcl_curr    OUT NOCOPY NUMBER,
5308             p_return_status         OUT NOCOPY VARCHAR2,
5309             p_error_buffer          OUT NOCOPY VARCHAR2
5310          )
5311 IS
5312 
5313 BEGIN
5314 
5315   IF (g_level_statement >= g_current_runtime_level ) THEN
5316     FND_LOG.STRING(g_level_statement,
5317                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.process_tax_line_create.BEGIN',
5318                    'ZX_TDS_TAX_ROUNDING_PKG: process_tax_line_create(+)');
5319   END IF;
5320 
5321   p_return_status  := FND_API.G_RET_STS_SUCCESS;
5322 
5323   --
5324   -- init sum  to 0 for fresh rounding
5325   --
5326   p_sum_unrnd_tax_amt   := 0;
5327   p_sum_rnd_tax_amt     := 0;
5328   p_sum_rnd_tax_curr    := 0;
5329   p_sum_rnd_funcl_curr  := 0;
5330 
5331   IF (g_level_statement >= g_current_runtime_level ) THEN
5332 
5333     FND_LOG.STRING(g_level_statement,
5334                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.process_tax_line_create.END',
5335                    'ZX_TDS_TAX_ROUNDING_PKG: process_tax_line_create(-)'||p_return_status);
5336   END IF;
5337 
5338 EXCEPTION
5339   WHEN OTHERS THEN
5340     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5341     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
5342     IF (g_level_unexpected >= g_current_runtime_level ) THEN
5343       FND_LOG.STRING(g_level_unexpected,
5344                      'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.process_tax_line_create',
5345                       p_error_buffer);
5346     END IF;
5347 
5348 END process_tax_line_create;
5349 ----------------------------------------------------------------
5350 --  PRIVATE PROCEDURE
5351 --  process_tax_line_upd_override
5352 --
5353 --  DESCRIPTION
5354 --  This procedure  initializes sum of unrounded tax amounts,
5355 --  sum of rounded tax amounts, sum of rounded tax amounts in
5356 --  tax currency and sum of rounded tax amounts in functional
5357 --  currency for  tax line that has been updated or  overridden
5358 --
5359 
5360 PROCEDURE process_tax_line_upd_override(
5361            p_curr_hdr_grp_rec        IN            HDR_GRP_REC_TYPE,
5362            p_sum_unrnd_tax_amt          OUT NOCOPY NUMBER,
5363            p_sum_rnd_tax_amt            OUT NOCOPY NUMBER,
5364            p_sum_rnd_tax_curr           OUT NOCOPY NUMBER,
5365            p_sum_rnd_funcl_curr         OUT NOCOPY NUMBER,
5366            p_event_class_rec         IN            ZX_API_PUB.EVENT_CLASS_REC_TYPE,
5367            p_return_status              OUT NOCOPY VARCHAR2,
5368            p_error_buffer               OUT NOCOPY VARCHAR2
5369          )
5370 IS
5371   l_trx_id                  ZX_LINES.TRX_ID%TYPE;
5372   l_application_id          ZX_LINES.APPLICATION_ID%TYPE;
5373   l_event_class_code        ZX_LINES.EVENT_CLASS_CODE%TYPE;
5374   l_entity_code             ZX_LINES.ENTITY_CODE%TYPE;
5375 
5376   CURSOR get_existing_sum_amt_csr
5377     (c_trx_id                        ZX_LINES.TRX_ID%TYPE,
5378      c_application_id                ZX_LINES.APPLICATION_ID%TYPE,
5379      c_event_class_code              ZX_LINES.EVENT_CLASS_CODE%TYPE,
5380      c_entity_code                   ZX_LINES.ENTITY_CODE%TYPE,
5381      c_tax_regime_code               ZX_REGIMES_B.TAX_REGIME_CODE%TYPE,
5382      c_tax                           ZX_TAXES_B.tax%TYPE,
5383      c_tax_status_code               ZX_STATUS_B.TAX_STATUS_CODE%TYPE,
5384      c_tax_rate_code                 ZX_RATES_B.TAX_RATE_CODE%TYPE,
5385      c_tax_rate                      ZX_LINES.TAX_RATE%TYPE,
5386      c_tax_rate_id                   ZX_LINES.TAX_RATE_ID%TYPE,
5387      c_tax_jurisdiction_code         ZX_LINES.TAX_JURISDICTION_CODE%TYPE,
5388      c_taxable_basis_formula         ZX_FORMULA_B.FORMULA_CODE%TYPE,
5389      c_tax_calculation_formula       ZX_FORMULA_B.FORMULA_CODE%TYPE,
5390      c_tax_amt_included_flag         ZX_LINES.TAX_AMT_INCLUDED_FLAG%TYPE,
5391      c_compounding_tax_flag          ZX_LINES.COMPOUNDING_TAX_FLAG%TYPE,
5392      c_historical_flag               ZX_LINES.HISTORICAL_FLAG%TYPE,
5393      c_self_assessed_flag            ZX_LINES.SELF_ASSESSED_FLAG%TYPE,
5394      c_overridden_flag               ZX_LINES.OVERRIDDEN_FLAG%TYPE,
5395      c_manually_entered_flag         ZX_LINES.MANUALLY_ENTERED_FLAG%TYPE,
5396      c_Copied_From_Other_Doc_Flag    ZX_LINES.COPIED_FROM_OTHER_DOC_FLAG%TYPE,
5397      c_associated_child_frozen_flag  ZX_LINES.ASSOCIATED_CHILD_FROZEN_FLAG%TYPE,
5398      c_tax_only_line_flag            ZX_LINES.TAX_ONLY_LINE_FLAG%TYPE,
5399      c_mrc_tax_line_flag             ZX_LINES.MRC_TAX_LINE_FLAG%TYPE,
5400      c_reporting_only_flag           ZX_LINES.REPORTING_ONLY_FLAG%TYPE,
5401      c_applied_from_application_id   ZX_LINES.APPLIED_FROM_APPLICATION_ID%TYPE,
5402      c_applied_from_evnt_cls_cd      ZX_LINES.APPLIED_FROM_EVENT_CLASS_CODE%TYPE,
5403      c_applied_from_entity_code      ZX_LINES.APPLIED_FROM_ENTITY_CODE%TYPE,
5404      c_applied_from_trx_id           ZX_LINES.APPLIED_FROM_TRX_ID%TYPE,
5405      c_applied_from_line_id          ZX_LINES.APPLIED_FROM_LINE_ID%TYPE,
5406      c_adjusted_doc_application_id   ZX_LINES.ADJUSTED_DOC_APPLICATION_ID%TYPE,
5407      c_adjusted_doc_entity_code      ZX_LINES.ADJUSTED_DOC_ENTITY_CODE%TYPE,
5408      c_adjusted_doc_evnt_cls_cd      ZX_LINES.ADJUSTED_DOC_EVENT_CLASS_CODE%TYPE,
5409      c_adjusted_doc_trx_id           ZX_LINES.ADJUSTED_DOC_TRX_ID%TYPE,
5410      --c_applied_to_application_id     ZX_LINES.APPLIED_TO_APPLICATION_ID%TYPE,
5411      --c_applied_to_evnt_cls_cd        ZX_LINES.APPLIED_TO_EVENT_CLASS_CODE%TYPE,
5412      --c_applied_to_entity_code        ZX_LINES.APPLIED_TO_ENTITY_CODE%TYPE,
5413      --c_applied_to_trx_id             ZX_LINES.APPLIED_TO_TRX_ID%TYPE,
5414      --c_applied_to_line_id            ZX_LINES.APPLIED_TO_LINE_ID%TYPE,
5415      c_tax_exemption_id              ZX_LINES.TAX_EXEMPTION_ID%TYPE,
5416      c_tax_rate_before_exemption     ZX_LINES.TAX_RATE_BEFORE_EXEMPTION%TYPE,
5417      c_rate_name_before_exemption    ZX_LINES.TAX_RATE_NAME_BEFORE_EXEMPTION%TYPE,
5418      c_exempt_rate_modifier          ZX_LINES.EXEMPT_RATE_MODIFIER%TYPE,
5419      c_exempt_certificate_number     ZX_LINES.EXEMPT_CERTIFICATE_NUMBER%TYPE,
5420      c_exempt_reason                 ZX_LINES.EXEMPT_REASON%TYPE,
5421      c_exempt_reason_code            ZX_LINES.EXEMPT_REASON_CODE%TYPE,
5422      c_tax_exception_id              ZX_LINES.TAX_EXCEPTION_ID%TYPE,
5423      c_tax_rate_before_exception     ZX_LINES.TAX_RATE_BEFORE_EXCEPTION%TYPE,
5424      c_rate_name_before_exception    ZX_LINES.TAX_RATE_NAME_BEFORE_EXCEPTION%TYPE,
5425      c_exception_rate                ZX_LINES.EXCEPTION_RATE%TYPE,
5426      c_ledger_id                     ZX_LINES.LEDGER_ID%TYPE,
5427      c_legal_entity_id               ZX_LINES.LEGAL_ENTITY_ID%TYPE,
5428      c_establishment_id              ZX_LINES.ESTABLISHMENT_ID%TYPE,
5429      c_currency_conversion_date      ZX_LINES.CURRENCY_CONVERSION_date%TYPE,
5430      c_currency_conversion_type      ZX_LINES.CURRENCY_CONVERSION_type%TYPE,
5431      c_currency_conversion_rate      ZX_LINES.CURRENCY_CONVERSION_rate%TYPE,
5432      c_record_type_code              ZX_LINES.RECORD_TYPE_CODE%TYPE)
5433   IS
5434     SELECT SUM(unrounded_tax_amt),
5435            SUM(tax_amt),
5436            SUM(tax_amt_tax_curr),
5437            SUM(tax_amt_funcl_curr)
5438       FROM ZX_LINES L
5439       WHERE L.trx_id                                   = c_trx_id AND
5440             L.application_id                           = c_application_id AND
5441             L.event_class_code                         = c_event_class_code AND
5442             L.entity_code                              = c_entity_code      AND
5443             L.tax_regime_code                          = c_tax_regime_code AND
5444             L.tax                                      = c_tax             AND
5445             NVL(L.tax_status_code, 'X')                = NVL(c_tax_status_code, 'X') AND
5446             NVL(L.tax_rate_code, 'X')                  = NVL(c_tax_rate_code, 'X')   AND
5447             NVL(L.tax_rate, -999)                      = NVL(c_tax_rate, -999)        AND
5448             NVL(L.tax_rate_id, -999)                   = NVL(c_tax_rate_id, -999)        AND
5449             NVL(L.tax_jurisdiction_code, 'X')          = NVL(c_tax_jurisdiction_code, 'X')  AND
5450             NVL(L.taxable_basis_formula, 'X')          = NVL(c_taxable_basis_formula, 'X') AND
5451             NVL(L.tax_calculation_formula, 'X')        = NVL(c_tax_calculation_formula, 'X')  AND
5452             L.Tax_Amt_Included_Flag                    = c_tax_amt_included_flag AND
5453             L.compounding_tax_flag                     = c_compounding_tax_flag  AND
5454             L.historical_flag                          = c_historical_flag  AND
5455             L.self_assessed_flag                       = c_self_assessed_flag  AND
5456             L.overridden_flag                          = c_overridden_flag  AND
5457             L.manually_entered_flag                    = c_manually_entered_flag  AND
5458             L.Copied_From_Other_Doc_Flag               = c_copied_from_other_doc_flag  AND
5459             L.associated_child_frozen_flag             = c_associated_child_frozen_flag  AND
5460             L.tax_only_line_flag                       = c_tax_only_line_flag  AND
5461             L.mrc_tax_line_flag                        = c_mrc_tax_line_flag  AND
5462             L.reporting_only_flag                      = c_reporting_only_flag  AND
5463             NVL(L.applied_from_application_id, -999)   = NVL(c_applied_from_application_id, -999)  AND
5464             NVL(L.applied_from_event_class_code, 'X')  = NVL(c_applied_from_evnt_cls_cd, 'X')  AND
5465             NVL(L.applied_from_entity_code, 'X')       = NVL(c_applied_from_entity_code, 'X')  AND
5466             NVL(L.applied_from_trx_id, -999)           = NVL(c_applied_from_trx_id, -999)  AND
5467             NVL(L.applied_from_line_id, -999)          = NVL(c_applied_from_line_id, -999)  AND
5468             NVL(L.adjusted_doc_application_id, -999)   = NVL(c_adjusted_doc_application_id, -999)  AND
5469             NVL(L.adjusted_doc_entity_code, 'X')       = NVL(c_adjusted_doc_entity_code, 'X')  AND
5470             NVL(L.adjusted_doc_event_class_code, 'X')  = NVL(c_adjusted_doc_evnt_cls_cd, 'X')  AND
5471             NVL(L.adjusted_doc_trx_id, -999)           = NVL(c_adjusted_doc_trx_id, -999)  AND
5472             -- NVL(L.applied_to_application_id, -999)     = NVL(c_applied_to_application_id, -999)  AND
5473             -- NVL(L.applied_to_event_class_code, 'X')    = NVL(c_applied_to_evnt_cls_cd, 'X')  AND
5474             -- NVL(L.applied_to_entity_code, 'X')         = NVL(c_applied_to_entity_code, 'X')  AND
5475             -- NVL(L.applied_to_trx_id, -999)             = NVL(c_applied_to_trx_id, -999)  AND
5476             -- NVL(L.applied_to_line_id, -999)            = NVL(c_applied_to_line_id, -999)  AND
5477             NVL(L.tax_exemption_id, -999)              = NVL(c_tax_exemption_id, -999)  AND
5478             NVL(L.tax_rate_before_exemption, -999)     = NVL(c_tax_rate_before_exemption, -999)  AND
5479             NVL(L.tax_rate_name_before_exemption, 'X') = NVL(c_rate_name_before_exemption, 'X')  AND
5480             NVL(L.exempt_rate_modifier, -999)          = NVL(c_exempt_rate_modifier, -999)  AND
5481             NVL(L.exempt_certificate_number, 'X')      = NVL(c_exempt_certificate_number, 'X')  AND
5482             NVL(L.exempt_reason, 'X')                  = NVL(c_exempt_reason, 'X')  AND
5483             NVL(L.exempt_reason_code, 'X')             = NVL(c_exempt_reason_code, 'X')  AND
5484             NVL(L.tax_exception_id, -999)              = NVL(c_tax_exception_id, -999)  AND
5485             NVL(L.tax_rate_before_exception, -999)     = NVL(c_tax_rate_before_exception, -999)  AND
5486             NVL(L.tax_rate_name_before_exception, 'X') = NVL(c_rate_name_before_exception, 'X')  AND
5487             NVL(L.exception_rate, -999)                = NVL(c_exception_rate, -999)  AND
5488             NVL(L.ledger_id, -999)                     = NVL(c_ledger_id, -999)  AND
5489             NVL(L.legal_entity_id, -999)               = NVL(c_legal_entity_id, -999)  AND
5490             NVL(L.establishment_id, -999)              = NVL(c_establishment_id, -999)  AND
5491       TRUNC(NVL(L.currency_conversion_date, SYSDATE))  = TRUNC(NVL(c_currency_conversion_date, SYSDATE))  AND
5492             NVL(L.currency_conversion_type, 'X')       = NVL(c_currency_conversion_type, 'X')  AND
5493             NVL(L.currency_conversion_rate, -999)      = NVL(c_currency_conversion_rate, -999)  AND
5494             L.record_type_code                         = c_record_type_code  AND
5495             L.offset_link_to_tax_line_id IS NULL   AND
5496             NOT EXISTS (SELECT /*+ INDEX(G ZX_DETAIL_TAX_LINES_GT_U2) */  1
5497                           FROM ZX_DETAIL_TAX_LINES_GT G
5498                          WHERE G.tax_line_id = L.tax_line_id);
5499 
5500 BEGIN
5501 
5502   IF (g_level_statement >= g_current_runtime_level ) THEN
5503     FND_LOG.STRING(g_level_statement,
5504                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.process_tax_line_upd_override.BEGIN',
5505                    'ZX_TDS_TAX_ROUNDING_PKG: process_tax_line_upd_override(+)');
5506   END IF;
5507 
5508   p_return_status  := FND_API.G_RET_STS_SUCCESS;
5509 
5510   --
5511   -- this is new group of tax, need to get existing sum amounts
5512   --
5513 
5514   l_trx_id             := p_event_class_rec.trx_id;
5515   l_application_id     := p_event_class_rec.application_id;
5516   l_event_class_code   := p_event_class_rec.event_class_code;
5517   l_entity_code        := p_event_class_rec.entity_code;
5518 
5519   -- bug6773534: remove applied_to info from header grouping criteria
5520 
5521   OPEN get_existing_sum_amt_csr(
5522            l_trx_id,
5523            l_application_id,
5524            l_event_class_code,
5525            l_entity_code,
5526            p_curr_hdr_grp_rec.tax_regime_code,
5527            p_curr_hdr_grp_rec.tax,
5528            p_curr_hdr_grp_rec.tax_status_code,
5529            p_curr_hdr_grp_rec.tax_rate_code,
5530            p_curr_hdr_grp_rec.tax_rate,
5531            p_curr_hdr_grp_rec.tax_rate_id,
5532            p_curr_hdr_grp_rec.tax_jurisdiction_code,
5533            p_curr_hdr_grp_rec.taxable_basis_formula,
5534            p_curr_hdr_grp_rec.tax_calculation_formula,
5535            p_curr_hdr_grp_rec.Tax_Amt_Included_Flag,
5536            p_curr_hdr_grp_rec.compounding_tax_flag,
5537            p_curr_hdr_grp_rec.historical_flag,
5538            p_curr_hdr_grp_rec.self_assessed_flag,
5539            p_curr_hdr_grp_rec.overridden_flag,
5540            p_curr_hdr_grp_rec.manually_entered_flag,
5541            p_curr_hdr_grp_rec.Copied_From_Other_Doc_Flag,
5542            p_curr_hdr_grp_rec.associated_child_frozen_flag,
5543            p_curr_hdr_grp_rec.tax_only_line_flag,
5544            p_curr_hdr_grp_rec.mrc_tax_line_flag,
5545            p_curr_hdr_grp_rec.reporting_only_flag,
5546            p_curr_hdr_grp_rec.applied_from_application_id,
5547            p_curr_hdr_grp_rec.applied_from_event_class_code,
5548            p_curr_hdr_grp_rec.applied_from_entity_code,
5549            p_curr_hdr_grp_rec.applied_from_trx_id,
5550            p_curr_hdr_grp_rec.applied_from_line_id,
5551            p_curr_hdr_grp_rec.adjusted_doc_application_id,
5552            p_curr_hdr_grp_rec.adjusted_doc_entity_code,
5553            p_curr_hdr_grp_rec.adjusted_doc_event_class_code,
5554            p_curr_hdr_grp_rec.adjusted_doc_trx_id,
5555            --p_curr_hdr_grp_rec.applied_to_application_id,
5556            --p_curr_hdr_grp_rec.applied_to_event_class_code,
5557            --p_curr_hdr_grp_rec.applied_to_entity_code,
5558            --p_curr_hdr_grp_rec.applied_to_trx_id,
5559            --p_curr_hdr_grp_rec.applied_to_line_id,
5560            p_curr_hdr_grp_rec.tax_exemption_id,
5561            p_curr_hdr_grp_rec.tax_rate_before_exemption,
5562            p_curr_hdr_grp_rec.tax_rate_name_before_exemption,
5563            p_curr_hdr_grp_rec.exempt_rate_modifier,
5564            p_curr_hdr_grp_rec.exempt_certificate_number,
5565            p_curr_hdr_grp_rec.exempt_reason,
5566            p_curr_hdr_grp_rec.exempt_reason_code,
5567            p_curr_hdr_grp_rec.tax_exception_id,
5568            p_curr_hdr_grp_rec.tax_rate_before_exception,
5569            p_curr_hdr_grp_rec.tax_rate_name_before_exception,
5570            p_curr_hdr_grp_rec.exception_rate,
5571            p_curr_hdr_grp_rec.ledger_id,
5572            p_curr_hdr_grp_rec.legal_entity_id,
5573            p_curr_hdr_grp_rec.establishment_id,
5574            p_curr_hdr_grp_rec.currency_conversion_date,
5575            p_curr_hdr_grp_rec.currency_conversion_type,
5576            p_curr_hdr_grp_rec.currency_conversion_rate,
5577            p_curr_hdr_grp_rec.record_type_code);
5578 
5579   FETCH get_existing_sum_amt_csr
5580     INTO p_sum_unrnd_tax_amt,
5581          p_sum_rnd_tax_amt,
5582          p_sum_rnd_tax_curr,
5583          p_sum_rnd_funcl_curr;
5584   IF p_sum_unrnd_tax_amt IS NULL THEN
5585     -- this would be the case of those tax lines exist in zx_lines
5586     -- have been updated so these same tax lines would also exist
5587     -- in gt, causing no record returns
5588     p_sum_unrnd_tax_amt   := 0;
5589     p_sum_rnd_tax_amt     := 0;
5590     p_sum_rnd_tax_curr    := 0;
5591     p_sum_rnd_funcl_curr  := 0;
5592   END IF;
5593   CLOSE get_existing_sum_amt_csr;
5594 
5595   IF (g_level_statement >= g_current_runtime_level ) THEN
5596     FND_LOG.STRING(g_level_statement,
5597                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.process_tax_line_upd_override',
5598                    'p_sum_unrnd_tax_amt = ' || to_char(p_sum_unrnd_tax_amt)||
5599                    'p_sum_rnd_tax_amt = ' || to_char(p_sum_rnd_tax_amt)||
5600                    'p_sum_rnd_tax_curr = ' || to_char(p_sum_rnd_tax_curr)||
5601                    'p_sum_rnd_funcl_curr= ' || to_char(p_sum_rnd_funcl_curr));
5602 
5603     FND_LOG.STRING(g_level_statement,
5604                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.process_tax_line_upd_override.END',
5605                    'ZX_TDS_TAX_ROUNDING_PKG: process_tax_line_upd_override(-)');
5606   END IF;
5607 
5608 EXCEPTION
5609   WHEN OTHERS THEN
5610     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5611     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
5612     IF (g_level_unexpected >= g_current_runtime_level ) THEN
5613       FND_LOG.STRING(g_level_unexpected,
5614                      'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.process_tax_line_upd_override',
5615                       p_error_buffer);
5616     END IF;
5617 
5618 END process_tax_line_upd_override;
5619 
5620 -----------------------------------------------------------------------
5621 --  PRIVATE PROCEDURE
5622 --  chk_mandatory_col_after_round
5623 --
5624 --  DESCRIPTION
5625 --  This procedure
5626 --
5627 
5628 PROCEDURE  chk_mandatory_col_after_round(
5629              p_trx_currency_code    IN            ZX_LINES.TRX_CURRENCY_CODE%TYPE,
5630              p_tax_currency_code    IN            ZX_LINES.TAX_CURRENCY_CODE%TYPE,
5631              p_tax_amt              IN            ZX_LINES.TAX_AMT%TYPE,
5632              p_tax_amt_tax_curr     IN            ZX_LINES.TAX_AMT_TAX_CURR%TYPE,
5633              p_taxable_amt          IN            ZX_LINES.TAXABLE_AMT%TYPE,
5634              p_taxable_amt_tax_curr IN            ZX_LINES.TAXABLE_AMT_TAX_CURR%TYPE,
5635              p_mrc_tax_line_flag    IN            zx_lines.mrc_tax_line_flag%TYPE,
5636              p_rate_type_code       IN            ZX_RATES_B.RATE_TYPE_CODE%TYPE,
5637              p_return_status           OUT NOCOPY VARCHAR2,
5638              p_error_buffer            OUT NOCOPY VARCHAR2
5639          )
5640 IS
5641 BEGIN
5642   IF (g_level_statement >= g_current_runtime_level ) THEN
5643     FND_LOG.STRING(g_level_statement,
5644                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.chk_mandatory_col_after_round.BEGIN',
5645                    'ZX_TDS_TAX_ROUNDING_PKG: chk_mandatory_col_after_round(+)');
5646   END IF;
5647 
5648   p_return_status :=  FND_API.G_RET_STS_SUCCESS;
5649 
5650   IF p_tax_amt IS NULL THEN
5651     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5652     p_error_buffer  := 'Tax Amount can not be NULL';
5653     FND_MESSAGE.SET_NAME('ZX','ZX_GENERIC_TEXT');
5654     FND_MESSAGE.SET_TOKEN('GENERIC_TEXT',p_error_buffer);
5655     IF ZX_TDS_CALC_SERVICES_PUB_PKG.g_msg_context_info_rec.trx_id IS NOT NULL THEN
5656       ZX_API_PUB.add_msg(ZX_TDS_CALC_SERVICES_PUB_PKG.g_msg_context_info_rec);
5657     ELSE
5658       FND_MSG_PUB.Add;
5659     END IF;
5660   ELSIF p_taxable_amt IS NULL THEN
5661     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5662     p_error_buffer  := 'Taxable Amount can not be NULL';
5663     FND_MESSAGE.SET_NAME('ZX','ZX_GENERIC_TEXT');
5664     FND_MESSAGE.SET_TOKEN('GENERIC_TEXT',p_error_buffer);
5665     IF ZX_TDS_CALC_SERVICES_PUB_PKG.g_msg_context_info_rec.trx_id IS NOT NULL THEN
5666       ZX_API_PUB.add_msg(ZX_TDS_CALC_SERVICES_PUB_PKG.g_msg_context_info_rec);
5667     ELSE
5668       FND_MSG_PUB.Add;
5669     END IF;
5670   END IF;
5671 
5672   IF p_mrc_tax_line_flag = 'N' THEN
5673     IF p_trx_currency_code IS NULL THEN
5674       p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5675       p_error_buffer  := 'Trx Currency Code can not be NULL';
5676       FND_MESSAGE.SET_NAME('ZX','ZX_GENERIC_TEXT');
5677       FND_MESSAGE.SET_TOKEN('GENERIC_TEXT',p_error_buffer);
5678       IF ZX_TDS_CALC_SERVICES_PUB_PKG.g_msg_context_info_rec.trx_id IS NOT NULL THEN
5679         ZX_API_PUB.add_msg(ZX_TDS_CALC_SERVICES_PUB_PKG.g_msg_context_info_rec);
5680       ELSE
5681         FND_MSG_PUB.Add;
5682       END IF;
5683     ELSIF p_tax_currency_code IS NULL THEN
5684       p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5685       p_error_buffer  := 'Tax Currency Code can not be NULL';
5686       FND_MESSAGE.SET_NAME('ZX','ZX_GENERIC_TEXT');
5687       FND_MESSAGE.SET_TOKEN('GENERIC_TEXT',p_error_buffer);
5688       IF ZX_TDS_CALC_SERVICES_PUB_PKG.g_msg_context_info_rec.trx_id IS NOT NULL THEN
5689         ZX_API_PUB.add_msg(ZX_TDS_CALC_SERVICES_PUB_PKG.g_msg_context_info_rec);
5690       ELSE
5691         FND_MSG_PUB.Add;
5692       END IF;
5693     ELSIF p_tax_amt_tax_curr IS NULL THEN
5694       IF p_rate_type_code = 'QUANTITY' THEN
5695         --
5696         -- Bug#5506495- quantity based tax, raise error
5697         --
5698         p_return_status := FND_API.G_RET_STS_ERROR;
5699         FND_MESSAGE.SET_NAME('ZX','ZX_QTY_TAX_NO_EXCHG_RATE_TYPE');
5700         FND_MESSAGE.SET_TOKEN('TAX_CURRENCY', p_tax_currency_code);
5701         IF ZX_TDS_CALC_SERVICES_PUB_PKG.g_msg_context_info_rec.trx_id IS NOT NULL THEN
5702           ZX_API_PUB.add_msg(ZX_TDS_CALC_SERVICES_PUB_PKG.g_msg_context_info_rec);
5703         ELSE
5704           FND_MSG_PUB.Add;
5705         END IF;
5706         p_error_buffer  := 'tax_amt_tax_curr can not be NULL';
5707       END IF;
5708     ELSIF p_taxable_amt_tax_curr IS NULL THEN
5709       IF p_rate_type_code = 'QUANTITY' THEN
5710         --
5711         -- Bug#5506495- quantity based tax, raise error
5712         --
5713         p_return_status := FND_API.G_RET_STS_ERROR;
5714         FND_MESSAGE.SET_NAME('ZX','ZX_QTY_TAX_NO_EXCHG_RATE_TYPE');
5715         FND_MESSAGE.SET_TOKEN('TAX_CURRENCY', p_tax_currency_code);
5716         IF ZX_TDS_CALC_SERVICES_PUB_PKG.g_msg_context_info_rec.trx_id IS NOT NULL THEN
5717          ZX_API_PUB.add_msg(ZX_TDS_CALC_SERVICES_PUB_PKG.g_msg_context_info_rec);
5718         ELSE
5719           FND_MSG_PUB.Add;
5720         END IF;
5721         p_error_buffer  := 'taxable_amt_tax_curr can not be NULL';
5722       END IF;
5723     END IF;
5724   END IF;
5725 
5726   IF (g_level_statement >= g_current_runtime_level ) THEN
5727 
5728     FND_LOG.STRING(g_level_statement,
5729                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.chk_mandatory_col_after_round.END',
5730                    'ZX_TDS_TAX_ROUNDING_PKG: chk_mandatory_col_after_round(-)'||
5731                    'return status: '||p_return_status||
5732                    ' error_buffer  = ' || p_error_buffer);
5733   END IF;
5734 
5735 EXCEPTION
5736   WHEN OTHERS THEN
5737     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5738     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
5739 
5740     IF (g_level_unexpected >= g_current_runtime_level ) THEN
5741       FND_LOG.STRING(g_level_unexpected,
5742                      'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.chk_mandatory_col_after_round',
5743                       p_error_buffer);
5744     END IF;
5745 
5746 END chk_mandatory_col_after_round;
5747 
5748 -----------------------------------------------------------------------
5749 --  PRIVATE PROCEDURE
5750 --  update_detail_tax_lines_gt
5751 --
5752 --  DESCRIPTION
5753 --  This procedure
5754 --
5755 
5756 PROCEDURE  update_detail_tax_lines_gt(
5757              p_min_acct_unit_tbl                IN MIN_ACCT_UNIT_TBL,
5758              p_precision_tbl                    IN PRECISION_TBL,
5759              p_tax_currency_code_tbl            IN TAX_CURRENCY_CODE_TBL,
5760              p_tax_curr_conv_rate_tbl           IN TAX_CURR_CONV_RATE_TBL,
5761              p_tax_amt_tbl                      IN TAX_AMT_TBL,
5762              p_taxable_amt_tbl                  IN TAXABLE_AMT_TBL,
5763              p_tax_amt_tax_curr_tbl             IN TAX_AMT_TAX_CURR_TBL,
5764              p_taxable_amt_tax_curr_tbl         IN  TAXABLE_AMT_TAX_CURR_TBL,
5765              p_tax_amt_funcl_curr_tbl           IN TAX_AMT_FUNCL_CURR_TBL,
5766              p_taxable_amt_funcl_curr_tbl       IN TAXABLE_AMT_FUNCL_CURR_TBL,
5767              p_prd_total_tax_amt_tbl            IN PRD_TOTAL_TAX_AMT_TBL,
5768              p_prd_tot_tax_amt_tax_curr_tbl     IN PRD_TOTAL_TAX_AMT_TAX_CURR_TBL,
5769              p_prd_tot_tax_amt_fcl_curr_tbl     IN PRD_TOTAL_TAX_AMT_FCL_CURR_TBL,
5770              p_cal_tax_amt_funcl_curr_tbl       IN CAL_TAX_AMT_FUNCL_CURR_TBL,
5771              p_orig_tax_amt_tax_curr_tbl        IN TAX_AMT_TBL,
5772              p_orig_taxable_amt_tax_cur_tbl     IN TAXABLE_AMT_TBL,
5773              p_tax_line_id_tbl                  IN TAX_LINE_ID_TBL,
5774              p_return_status                    OUT NOCOPY VARCHAR2,
5775              p_error_buffer                     OUT NOCOPY VARCHAR2
5776          )
5777 IS
5778   i                              BINARY_INTEGER;
5779   l_count                        NUMBER;
5780 BEGIN
5781   IF (g_level_statement >= g_current_runtime_level ) THEN
5782     FND_LOG.STRING(g_level_statement,
5783                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.update_detail_tax_lines_gt.BEGIN',
5784                    'ZX_TDS_TAX_ROUNDING_PKG: update_detail_tax_lines_gt(+)');
5785   END IF;
5786 
5787   p_return_status :=  FND_API.G_RET_STS_SUCCESS;
5788 
5789   l_count := p_tax_line_id_tbl.COUNT;
5790 
5791   FORALL  i IN 1 .. l_count
5792 
5793       -- Currently, TSRM validate provider's precision is equal or less
5794       -- than eTax, so there won't be any rounding difference to sync back.
5795       -- Once TSRM relax the validation, the sync flag may need to be set.
5796 
5797         UPDATE /*+ INDEX(ZX_DETAIL_TAX_LINES_GT ZX_DETAIL_TAX_LINES_GT_U2) */
5798                 ZX_DETAIL_TAX_LINES_GT
5799           SET   Recalc_Required_Flag = 'N',
5800                 minimum_accountable_unit = p_min_acct_unit_tbl(i),
5801                 precision = p_precision_tbl(i),
5802                 tax_currency_code = p_tax_currency_code_tbl(i),
5803                 tax_currency_conversion_rate = p_tax_curr_conv_rate_tbl(i),
5804                 tax_amt = p_tax_amt_tbl(i),
5805                 taxable_amt = p_taxable_amt_tbl(i),
5806                 tax_amt_tax_curr = p_tax_amt_tax_curr_tbl(i),
5807                 taxable_amt_tax_curr = p_taxable_amt_tax_curr_tbl(i),
5808                 tax_amt_funcl_curr = p_tax_amt_funcl_curr_tbl(i),
5809                 taxable_amt_funcl_curr = p_taxable_amt_funcl_curr_tbl(i),
5810                 prd_total_tax_amt  = p_prd_total_tax_amt_tbl(i),
5811                 prd_total_tax_amt_tax_curr = p_prd_tot_tax_amt_tax_curr_tbl(i),
5812                 prd_total_tax_amt_funcl_curr = p_prd_tot_tax_amt_fcl_curr_tbl(i),
5813                 cal_tax_amt_funcl_curr = p_cal_tax_amt_funcl_curr_tbl(i),
5814                 orig_tax_amt_tax_curr  = p_orig_tax_amt_tax_curr_tbl(i),
5815                 orig_taxable_amt_tax_curr = p_orig_taxable_amt_tax_cur_tbl(i)
5816            WHERE  tax_line_id = p_tax_line_id_tbl(i);
5817 
5818   IF (g_level_statement >= g_current_runtime_level ) THEN
5819 
5820     FND_LOG.STRING(g_level_statement,
5821                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.update_detail_tax_lines_gt.END',
5822                    'ZX_TDS_TAX_ROUNDING_PKG: update_detail_tax_lines_gt(-)'||
5823                    'p_return_status = ' || p_return_status);
5824   END IF;
5825 
5826 EXCEPTION
5827   WHEN OTHERS THEN
5828     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5829     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
5830 
5831     IF (g_level_unexpected >= g_current_runtime_level ) THEN
5832       FND_LOG.STRING(g_level_unexpected,
5833                      'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.update_detail_tax_lines_gt',
5834                       p_error_buffer);
5835     END IF;
5836 
5837 END update_detail_tax_lines_gt;
5838 -----------------------------------------------------------------------
5839 --  PRIVATE PROCEDURE
5840 --  update_zx_lines
5841 --
5842 --  DESCRIPTION
5843 --  This procedure updates the values belonged to a group used by
5844 --  header level rounding
5845 --
5846 
5847 PROCEDURE  update_zx_lines(
5848                 p_conversion_rate            IN            NUMBER,
5849                 p_conversion_type            IN            VARCHAR2,
5850                 p_conversion_date            IN            DATE,
5851                 p_tax_amt_funcl_curr_tbl     IN            TAX_AMT_FUNCL_CURR_TBL,
5852                 p_taxable_amt_funcl_curr_tbl IN            TAXABLE_AMT_FUNCL_CURR_TBL,
5853                 p_cal_tax_amt_funcl_curr_tbl IN            CAL_TAX_AMT_FUNCL_CURR_TBL,
5854                 p_tax_line_id_tbl            IN            TAX_LINE_ID_TBL,
5855                 p_return_status                 OUT NOCOPY VARCHAR2,
5856                 p_error_buffer                  OUT NOCOPY VARCHAR2
5857 )
5858 
5859 IS
5860 
5861   l_count                NUMBER;
5862   l_mau                  NUMBER;
5863   l_rate_ratio           NUMBER;
5864   l_tax_amt_tax_curr     NUMBER;
5865   l_taxable_amt_tax_curr NUMBER;
5866   l_cal_tax_amt_tax_curr NUMBER;
5867   l_rounding_rule_code   ZX_TAXES_B.ROUNDING_RULE_CODE%TYPE;
5868 BEGIN
5869 
5870   IF (g_level_statement >= g_current_runtime_level ) THEN
5871     FND_LOG.STRING(g_level_statement,
5872                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.update_zx_lines.BEGIN',
5873                    'ZX_TDS_TAX_ROUNDING_PKG: update_zx_lines(+)');
5874   END IF;
5875 
5876   p_return_status  := FND_API.G_RET_STS_SUCCESS;
5877 
5878   l_count := p_tax_line_id_tbl.COUNT;
5879 
5880   -- update zx_lines
5881   --
5882   FOR i IN 1 .. l_count LOOP
5883     select Decode(tax_currency_conversion_rate,0,2,currency_conversion_rate/tax_currency_conversion_rate),
5884            NVL(tax.minimum_accountable_unit, power(10, (-1 * tax.tax_precision))),
5885            tax_amt_tax_curr,
5886            taxable_amt_tax_curr,
5887            cal_tax_amt_tax_curr,
5888            zxl.rounding_rule_code
5889       into l_rate_ratio,
5890            l_mau,
5891            l_tax_amt_tax_curr,
5892            l_taxable_amt_tax_curr,
5893            l_cal_tax_amt_tax_curr,
5894            l_rounding_rule_code
5895       from zx_lines zxl,zx_taxes_b tax
5896      where zxl.tax_line_id = p_tax_line_id_tbl(i)
5897        and zxl.tax_id = tax.tax_id;
5898 
5899     IF l_rate_ratio = 1 AND l_mau IS NOT NULL THEN
5900       l_tax_amt_tax_curr     := round_tax(p_tax_amt_funcl_curr_tbl(i)
5901                                           ,l_rounding_rule_code
5902                                           ,l_mau,NULL
5903                                           ,p_return_status
5904                                           ,p_error_buffer
5905                                           );
5906       l_taxable_amt_tax_curr := round_tax(p_taxable_amt_funcl_curr_tbl(i)
5907                                           ,l_rounding_rule_code
5908                                           ,l_mau,NULL
5909                                           ,p_return_status
5910                                           ,p_error_buffer
5911                                           );
5912       l_cal_tax_amt_tax_curr := round_tax(p_cal_tax_amt_funcl_curr_tbl(i)
5913                                           ,l_rounding_rule_code
5914                                           ,l_mau,NULL
5915                                           ,p_return_status
5916                                           ,p_error_buffer
5917                                           );
5918     ELSIF l_rate_ratio = 1 THEN
5919       l_tax_amt_tax_curr     := p_tax_amt_funcl_curr_tbl(i);
5920       l_taxable_amt_tax_curr := p_taxable_amt_funcl_curr_tbl(i);
5921       l_cal_tax_amt_tax_curr := p_cal_tax_amt_funcl_curr_tbl(i);
5922     END IF;
5923 
5924     UPDATE ZX_LINES
5925       SET   currency_conversion_date = p_conversion_date,
5926             currency_conversion_type = p_conversion_type,
5927             currency_conversion_rate = p_conversion_rate,
5928             tax_amt_funcl_curr       = p_tax_amt_funcl_curr_tbl(i),
5929             taxable_amt_funcl_curr   = p_taxable_amt_funcl_curr_tbl(i),
5930             cal_tax_amt_funcl_curr   = p_cal_tax_amt_funcl_curr_tbl(i),
5931             tax_currency_conversion_date = Decode(l_rate_ratio,1,p_conversion_date,
5932                                                       tax_currency_conversion_date),
5933             tax_currency_conversion_type = Decode(l_rate_ratio,1,p_conversion_type,
5934                                                       tax_currency_conversion_type),
5935             tax_currency_conversion_rate = Decode(l_rate_ratio,1,p_conversion_rate,
5936                                                       tax_currency_conversion_rate),
5937             tax_amt_tax_curr       = l_tax_amt_tax_curr,
5938             taxable_amt_tax_curr   = l_taxable_amt_tax_curr,
5939             cal_tax_amt_tax_curr   = l_cal_tax_amt_tax_curr
5940     WHERE  tax_line_id = p_tax_line_id_tbl(i);
5941   END LOOP;
5942   IF (g_level_statement >= g_current_runtime_level ) THEN
5943 
5944     FND_LOG.STRING(g_level_statement,
5945                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.update_zx_lines.END',
5946                    'ZX_TDS_TAX_ROUNDING_PKG: update_zx_lines(-)'||p_return_status);
5947   END IF;
5948 
5949 EXCEPTION
5950   WHEN OTHERS THEN
5951     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5952     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
5953 
5954     IF (g_level_unexpected >= g_current_runtime_level ) THEN
5955       FND_LOG.STRING(g_level_unexpected,
5956                      'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.update_zx_lines',
5957                       p_error_buffer);
5958     END IF;
5959 END update_zx_lines;
5960 ---------------------------------------------------------------------------
5961 --  PUBLIC PROCEDURE
5962 --  perform_rounding
5963 --
5964 --  DESCRIPTION
5965 --  This procedure is the entry point to tax rounding proccess
5966 --  It performs  rounding for each tax line in the document
5967 --  according to the rounding info specified
5968 --
5969 --  Rewritten by lxzhang for bug fix 5417887
5970 
5971 PROCEDURE perform_rounding(
5972            p_event_class_rec  IN     ZX_API_PUB.EVENT_CLASS_REC_TYPE,
5973            p_return_status       OUT NOCOPY VARCHAR2,
5974            p_error_buffer        OUT NOCOPY VARCHAR2
5975          )
5976 IS
5977 
5978   l_prev_hdr_grp_rec              HDR_GRP_REC_TYPE;
5979   l_curr_hdr_grp_rec              HDR_GRP_REC_TYPE;
5980   i                               BINARY_INTEGER;
5981   l_count                         NUMBER;
5982   l_same_tax                      VARCHAR2(1);
5983   l_sum_unrnd_tax_amt             NUMBER;
5984   l_sum_rnd_tax_amt               NUMBER;
5985   l_sum_rnd_tax_curr              NUMBER;
5986   l_sum_rnd_funcl_curr            NUMBER;
5987   l_tax_rate_rec                  ZX_TDS_UTILITIES_PKG.ZX_RATE_INFO_REC_TYPE;
5988   l_rate_type_code                ZX_RATES_B.RATE_TYPE_CODE%TYPE;
5989 
5990   l_tax_line_id_tbl               TAX_LINE_ID_TBL;
5991   l_internal_organization_id_tbl  INTERNAL_ORGANIZATION_ID_TBL;
5992   l_manually_entered_flag_tbl     MANUALLY_ENTERED_FLAG_TBL;
5993   l_tax_id_tbl                    TAX_ID_TBL;
5994   l_tax_regime_code_tbl           TAX_REGIME_CODE_TBL;
5995   l_tax_tbl                       TAX_TBL;
5996   l_tax_status_code_tbl           TAX_STATUS_CODE_TBL;
5997   l_tax_rate_code_tbl             TAX_RATE_CODE_TBL;
5998   l_tax_rate_tbl                  TAX_RATE_TBL;
5999   l_tax_rate_id_tbl               TAX_RATE_ID_TBL;
6000   l_tax_jurisdiction_code_tbl     TAX_JURISDICTION_CODE_TBL;
6001   l_taxable_basis_formula_tbl     TAXABLE_BASIS_FORMULA_TBL;
6002   l_tax_calculation_formula_tbl   TAX_CALCULATION_FORMULA_TBL;
6003   l_tax_amt_included_flag_tbl     TAX_AMT_INCLUDED_FLAG_TBL;
6004   l_compounding_tax_flag_tbl      COMPOUNDING_TAX_FLAG_TBL;
6005   l_historical_flag_tbl           HISTORICAL_FLAG_TBL;
6006   l_self_assessed_flag_tbl        SELF_ASSESSED_FLAG_TBL;
6007   l_overridden_flag_tbl           OVERRIDDEN_FLAG_TBL;
6008   l_Cop_From_Other_Doc_Flag_tbl   COP_FROM_OTHER_DOC_FLAG_TBL;
6009   l_assoc_child_frozen_flag_tbl   ASSOC_CHILD_FROZEN_FLAG_TBL;
6010   l_tax_only_line_flag_tbl        TAX_ONLY_LINE_FLAG_TBL;
6011   l_mrc_tax_line_flag_tbl         MRC_TAX_LINE_FLAG_TBL;
6012   l_reporting_only_flag_tbl       REPORTING_ONLY_FLAG_TBL;
6013   l_applied_from_applic_id_tbl    APPLIED_FROM_APPLIC_ID_TBL;
6014   l_applied_from_evnt_cls_cd_tbl  APPLIED_FROM_EVNT_CLS_CD_TBL;
6015   l_applied_from_entity_code_tbl  APPLIED_FROM_ENTITY_CODE_TBL;
6016   l_applied_from_trx_id_tbl       APPLIED_FROM_TRX_ID_TBL;
6017   l_applied_from_line_id_tbl      APPLIED_FROM_LINE_ID_TBL;
6018   l_adjusted_doc_applic_id_tbl    ADJUSTED_DOC_APPLIC_ID_TBL;
6019   l_adjusted_doc_entity_code_tbl  ADJUSTED_DOC_ENTITY_CODE_TBL;
6020   l_adjusted_doc_evnt_cls_cd_tbl  ADJUSTED_DOC_EVNT_CLS_CD_TBL;
6021   l_adjusted_doc_trx_id_tbl       ADJUSTED_DOC_TRX_ID_TBL;
6022   l_applied_to_applic_id_tbl      APPLIED_TO_APPLIC_ID_TBL;
6023   l_applied_to_evnt_cls_cd_tbl    APPLIED_TO_EVNT_CLS_CD_TBL;
6024   l_applied_to_entity_code_tbl    APPLIED_TO_ENTITY_CODE_TBL;
6025   l_applied_to_trx_id_tbl         APPLIED_TO_TRX_ID_TBL;
6026   l_applied_to_line_id_tbl        APPLIED_TO_LINE_ID_TBL;
6027   l_tax_exemption_id_tbl          TAX_EXEMPTION_ID_TBL;
6028   l_tax_rate_before_exempt_tbl    RATE_BEFORE_EXEMPTION_TBL;
6029   l_rate_name_before_exempt_tbl   RATE_NAME_BEFORE_EXEMPTION_TBL;
6030   l_exempt_rate_modifier_tbl      EXEMPT_RATE_MODIFIER_TBL;
6031   l_exempt_certificate_num_tbl    EXEMPT_CERTIFICATE_NUM_TBL;
6032   l_exempt_reason_tbl             EXEMPT_REASON_TBL;
6033   l_exempt_reason_code_tbl        EXEMPT_REASON_CODE_TBL;
6034   l_tax_exception_id_tbl          TAX_EXCEPTION_ID_TBL;
6035   l_tax_rate_before_except_tbl    RATE_BEFORE_EXCEPTION_TBL;
6036   l_rate_name_before_except_tbl   RATE_NAME_BEFORE_EXCEPTION_TBL;
6037   l_exception_rate_tbl            EXCEPTION_RATE_TBL;
6038   l_ledger_id_tbl                 LEDGER_ID_TBL;
6039   l_min_acct_unit_tbl             MIN_ACCT_UNIT_TBL;
6040   l_precision_tbl                 PRECISION_TBL;
6041   l_trx_currency_code_tbl         TRX_CURRENCY_CODE_TBL;
6042   l_tax_currency_code_tbl         TAX_CURRENCY_CODE_TBL;
6043   l_tax_curr_conv_date_tbl        TAX_CURR_CONV_DATE_TBL;
6044   l_tax_curr_conv_type_tbl        TAX_CURR_CONV_TYPE_TBL;
6045   l_tax_curr_conv_rate_tbl        TAX_CURR_CONV_RATE_TBL;
6046   l_tax_amt_tbl                   TAX_AMT_TBL;
6047   l_taxable_amt_tbl               TAXABLE_AMT_TBL;
6048   l_orig_tax_amt_tbl              TAX_AMT_TBL;
6049   l_orig_tax_amt_tax_curr_tbl     TAX_AMT_TBL;
6050   l_orig_taxable_amt_tbl          TAXABLE_AMT_TBL;
6051   l_orig_taxable_amt_tax_cur_tbl  TAXABLE_AMT_TBL;
6052   l_cal_tax_amt_tbl               CAL_TAX_AMT_TBL;
6053   l_tax_amt_tax_curr_tbl          TAX_AMT_TAX_CURR_TBL;
6054   l_taxable_amt_tax_curr_tbl      TAXABLE_AMT_TAX_CURR_TBL;
6055   l_cal_tax_amt_tax_curr_tbl      CAL_TAX_AMT_TAX_CURR_TBL;
6056   l_rounding_rule_tbl             ROUNDING_RULE_TBL;
6057   l_unrounded_taxable_amt_tbl     UNROUNDED_TAXABLE_AMT_TBL;
6058   l_unrounded_tax_amt_tbl         UNROUNDED_TAX_AMT_TBL;
6059   l_currency_conversion_type_tbl  CURRENCY_CONVERSION_TYPE_TBL;
6060   l_currency_conversion_rate_tbl  CURRENCY_CONVERSION_RATE_TBL;
6061   l_currency_conversion_date_tbl  CURRENCY_CONVERSION_DATE_TBL;
6062   l_tax_amt_funcl_curr_tbl        TAX_AMT_FUNCL_CURR_TBL;
6063   l_taxable_amt_funcl_curr_tbl    TAXABLE_AMT_FUNCL_CURR_TBL;
6064   l_cal_tax_amt_funcl_curr_tbl    CAL_TAX_AMT_FUNCL_CURR_TBL;
6065   l_prd_total_tax_amt_tbl         PRD_TOTAL_TAX_AMT_TBL;
6066   l_prd_tot_tax_amt_tax_curr_tbl  PRD_TOTAL_TAX_AMT_TAX_CURR_TBL;
6067   l_prd_tot_tax_amt_fcl_curr_tbl  PRD_TOTAL_TAX_AMT_FCL_CURR_TBL;
6068   l_legal_entity_id_tbl           LEGAL_ENTITY_ID_TBL;
6069   l_establishment_id_tbl          ESTABLISHMENT_ID_TBL;
6070   l_record_type_code_tbl          RECORD_TYPE_CODE_TBL;
6071   l_tax_provider_id_tbl           TAX_PROVIDER_ID_TBL;
6072   l_application_id_tbl            APPLICATION_ID_TBL;
6073   l_event_class_code_tbl          EVENT_CLASS_CODE_TBL;
6074   l_entity_code_tbl               ENTITY_CODE_TBL;
6075   l_trx_id_tbl                    TRX_ID_TBL;
6076   l_rounding_level_code_tbl       ROUNDING_LEVEL_CODE_TBL;
6077 
6078   l_trx_id			  ZX_LINES.TRX_ID%TYPE; --code changes
6079   l_application_id                ZX_LINES.APPLICATION_ID%TYPE;
6080   l_event_class_code              ZX_LINES.EVENT_CLASS_CODE%TYPE;
6081   l_entity_code                   ZX_LINES.ENTITY_CODE%TYPE;
6082 
6083 
6084   CURSOR get_trx_id_csr
6085   IS
6086   SELECT DISTINCT
6087          application_id,
6088          entity_code,
6089          event_class_code,
6090          trx_id
6091   FROM  ZX_DETAIL_TAX_LINES_GT
6092   WHERE offset_link_to_tax_line_id IS NULL;
6093 
6094   CURSOR get_round_info_csr
6095   ( c_trx_id                     ZX_LINES.TRX_ID%TYPE,
6096     c_application_id             ZX_LINES.APPLICATION_ID%TYPE,
6097     c_event_class_code           ZX_LINES.EVENT_CLASS_CODE%TYPE,
6098     c_entity_code                ZX_LINES.ENTITY_CODE%TYPE)
6099   IS
6100     SELECT /*+ dynamic_sampling(1) */
6101            tax_line_id,
6102            Manually_Entered_Flag,
6103            tax_id,
6104            tax_regime_code,
6105            tax,
6106            tax_status_code,
6107            tax_rate_code,
6108            tax_rate,
6109            tax_rate_id,
6110            tax_jurisdiction_code,
6111            taxable_basis_formula,
6112            tax_calculation_formula,
6113            Tax_Amt_Included_Flag,
6114            compounding_tax_flag,
6115            historical_flag,
6116            self_assessed_flag,
6117            overridden_flag,
6118            Copied_From_Other_Doc_Flag,
6119            associated_child_frozen_flag,
6120            tax_only_line_flag,
6121            mrc_tax_line_flag,
6122            reporting_only_flag,
6123            applied_from_application_id,
6124            applied_from_event_class_code,
6125            applied_from_entity_code,
6126            applied_from_trx_id,
6127            applied_from_line_id,
6128            adjusted_doc_application_id,
6129            adjusted_doc_entity_code,
6130            adjusted_doc_event_class_code,
6131            adjusted_doc_trx_id,
6132            -- applied_to_application_id,
6133            -- applied_to_event_class_code,
6134            -- applied_to_entity_code,
6135            -- applied_to_trx_id,
6136            -- applied_to_line_id,
6137            tax_exemption_id,
6138            tax_rate_before_exemption,
6139            tax_rate_name_before_exemption,
6140            exempt_rate_modifier,
6141            exempt_certificate_number,
6142            exempt_reason,
6143            exempt_reason_code,
6144            tax_exception_id,
6145            tax_rate_before_exception,
6146            tax_rate_name_before_exception,
6147            exception_rate,
6148            ledger_id,
6149            legal_entity_id,
6150            establishment_id,
6151            record_type_code,
6152            minimum_accountable_unit,
6153            precision,
6154            trx_currency_code,
6155            tax_currency_code,
6156            tax_currency_conversion_date,
6157            tax_currency_conversion_type,
6158            tax_currency_conversion_rate,
6159            tax_amt,
6160            taxable_amt,
6161            cal_tax_amt,
6162            tax_amt_tax_curr,
6163            taxable_amt_tax_curr,
6164            cal_tax_amt_tax_curr,
6165            prd_total_tax_amt,
6166            prd_total_tax_amt_tax_curr,
6167            prd_total_tax_amt_funcl_curr,
6168            Rounding_Rule_Code,
6169            unrounded_taxable_amt,
6170            unrounded_tax_amt,
6171            currency_conversion_type,
6172            currency_conversion_rate,
6173            currency_conversion_date,
6174            tax_amt_funcl_curr,
6175            taxable_amt_funcl_curr,
6176            cal_tax_amt_funcl_curr,
6177            tax_provider_id,
6178            application_id,
6179            internal_organization_id,
6180            event_class_code,
6181            entity_code,
6182            trx_id,
6183            rounding_level_code,
6184            orig_tax_amt,
6185            orig_taxable_amt,
6186            orig_tax_amt_tax_curr,
6187            orig_taxable_amt_tax_curr
6188      FROM  ZX_DETAIL_TAX_LINES_GT
6189     WHERE (offset_link_to_tax_line_id IS NULL
6190            OR
6191            (offset_link_to_tax_line_id IS NOT NULL AND
6192 	    other_doc_source IN ('APPLIED_FROM', 'ADJUSTED'))) --bug8517610
6193       AND trx_id = c_trx_id
6194       AND application_id    = c_application_id
6195       AND event_class_code  = c_event_class_code
6196       AND entity_code       = c_entity_code
6197      ORDER BY
6198            ledger_id,
6199            application_id,
6200            event_class_code,
6201            entity_code,
6202            trx_id,
6203            tax_regime_code,
6204            tax,
6205            tax_status_code,
6206            tax_rate_code,
6207            tax_rate,
6208            tax_rate_id,
6209            tax_jurisdiction_code,
6210            taxable_basis_formula,
6211            tax_calculation_formula,
6212            Tax_Amt_Included_Flag,
6213            compounding_tax_flag,
6214            historical_flag,
6215            self_assessed_flag,
6216            overridden_flag,
6217            manually_entered_flag,
6218            Copied_From_Other_Doc_Flag,
6219            associated_child_frozen_flag,
6220            tax_only_line_flag,
6221            mrc_tax_line_flag,
6222            reporting_only_flag,
6223            applied_from_application_id,
6224            applied_from_event_class_code,
6225            applied_from_entity_code,
6226            applied_from_trx_id,
6227            applied_from_line_id,
6228            adjusted_doc_application_id,
6229            adjusted_doc_entity_code,
6230            adjusted_doc_event_class_code,
6231            adjusted_doc_trx_id,
6232            -- applied_to_application_id,
6233            -- applied_to_event_class_code,
6234            -- applied_to_entity_code,
6235            -- applied_to_trx_id,
6236            -- applied_to_line_id,
6237            tax_exemption_id,
6238            tax_rate_before_exemption,
6239            tax_rate_name_before_exemption,
6240            exempt_rate_modifier,
6241            exempt_certificate_number,
6242            exempt_reason,
6243            exempt_reason_code,
6244            tax_exception_id,
6245            tax_rate_before_exception,
6246            tax_rate_name_before_exception,
6247            exception_rate,
6248            legal_entity_id,
6249            establishment_id,
6250            TRUNC(currency_conversion_date),
6251            currency_conversion_type,
6252            currency_conversion_rate,
6253            record_type_code;
6254 
6255 BEGIN
6256 
6257   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
6258 
6259   IF (g_level_procedure >= g_current_runtime_level ) THEN
6260     FND_LOG.STRING(g_level_procedure,
6261                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.perform_rounding.BEGIN',
6262                    'ZX_TDS_TAX_ROUNDING_PKG: perform_rounding(+)');
6263   END IF;
6264 
6265   --
6266   -- init error buffer and return status
6267   --
6268   p_return_status  := FND_API.G_RET_STS_SUCCESS;
6269   p_error_buffer   := NULL;
6270 
6271   OPEN get_trx_id_csr;
6272   LOOP
6273   FETCH get_trx_id_csr INTO
6274          l_application_id,
6275          l_entity_code,
6276          l_event_class_code,
6277          l_trx_id;
6278   EXIT WHEN get_trx_id_csr%NOTFOUND;
6279   --FND_LOG.STRING(g_level_procedure,'Current Trx ID:',l_trx_id);
6280 
6281   --bug 12714708,initialize msg_context_info_rec based on current trx_id (after removing the entry from errors tbl in get_taxes_for_intercomp_trx)
6282   ZX_TDS_CALC_SERVICES_PUB_PKG.g_msg_context_info_rec.application_id := l_application_id;
6283   ZX_TDS_CALC_SERVICES_PUB_PKG.g_msg_context_info_rec.entity_code := l_entity_code;
6284   ZX_TDS_CALC_SERVICES_PUB_PKG.g_msg_context_info_rec.event_class_code := l_event_class_code;
6285   ZX_TDS_CALC_SERVICES_PUB_PKG.g_msg_context_info_rec.trx_id := l_trx_id;
6286 
6287   --
6288   -- init tax_currency_info_tbl
6289   --
6290 --Bug 7483633
6291  /*g_currency_tbl.DELETE;
6292   g_tax_curr_conv_rate_tbl.DELETE;*/
6293   --
6294   -- init header group record
6295   --
6296   init_header_group(l_prev_hdr_grp_rec,
6297                     p_return_status,
6298                     p_error_buffer);
6299 
6300   IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
6301     RETURN;
6302   END IF;
6303 
6304   --
6305   -- init header rounding info table
6306   --
6307   g_hdr_rounding_info_tbl.DELETE;
6308 
6309   --
6310   -- get rounding info
6311   --
6312 
6313   OPEN get_round_info_csr(
6314         l_trx_id,
6315         l_application_id,
6316         l_event_class_code,
6317         l_entity_code);
6318   LOOP
6319     FETCH get_round_info_csr BULK COLLECT INTO
6320            l_tax_line_id_tbl,
6321            l_manually_entered_flag_tbl,
6322            l_tax_id_tbl,
6323            l_tax_regime_code_tbl,
6324            l_tax_tbl,
6325            l_tax_status_code_tbl,
6326            l_tax_rate_code_tbl,
6327            l_tax_rate_tbl,
6328            l_tax_rate_id_tbl,
6329            l_tax_jurisdiction_code_tbl,
6330            l_taxable_basis_formula_tbl,
6331            l_tax_calculation_formula_tbl,
6332            l_tax_amt_included_flag_tbl,
6333            l_compounding_tax_flag_tbl,
6334            l_historical_flag_tbl,
6335            l_self_assessed_flag_tbl,
6336            l_overridden_flag_tbl,
6337            l_Cop_From_Other_Doc_Flag_tbl,
6338            l_assoc_child_frozen_flag_tbl,
6339            l_tax_only_line_flag_tbl,
6340            l_mrc_tax_line_flag_tbl,
6341            l_reporting_only_flag_tbl,
6342            l_applied_from_applic_id_tbl,
6343            l_applied_from_evnt_cls_cd_tbl,
6344            l_applied_from_entity_code_tbl,
6345            l_applied_from_trx_id_tbl,
6346            l_applied_from_line_id_tbl,
6347            l_adjusted_doc_applic_id_tbl,
6348            l_adjusted_doc_entity_code_tbl,
6349            l_adjusted_doc_evnt_cls_cd_tbl,
6350            l_adjusted_doc_trx_id_tbl,
6351            --l_applied_to_applic_id_tbl,
6352            --l_applied_to_evnt_cls_cd_tbl,
6353            --l_applied_to_entity_code_tbl,
6354            --l_applied_to_trx_id_tbl,
6355            --l_applied_to_line_id_tbl,
6356            l_tax_exemption_id_tbl,
6357            l_tax_rate_before_exempt_tbl,
6358            l_rate_name_before_exempt_tbl,
6359            l_exempt_rate_modifier_tbl,
6360            l_exempt_certificate_num_tbl,
6361            l_exempt_reason_tbl,
6362            l_exempt_reason_code_tbl,
6363            l_tax_exception_id_tbl,
6364            l_tax_rate_before_except_tbl,
6365            l_rate_name_before_except_tbl,
6366            l_exception_rate_tbl,
6367            l_ledger_id_tbl,
6368            l_legal_entity_id_tbl,
6369            l_establishment_id_tbl,
6370            l_record_type_code_tbl,
6371            l_min_acct_unit_tbl,
6372            l_precision_tbl,
6373            l_trx_currency_code_tbl,
6374            l_tax_currency_code_tbl,
6375            l_tax_curr_conv_date_tbl,
6376            l_tax_curr_conv_type_tbl,
6377            l_tax_curr_conv_rate_tbl,
6378            l_tax_amt_tbl,
6379            l_taxable_amt_tbl,
6380            l_cal_tax_amt_tbl,
6381            l_tax_amt_tax_curr_tbl,
6382            l_taxable_amt_tax_curr_tbl,
6383            l_cal_tax_amt_tax_curr_tbl,
6384            l_prd_total_tax_amt_tbl,
6385            l_prd_tot_tax_amt_tax_curr_tbl,
6386            l_prd_tot_tax_amt_fcl_curr_tbl,
6387            l_rounding_rule_tbl,
6388            l_unrounded_taxable_amt_tbl,
6389            l_unrounded_tax_amt_tbl,
6390            l_currency_conversion_type_tbl,
6391            l_currency_conversion_rate_tbl,
6392            l_currency_conversion_date_tbl,
6393            l_tax_amt_funcl_curr_tbl,
6394            l_taxable_amt_funcl_curr_tbl,
6395            l_cal_tax_amt_funcl_curr_tbl,
6396            l_tax_provider_id_tbl,
6397            l_application_id_tbl,
6398            l_internal_organization_id_tbl,
6399            l_event_class_code_tbl,
6400            l_entity_code_tbl,
6401            l_trx_id_tbl,
6402            l_rounding_level_code_tbl,
6403            l_orig_tax_amt_tbl,
6404            l_orig_taxable_amt_tbl,
6405            l_orig_tax_amt_tax_curr_tbl,
6406            l_orig_taxable_amt_tax_cur_tbl
6407       LIMIT C_LINES_PER_COMMIT;
6408 
6409     FOR i IN 1.. NVL(l_tax_line_id_tbl.COUNT, 0) LOOP
6410 
6411       --
6412       -- perform rounding for each line using LINE level rounding
6413       --
6414 
6415       do_rounding(
6416              l_tax_id_tbl(i),
6417              l_tax_rate_id_tbl(i),
6418              l_tax_amt_tbl(i),
6419              l_taxable_amt_tbl(i),
6420              l_orig_tax_amt_tbl(i),
6421              l_orig_taxable_amt_tbl(i),
6422              l_orig_tax_amt_tax_curr_tbl(i),
6423              l_orig_taxable_amt_tax_cur_tbl(i),
6424              l_cal_tax_amt_tbl(i),
6425              l_tax_amt_tax_curr_tbl(i),
6426              l_taxable_amt_tax_curr_tbl(i),
6427              l_cal_tax_amt_tax_curr_tbl(i),
6428              l_tax_amt_funcl_curr_tbl(i),
6429              l_taxable_amt_funcl_curr_tbl(i),
6430              l_cal_tax_amt_funcl_curr_tbl(i),
6431              l_trx_currency_code_tbl(i),
6432              l_tax_currency_code_tbl(i),
6433              l_tax_curr_conv_type_tbl(i),
6434              l_tax_curr_conv_rate_tbl(i),
6435              l_tax_curr_conv_date_tbl(i),
6436              l_currency_conversion_type_tbl(i),
6437              l_currency_conversion_rate_tbl(i),
6438              l_currency_conversion_date_tbl(i),
6439              l_rounding_rule_tbl(i),
6440              l_ledger_id_tbl(i),
6441              l_min_acct_unit_tbl(i),
6442              l_precision_tbl(i),
6443              l_application_id_tbl(i),
6444              l_internal_organization_id_tbl(i),
6445              p_event_class_rec.event_class_mapping_id,
6446              l_tax_calculation_formula_tbl(i),
6447              l_tax_rate_tbl(i),
6448              l_prd_total_tax_amt_tbl(i),
6449              l_prd_tot_tax_amt_tax_curr_tbl(i),
6450              l_prd_tot_tax_amt_fcl_curr_tbl(i),
6451              l_unrounded_taxable_amt_tbl(i),
6452              l_unrounded_tax_amt_tbl(i),
6453              l_mrc_tax_line_flag_tbl(i),
6454              l_tax_provider_id_tbl(i),
6455              --p_event_class_rec.quote_flag,
6456              p_return_status,
6457              p_error_buffer);
6458 
6459       IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
6460         EXIT;
6461       END IF;
6462 
6463       IF l_rounding_level_code_tbl(i) = 'HEADER' THEN
6464 
6465         --
6466         -- get header grouping criteria of the current record
6467         --
6468         l_curr_hdr_grp_rec.application_id             := l_application_id_tbl(i);
6469         l_curr_hdr_grp_rec.event_class_code           := l_event_class_code_tbl(i);
6470         l_curr_hdr_grp_rec.entity_code                := l_entity_code_tbl(i);
6471         l_curr_hdr_grp_rec.trx_id                     := l_trx_id_tbl(i);
6472         l_curr_hdr_grp_rec.tax_regime_code              :=
6473                                l_tax_regime_code_tbl(i);
6474         l_curr_hdr_grp_rec.tax                          := l_tax_tbl(i);
6475         l_curr_hdr_grp_rec.tax_status_code              := l_tax_status_code_tbl(i);
6476         l_curr_hdr_grp_rec.tax_rate_code                := l_tax_rate_code_tbl(i);
6477         l_curr_hdr_grp_rec.tax_rate                     := l_tax_rate_tbl(i);
6478         l_curr_hdr_grp_rec.tax_rate_id                  := l_tax_rate_id_tbl(i);
6479         l_curr_hdr_grp_rec.tax_jurisdiction_code        :=
6480                                l_tax_jurisdiction_code_tbl(i);
6481         l_curr_hdr_grp_rec.taxable_basis_formula        :=
6482                                l_taxable_basis_formula_tbl(i);
6483         l_curr_hdr_grp_rec.tax_calculation_formula      :=
6484                                l_tax_calculation_formula_tbl(i);
6485         l_curr_hdr_grp_rec.Tax_Amt_Included_Flag        :=
6486                                l_Tax_Amt_Included_Flag_tbl(i);
6487         l_curr_hdr_grp_rec.compounding_tax_flag         :=
6488                                l_compounding_tax_flag_tbl(i);
6489         l_curr_hdr_grp_rec.historical_flag              :=
6490                                l_historical_flag_tbl(i);
6491         l_curr_hdr_grp_rec.self_assessed_flag           :=
6492                                l_self_assessed_flag_tbl(i);
6493         l_curr_hdr_grp_rec.overridden_flag              :=
6494                                l_overridden_flag_tbl(i);
6495         l_curr_hdr_grp_rec.manually_entered_flag        :=
6496                                l_manually_entered_flag_tbl(i);
6497         l_curr_hdr_grp_rec.Copied_From_Other_Doc_Flag     :=
6498                                l_Cop_From_Other_Doc_Flag_tbl(i);
6499         l_curr_hdr_grp_rec.associated_child_frozen_flag :=
6500                                l_assoc_child_frozen_flag_tbl(i);
6501         l_curr_hdr_grp_rec.tax_only_line_flag           :=
6502                                l_tax_only_line_flag_tbl(i);
6503         l_curr_hdr_grp_rec.mrc_tax_line_flag   :=
6504                                l_mrc_tax_line_flag_tbl(i);
6505         l_curr_hdr_grp_rec.reporting_only_flag :=
6506                                l_reporting_only_flag_tbl(i);
6507         l_curr_hdr_grp_rec.applied_from_application_id  :=
6508                                l_applied_from_applic_id_tbl(i);
6509         l_curr_hdr_grp_rec.applied_from_event_class_code :=
6510                                l_applied_from_evnt_cls_cd_tbl(i);
6511         l_curr_hdr_grp_rec.applied_from_entity_code     :=
6512                                l_applied_from_entity_code_tbl(i);
6513         l_curr_hdr_grp_rec.applied_from_trx_id          :=
6514                                l_applied_from_trx_id_tbl(i);
6515         l_curr_hdr_grp_rec.applied_from_line_id          :=
6516                                l_applied_from_line_id_tbl(i);
6517         l_curr_hdr_grp_rec.adjusted_doc_application_id  :=
6518                                l_adjusted_doc_applic_id_tbl(i);
6519         l_curr_hdr_grp_rec.adjusted_doc_entity_code     :=
6520                                l_adjusted_doc_entity_code_tbl(i);
6521         l_curr_hdr_grp_rec.adjusted_doc_event_class_code :=
6522                                l_adjusted_doc_evnt_cls_cd_tbl(i);
6523         l_curr_hdr_grp_rec.adjusted_doc_trx_id          :=
6524                                l_adjusted_doc_trx_id_tbl(i);
6525         --l_curr_hdr_grp_rec.applied_to_application_id    :=
6526         --                       l_applied_to_applic_id_tbl(i);
6527         --l_curr_hdr_grp_rec.applied_to_event_class_code  :=
6528         --                       l_applied_to_evnt_cls_cd_tbl(i);
6529         --l_curr_hdr_grp_rec.applied_to_entity_code       :=
6530         --                       l_applied_to_entity_code_tbl(i);
6531         --l_curr_hdr_grp_rec.applied_to_trx_id            :=
6532         --                       l_applied_to_trx_id_tbl(i);
6533         --l_curr_hdr_grp_rec.applied_to_line_id            :=
6534         --                       l_applied_to_line_id_tbl(i);
6535         l_curr_hdr_grp_rec.tax_exemption_id             :=
6536                                l_tax_exemption_id_tbl(i);
6537         l_curr_hdr_grp_rec.tax_rate_before_exemption    :=
6538                                l_tax_rate_before_exempt_tbl(i);
6539         l_curr_hdr_grp_rec.tax_rate_name_before_exemption:=
6540                                l_rate_name_before_exempt_tbl(i);
6541         l_curr_hdr_grp_rec.exempt_rate_modifier         :=
6542                                l_exempt_rate_modifier_tbl(i);
6543         l_curr_hdr_grp_rec.exempt_certificate_number    :=
6544                                l_exempt_certificate_num_tbl(i);
6545         l_curr_hdr_grp_rec.exempt_reason                :=
6546                                l_exempt_reason_tbl(i);
6547         l_curr_hdr_grp_rec.exempt_reason_code           :=
6548                                l_exempt_reason_code_tbl(i);
6549         l_curr_hdr_grp_rec.tax_exception_id             :=
6550                                l_tax_exception_id_tbl(i);
6551         l_curr_hdr_grp_rec.tax_rate_before_exception               :=
6552                                l_tax_rate_before_except_tbl(i);
6553         l_curr_hdr_grp_rec.tax_rate_name_before_exception          :=
6554                                l_rate_name_before_except_tbl(i);
6555         l_curr_hdr_grp_rec.exception_rate      :=
6556                                l_exception_rate_tbl(i);
6557         l_curr_hdr_grp_rec.ledger_id         := l_ledger_id_tbl(i);
6558         l_curr_hdr_grp_rec.legal_entity_id   := l_legal_entity_id_tbl(i);
6559         l_curr_hdr_grp_rec.establishment_id  := l_establishment_id_tbl(i);
6560         l_curr_hdr_grp_rec.currency_conversion_date   :=
6561                                l_currency_conversion_date_tbl(i);
6562         l_curr_hdr_grp_rec.currency_conversion_type   :=
6563                                l_currency_conversion_type_tbl(i);
6564         l_curr_hdr_grp_rec.currency_conversion_rate   :=
6565                                l_currency_conversion_rate_tbl(i);
6566         l_curr_hdr_grp_rec.record_type_code    :=
6567                                l_record_type_code_tbl(i);
6568 
6569         --
6570         -- check whether it is in the same group of tax for
6571         -- header rounding level.  l_same_tax is used for header
6572         -- rounding level only
6573         --
6574         determine_header_group(l_prev_hdr_grp_rec,
6575                                l_curr_hdr_grp_rec,
6576                                l_same_tax,
6577                                p_return_status,
6578                                p_error_buffer);
6579 
6580         IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
6581           EXIT;
6582         END IF;
6583 
6584         -- when not in the same rounding group
6585         IF l_same_tax = 'N' THEN
6586           --
6587           -- this is the new group of tax
6588           -- need to init the sum for this group
6589           --
6590           IF p_event_class_rec.tax_event_type_code = 'CREATE' THEN
6591             process_tax_line_create(
6592                  l_sum_unrnd_tax_amt,
6593                  l_sum_rnd_tax_amt,
6594                  l_sum_rnd_tax_curr,
6595                  l_sum_rnd_funcl_curr,
6596                  p_return_status,
6597                  p_error_buffer);
6598             IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
6599               EXIT;
6600             END IF;
6601           ELSIF (p_event_class_rec.tax_event_type_code = 'UPDATE' OR
6602                  p_event_class_rec.tax_event_type_code = 'OVERRIDE_TAX') THEN
6603             process_tax_line_upd_override(
6604                     l_curr_hdr_grp_rec,
6605                     l_sum_unrnd_tax_amt,
6606                     l_sum_rnd_tax_amt,
6607                     l_sum_rnd_tax_curr,
6608                     l_sum_rnd_funcl_curr,
6609                     p_event_class_rec,
6610                     p_return_status,
6611                     p_error_buffer);
6612             IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
6613               EXIT;
6614             END IF;
6615           END IF;
6616 
6617           -- following reset has been done in the update_header_rounding_info()
6618           -- reset the current rounding group to prev rounding group
6619           -- l_prev_hdr_grp_rec := l_curr_hdr_grp_rec;
6620 
6621         END IF;
6622 
6623 
6624 
6625         --
6626         -- update  header rounding info to new values if this
6627         -- is the new header rounding group
6628         --
6629         update_header_rounding_info(
6630                                       l_tax_line_id_tbl(i),
6631                                       l_tax_id_tbl(i),
6632                                       l_rounding_rule_tbl(i),
6633                                       l_min_acct_unit_tbl(i),
6634                                       l_precision_tbl(i),
6635                                       l_unrounded_tax_amt_tbl(i),
6636                                       l_tax_amt_tbl(i),
6637                                       l_tax_amt_tax_curr_tbl(i),
6638                                       l_tax_amt_funcl_curr_tbl(i),
6639                                       l_taxable_amt_tax_curr_tbl(i),
6640                                       l_taxable_amt_funcl_curr_tbl(i),
6641                                       l_tax_curr_conv_rate_tbl(i),
6642                                       l_currency_conversion_rate_tbl(i),
6643                                       l_prev_hdr_grp_rec,
6644                                       l_curr_hdr_grp_rec,
6645                                       l_same_tax,
6646                                       l_sum_unrnd_tax_amt,
6647                                       l_sum_rnd_tax_amt,
6648                                       l_sum_rnd_tax_curr,
6649                                       l_sum_rnd_funcl_curr,
6650                                       l_ledger_id_tbl(i),
6651                                       p_return_status,
6652                                       p_error_buffer);
6653 
6654         IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
6655           EXIT;
6656         END IF;
6657       END IF;
6658       --
6659       -- be sure these columns  are not null for
6660       -- non manually entered tax line
6661       --
6662       IF l_manually_entered_flag_tbl(i)  = 'N' THEN
6663         IF (l_tax_amt_tax_curr_tbl(i) IS NULL OR
6664             l_taxable_amt_tax_curr_tbl(i) IS NULL ) THEN
6665           -- get l_rate_type_code
6666 
6667           IF ZX_TDS_UTILITIES_PKG.g_tax_rate_info_tbl.EXISTS(l_tax_rate_id_tbl(i)) THEN
6668 
6669             l_rate_type_code :=
6670                ZX_TDS_UTILITIES_PKG.g_tax_rate_info_tbl(l_tax_rate_id_tbl(i)).rate_type_code;
6671           ELSE
6672             ZX_TDS_UTILITIES_PKG.get_tax_rate_info(
6673                p_tax_rate_id      => l_tax_rate_id_tbl(i),
6674                p_tax_rate_rec     => l_tax_rate_rec,
6675                p_return_status    => p_return_status,
6676                p_error_buffer     => p_error_buffer);
6677 
6678 
6679             IF p_return_status = FND_API.G_RET_STS_SUCCESS THEN
6680               l_rate_type_code := l_tax_rate_rec.rate_type_code;
6681             END IF;
6682           END IF;
6683 
6684           --Bug 7109899
6685           IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
6686             EXIT;
6687           END IF;
6688         END IF;
6689 
6690         chk_mandatory_col_after_round(
6691                l_trx_currency_code_tbl(i),
6692                l_tax_currency_code_tbl(i),
6693                l_tax_amt_tbl(i),
6694                l_tax_amt_tax_curr_tbl(i),
6695                l_taxable_amt_tbl(i),
6696                l_taxable_amt_tax_curr_tbl(i),
6697                l_mrc_tax_line_flag_tbl(i),
6698                l_rate_type_code,
6699                p_return_status,
6700                p_error_buffer);
6701 
6702         IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
6703           EXIT;
6704         END IF;
6705       END IF;
6706 
6707     END LOOP;
6708 
6709     --Bug 7109899
6710 
6711    IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
6712      RETURN;
6713    END IF;
6714 
6715     --
6716     -- bulk update the current rows processed
6717     -- before fetch the next set of rows
6718     --
6719 
6720     update_detail_tax_lines_gt(
6721        p_min_acct_unit_tbl              =>  l_min_acct_unit_tbl,
6722        p_precision_tbl                  =>  l_precision_tbl,
6723        p_tax_currency_code_tbl          =>  l_tax_currency_code_tbl,
6724        p_tax_curr_conv_rate_tbl         =>  l_tax_curr_conv_rate_tbl,
6725        p_tax_amt_tbl                    =>  l_tax_amt_tbl,
6726        p_taxable_amt_tbl                =>  l_taxable_amt_tbl,
6727        p_tax_amt_tax_curr_tbl           =>  l_tax_amt_tax_curr_tbl,
6728        p_taxable_amt_tax_curr_tbl       =>  l_taxable_amt_tax_curr_tbl,
6729        p_tax_amt_funcl_curr_tbl         =>  l_tax_amt_funcl_curr_tbl,
6730        p_taxable_amt_funcl_curr_tbl     =>  l_taxable_amt_funcl_curr_tbl,
6731        p_prd_total_tax_amt_tbl          =>  l_prd_total_tax_amt_tbl,
6732        p_prd_tot_tax_amt_tax_curr_tbl   =>  l_prd_tot_tax_amt_tax_curr_tbl,
6733        p_prd_tot_tax_amt_fcl_curr_tbl   =>  l_prd_tot_tax_amt_fcl_curr_tbl,
6734        p_cal_tax_amt_funcl_curr_tbl     =>  l_cal_tax_amt_funcl_curr_tbl,
6735        p_orig_tax_amt_tax_curr_tbl      =>  l_orig_tax_amt_tax_curr_tbl,
6736        p_orig_taxable_amt_tax_cur_tbl   =>  l_orig_taxable_amt_tax_cur_tbl,
6737        p_tax_line_id_tbl                =>  l_tax_line_id_tbl,
6738        p_return_status                  =>  p_return_status,
6739        p_error_buffer                   =>  p_error_buffer);
6740 
6741     IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
6742       EXIT;
6743     END IF;
6744 
6745     EXIT WHEN  get_round_info_csr%NOTFOUND;
6746 
6747   END LOOP;
6748 
6749   CLOSE get_round_info_csr;
6750   IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
6751     RETURN;
6752   END IF;
6753 
6754   --
6755   -- now adjust the rounding differences if it is HEADER rounding level
6756   -- for tax amount in trx currency, tax currrency and functional
6757   -- currency
6758   --
6759   adjust_rounding_diff(
6760          p_return_status,
6761          p_error_buffer);
6762   IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
6763     RETURN;
6764   END IF;
6765   END LOOP;
6766 
6767   IF (g_level_procedure >= g_current_runtime_level ) THEN
6768 
6769     FND_LOG.STRING(g_level_procedure,
6770                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.perform_rounding.END',
6771                    'ZX_TDS_TAX_ROUNDING_PKG: perform_rounding(-)'||p_return_status);
6772   END IF;
6773 
6774 EXCEPTION
6775   WHEN OTHERS THEN
6776     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6777     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
6778 
6779     IF (g_level_unexpected >= g_current_runtime_level ) THEN
6780       FND_LOG.STRING(g_level_unexpected,
6781                      'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.perform_rounding',
6782                       p_error_buffer);
6783     END IF;
6784 
6785 END perform_rounding;
6786 
6787 ---------------------------------------------------------------------------
6788 --  PRIVATE PROCEDURE
6789 --  convert_and_round_for_curr
6790 --
6791 --  DESCRIPTION
6792 --  This procedure converts tax amount and taxable amount to the currency
6793 --  specified and then performs line level rounding
6794 --
6795 
6796 PROCEDURE convert_and_round_for_curr(
6797             p_curr_conv_rate          IN            ZX_LINES.CURRENCY_CONVERSION_RATE%TYPE,
6798             p_rounded_tax_amt         IN            ZX_LINES.TAX_AMT%TYPE,
6799             p_rounded_taxable_amt     IN            ZX_LINES.TAXABLE_AMT%TYPE,
6800             p_unrounded_tax_amt       IN            ZX_LINES.TAX_AMT%TYPE,
6801             p_unrounded_taxable_amt   IN            ZX_LINES.TAXABLE_AMT%TYPE,
6802             p_conv_rnd_tax_amt_curr      OUT NOCOPY ZX_LINES.TAX_AMT_TAX_CURR%TYPE,
6803             p_conv_rnd_taxable_amt_curr  OUT NOCOPY ZX_LINES.TAXABLE_AMT_TAX_CURR%TYPE,
6804             p_ledger_id               IN            ZX_LINES.LEDGER_ID%TYPE,
6805             p_tax_calculation_formula IN            ZX_LINES.TAX_CALCULATION_FORMULA%TYPE,
6806             p_tax_rate                IN            ZX_LINES.TAX_RATE%TYPE,
6807             p_tax_rate_id             IN            ZX_RATES_B.TAX_RATE_ID%TYPE,
6808             p_return_status              OUT NOCOPY VARCHAR2,
6809             p_error_buffer               OUT NOCOPY VARCHAR2
6810          )
6811 IS
6812 
6813 BEGIN
6814 
6815   IF (g_level_procedure >= g_current_runtime_level ) THEN
6816     FND_LOG.STRING(g_level_procedure,
6817                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.convert_and_round_for_curr.BEGIN',
6818                    'ZX_TDS_TAX_ROUNDING_PKG: convert_and_round_for_curr(+)');
6819   END IF;
6820 
6821   --
6822   -- init return status
6823   --
6824   p_return_status  := FND_API.G_RET_STS_SUCCESS;
6825 
6826   -- convert and round for functional currency
6827   --
6828   IF p_rounded_tax_amt <> 0 THEN
6829     --
6830     -- if current rounded tax amt is zero, the tax amt in
6831     -- functional currency is set to zero already, no need
6832     -- to do anything in this case, otherwise, need to convert
6833     -- with the given rate and round
6834     --
6835     conv_rnd_tax_funcl_curr(
6836                         p_curr_conv_rate,
6837                         p_unrounded_tax_amt,
6838                         p_conv_rnd_tax_amt_curr,
6839                         p_ledger_id,
6840                         p_return_status,
6841                         p_error_buffer);
6842     IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
6843       RETURN;
6844     END IF;
6845   END IF;
6846   IF p_rounded_taxable_amt  <> 0 THEN
6847     --
6848     -- if current rounded taxable amt is zero, the taxable amt in
6849     -- functional currency is set to zero already, no need
6850     -- to do anything in this case, otherwise, need to convert
6851     -- with the given rate and round
6852     --
6853     conv_rnd_taxable_funcl_curr(
6854                         p_curr_conv_rate,
6855                         p_unrounded_taxable_amt,
6856                         p_conv_rnd_taxable_amt_curr,
6857                         p_ledger_id,
6858                         p_tax_calculation_formula,
6859                         p_tax_rate,
6860                         p_tax_rate_id,
6861                         p_conv_rnd_tax_amt_curr,
6862                         p_return_status,
6863                         p_error_buffer);
6864     IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
6865       RETURN;
6866     END IF;
6867   END IF;   -- end functional currency
6868 
6869   IF (g_level_procedure >= g_current_runtime_level ) THEN
6870 
6871     FND_LOG.STRING(g_level_procedure,
6872                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.convert_and_round_for_curr.END',
6873                    'ZX_TDS_TAX_ROUNDING_PKG: convert_and_round_for_curr(-)'||p_return_status);
6874   END IF;
6875 
6876 EXCEPTION
6877   WHEN OTHERS THEN
6878     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6879     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
6880 
6881     IF (g_level_unexpected >= g_current_runtime_level ) THEN
6882       FND_LOG.STRING(g_level_unexpected,
6883                      'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.convert_and_round_for_curr',
6884                       p_error_buffer);
6885     END IF;
6886 END convert_and_round_for_curr;
6887 
6888 ---------------------------------------------------------------------------
6889 --  PRIVATE PROCEDURE
6890 --  convert_and_round_lin_lvl_curr
6891 --
6892 --  DESCRIPTION
6893 --  This procedure performs line level rounding for tax amount and taxable
6894 --  amount in functional currency or other currency when the
6895 --  conversion rate is provided from product
6896 --
6897 
6898 PROCEDURE convert_and_round_lin_lvl_curr(
6899            p_conversion_rate  IN            NUMBER,
6900            p_conversion_type  IN            VARCHAR2,
6901            p_conversion_date  IN            DATE,
6902            p_event_class_rec  IN            ZX_API_PUB.EVENT_CLASS_REC_TYPE,
6903            p_return_status       OUT NOCOPY VARCHAR2,
6904            p_error_buffer        OUT NOCOPY VARCHAR2
6905          )
6906 IS
6907 
6908   i                               BINARY_INTEGER;
6909   l_count                         NUMBER;
6910 
6911   l_tax_line_id_tbl               TAX_LINE_ID_TBL;
6912   l_tax_rate_tbl                  TAX_RATE_TBL;
6913   l_tax_rate_id_tbl               TAX_RATE_ID_TBL;
6914   l_tax_calculation_formula_tbl   TAX_CALCULATION_FORMULA_TBL;
6915   l_ledger_id_tbl                 LEDGER_ID_TBL;
6916   l_trx_currency_code_tbl         TRX_CURRENCY_CODE_TBL;
6917   l_rounding_level_tbl            ROUNDING_LEVEL_TBL;
6918   l_currency_conversion_rate_tbl  CURRENCY_CONVERSION_RATE_TBL;
6919   l_tax_amt_tbl                   TAX_AMT_TBL;
6920   l_taxable_amt_tbl               TAXABLE_AMT_TBL;
6921   l_cal_tax_amt_tbl               CAL_TAX_AMT_TBL;
6922   l_unrounded_taxable_amt_tbl     UNROUNDED_TAXABLE_AMT_TBL;
6923   l_unrounded_tax_amt_tbl         UNROUNDED_TAX_AMT_TBL;
6924   l_tax_amt_funcl_curr_tbl        TAX_AMT_FUNCL_CURR_TBL;
6925   l_taxable_amt_funcl_curr_tbl    TAXABLE_AMT_FUNCL_CURR_TBL;
6926   l_cal_tax_amt_funcl_curr_tbl    CAL_TAX_AMT_FUNCL_CURR_TBL;
6927 
6928   CURSOR get_round_line_level_curr_csr
6929     (c_trx_id                     ZX_LINES.TRX_ID%TYPE,
6930      c_application_id             ZX_LINES.APPLICATION_ID%TYPE,
6931      c_event_class_code           ZX_LINES.EVENT_CLASS_CODE%TYPE,
6932      c_entity_code                ZX_LINES.ENTITY_CODE%TYPE)
6933   IS
6934     SELECT tax_line_id,
6935            tax_rate,
6936            tax_rate_id,
6937            tax_calculation_formula,
6938            ledger_id,
6939            trx_currency_code,
6940            Rounding_Level_Code,
6941            currency_conversion_rate,
6942            tax_amt,
6943            taxable_amt,
6944            cal_tax_amt,
6945            unrounded_taxable_amt,
6946            unrounded_tax_amt,
6947            tax_amt_funcl_curr,
6948            taxable_amt_funcl_curr,
6949            cal_tax_amt_funcl_curr
6950      FROM  ZX_LINES
6951       WHERE trx_id            = c_trx_id           AND
6952             application_id    = c_application_id   AND
6953             event_class_code  = c_event_class_code AND
6954             entity_code       = c_entity_code      AND
6955             tax_provider_id IS NULL                AND
6956             offset_link_to_tax_line_id IS NULL     AND
6957             mrc_tax_line_flag = 'N';
6958 
6959 BEGIN
6960 
6961   IF (g_level_procedure >= g_current_runtime_level ) THEN
6962     FND_LOG.STRING(g_level_procedure,
6963                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.convert_and_round_lin_lvl_curr.BEGIN',
6964                    'ZX_TDS_TAX_ROUNDING_PKG: convert_and_round_lin_lvl_curr(+)');
6965   END IF;
6966 
6967   --
6968   -- init return status
6969   --
6970   p_return_status  := FND_API.G_RET_STS_SUCCESS;
6971 
6972   --
6973   -- get amount columns and other rounding info
6974   --
6975   OPEN get_round_line_level_curr_csr(
6976                                p_event_class_rec.trx_id,
6977                                p_event_class_rec.application_id,
6978                                p_event_class_rec.event_class_code,
6979                                p_event_class_rec.entity_code);
6980   LOOP
6981     FETCH get_round_line_level_curr_csr BULK COLLECT INTO
6982            l_tax_line_id_tbl,
6983            l_tax_rate_tbl,
6984            l_tax_rate_id_tbl,
6985            l_tax_calculation_formula_tbl,
6986            l_ledger_id_tbl,
6987            l_trx_currency_code_tbl,
6988            l_rounding_level_tbl,
6989            l_currency_conversion_rate_tbl,
6990            l_tax_amt_tbl,
6991            l_taxable_amt_tbl,
6992            l_cal_tax_amt_tbl,
6993            l_unrounded_taxable_amt_tbl,
6994            l_unrounded_tax_amt_tbl,
6995            l_tax_amt_funcl_curr_tbl,
6996            l_taxable_amt_funcl_curr_tbl,
6997            l_cal_tax_amt_funcl_curr_tbl
6998       LIMIT C_LINES_PER_COMMIT;
6999 
7000 
7001     l_count := l_tax_line_id_tbl.COUNT;
7002 
7003     IF (g_level_procedure >= g_current_runtime_level ) THEN
7004         FND_LOG.STRING(g_level_procedure,
7005                        'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.convert_and_round_lin_lvl_curr',
7006                        'number of rows fetched = ' || to_char(l_count));
7007     END IF;
7008 
7009     IF l_count > 0 THEN
7010 
7011       FOR i IN 1.. l_count LOOP
7012 
7013         --
7014         -- perform rounding for each line using LINE level rounding
7015         --
7016 
7017         convert_and_round_for_curr(
7018                        p_conversion_rate,
7019                        l_tax_amt_tbl(i),
7020                        l_taxable_amt_tbl(i),
7021                        l_unrounded_tax_amt_tbl(i),
7022                        l_unrounded_taxable_amt_tbl(i),
7023                        l_tax_amt_funcl_curr_tbl(i),
7024                        l_taxable_amt_funcl_curr_tbl(i),
7025                        l_ledger_id_tbl(i),
7026                        l_tax_calculation_formula_tbl(i),
7027                        l_tax_rate_tbl(i),
7028                        l_tax_rate_id_tbl(i),
7029                        p_return_status,
7030                        p_error_buffer);
7031 
7032         IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
7033           EXIT;
7034         END IF;
7035       END LOOP;
7036 
7037       IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
7038         EXIT;
7039       END IF;
7040 
7041       --
7042       -- bulk update the current rows processed
7043       -- before fetch the next set of rows
7044       --
7045 
7046       -- update zx_lines
7047       --
7048       update_zx_lines(
7049                  p_conversion_rate,
7050                  p_conversion_type,
7051                  p_conversion_date,
7052                  l_tax_amt_funcl_curr_tbl,
7053                  l_taxable_amt_funcl_curr_tbl,
7054                  l_cal_tax_amt_funcl_curr_tbl,
7055                  l_tax_line_id_tbl,
7056                  p_return_status,
7057                  p_error_buffer);
7058 
7059       IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
7060         EXIT;
7061       END IF;
7062 
7063     ELSE
7064       --
7065       -- no more records to process
7066       --
7067       CLOSE get_round_line_level_curr_csr;
7068       EXIT;
7069     END IF;  -- end of count > 0
7070   END LOOP;
7071 
7072   IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
7073     CLOSE get_round_line_level_curr_csr;
7074     RETURN;
7075   END IF;
7076 
7077   IF (g_level_procedure >= g_current_runtime_level ) THEN
7078 
7079     FND_LOG.STRING(g_level_procedure,
7080                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.convert_and_round_lin_lvl_curr.END',
7081                    'ZX_TDS_TAX_ROUNDING_PKG: convert_and_round_lin_lvl_curr(-)'||p_return_status);
7082   END IF;
7083 
7084 EXCEPTION
7085   WHEN OTHERS THEN
7086     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7087     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
7088     IF get_round_line_level_curr_csr%ISOPEN THEN
7089       CLOSE get_round_line_level_curr_csr;
7090     END IF;
7091 
7092     IF (g_level_unexpected >= g_current_runtime_level ) THEN
7093       FND_LOG.STRING(g_level_unexpected,
7094                      'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.convert_and_round_lin_lvl_curr',
7095                       p_error_buffer);
7096     END IF;
7097 
7098 END convert_and_round_lin_lvl_curr;
7099 
7100 ---------------------------------------------------------------------------
7101 --  PRIVATE PROCEDURE
7102 --  convert_and_round_hdr_lvl_curr
7103 --
7104 --  DESCRIPTION
7105 --  This procedure performs header level rounding for tax amount and
7106 --  taxable amount in functional currency or other currency when the
7107 --  conversion rate is provided from product
7108 --
7109 
7110 PROCEDURE convert_and_round_hdr_lvl_curr(
7111            p_conversion_rate  IN            NUMBER,
7112            p_conversion_type  IN            VARCHAR2,
7113            p_conversion_date  IN            DATE,
7114            p_event_class_rec  IN            ZX_API_PUB.EVENT_CLASS_REC_TYPE,
7115            p_return_status       OUT NOCOPY VARCHAR2,
7116            p_error_buffer        OUT NOCOPY VARCHAR2
7117          )
7118 IS
7119 
7120   l_prev_hdr_grp_rec              HDR_GRP_REC_TYPE;
7121   l_curr_hdr_grp_rec              HDR_GRP_REC_TYPE;
7122   i                               BINARY_INTEGER;
7123   l_count                         NUMBER;
7124 
7125   l_tax_line_id_tbl               TAX_LINE_ID_TBL;
7126   l_tax_regime_code_tbl           TAX_REGIME_CODE_TBL;
7127   l_tax_tbl                       TAX_TBL;
7128   l_tax_status_code_tbl           TAX_STATUS_CODE_TBL;
7129   l_tax_rate_code_tbl             TAX_RATE_CODE_TBL;
7130   l_tax_rate_tbl                  TAX_RATE_TBL;
7131   l_tax_rate_id_tbl               TAX_RATE_ID_TBL;
7132   l_tax_jurisdiction_code_tbl     TAX_JURISDICTION_CODE_TBL;
7133   l_taxable_basis_formula_tbl     TAXABLE_BASIS_FORMULA_TBL;
7134   l_tax_calculation_formula_tbl   TAX_CALCULATION_FORMULA_TBL;
7135   l_tax_amt_included_flag_tbl     TAX_AMT_INCLUDED_FLAG_TBL;
7136   l_compounding_tax_flag_tbl      COMPOUNDING_TAX_FLAG_TBL;
7137   l_historical_flag_tbl           HISTORICAL_FLAG_TBL;
7138   l_self_assessed_flag_tbl        SELF_ASSESSED_FLAG_TBL;
7139   l_overridden_flag_tbl           OVERRIDDEN_FLAG_TBL;
7140   l_Cop_From_Other_Doc_Flag_tbl   COP_FROM_OTHER_DOC_FLAG_TBL;
7141   l_assoc_child_frozen_flag_tbl   ASSOC_CHILD_FROZEN_FLAG_TBL;
7142   l_tax_only_line_flag_tbl        TAX_ONLY_LINE_FLAG_TBL;
7143   l_manually_entered_flag_tbl     MANUALLY_ENTERED_FLAG_TBL;
7144   l_mrc_tax_line_flag_tbl         MRC_TAX_LINE_FLAG_TBL;
7145   l_reporting_only_flag_tbl       REPORTING_ONLY_FLAG_TBL;
7146   l_applied_from_applic_id_tbl    APPLIED_FROM_APPLIC_ID_TBL;
7147   l_applied_from_evnt_cls_cd_tbl  APPLIED_FROM_EVNT_CLS_CD_TBL;
7148   l_applied_from_entity_code_tbl  APPLIED_FROM_ENTITY_CODE_TBL;
7149   l_applied_from_trx_id_tbl       APPLIED_FROM_TRX_ID_TBL;
7150   l_applied_from_line_id_tbl      APPLIED_FROM_LINE_ID_TBL;
7151   l_adjusted_doc_applic_id_tbl    ADJUSTED_DOC_APPLIC_ID_TBL;
7152   l_adjusted_doc_entity_code_tbl  ADJUSTED_DOC_ENTITY_CODE_TBL;
7153   l_adjusted_doc_evnt_cls_cd_tbl  ADJUSTED_DOC_EVNT_CLS_CD_TBL;
7154   l_adjusted_doc_trx_id_tbl       ADJUSTED_DOC_TRX_ID_TBL;
7155   l_applied_to_applic_id_tbl      APPLIED_TO_APPLIC_ID_TBL;
7156   l_applied_to_evnt_cls_cd_tbl    APPLIED_TO_EVNT_CLS_CD_TBL;
7157   l_applied_to_entity_code_tbl    APPLIED_TO_ENTITY_CODE_TBL;
7158   l_applied_to_trx_id_tbl         APPLIED_TO_TRX_ID_TBL;
7159   l_applied_to_line_id_tbl        APPLIED_TO_LINE_ID_TBL;
7160   l_tax_exemption_id_tbl          TAX_EXEMPTION_ID_TBL;
7161   l_tax_rate_before_exempt_tbl    RATE_BEFORE_EXEMPTION_TBL;
7162   l_rate_name_before_exempt_tbl   RATE_NAME_BEFORE_EXEMPTION_TBL;
7163   l_exempt_rate_modifier_tbl      EXEMPT_RATE_MODIFIER_TBL;
7164   l_exempt_certificate_num_tbl    EXEMPT_CERTIFICATE_NUM_TBL;
7165   l_exempt_reason_tbl             EXEMPT_REASON_TBL;
7166   l_exempt_reason_code_tbl        EXEMPT_REASON_CODE_TBL;
7167   l_tax_exception_id_tbl          TAX_EXCEPTION_ID_TBL;
7168   l_tax_rate_before_except_tbl    RATE_BEFORE_EXCEPTION_TBL;
7169   l_rate_name_before_except_tbl   RATE_NAME_BEFORE_EXCEPTION_TBL;
7170   l_exception_rate_tbl            EXCEPTION_RATE_TBL;
7171   l_ledger_id_tbl                 LEDGER_ID_TBL;
7172   l_legal_entity_id_tbl           LEGAL_ENTITY_ID_TBL;
7173   l_establishment_id_tbl          ESTABLISHMENT_ID_TBL;
7174   l_record_type_code_tbl          RECORD_TYPE_CODE_TBL;
7175   l_currency_conversion_type_tbl  CURRENCY_CONVERSION_TYPE_TBL;
7176   l_currency_conversion_rate_tbl  CURRENCY_CONVERSION_RATE_TBL;
7177   l_currency_conversion_date_tbl  CURRENCY_CONVERSION_DATE_TBL;
7178   l_trx_currency_code_tbl         TRX_CURRENCY_CODE_TBL;
7179   l_rounding_level_tbl            ROUNDING_LEVEL_TBL;
7180   l_tax_amt_tbl                   TAX_AMT_TBL;
7181   l_taxable_amt_tbl               TAXABLE_AMT_TBL;
7182   l_cal_tax_amt_tbl               CAL_TAX_AMT_TBL;
7183   l_unrounded_taxable_amt_tbl     UNROUNDED_TAXABLE_AMT_TBL;
7184   l_unrounded_tax_amt_tbl         UNROUNDED_TAX_AMT_TBL;
7185   l_tax_amt_funcl_curr_tbl        TAX_AMT_FUNCL_CURR_TBL;
7186   l_taxable_amt_funcl_curr_tbl    TAXABLE_AMT_FUNCL_CURR_TBL;
7187   l_cal_tax_amt_funcl_curr_tbl    CAL_TAX_AMT_FUNCL_CURR_TBL;
7188 
7189   CURSOR get_round_head_level_curr_csr
7190     (c_trx_id                     ZX_LINES.TRX_ID%TYPE,
7191      c_application_id             ZX_LINES.APPLICATION_ID%TYPE,
7192      c_event_class_code           ZX_LINES.EVENT_CLASS_CODE%TYPE,
7193      c_entity_code                ZX_LINES.ENTITY_CODE%TYPE)
7194   IS
7195     SELECT tax_line_id,
7196            tax_regime_code,
7197            tax,
7198            tax_status_code,
7199            tax_rate_code,
7200            tax_rate,
7201            tax_rate_id,
7202            tax_jurisdiction_code,
7203            taxable_basis_formula,
7204            tax_calculation_formula,
7205            Tax_Amt_Included_Flag,
7206            compounding_tax_flag,
7207            historical_flag,
7208            self_assessed_flag,
7209            overridden_flag,
7210            Copied_From_Other_Doc_Flag,
7211            associated_child_frozen_flag,
7212            tax_only_line_flag,
7213            manually_entered_flag,
7214            mrc_tax_line_flag,
7215            reporting_only_flag,
7216            applied_from_application_id,
7217            applied_from_event_class_code,
7218            applied_from_entity_code,
7219            applied_from_trx_id,
7220            applied_from_line_id,
7221            adjusted_doc_application_id,
7222            adjusted_doc_entity_code,
7223            adjusted_doc_event_class_code,
7224            adjusted_doc_trx_id,
7225            --applied_to_application_id,
7226            --applied_to_event_class_code,
7227            --applied_to_entity_code,
7228            --applied_to_trx_id,
7229            --applied_to_line_id,
7230            tax_exemption_id,
7231            tax_rate_before_exemption,
7232            tax_rate_name_before_exemption,
7233            exempt_rate_modifier,
7234            exempt_certificate_number,
7235            exempt_reason,
7236            exempt_reason_code,
7237            tax_exception_id,
7238            tax_rate_before_exception,
7239            tax_rate_name_before_exception,
7240            exception_rate,
7241            ledger_id,
7242            legal_entity_id,
7243            establishment_id,
7244            currency_conversion_date,
7245            currency_conversion_type,
7246            currency_conversion_rate,
7247            record_type_code,
7248            trx_currency_code,
7249            Rounding_Level_Code,
7250            tax_amt,
7251            taxable_amt,
7252            cal_tax_amt,
7253            unrounded_taxable_amt,
7254            unrounded_tax_amt,
7255            tax_amt_funcl_curr,
7256            taxable_amt_funcl_curr,
7257            cal_tax_amt_funcl_curr
7258      FROM  ZX_LINES
7259       WHERE trx_id            = c_trx_id           AND
7260             application_id    = c_application_id   AND
7261             event_class_code  = c_event_class_code AND
7262             entity_code       = c_entity_code      AND
7263             tax_provider_id IS NULL                AND
7264             offset_link_to_tax_line_id IS NULL     AND
7265             mrc_tax_line_flag = 'N'
7266      ORDER BY
7267            tax_regime_code,
7268            tax,
7269            tax_status_code,
7270            tax_rate_code,
7271            tax_rate,
7272            tax_rate_id,
7273            tax_jurisdiction_code,
7274            taxable_basis_formula,
7275            tax_calculation_formula,
7276            Tax_Amt_Included_Flag,
7277            compounding_tax_flag,
7278            historical_flag,
7279            self_assessed_flag,
7280            overridden_flag,
7281            manually_entered_flag,
7282            Copied_From_Other_Doc_Flag,
7283            associated_child_frozen_flag,
7284            tax_only_line_flag,
7285            mrc_tax_line_flag,
7286            reporting_only_flag,
7287            applied_from_application_id,
7288            applied_from_event_class_code,
7289            applied_from_entity_code,
7290            applied_from_trx_id,
7291            applied_from_line_id,
7292            adjusted_doc_application_id,
7293            adjusted_doc_entity_code,
7294            adjusted_doc_event_class_code,
7295            adjusted_doc_trx_id,
7296            --applied_to_application_id,
7297            --applied_to_event_class_code,
7298            --applied_to_entity_code,
7299            --applied_to_trx_id,
7300            --applied_to_line_id,
7301            tax_exemption_id,
7302            tax_rate_before_exemption,
7303            tax_rate_name_before_exemption,
7304            exempt_rate_modifier,
7305            exempt_certificate_number,
7306            exempt_reason,
7307            exempt_reason_code,
7308            tax_exception_id,
7309            tax_rate_before_exception,
7310            tax_rate_name_before_exception,
7311            exception_rate,
7312            ledger_id,
7313            legal_entity_id,
7314            establishment_id,
7315            TRUNC(currency_conversion_date),
7316            currency_conversion_type,
7317            currency_conversion_rate,
7318            record_type_code;
7319 
7320 
7321 BEGIN
7322 
7323   IF (g_level_procedure >= g_current_runtime_level ) THEN
7324     FND_LOG.STRING(g_level_procedure,
7325                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.convert_and_round_hdr_lvl_curr.BEGIN',
7326                    'ZX_TDS_TAX_ROUNDING_PKG: convert_and_round_hdr_lvl_curr(+)');
7327   END IF;
7328 
7329   --
7330   -- init return status
7331   --
7332   p_return_status  := FND_API.G_RET_STS_SUCCESS;
7333 
7334   --
7335   -- init header group record
7336   --
7337   init_header_group(l_prev_hdr_grp_rec,
7338                     p_return_status,
7339                     p_error_buffer);
7340 
7341   IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
7342     RETURN;
7343   END IF;
7344 
7345   --
7346   -- init header rounding info table
7347   --
7348   g_hdr_rounding_curr_tbl.DELETE;
7349 
7350   --
7351   -- get amounts and rounding info
7352   --
7353   OPEN get_round_head_level_curr_csr(
7354                                p_event_class_rec.trx_id,
7355                                p_event_class_rec.application_id,
7356                                p_event_class_rec.event_class_code,
7357                                p_event_class_rec.entity_code);
7358   LOOP
7359     FETCH get_round_head_level_curr_csr BULK COLLECT INTO
7360            l_tax_line_id_tbl,
7361            l_tax_regime_code_tbl,
7362            l_tax_tbl,
7363            l_tax_status_code_tbl,
7364            l_tax_rate_code_tbl,
7365            l_tax_rate_tbl,
7366            l_tax_rate_id_tbl,
7367            l_tax_jurisdiction_code_tbl,
7368            l_taxable_basis_formula_tbl,
7369            l_tax_calculation_formula_tbl,
7370            l_tax_amt_included_flag_tbl,
7371            l_compounding_tax_flag_tbl,
7372            l_historical_flag_tbl,
7373            l_self_assessed_flag_tbl,
7374            l_overridden_flag_tbl,
7375            l_Cop_From_Other_Doc_Flag_tbl,
7376            l_assoc_child_frozen_flag_tbl,
7377            l_tax_only_line_flag_tbl,
7378            l_manually_entered_flag_tbl,
7379            l_mrc_tax_line_flag_tbl,
7380            l_reporting_only_flag_tbl,
7381            l_applied_from_applic_id_tbl,
7382            l_applied_from_evnt_cls_cd_tbl,
7383            l_applied_from_entity_code_tbl,
7384            l_applied_from_trx_id_tbl,
7385            l_applied_from_line_id_tbl,
7386            l_adjusted_doc_applic_id_tbl,
7387            l_adjusted_doc_entity_code_tbl,
7388            l_adjusted_doc_evnt_cls_cd_tbl,
7389            l_adjusted_doc_trx_id_tbl,
7390            --l_applied_to_applic_id_tbl,
7391            --l_applied_to_evnt_cls_cd_tbl,
7392            --l_applied_to_entity_code_tbl,
7393            --l_applied_to_trx_id_tbl,
7394            --l_applied_to_line_id_tbl,
7395            l_tax_exemption_id_tbl,
7396            l_tax_rate_before_exempt_tbl,
7397            l_rate_name_before_exempt_tbl,
7398            l_exempt_rate_modifier_tbl,
7399            l_exempt_certificate_num_tbl,
7400            l_exempt_reason_tbl,
7401            l_exempt_reason_code_tbl,
7402            l_tax_exception_id_tbl,
7403            l_tax_rate_before_except_tbl,
7404            l_rate_name_before_except_tbl,
7405            l_exception_rate_tbl,
7406            l_ledger_id_tbl,
7407            l_legal_entity_id_tbl,
7408            l_establishment_id_tbl,
7409            l_currency_conversion_date_tbl,
7410            l_currency_conversion_type_tbl,
7411            l_currency_conversion_rate_tbl,
7412            l_record_type_code_tbl,
7413            l_trx_currency_code_tbl,
7414            l_rounding_level_tbl,
7415            l_tax_amt_tbl,
7416            l_taxable_amt_tbl,
7417            l_cal_tax_amt_tbl,
7418            l_unrounded_taxable_amt_tbl,
7419            l_unrounded_tax_amt_tbl,
7420            l_tax_amt_funcl_curr_tbl,
7421            l_taxable_amt_funcl_curr_tbl,
7422            l_cal_tax_amt_funcl_curr_tbl
7423       LIMIT C_LINES_PER_COMMIT;
7424 
7425     l_count := l_tax_line_id_tbl.COUNT;
7426 
7427     IF (g_level_statement >= g_current_runtime_level ) THEN
7428         FND_LOG.STRING(g_level_statement,
7429                        'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.convert_and_round_hdr_lvl_curr',
7430                        'number of rows fetched = ' || to_char(l_count));
7431     END IF;
7432 
7433     IF l_count > 0 THEN
7434 
7435       FOR i IN 1.. l_count LOOP
7436 
7437         --
7438         -- perform rounding for each line using LINE level rounding
7439 
7440         convert_and_round_for_curr(
7441                        p_conversion_rate,
7442                        l_tax_amt_tbl(i),
7443                        l_taxable_amt_tbl(i),
7444                        l_unrounded_tax_amt_tbl(i),
7445                        l_unrounded_taxable_amt_tbl(i),
7446                        l_tax_amt_funcl_curr_tbl(i),
7447                        l_taxable_amt_funcl_curr_tbl(i),
7448                        l_ledger_id_tbl(i),
7449                        l_tax_calculation_formula_tbl(i),
7450                        l_tax_rate_tbl(i),
7451                        l_tax_rate_id_tbl(i),
7452                        p_return_status,
7453                        p_error_buffer);
7454 
7455         IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
7456           EXIT;
7457         END IF;
7458         --
7459         -- get header grouping criteria of the current record
7460         --
7461         l_curr_hdr_grp_rec.tax_regime_code              :=
7462                                l_tax_regime_code_tbl(i);
7463         l_curr_hdr_grp_rec.tax                          := l_tax_tbl(i);
7464         l_curr_hdr_grp_rec.tax_status_code              := l_tax_status_code_tbl(i);
7465         l_curr_hdr_grp_rec.tax_rate_code                := l_tax_rate_code_tbl(i);
7466         l_curr_hdr_grp_rec.tax_rate                     := l_tax_rate_tbl(i);
7467         l_curr_hdr_grp_rec.tax_rate_id                  := l_tax_rate_id_tbl(i);
7468         l_curr_hdr_grp_rec.tax_jurisdiction_code        :=
7469                                l_tax_jurisdiction_code_tbl(i);
7470         l_curr_hdr_grp_rec.taxable_basis_formula        :=
7471                                l_taxable_basis_formula_tbl(i);
7472         l_curr_hdr_grp_rec.tax_calculation_formula      :=
7473                                l_tax_calculation_formula_tbl(i);
7474         l_curr_hdr_grp_rec.Tax_Amt_Included_Flag        :=
7475                                l_Tax_Amt_Included_Flag_tbl(i);
7476         l_curr_hdr_grp_rec.compounding_tax_flag         :=
7477                                l_compounding_tax_flag_tbl(i);
7478         l_curr_hdr_grp_rec.historical_flag              :=
7479                                l_historical_flag_tbl(i);
7480         l_curr_hdr_grp_rec.self_assessed_flag           :=
7481                                l_self_assessed_flag_tbl(i);
7482         l_curr_hdr_grp_rec.overridden_flag              :=
7483                                l_overridden_flag_tbl(i);
7484         l_curr_hdr_grp_rec.manually_entered_flag        :=
7485                                l_manually_entered_flag_tbl(i);
7486         l_curr_hdr_grp_rec.Copied_From_Other_Doc_Flag     :=
7487                                l_Cop_From_Other_Doc_Flag_tbl(i);
7488         l_curr_hdr_grp_rec.associated_child_frozen_flag :=
7489                                l_assoc_child_frozen_flag_tbl(i);
7490         l_curr_hdr_grp_rec.tax_only_line_flag           :=
7491                                l_tax_only_line_flag_tbl(i);
7492         l_curr_hdr_grp_rec.mrc_tax_line_flag   :=
7493                                l_mrc_tax_line_flag_tbl(i);
7494         l_curr_hdr_grp_rec.reporting_only_flag :=
7495                                l_reporting_only_flag_tbl(i);
7496         l_curr_hdr_grp_rec.applied_from_application_id  :=
7497                                l_applied_from_applic_id_tbl(i);
7498         l_curr_hdr_grp_rec.applied_from_event_class_code :=
7499                                l_applied_from_evnt_cls_cd_tbl(i);
7500         l_curr_hdr_grp_rec.applied_from_entity_code     :=
7501                                l_applied_from_entity_code_tbl(i);
7502         l_curr_hdr_grp_rec.applied_from_trx_id          :=
7503                                l_applied_from_trx_id_tbl(i);
7504         l_curr_hdr_grp_rec.applied_from_line_id          :=
7505                                l_applied_from_line_id_tbl(i);
7506         l_curr_hdr_grp_rec.adjusted_doc_application_id  :=
7507                                l_adjusted_doc_applic_id_tbl(i);
7508         l_curr_hdr_grp_rec.adjusted_doc_entity_code     :=
7509                                l_adjusted_doc_entity_code_tbl(i);
7510         l_curr_hdr_grp_rec.adjusted_doc_event_class_code :=
7511                                l_adjusted_doc_evnt_cls_cd_tbl(i);
7512         l_curr_hdr_grp_rec.adjusted_doc_trx_id          :=
7513                                l_adjusted_doc_trx_id_tbl(i);
7514         --l_curr_hdr_grp_rec.applied_to_application_id    :=
7515         --                       l_applied_to_applic_id_tbl(i);
7516         --l_curr_hdr_grp_rec.applied_to_event_class_code  :=
7517         --                       l_applied_to_evnt_cls_cd_tbl(i);
7518         --l_curr_hdr_grp_rec.applied_to_entity_code       :=
7519         --                       l_applied_to_entity_code_tbl(i);
7520         --l_curr_hdr_grp_rec.applied_to_trx_id            :=
7521         --                       l_applied_to_trx_id_tbl(i);
7522         --l_curr_hdr_grp_rec.applied_to_line_id            :=
7523         --                       l_applied_to_line_id_tbl(i);
7524         l_curr_hdr_grp_rec.tax_exemption_id             :=
7525                                l_tax_exemption_id_tbl(i);
7526         l_curr_hdr_grp_rec.tax_rate_before_exemption    :=
7527                                l_tax_rate_before_exempt_tbl(i);
7528         l_curr_hdr_grp_rec.tax_rate_name_before_exemption             :=
7529                                l_rate_name_before_exempt_tbl(i);
7530         l_curr_hdr_grp_rec.exempt_rate_modifier         :=
7531                                l_exempt_rate_modifier_tbl(i);
7532         l_curr_hdr_grp_rec.exempt_certificate_number    :=
7533                                l_exempt_certificate_num_tbl(i);
7534         l_curr_hdr_grp_rec.exempt_reason                :=
7535                                l_exempt_reason_tbl(i);
7536         l_curr_hdr_grp_rec.exempt_reason_code           :=
7537                                l_exempt_reason_code_tbl(i);
7538         l_curr_hdr_grp_rec.tax_exception_id             :=
7539                                l_tax_exception_id_tbl(i);
7540         l_curr_hdr_grp_rec.tax_rate_before_exception               :=
7541                                l_tax_rate_before_except_tbl(i);
7542         l_curr_hdr_grp_rec.tax_rate_name_before_exception          :=
7543                                l_rate_name_before_except_tbl(i);
7544         l_curr_hdr_grp_rec.exception_rate      :=
7545                                l_exception_rate_tbl(i);
7546         l_curr_hdr_grp_rec.ledger_id         := l_ledger_id_tbl(i);
7547         l_curr_hdr_grp_rec.legal_entity_id   := l_legal_entity_id_tbl(i);
7548         l_curr_hdr_grp_rec.establishment_id  := l_establishment_id_tbl(i);
7549         l_curr_hdr_grp_rec.currency_conversion_date   :=
7550                                l_currency_conversion_date_tbl(i);
7551         l_curr_hdr_grp_rec.currency_conversion_type   :=
7552                                l_currency_conversion_type_tbl(i);
7553         l_curr_hdr_grp_rec.currency_conversion_rate   :=
7554                                l_currency_conversion_rate_tbl(i);
7555         l_curr_hdr_grp_rec.record_type_code    :=
7556                                l_record_type_code_tbl(i);
7557 
7558         -- handle header rounding
7559         --
7560         handle_header_rounding_curr(
7561                                 l_tax_line_id_tbl(i),
7562                                 l_unrounded_tax_amt_tbl(i),
7563                                 l_tax_amt_funcl_curr_tbl(i),
7564                                 l_taxable_amt_funcl_curr_tbl(i),
7565                                 l_currency_conversion_rate_tbl(i),
7566                                 l_prev_hdr_grp_rec,
7567                                 l_curr_hdr_grp_rec,
7568                                 l_ledger_id_tbl(i),
7569                                 p_return_status,
7570                                 p_error_buffer);
7571 
7572         IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
7573           EXIT;
7574         END IF;
7575       END LOOP;
7576 
7577       IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
7578         EXIT;
7579       END IF;
7580 
7581       --
7582       -- bulk update the current rows processed
7583       -- before fetch the next set of rows
7584       --
7585 
7586       -- update zx_lines
7587       --
7588       update_zx_lines(
7589                  p_conversion_rate,
7590                  p_conversion_type,
7591                  p_conversion_date,
7592                  l_tax_amt_funcl_curr_tbl,
7593                  l_taxable_amt_funcl_curr_tbl,
7594                  l_cal_tax_amt_funcl_curr_tbl,
7595                  l_tax_line_id_tbl,
7596                  p_return_status,
7597                  p_error_buffer);
7598 
7599       IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
7600         EXIT;
7601       END IF;
7602 
7603     ELSE
7604       --
7605       -- no more records to process
7606       --
7607       CLOSE get_round_head_level_curr_csr;
7608       EXIT;
7609     END IF;   -- end of count > 0
7610   END LOOP;
7611 
7612   IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
7613     CLOSE get_round_head_level_curr_csr;
7614     RETURN;
7615   END IF;
7616 
7617   --
7618   -- now adjust the rounding differences if it is HEADER rounding level
7619   -- for tax amount in trx currency, tax currrency and functional
7620   -- currency
7621   --
7622   adjust_rounding_diff_curr
7623         (p_return_status,
7624          p_error_buffer);
7625   IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
7626     RETURN;
7627   END IF;
7628 
7629   IF (g_level_procedure >= g_current_runtime_level ) THEN
7630 
7631     FND_LOG.STRING(g_level_procedure,
7632                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.convert_and_round_hdr_lvl_curr.END',
7633                    'ZX_TDS_TAX_ROUNDING_PKG: convert_and_round_hdr_lvl_curr(-)'||p_return_status);
7634   END IF;
7635 
7636 EXCEPTION
7637   WHEN OTHERS THEN
7638     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7639     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
7640     IF get_round_head_level_curr_csr%ISOPEN THEN
7641       CLOSE get_round_head_level_curr_csr;
7642     END IF;
7643     IF (g_level_unexpected >= g_current_runtime_level ) THEN
7644       FND_LOG.STRING(g_level_unexpected,
7645                      'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.convert_and_round_hdr_lvl_curr',
7646                       p_error_buffer);
7647     END IF;
7648 
7649 END convert_and_round_hdr_lvl_curr;
7650 ---------------------------------------------------------------------------
7651 --
7652 --  PUBLIC PROCEDURE
7653 --  convert_and_round_curr
7654 --
7655 --  DESCRIPTION
7656 --
7657 --  This procedure is used to update the tax amount and taxable amount
7658 --  in functional currency or other currency when the conversion rate
7659 --  is provided
7660 --  This procedure is incomplete due to some MRC issues are not
7661 --  finalized at this time
7662 --
7663 PROCEDURE convert_and_round_curr(
7664                 p_conversion_rate      IN OUT NOCOPY NUMBER,
7665                 p_conversion_type      IN            VARCHAR2,
7666                 p_conversion_date      IN            DATE,
7667                 p_event_class_rec      IN            ZX_API_PUB.EVENT_CLASS_REC_TYPE,
7668                 p_return_status           OUT NOCOPY VARCHAR2,
7669                 p_error_buffer            OUT NOCOPY VARCHAR2
7670 )
7671 IS
7672 
7673 BEGIN
7674   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
7675 
7676   IF (g_level_statement >= g_current_runtime_level ) THEN
7677     FND_LOG.STRING(g_level_statement,
7678                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.convert_and_round_curr.BEGIN',
7679                    'ZX_TDS_TAX_ROUNDING_PKG: convert_and_round_curr(+)');
7680   END IF;
7681 
7682   --
7683   -- init error buffer and return status
7684   --
7685   p_return_status  := FND_API.G_RET_STS_SUCCESS;
7686   p_error_buffer   := NULL;
7687 
7688 
7689   -- ???????? where to get rounding level if not from zx_lines ????????
7690   -- ???????? for now, assume get it from event class rec ????????
7691   --
7692   IF p_event_class_rec.Default_Rounding_Level_Code = 'HEADER' THEN
7693     convert_and_round_hdr_lvl_curr(
7694               p_conversion_rate,
7695               p_conversion_type,
7696               p_conversion_date,
7697               p_event_class_rec,
7698               p_return_status,
7699               p_error_buffer );
7700 
7701   ELSE
7702     convert_and_round_lin_lvl_curr(
7703               p_conversion_rate,
7704               p_conversion_type,
7705               p_conversion_date,
7706               p_event_class_rec,
7707               p_return_status,
7708               p_error_buffer );
7709   END IF;
7710 
7711   IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
7712     RETURN;
7713   END IF;
7714 
7715   -- *****************
7716   -- need to do the same for offset tax lines
7717   -- select only the offset tax lines from zx_lines and
7718   -- do similar thing as set_amt_columns in offset tax determination pkg
7719   -- will have separate procedure to do this when handling of
7720   -- MRC is clear
7721   -- ******************
7722 
7723 
7724   IF (g_level_procedure >= g_current_runtime_level ) THEN
7725 
7726     FND_LOG.STRING(g_level_procedure,
7727                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.convert_and_round_curr.END',
7728                    'ZX_TDS_TAX_ROUNDING_PKG: convert_and_round_curr(-)'||p_return_status);
7729   END IF;
7730 
7731 EXCEPTION
7732   WHEN OTHERS THEN
7733     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7734     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
7735 
7736     IF (g_level_unexpected >= g_current_runtime_level ) THEN
7737       FND_LOG.STRING(g_level_unexpected,
7738                      'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.convert_and_round_curr',
7739                       p_error_buffer);
7740     END IF;
7741 
7742 END convert_and_round_curr;
7743 
7744 ---------------------------------------------------------------------------
7745 --  PUBLIC PROCEDURE
7746 --  round_tax_amt_entered
7747 --
7748 --  DESCRIPTION
7749 --  This procedure is used by UI to round tax amount entered
7750 --  by user on tax line or summary line.
7751 --
7752 
7753 PROCEDURE round_tax_amt_entered(
7754            p_tax_amt              IN OUT NOCOPY ZX_LINES.TAX_AMT%TYPE,
7755            p_tax_id               IN            ZX_TAXES_B.TAX_ID%TYPE,
7756            p_application_id       IN            ZX_LINES.APPLICATION_ID%TYPE,
7757            p_entity_code          IN            ZX_LINES.ENTITY_CODE%TYPE,
7758            p_event_class_code     IN            ZX_LINES.EVENT_CLASS_CODE%TYPE,
7759            p_trx_id               IN            ZX_LINES.TRX_ID%TYPE,
7760            p_return_status           OUT NOCOPY VARCHAR2,
7761            p_error_buffer            OUT NOCOPY VARCHAR2
7762          )
7763 IS
7764 
7765   l_rounding_rule_code        ZX_TAXES_B.ROUNDING_RULE_CODE%TYPE;
7766   l_tax_rounding_rule_code    ZX_TAXES_B.ROUNDING_RULE_CODE%TYPE;
7767   l_trx_currency_code         ZX_LINES_DET_FACTORS.TRX_CURRENCY_CODE%TYPE;
7768   l_tax_min_acct_unit         ZX_TAXES_B.MINIMUM_ACCOUNTABLE_UNIT%TYPE;
7769   l_trx_min_acct_unit         ZX_LINES_DET_FACTORS.MINIMUM_ACCOUNTABLE_UNIT%TYPE;
7770   l_tax_precision             ZX_TAXES_B.TAX_PRECISION%TYPE;
7771   l_trx_precision             ZX_LINES_DET_FACTORS.PRECISION%TYPE;
7772   l_event_class_rec           ZX_API_PUB.EVENT_CLASS_REC_TYPE;
7773   l_unrounded_tax_amt         ZX_LINES.UNROUNDED_TAX_AMT%TYPE;
7774   l_rounding_level_code       ZX_PARTY_TAX_PROFILE.Rounding_Level_Code%TYPE;
7775   l_rnd_lvl_party_tax_prof_id ZX_LINES.ROUNDING_LVL_PARTY_TAX_PROF_ID%TYPE;
7776   l_rounding_lvl_party_type   ZX_LINES.ROUNDING_LVL_PARTY_TYPE%TYPE;
7777 
7778 
7779 
7780   CURSOR get_rnd_level_hier_csr
7781     (c_application_id       ZX_LINES.APPLICATION_ID%TYPE,
7782      c_entity_code          ZX_LINES.ENTITY_CODE%TYPE,
7783      c_event_class_code     ZX_LINES.EVENT_CLASS_CODE%TYPE)
7784   IS
7785      SELECT  default_rounding_level_code,
7786              rounding_level_hier_1_code,
7787              rounding_level_hier_2_code,
7788              rounding_level_hier_3_code,
7789              rounding_level_hier_4_code
7790        FROM  ZX_EVNT_CLS_MAPPINGS
7791        WHERE APPLICATION_ID   = c_application_id    AND
7792              ENTITY_CODE      = c_entity_code       AND
7793              EVENT_CLASS_CODE = c_event_class_code;
7794 
7795   -- bug#6798349
7796   -- add trx_currency_code, precision, minimum_accountable_unit
7797   -- to get trx currency info from zx_lines_det_factors
7798 
7799   CURSOR get_rnd_tx_prof_id_csr
7800     (c_application_id       ZX_LINES.APPLICATION_ID%TYPE,
7801      c_entity_code          ZX_LINES.ENTITY_CODE%TYPE,
7802      c_event_class_code     ZX_LINES.EVENT_CLASS_CODE%TYPE,
7803      c_trx_id               ZX_LINES.TRX_ID%TYPE)
7804   IS
7805      SELECT  rdng_ship_to_pty_tx_prof_id,
7806              rdng_ship_from_pty_tx_prof_id,
7807              rdng_bill_to_pty_tx_prof_id,
7808              rdng_bill_from_pty_tx_prof_id,
7809              rdng_ship_to_pty_tx_p_st_id,
7810              rdng_ship_from_pty_tx_p_st_id,
7811              rdng_bill_to_pty_tx_p_st_id,
7812              rdng_bill_from_pty_tx_p_st_id,
7813              trx_currency_code,
7814              precision,
7815              minimum_accountable_unit
7816        FROM  ZX_LINES_DET_FACTORS
7817        WHERE APPLICATION_ID   = c_application_id    AND
7818              ENTITY_CODE      = c_entity_code       AND
7819              EVENT_CLASS_CODE = c_event_class_code  AND
7820              TRX_ID           = c_trx_id;
7821 
7822   CURSOR get_rnd_info_from_tax_csr
7823     (c_tax_id       ZX_LINES.TAX_ID%TYPE)
7824   IS
7825     SELECT rounding_rule_code,
7826            minimum_accountable_unit,
7827            tax_precision
7828     FROM ZX_TAXES_B
7829     WHERE TAX_ID = c_tax_id;
7830 
7831   -- bug#6798349
7832   CURSOR get_precision_mau_csr
7833     (c_trx_currency_code       ZX_LINES_DET_FACTORS.TRX_CURRENCY_CODE%TYPE)
7834   IS
7835     SELECT minimum_accountable_unit,
7836            precision
7837     FROM FND_CURRENCIES
7838     WHERE currency_code = c_trx_currency_code;
7839 
7840 
7841 BEGIN
7842 
7843   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
7844 
7845   IF (g_level_procedure >= g_current_runtime_level ) THEN
7846     FND_LOG.STRING(g_level_procedure,
7847                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.round_tax_amt_entered.BEGIN',
7848                    'ZX_TDS_TAX_ROUNDING_PKG: round_tax_amt_entered(+)');
7849   END IF;
7850 
7851   --
7852   -- init error buffer and return status
7853   --
7854   p_return_status  := FND_API.G_RET_STS_SUCCESS;
7855   p_error_buffer   := NULL;
7856 
7857   --
7858   --  get unrounded tax amt
7859   --
7860   l_unrounded_tax_amt := p_tax_amt;
7861 
7862   --
7863   -- populate event class record with rounding level
7864   -- hierachy info
7865   --
7866   OPEN get_rnd_level_hier_csr(
7867            p_application_id,
7868            p_entity_code,
7869            p_event_class_code);
7870   FETCH get_rnd_level_hier_csr INTO
7871            l_event_class_rec.default_rounding_level_code,
7872            l_event_class_rec.rounding_level_hier_1_code,
7873            l_event_class_rec.rounding_level_hier_2_code,
7874            l_event_class_rec.rounding_level_hier_3_code,
7875            l_event_class_rec.rounding_level_hier_4_code;
7876   CLOSE get_rnd_level_hier_csr;
7877 
7878   --
7879   -- populate event class record with rounding party/site
7880   -- tax profile id info
7881   --
7882   OPEN get_rnd_tx_prof_id_csr(
7883            p_application_id,
7884            p_entity_code,
7885            p_event_class_code,
7886            p_trx_id);
7887   FETCH get_rnd_tx_prof_id_csr INTO
7888            l_event_class_rec.rdng_ship_to_pty_tx_prof_id,
7889            l_event_class_rec.rdng_ship_from_pty_tx_prof_id,
7890            l_event_class_rec.rdng_bill_to_pty_tx_prof_id,
7891            l_event_class_rec.rdng_bill_from_pty_tx_prof_id,
7892            l_event_class_rec.rdng_ship_to_pty_tx_p_st_id,
7893            l_event_class_rec.rdng_ship_from_pty_tx_p_st_id,
7894            l_event_class_rec.rdng_bill_to_pty_tx_p_st_id,
7895            l_event_class_rec.rdng_bill_from_pty_tx_p_st_id,
7896            l_trx_currency_code,
7897            l_trx_precision,
7898            l_trx_min_acct_unit;
7899   CLOSE get_rnd_tx_prof_id_csr;
7900 
7901 
7902   --
7903   -- now calling get_rounding_level_and_rule procedure to
7904   -- get rounding level and rounding rule
7905   --
7906   get_rounding_level_and_rule(
7907            l_event_class_rec,
7908            l_rounding_level_code,
7909            l_rounding_rule_code,
7910            l_rnd_lvl_party_tax_prof_id,
7911            l_rounding_lvl_party_type,
7912            p_return_status,
7913            p_error_buffer);
7914 
7915   IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
7916     RETURN;
7917   END IF;
7918 
7919   -- get rounding info from zx_taxes_b
7920   OPEN get_rnd_info_from_tax_csr(p_tax_id);
7921       FETCH get_rnd_info_from_tax_csr  INTO
7922                l_tax_rounding_rule_code,
7923                l_tax_min_acct_unit,
7924                l_tax_precision;
7925       CLOSE get_rnd_info_from_tax_csr;
7926 
7927   --
7928   -- bug#6798349
7929   -- use transaction currency precsion, min account unit
7930   -- to round tax amount
7931   --
7932   IF (l_trx_precision IS NULL AND l_trx_min_acct_unit IS NULL) THEN
7933     -- get precision and MAU based on trx currency code
7934     IF l_trx_currency_code IS NOT NULL THEN
7935       OPEN get_precision_mau_csr(l_trx_currency_code);
7936         FETCH get_precision_mau_csr INTO
7937           l_trx_min_acct_unit,
7938           l_trx_precision;
7939       CLOSE get_precision_mau_csr;
7940     ELSE
7941       -- use the precision and mau from tax
7942       l_trx_min_acct_unit := l_tax_min_acct_unit;
7943       l_trx_precision     := l_tax_precision;
7944     END IF;
7945   END IF;
7946 
7947   --
7948   -- use rounding rule from zx_taxes only if
7949   -- rounding rule is not available from the party hierarchy
7950   --
7951   IF l_rounding_rule_code IS NULL THEN
7952     l_rounding_rule_code := l_tax_rounding_rule_code;
7953   END IF;
7954 
7955   --
7956   -- round the tax amount
7957   --
7958   p_tax_amt := ZX_TDS_TAX_ROUNDING_PKG.round_tax(
7959                             l_unrounded_tax_amt,
7960                             l_rounding_rule_code,
7961                             l_trx_min_acct_unit,
7962                             l_trx_precision,
7963                             p_return_status,
7964                             p_error_buffer);
7965 
7966   IF (g_level_procedure >= g_current_runtime_level ) THEN
7967 
7968     FND_LOG.STRING(g_level_procedure,
7969                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.round_tax_amt_entered.END',
7970                    'ZX_TDS_TAX_ROUNDING_PKG: round_tax_amt_entered(-)'||p_return_status);
7971   END IF;
7972 
7973 EXCEPTION
7974   WHEN OTHERS THEN
7975     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7976     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
7977 
7978     FND_MESSAGE.SET_NAME('ZX','ZX_UNEXPECTED_ERROR');
7979     FND_MSG_PUB.Add;
7980 
7981     IF (g_level_unexpected >= g_current_runtime_level ) THEN
7982       FND_LOG.STRING(g_level_unexpected,
7983                      'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.round_tax_amt_entered',
7984                       p_error_buffer);
7985     END IF;
7986 
7987 END round_tax_amt_entered;
7988 -----------------------------------------------------------------------
7989 --  PRIVATE PROCEDURE
7990 --  Get_Supplier_Site
7991 --
7992 --  DESCRIPTION
7993 --
7994 --  This procedure determines the rounding level for a whole document
7995 --
7996 
7997 
7998 PROCEDURE Get_Supplier_Site(
7999               p_account_id           IN   ZX_REGISTRATIONS.ACCOUNT_ID%TYPE,
8000               p_account_site_id      IN   ZX_REGISTRATIONS.ACCOUNT_SITE_ID%TYPE,
8001               p_rounding_level_code  OUT NOCOPY  ZX_PARTY_TAX_PROFILE.ROUNDING_LEVEL_CODE%TYPE,
8002               p_rounding_rule_code   OUT NOCOPY  ZX_PARTY_TAX_PROFILE.ROUNDING_RULE_CODE%TYPE,
8003 
8004               p_return_status        OUT  NOCOPY VARCHAR2)
8005 IS
8006 
8007   CURSOR c_supplier_ptp (
8008      c_account_id          ZX_REGISTRATIONS.ACCOUNT_ID%TYPE,
8009      c_account_site_id     ZX_REGISTRATIONS.ACCOUNT_SITE_ID%TYPE)
8010   IS
8011   SELECT
8012           decode(povs.AP_Tax_Rounding_Rule,'U','UP','D','DOWN','N','NEAREST',NULL) tax_runding_rule
8013          ,decode(nvl(povs.Auto_Tax_Calc_Flag,'Y'),'N','N','Y') Auto_Tax_Calc_Flag
8014          ,povs.VAT_Code
8015 	 ,povs.VAT_Registration_Num
8016          ,DECODE(povs.Auto_Tax_Calc_Flag,
8017                'L','LINE',
8018                'H','HEADER',
8019                'T','HEADER',
8020                NULL) tax_rounding_level
8021          ,povs.amount_includes_tax_flag
8022     FROM ap_supplier_sites_all  povs
8023     WHERE povs.vendor_id      = c_account_id
8024       AND povs.vendor_site_id = c_account_site_id;
8025 
8026   l_ap_tax_rounding_rule  VARCHAR2(10);
8027   l_auto_tax_calc_flag    ap_supplier_sites_all.auto_tax_calc_flag%TYPE;
8028   l_vat_code              ap_supplier_sites_all.vat_code%TYPE;
8029   l_vat_registration_num  ap_supplier_sites_all.vat_registration_num%TYPE;
8030   l_tax_rounding_level    VARCHAR2(10);
8031   l_amount_includes_tax_flag ap_supplier_sites_all.amount_includes_tax_flag%TYPE;
8032 
8033 BEGIN
8034  IF (g_level_procedure >= g_current_runtime_level ) THEN
8035     FND_LOG.STRING(g_level_procedure,
8036                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.Get_Supplier_Site.BEGIN',
8037                    'ZX_TDS_TAX_ROUNDING_PKG: Get_Supplier_Site(+)');
8038     FND_LOG.STRING(g_level_procedure,
8039                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.Get_Supplier_Site',
8040                    'p_account_site_id : ' || TO_CHAR(p_account_site_id));
8041     FND_LOG.STRING(g_level_procedure,
8042                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.Get_Supplier_Site',
8043                    'p_account_id : ' || TO_CHAR(p_account_id));
8044   END IF;
8045 
8046   p_return_status       := FND_API.G_RET_STS_SUCCESS;
8047   p_rounding_level_code := NULL;
8048   p_rounding_rule_code  := NULL;
8049 
8050 
8051  IF ZX_GLOBAL_STRUCTURES_PKG.g_supp_site_info_tbl.exists(p_account_site_id) THEN
8052 
8053    IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
8054        FND_LOG.STRING(G_LEVEL_STATEMENT,'ZX_TDS_TAX_ROUNDING_PKG.Get_Supplier_Site',
8055         'Vendor site record found in cache for vendor site id:'||to_char(p_account_site_id));
8056    END IF;
8057 
8058    p_rounding_rule_code :=  ZX_GLOBAL_STRUCTURES_PKG.g_supp_site_info_tbl(p_account_site_id).TAX_ROUNDING_RULE;
8059    P_rounding_level_code := ZX_GLOBAL_STRUCTURES_PKG.g_supp_site_info_tbl(p_account_site_id).TAX_ROUNDING_LEVEL;
8060    ZX_TDS_CALC_SERVICES_PUB_PKG.g_process_for_appl_flg := ZX_GLOBAL_STRUCTURES_PKG.g_supp_site_info_tbl(p_account_site_id).Auto_Tax_Calc_Flag;
8061    ZX_TDS_CALC_SERVICES_PUB_PKG.g_tax_inclusive_flg := ZX_GLOBAL_STRUCTURES_PKG.g_supp_site_info_tbl(p_account_site_id).amount_includes_tax_flag;
8062 
8063    IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
8064        FND_LOG.STRING(G_LEVEL_STATEMENT,'ZX_TDS_TAX_ROUNDING_PKG.Get_Supplier_Site',
8065         'ZX_TDS_CALC_SERVICES_PUB_PKG.g_process_for_appl_flg '|| ZX_TDS_CALC_SERVICES_PUB_PKG.g_process_for_appl_flg );
8066    END IF;
8067 
8068  ELSE
8069 
8070   OPEN c_supplier_ptp(
8071             p_account_id,
8072             p_account_site_id);
8073   FETCH c_supplier_ptp INTO
8074                     l_ap_tax_rounding_rule
8075                     ,l_auto_tax_calc_flag
8076                     ,l_vat_code
8077                     ,l_vat_registration_num
8078                     ,l_tax_rounding_level
8079                     ,l_amount_includes_tax_flag;
8080 
8081             p_rounding_level_code := l_tax_rounding_level;
8082             p_rounding_rule_code := l_ap_tax_rounding_rule;
8083   IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
8084        FND_LOG.STRING(G_LEVEL_STATEMENT,'ZX_TDS_TAX_ROUNDING_PKG.Get_Supplier_Site',
8085         'Auto tax calc flag '|| l_auto_tax_calc_flag ||
8086         'Inclusive tax flag ' || l_amount_includes_tax_flag);
8087   END IF;
8088 
8089 
8090         ZX_GLOBAL_STRUCTURES_PKG.g_supp_site_info_tbl(p_account_site_id).TAX_ROUNDING_RULE :=
8091               l_ap_tax_rounding_rule;
8092         ZX_GLOBAL_STRUCTURES_PKG.g_supp_site_info_tbl(p_account_site_id).Auto_Tax_Calc_Flag :=
8093               l_auto_tax_calc_flag;
8094         ZX_GLOBAL_STRUCTURES_PKG.g_supp_site_info_tbl(p_account_site_id).VAT_CODE := l_vat_code;
8095         ZX_GLOBAL_STRUCTURES_PKG.g_supp_site_info_tbl(p_account_site_id).TAX_ROUNDING_LEVEL :=
8096               l_tax_rounding_level;
8097         ZX_GLOBAL_STRUCTURES_PKG.g_supp_site_info_tbl(p_account_site_id).VAT_REGISTRATION_NUM :=
8098               l_vat_registration_num;
8099         ZX_GLOBAL_STRUCTURES_PKG.g_supp_site_info_tbl(p_account_site_id).AMOUNT_INCLUDES_TAX_FLAG :=
8100               l_amount_includes_tax_flag;
8101         ZX_TDS_CALC_SERVICES_PUB_PKG.g_process_for_appl_flg := l_auto_tax_calc_flag;
8102         ZX_TDS_CALC_SERVICES_PUB_PKG.g_tax_inclusive_flg := l_amount_includes_tax_flag;
8103 
8104    IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
8105        FND_LOG.STRING(G_LEVEL_STATEMENT,'ZX_TDS_TAX_ROUNDING_PKG.Get_Supplier_Site',
8106         'ZX_TDS_CALC_SERVICES_PUB_PKG.g_process_for_appl_flg '|| ZX_TDS_CALC_SERVICES_PUB_PKG.g_process_for_appl_flg);
8107    END IF;
8108 
8109 
8110   CLOSE c_supplier_ptp;
8111 
8112  END IF;
8113 
8114   IF (g_level_procedure >= g_current_runtime_level ) THEN
8115     FND_LOG.STRING(g_level_procedure,
8116                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.Get_Supplier_Site.END',
8117                    'ZX_TDS_TAX_ROUNDING_PKG: Get_Supplier_Site(-)'||'rounding level code :'||p_rounding_level_code);
8118   END IF;
8119 
8120 EXCEPTION
8121   WHEN OTHERS THEN
8122     IF c_supplier_ptp%isopen THEN
8123        CLOSE c_supplier_ptp;
8124     END IF;
8125 
8126     IF (g_level_unexpected >= g_current_runtime_level ) THEN
8127         FND_LOG.STRING(g_level_unexpected,
8128                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.Get_Supplier_Site.END',
8129                    'Exception in ZX_TDS_TAX_ROUNDING_PKG.Get_Supplier_Site. '||SQLCODE||SQLERRM);
8130     END IF;
8131 
8132 END Get_Supplier_Site;
8133 
8134 -----------------------------------------------------------------------
8135 --  PRIVATE PROCEDURE
8136 --  Get_Reg_Site_Uses
8137 --
8138 --  DESCRIPTION
8139 --
8140 
8141 PROCEDURE  Get_Reg_Site_Uses (
8142               p_account_id            IN   ZX_REGISTRATIONS.ACCOUNT_ID%TYPE,
8143               p_account_site_id       IN   ZX_REGISTRATIONS.ACCOUNT_SITE_ID%TYPE,
8144               p_site_use_id           IN   HZ_CUST_SITE_USES_ALL.CUST_ACCT_SITE_ID%TYPE,
8145               p_rounding_level_code   OUT NOCOPY  ZX_PARTY_TAX_PROFILE.ROUNDING_LEVEL_CODE%TYPE,
8146               p_rounding_rule_code    OUT NOCOPY  ZX_PARTY_TAX_PROFILE.ROUNDING_RULE_CODE%TYPE,
8147               p_return_status         OUT NOCOPY  VARCHAR2)
8148 IS
8149   CURSOR c_site_uses (
8150     c_site_use_id          HZ_CUST_SITE_USES_ALL.CUST_ACCT_SITE_ID%TYPE,
8151     c_account_site_id      ZX_REGISTRATIONS.ACCOUNT_SITE_ID%TYPE,
8152     c_account_id           ZX_REGISTRATIONS.ACCOUNT_ID%TYPE)
8153   IS
8154   SELECT
8155        csu.Tax_Reference,
8156        nvl(csu.Tax_Code,caa.tax_code) tax_code,
8157        nvl(csu.Tax_Rounding_rule,caa.tax_rounding_rule) tax_rounding_rule,
8158        nvl(csu.tax_header_level_flag, caa.tax_header_level_flag) tax_header_level_flag,
8159        csu.Tax_Classification
8160     FROM hz_cust_site_uses_all csu
8161         ,hz_cust_acct_sites cas
8162         ,hz_cust_accounts caa
8163    WHERE csu.site_use_id       = c_site_use_id
8164      AND csu.cust_acct_site_id = c_account_site_id
8165      AND csu.cust_acct_site_id = cas.cust_acct_site_id
8166      AND cas.cust_account_id   = caa.cust_account_id
8167      AND caa.cust_account_id   = c_account_id;
8168 
8169   l_tax_rounding_rule      hz_cust_site_uses_all.Tax_Rounding_rule%TYPE;
8170   l_tax_header_level_flag  hz_cust_site_uses_all.tax_header_level_flag%TYPE;
8171   l_tax_code               hz_cust_site_uses_all.Tax_Code%TYPE;
8172   l_Tax_Classification     hz_cust_site_uses_all.Tax_Classification%TYPE;
8173   l_tax_reference          hz_cust_site_uses_all.Tax_Reference%TYPE;
8174 
8175 
8176 BEGIN
8177   IF (g_level_statement >= g_current_runtime_level ) THEN
8178     FND_LOG.STRING(g_level_statement,
8179                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.Get_Reg_Site_Uses.BEGIN',
8180                    'ZX_TDS_TAX_ROUNDING_PKG: Get_Reg_Site_Uses(+)');
8181     FND_LOG.STRING(g_level_statement,
8182                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.Get_Reg_Site_Uses',
8183                    'p_account_site_id : ' || TO_CHAR(p_account_site_id));
8184     FND_LOG.STRING(g_level_statement,
8185                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.Get_Reg_Site_Uses',
8186                    'p_account_id : ' || TO_CHAR(p_account_id));
8187    FND_LOG.STRING(g_level_statement,
8188                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.Get_Reg_Site_Uses',
8189                    'p_site_use_id : ' || TO_CHAR(p_site_use_id));
8190   END IF;
8191 
8192   p_return_status       := FND_API.G_RET_STS_SUCCESS;
8193   p_rounding_level_code := NULL;
8194   p_rounding_rule_code  := NULL;
8195 
8196  IF  ZX_GLOBAL_STRUCTURES_PKG.g_cust_site_use_info_tbl.exists(p_site_use_id) then
8197           p_Rounding_Rule_Code:=
8198                            ZX_GLOBAL_STRUCTURES_PKG.g_cust_site_use_info_tbl(p_site_use_id).tax_rounding_rule;
8199 
8200           IF ZX_GLOBAL_STRUCTURES_PKG.g_cust_site_use_info_tbl(p_site_use_id).tax_header_level_flag = 'Y' THEN
8201               p_rounding_level_code := 'HEADER';
8202           ELSIF ZX_GLOBAL_STRUCTURES_PKG.g_cust_site_use_info_tbl(p_site_use_id).tax_header_level_flag = 'N' THEN
8203               p_rounding_level_code := 'LINE';
8204           END IF;
8205 
8206          IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
8207               FND_LOG.STRING(G_LEVEL_STATEMENT,'ZX_TDS_TAX_ROUNDING_PKG.Get_Reg_Site_Uses',
8208                              'Site Use information found in cache');
8209          END IF;
8210  ELSE
8211       OPEN c_site_uses (
8212            p_site_use_id,
8213            p_account_site_id,
8214            p_account_id);
8215 
8216       FETCH c_site_uses INTO
8217               l_tax_reference,
8218               l_tax_code,
8219               l_tax_rounding_rule,
8220               l_tax_header_level_flag,
8221               l_Tax_Classification;
8222 
8223       CLOSE c_site_uses;
8224 
8225       -- Populate the cache
8226       ZX_GLOBAL_STRUCTURES_PKG.g_cust_site_use_info_tbl(p_site_use_id).site_use_id := p_site_use_id;
8227       ZX_GLOBAL_STRUCTURES_PKG.g_cust_site_use_info_tbl(p_site_use_id).tax_rounding_rule:= l_tax_rounding_rule;
8228       ZX_GLOBAL_STRUCTURES_PKG.g_cust_site_use_info_tbl(p_site_use_id).tax_header_level_flag := l_tax_header_level_flag;
8229       ZX_GLOBAL_STRUCTURES_PKG.g_cust_site_use_info_tbl(p_site_use_id).tax_code := l_tax_code;
8230       ZX_GLOBAL_STRUCTURES_PKG.g_cust_site_use_info_tbl(p_site_use_id).Tax_Classification:= l_Tax_Classification;
8231       ZX_GLOBAL_STRUCTURES_PKG.g_cust_site_use_info_tbl(p_site_use_id).tax_reference := l_tax_reference;
8232 
8233       p_Rounding_Rule_Code:=  l_tax_rounding_rule;
8234 
8235       IF l_tax_header_level_flag = 'Y' THEN
8236            p_rounding_level_code := 'HEADER';
8237       ELSIF l_tax_header_level_flag = 'N' THEN
8238            p_rounding_level_code := 'LINE';
8239       END IF;
8240 
8241 
8242   END IF;
8243 
8244   IF (g_level_procedure >= g_current_runtime_level ) THEN
8245     FND_LOG.STRING(g_level_procedure,
8246                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.Get_Reg_Site_Uses.END',
8247                    'ZX_TDS_TAX_ROUNDING_PKG: Get_Reg_Site_Uses(-)'||'rounding level code :'||p_rounding_level_code
8248                                                                   ||'rounding rule code: '||p_Rounding_Rule_Code);
8249   END IF;
8250 EXCEPTION
8251   WHEN OTHERS THEN
8252     IF c_site_uses%isopen THEN
8253        CLOSE c_site_uses;
8254     END IF;
8255 
8256     IF (g_level_unexpected >= g_current_runtime_level ) THEN
8257         FND_LOG.STRING(g_level_unexpected,
8258                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.Get_Reg_Site_Uses.END',
8259                    'Exception in ZX_TDS_TAX_ROUNDING_PKG.Get_Reg_Site_Uses('||SQLCODE||SQLERRM);
8260     END IF;
8261 END Get_Reg_Site_Uses;
8262 
8263 -----------------------------------------------------------------------
8264 --  PRIVATE PROCEDURE
8265 --  Get_Registration_Accts
8266 --
8267 --  DESCRIPTION
8268 
8269 PROCEDURE  Get_Registration_Accts(
8270              p_account_id             IN   ZX_REGISTRATIONS.ACCOUNT_ID%TYPE,
8271              p_rounding_level_code    OUT NOCOPY  ZX_PARTY_TAX_PROFILE.ROUNDING_LEVEL_CODE%TYPE,
8272              p_rounding_rule_code     OUT NOCOPY  ZX_PARTY_TAX_PROFILE.ROUNDING_RULE_CODE%TYPE,
8273              p_return_status          OUT NOCOPY  VARCHAR2 )
8274 
8275 IS
8276 
8277   CURSOR c_customer_account (
8278     c_account_id    ZX_REGISTRATIONS.ACCOUNT_ID%TYPE)
8279   IS
8280   SELECT
8281     tax_code,
8282     tax_header_level_flag,
8283     tax_rounding_rule
8284   FROM  hz_cust_accounts
8285   WHERE cust_account_id = c_account_id;
8286 
8287   l_tax_code               hz_cust_site_uses_all.Tax_Code%TYPE;
8288   l_tax_header_level_flag  hz_cust_site_uses_all.tax_header_level_flag%TYPE;
8289   l_tax_rounding_rule      hz_cust_site_uses_all.Tax_Rounding_rule%TYPE;
8290 
8291 
8292 BEGIN
8293 
8294   IF (g_level_statement >= g_current_runtime_level ) THEN
8295     FND_LOG.STRING(g_level_statement,
8296                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.Get_Registration_Accts.BEGIN',
8297                    'ZX_TDS_TAX_ROUNDING_PKG: Get_Registration_Accts(+)');
8298     FND_LOG.STRING(g_level_statement,
8299                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.Get_Registration_Accts',
8300                    'p_account_id :  ' || TO_CHAR(p_account_id)) ;
8301 
8302   END IF;
8303 
8304   p_return_status       := FND_API.G_RET_STS_SUCCESS;
8305   p_rounding_level_code := NULL;
8306   p_rounding_rule_code  := NULL;
8307 
8308   IF ZX_GLOBAL_STRUCTURES_PKG.g_cust_acct_info_tbl.exists(p_account_id) THEN
8309                p_Rounding_Rule_Code:=
8310                      ZX_GLOBAL_STRUCTURES_PKG.g_cust_acct_info_tbl(p_account_id).tax_rounding_rule;
8311 
8312               IF ZX_GLOBAL_STRUCTURES_PKG.g_cust_acct_info_tbl(p_account_id).tax_header_level_flag = 'Y' THEN
8313                   p_rounding_level_code := 'HEADER';
8314               ELSIF ZX_GLOBAL_STRUCTURES_PKG.g_cust_acct_info_tbl(p_account_id).tax_header_level_flag = 'N' THEN
8315                   p_rounding_level_code := 'LINE';
8316               END IF;
8317 
8318               IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
8319                   FND_LOG.STRING(G_LEVEL_STATEMENT,'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.Get_Registration_Accts',
8320                                'Cust Account information found in cache');
8321               END IF;
8322   ELSE
8323               OPEN c_customer_account (p_account_id);
8324 
8325               FETCH c_customer_account INTO
8326                 l_tax_code,
8327                 l_tax_header_level_flag,
8328                 l_tax_rounding_rule;
8329 
8330               CLOSE c_customer_account;
8331 
8332               p_Rounding_Rule_Code:= l_tax_rounding_rule;
8333 
8334               IF l_tax_header_level_flag = 'Y' THEN
8335                   p_rounding_level_code := 'HEADER';
8336               ELSIF l_tax_header_level_flag = 'N' THEN
8337                   p_rounding_level_code := 'LINE';
8338               END IF;
8339 
8340 
8341               ZX_GLOBAL_STRUCTURES_PKG.g_cust_acct_info_tbl(p_account_id).CUST_ACCOUNT_ID := p_account_id;
8342               ZX_GLOBAL_STRUCTURES_PKG.g_cust_acct_info_tbl(p_account_id).TAX_CODE := l_tax_code;
8343               ZX_GLOBAL_STRUCTURES_PKG.g_cust_acct_info_tbl(p_account_id).TAX_ROUNDING_RULE := l_tax_rounding_rule;
8344               ZX_GLOBAL_STRUCTURES_PKG.g_cust_acct_info_tbl(p_account_id).TAX_HEADER_LEVEL_FLAG := l_tax_header_level_flag;
8345 
8346   END IF;
8347 
8348 
8349   IF (g_level_procedure >= g_current_runtime_level ) THEN
8350     FND_LOG.STRING(g_level_procedure,
8351                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.Get_Registration_Accts.END',
8352                    'ZX_TDS_TAX_ROUNDING_PKG: Get_Registration_Accts(-)'||'rounding level code :'||p_rounding_level_code
8353                                                                        ||'rounding rule code: '||p_Rounding_Rule_Code);
8354   END IF;
8355 
8356 EXCEPTION
8357   WHEN OTHERS THEN
8358     IF c_customer_account%ISOPEN THEN
8359        CLOSE c_customer_account;
8360     END IF;
8361 
8362     IF (g_level_unexpected >= g_current_runtime_level ) THEN
8363         FND_LOG.STRING(g_level_unexpected,
8364                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.Get_Registration_Accts',
8365                    'Exception in ZX_TDS_TAX_ROUNDING_PKG.Get_Registration_Accts: '||SQLCODE||SQLERRM);
8366     END IF;
8367 END Get_Registration_Accts;
8368 
8369 
8370 -----------------------------------------------------------------------
8371 --  PRIVATE PROCEDURE
8372 --  Get_Registration_Party
8373 --
8374 --  DESCRIPTION
8375 
8376 PROCEDURE  Get_Registration_Party(
8377              p_party_tax_profile_id   IN  ZX_PARTY_TAX_PROFILE.PARTY_TAX_PROFILE_ID%TYPE,
8378              p_rounding_level_code    OUT NOCOPY  ZX_PARTY_TAX_PROFILE.ROUNDING_LEVEL_CODE%TYPE,
8379              p_rounding_rule_code     OUT NOCOPY  ZX_PARTY_TAX_PROFILE.ROUNDING_RULE_CODE%TYPE,
8380              p_return_status          OUT NOCOPY  VARCHAR2 )
8381 IS
8382 
8383   l_tbl_index binary_integer;
8384 
8385 BEGIN
8386 
8387   IF (g_level_procedure >= g_current_runtime_level ) THEN
8388     FND_LOG.STRING(g_level_procedure,
8389                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.Get_Registration_Party.BEGIN',
8390                    'ZX_TDS_TAX_ROUNDING_PKG: Get_Registration_Party(+)');
8391     FND_LOG.STRING(g_level_procedure,
8392                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.Get_Registration_Party',
8393                    'p_party_tax_profile_id :  ' || TO_CHAR(p_party_tax_profile_id)) ;
8394   END IF;
8395 
8396   p_return_status       := FND_API.G_RET_STS_SUCCESS;
8397   p_rounding_level_code := NULL;
8398   p_rounding_rule_code  := NULL;
8399 
8400 
8401  ZX_TCM_PTP_PKG.GET_PARTY_TAX_PROF_INFO(
8402      P_PARTY_TAX_PROFILE_ID => p_party_tax_profile_id,
8403      X_TBL_INDEX            => l_tbl_index,
8404      X_RETURN_STATUS  	    => p_return_status);
8405 
8406   IF L_TBL_INDEX is not null then
8407     p_rounding_level_code :=
8408         ZX_GLOBAL_STRUCTURES_PKG.G_PARTY_TAX_PROF_INFO_TBL(p_party_tax_profile_id).rounding_level_code;
8409     p_rounding_rule_code :=
8410         ZX_GLOBAL_STRUCTURES_PKG.G_PARTY_TAX_PROF_INFO_TBL(p_party_tax_profile_id).rounding_rule_code;
8411   ELSE
8412 
8413     IF (g_level_procedure >= g_current_runtime_level ) THEN
8414          FND_LOG.STRING(g_level_procedure,
8415                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.Get_Registration_Party',
8416                    'ZX_TDS_TAX_ROUNDING_PKG: The party tax profile id is not valid: '||p_party_tax_profile_id);
8417     END IF;
8418 
8419   END IF;
8420 
8421 
8422   IF (g_level_procedure >= g_current_runtime_level ) THEN
8423     FND_LOG.STRING(g_level_procedure,
8424                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.Get_Registration_Party.END',
8425                    'ZX_TDS_TAX_ROUNDING_PKG: Get_Registration_Party(-)'||'rounding level code :'||p_rounding_level_code);
8426   END IF;
8427 
8428 EXCEPTION
8429 
8430    WHEN OTHERS THEN
8431       IF (g_level_unexpected >= g_current_runtime_level ) THEN
8432           FND_LOG.STRING(g_level_unexpected,
8433                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.Get_Registration_Party',
8434                    'ZX_TDS_TAX_ROUNDING_PKG: Get_Registration_Party'||'Exception in ZX_TDS_TAX_ROUNDING_PKG.Get_Registration_Party '||
8435                                              SQLCODE||SQLERRM);
8436       END IF;
8437 
8438 END Get_Registration_Party;
8439 -----------------------------------------------------------------------
8440 --  PRIVATE PROCEDURE
8441 --  get_rounding_level
8442 --
8443 --  DESCRIPTION
8444 --
8445 --  This procedure determines the rounding level for a whole document
8446 --
8447 
8448 PROCEDURE get_rounding_level(
8449 
8450             p_parent_ptp_id          IN  zx_party_tax_profile.party_tax_profile_id%TYPE,
8451             p_site_ptp_id            IN  zx_party_tax_profile.party_tax_profile_id%TYPE,
8452             p_account_Type_Code      IN  zx_registrations.account_type_code%TYPE,
8453             p_account_id             IN  ZX_REGISTRATIONS.ACCOUNT_ID%TYPE,
8454             p_account_site_id        IN  ZX_REGISTRATIONS.ACCOUNT_SITE_ID%TYPE,
8455             p_site_use_id            IN  HZ_CUST_SITE_USES_ALL.SITE_USE_ID%TYPE,
8456             p_rounding_level_code    OUT NOCOPY  ZX_PARTY_TAX_PROFILE.ROUNDING_LEVEL_CODE%TYPE,
8457             p_rounding_rule_code     OUT NOCOPY  ZX_PARTY_TAX_PROFILE.ROUNDING_RULE_CODE%TYPE,
8458            p_return_status           OUT NOCOPY  VARCHAR2,
8459            p_error_buffer            OUT NOCOPY  VARCHAR2
8460          )
8461 IS
8462 BEGIN
8463 
8464   IF (g_level_procedure >= g_current_runtime_level ) THEN
8465     FND_LOG.STRING(g_level_procedure,
8466                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.get_rounding_level.BEGIN',
8467                    'ZX_TDS_TAX_ROUNDING_PKG: get_rounding_level(+)');
8468     FND_LOG.STRING(g_level_procedure,
8469                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.get_rounding_level',
8470                    'p_parent_ptp_id :  ' || TO_CHAR(p_parent_ptp_id));
8471     FND_LOG.STRING(g_level_procedure,
8472                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.get_rounding_level',
8473                    'p_site_ptp_id : ' || TO_CHAR(p_site_ptp_id));
8474     FND_LOG.STRING(g_level_procedure,
8475                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.get_rounding_level',
8476                    'p_account_Type_Code : ' || p_account_Type_Code);
8477     FND_LOG.STRING(g_level_procedure,
8478                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.get_rounding_level',
8479                    'p_account_id : ' || TO_CHAR(p_account_id));
8480     FND_LOG.STRING(g_level_procedure,
8481                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.get_rounding_level',
8482                    'p_account_site_id : ' || TO_CHAR(p_account_site_id));
8483     FND_LOG.STRING(g_level_procedure,
8484                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.get_rounding_level',
8485                    'p_site_use_id : ' || TO_CHAR(p_site_use_id));
8486 
8487   END IF;
8488 
8489   p_return_status       := FND_API.G_RET_STS_SUCCESS;
8490   p_rounding_level_code := NULL;
8491   p_rounding_rule_code  := NULL;
8492 
8493 
8494   IF (p_account_id is not NULL) AND (p_account_site_id IS NOT NULL) THEN
8495 
8496     IF p_account_type_code = 'SUPPLIER' THEN
8497       -- Get supplier information from ap_suppliers-sites
8498       Get_Supplier_Site(
8499                    p_account_id
8500                    ,p_account_site_id
8501                    ,p_rounding_level_code
8502                    ,p_rounding_rule_code
8503                    ,p_return_status
8504                    );
8505       IF p_return_status <> FND_API.G_RET_STS_SUCCESS  THEN
8506         RETURN;
8507       End IF;
8508 
8509     ELSIF p_account_type_code = 'CUSTOMER' THEN
8510       -- Check if account site use parameter is not null
8511       IF p_site_use_id IS NOT NULL THEN
8512         Get_Reg_Site_Uses(
8513                           p_account_id
8514                           ,p_account_site_id
8515                           ,p_site_use_id
8516                           ,p_rounding_level_code
8517                           ,p_rounding_rule_code
8518                           ,p_return_status
8519                           );
8520         IF p_return_status <> FND_API.G_RET_STS_SUCCESS  THEN
8521           RETURN;
8522         END IF;
8523 
8524         -- Get registration account level
8525         IF p_rounding_level_code IS NULL THEN
8526           Get_Registration_Accts(
8527                                  p_account_id
8528                                  ,p_rounding_level_code
8529                                  ,p_rounding_rule_code
8530                                  ,p_return_status
8531                                  );
8532           IF p_return_status <> FND_API.G_RET_STS_SUCCESS  THEN
8533             RETURN;
8534           END IF;
8535 
8536         END If;
8537       END IF;        --p_site_use_id is not null
8538     END IF;          --  p_account_type
8539   END IF;            -- p_account_id is not null
8540 
8541   IF p_rounding_level_code IS NULL THEN
8542     IF p_site_ptp_id IS NOT NULL THEN
8543       -- Get registration infomation from the site
8544       Get_Registration_Party(p_site_ptp_id
8545                              ,p_rounding_level_code
8546                              ,p_rounding_rule_code
8547                              ,p_return_status
8548                              );
8549 
8550       IF p_return_status <> FND_API.G_RET_STS_SUCCESS  THEN
8551         RETURN;
8552       END IF;
8553 
8554       IF p_rounding_level_code IS NULL THEN
8555         -- get registration information from the parent
8556         Get_Registration_Party(p_parent_ptp_id
8557                                ,p_rounding_level_code
8558                                ,p_rounding_rule_code
8559                                ,p_return_status
8560                                );
8561       END IF;
8562    END IF;
8563   END IF;
8564 
8565   IF (g_level_procedure >= g_current_runtime_level ) THEN
8566     FND_LOG.STRING(g_level_procedure,
8567                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.get_rounding_level.END',
8568                    'ZX_TDS_TAX_ROUNDING_PKG: get_rounding_level(-)'||'rounding level code :'||p_rounding_level_code);
8569   END IF;
8570 
8571 EXCEPTION
8572   WHEN OTHERS THEN
8573     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
8574     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
8575 
8576     IF (g_level_unexpected >= g_current_runtime_level ) THEN
8577       FND_LOG.STRING(g_level_unexpected,
8578                      'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.get_rounding_level',
8579                       p_error_buffer);
8580     END IF;
8581 
8582 END get_rounding_level;
8583 
8584 
8585 -----------------------------------------------------------------------
8586 --  PRIVATE PROCEDURE
8587 --  get_funcl_curr_info
8588 --
8589 --  DESCRIPTION
8590 --  This procedure gets the functional currency code, minimum
8591 --  accountable unit and precision of a functional currency from
8592 --  fnd_currencies based on the ledger id
8593 
8594 PROCEDURE get_funcl_curr_info(
8595              p_ledger_id           IN             ZX_LINES.LEDGER_ID%TYPE,
8596              p_funcl_currency_code    OUT NOCOPY FND_CURRENCIES.CURRENCY_CODE%TYPE,
8597              p_funcl_min_acct_unit    OUT NOCOPY FND_CURRENCIES.MINIMUM_ACCOUNTABLE_UNIT%TYPE,
8598              p_funcl_precision        OUT NOCOPY FND_CURRENCIES.PRECISION%TYPE,
8599 
8600              p_return_status          OUT NOCOPY VARCHAR2,
8601              p_error_buffer           OUT NOCOPY VARCHAR2
8602          )
8603 IS
8604 
8605 BEGIN
8606 
8607   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
8608 
8609   IF (g_level_procedure >= g_current_runtime_level ) THEN
8610     FND_LOG.STRING(g_level_procedure,
8611                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.get_funcl_curr_info.BEGIN',
8612                    'ZX_TDS_TAX_ROUNDING_PKG: get_funcl_curr_info(+)'||
8613                    ' p_ledger_id  = ' || to_char(p_ledger_id));
8614 
8615   END IF;
8616 
8617   p_return_status :=  FND_API.G_RET_STS_SUCCESS;
8618 
8619   --
8620   -- get  functional currency info
8621   --
8622   IF ZX_TDS_UTILITIES_PKG.g_currency_rec_tbl.EXISTS(p_ledger_id)  THEN
8623     --
8624     -- functional currency info can be obtained from the cache structure
8625     --
8626     p_funcl_currency_code := ZX_TDS_UTILITIES_PKG.g_currency_rec_tbl(p_ledger_id).currency_code;
8627     p_funcl_min_acct_unit := ZX_TDS_UTILITIES_PKG.g_currency_rec_tbl(p_ledger_id).minimum_accountable_unit;
8628     p_funcl_precision := ZX_TDS_UTILITIES_PKG.g_currency_rec_tbl(p_ledger_id).precision;
8629   ELSE
8630     --
8631     -- functional currency info does not exist in cache structure
8632     -- need to obtain from the database
8633     --
8634     ZX_TDS_UTILITIES_PKG.populate_currency_cache
8635                  (p_ledger_id,
8636                   p_return_status,
8637                   p_error_buffer );
8638 
8639     IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
8640       --
8641       -- error getting min acct unit and precision
8642       -- return original unround amount to caller
8643       --
8644       RETURN;
8645     END IF;
8646 
8647    p_funcl_currency_code := ZX_TDS_UTILITIES_PKG.g_currency_rec_tbl(p_ledger_id).currency_code;
8648     p_funcl_min_acct_unit := ZX_TDS_UTILITIES_PKG.g_currency_rec_tbl(p_ledger_id).minimum_accountable_unit;
8649     p_funcl_precision     := ZX_TDS_UTILITIES_PKG.g_currency_rec_tbl(p_ledger_id).precision;
8650 
8651   END IF;
8652 
8653   IF (g_level_procedure >= g_current_runtime_level ) THEN
8654 
8655     FND_LOG.STRING(g_level_procedure,
8656                    'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.get_funcl_curr_info.END',
8657                    'ZX_TDS_TAX_ROUNDING_PKG: get_funcl_curr_info(-)'||
8658                    ' functional currency = ' || p_funcl_currency_code ||
8659                    ' min acct unit = ' ||
8660                     to_char(p_funcl_min_acct_unit)||
8661                    ' precision = ' ||
8662                     to_char(p_funcl_precision));
8663   END IF;
8664 
8665 EXCEPTION
8666   WHEN OTHERS THEN
8667     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
8668     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
8669 
8670     IF (g_level_unexpected >= g_current_runtime_level ) THEN
8671       FND_LOG.STRING(g_level_unexpected,
8672                      'ZX.PLSQL.ZX_TDS_TAX_ROUNDING_PKG.get_funcl_curr_info',
8673                       p_error_buffer);
8674     END IF;
8675 
8676 END get_funcl_curr_info;
8677 -----------------------------------------------------------------------
8678 
8679 END  ZX_TDS_TAX_ROUNDING_PKG;