[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;