DBA Data[Home] [Help]

PACKAGE BODY: APPS.ZX_TDS_RULE_BASE_DETM_PVT

Source


1 package body ZX_TDS_RULE_BASE_DETM_PVT as
2 /* $Header: zxdirulenginpvtb.pls 120.124.12010000.3 2008/11/17 23:42:56 tsen ship $ */
3 
4 
5 PROCEDURE get_tsrm_parameter_value(
6             p_structure_name         IN  VARCHAR2,
7             p_structure_index        IN  BINARY_INTEGER,
8             p_condition_index        IN  BINARY_INTEGER,
9             p_numeric_value          OUT NOCOPY ZX_CONDITIONS.NUMERIC_VALUE%TYPE,
10             p_alphanum_value         OUT NOCOPY ZX_CONDITIONS.ALPHANUMERIC_VALUE%TYPE,
11             p_date_value             OUT NOCOPY ZX_CONDITIONS.DATE_VALUE%TYPE,
12             p_return_status          OUT NOCOPY VARCHAR2,
13             p_error_buffer           OUT NOCOPY VARCHAR2);
14 
15 PROCEDURE get_fsc_code(
16             p_found                   IN OUT NOCOPY BOOLEAN,
17             p_tax_regime_code         IN     ZX_REGIMES_B.TAX_REGIME_CODE%TYPE,
18             p_classification_category IN
19                  ZX_FC_TYPES_B.Classification_Type_Categ_Code%TYPE,
20             p_classification_type     IN
21                  ZX_FC_TYPES_B.CLASSIFICATION_TYPE_CODE%TYPE,
22             p_tax_determine_date IN
23                  ZX_LINES.TAX_DETERMINE_DATE%TYPE,
24             p_classified_entity_id    IN
25                  ZX_FC_CODES_B.CLASSIFICATION_ID%TYPE,
26             p_item_org_id             IN     NUMBER,
27             p_event_class_rec         IN     ZX_API_PUB.EVENT_CLASS_REC_TYPE,
28             p_trx_alphanumeric_value  OUT NOCOPY ZX_CONDITIONS.ALPHANUMERIC_VALUE%TYPE);
29 
30 PROCEDURE get_fc(
31       p_structure_name          IN  VARCHAR2,
32       p_structure_index         IN  BINARY_INTEGER,
33       p_condition_index         IN  BINARY_INTEGER,
34       p_tax_determine_date      IN  ZX_LINES.TAX_DETERMINE_DATE%TYPE,
35       p_tax_regime_code         IN  ZX_REGIMES_B.TAX_REGIME_CODE%TYPE,
36       p_event_class_rec         IN  ZX_API_PUB.EVENT_CLASS_REC_TYPE,
37       p_trx_alphanumeric_value  OUT NOCOPY ZX_CONDITIONS.ALPHANUMERIC_VALUE%TYPE,
38       p_Determining_Factor_Cq_Code   IN  ZX_CONDITIONS.Determining_Factor_Cq_Code%TYPE,
39       p_return_status           OUT NOCOPY VARCHAR2,
40       p_error_buffer            OUT NOCOPY VARCHAR2);
41 
42 PROCEDURE get_registration_status(
43             p_structure_name         IN  VARCHAR2,
44             p_structure_index        IN  BINARY_INTEGER,
45             p_event_class_rec        IN     ZX_API_PUB.EVENT_CLASS_REC_TYPE,
46             p_tax_determine_date     IN  ZX_LINES.TAX_DETERMINE_DATE%TYPE,
47             p_tax                    IN  ZX_TAXES_B.TAX%TYPE,
48             p_tax_regime_code        IN  ZX_REGIMES_B.TAX_REGIME_CODE%TYPE,
49             p_trx_alphanumeric_value OUT NOCOPY ZX_CONDITIONS.ALPHANUMERIC_VALUE%TYPE,
50             p_Determining_Factor_Cq_Code   IN ZX_CONDITIONS.Determining_Factor_Cq_Code%TYPE,
51             p_return_status           OUT NOCOPY VARCHAR2,
52             p_error_buffer            OUT NOCOPY VARCHAR2);
53 
54 PROCEDURE process_segment_string(
55             p_account_string         IN     VARCHAR2,
56             p_chart_of_accounts_id   IN
57                 ZX_CONDITION_GROUPS_B.CHART_OF_ACCOUNTS_ID%TYPE,
58             p_return_status           OUT NOCOPY VARCHAR2,
59             p_error_buffer            OUT NOCOPY VARCHAR2);
60 
61 PROCEDURE get_account_flexfield_info(
62             p_structure_name         IN  VARCHAR2,
63             p_structure_index        IN  BINARY_INTEGER,
64             p_condition_index        IN     BINARY_INTEGER,
65             p_trx_alphanumeric_value OUT NOCOPY ZX_CONDITIONS.ALPHANUMERIC_VALUE%TYPE,
66             p_chart_of_accounts_id   IN
67                 ZX_CONDITION_GROUPS_B.CHART_OF_ACCOUNTS_ID%TYPE,
68             p_sob_id                 IN
69                 ZX_CONDITION_GROUPS_B.LEDGER_ID%TYPE,
70             p_return_status          OUT NOCOPY VARCHAR2,
71             p_error_buffer           OUT NOCOPY VARCHAR2);
72 
73 PROCEDURE get_geography_info(
74             p_structure_name         IN  VARCHAR2,
75             p_structure_index        IN  BINARY_INTEGER,
76             p_condition_index        IN  BINARY_INTEGER,
77             p_zone_tbl               OUT NOCOPY HZ_GEO_GET_PUB.zone_tbl_type,
78             p_Determining_Factor_Cq_Code  IN  ZX_CONDITIONS.Determining_Factor_Cq_Code%TYPE,
79             p_tax_determine_date     IN  ZX_LINES.TAX_DETERMINE_DATE%TYPE,
80             p_return_status          OUT NOCOPY VARCHAR2,
81             p_error_buffer           OUT NOCOPY VARCHAR2);
82 
83 -- Bug#4591207
84 PROCEDURE get_master_geography_info(
85             p_structure_name        IN  VARCHAR2,
86             p_structure_index       IN  BINARY_INTEGER,
87             p_condition_index       IN  BINARY_INTEGER,
88             p_trx_numeric_value  OUT NOCOPY ZX_CONDITIONS.NUMERIC_VALUE%TYPE,
89             p_Determining_Factor_Cq_Code IN ZX_CONDITIONS.Determining_Factor_Cq_Code%TYPE,
90             p_return_status            OUT NOCOPY VARCHAR2,
91             p_error_buffer             OUT NOCOPY VARCHAR2);
92 
93 /* Bugfix 3673395 - Since the list of Determining factors related
94 to PRODUCT :  ITEM_TAXABILITY_OVERRIDE and TAX_CLASSIFICATION
95 and PARTY : ESTB_TAX_CLASSIFICATION
96 are replaced by defaulting APIs, we no longer require the following procedures
97 - get_tax_info_from_item
98 - get_product_tax_info
99 - get get_party_tax_info
100 
101 PROCEDURE get_tax_info_from_item(
102             p_product_id              IN  MTL_SYSTEM_ITEMS.INVENTORY_ITEM_ID%TYPE,
103             p_item_org_id             IN  MTL_SYSTEM_ITEMS.ORGANIZATION_ID%TYPE,
104             p_determining_factor_code IN  ZX_CONDITIONS.DETERMINING_FACTOR_CODE%TYPE,
105             p_trx_alphanumeric_value  OUT NOCOPY ZX_CONDITIONS.ALPHANUMERIC_VALUE%TYPE,
106             p_return_status           OUT NOCOPY VARCHAR2,
107             p_error_buffer            OUT NOCOPY VARCHAR2);
108 
109 PROCEDURE get_product_tax_info(
110             p_structure_name          IN  VARCHAR2,
111             p_structure_index         IN  BINARY_INTEGER,
112             p_determining_factor_code IN  ZX_CONDITIONS.DETERMINING_FACTOR_CODE%TYPE,
113             p_trx_alphanumeric_value  OUT NOCOPY ZX_CONDITIONS.ALPHANUMERIC_VALUE%TYPE,
114             p_return_status           OUT NOCOPY VARCHAR2,
115             p_error_buffer            OUT NOCOPY VARCHAR2);
116 
117 PROCEDURE get_party_tax_info(
118             p_structure_name          IN  VARCHAR2,
119             p_structure_index         IN  BINARY_INTEGER,
120             p_Determining_Factor_Cq_Code   IN  ZX_CONDITIONS.Determining_Factor_Cq_Code%TYPE,
121             p_determining_factor_code IN  ZX_CONDITIONS.DETERMINING_FACTOR_CODE%TYPE,
122             p_trx_alphanumeric_value  OUT NOCOPY ZX_CONDITIONS.ALPHANUMERIC_VALUE%TYPE,
123             p_return_status           OUT NOCOPY VARCHAR2,
124             p_error_buffer            OUT NOCOPY VARCHAR2);
125 */
126 PROCEDURE get_trx_value(
127             p_structure_name         IN  VARCHAR2,
128             p_structure_index        IN  BINARY_INTEGER,
129             p_event_class_rec        IN  ZX_API_PUB.EVENT_CLASS_REC_TYPE,
130             p_condition_index        IN  BINARY_INTEGER,
131             p_tax_determine_date     IN  ZX_LINES.TAX_DETERMINE_DATE%TYPE,
132             p_tax                    IN  ZX_TAXES_B.TAX%TYPE,
133             p_tax_regime_code        IN  ZX_REGIMES_B.TAX_REGIME_CODE%TYPE,
134             p_Determining_Factor_Cq_Code  IN     ZX_CONDITIONS.Determining_Factor_Cq_Code%TYPE,
135             p_numeric_value          OUT NOCOPY ZX_CONDITIONS.NUMERIC_VALUE%TYPE,
136             p_alphanum_value         OUT NOCOPY ZX_CONDITIONS.ALPHANUMERIC_VALUE%TYPE,
137             p_date_value             OUT NOCOPY ZX_CONDITIONS.DATE_VALUE%TYPE,
138             p_chart_of_accounts_id   IN
139                 ZX_CONDITION_GROUPS_B.CHART_OF_ACCOUNTS_ID%TYPE,
140             p_sob_id                 IN
141                 ZX_CONDITION_GROUPS_B.LEDGER_ID%TYPE,
142             p_return_status          OUT NOCOPY VARCHAR2,
143             p_error_buffer           OUT NOCOPY VARCHAR2);
144 
145 
146 PROCEDURE evaluate_trx_value_tbl(
147             p_structure_name         IN     VARCHAR2,
148             p_structure_index        IN     BINARY_INTEGER,
149             p_condition_index        IN     BINARY_INTEGER,
150             p_tax_determine_date     IN     ZX_LINES.TAX_DETERMINE_DATE%TYPE,
151             p_Determining_Factor_Cq_Code  IN     ZX_CONDITIONS.Determining_Factor_Cq_Code%TYPE,
152             p_chart_of_accounts_id   IN     ZX_CONDITION_GROUPS_B.CHART_OF_ACCOUNTS_ID%TYPE,
153             p_result                 IN OUT NOCOPY BOOLEAN,
154             p_return_status             OUT NOCOPY VARCHAR2,
155             p_error_buffer              OUT NOCOPY VARCHAR2);
156 
157 PROCEDURE get_user_item_type_value(
158             p_structure_name     IN  VARCHAR2,
159             p_structure_index    IN  BINARY_INTEGER,
160             p_condition_index    IN  BINARY_INTEGER,
161 	    p_event_class_rec    IN  ZX_API_PUB.EVENT_CLASS_REC_TYPE,
162 	    p_numeric_value      OUT NOCOPY ZX_CONDITIONS.NUMERIC_VALUE%TYPE,
163             p_alphanum_value     OUT NOCOPY ZX_CONDITIONS.ALPHANUMERIC_VALUE%TYPE,
164             p_return_status      OUT NOCOPY VARCHAR2,
165             p_error_buffer       OUT NOCOPY VARCHAR2);
166 
167 PROCEDURE get_user_item_alphanum_value(
168             p_structure_name         IN  VARCHAR2,
169             p_structure_index        IN  BINARY_INTEGER,
170             p_parameter_code         IN  ZX_PARAMETERS_B.TAX_PARAMETER_CODE%TYPE,
171 	    p_event_class_rec        IN  ZX_API_PUB.EVENT_CLASS_REC_TYPE,
172             p_trx_alphanumeric_value    OUT NOCOPY ZX_CONDITIONS.ALPHANUMERIC_VALUE%TYPE,
173             p_return_status             OUT NOCOPY VARCHAR2,
174             p_error_buffer              OUT NOCOPY VARCHAR2);
175 
176 FUNCTION evaluate_date_condition(
177            p_Operator_Code         IN      ZX_CONDITIONS.Operator_Code%TYPE,
178            p_condition_value  IN      ZX_CONDITIONS.DATE_VALUE%TYPE,
179            p_trx_value        IN      ZX_CONDITIONS.DATE_VALUE%TYPE)
180 RETURN BOOLEAN;
181 
182 FUNCTION evaluate_numeric_condition(
183            p_Operator_Code           IN  ZX_CONDITIONS.Operator_Code%TYPE,
184            p_condition_value    IN  ZX_CONDITIONS.NUMERIC_VALUE%TYPE,
185            p_trx_value          IN  ZX_CONDITIONS.NUMERIC_VALUE%TYPE)
186 RETURN BOOLEAN;
187 
188 FUNCTION evaluate_alphanum_condition(
189            p_Operator_Code         IN    ZX_CONDITIONS.Operator_Code%TYPE,
190            p_condition_value       IN    ZX_CONDITIONS.ALPHANUMERIC_VALUE%TYPE,
191            p_trx_value             IN    ZX_CONDITIONS.ALPHANUMERIC_VALUE%TYPE,
192            p_value_low             IN    ZX_CONDITIONS.VALUE_LOW%TYPE,
193            p_value_high            IN    ZX_CONDITIONS.VALUE_HIGH%TYPE,
194            p_det_factor_templ_code IN    ZX_DET_FACTOR_TEMPL_B.DET_FACTOR_TEMPL_CODE%TYPE,
195            p_chart_of_accounts_id  IN    ZX_CONDITION_GROUPS_B.CHART_OF_ACCOUNTS_ID%TYPE)
196 RETURN BOOLEAN;
197 
198 PROCEDURE evaluate_condition(
199             p_condition_index        IN     BINARY_INTEGER,
200             p_trx_alphanumeric_value IN     ZX_CONDITIONS.ALPHANUMERIC_VALUE%TYPE,
201             p_trx_numeric_value      IN     ZX_CONDITIONS.NUMERIC_VALUE%TYPE,
202             p_trx_date_value         IN     ZX_CONDITIONS.DATE_VALUE%TYPE,
203             p_chart_of_accounts_id   IN     ZX_CONDITION_GROUPS_B.CHART_OF_ACCOUNTS_ID%TYPE,
204             p_result                 OUT NOCOPY BOOLEAN,
205             p_return_status          OUT NOCOPY VARCHAR2,
206             p_error_buffer           OUT NOCOPY VARCHAR2);
207 
208 PROCEDURE check_condition_group_result(
209       p_det_factor_templ_code   IN     ZX_DET_FACTOR_TEMPL_B.DET_FACTOR_TEMPL_CODE%TYPE,
210       p_condition_group_code    IN     ZX_CONDITION_GROUPS_B.CONDITION_GROUP_CODE%TYPE,
211       p_trx_line_index          IN     BINARY_INTEGER,
212       p_event_class_rec         IN     ZX_API_PUB.EVENT_CLASS_REC_TYPE,
213       p_template_evaluated      OUT NOCOPY BOOLEAN,
214       p_result                  OUT NOCOPY BOOLEAN);
215 
216 PROCEDURE insert_condition_group_result(
217             p_det_factor_templ_code IN ZX_DET_FACTOR_TEMPL_B.DET_FACTOR_TEMPL_CODE%TYPE,
218             p_condition_group_code  IN ZX_CONDITION_GROUPS_B.CONDITION_GROUP_CODE%TYPE,
219             p_result                IN BOOLEAN,
220             p_trx_line_index        IN BINARY_INTEGER,
221             p_event_class_rec       IN ZX_API_PUB.EVENT_CLASS_REC_TYPE);
222 
223 PROCEDURE get_result(
224            p_result_id           IN  ZX_PROCESS_RESULTS.RESULT_ID%TYPE,
225            p_structure_name      IN  VARCHAR2,
226            p_structure_index     IN  BINARY_INTEGER,
227            p_tax_regime_code     IN  ZX_RATES_B.tax_regime_Code%TYPE,
228            p_tax                 IN  ZX_RATES_B.tax%TYPE,
229            p_tax_determine_date  IN  DATE,
230            p_found               OUT NOCOPY BOOLEAN,
231            p_zx_result_rec       OUT NOCOPY ZX_PROCESS_RESULTS%ROWTYPE,
232            p_return_status       OUT NOCOPY VARCHAR2,
233            p_error_buffer        OUT NOCOPY VARCHAR2);
234 
235 PROCEDURE init_set_condition;
236 
237 PROCEDURE get_set_info (
238       p_index                    IN BINARY_INTEGER,
239       p_Det_Factor_Class_Code IN ZX_CONDITIONS.Determining_Factor_Class_Code%TYPE,
240       p_Determining_Factor_Cq_Code    IN ZX_CONDITIONS.Determining_Factor_Cq_Code%TYPE,
241       p_tax_parameter_code       IN ZX_CONDITIONS.TAX_PARAMETER_CODE%TYPE,
242       p_Data_Type_Code                IN ZX_CONDITIONS.Data_Type_Code%TYPE,
243       p_determining_factor_code  IN ZX_CONDITIONS.DETERMINING_FACTOR_CODE%TYPE,
244       p_Operator_Code                 IN ZX_CONDITIONS.Operator_Code%TYPE,
245       p_numeric_value            IN ZX_CONDITIONS.NUMERIC_VALUE%TYPE,
246       p_date_value               IN ZX_CONDITIONS.DATE_VALUE%TYPE,
247       p_alphanum_value           IN ZX_CONDITIONS.ALPHANUMERIC_VALUE%TYPE,
248       p_value_low                IN ZX_CONDITIONS.VALUE_LOW%TYPE,
249       p_value_high               IN ZX_CONDITIONS.VALUE_HIGH%TYPE);
250 
251 PROCEDURE process_set_condition (
252         p_structure_name         IN VARCHAR2,
253         p_structure_index        IN BINARY_INTEGER,
254         p_event_class_rec        IN ZX_API_PUB.EVENT_CLASS_REC_TYPE,
255         p_tax_determine_date     IN ZX_LINES.TAX_DETERMINE_DATE%TYPE,
256         p_tax                    IN ZX_TAXES_B.TAX%TYPE,
257         p_tax_regime_code        IN ZX_REGIMES_B.TAX_REGIME_CODE%TYPE,
258         p_result                 IN OUT NOCOPY BOOLEAN,
259         p_chart_of_accounts_id  IN
260                 ZX_CONDITION_GROUPS_B.CHART_OF_ACCOUNTS_ID%TYPE,
261         p_sob_id                 IN
262                 ZX_CONDITION_GROUPS_B.LEDGER_ID%TYPE,
263         p_return_status             OUT NOCOPY VARCHAR2,
264         p_error_buffer              OUT NOCOPY VARCHAR2);
265 
266 
267 PROCEDURE get_and_process_condition(
268          p_structure_name        IN VARCHAR2,
269          p_structure_index       IN BINARY_INTEGER,
270          p_condition_group_code  IN ZX_CONDITION_GROUPS_B.CONDITION_GROUP_CODE%TYPE,
271          p_event_class_rec       IN ZX_API_PUB.EVENT_CLASS_REC_TYPE,
272          p_tax                   IN ZX_TAXES_B.TAX%TYPE,
273          p_tax_regime_code       IN ZX_REGIMES_B.TAX_REGIME_CODE%TYPE,
274          p_tax_determine_date    IN ZX_LINES.TAX_DETERMINE_DATE%TYPE,
275          p_result                IN OUT NOCOPY BOOLEAN,
276          p_chart_of_accounts_id  IN
277                 ZX_CONDITION_GROUPS_B.CHART_OF_ACCOUNTS_ID%TYPE,
278          p_sob_id                IN
279                 ZX_CONDITION_GROUPS_B.LEDGER_ID%TYPE,
280          p_return_status            OUT NOCOPY VARCHAR2,
281          p_error_buffer             OUT NOCOPY VARCHAR2);
282 
283 
284 PROCEDURE proc_condition_group_per_templ(
285             p_structure_name        IN     VARCHAR2,
286             p_structure_index       IN     BINARY_INTEGER,
287             p_det_factor_templ_code IN
288                   ZX_DET_FACTOR_TEMPL_B.DET_FACTOR_TEMPL_CODE%TYPE,
289             p_event_class_rec       IN     ZX_API_PUB.EVENT_CLASS_REC_TYPE,
290             p_tax                   IN     ZX_TAXES_B.TAX%TYPE,
291             p_tax_regime_code       IN     ZX_REGIMES_B.TAX_REGIME_CODE%TYPE,
292             p_tax_determine_date    IN     ZX_LINES.TAX_DETERMINE_DATE%TYPE,
293             p_service_type_code     IN     ZX_RULES_B.SERVICE_TYPE_CODE%TYPE,
294             p_tax_rule_id           IN     ZX_RULES_B.TAX_RULE_ID%TYPE,
295             p_tax_status_code       IN     ZX_STATUS_B.TAX_STATUS_CODE%TYPE,
296             p_result                IN OUT NOCOPY BOOLEAN,
297             p_result_id             IN OUT NOCOPY NUMBER,
298             p_found	            OUT NOCOPY BOOLEAN ,
299             p_zx_result_rec          OUT NOCOPY ZX_PROCESS_RESULTS%ROWTYPE,
300             p_return_status            OUT NOCOPY VARCHAR2,
301             p_error_buffer             OUT NOCOPY VARCHAR2);
302 
303 PROCEDURE proc_det_factor_templ(
304             p_structure_name          IN     VARCHAR2,
305             p_structure_index         IN     BINARY_INTEGER,
306             p_det_factor_templ_cd_tbl IN     DET_FACTOR_TEMPL_CODE_TBL,
307             p_tax_status_code         IN     ZX_STATUS_B.TAX_STATUS_CODE%TYPE,
308             p_event_class_rec         IN     ZX_API_PUB.EVENT_CLASS_REC_TYPE,
309             p_tax_tbl                 IN     TAX_TBL,
310             p_tax_determine_date      IN     ZX_LINES.TAX_DETERMINE_DATE%TYPE,
311             p_recovery_type_code      IN     ZX_RULES_B.RECOVERY_TYPE_CODE%TYPE,
312             p_found                   IN OUT NOCOPY BOOLEAN,
313             p_tax_regime_code_tbl     IN     TAX_REGIME_CODE_TBL,
314             p_service_type_code       IN     ZX_RULES_B.SERVICE_TYPE_CODE%TYPE,
315             p_tax_rule_id_tbl         IN     TAX_RULE_ID_TBL,
316             p_rule_det_factor_cq_tbl  IN		 RULE_DET_FACTOR_CQ_TBL,
317             p_rule_geography_type_tbl IN     RULE_GEOGRAPHY_TYPE_TBL,
318             p_rule_geography_id_tbl   IN     RULE_GEOGRAPHY_ID_TBL,
319             p_zx_result_rec           OUT NOCOPY ZX_PROCESS_RESULTS%ROWTYPE,
320             p_return_status           OUT NOCOPY VARCHAR2,
321             p_error_buffer            OUT NOCOPY VARCHAR2);
322 
323 PROCEDURE process_rule_code(
324             p_service_type_code    IN     ZX_RULES_B.SERVICE_TYPE_CODE%TYPE,
325             p_structure_name       IN     VARCHAR2,
326             p_structure_index      IN     BINARY_INTEGER,
327             p_event_class_rec      IN     ZX_API_PUB.EVENT_CLASS_REC_TYPE,
328             p_tax                  IN     ZX_TAXES_B.TAX%TYPE,
329             p_tax_regime_code      IN     ZX_REGIMES_B.TAX_REGIME_CODE%TYPE,
330             p_tax_determine_date   IN     ZX_LINES.TAX_DETERMINE_DATE%TYPE,
331             p_tax_status_code      IN     ZX_STATUS_B.TAX_STATUS_CODE%TYPE,
332             p_tax_rule_code        IN     ZX_RULES_B.TAX_RULE_CODE%TYPE,
333             p_recovery_type_code   IN     ZX_RULES_B.RECOVERY_TYPE_CODE%TYPE,
334             p_found                IN OUT NOCOPY BOOLEAN,
335             p_zx_result_rec           OUT NOCOPY ZX_PROCESS_RESULTS%ROWTYPE,
336             p_return_status           OUT NOCOPY VARCHAR2,
337             p_error_buffer            OUT NOCOPY VARCHAR2);
338 
339 
340 -- Bugfix 3673395 Added new procedure for evaluating Rules
341 -- Bugfix 4017396 Removed unwanted parameters
342 PROCEDURE fetch_proc_det_factor_templ(
343             p_structure_name          IN     VARCHAR2,
344             p_structure_index         IN     BINARY_INTEGER,
345             p_tax_status_code         IN     ZX_STATUS_B.TAX_STATUS_CODE%TYPE,
346             p_event_class_rec         IN     ZX_API_PUB.EVENT_CLASS_REC_TYPE,
347             p_tax_determine_date      IN     ZX_LINES.TAX_DETERMINE_DATE%TYPE,
348             p_recovery_type_code      IN     ZX_RULES_B.RECOVERY_TYPE_CODE%TYPE,
349             p_found                   IN OUT NOCOPY BOOLEAN,
350             p_service_type_code       IN     ZX_RULES_B.SERVICE_TYPE_CODE%TYPE,
351             p_zx_result_rec           OUT NOCOPY ZX_PROCESS_RESULTS%ROWTYPE,
352             p_tax                     IN     ZX_TAXES_B.TAX%TYPE,
353             p_tax_regime_code         IN      ZX_REGIMES_B.TAX_REGIME_CODE%TYPE,
354             p_return_status           OUT NOCOPY VARCHAR2,
355             p_error_buffer            OUT NOCOPY VARCHAR2);
356 
357 PROCEDURE get_rule_from_regime_hier(
358             p_service_type_code    IN     ZX_RULES_B.SERVICE_TYPE_CODE%TYPE,
359             p_structure_name       IN     VARCHAR2,
360             p_structure_index      IN     BINARY_INTEGER,
361             p_event_class_rec      IN     ZX_API_PUB.EVENT_CLASS_REC_TYPE,
362             p_tax_status_code      IN     ZX_STATUS_B.TAX_STATUS_CODE%TYPE,
363             p_tax_determine_date   IN     ZX_LINES.TAX_DETERMINE_DATE%TYPE,
364             p_recovery_type_code   IN     ZX_RULES_B.RECOVERY_TYPE_CODE%TYPE,
365             p_zx_result_rec           OUT NOCOPY ZX_PROCESS_RESULTS%ROWTYPE,
366             p_found                IN OUT NOCOPY BOOLEAN,
367             p_parent_regime_cd_tbl IN     TAX_REGIME_CODE_TBL,
368             p_return_status           OUT NOCOPY VARCHAR2,
369             p_error_buffer            OUT NOCOPY VARCHAR2);
370 
371 -- Bug 4166241 : Added new private procedure to process only those templates
372 -- whose determining factors are supported by the product
373 PROCEDURE check_templ_tax_parameter(
374           	p_det_factor_templ_code IN ZX_DET_FACTOR_TEMPL_B.det_factor_templ_code%TYPE,
375           	p_event_class_rec       IN ZX_API_PUB.EVENT_CLASS_REC_TYPE,
376             p_valid    	            OUT NOCOPY BOOLEAN,
377             p_return_status         OUT NOCOPY VARCHAR2,
378             p_error_buffer          OUT NOCOPY VARCHAR2);
379 
380 PROCEDURE check_rule_geography(         p_structure_name      IN VARCHAR2,
381     					p_structure_index     IN BINARY_INTEGER,
382 					p_rule_det_factor_cq  IN ZX_RULES_B.determining_factor_cq_code%TYPE,
383 					p_rule_geography_type IN ZX_RULES_B.geography_type%TYPE,
384 					p_rule_geography_id   IN ZX_RULES_B.geography_id%TYPE,
385 					p_event_class_rec     IN ZX_API_PUB.EVENT_CLASS_REC_TYPE,
386 					p_valid               OUT NOCOPY BOOLEAN,
387 					p_return_status       OUT NOCOPY VARCHAR2,
388 					p_error_buffer        OUT NOCOPY VARCHAR2);
389 
390 g_current_runtime_level      NUMBER;
391 
392 g_level_statement        CONSTANT    NUMBER   := FND_LOG.LEVEL_STATEMENT;
393 g_level_procedure        CONSTANT NUMBER   := FND_LOG.LEVEL_PROCEDURE;
394 g_level_event            CONSTANT NUMBER   := FND_LOG.LEVEL_EVENT;
395 g_level_unexpected       CONSTANT    NUMBER   := FND_LOG.LEVEL_UNEXPECTED;
396 g_level_error            CONSTANT    NUMBER   := FND_LOG.LEVEL_ERROR;
397 
398 ----------------------------------------------------------------------
399 --  PUBLIC PROCEDURE
400 --  init_cec_params
401 --
402 --  DESCRIPTION
403 --    This is called for Migrated Records only.
404 --    This procedure initializes parameters required for evaluating
405 --    Constraint, Condition Set and Exception Set
406 --  History
407 --
408 --    Sudhir Sekuri                  01-MAR-04  Created
409 --
410 PROCEDURE init_cec_params(p_structure_name  IN     VARCHAR2,
411                           p_structure_index IN     BINARY_INTEGER,
412                           p_return_status   IN OUT NOCOPY VARCHAR2,
413                           p_error_buffer    IN OUT NOCOPY VARCHAR2) is
414 
415 begin
416 
417   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
418   IF (g_level_procedure >= g_current_runtime_level ) THEN
419      FND_LOG.STRING(g_level_procedure,
420                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.init_cec_params.BEGIN',
421                    'ZX_TDS_RULE_BASE_DETM_PVT: init_cec_params (+)');
422   END IF;
423 
424   p_return_status := FND_API.G_RET_STS_SUCCESS;
425 
426   -- Fetch Ship To Party Site Id
427   -- (equivalent of arp_tax.tax_info_rec.ship_to_site_use_id)
428   get_tsrm_num_value(p_structure_name,
429                      p_structure_index,
430                      'SHIP_TO_PARTY_SITE_ID',
431                      g_cec_ship_to_party_site_id,
432                      p_return_status,
433                      p_error_buffer);
434   -- Fetch Bill To Party Site Id
435   -- (equivalent of arp_tax.tax_info_rec.bill_to_site_use_id)
436   get_tsrm_num_value(p_structure_name,
437                      p_structure_index,
438                      'BILL_TO_PARTY_SITE_ID',
439                      g_cec_bill_to_party_site_id,
440                      p_return_status,
441                      p_error_buffer);
442 
443   -- Fetch Ship To Party Id
444   -- (equivalent of arp_tax.tax_info_rec.ship_to_cust_id)
445   get_tsrm_num_value(p_structure_name,
446                      p_structure_index,
447                      'SHIP_TO_PARTY_TAX_PROF_ID',
448                      g_cec_ship_to_party_id,
449                      p_return_status,
450                      p_error_buffer);
451 
452   -- Fetch Bill To Party Id
453   -- (equivalent of arp_tax.tax_info_rec.bill_to_cust_id)
454   get_tsrm_num_value(p_structure_name,
455                      p_structure_index,
456                      'BILL_TO_PARTY_TAX_PROF_ID',
457                      g_cec_bill_to_party_id,
458                      p_return_status,
459                      p_error_buffer);
460 
461   -- Fetch POO Location Id
462   get_tsrm_num_value(p_structure_name,
463                      p_structure_index,
464                      'POO_LOCATION_ID',
465                      g_cec_poo_location_id,
466                      p_return_status,
467                      p_error_buffer);
468 
469   -- Fetch POA Location Id
470   get_tsrm_num_value(p_structure_name,
471                      p_structure_index,
472                      'POA_LOCATION_ID',
473                      g_cec_poa_location_id,
474                      p_return_status,
475                      p_error_buffer);
476 
477   -- Fetch Trx Id
478   -- (equivalent of arp_tax.tax_info_rec.customer_trx_id)
479   get_tsrm_num_value(p_structure_name,
480                      p_structure_index,
481                      'TRX_ID',
482                      g_cec_trx_id,
483                      p_return_status,
484                      p_error_buffer);
485 
486   -- Fetch Trx Line Id
487   -- (equivalent of arp_tax.tax_info_rec.customer_trx_line_id)
488   get_tsrm_num_value(p_structure_name,
489                      p_structure_index,
490                      'TRX_LINE_ID',
491                      g_cec_trx_line_id,
492                      p_return_status,
493                      p_error_buffer);
494 
495   -- Fetch Ledger Id
496   -- (equivalent of arp_tax.sysinfo.sysparam.set_of_books_id)
497   get_tsrm_num_value(p_structure_name,
498                      p_structure_index,
499                      'LEDGER_ID',
500                      g_cec_ledger_id,
501                      p_return_status,
502                      p_error_buffer);
503 
504   -- Fetch Internal Organization Id
505   -- (equivalent of arp_tax.sysinfo.sysparam.org_id)
506   get_tsrm_num_value(p_structure_name,
507                      p_structure_index,
508                      'INTERNAL_ORGANIZATION_ID',
509                      g_cec_internal_organization_id,
510                      p_return_status,
511                      p_error_buffer);
512 
513   -- set the MO policy context with the internal org id
514   /* This call is not required because the code in ZX_TDS_PROCESS_CEC_PVT.evaluate_cec
515      accesses the base tables (_ALL) for all multi-org tables
516   IF MO_GLOBAL.get_current_org_id <> g_cec_internal_organization_id then
517       MO_GLOBAL.Set_Policy_Context('S', g_cec_internal_organization_id);
518   END IF;
519   */
520 
521   -- Fetch SO Organization Id
522   -- (equivalent of arp_tax.profinfo.so_organization_id)
523   g_cec_so_organization_id := oe_profile.value_specific('SO_ORGANIZATION_ID');
524 
525   -- Fetch Product Organization Id
526   -- (equivalent of arp_tax.tax_info_rec.ship_from_warehouse_id)
527   get_tsrm_num_value(p_structure_name,
528                      p_structure_index,
529                      'PRODUCT_ORG_ID',
530                      g_cec_product_org_id,
531                      p_return_status,
532                      p_error_buffer);
533 
534   -- Fetch Product Id
535   -- (equivalent of arp_tax.tax_info_rec.inventory_item_id)
536   get_tsrm_num_value(p_structure_name,
537                      p_structure_index,
538                      'PRODUCT_ID',
539                      g_cec_product_id,
540                      p_return_status,
541                      p_error_buffer);
542 
543   -- Fetch Trx Line Date
544   -- (equivalent of arp_tax.tax_info_rec.trx_date)
545   ZX_GET_TAX_PARAM_DRIVER_PKG.get_driver_value (p_structure_name,
546                                                 p_structure_index,
547                                                 'TRX_LINE_DATE',
548                                                 g_cec_trx_line_date,
549                                                 p_return_status);
550 
551   -- Fetch Transaction Type Id
552   -- (equivalent of arp_tax.tax_info_rec.trx_type_id)
553   get_tsrm_num_value(p_structure_name,
554                      p_structure_index,
555                      'RECEIVABLES_TRX_TYPE_ID',
556                      g_cec_trx_type_id,
557                      p_return_status,
558                      p_error_buffer);
559 
560   -- Fetch FOB Point
561   -- (equivalent of arp_tax.tax_info_rec.fob_point)
562   get_tsrm_alphanum_value(p_structure_name,
563                           p_structure_index,
564                           'FOB_POINT',
565                           g_cec_fob_point,
566                           p_return_status,
567                           p_error_buffer);
568 
569    -- Fetch Ship To Site Used Id
570    -- Bug 3719109
571     ZX_GET_TAX_PARAM_DRIVER_PKG.get_driver_value (p_structure_name,
572                                                 p_structure_index,
573 		                               'SHIP_TO_CUST_ACCT_SITE_USE_ID',
574                                                 g_cec_ship_to_site_use_id,
575                                                 p_return_status);
576 
577    -- Fetch Bill To Site Used Id
578    -- Bug 3719109
579     ZX_GET_TAX_PARAM_DRIVER_PKG.get_driver_value (p_structure_name,
580                                                 p_structure_index,
581 		                               'BILL_TO_CUST_ACCT_SITE_USE_ID',
582                                                 g_cec_bill_to_site_use_id,
583                                                 p_return_status);
584 
585   IF (g_level_procedure >= g_current_runtime_level ) THEN
586      FND_LOG.STRING(g_level_procedure,
587                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.init_cec_params.END',
588                    'ZX_TDS_RULE_BASE_DETM_PVT: init_cec_params (-)');
589   END IF;
590 EXCEPTION
591   WHEN OTHERS THEN
592     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
593     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
594 
595     IF (g_level_unexpected >= g_current_runtime_level ) THEN
596       FND_LOG.STRING(g_level_unexpected,
597                     'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.rule_base_process.END',
598                     p_error_buffer);
599     END IF;
600 
601 END init_cec_params;
602 
603 
604 ----------------------------------------------------------------------
605 --  PUBLIC PROCEDURE
606 --  rule_base_process
607 --
608 --  DESCRIPTION
609 --
610 --  This procedure is the entry point to Rule based engine, it goes
611 --  through all the rules for a given tax determination proccess.
612 --  It evaluates all condition groups of all determining factor templates defined
613 --  in a rule to determine a result of a given process.
614 --
615 --
616 
617 PROCEDURE rule_base_process(
618             p_service_type_code    IN     ZX_RULES_B.SERVICE_TYPE_CODE%TYPE,
619             p_structure_name       IN     VARCHAR2,
620             p_structure_index      IN     BINARY_INTEGER,
621             p_event_class_rec      IN     ZX_API_PUB.EVENT_CLASS_REC_TYPE,
622             p_tax_id               IN     ZX_TAXES_B.TAX_ID%TYPE,
623             p_tax_status_code      IN     ZX_STATUS_B.TAX_STATUS_CODE%TYPE,
624             p_tax_determine_date   IN     ZX_LINES.TAX_DETERMINE_DATE%TYPE,
625             p_tax_rule_code        IN     ZX_RULES_B.TAX_RULE_CODE%TYPE,
626             p_recovery_type_code   IN     ZX_RULES_B.RECOVERY_TYPE_CODE%TYPE,
627             p_zx_result_rec           OUT NOCOPY ZX_PROCESS_RESULTS%ROWTYPE,
628             p_return_status           OUT NOCOPY VARCHAR2,
629             p_error_buffer            OUT NOCOPY VARCHAR2)
630 
631 IS
632 
633   l_det_factor_templ_cd_tbl             DET_FACTOR_TEMPL_CODE_TBL;
634   l_found                               BOOLEAN;
635   l_tax                                 ZX_TAXES_B.TAX%TYPE;
636   l_tax_regime_code                     ZX_REGIMES_B.TAX_REGIME_CODE%TYPE;
637   l_tax_tbl                             TAX_TBL;
638   l_tax_regime_code_tbl                 TAX_REGIME_CODE_TBL;
639   l_parent_regime_code_tbl              TAX_REGIME_CODE_TBL;
640   l_tax_rule_id_tbl                     TAX_RULE_ID_TBL;
641   l_eval_ctr                            NUMBER;
642   --CR#4255160. Added new variables to store the Rule level Determining Factor CQ,
643   -- Geography type and Geography Id
644   l_rule_det_factor_cq_tbl 							RULE_DET_FACTOR_CQ_TBL;
645   l_rule_geography_type_tbl 						RULE_GEOGRAPHY_TYPE_TBL;
646   l_rule_geography_id_tbl								RULE_GEOGRAPHY_ID_TBL;
647 
648 
649   --
650   -- cursor for getting determining factor templates from rules
651   -- for DET_TAX_RATE process
652   --
653   CURSOR  get_det_factor_templ_csr_a
654     (c_service_type_code        ZX_RULES_B.SERVICE_TYPE_CODE%TYPE,
655      c_tax                      ZX_TAXES_B.TAX%TYPE,
656      c_tax_regime_code          ZX_REGIMES_B.TAX_REGIME_CODE%TYPE,
657      c_tax_determine_date       ZX_LINES.TAX_DETERMINE_DATE%TYPE,
658      c_tax_status_code          ZX_STATUS_B.TAX_STATUS_CODE%TYPE,
659      c_reference_application_id ZX_RULES_B.APPLICATION_ID%TYPE)
660   IS
661     SELECT     TAX_RULE_ID,
662                TAX,
663                TAX_REGIME_CODE,
664                DET_FACTOR_TEMPL_CODE,
665                DETERMINING_FACTOR_CQ_CODE,
666                GEOGRAPHY_TYPE,
667                GEOGRAPHY_ID
668       FROM     ZX_SCO_RULES_B_V  r
669       WHERE    SERVICE_TYPE_CODE = c_service_type_code
670         AND    TAX = c_tax     -- In phase 1, tax and regime should not be NULL
671         AND    TAX_REGIME_CODE = c_tax_regime_code
672         AND    c_tax_determine_date >= EFFECTIVE_FROM
673         AND    (c_tax_determine_date <= EFFECTIVE_TO OR
674                 EFFECTIVE_TO IS NULL)
675         AND    System_Default_Flag <> 'Y'
676         AND    (APPLICATION_ID = c_reference_application_id OR
677                 APPLICATION_ID IS NULL)
678         AND    Enabled_Flag  = 'Y'
679         AND    EXISTS (SELECT  result_id
680                          FROM  ZX_PROCESS_RESULTS pr
681                          WHERE pr.TAX_RULE_ID = r.TAX_RULE_ID
682                            AND TAX_STATUS_CODE = c_tax_status_code
683                            AND pr.Enabled_Flag = 'Y')
684     ORDER BY TAX, PRIORITY;
685 
686   --
687   -- cursor for getting determining factor templates from rules
688   -- for DET_RECOVERY_RATE process
689   --
690   CURSOR  get_det_factor_templ_csr_b
691     (c_service_type_code        ZX_RULES_B.SERVICE_TYPE_CODE%TYPE,
692      c_tax                      ZX_TAXES_B.TAX%TYPE,
693      c_tax_regime_code          ZX_REGIMES_B.TAX_REGIME_CODE%TYPE,
694      c_tax_determine_date       ZX_LINES.TAX_DETERMINE_DATE%TYPE,
695      c_recovery_type_code       ZX_RULES_B.RECOVERY_TYPE_CODE%TYPE,
696      c_reference_application_id ZX_RULES_B.APPLICATION_ID%TYPE)
697   IS
698     SELECT     TAX_RULE_ID,
699                TAX,
700                TAX_REGIME_CODE,
701                DET_FACTOR_TEMPL_CODE ,
702                DETERMINING_FACTOR_CQ_CODE,
703                GEOGRAPHY_TYPE,
704                GEOGRAPHY_ID
705       FROM     ZX_SCO_RULES_B_V  r
706       WHERE    SERVICE_TYPE_CODE = c_service_type_code
707         AND    TAX = c_tax     -- In phase 1, tax and regime should not be NULL
708         AND    TAX_REGIME_CODE = c_tax_regime_code
709         AND    c_tax_determine_date >= EFFECTIVE_FROM
710         AND    (c_tax_determine_date <= EFFECTIVE_TO OR
711                 EFFECTIVE_TO IS NULL)
712         AND    System_Default_Flag <> 'Y'
713         AND    RECOVERY_TYPE_CODE = c_recovery_type_code
714         AND    (APPLICATION_ID = c_reference_application_id OR
715                 APPLICATION_ID IS NULL)
716         AND    EXISTS (SELECT  result_id
717                          FROM  ZX_PROCESS_RESULTS pr
718                          WHERE pr.TAX_RULE_ID = r.TAX_RULE_ID
719                            AND pr.Enabled_Flag = 'Y')
720         AND    Enabled_Flag  = 'Y'
721     ORDER BY TAX, PRIORITY;
722 
723   --
724   -- cursor for getting determining factor templates from rules
725   -- for processes other than DET_RECOVERY_RATE and DET_TAX_RATE
726   --
727   /* Replaced the cursor for bug 3673395 : please see the following cursors in fetch_proc_det_factor_templ:
728   new get_det_factor_templ_csr_c,
729   new get_det_factor_templ_csr_d
730   new get_det_factor_templ_csr_e
731   */
732 
733   /* CURSOR  get_det_factor_templ_csr_c
734     (c_service_type_code        ZX_RULES_B.SERVICE_TYPE_CODE%TYPE,
735      c_tax                      ZX_TAXES_B.TAX%TYPE,
736      c_tax_regime_code          ZX_REGIMES_B.TAX_REGIME_CODE%TYPE,
737      c_tax_determine_date       ZX_LINES.TAX_DETERMINE_DATE%TYPE,
738      c_reference_application_id ZX_RULES_B.APPLICATION_ID%TYPE)
739   IS
740     SELECT     TAX_RULE_ID,
741                TAX,
742                TAX_REGIME_CODE,
743                DET_FACTOR_TEMPL_CODE,
744                DETERMINING_FACTOR_CQ_CODE,
745                GEOGRAPHY_TYPE,
746                GEOGRAPHY_ID
747       FROM     ZX_SCO_RULES_B_V  r
748       WHERE    SERVICE_TYPE_CODE = c_service_type_code
749         AND    TAX = c_tax      -- In phase 1, tax and regime should not be NULL
750         AND    TAX_REGIME_CODE = c_tax_regime_code
751         AND    c_tax_determine_date >= EFFECTIVE_FROM
752         AND    (c_tax_determine_date <= EFFECTIVE_TO OR
753                 EFFECTIVE_TO IS NULL)
754         AND    System_Default_Flag <> 'Y'
755         AND    (APPLICATION_ID = c_reference_application_id OR
756                 APPLICATION_ID IS NULL)
757         AND    Enabled_Flag  = 'Y'
758         AND    EXISTS (SELECT  result_id
759                          FROM  ZX_PROCESS_RESULTS pr
760                          WHERE pr.TAX_RULE_ID = r.TAX_RULE_ID
761                            AND pr.Enabled_Flag = 'Y')
762     ORDER BY TAX, PRIORITY;
763 
764 	*/
765 
766 
767 
768   --
769   -- cursor to get a parent regime code for a given tax regime
770   --
771   CURSOR  get_regime_code_csr
772     (c_tax_regime_code       ZX_REGIMES_B.TAX_REGIME_CODE%TYPE,
773      c_tax_determine_date    ZX_LINES.TAX_DETERMINE_DATE%TYPE)
774   IS
775   SELECT     PARENT_REGIME_CODE
776     FROM     ZX_REGIME_RELATIONS
777     WHERE    REGIME_CODE = c_tax_regime_code
778 --    AND    c_tax_determine_date >= EFFECTIVE_FROM    -- This effective period
779 --    AND    (c_tax_determine_date <= EFFECTIVE_TO OR  -- should be the same as
780 --            EFFECTIVE_TO IS NULL)                    -- the one in zx_regimes_b
781     ORDER BY PARENT_REG_LEVEL;
782 
783 BEGIN
784 
785 
786   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
787 
788   IF (g_level_procedure >= g_current_runtime_level ) THEN
789     FND_LOG.STRING(g_level_procedure,
790                   'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.rule_base_process.BEGIN',
791                   'ZX_TDS_RULE_BASE_DETM_PVT: rule_base_process(+)');
792   END IF;
793 
794   IF (g_level_statement >= g_current_runtime_level ) THEN
795     FND_LOG.STRING(g_level_statement,
796                   'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.rule_base_process',
797                   'p_service_type_code: ' || p_service_type_code ||
798                   ', p_tax_id: ' || to_char(p_tax_id)||
799                   ', p_tax_status_code: ' || p_tax_status_code ||
800                   ', p_recovery_type_code: ' || p_recovery_type_code ||
801                   ', p_tax_rule_code:' || p_tax_rule_code );
802 
803   END IF;
804 
805   p_return_status := FND_API.G_RET_STS_SUCCESS;
806   l_found         := FALSE;
807 
808   --
809   -- check if tax_status_code is null for Tax rate determination
810   -- return error if it is null
811   --
812   IF (p_service_type_code = 'DET_TAX_RATE' AND
813       p_tax_status_code IS NULL) THEN
814     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
815     p_error_buffer  := 'Tax status code can not be null for Rate Determination';
816 
817     IF (g_level_error >= g_current_runtime_level ) THEN
818       FND_LOG.STRING(g_level_error,
819                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.rule_base_process',
820                      'p_return_status = ' || p_return_status ||
821                      ', p_error_buffer  = ' || p_error_buffer);
822     END IF;
823 
824     RETURN;
825   END IF;
826 
827   IF (p_service_type_code = 'DET_RECOVERY_RATE'  AND
828       p_recovery_type_code IS NULL) THEN
829     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
830     p_error_buffer  := 'Recovery type can not be null for DET_RECOVERY_RATE';
831 
832     IF (g_level_error >= g_current_runtime_level ) THEN
833       FND_LOG.STRING(g_level_error,
834                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.rule_base_process',
835                      'p_return_status = ' || p_return_status ||
836                      ', p_error_buffer  = ' || p_error_buffer);
837     END IF;
838 
839     RETURN;
840   END IF;
841 
842   --
843   -- get tax and tax regime code from cache structure
844   --
845   -- Bug#5006424- check if tax info is in cache
846   --
847   IF NOT ZX_TDS_UTILITIES_PKG.g_tax_rec_tbl.EXISTS(p_tax_id) THEN
848     ZX_TDS_UTILITIES_PKG.populate_tax_cache(
849                        p_tax_id,
850                        p_return_status,
851                        p_error_buffer);
852 
853     IF p_return_status <>  FND_API.G_RET_STS_SUCCESS THEN
854       IF (g_level_statement >= g_current_runtime_level ) THEN
855         FND_LOG.STRING(g_level_statement,
856                        'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.rule_base_process',
857                        'p_return_status = ' || p_return_status ||
858                        ', p_error_buffer  = ' || p_error_buffer);
859       END IF;
860       RETURN;
861     END IF;
862   END IF;
863 
864   l_tax := ZX_TDS_UTILITIES_PKG.g_tax_rec_tbl(p_tax_id).tax;
865   l_tax_regime_code :=
866           ZX_TDS_UTILITIES_PKG.g_tax_rec_tbl(p_tax_id).tax_regime_code;
867 
868   --
869   -- check if rule code is passed, it is from migration
870   -- for recovery rate determination
871   -- if rule code is passed, it needs to be evaluated first
872   --
873   IF (p_tax_rule_code IS NOT NULL )  THEN
874     process_rule_code(p_service_type_code,
875                       p_structure_name,
876                       p_structure_index,
877                       p_event_class_rec,
878                       l_tax,
879                       l_tax_regime_code,
880                       p_tax_determine_date,
881                       p_tax_status_code,
882                       p_tax_rule_code,
883                       p_recovery_type_code,
884                       l_found,
885                       p_zx_result_rec,
886                       p_return_status,
887                       p_error_buffer);
888 
889     IF (p_return_status <> FND_API.G_RET_STS_SUCCESS OR l_found)THEN
890       -- return to caller if error occurs or success with a result
891       IF (g_level_error >= g_current_runtime_level ) THEN
892         FND_LOG.STRING(g_level_error,
893           'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.rule_base_process',
894           'Incorrect return_status after call process_rule_code() OR l_found is true.'||
895           ', return_status: '|| p_return_status);
896       END IF;
897 
898       RETURN;
899     END IF;
900   END IF;
901 
902   IF p_service_type_code = 'DET_TAX_RATE' THEN
903     --
904     -- get templates from ZX_RULES_B table.
905     --
906     OPEN get_det_factor_templ_csr_a(p_service_type_code,
907                                   l_tax,
908                                   l_tax_regime_code,
909                                   p_tax_determine_date,
910                                   p_tax_status_code,
911                                   p_event_class_rec.application_id);
912     LOOP
913       FETCH get_det_factor_templ_csr_a bulk collect into
914         l_tax_rule_id_tbl,
915         l_tax_tbl,
916         l_tax_regime_code_tbl,
917         l_det_factor_templ_cd_tbl,
918         l_rule_det_factor_cq_tbl,
919         l_rule_geography_type_tbl,
920         l_rule_geography_id_tbl
921       LIMIT C_LINES_PER_COMMIT;
922 
923 			--CR#4255160 Added new parameters to proc_det_factor_templ procedure, for Geography Context.
924       proc_det_factor_templ(
925              p_structure_name,
926              p_structure_index,
927              l_det_factor_templ_cd_tbl,
928              p_tax_status_code,
929              p_event_class_rec,
930              l_tax_tbl,
931              p_tax_determine_date,
932              p_recovery_type_code,
933              l_found,
934              l_tax_regime_code_tbl,
935              p_service_type_code,
936              l_tax_rule_id_tbl,
937              l_rule_det_factor_cq_tbl,
938              l_rule_geography_type_tbl,
939              l_rule_geography_id_tbl,
940              p_zx_result_rec,
941              p_return_status,
942              p_error_buffer);
943       IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
944         CLOSE get_det_factor_templ_csr_a;
945 
946         IF (g_level_error >= g_current_runtime_level ) THEN
947           FND_LOG.STRING(g_level_error,
948             'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.rule_base_process',
949              'Incorrect return_status after call proc_det_factor_templ().' ||
950              ', return_status: '|| p_return_status);
951         END IF;
952 
953         EXIT;
954       END IF;
955 
956       IF (get_det_factor_templ_csr_a%notfound  OR l_found) THEN
957 
958         IF (g_level_statement >= g_current_runtime_level ) THEN
959           FND_LOG.STRING(g_level_statement,
960                          'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.rule_base_process',
961                          'get_det_factor_templ_csr row count '
962                           ||to_char(get_det_factor_templ_csr_a%rowcount));
963         END IF;
964         CLOSE get_det_factor_templ_csr_a;
965         EXIT;
966       END IF;
967     END LOOP; -- bulk fetch template.
968 
969     IF get_det_factor_templ_csr_a%ISOPEN THEN
970       CLOSE get_det_factor_templ_csr_a;
971     END IF;
972 
973   ELSIF p_service_type_code = 'DET_RECOVERY_RATE' THEN
974     --
975     -- get templates from ZX_RULES_B table.
976     --
977     OPEN get_det_factor_templ_csr_b(p_service_type_code,
978                                   l_tax,
979                                   l_tax_regime_code,
980                                   p_tax_determine_date,
981                                   p_recovery_type_code,
982                                   p_event_class_rec.application_id);
983     LOOP
984       FETCH get_det_factor_templ_csr_b bulk collect into
985         l_tax_rule_id_tbl,
986         l_tax_tbl,
987         l_tax_regime_code_tbl,
988         l_det_factor_templ_cd_tbl,
989         l_rule_det_factor_cq_tbl,
990         l_rule_geography_type_tbl,
991         l_rule_geography_id_tbl
992       LIMIT C_LINES_PER_COMMIT;
993 
994       --CR#4255160 Added new parameters to proc_det_factor_templ procedure, for Geography Context.
995       proc_det_factor_templ(
996              p_structure_name,
997              p_structure_index,
998              l_det_factor_templ_cd_tbl,
999              p_tax_status_code,
1000              p_event_class_rec,
1001              l_tax_tbl,
1002              p_tax_determine_date,
1003              p_recovery_type_code,
1004              l_found,
1005              l_tax_regime_code_tbl,
1006              p_service_type_code,
1007              l_tax_rule_id_tbl,
1008              l_rule_det_factor_cq_tbl,
1009 						 l_rule_geography_type_tbl,
1010              l_rule_geography_id_tbl,
1011              p_zx_result_rec,
1012              p_return_status,
1013              p_error_buffer);
1014 
1015       IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1016         CLOSE get_det_factor_templ_csr_b;
1017         IF (g_level_error >= g_current_runtime_level ) THEN
1018           FND_LOG.STRING(g_level_error,
1019             'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.rule_base_process',
1020             'Incorrect return_status after call proc_det_factor_templ().' ||
1021             ', return_status: '|| p_return_status);
1022         END IF;
1023 
1024         EXIT;
1025       END IF;
1026 
1027       IF (get_det_factor_templ_csr_b%notfound  OR l_found) THEN
1028 
1029         IF (g_level_statement >= g_current_runtime_level ) THEN
1030           FND_LOG.STRING(g_level_statement,
1031                          'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.rule_base_process',
1032                          'get_det_factor_templ_csr row count '
1033                           ||to_char(get_det_factor_templ_csr_b%rowcount));
1034         END IF;
1035         CLOSE get_det_factor_templ_csr_b;
1036         EXIT;
1037       END IF;
1038     END LOOP; -- bulk fetch template.
1039 
1040     IF get_det_factor_templ_csr_b%ISOPEN THEN
1041       CLOSE get_det_factor_templ_csr_b;
1042     END IF;
1043 
1044   ELSE  -- p_service_type_code other than 'DET_TAX_RATE' and 'DET_RECOVERY_RATE'
1045 
1046     -- Bugfix 3673395
1047 
1048     fetch_proc_det_factor_templ(
1049               p_structure_name,
1050               p_structure_index,
1051               p_tax_status_code,
1052               p_event_class_rec,
1053               p_tax_determine_date,
1054               p_recovery_type_code,
1055               l_found,
1056               p_service_type_code,
1057               p_zx_result_rec,
1058               l_tax,
1059               l_tax_regime_code,
1060               p_return_status,
1061               p_error_buffer) ;
1062 
1063     /* Bug 4017396 - included the check for p_return_status*/
1064     IF ( p_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
1065       IF (g_level_error >= g_current_runtime_level ) THEN
1066         FND_LOG.STRING(g_level_error,
1067                        'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.rule_base_process',
1068                        'p_return_status = ' || p_return_status ||
1069                        ', p_error_buffer  = ' || p_error_buffer);
1070 
1071       END IF;
1072     END IF;
1073 
1074   END IF;   -- p_service_type_code = 'DET_TAX_RATE'/'DET_RECOVERY_RATE' OR ELSE
1075 
1076 /* comment this out as in Phase 1 only rules at tax level are supported.
1077   IF (NOT l_found AND p_return_status = FND_API.G_RET_STS_SUCCESS) THEN
1078 
1079     --
1080     -- traverse the regime hierarchy to get rules
1081     --
1082     OPEN get_regime_code_csr(l_tax_regime_code,
1083                              p_tax_determine_date);
1084 
1085     LOOP
1086       FETCH get_regime_code_csr  bulk collect into l_parent_regime_code_tbl
1087       LIMIT C_LINES_PER_COMMIT;
1088 
1089         get_rule_from_regime_hier(
1090              p_service_type_code,
1091              p_structure_name,
1092              p_structure_index,
1093              p_event_class_rec,
1094              p_tax_status_code,
1095              p_tax_determine_date,
1096              p_recovery_type_code,
1097              p_zx_result_rec,
1098              l_found,
1099              l_parent_regime_code_tbl,
1100              p_return_status,
1101              p_error_buffer);
1102         IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1103           CLOSE get_regime_code_csr;
1104 
1105           IF (g_level_error >= g_current_runtime_level ) THEN
1106             FND_LOG.STRING(g_level_error,
1107               'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.rule_base_process',
1108               'Incorrect return_status after call get_rule_from_regime_hier().'||
1109               ', return_status: '|| p_return_status);
1110           END IF;
1111 
1112           EXIT;
1113         END IF;
1114       IF (get_regime_code_csr%notfound  OR l_found) THEN
1115 
1116         IF (g_level_statement >= g_current_runtime_level ) THEN
1117           FND_LOG.STRING(g_level_statement,
1118                          'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.rule_base_process',
1119                          'get_regime_code_csr row count '||
1120                           to_char(get_regime_code_csr%rowcount));
1121         END IF;
1122         CLOSE get_regime_code_csr;
1123         EXIT;
1124       END IF;
1125 
1126     END LOOP;
1127 
1128     IF get_regime_code_csr%ISOPEN THEN
1129       CLOSE get_regime_code_csr;
1130     END IF;
1131 
1132  END IF;
1133 
1134 */
1135 
1136   IF (g_level_procedure >= g_current_runtime_level ) THEN
1137     FND_LOG.STRING(g_level_procedure,
1138                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.rule_base_process',
1139                    'alphanumeric_result: ' || p_zx_result_rec.alphanumeric_result);
1140     FND_LOG.STRING(g_level_procedure,
1141                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.rule_base_process.END',
1142                    'ZX_TDS_RULE_BASE_DETM_PVT: rule_base_process(-)' ||
1143                    ', p_return_status = ' || p_return_status ||
1144                    ', p_error_buffer  = ' || p_error_buffer);
1145   END IF;
1146 
1147   EXCEPTION
1148     WHEN OTHERS THEN
1149       p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1150       p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
1151       IF get_det_factor_templ_csr_a%ISOPEN THEN
1152         CLOSE get_det_factor_templ_csr_a;
1153       ELSIF get_det_factor_templ_csr_b%ISOPEN THEN
1154         CLOSE get_det_factor_templ_csr_b;
1155       ELSIF get_regime_code_csr%ISOPEN THEN
1156         CLOSE get_regime_code_csr;
1157       END IF;
1158 
1159       IF (g_level_unexpected >= g_current_runtime_level ) THEN
1160         FND_LOG.STRING(g_level_unexpected,
1161                        'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.rule_base_process',
1162                         p_error_buffer);
1163       END IF;
1164 
1165 END rule_base_process;
1166 
1167 ------------------------------------------------------------------------
1168 --  PRIVATE PROCEDURE
1169 --  process_rule_code
1170 --
1171 --  DESCRIPTION
1172 --  This procedure processes rule code  for recovery rate determination
1173 --  from migration
1174 --
1175 PROCEDURE process_rule_code(
1176             p_service_type_code    IN     ZX_RULES_B.SERVICE_TYPE_CODE%TYPE,
1177             p_structure_name       IN     VARCHAR2,
1178             p_structure_index      IN     BINARY_INTEGER,
1179             p_event_class_rec      IN     ZX_API_PUB.EVENT_CLASS_REC_TYPE,
1180             p_tax                  IN     ZX_TAXES_B.TAX%TYPE,
1181             p_tax_regime_code      IN     ZX_REGIMES_B.TAX_REGIME_CODE%TYPE,
1182             p_tax_determine_date   IN     ZX_LINES.TAX_DETERMINE_DATE%TYPE,
1183             p_tax_status_code      IN     ZX_STATUS_B.TAX_STATUS_CODE%TYPE,
1184             p_tax_rule_code        IN     ZX_RULES_B.TAX_RULE_CODE%TYPE,
1185             p_recovery_type_code   IN     ZX_RULES_B.RECOVERY_TYPE_CODE%TYPE,
1186             p_found                IN OUT NOCOPY BOOLEAN,
1187             p_zx_result_rec           OUT NOCOPY ZX_PROCESS_RESULTS%ROWTYPE,
1188             p_return_status           OUT NOCOPY VARCHAR2,
1189             p_error_buffer            OUT NOCOPY VARCHAR2)
1190 IS
1191   l_det_factor_templ_cd         ZX_RULES_B.DET_FACTOR_TEMPL_CODE%TYPE;
1192   l_condition_group_code        ZX_CONDITION_GROUPS_B.CONDITION_GROUP_CODE%TYPE;
1193   l_result                      BOOLEAN;
1194   l_result_id                   ZX_PROCESS_RESULTS.RESULT_ID%TYPE;
1195   l_tax_rule_id                 ZX_RULES_B.TAX_RULE_ID%TYPE;
1196 
1197   l_valid                       BOOLEAN;
1198 
1199   --
1200   -- cursor for getting recovery templates from rules
1201   --
1202   CURSOR  get_recovery_templ_csr
1203     (c_service_type_code        ZX_RULES_B.SERVICE_TYPE_CODE%TYPE,
1204      c_tax                      ZX_TAXES_B.TAX%TYPE,
1205      c_tax_regime_code          ZX_REGIMES_B.TAX_REGIME_CODE%TYPE,
1206      c_tax_determine_date       ZX_LINES.TAX_DETERMINE_DATE%TYPE,
1207      c_recovery_type_code       ZX_RULES_B.RECOVERY_TYPE_CODE%TYPE,
1208      c_tax_rule_code            ZX_RULES_B.TAX_RULE_CODE%TYPE,
1209      c_reference_application_id ZX_RULES_B.APPLICATION_ID%TYPE)
1210   IS
1211     SELECT     TAX_RULE_ID,
1212                DET_FACTOR_TEMPL_CODE
1213       FROM     ZX_SCO_RULES_B_V  r
1214       WHERE    SERVICE_TYPE_CODE = c_service_type_code
1215         AND    TAX = c_tax
1216         AND    TAX_REGIME_CODE = c_tax_regime_code
1217         AND    c_tax_determine_date >= EFFECTIVE_FROM
1218         AND    (c_tax_determine_date <= EFFECTIVE_TO OR
1219                 EFFECTIVE_TO IS NULL)
1220         AND    TAX_RULE_CODE = c_tax_rule_code
1221         AND    RECOVERY_TYPE_CODE = c_recovery_type_code
1222         AND    NVL(System_Default_Flag, 'N')  = 'Y'
1223         AND    (APPLICATION_ID = c_reference_application_id
1224                 OR APPLICATION_ID IS NULL)
1225         AND    Enabled_Flag  = 'Y'
1226     ORDER BY TAX, PRIORITY;
1227 
1228   --
1229   -- cursor for getting offset templates from rules
1230   --
1231 /*********************
1232   CURSOR  get_offset_templ_csr
1233     (c_service_type_code        ZX_RULES_B.SERVICE_TYPE_CODE%TYPE,
1234      c_tax                      ZX_TAXES_B.TAX%TYPE,
1235      c_tax_regime_code          ZX_REGIMES_B.TAX_REGIME_CODE%TYPE,
1236      c_tax_determine_date       ZX_LINES.TAX_DETERMINE_DATE%TYPE,
1237      c_tax_rule_code            ZX_RULES_B.TAX_RULE_CODE%TYPE,
1238      c_reference_application_id ZX_RULES_B.APPLICATION_ID%TYPE)
1239   IS
1240     SELECT     TAX_RULE_ID,
1241                det_factor_templ_code
1242       FROM     ZX_SCO_RULES_B_V
1243       WHERE    SERVICE_TYPE_CODE = c_service_type_code
1244         AND    TAX = c_tax
1245         AND    TAX_REGIME_CODE = c_tax_regime_code
1246         AND    c_tax_determine_date >= EFFECTIVE_FROM
1247         AND    (c_tax_determine_date <= EFFECTIVE_TO OR
1248                 EFFECTIVE_TO IS NULL)
1249         AND    TAX_RULE_CODE = c_tax_rule_code
1250         AND    RECOVERY_TYPE_CODE IS NULL
1251         AND    System_Default_Flag = 'Y'
1252         AND    APPLICATION_ID = c_reference_application_id
1253         AND    Enabled_Flag  = 'Y'
1254     ORDER BY TAX, PRIORITY;
1255 *************************/
1256 
1257 BEGIN
1258   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
1259   IF (g_level_procedure >= g_current_runtime_level ) THEN
1260     FND_LOG.STRING(g_level_procedure,
1261                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.process_rule_code.BEGIN',
1262                    'ZX_TDS_RULE_BASE_DETM_PVT: process_rule_code(+)');
1263   END IF;
1264 
1265   p_return_status := FND_API.G_RET_STS_SUCCESS;
1266 
1267   --
1268   -- determine which cursor to open
1269   --
1270   IF p_service_type_code = 'DET_RECOVERY_RATE' THEN
1271     --
1272     -- get recovery templates from ZX_RULES_B table.
1273     --
1274     OPEN get_recovery_templ_csr(p_service_type_code,
1275                                 p_tax,
1276                                 p_tax_regime_code,
1277                                 p_tax_determine_date,
1278                                 p_recovery_type_code,
1279                                 p_tax_rule_code,
1280                                 p_event_class_rec.application_id);
1281     FETCH get_recovery_templ_csr  into l_tax_rule_id, l_det_factor_templ_cd;
1282     IF get_recovery_templ_csr%NOTFOUND THEN
1283       CLOSE get_recovery_templ_csr;
1284       RETURN;
1285     END IF;
1286     CLOSE get_recovery_templ_csr;
1287 /************************
1288   ELSIF p_service_type_code = 'DET_OFFSET_TAX' THEN
1289     --
1290     -- get offset templates from ZX_RULES_B table.
1291     --
1292     OPEN get_offset_templ_csr(p_service_type_code,
1293                               p_tax,
1294                               p_tax_regime_code,
1295                               p_tax_determine_date,
1296                               p_tax_rule_code,
1297                               p_event_class_rec.application_id);
1298     FETCH get_offset_templ_csr into l_tax_rule_id, l_det_factor_templ_cd;
1299     IF get_offset_templ_csr%NOTFOUND THEN
1300       CLOSE get_offset_templ_csr;
1301       RETURN;
1302     END IF;
1303     CLOSE get_offset_templ_csr;
1304 **********************/
1305   ELSE
1306     p_return_status := FND_API.G_RET_STS_ERROR;
1307     p_error_buffer  := 'Invalid service type code for the tax rule code';
1308     IF (g_level_error >= g_current_runtime_level ) THEN
1309       FND_LOG.STRING(g_level_error,
1310                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.process_rule_code',
1311                      'p_return_status = ' || p_return_status ||
1312                      ', p_error_buffer  = ' || p_error_buffer);
1313     END IF;
1314     RETURN;
1315   END IF;
1316 
1317     -- Bug 4166241: for the template, check if the parameters associated with the determining factors
1318     -- are supported for the given Application
1319 
1320     check_templ_tax_parameter(
1321       l_det_factor_templ_cd,
1322       p_event_class_rec,
1323       l_valid,
1324       p_return_status,
1325       p_error_buffer);
1326 
1327     -- process the template only if its parameters are valid for the given application
1328     IF (l_valid AND p_return_status = FND_API.G_RET_STS_SUCCESS) THEN
1329 
1330       -- get all the condition groups and conditions
1331       proc_condition_group_per_templ(
1332                        p_structure_name,
1333                        p_structure_index,
1334                        l_det_factor_templ_cd,
1335                        p_event_class_rec,
1336                        p_tax,
1337                        p_tax_regime_code,
1338                        p_tax_determine_date,
1339                        p_service_type_code,
1340                        l_tax_rule_id,
1341                        p_tax_status_code,
1342                        l_result,
1343                        l_result_id,
1344                        p_found,
1345                        p_zx_result_rec,
1346                        p_return_status,
1347                        p_error_buffer);
1348 
1349       -- if the whole condition is satisfied, put result to p_zx_result_rec
1350 /*  getting called from within proc_condition_group_per_templ
1351       IF (l_result) THEN
1352          get_result(
1353                     l_result_id,
1354                     p_structure_name,
1355                     p_structure_index,
1356                     p_tax_regime_code,
1357                     p_tax,
1358                     p_tax_determine_date,
1359                     p_found,
1360                     p_zx_result_rec,
1361                     p_return_status,
1362                     p_error_buffer);
1363       END IF;
1364    */
1365 --	EXIT WHEN (p_found OR p_return_status <> FND_API.G_RET_STS_SUCCESS);
1366   END IF;
1367   IF (g_level_procedure >= g_current_runtime_level ) THEN
1368     FND_LOG.STRING(g_level_procedure,
1369                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.process_rule_code',
1370                    'alphanumeric_result: ' || p_zx_result_rec.alphanumeric_result);
1371     FND_LOG.STRING(g_level_procedure,
1372                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.process_rule_code.END',
1373                    'ZX_TDS_RULE_BASE_DETM_PVT: process_rule_code(-)');
1374   END IF;
1375 
1376   EXCEPTION
1377     WHEN OTHERS THEN
1378       p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1379       p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
1380       IF get_recovery_templ_csr%ISOPEN THEN
1381         CLOSE get_recovery_templ_csr;
1382       END IF;
1383 
1384       IF (g_level_unexpected >= g_current_runtime_level ) THEN
1385         FND_LOG.STRING(g_level_unexpected,
1386                        'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.process_rule_code',
1387                         p_error_buffer);
1388       END IF;
1389 
1390 END process_rule_code;
1391 
1392 ------------------------------------------------------------------------
1393 --  PRIVATE PROCEDURE
1394 --  fetch_proc_det_factor_templ
1395 --
1396 --  DESCRIPTION
1397 --  This procedure is to evaluate the Rules, based on
1398 --  source event and other attributes first, source tax event attributes
1399 --  second, current event class and other attributes third,current tax event
1400 --  class and other attributes 4th,
1401 --  null event class, null tax event class and not null tax and not null
1402 --  regimes as the last search level.
1403 --
1404 
1405 PROCEDURE fetch_proc_det_factor_templ(
1406             p_structure_name          IN     VARCHAR2,
1407             p_structure_index         IN     BINARY_INTEGER,
1408             p_tax_status_code         IN     ZX_STATUS_B.TAX_STATUS_CODE%TYPE,
1409             p_event_class_rec         IN     ZX_API_PUB.EVENT_CLASS_REC_TYPE,
1410             p_tax_determine_date      IN     ZX_LINES.TAX_DETERMINE_DATE%TYPE,
1411             p_recovery_type_code      IN     ZX_RULES_B.RECOVERY_TYPE_CODE%TYPE,
1412             p_found                   IN OUT NOCOPY BOOLEAN,
1413             p_service_type_code       IN     ZX_RULES_B.SERVICE_TYPE_CODE%TYPE,
1414             p_zx_result_rec           OUT NOCOPY ZX_PROCESS_RESULTS%ROWTYPE,
1415             p_tax                     IN     ZX_TAXES_B.TAX%TYPE,
1416             p_tax_regime_code         IN      ZX_REGIMES_B.TAX_REGIME_CODE%TYPE,
1417             p_return_status           OUT NOCOPY VARCHAR2,
1418             p_error_buffer            OUT NOCOPY VARCHAR2)
1419 IS
1420 
1421   /* Bugfix3673395 */
1422   --
1423   -- cursors for getting determining factor templates from rules
1424   -- for processes other than DET_RECOVERY_RATE and DET_TAX_RATE
1425   --
1426 
1427   CURSOR  get_det_factor_templ_csr_c
1428     (c_service_type_code        ZX_RULES_B.SERVICE_TYPE_CODE%TYPE,
1429      c_tax                      ZX_TAXES_B.TAX%TYPE,
1430      c_tax_regime_code          ZX_REGIMES_B.TAX_REGIME_CODE%TYPE,
1431      c_tax_determine_date       ZX_LINES.TAX_DETERMINE_DATE%TYPE,
1432      c_event_class_mapping_id   ZX_RULES_B.EVENT_CLASS_MAPPING_ID%TYPE)
1433   IS
1434     SELECT     TAX_RULE_ID,
1435                TAX,
1436                TAX_REGIME_CODE,
1437                DET_FACTOR_TEMPL_CODE,
1438                DETERMINING_FACTOR_CQ_CODE,
1439                GEOGRAPHY_TYPE,
1440                GEOGRAPHY_ID
1441       FROM     ZX_SCO_RULES_B_V  r
1442       WHERE    SERVICE_TYPE_CODE = c_service_type_code
1443         AND    TAX = c_tax      -- In phase 1, tax and regime should not be NULL
1444         AND    TAX_REGIME_CODE = c_tax_regime_code
1445         AND    c_tax_determine_date >= EFFECTIVE_FROM
1446         AND    (c_tax_determine_date <= EFFECTIVE_TO OR
1447                EFFECTIVE_TO IS NULL)
1448         AND    System_Default_Flag <> 'Y'
1449         AND    EVENT_CLASS_MAPPING_ID = c_event_class_mapping_id
1450         AND    Enabled_Flag  = 'Y'
1451         AND    EXISTS (SELECT  result_id
1452                          FROM  ZX_PROCESS_RESULTS pr
1453                          WHERE pr.TAX_RULE_ID = r.TAX_RULE_ID
1454 						 AND pr.enabled_flag = 'Y')
1455 	ORDER BY PRIORITY;
1456 
1457   CURSOR  get_det_factor_templ_csr_d
1458     (c_service_type_code        ZX_RULES_B.SERVICE_TYPE_CODE%TYPE,
1459      c_tax                      ZX_TAXES_B.TAX%TYPE,
1460      c_tax_regime_code          ZX_REGIMES_B.TAX_REGIME_CODE%TYPE,
1461      c_tax_determine_date       ZX_LINES.TAX_DETERMINE_DATE%TYPE,
1462      c_tax_event_class_code     ZX_RULES_B.TAX_EVENT_CLASS_CODE%TYPE)
1463   IS
1464     SELECT     TAX_RULE_ID,
1465                TAX,
1466                TAX_REGIME_CODE,
1467                DET_FACTOR_TEMPL_CODE,
1468                DETERMINING_FACTOR_CQ_CODE,
1469                GEOGRAPHY_TYPE,
1470                GEOGRAPHY_ID
1471       FROM     ZX_SCO_RULES_B_V  r
1472       WHERE    SERVICE_TYPE_CODE = c_service_type_code
1473         AND    TAX = c_tax      -- In phase 1, tax and regime should not be NULL
1474         AND    TAX_REGIME_CODE = c_tax_regime_code
1475         AND    c_tax_determine_date >= EFFECTIVE_FROM
1476         AND    (c_tax_determine_date <= EFFECTIVE_TO OR
1477                 EFFECTIVE_TO IS NULL)
1478         AND    System_Default_Flag <> 'Y'
1479         AND    TAX_EVENT_CLASS_CODE = c_tax_event_class_code
1480         AND    Enabled_Flag  = 'Y'
1481         AND    EXISTS (SELECT  result_id
1482                          FROM  ZX_PROCESS_RESULTS pr
1483                          WHERE pr.TAX_RULE_ID = r.TAX_RULE_ID
1484                            AND pr.Enabled_Flag = 'Y')
1485     ORDER BY PRIORITY;
1486 
1487   CURSOR  get_det_factor_templ_csr_e
1488     (c_service_type_code        ZX_RULES_B.SERVICE_TYPE_CODE%TYPE,
1489      c_tax                      ZX_TAXES_B.TAX%TYPE,
1490      c_tax_regime_code          ZX_REGIMES_B.TAX_REGIME_CODE%TYPE,
1491      c_tax_determine_date       ZX_LINES.TAX_DETERMINE_DATE%TYPE,
1492      c_event_class_mapping_id   ZX_RULES_B.EVENT_CLASS_MAPPING_ID%TYPE,
1493      c_tax_event_class_code     ZX_RULES_B.TAX_EVENT_CLASS_CODE%TYPE
1494      )
1495   IS
1496     SELECT     TAX_RULE_ID,
1497                TAX,
1498                TAX_REGIME_CODE,
1499                DET_FACTOR_TEMPL_CODE,
1500                DETERMINING_FACTOR_CQ_CODE,
1501 	       GEOGRAPHY_TYPE,
1502                GEOGRAPHY_ID
1503       FROM     ZX_SCO_RULES_B_V  r
1504       WHERE    SERVICE_TYPE_CODE = c_service_type_code
1505         AND    TAX = c_tax
1506         AND    TAX_REGIME_CODE = c_tax_regime_code
1507         AND    c_tax_determine_date >= EFFECTIVE_FROM
1508         AND    (c_tax_determine_date <= EFFECTIVE_TO OR
1509                 EFFECTIVE_TO IS NULL)
1510         AND    System_Default_Flag <> 'Y'
1511         AND    (TAX_EVENT_CLASS_CODE IS NULL OR
1512                 TAX_EVENT_CLASS_CODE = c_tax_event_class_code)
1513         AND    (EVENT_CLASS_MAPPING_ID IS NULL OR
1514                 EVENT_CLASS_MAPPING_ID = c_event_class_mapping_id)
1515         AND    Enabled_Flag  = 'Y'
1516         AND    EXISTS (SELECT  result_id
1517                          FROM  ZX_PROCESS_RESULTS pr
1518                          WHERE pr.TAX_RULE_ID = r.TAX_RULE_ID
1519                            AND pr.Enabled_Flag = 'Y')
1520     ORDER BY EVENT_CLASS_MAPPING_ID NULLS LAST,
1521              TAX_EVENT_CLASS_CODE NULLS LAST,
1522              PRIORITY;
1523 
1524 
1525   l_det_factor_templ_cd_tbl             DET_FACTOR_TEMPL_CODE_TBL;
1526   l_tax_tbl                             TAX_TBL;
1527   l_tax_regime_code_tbl                 TAX_REGIME_CODE_TBL;
1528   l_tax_rule_id_tbl                     TAX_RULE_ID_TBL;
1529 
1530   --Bug 4670938 - Changed the type since EVENT_CLASS_CODE is removed from zx_rules_b
1531   l_source_event_class_code	ZX_EVNT_CLS_MAPPINGS.EVENT_CLASS_CODE%TYPE;
1532 
1533   --CR#4255160. Added new variables to store the Rule level Determining Factor CQ,
1534   -- Geography type and Geography Id
1535   l_rule_det_factor_cq_tbl              RULE_DET_FACTOR_CQ_TBL;
1536   l_rule_geography_type_tbl 	        RULE_GEOGRAPHY_TYPE_TBL;
1537   l_rule_geography_id_tbl		RULE_GEOGRAPHY_ID_TBL;
1538 BEGIN
1539 
1540   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
1541 
1542   /*Bug fix 4017396*/
1543   IF (g_level_procedure >= g_current_runtime_level ) THEN
1544     FND_LOG.STRING(g_level_procedure,
1545                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.fetch_proc_det_factor_templ.BEGIN',
1546                    'ZX_TDS_RULE_BASE_DETM_PVT: fetch_proc_det_factor_templ(+)');
1547   END IF;
1548 
1549   IF (g_level_statement >= g_current_runtime_level ) THEN
1550     FND_LOG.STRING(g_level_statement,
1551                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.fetch_proc_det_factor_templ',
1552                    'source_event_class_mapping_id : ' ||
1553                    TO_CHAR(p_event_class_rec.source_event_class_mapping_id) ||
1554                    ', source_tax_event_class_code: ' ||
1555                    p_event_class_rec.source_tax_event_class_code ||
1556                    ', event_class_mapping_id : ' ||
1557                    TO_CHAR(p_event_class_rec.event_class_mapping_id) ||
1558                    ', tax_event_class_code: ' ||
1559                    p_event_class_rec.tax_event_class_code);
1560 
1561   END IF;
1562 
1563   p_return_status := FND_API.G_RET_STS_SUCCESS; --Included as part of Bug fix 4017396
1564 
1565   IF p_event_class_rec.source_event_class_mapping_id IS NOT NULL THEN
1566 
1567     get_tsrm_alphanum_value(
1568 	 	       p_structure_name,
1569 		       p_structure_index,
1570 		       'SOURCE_EVENT_CLASS_CODE',
1571 			l_source_event_class_code,
1572 		 	p_return_status,
1573 			p_error_buffer);
1574 
1575     IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1576       IF (g_level_error >= g_current_runtime_level ) THEN
1577         FND_LOG.STRING(g_level_error,
1578           'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.fetch_proc_det_factor_templ',
1579           'Incorrect return_status after call get_tsrm_alphanum_value().'||
1580           ', Return_status: '|| p_return_status);
1581       END IF;
1582       RETURN;
1583     END IF;
1584     --
1585     -- Bug#4653492- do nothing if this is intercompany trx
1586     --
1587     IF l_source_event_class_code = 'INTERCOMPANY_TRX' THEN
1588 
1589        IF (g_level_statement >= g_current_runtime_level ) THEN
1590 		FND_LOG.STRING(g_level_statement,
1591 		'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.fetch_proc_det_factor_templ',
1592 		'for intercompany trx, skip rules for the source event class and source tax event class');
1593        END IF;
1594     ELSE
1595 
1596       -- Firstly, pick rules for source event mapping, tax regime, tax
1597 
1598       -- Bug 4670938 - Fetch the source_event_class_mapping_id from event_class_rec
1599       -- and pass it to the cursor since we no longer store the Application Event class code
1600       -- on Rules, but store only the event_class_mapping_id
1601 
1602       OPEN get_det_factor_templ_csr_c
1603            (p_service_type_code,
1604    	    p_tax,
1605 	    p_tax_regime_code,
1606 	    p_tax_determine_date,
1607             p_event_class_rec.source_event_class_mapping_id);
1608       LOOP
1609         FETCH get_det_factor_templ_csr_c BULK COLLECT INTO
1610 				        l_tax_rule_id_tbl,
1611 				        l_tax_tbl,
1612 				        l_tax_regime_code_tbl,
1613 				        l_det_factor_templ_cd_tbl,
1614 				        l_rule_det_factor_cq_tbl,
1615 				        l_rule_geography_type_tbl,
1616 				        l_rule_geography_id_tbl
1617 			         LIMIT C_LINES_PER_COMMIT;
1618 
1619              --CR#4255160 - Added new parameters for Detfactor CQ, Geo type and Geo Id
1620           proc_det_factor_templ(
1621             p_structure_name,
1622             p_structure_index,
1623             l_det_factor_templ_cd_tbl,
1624             p_tax_status_code,
1625             p_event_class_rec,
1626             l_tax_tbl,
1627             p_tax_determine_date,
1628             p_recovery_type_code,
1629             p_found,
1630             l_tax_regime_code_tbl,
1631             p_service_type_code,
1632             l_tax_rule_id_tbl,
1633             l_rule_det_factor_cq_tbl,
1634             l_rule_geography_type_tbl,
1635             l_rule_geography_id_tbl,
1636             p_zx_result_rec,
1637             p_return_status,
1638             p_error_buffer);
1639 
1640           IF (p_return_status <> FND_API.G_RET_STS_SUCCESS ) THEN
1641             CLOSE get_det_factor_templ_csr_c;
1642 
1643             IF (g_level_error >= g_current_runtime_level ) THEN
1644               FND_LOG.STRING(g_level_error,
1645                 'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.fetch_proc_det_factor_templ',
1646                 'Incorrect return_status after call proc_det_factor_templ().'||
1647                 ', Return_status: '|| p_return_status);
1648             END IF;
1649 
1650             RETURN;    --EXIT;
1651           END IF;
1652 
1653           IF (get_det_factor_templ_csr_c%NOTFOUND OR p_found) THEN
1654             IF (g_level_statement >= g_current_runtime_level ) THEN
1655 	      FND_LOG.STRING(g_level_statement,
1656                              'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.fetch_proc_det_factor_templ',
1657 	                     'get_det_factor_templ_csr_c row count ' ||
1658                              TO_CHAR(get_det_factor_templ_csr_c%rowcount));
1659             END IF;
1660             CLOSE get_det_factor_templ_csr_c;
1661             EXIT;
1662           END IF;
1663       END LOOP; -- bulk fetch template get_det_factor_templ_csr_c
1664 
1665       IF get_det_factor_templ_csr_c%ISOPEN THEN
1666         CLOSE get_det_factor_templ_csr_c;
1667       END IF;
1668 
1669       IF NOT p_found THEN
1670        -- Secondly, pick rules for source tax event class, tax regime, tax
1671        IF (p_event_class_rec.source_tax_event_class_code <>
1672            p_event_class_rec.tax_event_class_code) THEN
1673          OPEN get_det_factor_templ_csr_d(
1674                                    p_service_type_code,
1675 	                           p_tax,
1676 	                           p_tax_regime_code,
1677 	                           p_tax_determine_date,
1678 				   p_event_class_rec.source_tax_event_class_code);
1679          LOOP
1680            FETCH get_det_factor_templ_csr_d BULK COLLECT INTO
1681 				      l_tax_rule_id_tbl,
1682 				      l_tax_tbl,
1683 				      l_tax_regime_code_tbl,
1684 				      l_det_factor_templ_cd_tbl,
1685 				      l_rule_det_factor_cq_tbl,
1686 	  			      l_rule_geography_type_tbl,
1687 				      l_rule_geography_id_tbl
1688 			       LIMIT C_LINES_PER_COMMIT;
1689 
1690             --CR#4255160 - Added new parameters for Det factor CQ, Geo type and Geo Id
1691             proc_det_factor_templ(
1692                   p_structure_name,
1693                   p_structure_index,
1694                   l_det_factor_templ_cd_tbl,
1695                   p_tax_status_code,
1696                   p_event_class_rec,
1697                   l_tax_tbl,
1698                   p_tax_determine_date,
1699                   p_recovery_type_code,
1700                   p_found,
1701                   l_tax_regime_code_tbl,
1702                   p_service_type_code,
1703                   l_tax_rule_id_tbl,
1704                   l_rule_det_factor_cq_tbl,
1705                   l_rule_geography_type_tbl,
1706                   l_rule_geography_id_tbl,
1707                   p_zx_result_rec,
1708                   p_return_status,
1709                   p_error_buffer);
1710 
1711             IF (p_return_status <> FND_API.G_RET_STS_SUCCESS ) THEN
1712           	CLOSE get_det_factor_templ_csr_d;
1713 
1714                 IF (g_level_error >= g_current_runtime_level ) THEN
1715                   FND_LOG.STRING(g_level_error,
1716                     'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.fetch_proc_det_factor_templ',
1717                     'Incorrect return_status after call proc_det_factor_templ().'||
1718                     ', Return_status: '|| p_return_status);
1719                 END IF;
1720 
1721           	RETURN;     --EXIT;
1722             END IF;
1723 
1724             IF (get_det_factor_templ_csr_d%NOTFOUND OR p_found) THEN
1725               IF (g_level_statement >= g_current_runtime_level ) THEN
1726             	FND_LOG.STRING(g_level_statement,
1727 		               'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.fetch_proc_det_factor_templ',
1728 		               'get_det_factor_templ_csr_d row count ' ||
1729                                 TO_CHAR(get_det_factor_templ_csr_d%rowcount));
1730               END IF;
1731               CLOSE get_det_factor_templ_csr_d;
1732               EXIT;
1733             END IF;
1734            END LOOP; 		-- bulk fetch template get_det_factor_templ_csr_d
1735 
1736            IF get_det_factor_templ_csr_d%ISOPEN THEN
1737              CLOSE get_det_factor_templ_csr_d;
1738            END IF;
1739 
1740         END IF; 	        -- p_event_class_rec.source_tax_event_class_code <> p_event_class_rec.tax_event_class_code
1741       END IF; 		 	-- p_found
1742     END IF;  			-- l_source_event_class_code = 'INTERCOMPANY_TRX'
1743   END IF; -- End check for source_event_class_mapping_id
1744 
1745   IF NOT p_found THEN
1746 
1747     -- thirdly, pick rules for current event mapping, application, tax regime, tax
1748     -- then, pick rules for current tax event class, tax regime, tax
1749     -- then, pick rules for null event mapping, null tax event class, and tax regime and tax
1750 
1751     --Bug 4670938 - Replaced event_class_code by event_class_mapping_id
1752     OPEN get_det_factor_templ_csr_e(p_service_type_code,
1753 	                          p_tax,
1754 	                          p_tax_regime_code,
1755 	                          p_tax_determine_date,
1756 				  p_event_class_rec.event_class_mapping_id,
1757 				  p_event_class_rec.tax_event_class_code);
1758     LOOP
1759       FETCH get_det_factor_templ_csr_e BULK COLLECT INTO
1760 		        l_tax_rule_id_tbl,
1761 		        l_tax_tbl,
1762 		        l_tax_regime_code_tbl,
1763 		        l_det_factor_templ_cd_tbl,
1764 		        l_rule_det_factor_cq_tbl,
1765 			l_rule_geography_type_tbl,
1766 		        l_rule_geography_id_tbl
1767 		      LIMIT C_LINES_PER_COMMIT;
1768 
1769       --CR#4255160 - Added new parameters for Det factor CQ, Geo type and Geo Id
1770       proc_det_factor_templ(
1771                      p_structure_name,
1772                      p_structure_index,
1773                      l_det_factor_templ_cd_tbl,
1774                      p_tax_status_code,
1775                      p_event_class_rec,
1776                      l_tax_tbl,
1777                      p_tax_determine_date,
1778                      p_recovery_type_code,
1779                      p_found,
1780                      l_tax_regime_code_tbl,
1781                      p_service_type_code,
1782                      l_tax_rule_id_tbl,
1783                      l_rule_det_factor_cq_tbl,
1784                      l_rule_geography_type_tbl,
1785                      l_rule_geography_id_tbl,
1786                      p_zx_result_rec,
1787                      p_return_status,
1788                      p_error_buffer);
1789 
1790         IF (p_return_status <> FND_API.G_RET_STS_SUCCESS ) THEN
1791           CLOSE get_det_factor_templ_csr_e;
1792 
1793           IF (g_level_error >= g_current_runtime_level ) THEN
1794             FND_LOG.STRING(g_level_error,
1795               'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.fetch_proc_det_factor_templ',
1796               'Incorrect return_status after call proc_det_factor_templ().'||
1797               ', Return_status: '|| p_return_status);
1798           END IF;
1799 
1800           RETURN;     --EXIT;
1801         END IF;
1802 
1803         IF (get_det_factor_templ_csr_e%NOTFOUND OR p_found) THEN
1804           IF (g_level_statement >= g_current_runtime_level ) THEN
1805             FND_LOG.STRING(g_level_statement,
1806 	                   'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.fetch_proc_det_factor_templ',
1807 			   'get_det_factor_templ_csr_e row count ' ||
1808                             TO_CHAR(get_det_factor_templ_csr_e%rowcount));
1809           END IF;
1810           CLOSE get_det_factor_templ_csr_e;
1811           EXIT;
1812         END IF;
1813 
1814     END LOOP; -- bulk fetch template get_det_factor_templ_csr_e
1815 
1816     IF get_det_factor_templ_csr_e%ISOPEN THEN
1817       CLOSE get_det_factor_templ_csr_e;
1818     END IF;
1819 
1820   END IF;     -- process of current event mapping and tax event class code
1821 
1822   IF (g_level_procedure >= g_current_runtime_level ) THEN
1823     FND_LOG.STRING(g_level_procedure,
1824                     'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.fetch_proc_det_factor_templ.END',
1825                     'ZX_TDS_RULE_BASE_DETM_PVT: fetch_proc_det_factor_templ(-)' ||
1826                     ', p_return_status = ' || p_return_status ||
1827                     ', p_error_buffer = ' || p_error_buffer);
1828   END IF;
1829 
1830   EXCEPTION
1831     WHEN OTHERS THEN
1832       p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1833       p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
1834       IF get_det_factor_templ_csr_c%ISOPEN THEN
1835         CLOSE get_det_factor_templ_csr_c;
1836       ELSIF get_det_factor_templ_csr_d%ISOPEN THEN
1837         CLOSE get_det_factor_templ_csr_d;
1838       ELSIF get_det_factor_templ_csr_e%ISOPEN THEN
1839         CLOSE get_det_factor_templ_csr_e;
1840       END IF;
1841 
1842       IF (g_level_unexpected >= g_current_runtime_level ) THEN
1843         FND_LOG.STRING(g_level_unexpected,
1844                          'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.fetch_proc_det_factor_templ',
1845                           p_error_buffer);
1846       END IF;
1847 
1848 END FETCH_PROC_DET_FACTOR_TEMPL;
1849 
1850 ----------------------------------------------------------------------
1851 --  PRIVATE PROCEDURE
1852 --  get_rule_from_regime_hier
1853 --
1854 --  DESCRIPTION
1855 --  This procedure gets determining factor templates defined for rules
1856 --  at parent regime levels
1857 --
1858 --  History
1859 --
1860 --    Phong La                    03-JUN-02  Created
1861 
1862 
1863 PROCEDURE get_rule_from_regime_hier(
1864             p_service_type_code    IN     ZX_RULES_B.SERVICE_TYPE_CODE%TYPE,
1865             p_structure_name       IN     VARCHAR2,
1866             p_structure_index      IN     BINARY_INTEGER,
1867             p_event_class_rec      IN     ZX_API_PUB.EVENT_CLASS_REC_TYPE,
1868             p_tax_status_code      IN     ZX_STATUS_B.TAX_STATUS_CODE%TYPE,
1869             p_tax_determine_date   IN     ZX_LINES.TAX_DETERMINE_DATE%TYPE,
1870             p_recovery_type_code   IN     ZX_RULES_B.RECOVERY_TYPE_CODE%TYPE,
1871             p_zx_result_rec           OUT NOCOPY ZX_PROCESS_RESULTS%ROWTYPE,
1872             p_found                IN OUT NOCOPY BOOLEAN,
1873             p_parent_regime_cd_tbl IN     TAX_REGIME_CODE_TBL,
1874             p_return_status           OUT NOCOPY VARCHAR2,
1875             p_error_buffer            OUT NOCOPY VARCHAR2)
1876 
1877 IS
1878 
1879   l_det_factor_templ_cd_tbl     DET_FACTOR_TEMPL_CODE_TBL;
1880   l_tax_tbl                     TAX_TBL;
1881   l_tax_regime_code_tbl         TAX_REGIME_CODE_TBL;
1882   l_tax_rule_id_tbl             TAX_RULE_ID_TBL;
1883   l_count                       NUMBER;
1884 
1885   --CR#4255160. Added new variables to store the Rule level Determining Factor CQ,
1886 	-- Geography type and Geography Id
1887 	l_rule_det_factor_cq_tbl              RULE_DET_FACTOR_CQ_TBL;
1888 	l_rule_geography_type_tbl 						RULE_GEOGRAPHY_TYPE_TBL;
1889 	l_rule_geography_id_tbl								RULE_GEOGRAPHY_ID_TBL;
1890 
1891 
1892   CURSOR  get_templ_from_regime_hier_csr
1893     (c_service_type_code        ZX_RULES_B.SERVICE_TYPE_CODE%TYPE,
1894      c_tax_regime_code          ZX_REGIMES_B.TAX_REGIME_CODE%TYPE,
1895      c_tax_determine_date       ZX_LINES.TAX_DETERMINE_DATE%TYPE,
1896      c_recovery_type_code       ZX_RULES_B.RECOVERY_TYPE_CODE%TYPE,
1897      c_tax_status_code          ZX_STATUS_B.TAX_STATUS_CODE%TYPE,
1898      c_reference_application_id ZX_RULES_B.APPLICATION_ID%TYPE)
1899   IS
1900   SELECT     TAX_RULE_ID, TAX,  TAX_REGIME_CODE, DET_FACTOR_TEMPL_CODE,
1901   					 DETERMINING_FACTOR_CQ_CODE,
1902   					 GEOGRAPHY_TYPE,
1903   					 GEOGRAPHY_ID
1904     FROM     ZX_SCO_RULES_B_V r
1905     WHERE    SERVICE_TYPE_CODE = c_service_type_code
1906       AND    TAX IS NULL
1907       AND    TAX_REGIME_CODE = c_tax_regime_code
1908       AND    c_tax_determine_date >= EFFECTIVE_FROM
1909       AND    (c_tax_determine_date <= EFFECTIVE_TO OR
1910               EFFECTIVE_TO IS NULL)
1911       AND    (RECOVERY_TYPE_CODE   = c_recovery_type_code OR
1912               RECOVERY_TYPE_CODE IS NULL)
1913       AND    NVL(System_Default_Flag, 'N')  <> 'Y'
1914       AND    (APPLICATION_ID = c_reference_application_id OR
1915               APPLICATION_ID IS NULL)
1916       AND    Enabled_Flag  = 'Y'
1917       AND    EXISTS (SELECT result_id
1918                        FROM ZX_PROCESS_RESULTS pr
1919                        WHERE pr.TAX_RULE_ID = r.TAX_RULE_ID)
1920     ORDER BY PRIORITY;
1921 
1922 BEGIN
1923   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
1924 
1925   IF (g_level_procedure >= g_current_runtime_level ) THEN
1926     FND_LOG.STRING(g_level_procedure,
1927                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_rule_from_regime_hier.BEGIN',
1928                    'ZX_TDS_RULE_BASE_DETM_PVT: get_rule_from_regime_hier(+)');
1929   END IF;
1930 
1931   p_return_status := FND_API.G_RET_STS_SUCCESS;
1932 
1933   l_count := p_parent_regime_cd_tbl.count;
1934 
1935   IF (g_level_statement >= g_current_runtime_level ) THEN
1936     FND_LOG.STRING(g_level_statement,
1937                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_rule_from_regime_hier',
1938                    'parent regime count: ' || to_char(l_count));
1939   END IF;
1940 
1941   FOR  i IN 1.. l_count LOOP
1942 
1943     IF (g_level_statement >= g_current_runtime_level ) THEN
1944       FND_LOG.STRING(g_level_statement,
1945                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_rule_from_regime_hier',
1946                      'parent regime: ' || p_parent_regime_cd_tbl(i));
1947     END IF;
1948 
1949     --
1950     -- get templates from ZX_RULES_B table.
1951     --
1952 
1953     OPEN get_templ_from_regime_hier_csr(p_service_type_code,
1954                                         p_parent_regime_cd_tbl(i),
1955                                         p_tax_determine_date,
1956                                         p_recovery_type_code,
1957                                         p_tax_status_code,
1958                                         p_event_class_rec.application_id);
1959 
1960     LOOP
1961       FETCH get_templ_from_regime_hier_csr bulk collect into
1962           l_tax_rule_id_tbl,
1963           l_tax_tbl,
1964           l_tax_regime_code_tbl,
1965           l_det_factor_templ_cd_tbl,
1966           l_rule_det_factor_cq_tbl ,
1967           l_rule_geography_type_tbl,
1968           l_rule_geography_id_tbl
1969       LIMIT C_LINES_PER_COMMIT;
1970 
1971       --CR#4255160 - Added new parameters for Det factor CQ, Geo type and Geo Id
1972       proc_det_factor_templ(
1973            p_structure_name,
1974            p_structure_index,
1975            l_det_factor_templ_cd_tbl,
1976            p_tax_status_code,
1977            p_event_class_rec,
1978            l_tax_tbl,
1979            p_tax_determine_date,
1980            p_recovery_type_code,
1981            p_found,
1982            l_tax_regime_code_tbl,
1983            p_service_type_code,
1984            l_tax_rule_id_tbl,
1985            l_rule_det_factor_cq_tbl ,
1986 	   l_rule_geography_type_tbl,
1987            l_rule_geography_id_tbl,
1988            p_zx_result_rec,
1989            p_return_status,
1990            p_error_buffer);
1991       IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1992         CLOSE get_templ_from_regime_hier_csr;
1993 
1994         IF (g_level_error >= g_current_runtime_level ) THEN
1995           FND_LOG.STRING(g_level_error,
1996             'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.fetch_proc_det_factor_templ',
1997             'Incorrect return_status after call proc_det_factor_templ().'||
1998             ', Return_status: '|| p_return_status);
1999         END IF;
2000 
2001         EXIT;
2002       END IF;
2003 
2004       IF (get_templ_from_regime_hier_csr%notfound  OR p_found) THEN
2005         CLOSE get_templ_from_regime_hier_csr;
2006 
2007         IF (g_level_error >= g_current_runtime_level ) THEN
2008           FND_LOG.STRING(g_level_error,
2009             'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.fetch_proc_det_factor_templ',
2010             'Incorrect return_status after call proc_det_factor_templ().' ||
2011             ', Return_status: '|| p_return_status);
2012         END IF;
2013 
2014         EXIT;
2015       END IF;
2016 
2017     END LOOP; -- bulk fetch template.
2018 
2019     IF get_templ_from_regime_hier_csr%ISOPEN THEN
2020       CLOSE get_templ_from_regime_hier_csr;
2021     END IF;
2022 
2023     EXIT WHEN (p_found OR p_return_status = FND_API.G_RET_STS_ERROR);
2024   END LOOP;
2025 
2026   IF (g_level_procedure >= g_current_runtime_level ) THEN
2027     FND_LOG.STRING(g_level_procedure,
2028                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_rule_from_regime_hier.END',
2029                    'ZX_TDS_RULE_BASE_DETM_PVT: get_rule_from_regime_hier(-)' ||
2030                    ', p_return_status = ' || p_return_status ||
2031                    ', p_error_buffer  = ' || p_error_buffer);
2032   END IF;
2033 
2034   EXCEPTION
2035     WHEN OTHERS THEN
2036       p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2037       p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
2038       IF get_templ_from_regime_hier_csr%ISOPEN THEN
2039         CLOSE get_templ_from_regime_hier_csr;
2040       END IF;
2041 
2042       IF (g_level_unexpected >= g_current_runtime_level ) THEN
2043         FND_LOG.STRING(g_level_unexpected,
2044                        'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_rule_from_regime_hier',
2045                         p_error_buffer);
2046       END IF;
2047 
2048 END get_rule_from_regime_hier;
2049 
2050 ----------------------------------------------------------------------
2051 --  PRIVATE PROCEDURE
2052 --  proc_det_factor_templ
2053 --
2054 --  DESCRIPTION
2055 --    This procedure processes all condition groups for each determining
2056 --    factor template
2057 --
2058 PROCEDURE proc_det_factor_templ(
2059             p_structure_name          IN     VARCHAR2,
2060             p_structure_index         IN     BINARY_INTEGER,
2061             p_det_factor_templ_cd_tbl IN     det_factor_templ_code_tbl,
2062             p_tax_status_code         IN     ZX_STATUS_B.TAX_STATUS_CODE%TYPE,
2063             p_event_class_rec         IN     ZX_API_PUB.EVENT_CLASS_REC_TYPE,
2064             p_tax_tbl                 IN     TAX_TBL,
2065             p_tax_determine_date      IN     ZX_LINES.TAX_DETERMINE_DATE%TYPE,
2066             p_recovery_type_code      IN     ZX_RULES_B.RECOVERY_TYPE_CODE%TYPE,
2067             p_found                   IN OUT NOCOPY BOOLEAN,
2068             p_tax_regime_code_tbl     IN     TAX_REGIME_CODE_TBL,
2069             p_service_type_code       IN     ZX_RULES_B.SERVICE_TYPE_CODE%TYPE,
2070             p_tax_rule_id_tbl         IN     TAX_RULE_ID_TBL,
2071             p_rule_det_factor_cq_tbl  IN		 RULE_DET_FACTOR_CQ_TBL,
2072             p_rule_geography_type_tbl IN     RULE_GEOGRAPHY_TYPE_TBL,
2073             p_rule_geography_id_tbl   IN     RULE_GEOGRAPHY_ID_TBL,
2074             p_zx_result_rec              OUT NOCOPY ZX_PROCESS_RESULTS%ROWTYPE,
2075             p_return_status              OUT NOCOPY VARCHAR2,
2076             p_error_buffer               OUT NOCOPY VARCHAR2)
2077 IS
2078   l_count                  NUMBER;
2079   l_det_factor_templ_code  ZX_DET_FACTOR_TEMPL_B.det_factor_templ_code%TYPE;
2080   l_result                 BOOLEAN;
2081   l_result_id              ZX_PROCESS_RESULTS.RESULT_ID%TYPE;
2082   l_valid                  BOOLEAN;
2083 
2084   --CR#4255160 - Added new variables to store the Geography context related information
2085   l_rule_det_factor_cq      ZX_RULES_B.DETERMINING_FACTOR_CQ_CODE%TYPE;
2086   l_rule_geography_type			ZX_RULES_B.GEOGRAPHY_TYPE%TYPE;
2087   l_rule_geography_id				ZX_RULES_B.GEOGRAPHY_ID%TYPE;
2088 
2089 BEGIN
2090   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
2091   IF (g_level_procedure >= g_current_runtime_level ) THEN
2092     FND_LOG.STRING(g_level_procedure,
2093                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.proc_det_factor_templ.BEGIN',
2094                    'ZX_TDS_RULE_BASE_DETM_PVT: proc_det_factor_templ(+)');
2095   END IF;
2096 
2097   p_return_status := FND_API.G_RET_STS_SUCCESS;
2098   l_valid         := TRUE;
2099 
2100   l_count := p_det_factor_templ_cd_tbl.count;
2101 
2102   IF (g_level_statement >= g_current_runtime_level ) THEN
2103     FND_LOG.STRING(g_level_statement,
2104                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.proc_det_factor_templ',
2105                    'determining factor template count: ' || to_char(l_count));
2106   END IF;
2107 
2108 
2109   FOR i IN 1.. l_count LOOP
2110 
2111     l_valid := TRUE;
2112 
2113 		--CR#4255160 - Process only those Rules which have been definied specifically for the Geography
2114 		--on the Document or a Generic Rule, not defined specific to any Geography.
2115 		l_rule_det_factor_cq  := p_rule_det_factor_cq_tbl(i);
2116 		l_rule_geography_type := p_rule_geography_type_tbl(i);
2117 		l_rule_geography_id   := p_rule_geography_id_tbl(i);
2118 
2119 		IF (g_level_statement >= g_current_runtime_level ) THEN
2120 			FND_LOG.STRING(g_level_statement,
2121 			  'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.proc_det_factor_templ',
2122 			  'l_rule_det_factor_cq: '||l_rule_det_factor_cq ||
2123 			  ', l_rule_geography_type: '||l_rule_geography_type ||
2124 			  ', l_rule_geography_id:'||l_rule_geography_id);
2125 		END IF;
2126 
2127 		IF (l_rule_det_factor_cq  IS NOT NULL AND
2128 				l_rule_geography_type IS NOT NULL AND
2129 				l_rule_geography_id   IS NOT NULL) THEN
2130 			check_rule_geography(
2131 			  p_structure_name,
2132 			  p_structure_index,
2133 			  l_rule_det_factor_cq,
2134 			  l_rule_geography_type,
2135 			  l_rule_geography_id,
2136 			  p_event_class_rec,
2137 			  l_valid,
2138 			  p_return_status,
2139 			  p_error_buffer);
2140 		END IF;
2141 
2142 		IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2143 		  IF g_level_error >= g_current_runtime_level THEN
2144 		    FND_LOG.STRING(g_level_error,
2145 				'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.proc_det_factor_templ',
2146 				' check_rule_geography returned Error');
2147 		  END IF;
2148 		  RETURN;
2149 		END IF;
2150 
2151 
2152 		--Continue processing the Rule only if the Rule's geography
2153 		--matched with the one cached in the gloabl location structure
2154 
2155 		IF(l_valid AND p_return_status = FND_API.G_RET_STS_SUCCESS) THEN
2156 			--
2157 			-- process 1 template at a time
2158 			--
2159 
2160 			l_det_factor_templ_code := p_det_factor_templ_cd_tbl(i);
2161 
2162 			IF (g_level_statement >= g_current_runtime_level ) THEN
2163 				FND_LOG.STRING(g_level_statement,
2164 				'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.proc_det_factor_templ',
2165 				'l_det_factor_templ_code: '||l_det_factor_templ_code);
2166 			END IF;
2167 
2168 
2169 			-- Bug 4166241 : for the template, check if the parameters associated with the determining factors
2170 			-- are supported for the given Application
2171 
2172 			check_templ_tax_parameter(
2173 			  l_det_factor_templ_code,
2174 			  p_event_class_rec,
2175 			  l_valid,
2176 			  p_return_status,
2177 			  p_error_buffer);
2178 
2179 			-- process the template only if it is valid for the given application
2180 			IF (l_valid AND p_return_status = FND_API.G_RET_STS_SUCCESS) THEN
2181 
2182 				-- get all the condition groups and conditions
2183 				proc_condition_group_per_templ(
2184 				  p_structure_name,
2185 				  p_structure_index,
2186 				  l_det_factor_templ_code,
2187 				  p_event_class_rec,
2188 				  p_tax_tbl(i),
2189 				  p_tax_regime_code_tbl(i),
2190 				  p_tax_determine_date,
2191 				  p_service_type_code,
2192 				  p_tax_rule_id_tbl(i),
2193 				  p_tax_status_code,
2194 				  l_result,
2195 				  l_result_id,
2196                                   p_found,
2197                                   p_zx_result_rec,
2198 				  p_return_status,
2199 				  p_error_buffer);
2200 
2201 				-- if the whole condition is satisfied, put result to p_zx_result_rec
2202                                /* moved get_result call inside
2203  * proc_condition_group_per_templ
2204 				IF (l_result) THEN
2205 					get_result(
2206 					  l_result_id,
2207 					  p_structure_name,
2208 					  p_structure_index,
2209 					  p_tax_regime_code_tbl(i),
2210 					  p_tax_tbl(i),
2211 					  p_tax_determine_date,
2212 					  p_found,
2213 					  p_zx_result_rec,
2214 					  p_return_status,
2215 					  p_error_buffer);
2216 				END IF; --l_result
2217                                 */
2218 				EXIT WHEN (p_found OR p_return_status <> FND_API.G_RET_STS_SUCCESS);
2219 			END IF; --l_valid
2220 		END IF; --l_valid for check_rule_geography
2221   END LOOP;
2222 
2223   IF (g_level_procedure >= g_current_runtime_level ) THEN
2224     FND_LOG.STRING(g_level_procedure,
2225                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.proc_det_factor_templ.END',
2226                    'ZX_TDS_RULE_BASE_DETM_PVT: proc_det_factor_templ(-)');
2227   END IF;
2228 
2229 EXCEPTION
2230   WHEN OTHERS THEN
2231     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2232     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
2233 
2234     IF (g_level_unexpected >= g_current_runtime_level ) THEN
2235       FND_LOG.STRING(g_level_unexpected,
2236                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.proc_det_factor_templ',
2237                       p_error_buffer);
2238     END IF;
2239 
2240 END proc_det_factor_templ;
2241 
2242 ----------------------------------------------------------------------
2243 --  PRIVATE PROCEDURE
2244 --  proc_condition_group_per_templ
2245 --
2246 --  DESCRIPTION
2247 --    This procedure processes all condition groups of a template
2248 --
2249 
2250 PROCEDURE proc_condition_group_per_templ(
2251             p_structure_name      IN     VARCHAR2,
2252             p_structure_index     IN     BINARY_INTEGER,
2253             p_det_factor_templ_code       IN
2254                   ZX_DET_FACTOR_TEMPL_B.DET_FACTOR_TEMPL_CODE%TYPE,
2255             p_event_class_rec     IN     ZX_API_PUB.EVENT_CLASS_REC_TYPE,
2256             p_tax                 IN     ZX_TAXES_B.TAX%TYPE,
2257             p_tax_regime_code     IN     ZX_REGIMES_B.TAX_REGIME_CODE%TYPE,
2258             p_tax_determine_date  IN     ZX_LINES.TAX_DETERMINE_DATE%TYPE,
2259             p_service_type_code   IN     ZX_RULES_B.SERVICE_TYPE_CODE%TYPE,
2260             p_tax_rule_id         IN     ZX_RULES_B.TAX_RULE_ID%TYPE,
2261             p_tax_status_code     IN     ZX_STATUS_B.TAX_STATUS_CODE%TYPE,
2262             p_result              IN OUT NOCOPY BOOLEAN,
2263             p_result_id           IN OUT NOCOPY NUMBER,
2264             p_found	            OUT NOCOPY BOOLEAN ,
2265             p_zx_result_rec          OUT NOCOPY ZX_PROCESS_RESULTS%ROWTYPE,
2266             p_return_status          OUT NOCOPY VARCHAR2,
2267             p_error_buffer           OUT NOCOPY VARCHAR2)
2268 
2269 IS
2270 
2271   l_condition_group_code_tbl              condition_group_code_tbl;
2272   l_condition_group_id_tbl                condition_group_id_tbl;
2273   l_more_than10_tbl                       more_than10_tbl;
2274   l_chart_of_accounts_id_tbl              chart_of_accounts_id_tbl;
2275   l_sob_id_tbl                            ledger_id_tbl;
2276   l_det_factor_class1_tbl                 determining_factor_class_tbl;
2277   l_determining_factor_cq1_tbl            determining_factor_cq_tbl;
2278   l_tax_parameter_code1_tbl               tax_parameter_code_tbl;
2279   l_data_type1_tbl                        data_type_tbl;
2280   l_det_factor_code1_tbl                  determining_factor_code_tbl;
2281   l_operator1_tbl                         operator_tbl;
2282   l_numeric_value1_tbl                    numeric_value_tbl;
2283   l_date_value1_tbl                       date_value_tbl;
2284   l_alphanum_value1_tbl                   alphanumeric_value_tbl;
2285   l_value_low1_tbl                        value_low_tbl;
2286   l_value_high1_tbl                       value_high_tbl;
2287   l_det_factor_class2_tbl                 determining_factor_class_tbl;
2288   l_determining_factor_cq2_tbl            determining_factor_cq_tbl;
2289   l_tax_parameter_code2_tbl               tax_parameter_code_tbl;
2290   l_data_type2_tbl                        data_type_tbl;
2291   l_det_factor_code2_tbl                  determining_factor_code_tbl;
2292   l_operator2_tbl                         operator_tbl;
2293   l_numeric_value2_tbl                    numeric_value_tbl;
2294   l_date_value2_tbl                       date_value_tbl;
2295   l_alphanum_value2_tbl                   alphanumeric_value_tbl;
2296   l_value_low2_tbl                        value_low_tbl;
2297   l_value_high2_tbl                       value_high_tbl;
2298   l_det_factor_class3_tbl                 determining_factor_class_tbl;
2299   l_determining_factor_cq3_tbl            determining_factor_cq_tbl;
2300   l_tax_parameter_code3_tbl               tax_parameter_code_tbl;
2301   l_data_type3_tbl                        data_type_tbl;
2302   l_det_factor_code3_tbl                  determining_factor_code_tbl;
2303   l_operator3_tbl                         operator_tbl;
2304   l_numeric_value3_tbl                    numeric_value_tbl;
2305   l_date_value3_tbl                       date_value_tbl;
2306   l_alphanum_value3_tbl                   alphanumeric_value_tbl;
2307   l_value_low3_tbl                        value_low_tbl;
2308   l_value_high3_tbl                       value_high_tbl;
2309   l_det_factor_class4_tbl                 determining_factor_class_tbl;
2310   l_determining_factor_cq4_tbl            determining_factor_cq_tbl;
2311   l_tax_parameter_code4_tbl               tax_parameter_code_tbl;
2312   l_data_type4_tbl                        data_type_tbl;
2313   l_det_factor_code4_tbl                  determining_factor_code_tbl;
2314   l_operator4_tbl                         operator_tbl;
2315   l_numeric_value4_tbl                    numeric_value_tbl;
2316   l_date_value4_tbl                       date_value_tbl;
2317   l_alphanum_value4_tbl                   alphanumeric_value_tbl;
2318   l_value_low4_tbl                        value_low_tbl;
2319   l_value_high4_tbl                       value_high_tbl;
2320   l_det_factor_class5_tbl                 determining_factor_class_tbl;
2321   l_determining_factor_cq5_tbl            determining_factor_cq_tbl;
2322   l_tax_parameter_code5_tbl               tax_parameter_code_tbl;
2323   l_data_type5_tbl                        data_type_tbl;
2324   l_det_factor_code5_tbl                  determining_factor_code_tbl;
2325   l_operator5_tbl                         operator_tbl;
2326   l_numeric_value5_tbl                    numeric_value_tbl;
2327   l_date_value5_tbl                       date_value_tbl;
2328   l_alphanum_value5_tbl                   alphanumeric_value_tbl;
2329   l_value_low5_tbl                        value_low_tbl;
2330   l_value_high5_tbl                       value_high_tbl;
2331   l_det_factor_class6_tbl                 determining_factor_class_tbl;
2332   l_determining_factor_cq6_tbl            determining_factor_cq_tbl;
2333   l_tax_parameter_code6_tbl               tax_parameter_code_tbl;
2334   l_data_type6_tbl                        data_type_tbl;
2335   l_det_factor_code6_tbl                  determining_factor_code_tbl;
2336   l_operator6_tbl                         operator_tbl;
2337   l_numeric_value6_tbl                    numeric_value_tbl;
2338   l_date_value6_tbl                       date_value_tbl;
2339   l_alphanum_value6_tbl                   alphanumeric_value_tbl;
2340   l_value_low6_tbl                        value_low_tbl;
2341   l_value_high6_tbl                       value_high_tbl;
2342   l_det_factor_class7_tbl                 determining_factor_class_tbl;
2343   l_determining_factor_cq7_tbl            determining_factor_cq_tbl;
2344   l_tax_parameter_code7_tbl               tax_parameter_code_tbl;
2345   l_data_type7_tbl                        data_type_tbl;
2346   l_det_factor_code7_tbl                  determining_factor_code_tbl;
2347   l_operator7_tbl                         operator_tbl;
2348   l_numeric_value7_tbl                    numeric_value_tbl;
2349   l_date_value7_tbl                       date_value_tbl;
2350   l_alphanum_value7_tbl                   alphanumeric_value_tbl;
2351   l_value_low7_tbl                        value_low_tbl;
2352   l_value_high7_tbl                       value_high_tbl;
2353   l_det_factor_class8_tbl                 determining_factor_class_tbl;
2354   l_determining_factor_cq8_tbl            determining_factor_cq_tbl;
2355   l_tax_parameter_code8_tbl               tax_parameter_code_tbl;
2356   l_data_type8_tbl                        data_type_tbl;
2357   l_det_factor_code8_tbl                  determining_factor_code_tbl;
2358   l_operator8_tbl                         operator_tbl;
2359   l_numeric_value8_tbl                    numeric_value_tbl;
2360   l_date_value8_tbl                       date_value_tbl;
2361   l_alphanum_value8_tbl                   alphanumeric_value_tbl;
2362   l_value_low8_tbl                        value_low_tbl;
2363   l_value_high8_tbl                       value_high_tbl;
2364   l_det_factor_class9_tbl                 determining_factor_class_tbl;
2365   l_determining_factor_cq9_tbl            determining_factor_cq_tbl;
2366   l_tax_parameter_code9_tbl               tax_parameter_code_tbl;
2367   l_data_type9_tbl                        data_type_tbl;
2368   l_det_factor_code9_tbl                  determining_factor_code_tbl;
2369   l_operator9_tbl                         operator_tbl;
2370   l_numeric_value9_tbl                    numeric_value_tbl;
2371   l_date_value9_tbl                       date_value_tbl;
2372   l_alphanum_value9_tbl                   alphanumeric_value_tbl;
2373   l_value_low9_tbl                        value_low_tbl;
2374   l_value_high9_tbl                       value_high_tbl;
2375   l_det_factor_class10_tbl                determining_factor_class_tbl;
2376   l_determining_factor_cq10_tbl           determining_factor_cq_tbl;
2377   l_tax_parameter_code10_tbl              tax_parameter_code_tbl;
2378   l_data_type10_tbl                       data_type_tbl;
2379   l_det_factor_code10_tbl                 determining_factor_code_tbl;
2380   l_operator10_tbl                        operator_tbl;
2381   l_numeric_value10_tbl                   numeric_value_tbl;
2382   l_date_value10_tbl                      date_value_tbl;
2383   l_alphanum_value10_tbl                  alphanumeric_value_tbl;
2384   l_value_low10_tbl                       value_low_tbl;
2385   l_value_high10_tbl                      value_high_tbl;
2386   l_result_id_tbl                         result_id_tbl;
2387   l_constraint_id_tbl                     constraint_id_tbl;
2388 
2389   l_constraint_result                     BOOLEAN;
2390   l_condition_group_evaluated             BOOLEAN;
2391 
2392   l_counter                               NUMBER;
2393   i                                       NUMBER;
2394   --
2395   -- cursor for condition groups
2396   --
2397 
2398   CURSOR  get_condition_group_codes_csr
2399     (c_det_factor_templ_code  ZX_DET_FACTOR_TEMPL_B.det_factor_templ_code%TYPE,
2400      c_tax_rule_id            ZX_RULES_B.TAX_RULE_ID%TYPE,
2401      c_tax_status_code        ZX_STATUS_B.TAX_STATUS_CODE%TYPE)
2402   IS
2403     SELECT  s.CONDITION_GROUP_ID, s.CONDITION_GROUP_CODE, More_Than_Max_Cond_Flag,
2404             Determining_Factor_Class1_Code, Determining_Factor_Cq1_Code,
2405             Data_Type1_Code, DETERMINING_FACTOR_CODE1,
2406             Operator1_Code, NUMERIC_VALUE1, DATE_VALUE1, ALPHANUMERIC_VALUE1,
2407             VALUE_LOW1, VALUE_HIGH1, TAX_PARAMETER_CODE1,
2408             Determining_Factor_Class2_Code, Determining_Factor_Cq2_Code,
2409             Data_Type2_Code, DETERMINING_FACTOR_CODE2,
2410             Operator2_Code, NUMERIC_VALUE2, DATE_VALUE2, ALPHANUMERIC_VALUE2,
2411             VALUE_LOW2, VALUE_HIGH2, TAX_PARAMETER_CODE2,
2412             Determining_Factor_Class3_Code, Determining_Factor_Cq3_Code,
2413             Data_Type3_Code, DETERMINING_FACTOR_CODE3,
2414             Operator3_Code, NUMERIC_VALUE3, DATE_VALUE3, ALPHANUMERIC_VALUE3,
2415             VALUE_LOW3, VALUE_HIGH3, TAX_PARAMETER_CODE3,
2416             Determining_Factor_Class4_Code, Determining_Factor_Cq4_Code,
2417             Data_Type4_Code, DETERMINING_FACTOR_CODE4,
2418             Operator4_Code, NUMERIC_VALUE4, DATE_VALUE4, ALPHANUMERIC_VALUE4,
2419             VALUE_LOW4, VALUE_HIGH4, TAX_PARAMETER_CODE4,
2420             Determining_Factor_Class5_Code, Determining_Factor_Cq5_Code,
2421             Data_Type5_Code, DETERMINING_FACTOR_CODE5,
2422             Operator5_Code, NUMERIC_VALUE5, DATE_VALUE5, ALPHANUMERIC_VALUE5,
2423             VALUE_LOW5, VALUE_HIGH5, TAX_PARAMETER_CODE5,
2424             Determining_Factor_Class6_Code, Determining_Factor_Cq6_Code,
2425             Data_Type6_Code, DETERMINING_FACTOR_CODE6,
2426             Operator6_Code, NUMERIC_VALUE6, DATE_VALUE6, ALPHANUMERIC_VALUE6,
2427             VALUE_LOW6, VALUE_HIGH6, TAX_PARAMETER_CODE6,
2428             Determining_Factor_Class7_Code, Determining_Factor_Cq7_Code,
2429             Data_Type7_Code, DETERMINING_FACTOR_CODE7,
2430             Operator7_Code, NUMERIC_VALUE7, DATE_VALUE7, ALPHANUMERIC_VALUE7,
2431             VALUE_LOW7, VALUE_HIGH7, TAX_PARAMETER_CODE7,
2432             Determining_Factor_Class8_Code, Determining_Factor_Cq8_Code,
2433             Data_Type8_Code, DETERMINING_FACTOR_CODE8,
2434             Operator8_Code, NUMERIC_VALUE8, DATE_VALUE8, ALPHANUMERIC_VALUE8,
2435             VALUE_LOW8, VALUE_HIGH8, TAX_PARAMETER_CODE8,
2436             Determining_Factor_Class9_Code, Determining_Factor_Cq9_Code,
2437             Data_Type9_Code, DETERMINING_FACTOR_CODE9,
2438             Operator9_Code, NUMERIC_VALUE9, DATE_VALUE9, ALPHANUMERIC_VALUE9,
2439             VALUE_LOW9, VALUE_HIGH9, TAX_PARAMETER_CODE9,
2440             Determining_Factor_Clas10_Code, Determining_Factor_Cq10_Code, Data_Type10_Code,
2441             DETERMINING_FACTOR_CODE10, Operator10_Code, NUMERIC_VALUE10, DATE_VALUE10,
2442             ALPHANUMERIC_VALUE10, VALUE_LOW10, VALUE_HIGH10,
2443             TAX_PARAMETER_CODE10, CHART_OF_ACCOUNTS_ID, LEDGER_ID,
2444             p.RESULT_ID,
2445             s.constraint_id
2446         FROM    ZX_CONDITION_GROUPS_B s,
2447                 ZX_PROCESS_RESULTS p
2448         WHERE   s.DET_FACTOR_TEMPL_CODE = c_det_factor_templ_code        AND
2449                 s.Enabled_Flag          = 'Y'                    AND
2450                 s.CONDITION_GROUP_CODE = p.condition_group_CODE      AND
2451                 p.TAX_RULE_ID          = c_tax_rule_id          AND
2452                 p.Enabled_Flag          = 'Y'                    AND
2453                 (p.TAX_STATUS_CODE     = c_tax_status_code OR
2454                  p.TAX_STATUS_CODE IS NULL )
2455         ORDER BY p.PRIORITY;
2456 
2457        l_action_rec_tbl     ZX_TDS_PROCESS_CEC_PVT.action_rec_tbl_type;
2458 
2459 BEGIN
2460   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
2461   IF (g_level_procedure >= g_current_runtime_level ) THEN
2462     FND_LOG.STRING(g_level_procedure,
2463                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.proc_condition_group_per_templ.BEGIN',
2464                    'ZX_TDS_RULE_BASE_DETM_PVT: proc_condition_group_per_templ(+)');
2465   END IF;
2466 
2467   p_return_status := FND_API.G_RET_STS_SUCCESS;
2468   l_constraint_result             := FALSE;
2469   l_condition_group_evaluated     := FALSE;
2470 
2471    -- reset the left hand side trx value for a new unevaluated template.
2472    --   g_trx_numeric_value_tbl.delete;
2473    --  g_trx_date_value_tbl.delete;
2474    -- g_trx_alphanumeric_value_tbl.delete;
2475 
2476    --
2477    -- init get transaction values flag, need to get transaction
2478    -- values only once
2479    --
2480 
2481    OPEN get_condition_group_codes_csr(p_det_factor_templ_code,
2482                                       p_tax_rule_id,
2483                                       p_tax_status_code);
2484    LOOP
2485      FETCH get_condition_group_codes_csr bulk collect into
2486                         l_condition_group_id_tbl,
2487                         l_condition_group_code_tbl,
2488                         l_more_than10_tbl,
2489                         l_det_factor_class1_tbl,
2490                         l_determining_factor_cq1_tbl,
2491                         l_data_type1_tbl,
2492                         l_det_factor_code1_tbl,
2493                         l_operator1_tbl,
2494                         l_numeric_value1_tbl,
2495                         l_date_value1_tbl,
2496                         l_alphanum_value1_tbl,
2497                         l_value_low1_tbl,
2498                         l_value_high1_tbl,
2499                         l_tax_parameter_code1_tbl,
2500                         l_det_factor_class2_tbl,
2501                         l_determining_factor_cq2_tbl,
2502                         l_data_type2_tbl,
2503                         l_det_factor_code2_tbl,
2504                         l_operator2_tbl,
2505                         l_numeric_value2_tbl,
2506                         l_date_value2_tbl,
2507                         l_alphanum_value2_tbl,
2508                         l_value_low2_tbl,
2509                         l_value_high2_tbl,
2510                         l_tax_parameter_code2_tbl,
2511                         l_det_factor_class3_tbl,
2512                         l_determining_factor_cq3_tbl,
2513                         l_data_type3_tbl,
2514                         l_det_factor_code3_tbl,
2515                         l_operator3_tbl,
2516                         l_numeric_value3_tbl,
2517                         l_date_value3_tbl,
2518                         l_alphanum_value3_tbl,
2519                         l_value_low3_tbl,
2520                         l_value_high3_tbl,
2521                         l_tax_parameter_code3_tbl,
2522                         l_det_factor_class4_tbl,
2523                         l_determining_factor_cq4_tbl,
2524                         l_data_type4_tbl,
2525                         l_det_factor_code4_tbl,
2526                         l_operator4_tbl,
2527                         l_numeric_value4_tbl,
2528                         l_date_value4_tbl,
2529                         l_alphanum_value4_tbl,
2530                         l_value_low4_tbl,
2531                         l_value_high4_tbl,
2532                         l_tax_parameter_code4_tbl,
2533                         l_det_factor_class5_tbl,
2534                         l_determining_factor_cq5_tbl,
2535                         l_data_type5_tbl,
2536                         l_det_factor_code5_tbl,
2537                         l_operator5_tbl,
2538                         l_numeric_value5_tbl,
2539                         l_date_value5_tbl,
2540                         l_alphanum_value5_tbl,
2541                         l_value_low5_tbl,
2542                         l_value_high5_tbl,
2543                         l_tax_parameter_code5_tbl,
2544                         l_det_factor_class6_tbl,
2545                         l_determining_factor_cq6_tbl,
2546                         l_data_type6_tbl,
2547                         l_det_factor_code6_tbl,
2548                         l_operator6_tbl,
2549                         l_numeric_value6_tbl,
2550                         l_date_value6_tbl,
2551                         l_alphanum_value6_tbl,
2552                         l_value_low6_tbl,
2553                         l_value_high6_tbl,
2554                         l_tax_parameter_code6_tbl,
2555                         l_det_factor_class7_tbl,
2556                         l_determining_factor_cq7_tbl,
2557                         l_data_type7_tbl,
2558                         l_det_factor_code7_tbl,
2559                         l_operator7_tbl,
2560                         l_numeric_value7_tbl,
2561                         l_date_value7_tbl,
2562                         l_alphanum_value7_tbl,
2563                         l_value_low7_tbl,
2564                         l_value_high7_tbl,
2565                         l_tax_parameter_code7_tbl,
2566                         l_det_factor_class8_tbl,
2567                         l_determining_factor_cq8_tbl,
2568                         l_data_type8_tbl,
2569                         l_det_factor_code8_tbl,
2570                         l_operator8_tbl,
2571                         l_numeric_value8_tbl,
2572                         l_date_value8_tbl,
2573                         l_alphanum_value8_tbl,
2574                         l_value_low8_tbl,
2575                         l_value_high8_tbl,
2576                         l_tax_parameter_code8_tbl,
2577                         l_det_factor_class9_tbl,
2578                         l_determining_factor_cq9_tbl,
2579                         l_data_type9_tbl,
2580                         l_det_factor_code9_tbl,
2581                         l_operator9_tbl,
2582                         l_numeric_value9_tbl,
2583                         l_date_value9_tbl,
2584                         l_alphanum_value9_tbl,
2585                         l_value_low9_tbl,
2586                         l_value_high9_tbl,
2587                         l_tax_parameter_code9_tbl,
2588                         l_det_factor_class10_tbl,
2589                         l_determining_factor_cq10_tbl,
2590                         l_data_type10_tbl,
2591                         l_det_factor_code10_tbl,
2592                         l_operator10_tbl,
2593                         l_numeric_value10_tbl,
2594                         l_date_value10_tbl,
2595                         l_alphanum_value10_tbl,
2596                         l_value_low10_tbl,
2597                         l_value_high10_tbl,
2598                         l_tax_parameter_code10_tbl,
2599                         l_chart_of_accounts_id_tbl,
2600                         l_sob_id_tbl,
2601                         l_result_id_tbl,
2602                         l_constraint_id_tbl
2603                     limit C_LINES_PER_COMMIT;
2604 
2605    l_counter := l_condition_group_code_tbl.count;
2606 
2607    IF (g_level_statement >= g_current_runtime_level ) THEN
2608      FND_LOG.STRING(g_level_statement,
2609                     'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.proc_condition_group_per_templ',
2610                     'condition group count: ' || to_char(l_counter));
2611    END IF;
2612 
2613    FOR j IN 1..l_counter LOOP
2614 
2615      /* -- comment out for bug 5211699, Nilesh will check the cache issue
2616         -- together with performance fix.
2617      -- check if the template has been evaluated.
2618      check_condition_group_result(
2619                              p_det_factor_templ_code,
2620                              l_condition_group_code_tbl(j),
2621                              p_structure_index,
2622                              p_event_class_rec,
2623                              l_condition_group_evaluated,
2624                              p_result);
2625      */
2626 
2627      IF (NOT l_condition_group_evaluated) THEN
2628       -- Initialize l_constraint_result to TRUE so that the evaluation of Condition Group
2629       -- is processed irrespective of Constraint association with Condition Group.
2630       l_constraint_result := TRUE;
2631 
2632       -- Check if the Condition Group has associated Constraint which would
2633       -- exist for Migrated Records only.
2634       --  If constraint exists and the action for the condition group evaluates
2635       --     to use it, only then evaluate conditions of the Condition Group.
2636       --     Otherwise, store FALSE as result outcome for the Condition Group.
2637       IF l_constraint_id_tbl(j) IS NOT NULL THEN
2638          init_cec_params (p_structure_name  => p_structure_name,
2639                           p_structure_index => p_structure_index,
2640                           p_return_status   => p_return_status,
2641                           p_error_buffer    => p_error_buffer);
2642 
2643          ZX_TDS_PROCESS_CEC_PVT.evaluate_cec(
2644                           p_constraint_id                => l_constraint_id_tbl(j),
2645                           p_cec_ship_to_party_site_id    => g_cec_ship_to_party_site_id,
2646                           p_cec_bill_to_party_site_id    => g_cec_bill_to_party_site_id,
2647                           p_cec_ship_to_party_id         => g_cec_ship_to_party_id,
2648                           p_cec_bill_to_party_id         => g_cec_bill_to_party_id,
2649                           p_cec_poo_location_id          => g_cec_poo_location_id,
2650                           p_cec_poa_location_id          => g_cec_poa_location_id,
2651                           p_cec_trx_id                   => g_cec_trx_id,
2652                           p_cec_trx_line_id              => g_cec_trx_line_id,
2653                           p_cec_ledger_id                => g_cec_ledger_id,
2654                           p_cec_internal_organization_id => g_cec_internal_organization_id,
2655                           p_cec_so_organization_id       => g_cec_so_organization_id,
2656                           p_cec_product_org_id           => g_cec_product_org_id,
2657                           p_cec_product_id               => g_cec_product_id,
2658                           p_cec_trx_line_date            => g_cec_trx_line_date,
2659                           p_cec_trx_type_id              => g_cec_trx_type_id,
2660                           p_cec_fob_point                => g_cec_fob_point,
2661                           p_cec_ship_to_site_use_id      => g_cec_ship_to_site_use_id,
2662                           p_cec_bill_to_site_use_id      => g_cec_bill_to_site_use_id,
2663                           p_cec_result                   => l_constraint_result,
2664                           p_action_rec_tbl               => l_action_rec_tbl,
2665                           p_return_status                => p_return_status,
2666                           p_error_buffer                 => p_error_buffer);
2667          p_result := l_constraint_result;
2668       END IF;
2669 
2670       -- bug 3976490
2671       IF l_constraint_id_tbl(j) is not NULL then
2672 
2673          -- every constraint must evaluate to either TRUE or FALSE. Based on this, the
2674          -- values in the p_action_rec_tbl will be action for True condition or Falese condition.
2675 
2676          for i in 1.. nvl(l_action_rec_tbl.last,0) loop
2677 
2678            if upper(l_action_rec_tbl(i).action_code) in ('ERROR_MESSAGE','SYSTEM_ERROR') then
2679               p_return_status := FND_API.G_RET_STS_ERROR;
2680               IF (g_level_error >= g_current_runtime_level ) THEN
2681                 FND_LOG.STRING(g_level_error,
2682                                'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.proc_condition_group_per_templ',
2683                                'Action_code is ERROR_MESSAGE or SYSTEM_ERROR');
2684               END IF;
2685               app_exception.raise_exception;
2686            elsif upper(l_action_rec_tbl(i).action_code) = 'DO_NOT_USE_THIS_TAX_GROUP' then
2687               l_constraint_result := FALSE;
2688            elsif  upper(l_action_rec_tbl(i).action_code) = 'USE_THIS_TAX_GROUP' then
2689                l_constraint_result := TRUE;
2690            elsif upper(l_action_rec_tbl(i).action_code) = 'DEFAULT_TAX_CODE' then
2691                NULL;
2692                --++ How do we default a Tax Code at Tax Group level if there are
2693                --   multiple tax codes associated with that tax group? Even if we default,
2694                --   should we evaluate the conditions and exceptions and if there is an action
2695                --   DEFAULT_TAX_CODE should we honour that one ? Revisit later
2696            end if;
2697         end loop;
2698       END IF;
2699 
2700       IF l_constraint_result THEN
2701        --
2702        -- process 1 condition group at a time
2703        -- if this condition group evaluates to true,
2704        -- exit all loops and no need to search any more
2705        --
2706 
2707        -- init  conditions for this condition group
2708        init_set_condition;
2709 
2710        -- check if there are too many conditions.
2711        IF (g_level_statement >= g_current_runtime_level ) THEN
2712          FND_LOG.STRING(g_level_statement,
2713                         'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.proc_condition_group_per_templ',
2714                         'more_than10 ? ' ||l_more_than10_tbl(j));
2715        END IF;
2716 
2717        IF (l_more_than10_tbl(j) = 'Y') THEN
2718          --
2719          -- if the condition group has more than 10 conditions
2720          -- get all  conditions from zx_condtions
2721          --
2722 
2723          get_and_process_condition(
2724                            p_structure_name,
2725                            p_structure_index,
2726                            l_condition_group_code_tbl(j),
2727                            p_event_class_rec,
2728                            p_tax,
2729                            p_tax_regime_code,
2730                            p_tax_determine_date,
2731                            p_result,
2732                            l_chart_of_accounts_id_tbl(j),
2733                            l_sob_id_tbl(j),
2734                            p_return_status,
2735                            p_error_buffer);
2736 
2737        ELSE
2738          IF l_det_factor_class1_tbl(j) IS NOT NULL THEN
2739            get_set_info(1,
2740                      l_det_factor_class1_tbl(j),
2741                      l_determining_factor_cq1_tbl(j),
2742                      l_tax_parameter_code1_tbl(j),
2743                      l_data_type1_tbl(j),
2744                      l_det_factor_code1_tbl(j),
2745                      l_operator1_tbl(j),
2746                      l_numeric_value1_tbl(j),
2747                      l_date_value1_tbl(j),
2748                      l_alphanum_value1_tbl(j),
2749                      l_value_low1_tbl(j),
2750                      l_value_high1_tbl(j) );
2751            IF l_det_factor_class2_tbl(j) IS NOT NULL THEN
2752              get_set_info(2,
2753                      l_det_factor_class2_tbl(j),
2754                      l_determining_factor_cq2_tbl(j),
2755                      l_tax_parameter_code2_tbl(j),
2756                      l_data_type2_tbl(j),
2757                      l_det_factor_code2_tbl(j),
2758                      l_operator2_tbl(j),
2759                      l_numeric_value2_tbl(j),
2760                      l_date_value2_tbl(j),
2761                      l_alphanum_value2_tbl(j),
2762                      l_value_low2_tbl(j),
2763                      l_value_high2_tbl(j) );
2764 
2765              IF l_det_factor_class3_tbl(j) IS NOT NULL THEN
2766                get_set_info(3,
2767                      l_det_factor_class3_tbl(j),
2768                      l_determining_factor_cq3_tbl(j),
2769                      l_tax_parameter_code3_tbl(j),
2770                      l_data_type3_tbl(j),
2771                      l_det_factor_code3_tbl(j),
2772                      l_operator3_tbl(j),
2773                      l_numeric_value3_tbl(j),
2774                      l_date_value3_tbl(j),
2775                      l_alphanum_value3_tbl(j),
2776                      l_value_low3_tbl(j),
2777                      l_value_high3_tbl(j) );
2778 
2779                IF l_det_factor_class4_tbl(j) IS NOT NULL THEN
2780                  get_set_info(4,
2781                      l_det_factor_class4_tbl(j),
2782                      l_determining_factor_cq4_tbl(j),
2783                      l_tax_parameter_code4_tbl(j),
2784                      l_data_type4_tbl(j),
2785                      l_det_factor_code4_tbl(j),
2786                      l_operator4_tbl(j),
2787                      l_numeric_value4_tbl(j),
2788                      l_date_value4_tbl(j),
2789                      l_alphanum_value4_tbl(j),
2790                      l_value_low4_tbl(j),
2791                      l_value_high4_tbl(j) );
2792                  IF l_det_factor_class5_tbl(j) IS NOT NULL THEN
2793                    get_set_info(5,
2794                      l_det_factor_class5_tbl(j),
2795                      l_determining_factor_cq5_tbl(j),
2796                      l_tax_parameter_code5_tbl(j),
2797                      l_data_type5_tbl(j),
2798                      l_det_factor_code5_tbl(j),
2799                      l_operator5_tbl(j),
2800                      l_numeric_value5_tbl(j),
2801                      l_date_value5_tbl(j),
2802                      l_alphanum_value5_tbl(j),
2803                      l_value_low5_tbl(j),
2804                      l_value_high5_tbl(j) );
2805                    IF l_det_factor_class6_tbl(j) IS NOT NULL THEN
2806                      get_set_info(6,
2807                        l_det_factor_class6_tbl(j),
2808                        l_determining_factor_cq6_tbl(j),
2809                        l_tax_parameter_code6_tbl(j),
2810                        l_data_type6_tbl(j),
2811                        l_det_factor_code6_tbl(j),
2812                        l_operator6_tbl(j),
2813                        l_numeric_value6_tbl(j),
2814                        l_date_value6_tbl(j),
2815                        l_alphanum_value6_tbl(j),
2816                        l_value_low6_tbl(j),
2817                        l_value_high6_tbl(j) );
2818                      IF l_det_factor_class7_tbl(j) IS NOT NULL THEN
2819                        get_set_info(7,
2820                           l_det_factor_class7_tbl(j),
2821                           l_determining_factor_cq7_tbl(j),
2822                           l_tax_parameter_code7_tbl(j),
2823                           l_data_type7_tbl(j),
2824                           l_det_factor_code7_tbl(j),
2825                           l_operator7_tbl(j),
2826                           l_numeric_value7_tbl(j),
2827                           l_date_value7_tbl(j),
2828                           l_alphanum_value7_tbl(j),
2829                           l_value_low7_tbl(j),
2830                           l_value_high7_tbl(j) );
2831                        IF l_det_factor_class8_tbl(j) IS NOT NULL THEN
2832                          get_set_info(8,
2833                             l_det_factor_class8_tbl(j),
2834                             l_determining_factor_cq8_tbl(j),
2835                             l_tax_parameter_code8_tbl(j),
2836                             l_data_type8_tbl(j),
2837                             l_det_factor_code8_tbl(j),
2838                             l_operator8_tbl(j),
2839                             l_numeric_value8_tbl(j),
2840                             l_date_value8_tbl(j),
2841                             l_alphanum_value8_tbl(j),
2842                             l_value_low8_tbl(j),
2843                             l_value_high8_tbl(j) );
2844                          IF l_det_factor_class9_tbl(j) IS NOT NULL THEN
2845                            get_set_info(9,
2846                               l_det_factor_class9_tbl(j),
2847                               l_determining_factor_cq9_tbl(j),
2848                               l_tax_parameter_code9_tbl(j),
2849                               l_data_type9_tbl(j),
2850                               l_det_factor_code9_tbl(j),
2851                               l_operator9_tbl(j),
2852                               l_numeric_value9_tbl(j),
2853                               l_date_value9_tbl(j),
2854                               l_alphanum_value9_tbl(j),
2855                               l_value_low9_tbl(j),
2856                               l_value_high9_tbl(j) );
2857                            IF l_det_factor_class10_tbl(j) IS NOT NULL THEN
2858                              get_set_info(10,
2859                                 l_det_factor_class10_tbl(j),
2860                                 l_determining_factor_cq10_tbl(j),
2861                                 l_tax_parameter_code10_tbl(j),
2862                                 l_data_type10_tbl(j),
2863                                 l_det_factor_code10_tbl(j),
2864                                 l_operator10_tbl(j),
2865                                 l_numeric_value10_tbl(j),
2866                                 l_date_value10_tbl(j),
2867                                 l_alphanum_value10_tbl(j),
2868                                 l_value_low10_tbl(j),
2869                                 l_value_high10_tbl(j) );
2870                            END IF;
2871                          END IF;
2872                        END IF;
2873                       END IF;
2874                     END IF;
2875                   END IF;
2876                 END IF;
2877               END IF;
2878             END IF;
2879           END IF;
2880 
2881           --
2882           -- process the  conditions for this condition group
2883           --
2884           process_set_condition(
2885                                 p_structure_name,
2886                                 p_structure_index,
2887                                 p_event_class_rec,
2888                                 p_tax_determine_date,
2889                                 p_tax,
2890                                 p_tax_regime_code,
2891                                 p_result,
2892                                 l_chart_of_accounts_id_tbl(j),
2893                                 l_sob_id_tbl(j),
2894                                 p_return_status,
2895                                 p_error_buffer);
2896 
2897        END IF;
2898       END IF;     /* of l_constraint_result */
2899       --
2900       -- if p_return_status = ERROR from process_set_condition
2901       -- that means get_trx_value results in error while trying to get
2902       -- transaction values, return to calling process immediately
2903       --
2904       IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2905         CLOSE get_condition_group_codes_csr;
2906         IF (g_level_error >= g_current_runtime_level ) THEN
2907           FND_LOG.STRING(g_level_error,
2908                          'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.proc_condition_group_per_templ',
2909                          'Incorrect return_status after calling process_set_condition() ' ||
2910                          ', p_return_status = ' || p_return_status);
2911         END IF;
2912 
2913         RETURN;
2914       END IF;
2915       --
2916       -- update  condition group result table with the result of
2917       -- of the condition group just evaluated
2918       --
2919       insert_condition_group_result(p_det_factor_templ_code,
2920                                l_condition_group_code_tbl(j),
2921                                p_result,
2922                                p_structure_index,
2923                                p_event_class_rec );
2924 
2925      END IF;    /* of NOT l_condition_group_evaluated */
2926      IF p_result THEN
2927         --
2928         -- 1 of the condition groups evaluates to TRUE for this template,
2929         -- no need to evaluate the rest of the condition groups
2930         --
2931 
2932         -- Assign the Result Id for the evaluated condition group.
2933         p_result_id := l_result_id_tbl(j);
2934 
2935          get_result(
2936                     p_result_id,
2937                     p_structure_name,
2938                     p_structure_index,
2939                     p_tax_regime_code,
2940                     p_tax,
2941                     p_tax_determine_date,
2942                     p_found,
2943                     p_zx_result_rec,
2944                     p_return_status,
2945                     p_error_buffer);
2946 	EXIT WHEN (p_found OR p_return_status <> FND_API.G_RET_STS_SUCCESS);
2947      END IF;
2948     END LOOP;
2949 
2950    IF (get_condition_group_codes_csr%notfound OR p_result) THEN
2951       CLOSE get_condition_group_codes_csr;
2952       IF (g_level_statement >= g_current_runtime_level ) THEN
2953         FND_LOG.STRING(g_level_statement,
2954                        'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.proc_condition_group_per_templ',
2955                        'No condition group found for the determing factor template: ' ||
2956                        p_det_factor_templ_code ||
2957                        ', or condition group evaluated to be true.');
2958       END IF;
2959       EXIT;
2960     END IF;
2961 
2962 
2963   END LOOP;
2964 
2965   IF get_condition_group_codes_csr%ISOPEN THEN
2966     CLOSE get_condition_group_codes_csr;
2967   END IF;
2968 
2969   IF (g_level_procedure >= g_current_runtime_level ) THEN
2970     FND_LOG.STRING(g_level_procedure,
2971                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.proc_condition_group_per_templ.END',
2972                    'ZX_TDS_RULE_BASE_DETM_PVT: proc_condition_group_per_templ(-)' ||
2973                    ', p_return_status = ' || p_return_status ||
2974                    ', p_error_buffer  = ' || p_error_buffer);
2975   END IF;
2976 
2977 EXCEPTION
2978   WHEN OTHERS THEN
2979     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2980     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
2981     IF get_condition_group_codes_csr%ISOPEN THEN
2982       CLOSE get_condition_group_codes_csr;
2983     END IF;
2984     IF (g_level_unexpected >= g_current_runtime_level ) THEN
2985       FND_LOG.STRING(g_level_unexpected,
2986                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.proc_condition_group_per_templ',
2987                       p_error_buffer);
2988     END IF;
2989 
2990 END proc_condition_group_per_templ;
2991 
2992 -----------------------------------------------------------------------
2993 --  PRIVATE PROCEDURE
2994 --  get_and_process_condition
2995 --
2996 --  DESCRIPTION
2997 --    This procedure processes all conditions defined for a condition group
2998 --    when the conditions for this condition group is more than 10
2999 --
3000 
3001 PROCEDURE get_and_process_condition(
3002             p_structure_name              IN  VARCHAR2,
3003             p_structure_index             IN  BINARY_INTEGER,
3004             p_condition_group_code        IN
3005                 ZX_CONDITION_GROUPS_B.condition_group_CODE%TYPE,
3006              p_event_class_rec            IN
3007                  ZX_API_PUB.EVENT_CLASS_REC_TYPE,
3008             p_tax                         IN     ZX_TAXES_B.TAX%TYPE,
3009             p_tax_regime_code             IN     ZX_REGIMES_B.TAX_REGIME_CODE%TYPE,
3010             p_tax_determine_date          IN
3011                  ZX_LINES.TAX_DETERMINE_DATE%TYPE,
3012             p_result                      IN OUT NOCOPY BOOLEAN,
3013             p_chart_of_accounts_id        IN
3014                 ZX_CONDITION_GROUPS_B.CHART_OF_ACCOUNTS_ID%TYPE,
3015             p_sob_id                      IN
3016                 ZX_CONDITION_GROUPS_B.LEDGER_ID%TYPE,
3017             p_return_status                  OUT NOCOPY VARCHAR2,
3018             p_error_buffer                   OUT NOCOPY VARCHAR2)
3019 IS
3020   l_condition_result           BOOLEAN;
3021 
3022   CURSOR  get_condition_csr
3023     (c_condition_group_code  ZX_CONDITION_GROUPS_B.condition_group_CODE%TYPE)
3024 IS
3025 
3026         SELECT  Determining_Factor_Class_Code,
3027                 Determining_Factor_Cq_Code,
3028                 Data_Type_Code,
3029                 determining_factor_code,
3030                 TAX_PARAMETER_CODE,
3031                 Operator_Code,
3032                NUMERIC_VALUE,
3033                 DATE_VALUE,
3034                 ALPHANUMERIC_VALUE,
3035                 VALUE_LOW,
3036                 VALUE_HIGH
3037         FROM    ZX_CONDITIONS
3038         WHERE   CONDITION_GROUP_CODE = c_condition_group_code
3039          AND (Ignore_Flag <> 'Y' OR IGNORE_FLAG IS NULL);
3040 
3041 
3042 BEGIN
3043   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
3044 
3045   IF (g_level_procedure >= g_current_runtime_level ) THEN
3046     FND_LOG.STRING(g_level_procedure,
3047                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_and_process_condition.BEGIN',
3048                    'ZX_TDS_RULE_BASE_DETM_PVT: get_and_process_condition(+)');
3049 
3050   END IF;
3051 
3052   IF (g_level_statement >= g_current_runtime_level ) THEN
3053     FND_LOG.STRING(g_level_statement,
3054                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_and_process_condition',
3055                    'p_condition_group_code: ' || p_condition_group_code);
3056 
3057   END IF;
3058 
3059   p_return_status := FND_API.G_RET_STS_SUCCESS;
3060 
3061   l_condition_result := TRUE;
3062 
3063   --
3064   -- process all conditions for this condition group
3065   --
3066   OPEN get_condition_csr(p_condition_group_code);
3067   LOOP
3068     FETCH get_condition_csr bulk collect into
3069             g_determining_factor_class_tbl,
3070             g_determining_factor_cq_tbl,
3071             g_data_type_tbl,
3072             g_determining_factor_code_tbl,
3073             g_tax_parameter_code_tbl,
3074             g_operator_tbl,
3075             g_numeric_value_tbl,
3076             g_date_value_tbl,
3077             g_alphanum_value_tbl,
3078             g_value_low_tbl,
3079             g_value_high_tbl
3080      LIMIT C_LINES_PER_COMMIT;
3081 
3082       process_set_condition(
3083                             p_structure_name,
3084                             p_structure_index,
3085                             p_event_class_rec,
3086                             p_tax_determine_date,
3087                             p_tax,
3088                             p_tax_regime_code,
3089                             p_result,
3090                             p_chart_of_accounts_id,
3091                             p_sob_id,
3092                             p_return_status,
3093                             p_error_buffer);
3094 
3095 
3096      IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
3097        CLOSE get_condition_csr;
3098        IF (g_level_error >= g_current_runtime_level ) THEN
3099           FND_LOG.STRING(g_level_error,
3100               'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_and_process_condition',
3101               'conditions count: ' ||
3102                to_char(get_condition_csr%ROWCOUNT));
3103        END IF;
3104        RETURN;
3105      END IF;
3106        --
3107        -- continue to evaluate the rest of the conditions for this
3108        -- condition group  only if previous conditions evaluate to true
3109        -- and there are more conditions to process
3110        --
3111        IF  (get_condition_csr%notfound OR NOT p_result)   THEN
3112          IF (g_level_statement >= g_current_runtime_level ) THEN
3113             FND_LOG.STRING(g_level_statement,
3114                            'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_and_process_condition',
3115                            'conditions count:' ||
3116                             to_char(get_condition_csr%ROWCOUNT));
3117          END IF;
3118          CLOSE get_condition_csr;
3119          EXIT;
3120        END IF;
3121   END LOOP;
3122 
3123   IF get_condition_csr%ISOPEN THEN
3124     CLOSE get_condition_csr;
3125   END IF;
3126 
3127   IF (g_level_procedure >= g_current_runtime_level ) THEN
3128     FND_LOG.STRING(g_level_procedure,
3129                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_and_process_condition.END',
3130                    'ZX_TDS_RULE_BASE_DETM_PVT: get_and_process_condition(-)');
3131   END IF;
3132 
3133 EXCEPTION
3134   WHEN OTHERS THEN
3135     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3136     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
3137     IF get_condition_csr%ISOPEN THEN
3138       CLOSE get_condition_csr;
3139     END IF;
3140 
3141     IF (g_level_unexpected >= g_current_runtime_level ) THEN
3142       FND_LOG.STRING(g_level_unexpected,
3143                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_and_process_condition',
3144                       p_error_buffer);
3145     END IF;
3146 
3147 END get_and_process_condition;
3148 
3149 ----------------------------------------------------------------------
3150 --  PRIVATE PROCEDURE
3151 --  get_set_info
3152 --
3153 --  DESCRIPTION
3154 --
3155 --  This procedure gets all information of a condition defined
3156 --  within a  condition group
3157 --
3158 
3159 
3160 PROCEDURE get_set_info (
3161       p_index              IN BINARY_INTEGER,
3162       p_Det_Factor_Class_Code       IN ZX_CONDITIONS.Determining_Factor_Class_Code%TYPE,
3163       p_Determining_Factor_Cq_Code          IN ZX_CONDITIONS.Determining_Factor_Cq_Code%TYPE,
3164       p_tax_parameter_code IN ZX_CONDITIONS.TAX_PARAMETER_CODE%TYPE,
3165       p_Data_Type_Code          IN ZX_CONDITIONS.Data_Type_Code%TYPE,
3166       p_determining_factor_code    IN ZX_CONDITIONS.determining_factor_code%TYPE,
3167       p_Operator_Code           IN ZX_CONDITIONS.Operator_Code%TYPE,
3168       p_numeric_value      IN ZX_CONDITIONS.NUMERIC_VALUE%TYPE,
3169       p_date_value         IN ZX_CONDITIONS.DATE_VALUE%TYPE,
3170       p_alphanum_value     IN ZX_CONDITIONS.ALPHANUMERIC_VALUE%TYPE,
3171       p_value_low          IN ZX_CONDITIONS.VALUE_LOW%TYPE,
3172       p_value_high         IN ZX_CONDITIONS.VALUE_HIGH%TYPE)
3173 IS
3174   i             BINARY_INTEGER;
3175 
3176 BEGIN
3177   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
3178 
3179   IF (g_level_statement >= g_current_runtime_level ) THEN
3180     FND_LOG.STRING(g_level_statement,
3181                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_set_info.BEGIN',
3182                    'ZX_TDS_RULE_BASE_DETM_PVT: get_set_info(+)');
3183   END IF;
3184 
3185   IF (g_level_statement >= g_current_runtime_level ) THEN
3186     FND_LOG.STRING(g_level_statement,
3187                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_set_info',
3188                    'p_index: ' || to_char(p_index) ||
3189                    ', p_Det_Factor_Class_Code: ' || p_Det_Factor_Class_Code ||
3190                    ', p_Determining_Factor_Cq_Code: ' || p_determining_factor_cq_code ||
3191                    ', p_tax_parameter_code: ' || p_tax_parameter_code ||
3192                    ', p_Data_Type_Code: ' || p_data_type_code ||
3193                    ', p_determining_factor_code: ' || p_determining_factor_code ||
3194                    ', p_Operator_Code: ' || p_operator_code ||
3195                    ', p_numeric_value: ' ||to_char(p_numeric_value) ||
3196                    ', p_date_value: ' || to_char(p_date_value,'DD-MON-YY') );
3197     FND_LOG.STRING(g_level_statement,
3198                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_set_info',
3199                    'p_alphanum_value: ' || p_alphanum_value ||
3200                    ', p_value_low:' || to_char(p_value_low) ||
3201                    ', p_value_high:' || to_char(p_value_high));
3202   END IF;
3203 
3204   i := p_index;
3205   g_determining_factor_class_tbl(i) := p_Det_Factor_Class_Code;
3206   g_determining_factor_cq_tbl(i)    := p_Determining_Factor_Cq_Code;
3207   g_tax_parameter_code_tbl(i)       := p_tax_parameter_code;
3208   g_data_type_tbl(i)                := p_Data_Type_Code;
3209   g_determining_factor_code_tbl(i)  := p_determining_factor_code;
3210   g_operator_tbl(i)                 := p_Operator_Code;
3211   g_numeric_value_tbl(i)            := p_numeric_value;
3212   g_date_value_tbl(i)         := p_date_value;
3213   g_alphanum_value_tbl(i)     := p_alphanum_value;
3214   g_value_low_tbl(i)          := p_value_low;
3215   g_value_high_tbl(i)         := p_value_high;
3216 
3217 
3218   IF (g_level_statement >= g_current_runtime_level ) THEN
3219     FND_LOG.STRING(g_level_statement,
3220                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_set_info.END',
3221                    'ZX_TDS_RULE_BASE_DETM_PVT: get_set_info(-)');
3222   END IF;
3223 
3224 EXCEPTION
3225   WHEN OTHERS THEN
3226 
3227     IF (g_level_unexpected >= g_current_runtime_level ) THEN
3228       FND_LOG.STRING(g_level_unexpected,
3229                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_set_info',
3230                       sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80));
3231     END IF;
3232 
3233 END get_set_info;
3234 
3235 ----------------------------------------------------------------------
3236 --  PRIVATE PROCEDURE
3237 --  init_set_condition
3238 --
3239 --  DESCRIPTION
3240 --    This procedure resets all tables containing condition info
3241 --    of a  condition group
3242 --  History
3243 --
3244 --    Phong La                    03-JUN-02  Created
3245 --
3246 PROCEDURE init_set_condition
3247 IS
3248 BEGIN
3249   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
3250 
3251   IF (g_level_statement >= g_current_runtime_level ) THEN
3252     FND_LOG.STRING(g_level_statement,
3253                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.init_set_condition.BEGIN',
3254                    'ZX_TDS_RULE_BASE_DETM_PVT: init_set_condition(+)');
3255   END IF;
3256 
3257   g_determining_factor_class_tbl.DELETE;
3258   g_determining_factor_cq_tbl.DELETE;
3259   g_tax_parameter_code_tbl.DELETE;
3260   g_data_type_tbl.DELETE;
3261   g_determining_factor_code_tbl.DELETE;
3262   g_operator_tbl.DELETE;
3263   g_numeric_value_tbl.DELETE;
3264   g_date_value_tbl.DELETE;
3265   g_alphanum_value_tbl.DELETE;
3266   g_value_low_tbl.DELETE;
3267   g_value_high_tbl.DELETE;
3268 
3269   IF (g_level_statement >= g_current_runtime_level ) THEN
3270     FND_LOG.STRING(g_level_statement,
3271                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.init_set_condition.END',
3272                    'ZX_TDS_RULE_BASE_DETM_PVT: init_set_condition(-)');
3273   END IF;
3274 
3275 EXCEPTION
3276   WHEN OTHERS THEN
3277     IF (g_level_unexpected >= g_current_runtime_level ) THEN
3278       FND_LOG.STRING(g_level_unexpected,
3279                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.init_set_condition',
3280                       sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80));
3281     END IF;
3282 
3283 END init_set_condition;
3284 -----------------------------------------------------------------------
3285 --  PRIVATE PROCEDURE
3286 --  process_set_condition
3287 --
3288 --  DESCRIPTION
3289 --
3290 --  This procedure processes a condition which is part of a
3291 --  of  a condition group
3292 --
3293 
3294 PROCEDURE process_set_condition (
3295             p_structure_name              IN     VARCHAR2,
3296             p_structure_index             IN     BINARY_INTEGER,
3297             p_event_class_rec             IN
3298                   ZX_API_PUB.EVENT_CLASS_REC_TYPE,
3299             p_tax_determine_date          IN
3300                   ZX_LINES.TAX_DETERMINE_DATE%TYPE,
3301             p_tax                         IN    ZX_TAXES_B.TAX%TYPE,
3302             p_tax_regime_code             IN    ZX_REGIMES_B.TAX_REGIME_CODE%TYPE,
3303             p_result                      IN OUT NOCOPY BOOLEAN,
3304             p_chart_of_accounts_id        IN
3305                 ZX_CONDITION_GROUPS_B.CHART_OF_ACCOUNTS_ID%TYPE,
3306             p_sob_id                      IN
3307                 ZX_CONDITION_GROUPS_B.LEDGER_ID%TYPE,
3308             p_return_status                  OUT NOCOPY VARCHAR2,
3309             p_error_buffer                   OUT NOCOPY VARCHAR2)
3310 
3311 IS
3312 
3313 --
3314 -- This procedure processes 1 condition record
3315 --
3316   l_count                  NUMBER;
3317   n                        BINARY_INTEGER;
3318   l_Determining_Factor_Cq_Code  ZX_CONDITIONS.Determining_Factor_Cq_Code%TYPE;
3319   l_trx_numeric_value      ZX_CONDITIONS.NUMERIC_VALUE%TYPE;
3320   l_trx_alphanum_value     ZX_CONDITIONS.ALPHANUMERIC_VALUE%TYPE;
3321   l_trx_date_value         ZX_CONDITIONS.DATE_VALUE%TYPE;
3322 BEGIN
3323 
3324   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
3325 
3326   IF (g_level_procedure >= g_current_runtime_level ) THEN
3327     FND_LOG.STRING(g_level_procedure,
3328                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.process_set_condition.BEGIN',
3329                    'ZX_TDS_RULE_BASE_DETM_PVT: process_set_condition(+)');
3330   END IF;
3331 
3332   p_return_status := FND_API.G_RET_STS_SUCCESS;
3333 
3334   l_count := g_determining_factor_code_tbl.count;
3335 
3336   IF (g_level_statement >= g_current_runtime_level ) THEN
3337     FND_LOG.STRING(g_level_statement,
3338                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.process_set_condition',
3339                    'There are '||to_char(l_count)||' conditions');
3340   END IF;
3341 
3342   -- get the transaction value.
3343 
3344   FOR k IN 1..l_count LOOP
3345 
3346     l_Determining_Factor_Cq_Code := g_determining_factor_cq_tbl(k);
3347 
3348     IF (g_level_statement >= g_current_runtime_level ) THEN
3349       FND_LOG.STRING(g_level_statement,
3350                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.process_set_condition',
3351                      'Determining_Factor_Cq_Code: ' || l_Determining_Factor_Cq_Code);
3352     END IF;
3353 
3354     IF g_determining_factor_class_tbl(k) = 'USER_DEFINED_GEOGRAPHY' THEN
3355       --
3356       -- bug#4673686- handle a table of trx values
3357       --
3358       evaluate_trx_value_tbl(
3359          p_structure_name,
3360          p_structure_index,
3361          k,
3362          p_tax_determine_date,
3363          l_Determining_Factor_Cq_Code,
3364          p_chart_of_accounts_id,
3365          p_result,
3366          p_return_status,
3367          p_error_buffer);
3368 
3369       IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
3370 
3371         IF (g_level_error >= g_current_runtime_level ) THEN
3372           FND_LOG.STRING(g_level_error,
3373                          'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.process_set_condition',
3374                          'Incorrect return_status after calling evaluate_trx_value_tbl(),'||
3375                          ' did not get trx value');
3376         END IF;
3377 
3378         p_result        := FALSE;
3379         --
3380         -- this is a serious error, return to the calling
3381         -- process immediately
3382         --
3383         RETURN;
3384       END IF;
3385     ELSE
3386       --
3387       -- single trx value
3388       --
3389       get_trx_value(
3390          p_structure_name,
3391          p_structure_index,
3392          p_event_class_rec,
3393          k,
3394          p_tax_determine_date,
3395          p_tax,
3396          p_tax_regime_code,
3397          l_Determining_Factor_Cq_Code,
3398          l_trx_numeric_value,
3399          l_trx_alphanum_value,
3400          l_trx_date_value,
3401          p_chart_of_accounts_id,
3402          p_sob_id,
3403          p_return_status,
3404          p_error_buffer);
3405 
3406       IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
3407 
3408         IF (g_level_error >= g_current_runtime_level ) THEN
3409           FND_LOG.STRING(g_level_error,
3410                          'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.process_set_condition',
3411                          'Incorrect return_status after calling get_trx_value(),'||
3412                          ' did not get trx value');
3413         END IF;
3414 
3415         p_result        := FALSE;
3416         --
3417         -- this is a serious error, return to the calling
3418         -- process immediately
3419         --
3420 
3421         IF g_determining_factor_class_tbl(k) = 'ACCOUNTING_FLEXFIELD' THEN
3422           p_return_status := FND_API.G_RET_STS_SUCCESS;
3423         END IF;
3424 
3425         RETURN;
3426       END IF;
3427 
3428       -- evaluate each condition for this condition group.
3429       --
3430       -- handle accounting flexfield case
3431       --
3432       IF (g_determining_factor_class_tbl(k) = 'ACCOUNTING_FLEXFIELD' AND
3433           g_determining_factor_cq_tbl(k) IS NOT NULL) THEN
3434         n := TO_NUMBER(g_determining_factor_cq_tbl(k));
3435         --g_trx_alphanumeric_value_tbl(j) := g_segment_array(n);
3436         IF (g_segment_array.last is NOT NULL) THEN
3437           l_trx_alphanum_value :=  g_segment_array(n);
3438         END IF;
3439       END IF;
3440       --
3441       -- handle =CQ and <>CQ case
3442       --
3443       IF (g_operator_tbl(k) = '=CQ' OR
3444           g_operator_tbl(k) = '<>CQ' ) THEN
3445         -- get trx value for this right hand side value
3446 
3447         l_Determining_Factor_Cq_Code := g_alphanum_value_tbl(k);
3448 
3449         IF (g_level_statement >= g_current_runtime_level ) THEN
3450           FND_LOG.STRING(g_level_statement,
3451                          'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.process_set_condition',
3452                          'calling get_trx_value for CQ case' ||
3453                          ', Determining_Factor_Cq_Code: ' || l_Determining_Factor_Cq_Code);
3454         END IF;
3455 
3456         get_trx_value(
3457            p_structure_name,
3458            p_structure_index,
3459            p_event_class_rec,
3460            k,
3461            p_tax_determine_date,
3462            p_tax,
3463            p_tax_regime_code,
3464            l_Determining_Factor_Cq_Code,
3465            g_numeric_value_tbl(k),
3466            g_alphanum_value_tbl(k),
3467            g_date_value_tbl(k),
3468            p_chart_of_accounts_id,
3469            p_sob_id,
3470            p_return_status,
3471            p_error_buffer);
3472 
3473         IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
3474 
3475           IF (g_level_error >= g_current_runtime_level ) THEN
3476             FND_LOG.STRING(g_level_error,
3477                            'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.process_set_condition',
3478                            'Incorrect return_status after calling get_trx_value(),' ||
3479                            ' did not get trx value for CQ case ');
3480           END IF;
3481 
3482           p_result        := FALSE;
3483           --
3484           -- this is a serious error, return to the calling
3485           -- process immediately
3486           --
3487           RETURN;
3488         END IF;
3489       END IF;   /* of CQ Operator_Code */
3490 
3491       --
3492       -- now evaluate right hand side value with left hand side value
3493       --
3494       evaluate_condition(k,
3495                          l_trx_alphanum_value,
3496                          l_trx_numeric_value,
3497                          l_trx_date_value,
3498                          p_chart_of_accounts_id,
3499                          p_result,
3500                          p_return_status,
3501                          p_error_buffer);
3502     END IF;
3503 
3504     IF ( g_determining_factor_class_tbl(k) = 'PRODUCT_FISCAL_CLASS' AND
3505                            g_determining_factor_code_tbl(k) = 'USER_ITEM_TYPE' AND
3506 			   l_trx_alphanum_value IS NULL ) THEN
3507       p_result := FALSE;
3508     END IF;
3509 
3510     IF ( g_determining_factor_class_tbl(k) = 'TRX_GENERIC_CLASSIFICATION' AND
3511               g_determining_factor_code_tbl(k) = 'TRX_TYPE' AND
3512 	      l_trx_numeric_value IS NULL)  THEN
3513       p_result := FALSE;
3514     END IF;
3515 
3516     -- If the result is false, the whole condition is false.
3517     IF ((NOT p_result) OR (p_result IS NULL))THEN
3518       IF (g_level_statement >= g_current_runtime_level ) THEN
3519         FND_LOG.STRING(g_level_statement,
3520                        'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.process_set_condition',
3521                        'condition is false');
3522       END IF;
3523       EXIT; -- out of the condition loop
3524     END IF;
3525 
3526   END LOOP;  -- condition_counter k;
3527 
3528   IF (g_level_procedure >= g_current_runtime_level ) THEN
3529     FND_LOG.STRING(g_level_procedure,
3530                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.process_set_condition.END',
3531                    'ZX_TDS_RULE_BASE_DETM_PVT: process_set_condition(-)' ||
3532                    ', p_return_status = ' || p_return_status ||
3533                    ', p_error_buffer  = ' || p_error_buffer);
3534   END IF;
3535 
3536 EXCEPTION
3537   WHEN OTHERS THEN
3538     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3539     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
3540 
3541     IF (g_level_unexpected >= g_current_runtime_level ) THEN
3542       FND_LOG.STRING(g_level_unexpected,
3543                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.process_set_condition',
3544                       p_error_buffer);
3545     END IF;
3546 
3547 END process_set_condition;
3548 
3549 -----------------------------------------------------------------------
3550 --  PRIVATE PROCEDURE
3551 --  get_trx_value
3552 --
3553 --  DESCRIPTION
3554 --
3555 --  This procedure is to get transaction value which will be used in the
3556 --  condition evaluation.
3557 
3558 PROCEDURE get_trx_value(
3559             p_structure_name         IN     VARCHAR2,
3560             p_structure_index        IN     BINARY_INTEGER,
3561             p_event_class_rec        IN     ZX_API_PUB.EVENT_CLASS_REC_TYPE,
3562             p_condition_index        IN     BINARY_INTEGER,
3563             p_tax_determine_date     IN     ZX_LINES.TAX_DETERMINE_DATE%TYPE,
3564             p_tax                    IN     ZX_TAXES_B.TAX%TYPE,
3565             p_tax_regime_code        IN     ZX_REGIMES_B.TAX_REGIME_CODE%TYPE,
3566             p_Determining_Factor_Cq_Code  IN     ZX_CONDITIONS.Determining_Factor_Cq_Code%TYPE,
3567             p_numeric_value             OUT NOCOPY ZX_CONDITIONS.NUMERIC_VALUE%TYPE,
3568             p_alphanum_value           	OUT NOCOPY ZX_CONDITIONS.ALPHANUMERIC_VALUE%TYPE,
3569             p_date_value                OUT NOCOPY ZX_CONDITIONS.DATE_VALUE%TYPE,
3570             p_chart_of_accounts_id   IN
3571                 ZX_CONDITION_GROUPS_B.CHART_OF_ACCOUNTS_ID%TYPE,
3572             p_sob_id                 IN
3573                 ZX_CONDITION_GROUPS_B.LEDGER_ID%TYPE,
3574             p_return_status             OUT NOCOPY VARCHAR2,
3575             p_error_buffer              OUT NOCOPY VARCHAR2)
3576 IS
3577   i                       BINARY_INTEGER;
3578   j                       BINARY_INTEGER;
3579   l_found_in_cache        BOOLEAN;
3580 
3581 BEGIN
3582 
3583   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
3584 
3585   IF (g_level_procedure >= g_current_runtime_level ) THEN
3586     FND_LOG.STRING(g_level_procedure,
3587                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_trx_value.BEGIN',
3588                    'ZX_TDS_RULE_BASE_DETM_PVT.get_trx_value(+)');
3589   END IF;
3590 
3591   p_return_status := FND_API.G_RET_STS_SUCCESS;
3592 
3593   i := p_condition_index;
3594 
3595   IF (g_level_statement >= g_current_runtime_level ) THEN
3596     FND_LOG.STRING(g_level_statement,
3597                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_trx_value',
3598                    'p_condition_index: '|| to_char(p_condition_index) ||
3599                    ', g_determining_factor_class_tbl: ' || g_determining_factor_class_tbl(i));
3600   END IF;
3601 
3602   IF g_determining_factor_class_tbl(i) = 'TRX_INPUT_FACTOR' THEN
3603     IF g_determining_factor_code_tbl(i) = 'TAX_CLASSIFICATION_CODE' THEN
3604       --
3605       -- try OUTPUT_TAX_CLASSIFICATION_CODE first
3606       --
3607       g_tax_parameter_code_tbl(i) := 'OUTPUT_TAX_CLASSIFICATION_CODE';
3608       get_tsrm_parameter_value(
3609                              p_structure_name,
3610                              p_structure_index,
3611                              p_condition_index,
3612                              p_numeric_value,
3613                              p_alphanum_value,
3614                              p_date_value,
3615                              p_return_status,
3616                              p_error_buffer);
3617       IF p_return_status = FND_API.G_RET_STS_SUCCESS THEN
3618         IF p_alphanum_value IS NULL THEN
3619           --
3620           -- OUTPUT_TAX_CLASSIFICATION_CODE is null,
3621           -- use INPUT_TAX_CLASSIFICATION_CODE
3622           --
3623           g_tax_parameter_code_tbl(i) := 'INPUT_TAX_CLASSIFICATION_CODE';
3624           get_tsrm_parameter_value(
3625                              p_structure_name,
3626                              p_structure_index,
3627                              p_condition_index,
3628                              p_numeric_value,
3629                              p_alphanum_value,
3630                              p_date_value,
3631                              p_return_status,
3632                              p_error_buffer);
3633         END IF;
3634       END IF;
3635     ELSE
3636       get_tsrm_parameter_value(
3637                              p_structure_name,
3638                              p_structure_index,
3639                              p_condition_index,
3640                              p_numeric_value,
3641                              p_alphanum_value,
3642                              p_date_value,
3643 			     p_return_status,
3644                              p_error_buffer);
3645     END IF;
3646 
3647   /* Bugfix 3673395 : Determining factor class 'EVENT' is obsolete
3648   ELSIF g_determining_factor_class_tbl(i) = 'EVENT' THEN
3649     IF g_determining_factor_code_tbl(i) = 'ENTITY_CODE' THEN
3650       p_alphanum_value := p_event_class_rec.entity_code;
3651     ELSIF g_determining_factor_code_tbl(i) = 'EVENT_CLASS_CODE' THEN
3652       p_numeric_value := p_event_class_rec.event_class_mapping_id;
3653     ELSIF g_determining_factor_code_tbl(i) = 'TAX_EVENT_CLASS_CODE' THEN
3654       p_alphanum_value := p_event_class_rec.tax_event_class_code;
3655     END IF;
3656   End Bugfix 3673395 */
3657   ELSE
3658     --
3659     -- check from trx value cache structure
3660     --
3661 /* Bug 5003413 : We will look at the cache only for determination factor class
3662                  'GEOGRAPHY', 'ACCOUNTING_FLEXFIELD'.
3663    For Fiscal classifications, we already have caching available in
3664 */
3665     l_found_in_cache := FALSE;
3666 
3667     IF g_determining_factor_class_tbl(i) in ('GEOGRAPHY', 'ACCOUNTING_FLEXFIELD') THEN
3668        j := get_trx_value_index(
3669                    g_determining_factor_class_tbl(i),
3670                    g_determining_factor_code_tbl(i),
3671                    p_Determining_Factor_Cq_Code,
3672                    g_alphanum_value_tbl(i));
3673 
3674        IF (g_level_statement >= g_current_runtime_level ) THEN
3675           FND_LOG.STRING(g_level_statement,
3676                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_trx_value',
3677                      'cache index: ' || to_char(j));
3678        END IF;
3679 
3680        -- bug 6763074: comment out the code lines for caching because it seems
3681        --              ZX_TDS_CALC_SERVICES_PUB_PKG.g_trx_alphanum_value_tbl(j)
3682        --              does not have the value for the current trx line
3683        --
3684        --    IF (g_data_type_tbl(i) = 'ALPHANUMERIC' AND
3685        --        ZX_TDS_CALC_SERVICES_PUB_PKG.g_trx_alphanum_value_tbl.EXISTS(j)) THEN
3686        --     IF (ZX_TDS_CALC_SERVICES_PUB_PKG.g_trx_alphanum_value_tbl(j) = g_alphanum_value_tbl(i)) THEN
3687        --            p_alphanum_value := ZX_TDS_CALC_SERVICES_PUB_PKG.g_trx_alphanum_value_tbl(j);
3688        --            l_found_in_cache := TRUE;
3689        --          END IF;
3690        --    ELSIF (g_data_type_tbl(i) = 'NUMERIC' AND
3691        --        ZX_TDS_CALC_SERVICES_PUB_PKG.g_tsrm_num_value_tbl.EXISTS(j)) THEN
3692        --          -- bug fix 6611984
3693        --     IF (ZX_TDS_CALC_SERVICES_PUB_PKG.g_tsrm_num_value_tbl(j) = g_numeric_value_tbl(i)) THEN
3694        --            p_numeric_value := ZX_TDS_CALC_SERVICES_PUB_PKG.g_tsrm_num_value_tbl(j);
3695        --            l_found_in_cache := TRUE;
3696        --     END IF;
3697        --    END IF;
3698 
3699     END IF;
3700 
3701 /* Bug 5003413 */
3702 
3703     IF NOT l_found_in_cache THEN
3704       --
3705       -- trx value not exist in cache, need to get it
3706       --
3707 /***** bug#4673686-  move to evaluate_trx_value_tbl
3708       IF g_determining_factor_class_tbl(i) = 'USER_DEFINED_GEOGRAPHY' THEN
3709         get_geography_info(p_structure_name,
3710                            p_structure_index,
3711                            p_condition_index,
3712                            p_alphanum_value,
3713                            p_Determining_Factor_Cq_Code,
3714                            p_tax_determine_date,
3715                            p_return_status,
3716                            p_error_buffer);
3717 **********/
3718 
3719       -- Bug#4591207
3720       IF g_determining_factor_class_tbl(i) = 'GEOGRAPHY' THEN
3721          get_master_geography_info(
3722                            p_structure_name,
3723                            p_structure_index,
3724                            p_condition_index,
3725                            p_numeric_value,
3726                            p_Determining_Factor_Cq_Code,
3727                            p_return_status,
3728                            p_error_buffer);
3729 
3730       -- Bug#6124314
3731       ELSIF ( g_determining_factor_class_tbl(i) = 'PRODUCT_FISCAL_CLASS' AND
3732               g_determining_factor_code_tbl(i) = 'USER_ITEM_TYPE')  THEN
3733 	   get_user_item_type_value(
3734 	                   p_structure_name,
3735                            p_structure_index,
3736                            p_condition_index,
3737 			   p_event_class_rec,
3738 			   p_numeric_value,
3739 			   p_alphanum_value,
3740                            p_return_status,
3741                            p_error_buffer);
3742 
3743       -- Bug#6124462
3744       ELSIF ( g_determining_factor_class_tbl(i) = 'TRX_GENERIC_CLASSIFICATION' AND
3745               g_determining_factor_code_tbl(i) = 'TRX_TYPE' )  THEN
3746 	   get_tsrm_parameter_value(
3747                            p_structure_name,
3748                            p_structure_index,
3749                            p_condition_index,
3750                            p_numeric_value,
3751                            p_alphanum_value,
3752                            p_date_value,
3753  		           p_return_status,
3754                            p_error_buffer);
3755 
3756       ELSIF (g_determining_factor_class_tbl(i) = 'PRODUCT_FISCAL_CLASS'     OR
3757              g_determining_factor_class_tbl(i) = 'PARTY_FISCAL_CLASS'       OR
3758              g_determining_factor_class_tbl(i) = 'LEGAL_PARTY_FISCAL_CLASS' OR
3759              g_determining_factor_class_tbl(i) = 'TRX_FISCAL_CLASS'         OR
3760              g_determining_factor_class_tbl(i) = 'DOCUMENT'                 OR
3761              g_determining_factor_class_tbl(i) = 'PRODUCT_GENERIC_CLASSIFICATION'  OR
3762              g_determining_factor_class_tbl(i) = 'TRX_GENERIC_CLASSIFICATION' ) THEN
3763         get_fc( p_structure_name,
3764                 p_structure_index,
3765                 p_condition_index,
3766                 p_tax_determine_date,
3767                 p_tax_regime_code,
3768                 p_event_class_rec,
3769                 p_alphanum_value,
3770                 p_Determining_Factor_Cq_Code,
3771                 p_return_status,
3772                 p_error_buffer);
3773 
3774       ELSIF g_determining_factor_class_tbl(i) = 'REGISTRATION' THEN
3775         get_registration_status(p_structure_name,
3776                                 p_structure_index,
3777                                 p_event_class_rec,
3778                                 p_tax_determine_date,
3779                                 p_tax,
3780                                 p_tax_regime_code,
3781                                 p_alphanum_value,
3782                                 p_Determining_Factor_Cq_Code,
3783                                 p_return_status,
3784                                 p_error_buffer);
3785 
3786       ELSIF g_determining_factor_class_tbl(i) = 'ACCOUNTING_FLEXFIELD' THEN
3787         get_account_flexfield_info(p_structure_name,
3788                                    p_structure_index,
3789                                    p_condition_index,
3790                                    p_alphanum_value,
3791                                    p_chart_of_accounts_id,
3792                                    p_sob_id,
3793                                    p_return_status,
3794                                    p_error_buffer);
3795 
3796     /* Bugfix 3673395
3797        ELSIF g_determining_factor_class_tbl(i) = 'PRODUCT' THEN
3798          get_product_tax_info(p_structure_name,
3799                               p_structure_index,
3800                               g_determining_factor_code_tbl(i),
3801                               p_alphanum_value,
3802                               p_return_status,
3803                               p_error_buffer);
3804 
3805       ELSIF g_determining_factor_class_tbl(i) = 'PARTY' THEN
3806          get_party_tax_info(p_structure_name,
3807                             p_structure_index,
3808                             p_Determining_Factor_Cq_Code,
3809                             g_determining_factor_code_tbl(i),
3810                             p_alphanum_value,
3811                             p_return_status,
3812                             p_error_buffer);
3813 	  */
3814       END IF;
3815       IF p_return_status =  FND_API.G_RET_STS_SUCCESS THEN
3816         -- update trx value cache structure
3817 /* Bug 5003413 */
3818          IF g_determining_factor_class_tbl(i) in ('GEOGRAPHY', 'ACCOUNTING_FLEXFIELD') THEN
3819             IF g_data_type_tbl(i) = 'ALPHANUMERIC' THEN
3820               ZX_TDS_CALC_SERVICES_PUB_PKG.g_trx_alphanum_value_tbl(j) := p_alphanum_value;
3821             ELSIF g_data_type_tbl(i) = 'NUMERIC' THEN
3822               ZX_TDS_CALC_SERVICES_PUB_PKG.g_tsrm_num_value_tbl(j) := p_numeric_value;
3823             END IF;
3824          END IF;
3825 /* Bug 5003413 */
3826       END IF;
3827 
3828     END IF;
3829   END IF;
3830 
3831   IF (g_level_procedure >= g_current_runtime_level ) THEN
3832     FND_LOG.STRING(g_level_procedure,
3833                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_trx_value.END',
3834                    'ZX_TDS_RULE_BASE_DETM_PVT.get_trx_value(-)' ||
3835                    ', p_return_status = ' || p_return_status ||
3836                    ', p_error_buffer  = ' || p_error_buffer);
3837   END IF;
3838 
3839 EXCEPTION
3840   WHEN OTHERS THEN
3841     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3842     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
3843     IF (g_level_unexpected >= g_current_runtime_level ) THEN
3844       FND_LOG.STRING(g_level_unexpected,
3845                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_trx_value',
3846                       p_error_buffer);
3847     END IF;
3848 
3849 END get_trx_value;
3850 
3851 -----------------------------------------------------------------------
3852 --  PRIVATE PROCEDURE
3853 --  evaluate_trx_value_tbl
3854 --
3855 --  DESCRIPTION
3856 --
3857 --  This procedure is to get a table of transaction values
3858 --  and evaluate each value in this table with the condition value
3859 --  of a group until a match is found
3860 
3861 -- Bug#4673686 : new procedure to handle multiple zones
3862 
3863 PROCEDURE evaluate_trx_value_tbl(
3864             p_structure_name         IN     VARCHAR2,
3865             p_structure_index        IN     BINARY_INTEGER,
3866             p_condition_index        IN     BINARY_INTEGER,
3867             p_tax_determine_date     IN     ZX_LINES.TAX_DETERMINE_DATE%TYPE,
3868             p_Determining_Factor_Cq_Code  IN     ZX_CONDITIONS.Determining_Factor_Cq_Code%TYPE,
3869             p_chart_of_accounts_id   IN     ZX_CONDITION_GROUPS_B.CHART_OF_ACCOUNTS_ID%TYPE,
3870             p_result                 IN OUT NOCOPY BOOLEAN,
3871             p_return_status             OUT NOCOPY VARCHAR2,
3872             p_error_buffer              OUT NOCOPY VARCHAR2)
3873 IS
3874   i                       BINARY_INTEGER;
3875   j                       BINARY_INTEGER;
3876   l_trx_alphanum_value    ZX_CONDITIONS.ALPHANUMERIC_VALUE%TYPE;
3877   l_trx_date_value        ZX_CONDITIONS.DATE_VALUE%TYPE;
3878 
3879   l_count                 NUMBER;
3880   l_zone_tbl              HZ_GEO_GET_PUB.zone_tbl_type;
3881 BEGIN
3882 
3883   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
3884 
3885   IF (g_level_procedure >= g_current_runtime_level ) THEN
3886     FND_LOG.STRING(g_level_procedure,
3887                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.evaluate_trx_value_tbl.BEGIN',
3888                    'ZX_TDS_RULE_BASE_DETM_PVT.evaluate_trx_value_tbl(+)');
3889   END IF;
3890 
3891   p_return_status := FND_API.G_RET_STS_SUCCESS;
3892 
3893   i := p_condition_index;
3894   p_result := FALSE;
3895 
3896   IF (g_level_statement >= g_current_runtime_level ) THEN
3897     FND_LOG.STRING(g_level_statement,
3898                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.evaluate_trx_value_tbl',
3899                    'p_condition_index: '|| to_char(p_condition_index) ||
3900                    ', g_determining_factor_class_tbl: ' || g_determining_factor_class_tbl(i));
3901   END IF;
3902 
3903   IF g_determining_factor_class_tbl(i) = 'USER_DEFINED_GEOGRAPHY' THEN
3904         get_geography_info(p_structure_name,
3905                            p_structure_index,
3906                            p_condition_index,
3907                            l_zone_tbl,
3908                            p_Determining_Factor_Cq_Code,
3909                            p_tax_determine_date,
3910                            p_return_status,
3911                            p_error_buffer);
3912 
3913       IF (p_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
3914         IF (g_level_error >= g_current_runtime_level ) THEN
3915           FND_LOG.STRING(g_level_error,
3916                          'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.evaluate_trx_value_tbl',
3917                          'Incorrect return_status after calling get_geography_info()' ||
3918                          ', return_status: '|| p_return_status);
3919         END IF;
3920         RETURN;
3921       END IF;
3922 
3923       l_count := l_zone_tbl.COUNT;
3924 
3925       IF (g_level_statement >= g_current_runtime_level ) THEN
3926         FND_LOG.STRING(g_level_statement,
3927                        'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.evaluate_trx_value_tbl',
3928                        'Number of rows in Zone table : ' ||
3929                         TO_CHAR(l_count));
3930       END IF;
3931 
3932 -- Bug fix 5003513
3933     IF l_count > 0 THEN
3934       FOR j IN 1.. l_count LOOP
3935         evaluate_condition(
3936                          i,
3937                          l_trx_alphanum_value,
3938                          l_zone_tbl(j).zone_id,
3939                          l_trx_date_value,
3940                          p_chart_of_accounts_id,
3941                          p_result,
3942                          p_return_status,
3943                          p_error_buffer);
3944          IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
3945            IF (g_level_error >= g_current_runtime_level ) THEN
3946              FND_LOG.STRING(g_level_error,
3947                            'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.evaluate_trx_value_tbl',
3948                            'Incorrect return_status after calling evaluate_condition()' ||
3949                            ', return_status  '|| p_return_status );
3950            END IF;
3951 
3952            EXIT;
3953          END IF;
3954          IF p_result  THEN
3955            --
3956            -- loop until a match is found
3957            --
3958           IF (g_level_statement >= g_current_runtime_level ) THEN
3959             FND_LOG.STRING(g_level_statement,
3960                            'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.evaluate_trx_value_tbl',
3961                            'Found a matched condition.' );
3962           END IF;
3963            EXIT;
3964          END IF;
3965 
3966       END LOOP;
3967 -- Not finding a zone for a location in the given zone type is a valid condition
3968 -- For example, zones will not be returned for US location for EU zone types.
3969 -- Hence, passing null value for the zone_id.
3970     ELSIF l_count = 0 THEN
3971         evaluate_condition(
3972                          i,
3973                          l_trx_alphanum_value,
3974                          NULL,
3975                          l_trx_date_value,
3976                          p_chart_of_accounts_id,
3977                          p_result,
3978                          p_return_status,
3979                          p_error_buffer);
3980          IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
3981            IF (g_level_error >= g_current_runtime_level ) THEN
3982              FND_LOG.STRING(g_level_error,
3983                            'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.evaluate_trx_value_tbl',
3984                            'Incorrect return_status after calling evaluate_condition()' ||
3985                            ', return_status  '|| p_return_status );
3986            END IF;
3987            RETURN;
3988          END IF;
3989     END IF;
3990   END IF;
3991 
3992   IF (g_level_procedure >= g_current_runtime_level ) THEN
3993     FND_LOG.STRING(g_level_procedure,
3994                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.evaluate_trx_value_tbl.END',
3995                    'ZX_TDS_RULE_BASE_DETM_PVT.evaluate_trx_value_tbl(-)' ||
3996                    ', p_return_status = ' || p_return_status ||
3997                    ', p_error_buffer  = ' || p_error_buffer);
3998   END IF;
3999 
4000 EXCEPTION
4001   WHEN OTHERS THEN
4002     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4003     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
4004     IF (g_level_unexpected >= g_current_runtime_level ) THEN
4005       FND_LOG.STRING(g_level_unexpected,
4006                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.evaluate_trx_value_tbl',
4007                       p_error_buffer);
4008     END IF;
4009 
4010 END evaluate_trx_value_tbl;
4011 
4012 -----------------------------------------------------------------------
4013 --  PRIVATE PROCEDURE
4014 --  get_tsrm_parameter_value
4015 --
4016 --  DESCRIPTION
4017 --
4018 --  This procedure is to get transaction value when
4019 --  Determining_Factor_Class_Code = 'PARAMETER'.
4020 --  It is called from procedure get_trx_value.  It calls appropriate TSRM
4021 --  function to get trx value directly.
4022 --
4023 
4024 PROCEDURE get_tsrm_parameter_value(
4025             p_structure_name     IN  VARCHAR2,
4026             p_structure_index    IN  BINARY_INTEGER,
4027             p_condition_index    IN  BINARY_INTEGER,
4028             p_numeric_value      OUT NOCOPY ZX_CONDITIONS.NUMERIC_VALUE%TYPE,
4029             p_alphanum_value     OUT NOCOPY ZX_CONDITIONS.ALPHANUMERIC_VALUE%TYPE,
4030             p_date_value         OUT NOCOPY ZX_CONDITIONS.DATE_VALUE%TYPE,
4031 	    p_return_status      OUT NOCOPY VARCHAR2,
4032             p_error_buffer       OUT NOCOPY VARCHAR2)
4033 IS
4034    i        BINARY_INTEGER;
4035 BEGIN
4036 
4037   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
4038 
4039   IF (g_level_statement >= g_current_runtime_level ) THEN
4040     FND_LOG.STRING(g_level_statement,
4041                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_tsrm_parameter_value.BEGIN',
4042                    'ZX_TDS_RULE_BASE_DETM_PVT: get_tsrm_parameter_value(+)');
4043   END IF;
4044 
4045   p_return_status := FND_API.G_RET_STS_SUCCESS;
4046 
4047   i :=  p_condition_index;
4048 
4049   IF g_data_type_tbl(i) = 'NUMERIC' THEN
4050 
4051     get_tsrm_num_value(
4052             p_structure_name,
4053             p_structure_index,
4054             g_tax_parameter_code_tbl(i),
4055             p_numeric_value,
4056             p_return_status,
4057             p_error_buffer);
4058 
4059     IF (g_level_statement >= g_current_runtime_level ) THEN
4060       FND_LOG.STRING(g_level_statement,
4061                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_tsrm_parameter_value',
4062                      'parameter code: ' || g_tax_parameter_code_tbl(i) ||
4063                      ', p_numeric_value: ' || p_numeric_value );
4064     END IF;
4065 
4066   ELSIF g_data_type_tbl(i) = 'DATE' THEN
4067 
4068     ZX_GET_TAX_PARAM_DRIVER_PKG.get_driver_value(
4069       p_structure_name,
4070       p_structure_index,
4071       g_tax_parameter_code_tbl(i),
4072       p_date_value,
4073       p_return_status
4074       );
4075 
4076     IF (g_level_statement >= g_current_runtime_level ) THEN
4077       FND_LOG.STRING(g_level_statement,
4078                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_tsrm_parameter_value',
4079                      'parameter code: ' || g_tax_parameter_code_tbl(i) ||
4080                      ', trx_date value: ' || to_char(p_date_value, 'DD-MON-YY'));
4081     END IF;
4082 
4083   ELSIF g_data_type_tbl(i) = 'ALPHANUMERIC' THEN
4084 
4085     get_tsrm_alphanum_value(
4086             p_structure_name,
4087             p_structure_index,
4088             g_tax_parameter_code_tbl(i),
4089             p_alphanum_value,
4090             p_return_status,
4091             p_error_buffer);
4092 
4093     IF (g_level_statement >= g_current_runtime_level ) THEN
4094       FND_LOG.STRING(g_level_statement,
4095                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_tsrm_parameter_value',
4096                      'parameter code: ' || g_tax_parameter_code_tbl(i) ||
4097                      ', p_alphanum_value: ' || p_alphanum_value );
4098     END IF;
4099   ELSE
4100 
4101     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4102     p_error_buffer  := 'Invalid data type';
4103     IF (g_level_unexpected >= g_current_runtime_level ) THEN
4104       FND_LOG.STRING(g_level_unexpected,
4105                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_tsrm_parameter_value',
4106                      'Invalid data type, data type must be ALPHANUMERIC, NUMERIC, DATE');
4107     END IF;
4108 
4109   END IF;
4110 
4111   IF (g_level_statement >= g_current_runtime_level ) THEN
4112     FND_LOG.STRING(g_level_statement,
4113                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_tsrm_parameter_value.END',
4114                    'ZX_TDS_RULE_BASE_DETM_PVT: get_tsrm_parameter_value(-)' ||
4115                    ', p_return_status = ' || p_return_status ||
4116                    ', p_error_buffer  = ' || p_error_buffer);
4117   END IF;
4118 
4119 EXCEPTION
4120   WHEN OTHERS THEN
4121     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4122     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
4123 
4124     IF (g_level_unexpected >= g_current_runtime_level ) THEN
4125       FND_LOG.STRING(g_level_unexpected,
4126                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_tsrm_parameter_value',
4127                       p_error_buffer);
4128     END IF;
4129 
4130 END get_tsrm_parameter_value;
4131 
4132 ----------------------------------------------------------------------
4133 --  PUBLIC PROCEDURE
4134 --  get_tsrm_num_value
4135 --
4136 --  DESCRIPTION
4137 --
4138 --  This procedure gets tsrm parameter value from the cache if available
4139 --  before it calls TSRM API to get the parameter value and then inserts
4140 --  the value to the cache structure
4141 
4142 PROCEDURE get_tsrm_num_value(
4143             p_structure_name         IN  VARCHAR2,
4144             p_structure_index        IN  BINARY_INTEGER,
4145             p_parameter_code         IN  ZX_PARAMETERS_B.TAX_PARAMETER_CODE%TYPE,
4146             p_trx_numeric_value      OUT NOCOPY ZX_CONDITIONS.NUMERIC_VALUE%TYPE,
4147             p_return_status          OUT NOCOPY VARCHAR2,
4148             p_error_buffer           OUT NOCOPY VARCHAR2)
4149 IS
4150   --l_table_index                   NUMBER;
4151 
4152 BEGIN
4153 
4154   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
4155 
4156   IF (g_level_statement >= g_current_runtime_level ) THEN
4157     FND_LOG.STRING(g_level_statement,
4158                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_tsrm_num_value.BEGIN',
4159                    'ZX_TDS_RULE_BASE_DETM_PVT: get_tsrm_num_value(+)');
4160     FND_LOG.STRING(g_level_statement ,
4161                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_tsrm_num_value',
4162                    'p_parameter_code: ' || p_parameter_code );
4163   END IF;
4164   p_return_status := FND_API.G_RET_STS_SUCCESS;
4165 
4166 -- commenting caching as no value check is possible at this point.
4167 -- for checking if the value in cache is matching the current transaction value
4168 -- we need to call get_driver_value
4169 -- therefore commenting the caching logic as calling get_driver_value inside cache is redundant
4170 
4171  /* l_table_index := dbms_utility.get_hash_value(
4172                         p_parameter_code,
4173                         1,
4174                         8192); */
4175 
4176   --IF ZX_TDS_CALC_SERVICES_PUB_PKG.g_tsrm_num_value_tbl.EXISTS(l_table_index) THEN
4177   --  p_trx_numeric_value := ZX_TDS_CALC_SERVICES_PUB_PKG.g_tsrm_num_value_tbl(l_table_index);
4178   --ELSE
4179 
4180     ZX_GET_TAX_PARAM_DRIVER_PKG.get_driver_value(
4181         p_structure_name,
4182         p_structure_index,
4183         p_parameter_code,
4184         p_trx_numeric_value,
4185         p_return_status
4186         );
4187 
4188     --IF p_return_status = FND_API.G_RET_STS_SUCCESS THEN
4189     --  ZX_TDS_CALC_SERVICES_PUB_PKG.g_tsrm_num_value_tbl(l_table_index) := p_trx_numeric_value;
4190     --END IF;
4191   --END IF;
4192 
4193   IF (g_level_statement >= g_current_runtime_level ) THEN
4194     FND_LOG.STRING(g_level_statement,
4195                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_tsrm_num_value',
4196                    'trx_num_value: ' || to_char(p_trx_numeric_value));
4197     FND_LOG.STRING(g_level_statement,
4198                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_tsrm_num_value.END',
4199                    'ZX_TDS_RULE_BASE_DETM_PVT: get_tsrm_num_value(-)' ||
4200                    ', p_return_status = ' || p_return_status ||
4201                    ', p_error_buffer  = ' || p_error_buffer);
4202   END IF;
4203 
4204 EXCEPTION
4205   WHEN OTHERS THEN
4206     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4207     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
4208 
4209     IF (g_level_unexpected >= g_current_runtime_level ) THEN
4210       FND_LOG.STRING(g_level_unexpected,
4211                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_tsrm_num_value',
4212                       p_error_buffer);
4213     END IF;
4214 
4215 END get_tsrm_num_value;
4216 ----------------------------------------------------------------------
4217 --  PUBLIC PROCEDURE
4218 --  get_tsrm_alphanum_value
4219 --
4220 --  DESCRIPTION
4221 --
4222 --  This procedure gets tsrm parameter value from the cache if available
4223 --  before it calls TSRM API to get the parameter value and then inserts
4224 --  the value to the cache structure
4225 
4226 PROCEDURE get_tsrm_alphanum_value(
4227             p_structure_name         IN  VARCHAR2,
4228             p_structure_index        IN  BINARY_INTEGER,
4229             p_parameter_code         IN  ZX_PARAMETERS_B.TAX_PARAMETER_CODE%TYPE,
4230             p_trx_alphanumeric_value    OUT NOCOPY ZX_CONDITIONS.ALPHANUMERIC_VALUE%TYPE,
4231             p_return_status             OUT NOCOPY VARCHAR2,
4232             p_error_buffer              OUT NOCOPY VARCHAR2)
4233 IS
4234   --l_table_index                    NUMBER;
4235 
4236 BEGIN
4237 
4238   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
4239 
4240   IF (g_level_statement >= g_current_runtime_level ) THEN
4241     FND_LOG.STRING(g_level_statement,
4242                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_tsrm_alphanum_value.BEGIN',
4243                    'ZX_TDS_RULE_BASE_DETM_PVT: get_tsrm_alphanum_value(+)');
4244     FND_LOG.STRING(g_level_statement,
4245                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_tsrm_alphanum_value',
4246                    'p_parameter_code: ' || p_parameter_code );
4247   END IF;
4248 
4249   p_return_status := FND_API.G_RET_STS_SUCCESS;
4250 
4251 -- commenting caching as no value check is possible at this point.
4252 -- for checking if the value in cache is matching the current transaction value
4253 -- we need to call get_driver_value
4254 -- therefore commenting the caching logic as calling get_driver_value inside cache is redundant
4255 
4256   /* l_table_index := dbms_utility.get_hash_value(
4257                         p_parameter_code,
4258                         1,
4259                         8192); */
4260 
4261   --IF ZX_TDS_CALC_SERVICES_PUB_PKG.g_tsrm_alphanum_value_tbl.EXISTS(l_table_index) THEN
4262   --  p_trx_alphanumeric_value := ZX_TDS_CALC_SERVICES_PUB_PKG.g_tsrm_alphanum_value_tbl(l_table_index);
4263   --ELSE
4264 
4265     ZX_GET_TAX_PARAM_DRIVER_PKG.get_driver_value(
4266         p_structure_name,
4267         p_structure_index,
4268         p_parameter_code,
4269         p_trx_alphanumeric_value,
4270         p_return_status
4271         );
4272     --IF p_return_status = FND_API.G_RET_STS_SUCCESS THEN
4273     --  ZX_TDS_CALC_SERVICES_PUB_PKG.g_tsrm_alphanum_value_tbl(l_table_index) := p_trx_alphanumeric_value;
4274     --END IF;
4275   --END IF;
4276 
4277   IF (g_level_statement >= g_current_runtime_level ) THEN
4278     FND_LOG.STRING(g_level_statement,
4279                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_tsrm_alphanum_value',
4280                    'trx_char_value: ' || p_trx_alphanumeric_value);
4281     FND_LOG.STRING(g_level_statement,
4282                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_tsrm_alphanum_value.END',
4283                    'ZX_TDS_RULE_BASE_DETM_PVT: get_tsrm_alphanum_value(-)' ||
4284                    ', p_return_status = ' || p_return_status ||
4285                    ', p_error_buffer  = ' || p_error_buffer);
4286   END IF;
4287 
4288 EXCEPTION
4289   WHEN OTHERS THEN
4290     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4291     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
4292 
4293     IF (g_level_unexpected >= g_current_runtime_level ) THEN
4294       FND_LOG.STRING(g_level_unexpected,
4295                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_tsrm_alphanum_value',
4296                       p_error_buffer);
4297     END IF;
4298 
4299 END get_tsrm_alphanum_value;
4300 ----------------------------------------------------------------------
4301 --  PRIVATE PROCEDURE
4302 --  get_account_num_value
4303 --
4304 --  DESCRIPTION
4305 --
4306 --  This procedure gets account parameter value from the cache if available
4307 --  before it calls TSRM API to get the parameter value and then inserts
4308 --  the value to the cache structure
4309 
4310 PROCEDURE get_account_num_value(
4311             p_structure_name         IN  VARCHAR2,
4312             p_structure_index        IN  BINARY_INTEGER,
4313             p_parameter_code         IN  ZX_PARAMETERS_B.TAX_PARAMETER_CODE%TYPE,
4314             p_trx_numeric_value      OUT NOCOPY ZX_CONDITIONS.NUMERIC_VALUE%TYPE,
4315             p_return_status          OUT NOCOPY VARCHAR2,
4316             p_error_buffer           OUT NOCOPY VARCHAR2)
4317 IS
4318   l_table_index                   NUMBER;
4319   l_in_cache_flg                  BOOLEAN := FALSE;
4320 
4321 BEGIN
4322 
4323   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
4324 
4325   IF (g_level_statement >= g_current_runtime_level ) THEN
4326     FND_LOG.STRING(g_level_statement,
4327                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_account_num_value.BEGIN',
4328                    'ZX_TDS_RULE_BASE_DETM_PVT: get_account_num_value(+)');
4329     FND_LOG.STRING(g_level_statement ,
4330                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_account_num_value',
4331                    'p_parameter_code: ' || p_parameter_code );
4332   END IF;
4333   p_return_status := FND_API.G_RET_STS_SUCCESS;
4334 
4335   l_table_index := dbms_utility.get_hash_value(
4336                         p_parameter_code,
4337                         1,
4338                         8192);
4339 
4340   IF ZX_TDS_CALC_SERVICES_PUB_PKG.g_tsrm_num_value_tbl.EXISTS(l_table_index) THEN
4341    IF (ZX_TDS_CALC_SERVICES_PUB_PKG.g_tsrm_num_value_tbl(l_table_index) =
4342               ZX_GLOBAL_STRUCTURES_PKG.TRX_LINE_DIST_TBL.ACCOUNT_CCID(p_structure_index)) THEN
4343       p_trx_numeric_value := ZX_TDS_CALC_SERVICES_PUB_PKG.g_tsrm_num_value_tbl(l_table_index);
4344       l_in_cache_flg := TRUE;
4345    END IF;
4346   END IF;
4347 
4348   IF NOT l_in_cache_flg THEN
4349     ZX_GET_TAX_PARAM_DRIVER_PKG.get_driver_value(
4350         p_structure_name,
4351         p_structure_index,
4352         p_parameter_code,
4353         p_trx_numeric_value,
4354         p_return_status
4355         );
4356 
4357     IF p_return_status = FND_API.G_RET_STS_SUCCESS THEN
4358       ZX_TDS_CALC_SERVICES_PUB_PKG.g_tsrm_num_value_tbl(l_table_index) := p_trx_numeric_value;
4359     END IF;
4360   END IF;
4361 
4362   IF (g_level_statement >= g_current_runtime_level ) THEN
4363     FND_LOG.STRING(g_level_statement,
4364                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_account_num_value',
4365                    'trx_num_value: ' || to_char(p_trx_numeric_value));
4366     FND_LOG.STRING(g_level_statement,
4367                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_account_num_value.END',
4368                    'ZX_TDS_RULE_BASE_DETM_PVT: get_account_num_value(-)' ||
4369                    ', p_return_status = ' || p_return_status ||
4370                    ', p_error_buffer  = ' || p_error_buffer);
4371   END IF;
4372 
4373 EXCEPTION
4374   WHEN OTHERS THEN
4375     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4376     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
4377 
4378     IF (g_level_unexpected >= g_current_runtime_level ) THEN
4379       FND_LOG.STRING(g_level_unexpected,
4380                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_account_num_value',
4381                       p_error_buffer);
4382     END IF;
4383 
4384 END get_account_num_value;
4385 ----------------------------------------------------------------------
4386 --  PRIVATE PROCEDURE
4387 --  get_account_alphanum_value
4388 --
4389 --  DESCRIPTION
4390 --
4391 --  This procedure gets account parameter value from the cache if available
4392 --  before it calls TSRM API to get the parameter value and then inserts
4393 --  the value to the cache structure
4394 
4395 PROCEDURE get_account_alphanum_value(
4396             p_structure_name         IN  VARCHAR2,
4397             p_structure_index        IN  BINARY_INTEGER,
4398             p_parameter_code         IN  ZX_PARAMETERS_B.TAX_PARAMETER_CODE%TYPE,
4399             p_trx_alphanumeric_value    OUT NOCOPY ZX_CONDITIONS.ALPHANUMERIC_VALUE%TYPE,
4400             p_return_status             OUT NOCOPY VARCHAR2,
4401             p_error_buffer              OUT NOCOPY VARCHAR2)
4402 IS
4403   l_table_index                    NUMBER;
4404   l_in_cache_flg                   BOOLEAN := FALSE;
4405 
4406 BEGIN
4407 
4408   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
4409 
4410   IF (g_level_statement >= g_current_runtime_level ) THEN
4411     FND_LOG.STRING(g_level_statement,
4412                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_account_alphanum_value.BEGIN',
4413                    'ZX_TDS_RULE_BASE_DETM_PVT: get_account_alphanum_value(+)');
4414     FND_LOG.STRING(g_level_statement,
4415                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_account_alphanum_value',
4416                    'p_parameter_code: ' || p_parameter_code );
4417   END IF;
4418 
4419   p_return_status := FND_API.G_RET_STS_SUCCESS;
4420 
4421     l_table_index := dbms_utility.get_hash_value(
4422                         p_parameter_code,
4423                         1,
4424                         8192);
4425 
4426   IF ZX_TDS_CALC_SERVICES_PUB_PKG.g_tsrm_alphanum_value_tbl.EXISTS(l_table_index) THEN
4427     IF (ZX_TDS_CALC_SERVICES_PUB_PKG.g_tsrm_alphanum_value_tbl(l_table_index) =
4428            ZX_GLOBAL_STRUCTURES_PKG.TRX_LINE_DIST_TBL.ACCOUNT_STRING(p_structure_index)) THEN
4429       p_trx_alphanumeric_value := ZX_TDS_CALC_SERVICES_PUB_PKG.g_tsrm_alphanum_value_tbl(l_table_index);
4430       l_in_cache_flg := TRUE;
4431     END IF;
4432   END IF;
4433 
4434   IF NOT l_in_cache_flg THEN
4435     ZX_GET_TAX_PARAM_DRIVER_PKG.get_driver_value(
4436         p_structure_name,
4437         p_structure_index,
4438         p_parameter_code,
4439         p_trx_alphanumeric_value,
4440         p_return_status
4441         );
4442     IF p_return_status = FND_API.G_RET_STS_SUCCESS THEN
4443       ZX_TDS_CALC_SERVICES_PUB_PKG.g_tsrm_alphanum_value_tbl(l_table_index) := p_trx_alphanumeric_value;
4444     END IF;
4445   END IF;
4446 
4447   IF (g_level_statement >= g_current_runtime_level ) THEN
4448     FND_LOG.STRING(g_level_statement,
4449                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_account_alphanum_value',
4450                    'trx_char_value: ' || p_trx_alphanumeric_value);
4451     FND_LOG.STRING(g_level_statement,
4452                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_account_alphanum_value.END',
4453                    'ZX_TDS_RULE_BASE_DETM_PVT: get_account_alphanum_value(-)' ||
4454                    ', p_return_status = ' || p_return_status ||
4455                    ', p_error_buffer  = ' || p_error_buffer);
4456   END IF;
4457 
4458 EXCEPTION
4459   WHEN OTHERS THEN
4460     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4461     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
4462 
4463     IF (g_level_unexpected >= g_current_runtime_level ) THEN
4464       FND_LOG.STRING(g_level_unexpected,
4465                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_account_alphanum_value',
4466                       p_error_buffer);
4467     END IF;
4468 
4469 END get_account_alphanum_value;
4470 -----------------------------------------------------------------------
4471 --  PRIVATE PROCEDURE
4472 --  get_user_item_type_value
4473 --
4474 --  DESCRIPTION
4475 --
4476 --  This procedure is to get user item type value when
4477 --  Determining_Factor_Class_Code = 'PRODUCT_FISCAL_CLASS'.
4478 --  It is called from procedure get_trx_value.  It calls appropriate
4479 --  function to get trx value directly.
4480 --
4481 
4482 PROCEDURE get_user_item_type_value(
4483             p_structure_name     IN  VARCHAR2,
4484             p_structure_index    IN  BINARY_INTEGER,
4485             p_condition_index    IN  BINARY_INTEGER,
4486 	    p_event_class_rec    IN  ZX_API_PUB.EVENT_CLASS_REC_TYPE,
4487 	    p_numeric_value      OUT NOCOPY ZX_CONDITIONS.NUMERIC_VALUE%TYPE,
4488             p_alphanum_value     OUT NOCOPY ZX_CONDITIONS.ALPHANUMERIC_VALUE%TYPE,
4489             p_return_status      OUT NOCOPY VARCHAR2,
4490             p_error_buffer       OUT NOCOPY VARCHAR2)
4491 IS
4492    i        BINARY_INTEGER;
4493 BEGIN
4494 
4495   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
4496 
4497   IF (g_level_statement >= g_current_runtime_level ) THEN
4498     FND_LOG.STRING(g_level_statement,
4499                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_user_item_type_value.BEGIN',
4500                    'ZX_TDS_RULE_BASE_DETM_PVT: get_user_item_type_value(+)');
4501   END IF;
4502 
4503   p_return_status := FND_API.G_RET_STS_SUCCESS;
4504 
4505   i :=  p_condition_index;
4506 
4507   IF g_data_type_tbl(i) = 'ALPHANUMERIC' THEN
4508 
4509     get_user_item_alphanum_value(
4510             p_structure_name,
4511             p_structure_index,
4512             g_determining_factor_code_tbl(i),
4513 	    p_event_class_rec,
4514             p_alphanum_value,
4515             p_return_status,
4516             p_error_buffer);
4517 
4518     IF (g_level_statement >= g_current_runtime_level ) THEN
4519       FND_LOG.STRING(g_level_statement,
4520                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_user_item_type_value',
4521                      'parameter code: ' || g_determining_factor_code_tbl(i) ||
4522                      ', p_alphanum_value: ' || p_alphanum_value );
4523     END IF;
4524   ELSE
4525 
4526     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4527     p_error_buffer  := 'Invalid data type';
4528     IF (g_level_unexpected >= g_current_runtime_level ) THEN
4529       FND_LOG.STRING(g_level_unexpected,
4530                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_user_item_type_value',
4531                      'Invalid data type, data type must be ALPHANUMERIC');
4532     END IF;
4533 
4534   END IF;
4535 
4536   IF (g_level_statement >= g_current_runtime_level ) THEN
4537     FND_LOG.STRING(g_level_statement,
4538                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_user_item_type_value.END',
4539                    'ZX_TDS_RULE_BASE_DETM_PVT: get_user_item_type_value(-)' ||
4540                    ', p_return_status = ' || p_return_status ||
4541                    ', p_error_buffer  = ' || p_error_buffer);
4542   END IF;
4543 
4544 EXCEPTION
4545   WHEN OTHERS THEN
4546     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4547     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
4548 
4549     IF (g_level_unexpected >= g_current_runtime_level ) THEN
4550       FND_LOG.STRING(g_level_unexpected,
4551                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_user_item_type_value',
4552                       p_error_buffer);
4553     END IF;
4554 
4555 END get_user_item_type_value;
4556 -----------------------------------------------------------------------
4557 
4558 --  PRIVATE PROCEDURE
4559 --  get_user_item_alphanum_value
4560 --
4561 --  DESCRIPTION
4562 --
4563 --  This procedure gets user item type value from the cache if available
4564 --  before it calls TSRM API to get the user item type value and then inserts
4565 --  the value to the cache structure
4566 
4567 PROCEDURE get_user_item_alphanum_value(
4568             p_structure_name         IN  VARCHAR2,
4569             p_structure_index        IN  BINARY_INTEGER,
4570             p_parameter_code         IN  ZX_PARAMETERS_B.TAX_PARAMETER_CODE%TYPE,
4571 	    p_event_class_rec        IN  ZX_API_PUB.EVENT_CLASS_REC_TYPE,
4572             p_trx_alphanumeric_value    OUT NOCOPY ZX_CONDITIONS.ALPHANUMERIC_VALUE%TYPE,
4573             p_return_status             OUT NOCOPY VARCHAR2,
4574             p_error_buffer              OUT NOCOPY VARCHAR2)
4575 IS
4576   l_table_index                    NUMBER;
4577   l_trx_alphanumeric_value         ZX_CONDITIONS.ALPHANUMERIC_VALUE%TYPE;
4578   l_in_cache_flg                   BOOLEAN := FALSE;
4579 
4580 BEGIN
4581 
4582   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
4583 
4584   IF (g_level_statement >= g_current_runtime_level ) THEN
4585     FND_LOG.STRING(g_level_statement,
4586                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_user_item_alphanum_value.BEGIN',
4587                    'ZX_TDS_RULE_BASE_DETM_PVT: get_user_item_alphanum_value(+)');
4588     FND_LOG.STRING(g_level_statement,
4589                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_user_item_alphanum_value',
4590                    'p_parameter_code: ' || p_parameter_code );
4591   END IF;
4592 
4593   p_return_status := FND_API.G_RET_STS_SUCCESS;
4594 
4595     l_table_index := dbms_utility.get_hash_value(
4596                         p_parameter_code,
4597                         1,
4598                         8192);
4599   BEGIN
4600       SELECT item_type
4601       INTO l_trx_alphanumeric_value
4602       FROM MTL_SYSTEM_ITEMS
4603       WHERE inventory_item_id =	ZX_GLOBAL_STRUCTURES_PKG.TRX_LINE_DIST_TBL.PRODUCT_ID(p_structure_index)
4604       AND organization_id =  nvl(ZX_GLOBAL_STRUCTURES_PKG.TRX_LINE_DIST_TBL.PRODUCT_ORG_ID(p_structure_index),
4605                                          p_event_class_rec.internal_organization_id);
4606   EXCEPTION
4607       WHEN NO_DATA_FOUND then
4608          p_trx_alphanumeric_value  := NULL;
4609       WHEN TOO_MANY_ROWS then
4610          p_trx_alphanumeric_value := NULL;
4611   END;
4612 
4613   IF ZX_TDS_CALC_SERVICES_PUB_PKG.g_tsrm_alphanum_value_tbl.EXISTS(l_table_index) THEN
4614     IF ZX_TDS_CALC_SERVICES_PUB_PKG.g_tsrm_alphanum_value_tbl(l_table_index) = l_trx_alphanumeric_value THEN
4615       p_trx_alphanumeric_value := ZX_TDS_CALC_SERVICES_PUB_PKG.g_tsrm_alphanum_value_tbl(l_table_index);
4616       l_in_cache_flg := TRUE;
4617     END IF;
4618   END IF;
4619 
4620   IF NOT l_in_cache_flg THEN
4621     ZX_TDS_CALC_SERVICES_PUB_PKG.g_tsrm_alphanum_value_tbl(l_table_index) := l_trx_alphanumeric_value;
4622     p_trx_alphanumeric_value := l_trx_alphanumeric_value;
4623   END IF;
4624 
4625   IF (g_level_statement >= g_current_runtime_level ) THEN
4626     FND_LOG.STRING(g_level_statement,
4627                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_user_item_alphanum_value',
4628                    'trx_char_value: ' || p_trx_alphanumeric_value);
4629     FND_LOG.STRING(g_level_statement,
4630                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_user_item_alphanum_value.END',
4631                    'ZX_TDS_RULE_BASE_DETM_PVT: get_user_item_alphanum_value(-)' ||
4632                    ', p_return_status = ' || p_return_status ||
4633                    ', p_error_buffer  = ' || p_error_buffer);
4634   END IF;
4635 EXCEPTION
4636   WHEN OTHERS THEN
4637     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4638     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
4639 
4640     IF (g_level_unexpected >= g_current_runtime_level ) THEN
4641       FND_LOG.STRING(g_level_unexpected,
4642                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_user_item_alphanum_value',
4643                       p_error_buffer);
4644     END IF;
4645 
4646 END get_user_item_alphanum_value;
4647 
4648 -----------------------------------------------------------------------
4649 --  PRIVATE PROCEDURE
4650 --  get_fc
4651 --
4652 --  DESCRIPTION
4653 --    This procedure returns the fiscal classification code  obtained from
4654 --    the cache structure if available, if not it calls TCM API to get it
4655 --    and insert the value to the cache structure
4656 --
4657 
4658 PROCEDURE get_fc(
4659             p_structure_name          IN  VARCHAR2,
4660             p_structure_index         IN  BINARY_INTEGER,
4661             p_condition_index         IN  BINARY_INTEGER,
4662 	    p_tax_determine_date      IN  ZX_LINES.TAX_DETERMINE_DATE%TYPE,
4663             p_tax_regime_code         IN  ZX_REGIMES_B.TAX_REGIME_CODE%TYPE,
4664             p_event_class_rec         IN  ZX_API_PUB.EVENT_CLASS_REC_TYPE,
4665             p_trx_alphanumeric_value  OUT NOCOPY ZX_CONDITIONS.ALPHANUMERIC_VALUE%TYPE,
4666             p_Determining_Factor_Cq_Code   IN ZX_CONDITIONS.Determining_Factor_Cq_Code%TYPE,
4667 	    p_return_status           OUT NOCOPY VARCHAR2,
4668     	    p_error_buffer            OUT NOCOPY VARCHAR2)
4669 
4670 IS
4671   l_found                           BOOLEAN;
4672   l_first_party_flag                BOOLEAN;
4673   l_substr_cq_party                 VARCHAR2(15);
4674   l_hq_estb_flag                    VARCHAR2(1);
4675   l_le_flag                         VARCHAR2(1);
4676   l_third_party_flag                VARCHAR2(1);
4677   l_parameter_code                  ZX_PARAMETERS_B.TAX_PARAMETER_CODE%TYPE;
4678   l_classified_entity_id 	    NUMBER;
4679   l_item_org_id                     NUMBER;
4680   l_le_id                           NUMBER;
4681   l_length                          NUMBER;
4682   l_prod_trx_parm_value             ZX_CONDITIONS.ALPHANUMERIC_VALUE%TYPE;
4683   l_fsc_rec                         ZX_TCM_CONTROL_PKG.ZX_FISCAL_CLASS_INFO_REC;
4684   l_fsc_cat_rec                     ZX_TCM_CONTROL_PKG.ZX_CATEGORY_CODE_INFO_REC;
4685   i                                 BINARY_INTEGER;
4686   j                                 BINARY_INTEGER;
4687   l_classification_category         ZX_FC_TYPES_B.Classification_Type_Categ_Code%TYPE;
4688   l_classification_type             ZX_FC_TYPES_B.CLASSIFICATION_TYPE_CODE%TYPE;
4689   l_condition_value                 ZX_CONDITIONS.ALPHANUMERIC_VALUE%TYPE;
4690 
4691   l_fc_base_category_set_id         zx_fc_types_b.owner_id_num%TYPE;
4692   l_fc_level                        zx_fc_types_b.classification_type_level_code%TYPE;
4693   l_level_start_position            zx_fc_types_b.start_position%TYPE;
4694   l_level_num_characters            zx_fc_types_b.num_characters%TYPE;
4695   l_level_delimiter                 zx_fc_types_b.delimiter%TYPE;
4696   l_default_taxation_country        zx_lines_det_factors.default_taxation_country%TYPE;
4697   l_country_def_category_set_id     zx_fc_country_defaults.primary_inventory_category_set%TYPE;
4698   l_product_fisc_classification     zx_lines_det_factors.product_fisc_classification%TYPE;
4699 
4700   -- Added following cursor for Bug Fix 5163401
4701 
4702   CURSOR c_get_le_ptp_id(c_le_id NUMBER) IS
4703   SELECT ptp.party_tax_profile_id
4704   FROM zx_party_tax_profile ptp,
4705        xle_entity_profiles le
4706   WHERE ptp.party_type_code = 'FIRST_PARTY'
4707   AND   ptp.party_id = le.party_id
4708   AND   le.legal_entity_id = c_le_id;
4709 
4710   CURSOR c_fc_base_category_set(c_classification_type_code VARCHAR2) IS
4711   SELECT owner_id_num,
4712          classification_type_level_code,
4713          start_position,
4714          num_characters,
4715          delimiter
4716     FROM zx_fc_types_b
4717    WHERE classification_type_code = c_classification_type_code;
4718 
4719   CURSOR c_country_def_category_set_id(c_country_code VARCHAR2) IS
4720   SELECT primary_inventory_category_set
4721     FROM zx_fc_country_defaults
4722    WHERE country_code = c_country_code;
4723 
4724 BEGIN
4725 
4726   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
4727 
4728   IF (g_level_procedure >= g_current_runtime_level ) THEN
4729     FND_LOG.STRING(g_level_procedure,
4730                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_fc.BEGIN',
4731                    'ZX_TDS_RULE_BASE_DETM_PVT: get_fc(+)');
4732   END IF;
4733 
4734   p_return_status := FND_API.G_RET_STS_SUCCESS;
4735 
4736   i :=  p_condition_index;
4737 
4738   l_classification_category := g_determining_factor_class_tbl(i);
4739   l_classification_type     := g_determining_factor_code_tbl(i);
4740   l_condition_value         := g_alphanum_value_tbl(i);
4741 
4742   IF (g_level_statement >= g_current_runtime_level ) THEN
4743     FND_LOG.STRING(g_level_statement,
4744                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_fc',
4745                    'l_classification_category: ' || l_classification_category ||
4746                    ', l_classification_type: '|| l_classification_type ||
4747                    ', l_condition_value: ' || l_condition_value);
4748   END IF;
4749 
4750   IF l_classification_category IN ('PRODUCT_GENERIC_CLASSIFICATION',
4751                                    'TRX_GENERIC_CLASSIFICATION',
4752                                    'DOCUMENT') THEN
4753 
4754     IF l_classification_category = 'DOCUMENT' THEN
4755       -- bug#5014051-
4756       l_parameter_code := 'DOCUMENT_SUB_TYPE';
4757     ELSIF l_classification_category = 'PRODUCT_GENERIC_CLASSIFICATION' THEN
4758       l_parameter_code := 'PRODUCT_CATEGORY';
4759     ELSE
4760       l_parameter_code := 'TRX_BUSINESS_CATEGORY';
4761     END IF;
4762     --
4763     -- get transaction value from TSRM
4764     --
4765     get_tsrm_alphanum_value(
4766         p_structure_name,
4767         p_structure_index,
4768         l_parameter_code,
4769         l_prod_trx_parm_value,
4770         p_return_status,
4771         p_error_buffer );
4772 
4773     IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
4774       IF (g_level_error >= g_current_runtime_level ) THEN
4775         FND_LOG.STRING(g_level_error,
4776                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_fc',
4777                      'Incorrect return_status after calling get_tsrm_alphanum_value()' ||
4778                      ', return_status: ' || p_return_status);
4779       END IF;
4780 
4781       RETURN;
4782     END IF;
4783 
4784     IF (g_level_statement >= g_current_runtime_level ) THEN
4785       FND_LOG.STRING(g_level_statement,
4786                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_fc',
4787                      'l_prod_trx_parm_value: ' || l_prod_trx_parm_value);
4788     END IF;
4789 
4790     --
4791     -- get driver_value from TCM API
4792     --
4793     l_fsc_cat_rec.classification_type     := l_classification_type;
4794     l_fsc_cat_rec.tax_determine_date      := p_tax_determine_date;
4795     l_fsc_cat_rec.classification_category := l_classification_category;
4796     l_fsc_cat_rec.parameter_value         := l_prod_trx_parm_value;
4797     l_fsc_cat_rec.condition_subclass      := p_Determining_Factor_Cq_Code;
4798 
4799 
4800     IF (g_level_statement >= g_current_runtime_level ) THEN
4801       FND_LOG.STRING(g_level_statement,
4802                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_fc',
4803                      'calling ZX_TCM_CONTROL_PKG.GET_PROD_TRX_CATE_VALUE');
4804     END IF;
4805 
4806 
4807     IF p_Determining_Factor_Cq_Code is NULL then
4808     -- CR 2944893 use the value passed from the transaction as the condition value
4809     -- when class qualifier is NULL
4810 
4811        p_trx_alphanumeric_value := l_prod_trx_parm_value;
4812 
4813     ELSE
4814        ZX_TCM_CONTROL_PKG.GET_PROD_TRX_CATE_VALUE(
4815                          l_fsc_cat_rec,
4816                          p_return_status);
4817 
4818        IF p_return_status  = FND_API.G_RET_STS_SUCCESS THEN
4819          p_trx_alphanumeric_value := l_fsc_cat_rec.condition_value;
4820        END IF;
4821 
4822     END  IF; -- Null Class Qualifier
4823 
4824   ELSIF l_classification_category = 'TRX_FISCAL_CLASS' THEN
4825 
4826     l_parameter_code := 'TRX_BUSINESS_CATEGORY';
4827 
4828     -- get transaction value from TSRM
4829     get_tsrm_alphanum_value(
4830         p_structure_name,
4831         p_structure_index,
4832         l_parameter_code,
4833         l_prod_trx_parm_value,
4834         p_return_status,
4835         p_error_buffer );
4836 
4837     IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
4838       IF (g_level_error >= g_current_runtime_level ) THEN
4839         FND_LOG.STRING(g_level_error,
4840                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_fc',
4841                      'Incorrect return_status after calling get_tsrm_alphanum_value()' ||
4842                      ', return_status: ' || p_return_status);
4843       END IF;
4844       RETURN;
4845     END IF;
4846 
4847     l_fsc_rec.classification_type     := l_classification_type;
4848     l_fsc_rec.tax_regime_code         := p_tax_regime_code;
4849     l_fsc_rec.tax_determine_date      := p_tax_determine_date;
4850     l_fsc_rec.classification_category := l_classification_category;
4851     l_fsc_rec.classified_entity_id    := l_classified_entity_id;
4852     l_fsc_rec.application_id          := p_event_class_rec.application_id;
4853     l_fsc_rec.event_class_code        := l_prod_trx_parm_value;
4854     l_fsc_rec.condition_value         := l_condition_value;
4855 
4856     IF l_prod_trx_parm_value IS NOT NULL  THEN
4857 
4858       ZX_TCM_CONTROL_PKG.GET_FISCAL_CLASSIFICATION(
4859 		l_fsc_rec,
4860 		p_return_status);
4861 
4862       IF p_return_status = FND_API.G_RET_STS_SUCCESS THEN
4863          p_trx_alphanumeric_value := l_fsc_rec.fsc_code;
4864       ELSE
4865       	-- Bugfix 4882676: ignore error even if fc not found
4866         p_return_status := FND_API.G_RET_STS_SUCCESS;
4867         IF (g_level_statement >= g_current_runtime_level ) THEN
4868           FND_LOG.STRING(g_level_statement,
4869                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_fc',
4870                      'ignore error even if fc not found ' );
4871         END IF;
4872       END IF;
4873 
4874     END IF;  --Checking for NULL case for calling GET_FISCAL_CLASSIFICATION
4875 
4876   ELSIF l_classification_category = 'PRODUCT_FISCAL_CLASS' THEN
4877 
4878     -- get base category_set_id for the FC type
4879     OPEN c_fc_base_category_set(l_classification_type);
4880     FETCH c_fc_base_category_set
4881      INTO l_fc_base_category_set_id,
4882           l_fc_level,
4883           l_level_start_position,
4884           l_level_num_characters,
4885           l_level_delimiter;
4886     CLOSE c_fc_base_category_set;
4887 
4888     IF (g_level_statement >= g_current_runtime_level ) THEN
4889       FND_LOG.STRING(g_level_statement,
4890                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_fc',
4891                    'l_fc_base_category_set_id: '||l_fc_base_category_set_id ||
4892                    ', l_fc_level: '||l_fc_level ||
4893                    ', l_level_start_position: '||l_level_start_position ||
4894                    ', l_level_num_characters: '||l_level_num_characters ||
4895                    ', l_level_delimiter: '||l_level_delimiter );
4896     END IF;
4897 
4898     -- get category_set_id for the taxation_country
4899     l_parameter_code := 'DEFAULT_TAXATION_COUNTRY';
4900 
4901     -- get transaction value from TSRM
4902     get_tsrm_alphanum_value(
4903       p_structure_name,
4904       p_structure_index,
4905       l_parameter_code,
4906       l_default_taxation_country,
4907       p_return_status,
4908       p_error_buffer );
4909 
4910     IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
4911       IF (g_level_error >= g_current_runtime_level ) THEN
4912         FND_LOG.STRING(g_level_error,
4913                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_fc',
4914                      'Called get_tsrm_num_value to get DEFAULT_TAXATION_COUNTRY' ||
4915                      ', return_status: ' || p_return_status);
4916       END IF;
4917 
4918       RETURN;
4919     END IF;
4920 
4921     OPEN c_country_def_category_set_id(l_default_taxation_country);
4922 
4923     FETCH c_country_def_category_set_id into l_country_def_category_set_id;
4924     CLOSE c_country_def_category_set_id;
4925 
4926     IF (g_level_statement >= g_current_runtime_level ) THEN
4927       FND_LOG.STRING(g_level_statement,
4928                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_fc',
4929                    'l_country_def_category_set_id: '||l_country_def_category_set_id );
4930     END IF;
4931 
4932     l_parameter_code := 'PRODUCT_FISC_CLASSIFICATION';
4933 
4934     -- get transaction value from TSRM
4935     get_tsrm_alphanum_value(
4936       p_structure_name,
4937       p_structure_index,
4938       l_parameter_code,
4939       l_product_fisc_classification,
4940       p_return_status,
4941       p_error_buffer );
4942 
4943     IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
4944       IF (g_level_error >= g_current_runtime_level ) THEN
4945         FND_LOG.STRING(g_level_error,
4946                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_fc',
4947                      'Called get_tsrm_num_value to get PRODUCT_FISC_CLASSIFICATION' ||
4948                      ', return_status: ' || p_return_status);
4949       END IF;
4950 
4951       RETURN;
4952     END IF;
4953 
4954     IF l_fc_base_category_set_id = l_country_def_category_set_id
4955       AND l_product_fisc_classification IS NOT NULL
4956     THEN
4957 
4958       -- If the base inventory category set (id) for the FC Type of
4959       -- the rule matches the value of the country default (of the
4960       -- default taxation country), rule value will be compared with
4961       -- (substring) transaction line level value and if it does not match,
4962       -- then rule will not be considered as successful.
4963 
4964       -- If the transaction line level value is high than that of the condition value,
4965       -- need to get the substring of the same level of the condition value.
4966       -- Should not use LENGTHB() since the NUM_CHARACTERS counts in characters
4967       -- NOTE: LENGTH(l_condition_value) = l_level_num_characters
4968 
4969       p_trx_alphanumeric_value := l_product_fisc_classification;
4970 
4971       IF l_level_delimiter IS NULL THEN
4972         -- product fiscal class is sub string type
4973 
4974         IF LENGTH(p_trx_alphanumeric_value) > NVL(l_level_start_position, 1) + l_level_num_characters - 1 THEN
4975           p_trx_alphanumeric_value := SUBSTR(p_trx_alphanumeric_value,
4976                                              NVL(l_level_start_position, 1),
4977                                              l_level_num_characters);
4978         END IF;
4979 
4980       ELSE
4981         -- product fiscal class is delimiter type
4982 
4983         IF INSTR(p_trx_alphanumeric_value, l_level_delimiter, 1, l_fc_level) > 0 THEN
4984           p_trx_alphanumeric_value := SUBSTR(p_trx_alphanumeric_value,
4985                                              1,
4986                                              INSTR(p_trx_alphanumeric_value, l_level_delimiter, 1, l_fc_level) - 1 );
4987         END IF;
4988 
4989       END IF;
4990 
4991     ELSE
4992       -- If the base inventory category set (id) for the FC Type of the
4993       -- rule "Does Not" match the value of the country default (of the
4994       -- default taxation country), rule value will be compared value
4995       -- associated with item.
4996 
4997       l_parameter_code := 'PRODUCT_ID';
4998 
4999       -- get transaction value from TSRM
5000       get_tsrm_num_value(
5001         p_structure_name,
5002         p_structure_index,
5003         l_parameter_code,
5004         l_classified_entity_id,
5005         p_return_status,
5006         p_error_buffer );
5007 
5008       IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
5009         IF (g_level_error >= g_current_runtime_level ) THEN
5010           FND_LOG.STRING(g_level_error,
5011                        'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_fc',
5012                        'Called get_tsrm_num_value to get PRODUCT_ID' ||
5013                        ', return_status: ' || p_return_status);
5014         END IF;
5015 
5016         RETURN;
5017       END IF;
5018 
5019       -- get organization id for item
5020       l_parameter_code := 'PRODUCT_ORG_ID';
5021       get_tsrm_num_value(
5022         p_structure_name,
5023         p_structure_index,
5024         l_parameter_code,
5025         l_item_org_id,
5026         p_return_status,
5027         p_error_buffer );
5028 
5029       IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
5030         IF (g_level_error >= g_current_runtime_level ) THEN
5031           FND_LOG.STRING(g_level_error,
5032                        'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_fc',
5033                        'Called get_tsrm_num_value to get PRODUCT_ORG_ID' ||
5034                        ', return_status: ' || p_return_status);
5035         END IF;
5036         RETURN;
5037       END IF;
5038 
5039       IF (g_level_statement >= g_current_runtime_level ) THEN
5040         FND_LOG.STRING(g_level_statement,
5041                        'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_fc',
5042                        'item_org_id: ' || to_char(l_item_org_id));
5043       END IF;
5044 
5045 
5046       --
5047       -- check if can get fsc code from the cache
5048       --
5049       get_fsc_code(
5050              l_found,
5051              p_tax_regime_code,
5052              l_classification_category,
5053              l_classification_type,
5054              p_tax_determine_date,
5055              l_classified_entity_id,
5056              l_item_org_id,
5057              p_event_class_rec,
5058              p_trx_alphanumeric_value);
5059 
5060       IF NOT l_found THEN
5061         l_fsc_rec.classification_type     := l_classification_type;
5062         l_fsc_rec.tax_regime_code         := p_tax_regime_code;
5063         l_fsc_rec.tax_determine_date      := p_tax_determine_date;
5064         l_fsc_rec.classification_category := l_classification_category;
5065         l_fsc_rec.classified_entity_id    := l_classified_entity_id;
5066         l_fsc_rec.item_org_id             := l_item_org_id;
5067         l_fsc_rec.application_id          := p_event_class_rec.application_id;
5068         l_fsc_rec.event_class_code        := p_event_class_rec.event_class_code;
5069         l_fsc_rec.condition_value         := l_condition_value;
5070 
5071         IF (g_level_statement >= g_current_runtime_level ) THEN
5072           FND_LOG.STRING(g_level_statement,
5073                          'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_fc',
5074                          'calling ZX_TCM_CONTROL_PKG.GET_FISCAL_CLASSIFICATION');
5075         END IF;
5076 
5077         --Bug Fix 4774215
5078        /*If there is no enough information to call the procedure while evaluating rule,need to
5079          go further and evaluate the next rule in the hierarchy.*/
5080 
5081        -- Bug fix 4941566
5082        /* Only product category need the item_org_id */
5083 
5084        IF (l_fsc_rec.classified_entity_id is NOT NULL AND
5085            l_fsc_rec.item_org_id is NOT NULL)
5086        THEN
5087 
5088         ZX_TCM_CONTROL_PKG.GET_FISCAL_CLASSIFICATION(
5089           l_fsc_rec,
5090           p_return_status);
5091 
5092         IF p_return_status = FND_API.G_RET_STS_SUCCESS THEN
5093             p_trx_alphanumeric_value := l_fsc_rec.fsc_code;
5094             j := ZX_TDS_CALC_SERVICES_PUB_PKG.g_fsc_tbl.count + 1;
5095             ZX_TDS_CALC_SERVICES_PUB_PKG.g_fsc_tbl(j) := l_fsc_rec;
5096 
5097         ELSE
5098         	-- Bugfix 4882676: ignore error even if fc not found
5099           p_return_status := FND_API.G_RET_STS_SUCCESS;
5100           IF (g_level_statement >= g_current_runtime_level ) THEN
5101             FND_LOG.STRING(g_level_statement,
5102                        'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_fc',
5103                        'ignore error even if fc not found ' );
5104           END IF;
5105         END IF;
5106 
5107        END IF;  --Checking for NULL case for calling GET_FISCAL_CLASSIFICATION
5108       END IF; -- Not found in cache
5109     END IF; --  l_fc_base_category_set_id = l_country_def_category_set_id
5110   ELSE
5111     --
5112     -- party,  transaction, product fiscal classifications
5113     --
5114     IF l_classification_category  = 'PARTY_FISCAL_CLASS' THEN
5115 
5116 -- Fix for Bug 4873457 - Site level classification for first parties implies the classification
5117 -- of secondary establishments (i.e., not of type HQ establishments)
5118 --                     - Party level classification for first parties implies the classification
5119 -- of HQ establishments. Optionally, in the case of party level classifications, we can attempt
5120 -- to derive the classifications at LE level. This makes sense as we currently allow the fiscal
5121 -- classification of LEs in our UIs. [Note that this is **different** from Legal Classifications]
5122 
5123       IF l_classification_category  = 'PARTY_FISCAL_CLASS' THEN
5124         l_first_party_flag := evaluate_if_first_party(p_Determining_Factor_Cq_Code);
5125       END IF;
5126 
5127 -- Fix for Bug 5163401 - Site level is removed from the rule conditions. Following is the logic:
5128 --
5129 -- For Third Parties: Look at site first and then at the party. For example, if 'Bill From'
5130 -- represents a third party for the input event class, then look for Party FC associated with
5131 -- 'Bill From Party Site' first. If no assignments are found for this, i.e. if TCM API returns
5132 -- G_MISS_CHAR, then look for Party FC associated with 'Bill From Party'.
5133 --
5134 -- For First Parties: Look at the Secondary Estalishment first and if not found, then look at the
5135 -- HQ Establishment and if it is also not found, look for the Legal Entity. For example, if
5136 -- 'Bill From' represents a first party establishment for the input event class, then look for Party
5137 -- FC associated with 'Bill From Party Site' first. If no assignments are found for this, then look for
5138 -- Party FC associated with 'HQ Establishment'. If this is also not found, then look for the Party FC
5139 -- associated with 'Legal Entity'.
5140 --
5141 
5142       IF l_first_party_flag THEN
5143         l_parameter_code  := p_Determining_Factor_Cq_Code || '_' || 'TAX_PROF_ID';
5144         l_hq_estb_flag := 'N';
5145       ELSE
5146         l_parameter_code  := REPLACE(p_Determining_Factor_Cq_Code, 'PARTY', 'SITE') || '_' || 'TAX_PROF_ID';
5147         l_third_party_flag := 'N';
5148       END IF;
5149 
5150     ELSIF l_classification_category = 'LEGAL_PARTY_FISCAL_CLASS' THEN
5151       l_parameter_code := 'LEGAL_ENTITY_ID';
5152     END IF;
5153 
5154     --
5155     -- get transaction value from TSRM
5156     --
5157     get_tsrm_num_value(
5158       p_structure_name,
5159       p_structure_index,
5160       l_parameter_code,
5161       l_classified_entity_id,
5162       p_return_status,
5163       p_error_buffer );
5164 
5165     IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
5166       IF (g_level_error >= g_current_runtime_level ) THEN
5167         FND_LOG.STRING(g_level_error,
5168                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_fc',
5169                      'Incorrect return_status after calling  get_tsrm_num_value' ||
5170                      ', return_status: ' || p_return_status);
5171       END IF;
5172 
5173       RETURN;
5174     END IF;
5175 
5176     IF l_classification_category  = 'PARTY_FISCAL_CLASS'
5177      AND l_classified_entity_id IS NULL THEN
5178 
5179       IF l_first_party_flag THEN
5180         l_parameter_code := 'HQ_ESTB_PARTY_TAX_PROF_ID';
5181         l_hq_estb_flag := 'Y';
5182       ELSE
5183         l_parameter_code  := p_Determining_Factor_Cq_Code || '_' || 'TAX_PROF_ID';
5184         l_third_party_flag := 'Y';
5185       END IF;
5186 
5187       --
5188       -- get transaction value from TSRM
5189       --
5190       get_tsrm_num_value(
5191         p_structure_name,
5192         p_structure_index,
5193         l_parameter_code,
5194         l_classified_entity_id,
5195         p_return_status,
5196         p_error_buffer );
5197 
5198       IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
5199         IF (g_level_error >= g_current_runtime_level ) THEN
5200           FND_LOG.STRING(g_level_error,
5201                        'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_fc',
5202                        'Incorrect return_status after calling  get_tsrm_num_value' ||
5203                        ', return_status: ' || p_return_status);
5204         END IF;
5205 
5206         RETURN;
5207       END IF;
5208 
5209     END IF; -- End of check for classification category and classified entity id
5210 
5211     IF (g_level_statement >= g_current_runtime_level ) THEN
5212       FND_LOG.STRING(g_level_statement,
5213                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_fc',
5214                      'classified_entity_id: ' || to_char(l_classified_entity_id));
5215     END IF;
5216 
5217     --
5218     -- check if can get fsc code from the cache
5219     --
5220     get_fsc_code(
5221            l_found,
5222            p_tax_regime_code,
5223            l_classification_category,
5224            l_classification_type,
5225            p_tax_determine_date,
5226            l_classified_entity_id,
5227            l_item_org_id,
5228            p_event_class_rec,
5229            p_trx_alphanumeric_value);
5230 
5231     IF NOT l_found THEN
5232       l_fsc_rec.classification_type     := l_classification_type;
5233       l_fsc_rec.tax_regime_code         := p_tax_regime_code;
5234       l_fsc_rec.tax_determine_date      := p_tax_determine_date;
5235       l_fsc_rec.classification_category := l_classification_category;
5236       l_fsc_rec.classified_entity_id    := l_classified_entity_id;
5237       l_fsc_rec.item_org_id             := l_item_org_id;
5238       l_fsc_rec.application_id          := p_event_class_rec.application_id;
5239       l_fsc_rec.event_class_code        := p_event_class_rec.event_class_code;
5240       l_fsc_rec.condition_value         := l_condition_value;
5241 
5242       IF (g_level_statement >= g_current_runtime_level ) THEN
5243         FND_LOG.STRING(g_level_statement,
5244                        'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_fc',
5245                        'calling ZX_TCM_CONTROL_PKG.GET_FISCAL_CLASSIFICATION');
5246       END IF;
5247 
5248       --Bug Fix 4774215
5249      /*If there is no enough information to call the procedure while evaluating rule,need to
5250        go further and evaluate the next rule in the hierarchy.*/
5251 
5252      -- Bug fix 4941566
5253      /* Only product category need the item_org_id */
5254 
5255      IF l_fsc_rec.classified_entity_id is NOT NULL THEN
5256 
5257       ZX_TCM_CONTROL_PKG.GET_FISCAL_CLASSIFICATION(
5258   	l_fsc_rec,
5259 	p_return_status);
5260 
5261       IF p_return_status = FND_API.G_RET_STS_SUCCESS THEN
5262 
5263         IF (l_classification_category = 'PARTY_FISCAL_CLASS' AND l_fsc_rec.fsc_code <> FND_API.G_MISS_CHAR)
5264           OR (l_classification_category <> 'PARTY_FISCAL_CLASS') THEN
5265           p_trx_alphanumeric_value := l_fsc_rec.fsc_code;
5266           j := ZX_TDS_CALC_SERVICES_PUB_PKG.g_fsc_tbl.count + 1;
5267           ZX_TDS_CALC_SERVICES_PUB_PKG.g_fsc_tbl(j) := l_fsc_rec;
5268         END IF;
5269 
5270       ELSE
5271       	-- Bugfix 4882676: ignore error even if fc not found
5272         p_return_status := FND_API.G_RET_STS_SUCCESS;
5273         IF (g_level_statement >= g_current_runtime_level ) THEN
5274           FND_LOG.STRING(g_level_statement,
5275                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_fc',
5276                      'ignore error even if fc not found ' );
5277         END IF;
5278       END IF;
5279 
5280      END IF;  --Checking for NULL case for calling GET_FISCAL_CLASSIFICATION
5281     END IF;
5282   END IF;
5283 
5284   IF l_classification_category  = 'PARTY_FISCAL_CLASS'
5285      AND l_fsc_rec.fsc_code = FND_API.G_MISS_CHAR THEN
5286 
5287     l_fsc_rec.fsc_code := NULL;
5288 
5289     IF l_third_party_flag = 'Y' THEN
5290       p_trx_alphanumeric_value := NULL;
5291       IF (g_level_procedure >= g_current_runtime_level ) THEN
5292         FND_LOG.STRING(g_level_procedure,
5293                        'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_fc',
5294                        'fsc_code: ' || p_trx_alphanumeric_value);
5295         FND_LOG.STRING(g_level_procedure,
5296                        'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_fc.END',
5297                        'ZX_TDS_RULE_BASE_DETM_PVT: get_fc(-)' ||
5298                        ', p_return_status = ' || p_return_status ||
5299                        ', p_error_buffer  = ' || p_error_buffer);
5300       END IF;
5301       RETURN;
5302     END IF;
5303 
5304     IF l_first_party_flag THEN
5305       IF l_hq_estb_flag = 'Y' THEN
5306         l_parameter_code := 'LEGAL_ENTITY_ID';
5307         l_le_flag := 'Y';
5308       ELSE
5309         l_parameter_code := 'HQ_ESTB_PARTY_TAX_PROF_ID';
5310       END IF;
5311     ELSE
5312       l_parameter_code  := p_Determining_Factor_Cq_Code || '_' || 'TAX_PROF_ID';
5313     END IF;
5314 
5315     --
5316     -- get transaction value from TSRM
5317     --
5318     get_tsrm_num_value(
5319       p_structure_name,
5320       p_structure_index,
5321       l_parameter_code,
5322       l_classified_entity_id,
5323       p_return_status,
5324       p_error_buffer );
5325 
5326     IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
5327       IF (g_level_error >= g_current_runtime_level ) THEN
5328         FND_LOG.STRING(g_level_error,
5329                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_fc',
5330                      'Incorrect return_status after calling  get_tsrm_num_value' ||
5331                      ', return_status: ' || p_return_status);
5332       END IF;
5333 
5334       RETURN;
5335     END IF;
5336 
5337     IF l_classified_entity_id IS NULL AND NOT l_first_party_flag THEN
5338       p_trx_alphanumeric_value := NULL;
5339       IF (g_level_procedure >= g_current_runtime_level ) THEN
5340         FND_LOG.STRING(g_level_procedure,
5341                        'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_fc',
5342                        'fsc_code: ' || p_trx_alphanumeric_value);
5343         FND_LOG.STRING(g_level_procedure,
5344                        'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_fc.END',
5345                        'ZX_TDS_RULE_BASE_DETM_PVT: get_fc(-)' ||
5346                        ', p_return_status = ' || p_return_status ||
5347                        ', p_error_buffer  = ' || p_error_buffer);
5348       END IF;
5349       RETURN;
5350     END IF;
5351 
5352     IF l_le_flag = 'Y' THEN
5353 
5354       l_le_id := l_classified_entity_id;
5355 
5356       OPEN c_get_le_ptp_id(l_le_id);
5357       FETCH c_get_le_ptp_id INTO l_classified_entity_id;
5358 
5359       IF c_get_le_ptp_id%NOTFOUND THEN
5360         CLOSE c_get_le_ptp_id;
5361         p_trx_alphanumeric_value := NULL;
5362         IF (g_level_statement >= g_current_runtime_level ) THEN
5363           FND_LOG.STRING(g_level_statement,
5364                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_fc',
5365                      'Legal Entity PTP Not Found; l_le_id' ||
5366                       to_char(l_le_id));
5367         END IF;
5368         IF (g_level_procedure >= g_current_runtime_level ) THEN
5369           FND_LOG.STRING(g_level_procedure,
5370                        'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_fc.END',
5371                        'ZX_TDS_RULE_BASE_DETM_PVT: get_fc(-)');
5372         END IF;
5373         RETURN;
5374       ELSE
5375         CLOSE c_get_le_ptp_id;
5376       END IF;
5377 
5378     END IF;
5379 
5380     IF (g_level_statement >= g_current_runtime_level ) THEN
5381       FND_LOG.STRING(g_level_statement,
5382                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_fc',
5383                      'classified_entity_id: ' || to_char(l_classified_entity_id));
5384     END IF;
5385 
5386     --
5387     -- check if can get fsc code from the cache
5388     --
5389     get_fsc_code(
5390              l_found,
5391              p_tax_regime_code,
5392              l_classification_category,
5393              l_classification_type,
5394              p_tax_determine_date,
5395              l_classified_entity_id,
5396              l_item_org_id,
5397              p_event_class_rec,
5398              p_trx_alphanumeric_value);
5399 
5400     IF NOT l_found THEN
5401 
5402       l_fsc_rec.classified_entity_id    := l_classified_entity_id;
5403 
5404       ZX_TCM_CONTROL_PKG.GET_FISCAL_CLASSIFICATION(
5405         l_fsc_rec,
5406         p_return_status);
5407 
5408       IF p_return_status = FND_API.G_RET_STS_SUCCESS THEN
5409         IF l_fsc_rec.fsc_code <> FND_API.G_MISS_CHAR THEN
5410           p_trx_alphanumeric_value := l_fsc_rec.fsc_code;
5411           j := ZX_TDS_CALC_SERVICES_PUB_PKG.g_fsc_tbl.count + 1;
5412           ZX_TDS_CALC_SERVICES_PUB_PKG.g_fsc_tbl(j) := l_fsc_rec;
5413         END IF;
5414       ELSE
5415         p_return_status := FND_API.G_RET_STS_SUCCESS;
5416         IF (g_level_statement >= g_current_runtime_level ) THEN
5417           FND_LOG.STRING(g_level_statement,
5418                  'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_fc',
5419                  'ignore error even if fc not found for LE' );
5420         END IF;
5421       END IF;
5422 
5423     END IF; -- End for l_found check
5424 
5425     -- Bugfix 4873457 - Fetch fc for LE if not found for HQ Estb when classification
5426     --                  type is 'PARTY_FISCAL_CLASS' and CQ level is PARTY
5427     IF (l_first_party_flag AND l_fsc_rec.fsc_code  = 'PARTY_FISCAL_CLASS' and l_le_flag = 'N') THEN -- Get LE FC
5428 
5429       l_parameter_code := 'LEGAL_ENTITY_ID';
5430 
5431       --
5432       -- get transaction value from TSRM
5433       --
5434       get_tsrm_num_value(
5435         p_structure_name,
5436         p_structure_index,
5437         l_parameter_code,
5438         l_classified_entity_id,
5439         p_return_status,
5440         p_error_buffer );
5441 
5442       IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
5443         IF (g_level_error >= g_current_runtime_level ) THEN
5444           FND_LOG.STRING(g_level_error,
5445                        'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_fc',
5446                        'Incorrect return_status after calling  get_tsrm_num_value for LE' ||
5447                        ', return_status: ' || p_return_status);
5448         END IF;
5449 
5450         RETURN;
5451       END IF;
5452 
5453       l_le_id := l_classified_entity_id;
5454 
5455       OPEN c_get_le_ptp_id(l_le_id);
5456       FETCH c_get_le_ptp_id INTO l_classified_entity_id;
5457 
5458       IF c_get_le_ptp_id%NOTFOUND THEN
5459         CLOSE c_get_le_ptp_id;
5460         p_trx_alphanumeric_value := NULL;
5461         IF (g_level_statement >= g_current_runtime_level ) THEN
5462           FND_LOG.STRING(g_level_statement,
5463                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_fc',
5464                      'Legal Entity PTP Not Found; l_le_id' ||
5465                       to_char(l_le_id));
5466         END IF;
5467         IF (g_level_procedure >= g_current_runtime_level ) THEN
5468           FND_LOG.STRING(g_level_procedure,
5469                        'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_fc.END',
5470                        'ZX_TDS_RULE_BASE_DETM_PVT: get_fc(-)');
5471         END IF;
5472         RETURN;
5473       ELSE
5474         CLOSE c_get_le_ptp_id;
5475       END IF;
5476 
5477       IF (g_level_statement >= g_current_runtime_level ) THEN
5478         FND_LOG.STRING(g_level_statement,
5479                        'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_fc',
5480                        'classified_entity_id ' || to_char(l_classified_entity_id));
5481       END IF;
5482 
5483       --
5484       -- check if can get LE fsc code from the cache
5485       --
5486       get_fsc_code(
5487              l_found,
5488              p_tax_regime_code,
5489              l_classification_category,
5490              l_classification_type,
5491              p_tax_determine_date,
5492              l_classified_entity_id,
5493              l_item_org_id,
5494              p_event_class_rec,
5495              p_trx_alphanumeric_value);
5496 
5497       IF NOT l_found THEN
5498 
5499         l_fsc_rec.classified_entity_id    := l_classified_entity_id;
5500 
5501         ZX_TCM_CONTROL_PKG.GET_FISCAL_CLASSIFICATION(
5502           l_fsc_rec,
5503           p_return_status);
5504 
5505         IF p_return_status = FND_API.G_RET_STS_SUCCESS THEN
5506           p_trx_alphanumeric_value := l_fsc_rec.fsc_code;
5507           j := ZX_TDS_CALC_SERVICES_PUB_PKG.g_fsc_tbl.count + 1;
5508           ZX_TDS_CALC_SERVICES_PUB_PKG.g_fsc_tbl(j) := l_fsc_rec;
5509         ELSE
5510           p_return_status := FND_API.G_RET_STS_SUCCESS;
5511           IF (g_level_statement >= g_current_runtime_level ) THEN
5512             FND_LOG.STRING(g_level_statement,
5513                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_fc',
5514                    'ignore error even if fc not found for LE' );
5515           END IF;
5516         END IF;
5517 
5518       END IF; -- End for internal l_found check
5519 
5520     END IF; -- End for getting LE FC
5521 
5522     IF l_fsc_rec.fsc_code = FND_API.G_MISS_CHAR THEN
5523       p_trx_alphanumeric_value := NULL;
5524     END IF;
5525 
5526 
5527   END IF; -- End of check for party classification
5528 
5529   IF (g_level_procedure >= g_current_runtime_level ) THEN
5530     FND_LOG.STRING(g_level_procedure,
5531                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_fc',
5532                    'fsc_code: ' || p_trx_alphanumeric_value);
5533     FND_LOG.STRING(g_level_procedure,
5534                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_fc.END',
5535                    'ZX_TDS_RULE_BASE_DETM_PVT: get_fc(-)' ||
5536                    ', p_return_status = ' || p_return_status ||
5537                    ', p_error_buffer  = ' || p_error_buffer);
5538   END IF;
5539 
5540 EXCEPTION
5541   WHEN OTHERS THEN
5542     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5543     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
5544 
5545     IF (g_level_unexpected >= g_current_runtime_level ) THEN
5546       FND_LOG.STRING(g_level_unexpected,
5547                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_fc',
5548                       p_error_buffer);
5549     END IF;
5550 
5551 END get_fc;
5552 
5553 -----------------------------------------------------------------------
5554 --  PRIVATE PROCEDURE
5555 --  get_geography_info
5556 --
5557 --  DESCRIPTION
5558 --
5559 --  The procedure is to get zone corresponding to a location by calling
5560 --  TCM API
5561 --
5562 PROCEDURE get_geography_info(
5563             p_structure_name        IN  VARCHAR2,
5564             p_structure_index       IN  BINARY_INTEGER,
5565             p_condition_index       IN  BINARY_INTEGER,
5566             p_zone_tbl              OUT NOCOPY HZ_GEO_GET_PUB.zone_tbl_type,
5567             p_Determining_Factor_Cq_Code IN ZX_CONDITIONS.Determining_Factor_Cq_Code%TYPE,
5568             p_tax_determine_date    IN ZX_LINES.TAX_DETERMINE_DATE%TYPE,
5569             p_return_status            OUT NOCOPY VARCHAR2,
5570             p_error_buffer             OUT NOCOPY VARCHAR2)
5571 IS
5572   l_location_id            NUMBER;
5573   --l_zone_id                NUMBER;
5574   --l_zone_name              VARCHAR2(360);
5575   l_msg_count              NUMBER;
5576   i                        BINARY_INTEGER;
5577   l_location_type          VARCHAR2(30);
5578   --l_zone_tbl               HZ_GEO_GET_PUB.zone_tbl_type;
5579 BEGIN
5580 
5581   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
5582 
5583   IF (g_level_procedure >= g_current_runtime_level ) THEN
5584     FND_LOG.STRING(g_level_procedure,
5585                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_geography_info.BEGIN',
5586                    'ZX_TDS_RULE_BASE_DETM_PVT: get_geography_info(+)');
5587   END IF;
5588 
5589   p_return_status := FND_API.G_RET_STS_SUCCESS;
5590 
5591   i := p_condition_index;
5592 
5593   -- Bug#4720542
5594   IF SUBSTR(p_Determining_Factor_Cq_Code, -5, 5) = 'PARTY' THEN
5595     l_location_type :=  replace(p_Determining_Factor_Cq_Code,
5596                                 '_PARTY', NULL);
5597   ELSIF SUBSTR(p_Determining_Factor_Cq_Code, -4, 4) = 'SITE' THEN
5598     l_location_type :=  replace(p_Determining_Factor_Cq_Code,
5599                                 '_SITE', NULL);
5600   ELSE  --Added else part as part of Bug # 5009256
5601     l_location_type :=  p_Determining_Factor_Cq_Code;
5602   END IF;
5603 
5604   -- Bug# 4722936- truncate p_Determining_Factor_Cq_Code before use
5605   get_tsrm_num_value(
5606             p_structure_name,
5607             p_structure_index,
5608             l_location_type || '_' || 'LOCATION_ID',
5609             l_location_id,
5610             p_return_status,
5611             p_error_buffer);
5612 
5613   IF (g_level_statement >= g_current_runtime_level ) THEN
5614     FND_LOG.STRING(g_level_statement,
5615                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_geography_info',
5616                    'location_id: ' || to_char(l_location_id));
5617   END IF;
5618 
5619   IF p_return_status =  FND_API.G_RET_STS_SUCCESS THEN
5620 
5621     /*ZX_TCM_GEO_JUR_PKG.get_zone(
5622                 l_location_id,
5623                 p_Determining_Factor_Cq_Code,
5624                 g_determining_factor_code_tbl(i),
5625                 p_tax_determine_date,
5626                 l_zone_id,
5627                 p_trx_alphanumeric_value,
5628                 l_zone_name,
5629                 p_return_status); */
5630   IF l_location_id IS NOT NULL THEN
5631 
5632     ZX_TCM_GEO_JUR_PKG.get_zone
5633     ( l_location_id,
5634       -- p_Determining_Factor_Cq_Code,
5635       l_location_type,
5636       g_determining_factor_code_tbl(i),
5637      p_tax_determine_date,
5638      p_zone_tbl,
5639      p_return_status);
5640  --    p_trx_alphanumeric_value := l_zone_tbl(1).zone_code;
5641   END IF;
5642    END IF;
5643 
5644   IF (g_level_procedure >= g_current_runtime_level ) THEN
5645     --  FND_LOG.STRING(g_level_procedure,
5646     --                'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_geography_info',
5647     --               'trx_alphanumeric_value: ' || p_trx_alphanumeric_value);
5648     FND_LOG.STRING(g_level_procedure,
5649                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_geography_info.END',
5650                    'ZX_TDS_RULE_BASE_DETM_PVT: get_geography_info(-)' ||
5651                    ', p_return_status = ' || p_return_status ||
5652                    ', p_error_buffer  = ' || p_error_buffer);
5653   END IF;
5654 
5655 EXCEPTION
5656   WHEN OTHERS THEN
5657     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5658     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
5659     IF (g_level_unexpected >= g_current_runtime_level ) THEN
5660       FND_LOG.STRING(g_level_unexpected,
5661                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_geography_info',
5662                       p_error_buffer);
5663     END IF;
5664 
5665 END get_geography_info;
5666 
5667 -----------------------------------------------------------------------
5668 --  PRIVATE PROCEDURE
5669 --  get_master_geography_info
5670 --
5671 --  DESCRIPTION
5672 --
5673 --  The procedure is to get master geography information  corresponding
5674 --  to a location by calling TCM API
5675 --
5676 PROCEDURE get_master_geography_info(
5677             p_structure_name        IN  VARCHAR2,
5678             p_structure_index       IN  BINARY_INTEGER,
5679             p_condition_index       IN  BINARY_INTEGER,
5680             p_trx_numeric_value  OUT NOCOPY ZX_CONDITIONS.NUMERIC_VALUE%TYPE,
5681             p_Determining_Factor_Cq_Code IN ZX_CONDITIONS.Determining_Factor_Cq_Code%TYPE,
5682             p_return_status            OUT NOCOPY VARCHAR2,
5683             p_error_buffer             OUT NOCOPY VARCHAR2)
5684 IS
5685   l_location_id            NUMBER;
5686   l_geography_id           NUMBER;
5687   l_geography_code         VARCHAR2(30);
5688   l_geography_name         VARCHAR2(360);
5689   l_location_type          VARCHAR2(30);
5690   l_msg_count              NUMBER;
5691   i                        BINARY_INTEGER;
5692 BEGIN
5693   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
5694 
5695   IF (g_level_procedure >= g_current_runtime_level ) THEN
5696     FND_LOG.STRING(g_level_procedure,
5697                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_master_geography_info.BEGIN',
5698                    'ZX_TDS_RULE_BASE_DETM_PVT: get_master_geography_info(+)');
5699   END IF;
5700 
5701   p_return_status := FND_API.G_RET_STS_SUCCESS;
5702 
5703   i := p_condition_index;
5704 
5705   -- Bug#4720542
5706   IF SUBSTR(p_Determining_Factor_Cq_Code, -5, 5) = 'PARTY' THEN
5707     l_location_type :=  replace(p_Determining_Factor_Cq_Code,
5708                                 '_PARTY', NULL);
5709   ELSIF SUBSTR(p_Determining_Factor_Cq_Code, -4, 4) = 'SITE' THEN
5710     l_location_type :=  replace(p_Determining_Factor_Cq_Code,
5711                                 '_SITE', NULL);
5712   ELSE  --Added else part as part of Bug # 5009256
5713     l_location_type :=  p_Determining_Factor_Cq_Code;
5714   END IF;
5715 
5716   -- Bug# 4722936- truncate p_Determining_Factor_Cq_Code before use
5717   get_tsrm_num_value(
5718             p_structure_name,
5719             p_structure_index,
5720             l_location_type || '_' || 'LOCATION_ID',
5721             l_location_id,
5722             p_return_status,
5723             p_error_buffer);
5724 
5725   IF (g_level_statement >= g_current_runtime_level ) THEN
5726     FND_LOG.STRING(g_level_statement,
5727                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_master_geography_info',
5728                    'location_id: ' || to_char(l_location_id));
5729   END IF;
5730 
5731   IF p_return_status =  FND_API.G_RET_STS_SUCCESS THEN
5732 
5733     IF (g_level_statement >= g_current_runtime_level ) THEN
5734       FND_LOG.STRING(g_level_statement,
5735                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_master_geography_info',
5736                      'l_location_type: ' || l_location_type);
5737     END IF;
5738 
5739     -- Bugfix 4926074: call get_master_geography API only if the location_id is not null
5740     if l_location_id is not null then
5741          ZX_TCM_GEO_JUR_PKG.get_master_geography
5742             (l_location_id,
5743              l_location_type,
5744              g_determining_factor_code_tbl(i),
5745              l_geography_id,
5746              l_geography_code,
5747              l_geography_name,
5748              p_return_status);
5749 
5750         IF p_return_status  =  FND_API.G_RET_STS_SUCCESS THEN
5751           p_trx_numeric_value := l_geography_id;
5752         END IF;
5753     end if; -- l_location_id is not null
5754    END IF;
5755 
5756   IF (g_level_statement >= g_current_runtime_level ) THEN
5757     FND_LOG.STRING(g_level_statement,
5758                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_master_geography_info',
5759                    'trx_numeric_value: ' || TO_CHAR(p_trx_numeric_value));
5760   END IF;
5761 
5762   IF (g_level_procedure >= g_current_runtime_level ) THEN
5763     FND_LOG.STRING(g_level_procedure,
5764                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_master_geography_info.END',
5765                    'ZX_TDS_RULE_BASE_DETM_PVT: get_master_geography_info(-)' ||
5766                    ', p_return_status = ' || p_return_status ||
5767                    ', p_error_buffer  = ' || p_error_buffer);
5768   END IF;
5769 
5770 EXCEPTION
5771   WHEN OTHERS THEN
5772     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5773     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
5774     IF (g_level_unexpected >= g_current_runtime_level ) THEN
5775       FND_LOG.STRING(g_level_unexpected,
5776                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_master_geography_info',
5777                       p_error_buffer);
5778     END IF;
5779 
5780 END get_master_geography_info;
5781 
5782 -----------------------------------------------------------------------
5783 --  PRIVATE PROCEDURE
5784 --  get_registration_status
5785 --
5786 --  DESCRIPTION
5787 --
5788 --  The procedure gets registration status by calling TCM API
5789 --
5790 PROCEDURE get_registration_status(
5791             p_structure_name         IN     VARCHAR2,
5792             p_structure_index        IN     BINARY_INTEGER,
5793             p_event_class_rec        IN     ZX_API_PUB.EVENT_CLASS_REC_TYPE,
5794             p_tax_determine_date     IN     ZX_LINES.TAX_DETERMINE_DATE%TYPE,
5795             p_tax                    IN     ZX_TAXES_B.TAX%TYPE,
5796             p_tax_regime_code        IN     ZX_REGIMES_B.TAX_REGIME_CODE%TYPE,
5797             p_trx_alphanumeric_value    OUT NOCOPY ZX_CONDITIONS.ALPHANUMERIC_VALUE%TYPE,
5798             p_Determining_Factor_Cq_Code  IN ZX_CONDITIONS.Determining_Factor_Cq_Code%TYPE,
5799             p_return_status             OUT NOCOPY VARCHAR2,
5800             p_error_buffer              OUT NOCOPY VARCHAR2)
5801 IS
5802   l_registration_rec       zx_tcm_control_pkg.zx_registration_info_rec;
5803   l_first_party_flag       BOOLEAN;
5804   l_reg_party_prof_id      zx_party_tax_profile.party_tax_profile_id%TYPE;
5805   l_hq_estb_ptp_id         zx_lines.hq_estb_party_tax_prof_id%TYPE;
5806   l_ret_record_level       VARCHAR2(30);
5807 
5808 BEGIN
5809 
5810   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
5811 
5812   IF (g_level_procedure >= g_current_runtime_level ) THEN
5813     FND_LOG.STRING(g_level_procedure,
5814                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_registration_status.BEGIN',
5815                    'ZX_TDS_RULE_BASE_DETM_PVT: get_registration_status(+)');
5816   END IF;
5817 
5818   p_return_status := FND_API.G_RET_STS_SUCCESS;
5819 
5820   ZX_TDS_APPLICABILITY_DETM_PKG.get_tax_registration_info(
5821             p_structure_name      => p_structure_name,
5822             p_structure_index     => p_structure_index,
5823             p_event_class_rec     => p_event_class_rec,
5824             p_tax_regime_code     => p_tax_regime_code,
5825             p_tax                 => p_tax,
5826             p_tax_determine_date  => p_tax_determine_date,
5827             p_jurisdiction_code   => NULL,
5828             p_reg_party_type      => p_Determining_Factor_Cq_Code,
5829             x_registration_rec    => l_registration_rec,
5830             x_return_status       => p_return_status
5831   );
5832 
5833   IF p_return_status = FND_API.G_RET_STS_SUCCESS  THEN
5834       p_trx_alphanumeric_value := l_registration_rec.registration_status_code;
5835   ELSE
5836     IF (g_level_error >= g_current_runtime_level ) THEN
5837       FND_LOG.STRING(g_level_error,
5838                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_registration_status',
5839                      'Incorrect status returned after calling '||
5840                      'ZX_TDS_APPLICABILITY_DETM_PKG.get_tax_registration_info'||
5841                      ', p_return_status = ' || p_return_status);
5842       FND_LOG.STRING(g_level_error,
5843                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_registration_status.END',
5844                      'ZX_TDS_RULE_BASE_DETM_PVT: get_registration_status(-)');
5845     END IF;
5846     p_return_status := FND_API.G_RET_STS_SUCCESS;
5847   END IF;
5848 
5849   IF (g_level_statement >= g_current_runtime_level ) THEN
5850     FND_LOG.STRING(g_level_statement,
5851                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_registration_status',
5852                    'registration status: ' || p_trx_alphanumeric_value);
5853   END IF;
5854 
5855   IF (g_level_procedure >= g_current_runtime_level ) THEN
5856     FND_LOG.STRING(g_level_procedure,
5857                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_registration_status.END',
5858                    'ZX_TDS_RULE_BASE_DETM_PVT: get_registration_status(-)' ||
5859                    ', p_return_status = ' || p_return_status ||
5860                    ', p_error_buffer  = ' || p_error_buffer);
5861   END IF;
5862 
5863 EXCEPTION
5864   WHEN OTHERS THEN
5865     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5866     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
5867 
5868     IF (g_level_unexpected >= g_current_runtime_level ) THEN
5869       FND_LOG.STRING(g_level_unexpected,
5870                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_registration_status',
5871                       p_error_buffer);
5872     END IF;
5873 
5874 END get_registration_status;
5875 
5876 -----------------------------------------------------------------------
5877 --  PRIVATE PROCEDURE
5878 --  get_account_flexfield_info
5879 --
5880 --  DESCRIPTION
5881 --
5882 --  The procedure gets accounting  flexfield information either from  account
5883 --  string or account CCID
5884 --
5885 PROCEDURE get_account_flexfield_info(
5886             p_structure_name         IN  VARCHAR2,
5887             p_structure_index        IN  BINARY_INTEGER,
5888             p_condition_index        IN     BINARY_INTEGER,
5889             p_trx_alphanumeric_value    OUT NOCOPY ZX_CONDITIONS.ALPHANUMERIC_VALUE%TYPE,
5890             p_chart_of_accounts_id   IN
5891                 ZX_CONDITION_GROUPS_B.CHART_OF_ACCOUNTS_ID%TYPE,
5892             p_sob_id                 IN
5893                 ZX_CONDITION_GROUPS_B.LEDGER_ID%TYPE,
5894             p_return_status           OUT NOCOPY VARCHAR2,
5895             p_error_buffer            OUT NOCOPY VARCHAR2)
5896 IS
5897   i                            BINARY_INTEGER;
5898   l_account_string             VARCHAR2(2000);
5899   l_ccid                       NUMBER;
5900   l_num_segments               NUMBER;
5901   l_tax_parameter_code         ZX_PARAMETERS_B.TAX_PARAMETER_CODE%TYPE;
5902   l_sob_id                     ZX_CONDITION_GROUPS_B.LEDGER_ID%TYPE;
5903 BEGIN
5904 
5905   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
5906 
5907   IF (g_level_statement >= g_current_runtime_level ) THEN
5908     FND_LOG.STRING(g_level_statement,
5909                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_account_flexfield_info.BEGIN',
5910                    'ZX_TDS_RULE_BASE_DETM_PVT: get_account_flexfield_info(+)');
5911     FND_LOG.STRING(g_level_statement,
5912                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_account_flexfield_info',
5913                    'sob id: ' || to_char(p_sob_id) ||
5914                    ', chart of acct id: ' || to_char(p_chart_of_accounts_id));
5915   END IF;
5916 
5917   p_return_status := FND_API.G_RET_STS_SUCCESS;
5918 
5919   --
5920   -- check if this is the correct set of books id
5921   -- get sob id from the transaction
5922   --
5923   l_tax_parameter_code := 'LEDGER_ID';
5924   get_tsrm_num_value(p_structure_name,
5925                      p_structure_index,
5926                      l_tax_parameter_code,
5927                      l_sob_id,
5928                      p_return_status,
5929                      p_error_buffer);
5930 
5931   --
5932   -- compare sob_id from the transaction with sob_id from the
5933   -- condition group, error if they don't match
5934   --
5935   IF l_sob_id <> p_sob_id THEN
5936     p_return_status := FND_API.G_RET_STS_ERROR;
5937     p_error_buffer := 'LEDGER ID does not match with one from condition group';
5938 
5939     IF (g_level_statement >= g_current_runtime_level ) THEN
5940       FND_LOG.STRING(g_level_statement,
5941                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_account_flexfield_info',
5942                      'p_return_status = ' || p_return_status ||
5943                      ', p_error_buffer  = ' || p_error_buffer);
5944     END IF;
5945 
5946     RETURN;
5947   END IF;
5948 
5949   i := p_condition_index;
5950 
5951   --
5952   -- check if need to obtain segment array for this account
5953   --
5954   IF ((g_determining_factor_code_tbl.EXISTS(i-1)  AND
5955        g_determining_factor_cq_tbl.EXISTS(i-1) )      AND
5956       (g_determining_factor_code_tbl(i) = g_determining_factor_code_tbl(i-1) AND
5957        g_determining_factor_cq_tbl(i) IS NOT NULL AND g_determining_factor_cq_tbl(i-1) IS NOT NULL)) THEN
5958     --
5959     -- segment array for this account has been obtained before
5960     --
5961     IF (g_level_statement >= g_current_runtime_level ) THEN
5962        FND_LOG.STRING(g_level_statement,
5963                       'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_account_flexfield_info',
5964                       'segment array has been obtained before');
5965     END IF;
5966 
5967     RETURN;
5968   END IF;
5969   --
5970   -- first get accounting info from account string
5971   --
5972   -- bug#5014051: replace g_determining_factor_code_tbl with
5973   -- g_tax_parameter_code_tbl
5974   --
5975   get_account_alphanum_value(p_structure_name,
5976                              p_structure_index,
5977                              g_tax_parameter_code_tbl(i) || '_' || 'STRING',
5978                              l_account_string,
5979                              p_return_status,
5980                              p_error_buffer );
5981   IF (p_return_status = FND_API.G_RET_STS_SUCCESS AND
5982       l_account_string IS NULL) THEN
5983     --
5984     -- account string is not available, get the info from account ccid
5985     --
5986     -- bug#5014051: replace g_determining_factor_code_tbl with
5987     -- g_tax_parameter_code_tbl
5988     --
5989     get_account_num_value(p_structure_name,
5990                           p_structure_index,
5991                           g_tax_parameter_code_tbl(i) || '_' || 'CCID',
5992                           l_ccid,
5993                           p_return_status,
5994                           p_error_buffer );
5995     IF (p_return_status = FND_API.G_RET_STS_SUCCESS AND
5996         l_ccid IS NOT NULL ) THEN
5997      IF l_ccid > 0 THEN
5998       IF zx_global_structures_pkg.g_ccid_acct_string_info_tbl.exists(l_ccid) then
5999 
6000             l_account_string :=
6001                 zx_global_structures_pkg.g_ccid_acct_string_info_tbl(l_ccid).ACCOUNT_STRING;
6002 
6003             IF (g_level_statement >= g_current_runtime_level ) THEN
6004                      FND_LOG.STRING(g_level_statement,
6005                        'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_account_flexfield_info',
6006                        'Acct string found in cache: ' || l_account_string);
6007             END IF;
6008 
6009       ELSE
6010             l_account_string := FND_FLEX_EXT.get_segs(
6011                                 'SQLGL',
6012                                 'GL#',
6013                                 p_chart_of_accounts_id,
6014                                 l_ccid);
6015 
6016             IF (g_level_statement >= g_current_runtime_level ) THEN
6017                       FND_LOG.STRING(g_level_statement,
6018                        'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_account_flexfield_info',
6019                        'acct string derived by calling flexfield API: ' || l_account_string);
6020             END IF;
6021 
6022             zx_global_structures_pkg.g_ccid_acct_string_info_tbl(l_ccid).CCID := l_ccid;
6023             zx_global_structures_pkg.g_ccid_acct_string_info_tbl(l_ccid).ACCOUNT_STRING := l_account_string;
6024             zx_global_structures_pkg.g_ccid_acct_string_info_tbl(l_ccid).CHART_OF_ACCOUNTS_ID := p_chart_of_accounts_id;
6025 
6026 
6027       END IF;
6028 
6029       IF l_account_string IS NULL THEN
6030         p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6031         p_error_buffer := 'Error when derive Account String';
6032       END IF;
6033      END IF;
6034     ELSIF (p_return_status = FND_API.G_RET_STS_SUCCESS AND
6035            l_ccid IS NULL ) THEN
6036       --
6037       -- return success but put message in error buffer
6038       -- to see in log file
6039       --
6040       p_return_status := FND_API.G_RET_STS_SUCCESS;
6041       p_error_buffer  := 'Both Account String and CCID are NULL';
6042       RETURN;
6043     END IF;
6044   END IF;
6045 
6046   IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
6047 
6048     IF (g_level_statement >= g_current_runtime_level ) THEN
6049       FND_LOG.STRING(g_level_statement,
6050                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_account_flexfield_info',
6051                      'p_return_status = ' || p_return_status ||
6052                      ', p_error_buffer  = ' || p_error_buffer);
6053     END IF;
6054 
6055     RETURN;
6056   END IF;
6057 
6058   IF g_determining_factor_cq_tbl(i) IS NULL  THEN
6059     p_trx_alphanumeric_value := l_account_string;
6060     RETURN;
6061   ELSE
6062     -- get all segments for this account flexfield
6063      process_segment_string(l_account_string,
6064                            p_chart_of_accounts_id,
6065                            p_return_status,
6066                            p_error_buffer);
6067   END IF;
6068 
6069   IF (g_level_statement >= g_current_runtime_level ) THEN
6070     FND_LOG.STRING(g_level_statement,
6071                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_account_flexfield_info.END',
6072                    'ZX_TDS_RULE_BASE_DETM_PVT: get_account_flexfield_info(-)' ||
6073                    ', p_return_status = ' || p_return_status ||
6074                    ', p_error_buffer  = ' || p_error_buffer);
6075   END IF;
6076 
6077 EXCEPTION
6078   WHEN OTHERS THEN
6079     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6080     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
6081 
6082     IF (g_level_unexpected >= g_current_runtime_level ) THEN
6083       FND_LOG.STRING(g_level_unexpected,
6084                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_account_flexfield_info',
6085                       p_error_buffer);
6086     END IF;
6087 
6088 END get_account_flexfield_info;
6089 
6090 -----------------------------------------------------------------------
6091 --  PRIVATE PROCEDURE
6092 --  process_segment_string
6093 --
6094 --  DESCRIPTION
6095 --
6096 --  The procedure gets all segments of an account flexfield
6097 --
6098 PROCEDURE process_segment_string(
6099             p_account_string         IN     VARCHAR2,
6100             p_chart_of_accounts_id   IN
6101                 ZX_CONDITION_GROUPS_B.CHART_OF_ACCOUNTS_ID%TYPE,
6102             p_return_status           OUT NOCOPY VARCHAR2,
6103             p_error_buffer            OUT NOCOPY VARCHAR2)
6104 IS
6105   l_delimiter            VARCHAR2(1);
6106   l_num_of_segments      NUMBER;
6107 BEGIN
6108 
6109   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
6110 
6111   IF (g_level_statement >= g_current_runtime_level ) THEN
6112     FND_LOG.STRING(g_level_statement,
6113                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.process_segment_string.BEGIN',
6114                    'ZX_TDS_RULE_BASE_DETM_PVT: process_segment_string(+)');
6115   END IF;
6116 
6117   p_return_status := FND_API.G_RET_STS_SUCCESS;
6118 
6119   --
6120   -- init accounting segment array
6121   --
6122   g_segment_array.DELETE;
6123 
6124   l_delimiter := FND_FLEX_EXT.GET_DELIMITER(
6125                              'SQLGL',
6126                              'GL#',
6127                              p_chart_of_accounts_id);
6128 
6129   l_num_of_segments := FND_FLEX_EXT.breakup_segments(
6130                            p_account_string,
6131                            l_delimiter,
6132                            g_segment_array);
6133 
6134   IF (g_level_statement >= g_current_runtime_level ) THEN
6135     FND_LOG.STRING(g_level_statement,
6136                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.process_segment_string',
6137                    'l_delimiter: ' || l_delimiter ||
6138                    ', l_num_of_segments: ' || to_char(l_num_of_segments));
6139 
6140     FND_LOG.STRING(g_level_statement,
6141                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.process_segment_string.END',
6142                    'ZX_TDS_RULE_BASE_DETM_PVT: process_segment_string(-)');
6143   END IF;
6144 
6145 EXCEPTION
6146   WHEN OTHERS THEN
6147     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6148     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
6149     IF (g_level_unexpected >= g_current_runtime_level ) THEN
6150       FND_LOG.STRING(g_level_unexpected,
6151                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.process_segment_string',
6152                       p_error_buffer);
6153     END IF;
6154 
6155 END process_segment_string;
6156 
6157 
6158 /* Bugfix 3673395 - This procedure is no longer requird
6159 -----------------------------------------------------------------------
6160 
6161 --  PRIVATE PROCEDURE
6162 --  get_product_tax_info
6163 --
6164 --  DESCRIPTION
6165 --    This procedure returns the tax info for a specific item
6166 --
6167 
6168 PROCEDURE get_product_tax_info(
6169             p_structure_name          IN  VARCHAR2,
6170             p_structure_index         IN  BINARY_INTEGER,
6171             p_determining_factor_code IN  ZX_CONDITIONS.DETERMINING_FACTOR_CODE%TYPE,
6172             p_trx_alphanumeric_value  OUT NOCOPY ZX_CONDITIONS.ALPHANUMERIC_VALUE%TYPE,
6173             p_return_status           OUT NOCOPY VARCHAR2,
6174             p_error_buffer            OUT NOCOPY VARCHAR2)
6175 
6176 IS
6177   l_parameter_code                  ZX_PARAMETERS_B.TAX_PARAMETER_CODE%TYPE;
6178   l_product_id                      NUMBER;
6179   l_item_org_id                     NUMBER;
6180 
6181 BEGIN
6182 
6183   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
6184 
6185   IF (g_level_statement >= g_current_runtime_level ) THEN
6186     FND_LOG.STRING(g_level_statement,
6187                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_product_tax_info.BEGIN',
6188                    'ZX_TDS_RULE_BASE_DETM_PVT: get_product_tax_info (+)');
6189   END IF;
6190 
6191   p_return_status := FND_API.G_RET_STS_SUCCESS;
6192 
6193   --
6194   -- get product id from tsrm
6195   --
6196   l_parameter_code := 'PRODUCT_ID';
6197   get_tsrm_num_value(
6198       p_structure_name,
6199       p_structure_index,
6200       l_parameter_code,
6201       l_product_id,
6202       p_return_status,
6203       p_error_buffer );
6204 
6205   IF (g_level_statement >= g_current_runtime_level ) THEN
6206     FND_LOG.STRING(g_level_statement,
6207                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_product_tax_info',
6208                    'product id: ' || to_char(l_product_id));
6209   END IF;
6210 
6211   IF p_return_status <>  FND_API.G_RET_STS_SUCCESS THEN
6212     RETURN;
6213   END IF;
6214 
6215   --
6216   -- get product org id from tsrm
6217   --
6218   l_parameter_code := 'PRODUCT_ORG_ID';
6219     get_tsrm_num_value(
6220       p_structure_name,
6221       p_structure_index,
6222       l_parameter_code,
6223       l_item_org_id,
6224       p_return_status,
6225       p_error_buffer );
6226 
6227   IF (g_level_statement >= g_current_runtime_level ) THEN
6228       FND_LOG.STRING(g_level_statement,
6229                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_product_tax_info',
6230                      'item_org_id: ' || to_char(l_item_org_id));
6231   END IF;
6232 
6233   IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
6234     RETURN;
6235   END IF;
6236 
6237   --
6238   -- get taxable_flag or tax_code from mtl_system_items
6239   --
6240   get_tax_info_from_item(l_product_id,
6241                          l_item_org_id,
6242                          p_determining_factor_code,
6243                          p_trx_alphanumeric_value,
6244                          p_return_status,
6245                          p_error_buffer );
6246 
6247 
6248   IF (g_level_statement >= g_current_runtime_level ) THEN
6249     FND_LOG.STRING(g_level_statement,
6250                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_product_tax_info.END',
6251                    'ZX_TDS_RULE_BASE_DETM_PVT: get_product_tax_info (-)');
6252   END IF;
6253 
6254 EXCEPTION
6255   WHEN OTHERS THEN
6256     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6257     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
6258 
6259     IF (g_level_unexpected >= g_current_runtime_level ) THEN
6260       FND_LOG.STRING(g_level_unexpected,
6261                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_product_tax_info',
6262                       p_error_buffer);
6263     END IF;
6264 
6265 END get_product_tax_info;
6266 */
6267 
6268 /* Bugfix 3673395 - This procedure is no longer required
6269 -----------------------------------------------------------------------
6270 
6271 --  PRIVATE PROCEDURE
6272 --  get_tax_info_from_item
6273 --
6274 --  DESCRIPTION
6275 --    This procedure returns taxable_flag or tax_code   obtained from
6276 --    mtl_system_items table depending on the determining factor code passed in
6277 --
6278 
6279 PROCEDURE get_tax_info_from_item(
6280             p_product_id              IN  MTL_SYSTEM_ITEMS.INVENTORY_ITEM_ID%TYPE,
6281             p_item_org_id             IN  MTL_SYSTEM_ITEMS.ORGANIZATION_ID%TYPE,
6282             p_determining_factor_code IN  ZX_CONDITIONS.DETERMINING_FACTOR_CODE%TYPE,
6283             p_trx_alphanumeric_value  OUT NOCOPY ZX_CONDITIONS.ALPHANUMERIC_VALUE%TYPE,
6284             p_return_status           OUT NOCOPY VARCHAR2,
6285             p_error_buffer            OUT NOCOPY VARCHAR2)
6286 
6287 IS
6288   CURSOR get_tax_code_csr
6289     (c_product_id           MTL_SYSTEM_ITEMS.INVENTORY_ITEM_ID%TYPE,
6290      c_item_org_id          MTL_SYSTEM_ITEMS.ORGANIZATION_ID%TYPE)
6291   IS
6292     SELECT  TAX_CODE
6293       FROM  MTL_SYSTEM_ITEMS
6294       WHERE INVENTORY_ITEM_ID = c_product_id    AND
6295             ORGANIZATION_ID   = c_item_org_id;
6296 
6297 BEGIN
6298 
6299   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
6300 
6301   IF (g_level_statement >= g_current_runtime_level ) THEN
6302     FND_LOG.STRING(g_level_statement,
6303                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_tax_info_from_item.BEGIN',
6304                    'ZX_TDS_RULE_BASE_DETM_PVT: get_tax_info_from_item(+)');
6305   END IF;
6306 
6307   p_return_status := FND_API.G_RET_STS_SUCCESS;
6308 
6309   IF p_determining_factor_code = 'TAX_CLASSIFICATION_CODE' THEN
6310     OPEN get_tax_code_csr(p_product_id,
6311                           p_item_org_id);
6312     FETCH get_tax_code_csr INTO p_trx_alphanumeric_value;
6313     CLOSE get_tax_code_csr;
6314   ELSE
6315     p_return_status := FND_API.G_RET_STS_ERROR;
6316     p_error_buffer  := 'Invalid Determining Factor code for Product class';
6317   END IF;
6318 
6319   IF (g_level_statement >= g_current_runtime_level ) THEN
6320     FND_LOG.STRING(g_level_statement,
6321                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_tax_info_from_item',
6322                    'trx value:' || p_trx_alphanumeric_value);
6323     FND_LOG.STRING(g_level_statement,
6324                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_tax_info_from_item.END',
6325                    'ZX_TDS_RULE_BASE_DETM_PVT: get_tax_info_from_item(-)' ||
6326                    ', p_return_status = ' || p_return_status ||
6327                    ', p_error_buffer  = ' || p_error_buffer);
6328   END IF;
6329 
6330   EXCEPTION
6331     WHEN OTHERS THEN
6332       p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6333       p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
6334 
6335       IF (g_level_unexpected >= g_current_runtime_level ) THEN
6336         FND_LOG.STRING(g_level_unexpected,
6337                        'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_tax_info_from_item',
6338                         p_error_buffer);
6339       END IF;
6340 
6341 END get_tax_info_from_item;
6342 */
6343 
6344 /* Bugfix 3673395 - This procedure is no longer required
6345 -----------------------------------------------------------------------
6346 
6347 --  PRIVATE PROCEDURE
6348 --  get_party_tax_info
6349 --
6350 --  DESCRIPTION
6351 --    This procedure returns the tax classification code  obtained from
6352 --    zx_party_tax_profile
6353 
6354 PROCEDURE get_party_tax_info(
6355             p_structure_name          IN  VARCHAR2,
6356             p_structure_index         IN  BINARY_INTEGER,
6357             p_Determining_Factor_Cq_Code   IN ZX_CONDITIONS.Determining_Factor_Cq_Code%TYPE,
6358             p_determining_factor_code IN  ZX_CONDITIONS.DETERMINING_FACTOR_CODE%TYPE,
6359             p_trx_alphanumeric_value  OUT NOCOPY ZX_CONDITIONS.ALPHANUMERIC_VALUE%TYPE,
6360             p_return_status           OUT NOCOPY VARCHAR2,
6361             p_error_buffer            OUT NOCOPY VARCHAR2)
6362 
6363 IS
6364   l_tax_profile_id             ZX_PARTY_TAX_PROFILE.PARTY_TAX_PROFILE_ID%TYPE;
6365 
6366   CURSOR get_tax_classification_csr
6367     (c_party_tax_profile_id      ZX_PARTY_TAX_PROFILE.PARTY_TAX_PROFILE_ID%TYPE)
6368   IS
6369     SELECT Tax_Classification_Code
6370       FROM ZX_PARTY_TAX_PROFILE
6371       WHERE PARTY_TAX_PROFILE_ID = c_party_tax_profile_id;
6372 
6373 BEGIN
6374 
6375   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
6376 
6377   IF (g_level_statement >= g_current_runtime_level ) THEN
6378     FND_LOG.STRING(g_level_statement,
6379                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_party_tax_info.BEGIN',
6380                    'ZX_TDS_RULE_BASE_DETM_PVT: get_party_tax_info(+)');
6381   END IF;
6382 
6383   p_return_status := FND_API.G_RET_STS_SUCCESS;
6384 
6385   get_tsrm_num_value(
6386             p_structure_name,
6387             p_structure_index,
6388             p_Determining_Factor_Cq_Code || '_' || 'TAX_PROF_ID',
6389             l_tax_profile_id,
6390             p_return_status,
6391             p_error_buffer);
6392 
6393   IF (g_level_statement >= g_current_runtime_level ) THEN
6394     FND_LOG.STRING(g_level_statement,
6395                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_party_tax_info',
6396                    'l_tax_profile_id: ' || to_char(l_tax_profile_id));
6397   END IF;
6398 
6399   IF p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
6400     RETURN;
6401   END IF;
6402 
6403   IF p_determining_factor_code = 'ESTB_TAX_CLASSIFICATION'  THEN
6404     OPEN  get_tax_classification_csr(l_tax_profile_id);
6405     FETCH get_tax_classification_csr INTO p_trx_alphanumeric_value;
6406     CLOSE get_tax_classification_csr;
6407   ELSE
6408     p_return_status := FND_API.G_RET_STS_ERROR;
6409     p_error_buffer  := 'Invalid Determining Factor code for Party class';
6410   END IF;
6411 
6412   IF (g_level_statement >= g_current_runtime_level ) THEN
6413     FND_LOG.STRING(g_level_statement,
6414                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_party_tax_info',
6415                    'tax classification: ' || p_trx_alphanumeric_value);
6416     FND_LOG.STRING(g_level_statement,
6417                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_party_tax_info.END',
6418                    'ZX_TDS_RULE_BASE_DETM_PVT: get_party_tax_info(-)' ||
6419                    ', p_return_status = ' || p_return_status ||
6420                    ', p_error_buffer  = ' || p_error_buffer);
6421   END IF;
6422 
6423 EXCEPTION
6424     WHEN OTHERS THEN
6425       p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6426       p_error_buffer  :=sqlcode || ': ' ||  SUBSTR(SQLERRM, 1, 80);
6427 
6428       CLOSE get_tax_classification_csr;
6429       IF (g_level_unexpected >= g_current_runtime_level ) THEN
6430         FND_LOG.STRING(g_level_unexpected,
6431                        'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.',
6432                         p_error_buffer);
6433       END IF;
6434 END get_party_tax_info;
6435 */
6436 
6437 ---------------------------------------------------------------------------
6438 
6439 --  PRIVATE FUNCTION
6440 --  evaluate_condition
6441 --
6442 --  DESCRIPTION
6443 --
6444 --  The procedure is to evaluate each condition
6445 --
6446 
6447 PROCEDURE evaluate_condition(
6448             p_condition_index        IN     BINARY_INTEGER,
6449             p_trx_alphanumeric_value IN     ZX_CONDITIONS.ALPHANUMERIC_VALUE%TYPE,
6450             p_trx_numeric_value      IN     ZX_CONDITIONS.NUMERIC_VALUE%TYPE,
6451             p_trx_date_value         IN     ZX_CONDITIONS.DATE_VALUE%TYPE,
6452             p_chart_of_accounts_id   IN     ZX_CONDITION_GROUPS_B.CHART_OF_ACCOUNTS_ID%TYPE,
6453             p_result                    OUT NOCOPY BOOLEAN,
6454             p_return_status             OUT NOCOPY VARCHAR2,
6455             p_error_buffer              OUT NOCOPY VARCHAR2)
6456 IS
6457   i                      BINARY_INTEGER;
6458 BEGIN
6459 
6460   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
6461 
6462   IF (g_level_procedure >= g_current_runtime_level ) THEN
6463     FND_LOG.STRING(g_level_procedure,
6464                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.evaluate_condition.BEGIN',
6465                    'ZX_TDS_RULE_BASE_DETM_PVT: evaluate_condition(+)');
6466   END IF;
6467 
6468   p_return_status := FND_API.G_RET_STS_SUCCESS;
6469 
6470   i    := p_condition_index;
6471 
6472   IF g_data_type_tbl(i) = 'ALPHANUMERIC' THEN
6473     p_result := evaluate_alphanum_condition(
6474                      g_operator_tbl(i),
6475                      g_alphanum_value_tbl(i),
6476                      p_trx_alphanumeric_value,
6477                      g_value_low_tbl(i),
6478                      g_value_high_tbl(i),
6479                      g_determining_factor_class_tbl(i),
6480                      p_chart_of_accounts_id);
6481 
6482   ELSIF g_data_type_tbl(i) = 'NUMERIC' THEN
6483      p_result := evaluate_numeric_condition(
6484                      g_operator_tbl(i),
6485                      g_numeric_value_tbl(i),
6486                      p_trx_numeric_value);
6487 
6488   ELSIF g_data_type_tbl(i) = 'DATE' THEN
6489     p_result := evaluate_date_condition(
6490                      g_operator_tbl(i),
6491                      g_date_value_tbl(i),
6492                      p_trx_date_value);
6493 
6494   ELSE
6495     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6496     p_error_buffer  := 'Invalid data type';
6497     p_result        := FALSE;
6498 
6499     IF (g_level_unexpected >= g_current_runtime_level ) THEN
6500       FND_LOG.STRING(g_level_unexpected,
6501                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.evaluate_condition',
6502                    'Invalid data type');
6503     END IF;
6504 
6505   END IF;
6506 
6507   IF (g_level_procedure >= g_current_runtime_level ) THEN
6508     FND_LOG.STRING(g_level_procedure,
6509                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.evaluate_condition.END',
6510                    'ZX_TDS_RULE_BASE_DETM_PVT: evaluate_condition(-)');
6511   END IF;
6512 
6513 EXCEPTION
6514   WHEN OTHERS THEN
6515     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6516     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
6517 
6518     IF (g_level_unexpected >= g_current_runtime_level ) THEN
6519       FND_LOG.STRING(g_level_unexpected,
6520                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.evaluate_condition',
6521                       p_error_buffer);
6522     END IF;
6523 
6524 END evaluate_condition;
6525 
6526 -----------------------------------------------------------------------
6527 --  PRIVATE PROCEDURE
6528 --  get_result
6529 --
6530 --  DESCRIPTION
6531 --
6532 --  The procedure gets the result from ZX_PROCESS_RESULTS table.
6533 --  p_found being true will indicate if a result is found.
6534 --
6535 
6536 PROCEDURE get_result(
6537            p_result_id           IN     ZX_PROCESS_RESULTS.RESULT_ID%TYPE,
6538            p_structure_name      IN     VARCHAR2,
6539            p_structure_index     IN     BINARY_INTEGER,
6540            p_tax_regime_code     IN     ZX_RATES_B.tax_regime_Code%TYPE,
6541            p_tax                 IN     ZX_RATES_B.tax%TYPE,
6542            p_tax_determine_date  IN     DATE,
6543            p_found	            OUT NOCOPY BOOLEAN,
6544            p_zx_result_rec          OUT NOCOPY ZX_PROCESS_RESULTS%ROWTYPE,
6545            p_return_status          OUT NOCOPY VARCHAR2,
6546            p_error_buffer           OUT NOCOPY VARCHAR2)
6547 
6548 IS
6549   --
6550   -- cursor for get result at tax regime level for tax rate determination
6551   --
6552   CURSOR  get_tax_result_csr
6553   IS
6554    SELECT  RESULT_ID,
6555            CONDITION_GROUP_CODE,
6556            TAX_STATUS_CODE,
6557            LEGAL_MESSAGE_CODE,
6558            MIN_TAX_AMT,
6559            MAX_TAX_AMT,
6560            MIN_TAXABLE_BASIS,
6561            MAX_TAXABLE_BASIS,
6562            MIN_TAX_RATE,
6563            MAX_TAX_RATE,
6564            Allow_Exemptions_Flag,
6565            Allow_Exceptions_Flag,
6566            Result_Type_Code,
6567            NUMERIC_RESULT,
6568            ALPHANUMERIC_RESULT,
6569            STATUS_RESULT,
6570            RATE_RESULT,
6571            RESULT_API,
6572            CONDITION_GROUP_ID,
6573            CONDITION_SET_ID,
6574            EXCEPTION_SET_ID,
6575            TAX_RULE_ID
6576    FROM    ZX_PROCESS_RESULTS
6577    WHERE   RESULT_ID = p_result_id;
6578 
6579    CURSOR  select_tax_status_rate_code
6580    (c_tax_regime_code VARCHAR2,
6581     c_tax             VARCHAR2,
6582     c_tax_Rate_Code   VARCHAR2,
6583     c_tax_date        VARCHAR2)
6584    is
6585    SELECT  TAX_STATUS_CODE,
6586            TAX_RATE_CODE
6587    FROM    ZX_SCO_RATES_B_V
6588    WHERE   TAX_REGIME_CODE = c_tax_Regime_Code
6589    AND     TAX = c_tax
6590    AND     TAX_RATE_CODE = c_tax_rate_code
6591    AND     (TAX_CLASS = 'OUTPUT' OR TAX_CLASS IS NULL)
6592    --AND  default_flg_effective_from <= c_tax_date
6593    AND     effective_from <= c_tax_date
6594    AND (default_flg_effective_to >= c_tax_date
6595            OR default_flg_effective_to IS NULL)
6596    --AND NVL(Default_Rate_Flag, 'N') = 'Y'
6597    AND NVL(Active_Flag, 'N') = 'Y'
6598    ORDER BY tax_class NULLS LAST, subscription_level_code;   -- Bug#5395227
6599 
6600 
6601    l_condition_set_result BOOLEAN;
6602    l_exception_set_result BOOLEAN;
6603    l_zx_result_rec_null ZX_PROCESS_RESULTS%ROWTYPE;
6604    l_action_rec_tbl     ZX_TDS_PROCESS_CEC_PVT.action_rec_tbl_type;
6605    l_tax_status_Code    ZX_RATES_B.tax_status_code%type;
6606    l_tax_rate_Code      ZX_RATES_B.tax_rate_Code%type;
6607    l_override_tax_rate_Code ZX_RATES_B.tax_rate_code%TYPE;
6608    l_service_type_code ZX_RULES_B.service_type_code%TYPE;
6609 
6610 BEGIN
6611 
6612   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
6613 
6614   IF (g_level_procedure >= g_current_runtime_level ) THEN
6615     FND_LOG.STRING(g_level_procedure,
6616                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_result.BEGIN',
6617                    'ZX_TDS_RULE_BASE_DETM_PVT: get_result(+)');
6618   END IF;
6619   IF (g_level_statement >= g_current_runtime_level ) THEN
6620     FND_LOG.STRING(g_level_statement,
6621                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_result',
6622                    'result_id: ' || p_result_id);
6623   END IF;
6624 
6625   p_return_status := FND_API.G_RET_STS_SUCCESS;
6626 
6627   l_condition_set_result := FALSE;
6628   l_exception_set_result := FALSE;
6629 
6630   --
6631   --  result for tax
6632   --
6633   OPEN get_tax_result_csr;
6634 
6635   FETCH get_tax_result_csr INTO
6636           p_zx_result_rec.result_id,
6637           p_zx_result_rec.condition_group_code,
6638           p_zx_result_rec.tax_status_code,
6639           p_zx_result_rec.legal_message_code,
6640           p_zx_result_rec.min_tax_amt,
6641           p_zx_result_rec.max_tax_amt,
6642           p_zx_result_rec.min_taxable_basis,
6643           p_zx_result_rec.max_taxable_basis,
6644           p_zx_result_rec.min_tax_rate,
6645           p_zx_result_rec.max_tax_rate,
6646           p_zx_result_rec.Allow_Exemptions_Flag,
6647           p_zx_result_rec.Allow_Exceptions_Flag,
6648           p_zx_result_rec.Result_Type_Code,
6649           p_zx_result_rec.numeric_result,
6650           p_zx_result_rec.alphanumeric_result,
6651           p_zx_result_rec.status_result,
6652           p_zx_result_rec.rate_result,
6653           p_zx_result_rec.result_api,
6654           p_zx_result_rec.condition_group_id,
6655           p_zx_result_rec.condition_set_id,
6656           p_zx_result_rec.exception_set_id,
6657           p_zx_result_rec.tax_rule_id;
6658   IF get_tax_result_csr%FOUND THEN
6659      p_found := true;
6660   END IF;
6661 
6662     select service_type_code into l_service_type_code
6663     FROM zx_rules_b
6664     where tax_rule_id = p_zx_result_rec.tax_rule_id;
6665 
6666 
6667   -- For Migrated Records, Check if Condition Set and Exception Set is populated
6668   -- and evaluate the result for them
6669   IF (p_found) AND (p_zx_result_rec.condition_set_id IS NOT NULL OR
6670                     p_zx_result_rec.exception_set_id IS NOT NULL) THEN
6671 
6672    init_cec_params (p_structure_name               => p_structure_name,
6673                     p_structure_index              => p_structure_index,
6674                     p_return_status                => p_return_status,
6675                     p_error_buffer                 => p_error_buffer);
6676 
6677    IF p_zx_result_rec.condition_set_id IS NOT NULL THEN
6678       ZX_TDS_PROCESS_CEC_PVT.evaluate_cec(
6679                     p_condition_set_id             => p_zx_result_rec.condition_set_id,
6680                     p_cec_ship_to_party_site_id    => g_cec_ship_to_party_site_id,
6681                     p_cec_bill_to_party_site_id    => g_cec_bill_to_party_site_id,
6682                     p_cec_ship_to_party_id         => g_cec_ship_to_party_id,
6683                     p_cec_bill_to_party_id         => g_cec_bill_to_party_id,
6684                     p_cec_poo_location_id          => g_cec_poo_location_id,
6685                     p_cec_poa_location_id          => g_cec_poa_location_id,
6686                     p_cec_trx_id                   => g_cec_trx_id,
6687                     p_cec_trx_line_id              => g_cec_trx_line_id,
6688                     p_cec_ledger_id                => g_cec_ledger_id,
6689                     p_cec_internal_organization_id => g_cec_internal_organization_id,
6690                     p_cec_so_organization_id       => g_cec_so_organization_id,
6691                     p_cec_product_org_id           => g_cec_product_org_id,
6692                     p_cec_product_id               => g_cec_product_id,
6693                     p_cec_trx_line_date            => g_cec_trx_line_date,
6694                     p_cec_trx_type_id              => g_cec_trx_type_id,
6695                     p_cec_fob_point                => g_cec_fob_point,
6696                     p_cec_ship_to_site_use_id      => g_cec_ship_to_site_use_id,
6697                     p_cec_bill_to_site_use_id      => g_cec_bill_to_site_use_id,
6698                     p_cec_result                   => l_condition_set_result,
6699                     p_action_rec_tbl               => l_action_rec_tbl,
6700                     p_return_status                => p_return_status,
6701                     p_error_buffer                 => p_error_buffer);
6702       p_found := l_condition_set_result;
6703 
6704       -- Bug 3976490
6705       -- every condition set must evaluate to either TRUE or FALSE. Based on this, the
6706       -- values in the p_action_rec_tbl will be action for True condition or False action.
6707       -- If condition set result evaluates to False, we still need to execute the
6708       -- actions setup under False Actions
6709 
6710          for i in 1.. nvl(l_action_rec_tbl.last,0) loop
6711 
6712            if upper(l_action_rec_tbl(i).action_code) in ('ERROR_MESSAGE','SYSTEM_ERROR') then
6713               p_return_status := FND_API.G_RET_STS_ERROR;
6714               IF (g_level_error >= g_current_runtime_level ) THEN
6715                 FND_LOG.STRING(g_level_error,
6716                                'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_result',
6717                                'Action_code is ERROR_MESSAGE,SYSTEM_ERROR');
6718               END IF;
6719 
6720               app_exception.raise_exception;
6721            elsif upper(l_action_rec_tbl(i).action_code) = 'DO_NOT_USE_THIS_TAX_CODE' then
6722               l_condition_set_result := FALSE;
6723               p_found := l_condition_set_result;
6724            elsif  upper(l_action_rec_tbl(i).action_code) in ('DEFAULT_TAX_CODE') then
6725            if (l_service_type_code <> 'DET_TAXABLE_BASIS' ) THEN
6726         /*     if upper(l_action_rec_tbl(i).action_code)= 'USE_THIS_TAX_CODE' then
6727 ---                 get_tsrm_num_value(p_structure_name,
6728 --- Modified for bug # 6777632
6729                get_tsrm_alphanum_value(p_structure_name,
6730                      p_structure_index,
6731                      'OUTPUT_TAX_CLASSIFICATION_CODE',
6732                      l_override_tax_rate_code,
6733                      p_return_status,
6734                      p_error_buffer);
6735              IF upper(l_action_rec_tbl(i).action_code)= 'DEFAULT_TAX_CODE' then
6736          */
6737                   l_override_tax_rate_code := l_action_rec_tbl(i).action_value;
6738              --end if;
6739 
6740              -- Get the Tax regime, Tax, Status, Rate Code based on override_tax_rate_code
6741              -- and set it on the result_rec.
6742 
6743                  Open select_tax_status_rate_code (p_tax_regime_code, p_tax, l_override_tax_rate_code,
6744                                                    p_tax_determine_date);
6745                  fetch select_tax_status_rate_code into l_tax_status_code, l_tax_rate_code;
6746 
6747                  If select_tax_status_rate_code%NOTFOUND then
6748                     --A record does not exist with that tax rate code for the given tax.
6749                     --Raise error;
6750 
6751                     p_return_status := FND_API.G_RET_STS_ERROR;
6752                     p_error_buffer  := SUBSTR(SQLERRM, 1, 80);
6753                     IF (g_level_error >= g_current_runtime_level ) THEN
6754                       FND_LOG.STRING(g_level_error,
6755                                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_result',
6756                                       'Cannot set the tax rate code to '||l_override_tax_rate_code ||
6757                                       ', ERROR: '|| p_error_buffer);
6758                     END IF;
6759 
6760                     IF select_tax_status_rate_code%isopen then
6761                          Close select_tax_status_rate_code;
6762                     END IF;
6763                     app_exception.raise_exception;
6764                  ELSE
6765                     p_zx_result_rec.rate_result := l_tax_rate_code;
6766                     p_zx_result_rec.status_result :=  l_tax_status_code;
6767                  End if;
6768 
6769                  Close select_tax_status_rate_code;
6770            end if; -- service type code
6771            end if;
6772       end loop;
6773 
6774    END IF;
6775    IF l_condition_set_result AND p_zx_result_rec.exception_set_id IS NOT NULL THEN
6776 
6777       l_action_rec_tbl.delete;
6778 
6779       ZX_TDS_PROCESS_CEC_PVT.evaluate_cec(
6780                     p_exception_set_id             => p_zx_result_rec.exception_set_id,
6781                     p_cec_ship_to_party_site_id    => g_cec_ship_to_party_site_id,
6782                     p_cec_bill_to_party_site_id    => g_cec_bill_to_party_site_id,
6783                     p_cec_ship_to_party_id         => g_cec_ship_to_party_id,
6784                     p_cec_bill_to_party_id         => g_cec_bill_to_party_id,
6785                     p_cec_poo_location_id          => g_cec_poo_location_id,
6786                     p_cec_poa_location_id          => g_cec_poa_location_id,
6787                     p_cec_trx_id                   => g_cec_trx_id,
6788                     p_cec_trx_line_id              => g_cec_trx_line_id,
6789                     p_cec_ledger_id                => g_cec_ledger_id,
6790                     p_cec_internal_organization_id => g_cec_internal_organization_id,
6791                     p_cec_so_organization_id       => g_cec_so_organization_id,
6792                     p_cec_product_org_id           => g_cec_product_org_id,
6793                     p_cec_product_id               => g_cec_product_id,
6794                     p_cec_trx_line_date            => g_cec_trx_line_date,
6795                     p_cec_trx_type_id              => g_cec_trx_type_id,
6796                     p_cec_fob_point                => g_cec_fob_point,
6797                     p_cec_ship_to_site_use_id      => g_cec_ship_to_site_use_id,
6798                     p_cec_bill_to_site_use_id      => g_cec_bill_to_site_use_id,
6799                     p_cec_result                   => l_exception_set_result,
6800                     p_action_rec_tbl               => l_action_rec_tbl,
6801                     p_return_status                => p_return_status,
6802                     p_error_buffer                 => p_error_buffer);
6803 
6804       p_found := l_exception_set_result;
6805 
6806       -- Bug 3976490
6807       -- every exception set must evaluate to either TRUE or FALSE. Based on this, the
6808       -- values in the p_action_rec_tbl will be action for True condition or False action.
6809       -- If condition set result evaluates to False, we still need to execute the
6810       -- actions setup under False Actions
6811 
6812          for i in 1.. nvl(l_action_rec_tbl.last,0) loop
6813 
6814            if upper(l_action_rec_tbl(i).action_code) in ('ERROR_MESSAGE','SYSTEM_ERROR') then
6815               p_return_status := FND_API.G_RET_STS_ERROR;
6816               IF (g_level_error >= g_current_runtime_level ) THEN
6817                 FND_LOG.STRING(g_level_error,
6818                                'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_result',
6819                                'Action_code is ERROR_MESSAGE,SYSTEM_ERROR');
6820               END IF;
6821 
6822               app_exception.raise_exception;
6823            elsif upper(l_action_rec_tbl(i).action_code) in  ('DO_NOT_USE_THIS_TAX_CODE',
6824                                                             'DO_NOT_USE_THIS_TAX_GROUP') then
6825               l_exception_set_result := FALSE;
6826               p_found := l_exception_set_result;
6827 
6828            elsif  upper(l_action_rec_tbl(i).action_code) in ('USE_TAX_CODE',
6829                                                               'DEFAULT_TAX_CODE') then
6830            if (l_service_type_code <> 'DET_TAXABLE_BASIS' ) THEN
6831            /*  if upper(l_action_rec_tbl(i).action_code)= 'USE_THIS_TAX_CODE' then
6832 ---                 get_tsrm_num_value(p_structure_name,
6833 --- Modified for bug # 6777632
6834              get_tsrm_alphanum_value(p_structure_name,
6835                      p_structure_index,
6836                      'OUTPUT_TAX_CLASSIFICATION_CODE',
6837                      l_override_tax_rate_code,
6838                      p_return_status,
6839                      p_error_buffer);
6840             */
6841              --if upper(l_action_rec_tbl(i).action_code)in ('DEFAULT_TAX_CODE','USE_TAX_CODE') then
6842                   l_override_tax_rate_code := l_action_rec_tbl(i).action_value;
6843 
6844              -- Get the Tax regime, Tax, Status, Rate Code based on override_tax_rate_code
6845              -- and set it on the result_rec.
6846 
6847                  Open select_tax_status_rate_code (p_tax_regime_code, p_tax, l_override_tax_rate_code,
6848                                                    p_tax_determine_date);
6849                  fetch select_tax_status_rate_code into l_tax_status_code, l_tax_rate_code;
6850 
6851                  If select_tax_status_rate_code%NOTFOUND then
6852                     --A record does not exist with that tax rate code for the given tax.
6853                     --Raise error;
6854 
6855                     p_return_status := FND_API.G_RET_STS_ERROR;
6856                     p_error_buffer  := SUBSTR(SQLERRM, 1, 80);
6857                     IF (g_level_error >= g_current_runtime_level ) THEN
6858                       FND_LOG.STRING(g_level_error,
6859                                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_result',
6860                                       'Cannot set the tax rate code to '||l_override_tax_rate_code ||
6861                                       ', ERROR: '||p_error_buffer);
6862                     END IF;
6863                     IF select_tax_status_rate_code%isopen then
6864                          Close select_tax_status_rate_code;
6865                     END IF;
6866                     app_exception.raise_exception;
6867                  ELSE
6868                     p_zx_result_rec.rate_result := l_tax_rate_code;
6869                     p_zx_result_rec.status_result :=  l_tax_status_code;
6870                  End if;
6871 
6872                  Close select_tax_status_rate_code;
6873            --end if;
6874          end if;
6875 
6876            elsif upper(l_action_rec_tbl(i).action_code)= 'DO_NOT_APPLY_EXCEPTION' then
6877              -- bug 6840036- set p_found to TRUE for all
6878              -- service type codes except DET_TAX_RATE
6879                  --NULL;
6880              IF (l_service_type_code <> 'DET_TAX_RATE' ) THEN
6881                p_found := TRUE;
6882              END IF;
6883 
6884            elsif upper(l_action_rec_tbl(i).action_code) = 'APPLY_EXCEPTION' then
6885                 -- populate the numeric result column of the result rec.
6886                 -- This rate will be used during Tax Rate Determination process
6887                 -- The Rate determination process will check if the rate is ad-hoc and
6888                 -- accordingly honour this rate or raise exception.
6889 
6890                Begin
6891                 p_zx_result_rec.numeric_result := l_action_rec_tbl(i).action_value;
6892                exception
6893                 when others then
6894                     FND_MESSAGE.SET_NAME('ZX','GENERIC_MESSAGE');
6895                     FND_MESSAGE.SET_TOKEN('GENERIC_TEXT','The action value for APPLY_EXCEPTION action code'||
6896                         'does not contain number');
6897                     FND_MSG_PUB.Add;
6898                     IF (g_level_error >= g_current_runtime_level ) THEN
6899                       FND_LOG.STRING(g_level_error,
6900                                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_result',
6901                                      'The action value for APPLY_EXCEPTION action code '||
6902                                      'does not contain number');
6903                     END IF;
6904                     app_exception.raise_exception;
6905                end;
6906         end if;
6907       end loop;
6908    END IF;
6909    -- If Condition Set or Exception Set evaluates to FALSE, then
6910    -- remove record in Process Result Structure.
6911    IF not p_found THEN
6912       p_zx_result_rec := l_zx_result_rec_null;
6913    END IF;
6914   END IF;     /* of Migrated Records check for Condition Set and Evaluation Set */
6915 
6916   CLOSE get_tax_result_csr;
6917 
6918   IF (g_level_procedure >= g_current_runtime_level ) THEN
6919     FND_LOG.STRING(g_level_procedure,
6920                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_result.END',
6921                    'ZX_TDS_RULE_BASE_DETM_PVT: get_result(-)' ||
6922                    ', p_return_status = ' || p_return_status ||
6923                    ', p_error_buffer  = ' || p_error_buffer);
6924   END IF;
6925 
6926   EXCEPTION
6927     WHEN OTHERS THEN
6928       p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6929       p_error_buffer  := SUBSTR(SQLERRM, 1, 80);
6930       CLOSE get_tax_result_csr;
6931 
6932       IF (g_level_unexpected >= g_current_runtime_level ) THEN
6933         FND_LOG.STRING(g_level_unexpected,
6934                        'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_result',
6935                         p_error_buffer);
6936       END IF;
6937 
6938 END get_result;
6939 
6940 -----------------------------------------------------------------------
6941 --  PRIVATE PROCEDURE
6942 --  get_fsc_code
6943 --
6944 --  DESCRIPTION
6945 --    This procedure loops through a fiscal classification cache structure
6946 --    to return a fiscal classification code if found
6947 --
6948 --  History
6949 --
6950 --    Phong La                    21-MAY-02  Created
6951 --
6952 PROCEDURE get_fsc_code(
6953             p_found                   IN OUT NOCOPY BOOLEAN,
6954             p_tax_regime_code         IN     ZX_REGIMES_B.TAX_REGIME_CODE%TYPE,
6955             p_classification_category IN
6956                  ZX_FC_TYPES_B.Classification_Type_Categ_Code%TYPE,
6957             p_classification_type     IN
6958                  ZX_FC_TYPES_B.CLASSIFICATION_TYPE_CODE%TYPE,
6959             p_tax_determine_date      IN     ZX_LINES.TAX_DETERMINE_DATE%TYPE,
6960             p_classified_entity_id    IN
6961                  ZX_FC_CODES_B.CLASSIFICATION_ID%TYPE,
6962             p_item_org_id             IN     NUMBER,
6963             p_event_class_rec         IN     ZX_API_PUB.EVENT_CLASS_REC_TYPE,
6964             p_trx_alphanumeric_value     OUT NOCOPY ZX_CONDITIONS.ALPHANUMERIC_VALUE%TYPE)
6965 
6966 IS
6967   l_count                 NUMBER;
6968   l_fsc_tbl               ZX_TCM_CONTROL_PKG.zx_fsc_class_info_cache;
6969 BEGIN
6970 
6971   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
6972   IF (g_level_statement >= g_current_runtime_level ) THEN
6973     FND_LOG.STRING(g_level_statement,
6974                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_fsc_code.BEGIN',
6975                    'ZX_TDS_RULE_BASE_DETM_PVT: get_fsc_code(+)');
6976   END IF;
6977 
6978   p_found := FALSE;
6979   l_fsc_tbl  := ZX_TDS_CALC_SERVICES_PUB_PKG.g_fsc_tbl;
6980   l_count := l_fsc_tbl.count;
6981 
6982   FOR i IN 1.. l_count LOOP
6983     IF (l_fsc_tbl(i).classification_type = p_classification_type AND
6984         l_fsc_tbl(i).tax_regime_code = p_tax_regime_code              AND
6985         l_fsc_tbl(i).classification_category = p_classification_category AND
6986         NVL(l_fsc_tbl(i).classified_entity_id,0)    =
6987                                     NVL(p_classified_entity_id,0) AND
6988         p_tax_determine_date >= l_fsc_tbl(i).effective_from           AND
6989         p_tax_determine_date <= NVL(l_fsc_tbl(i).effective_to,
6990                                     p_tax_determine_date)             AND
6991         NVL(l_fsc_tbl(i).item_org_id, 0) = NVL(p_item_org_id, 0)      AND
6992         l_fsc_tbl(i).application_id = p_event_class_rec.application_id AND
6993         l_fsc_tbl(i).event_class_code = p_event_class_rec.event_class_code ) THEN
6994       p_trx_alphanumeric_value := l_fsc_tbl(i).fsc_code;
6995       p_found := TRUE;
6996       EXIT;
6997     END IF;
6998   END LOOP;
6999 
7000   IF (g_level_statement >= g_current_runtime_level ) THEN
7001     FND_LOG.STRING(g_level_statement,
7002                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_fsc_code',
7003                    'trx_alpha_value: ' || p_trx_alphanumeric_value);
7004     FND_LOG.STRING(g_level_statement,
7005                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_fsc_code.END',
7006                    'ZX_TDS_RULE_BASE_DETM_PVT: get_fsc_code(-)');
7007   END IF;
7008 
7009 EXCEPTION
7010   WHEN OTHERS THEN
7011     IF (g_level_unexpected >= g_current_runtime_level ) THEN
7012       FND_LOG.STRING(g_level_unexpected,
7013                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_fsc_code',
7014                        sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80));
7015     END IF;
7016 
7017 END get_fsc_code;
7018 ----------------------------------------------------------------------
7019 --  PRIVATE PROCEDURE
7020 --  check_condition_group_result
7021 --
7022 --  DESCRIPTION
7023 --    This procedure checks the condition group result structure to determine
7024 --    if a given condition group of a template has been evaluated before
7025 --  History
7026 --
7027 --  Helen Si                    5-OCT-01  Created
7028 --
7029 PROCEDURE check_condition_group_result(
7030        p_det_factor_templ_code IN
7031                        ZX_DET_FACTOR_TEMPL_B.DET_FACTOR_TEMPL_CODE%TYPE,
7032        p_condition_group_code  IN
7033                        ZX_CONDITION_GROUPS_B.CONDITION_GROUP_CODE%TYPE,
7034        p_trx_line_index        IN     BINARY_INTEGER,
7035        p_event_class_rec       IN     ZX_API_PUB.EVENT_CLASS_REC_TYPE,
7036        p_template_evaluated    OUT NOCOPY BOOLEAN,
7037        p_result		       OUT NOCOPY BOOLEAN)
7038 IS
7039   l_count                 NUMBER;
7040   l_check_condition_group_tbl  ZX_TDS_CALC_SERVICES_PUB_PKG.trx_line_cond_grp_eval_tbl;
7041 BEGIN
7042 
7043   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
7044 
7045   IF (g_level_procedure >= g_current_runtime_level ) THEN
7046     FND_LOG.STRING(g_level_procedure,
7047                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.check_condition_group_result.BEGIN',
7048                    'ZX_TDS_RULE_BASE_DETM_PVT: check_condition_group_result(+)');
7049   END IF;
7050 
7051   IF (g_level_statement >= g_current_runtime_level ) THEN
7052     FND_LOG.STRING(g_level_statement,
7053                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.check_condition_group_result',
7054                    'det_factor_templ_code: ' || p_det_factor_templ_code ||
7055                    ', condition group code: ' || p_condition_group_code ||
7056                    ', trx_line_index: ' || p_trx_line_index ||
7057                    ', application_Id: ' || to_char(p_event_class_rec.application_Id) ||
7058                    ', tax_event_class_code: ' || p_event_class_rec.tax_event_class_code);
7059   END IF;
7060 
7061   l_check_condition_group_tbl := ZX_TDS_CALC_SERVICES_PUB_PKG.g_check_cond_grp_tbl;
7062   l_count                := l_check_condition_group_tbl.count;
7063   p_template_evaluated   := FALSE;
7064   p_result               := FALSE;
7065 
7066   IF (g_level_statement >= g_current_runtime_level ) THEN
7067     FND_LOG.STRING(g_level_statement,
7068                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.check_condition_group_result',
7069                    'Results in condition_group  tbl: ' || to_char(l_count));
7070   END IF;
7071 
7072 
7073   FOR j in 1..l_count LOOP
7074 
7075     IF (l_check_condition_group_tbl(j).det_factor_templ_code =
7076                            p_det_factor_templ_code                 AND
7077         l_check_condition_group_tbl(j).condition_group_code =
7078                            p_condition_group_code                  AND
7079         l_check_condition_group_tbl(j).trx_line_index  = p_trx_line_index  AND
7080         l_check_condition_group_tbl(j).application_Id  =
7081                           p_event_class_rec.application_Id         AND
7082          l_check_condition_group_tbl(j).tax_event_class_code =
7083                           p_event_class_rec.tax_event_class_code) THEN
7084 
7085       IF (g_level_statement >= g_current_runtime_level ) THEN
7086         FND_LOG.STRING(g_level_statement,
7087                        'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.check_condition_group_result',
7088                        l_check_condition_group_tbl(j).condition_group_code ||
7089                        ' was evaluated before');
7090       END IF;
7091 
7092       p_template_evaluated := TRUE;
7093       p_result := l_check_condition_group_tbl(j).result;
7094       EXIT;
7095       /*
7096        * do not need to search for which driver set is true since
7097        * driver set now is passed in
7098        * IF l_check_condition_group_tbl(j).result THEN
7099        *  p_result          := TRUE;
7100        *  EXIT;
7101        *  END IF;
7102        */
7103     END IF;
7104 
7105   END LOOP;
7106 
7107   IF (g_level_procedure >= g_current_runtime_level ) THEN
7108     FND_LOG.STRING(g_level_procedure,
7109                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.check_condition_group_result.END',
7110                    'ZX_TDS_RULE_BASE_DETM_PVT: check_condition_group_result(-)');
7111   END IF;
7112 
7113 EXCEPTION
7114   WHEN OTHERS THEN
7115     IF (g_level_unexpected >= g_current_runtime_level ) THEN
7116       FND_LOG.STRING(g_level_unexpected,
7117                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.check_condition_group_result',
7118                       sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80));
7119     END IF;
7120 
7121 END check_condition_group_result;
7122 
7123 -----------------------------------------------------------------------
7124 --  PRIVATE PROCEDURE
7125 --  insert_condition_group_result
7126 --
7127 --  DESCRIPTION
7128 --    This procedure inserts the result of true/false (success/fail) to
7129 --    the condition group result structure after a template has been evaluated
7130 --
7131 --  History
7132 --
7133 --  Helen / Rajeev 			1-OCT-01  Created
7134 --
7135 --
7136 PROCEDURE insert_condition_group_result(
7137             p_det_factor_templ_code IN ZX_DET_FACTOR_TEMPL_B.det_factor_templ_code%TYPE,
7138             p_condition_group_code  IN ZX_CONDITION_GROUPS_B.condition_group_CODE%TYPE,
7139             p_result                IN     BOOLEAN,
7140             p_trx_line_index        IN     BINARY_INTEGER,
7141             p_event_class_rec       IN     ZX_API_PUB.EVENT_CLASS_REC_TYPE
7142              )
7143 IS
7144  i    		             BINARY_INTEGER;
7145  l_check_condition_group_rec      ZX_TDS_CALC_SERVICES_PUB_PKG.trx_line_cond_grp_eval_rec;
7146 
7147 BEGIN
7148 
7149   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
7150   IF (g_level_procedure >= g_current_runtime_level ) THEN
7151     FND_LOG.STRING(g_level_procedure,
7152                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.insert_condition_group_result.BEGIN',
7153                    'ZX_TDS_RULE_BASE_DETM_PVT: insert_condition_group_result(+)');
7154   END IF;
7155 
7156   i := ZX_TDS_CALC_SERVICES_PUB_PKG.g_check_cond_grp_tbl.count + 1;
7157 
7158   l_check_condition_group_rec.det_factor_templ_code   := p_det_factor_templ_code;
7159   l_check_condition_group_rec.condition_group_code := p_condition_group_code;
7160   l_check_condition_group_rec.trx_line_index  := p_trx_line_index;
7161   l_check_condition_group_rec.application_id  := p_event_class_rec.application_id;
7162   l_check_condition_group_rec.tax_event_class_code :=
7163                               p_event_class_rec.tax_event_class_code;
7164   l_check_condition_group_rec.result          := p_result;
7165 
7166   ZX_TDS_CALC_SERVICES_PUB_PKG.g_check_cond_grp_tbl(i) := l_check_condition_group_rec;
7167 
7168 
7169   IF (g_level_procedure >= g_current_runtime_level ) THEN
7170     FND_LOG.STRING(g_level_procedure,
7171                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.insert_condition_group_result.END',
7172                    'ZX_TDS_RULE_BASE_DETM_PVT: insert_condition_group_result(-)');
7173   END IF;
7174 
7175 EXCEPTION
7176   WHEN OTHERS THEN
7177 
7178     IF (g_level_unexpected >= g_current_runtime_level ) THEN
7179       FND_LOG.STRING(g_level_unexpected,
7180                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.insert_condition_group_result',
7181                       sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80));
7182     END IF;
7183 
7184 END insert_condition_group_result;
7185 
7186 
7187 -----------------------------------------------------------------------
7188 --  PRIVATE PROCEDURE
7189 --  check_templ_tax_parameter
7190 --
7191 --  DESCRIPTION
7192 --  This procedure validates the tax parameter codes stored for each
7193 --  determining factor at the the template details level; this template
7194 --  is further processed only when the tax parameter is supported for the
7195 --  application.
7196 --
7197 --  History
7198 --
7199 --  Ramya              04-FEB-2005                  CREATED
7200 --                                                  Ref Bug #4166241
7201 --
7202 --
7203 
7204 PROCEDURE check_templ_tax_parameter(
7205           	p_det_factor_templ_code IN ZX_DET_FACTOR_TEMPL_B.det_factor_templ_code%TYPE,
7206           	p_event_class_rec       IN ZX_API_PUB.EVENT_CLASS_REC_TYPE,
7207             p_valid    	            OUT NOCOPY BOOLEAN,
7208             p_return_status         OUT NOCOPY VARCHAR2,
7209             p_error_buffer          OUT NOCOPY VARCHAR2)
7210 
7211 IS
7212 
7213   l_evnt_cls_parameter_code       ZX_PARAMETERS_B.TAX_PARAMETER_CODE%TYPE;
7214   l_tbl_index                         BINARY_INTEGER;
7215   --
7216   -- Earlier, we were having two cursors - one to fetch the template details
7217   -- and another to get the parameter code value. But with Bug 4896265, merged
7218   -- the two cursors to have just one , as below.
7219   --
7220   -- Bug5710822: Event if one DF is not supported by the current event class,
7221   --             rule engine needs to check the value of ignore flag of this
7222   --             determining factor in any condition sets defined under this DF
7223   --             template. If it is 'Y', this DF template needs to be processed.
7224   --
7225   CURSOR chk_taxevnt_parameter_code_csr
7226         (c_det_factor_templ_cd       ZX_DET_FACTOR_TEMPL_B.det_factor_templ_code%TYPE,
7227          c_event_class_mapping_id    ZX_EVNT_CLS_MAPPINGS.event_class_mapping_id%TYPE)
7228        IS
7229          SELECT param.tax_parameter_code
7230          FROM   zx_det_factor_templ_dtl dtl,
7231                 zx_det_factor_templ_b templ,
7232                 zx_event_class_params param
7233          WHERE  templ.det_factor_templ_code = c_det_factor_templ_cd
7234          AND    dtl.det_factor_templ_id     = templ.det_factor_templ_id
7235          AND    param.event_class_mapping_id = c_event_class_mapping_id
7236          AND    param.tax_parameter_code   = dtl.tax_parameter_code
7237          AND    NOT EXISTS
7238                 (SELECT 1
7239                    FROM zx_condition_groups_b zcg,
7240                         zx_conditions zc
7241                   WHERE zcg.det_factor_templ_code = c_det_factor_templ_cd
7242                     AND zcg.enabled_flag = 'Y'
7243                     AND zc.condition_group_code = zcg.condition_group_code
7244                     AND zc.determining_factor_code = dtl.determining_factor_code
7245                     AND zc.determining_factor_class_code = dtl.determining_factor_class_code
7246                     AND NVL(zc.determining_factor_cq_code, 'x') = NVL(dtl.determining_factor_cq_code, 'x')
7247                     AND zc.ignore_flag = 'Y'
7248 
7249                 );
7250 
7251 BEGIN
7252 
7253   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
7254   p_return_status := FND_API.G_RET_STS_SUCCESS;
7255 
7256   --Initialize the return status , p_valid as TRUE
7257   p_valid := TRUE;
7258 
7259   IF (g_level_procedure >= g_current_runtime_level ) THEN
7260     FND_LOG.STRING(g_level_procedure,
7261                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.check_templ_tax_parameter.BEGIN',
7262                    'ZX_TDS_RULE_BASE_DETM_PVT: check_templ_tax_parameter(+)');
7263   END IF;
7264 
7265   l_tbl_index := dbms_utility.get_hash_value(p_det_factor_templ_code||to_char(p_event_class_rec.event_class_mapping_id), 1, 8192);
7266 
7267   IF ZX_GLOBAL_STRUCTURES_PKG.g_template_valid_info_tbl.exists(l_tbl_index) THEN
7268 
7269       p_valid := ZX_GLOBAL_STRUCTURES_PKG.g_template_valid_info_tbl(l_tbl_index).VALID;
7270 
7271   ELSE
7272        -- get tax parameter codes for all determining factors from ZX_DET_FACTOR_TEMPL_DTL table.
7273 
7274        OPEN chk_taxevnt_parameter_code_csr(p_det_factor_templ_code,
7275        		                                p_event_class_rec.event_class_mapping_id);
7276 
7277        FETCH chk_taxevnt_parameter_code_csr INTO l_evnt_cls_parameter_code;
7278 
7279        --
7280        --If a parameter exists in the ZX_TAXEVNT_CLS_PARAMS table, then this
7281        --parameter is not supported by the application; hence return FALSE
7282        --
7283        IF (chk_taxevnt_parameter_code_csr%found) THEN
7284          IF (g_level_statement >= g_current_runtime_level ) THEN
7285            FND_LOG.STRING(g_level_statement,
7286                           'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.check_templ_tax_parameter',
7287                           'chk_taxevnt_parameter_code_csr row count '
7288                            ||to_char(chk_taxevnt_parameter_code_csr%rowcount) ||
7289                           ', Parameter ' || l_evnt_cls_parameter_code || ' FOUND for Template '
7290                            ||p_det_factor_templ_code);
7291          END IF;
7292          p_valid := FALSE;
7293 
7294          ZX_GLOBAL_STRUCTURES_PKG.g_template_valid_info_tbl(l_tbl_index).DET_FACTOR_TEMPL_CODE   :=
7295                                                                   p_det_factor_templ_code;
7296          ZX_GLOBAL_STRUCTURES_PKG.g_template_valid_info_tbl(l_tbl_index).EVENT_CLASS_MAPPING_ID   :=
7297                                                                   p_event_class_rec.event_class_mapping_id;
7298          ZX_GLOBAL_STRUCTURES_PKG.g_template_valid_info_tbl(l_tbl_index).VALID   := FALSE;
7299 
7300        ELSE
7301 
7302          ZX_GLOBAL_STRUCTURES_PKG.g_template_valid_info_tbl(l_tbl_index).DET_FACTOR_TEMPL_CODE   :=
7303                                                                  p_det_factor_templ_code;
7304          ZX_GLOBAL_STRUCTURES_PKG.g_template_valid_info_tbl(l_tbl_index).EVENT_CLASS_MAPPING_ID   :=
7305                                                                  p_event_class_rec.event_class_mapping_id;
7306          ZX_GLOBAL_STRUCTURES_PKG.g_template_valid_info_tbl(l_tbl_index).VALID   := TRUE;
7307 
7308        END IF;
7309 
7310        CLOSE chk_taxevnt_parameter_code_csr;
7311    END IF;
7312 
7313   IF (g_level_procedure >= g_current_runtime_level ) THEN
7314     FND_LOG.STRING(g_level_procedure,
7315                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.check_templ_tax_parameter.END',
7316                    'ZX_TDS_RULE_BASE_DETM_PVT: check_templ_tax_parameter(-)');
7317   END IF;
7318 EXCEPTION
7319   WHEN OTHERS THEN
7320     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7321     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
7322 
7323     IF (g_level_unexpected >= g_current_runtime_level ) THEN
7324       FND_LOG.STRING(g_level_unexpected,
7325                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.check_templ_tax_parameter',
7326                       p_error_buffer);
7327     END IF;
7328 
7329 END check_templ_tax_parameter;
7330 
7331 
7332 
7333 -----------------------------------------------------------------------
7334 --  PRIVATE PROCEDURE
7335 --  check_rule_geography
7336 --
7337 --  DESCRIPTION
7338 --  This procedure is to check if the Geography Context for the given Rule matches with the
7339 --	one stored in the Location information cached in the Global structure. Only such Rules need
7340 --  to be processed.
7341 --
7342 --  History
7343 --
7344 --  Ramya              12-APR-2005                  CREATED
7345 --                                                  Ref Bug #4255160
7346 --
7347 --
7348 
7349 PROCEDURE check_rule_geography(
7350     p_structure_name      IN VARCHAR2,
7351     p_structure_index     IN BINARY_INTEGER,
7352     p_rule_det_factor_cq  IN ZX_RULES_B.determining_factor_cq_code%TYPE,
7353     p_rule_geography_type IN ZX_RULES_B.geography_type%TYPE,
7354     p_rule_geography_id   IN ZX_RULES_B.geography_id%TYPE,
7355     p_event_class_rec     IN ZX_API_PUB.EVENT_CLASS_REC_TYPE,
7356     p_valid               OUT NOCOPY BOOLEAN,
7357     p_return_status       OUT NOCOPY VARCHAR2,
7358     p_error_buffer        OUT NOCOPY VARCHAR2)
7359 
7360 IS
7361 	l_cache_evt_cls_map_id  NUMBER;
7362 	l_cache_trx_id 					NUMBER;
7363 	l_cache_trx_line_id 		NUMBER;
7364 	l_cache_loc_type 				VARCHAR2(30);
7365 	l_cache_geo_type 				VARCHAR2(30);
7366 	l_cache_geo_id 					NUMBER;
7367 	l_valid 								BOOLEAN;
7368       --l_count 								NUMBER;
7369         l_location_id    	 NUMBER;
7370         l_geography_id   	 NUMBER;
7371         l_geography_code         VARCHAR2(30);
7372         l_geography_name         VARCHAR2(360);
7373 
7374 BEGIN
7375 
7376   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
7377   p_return_status := FND_API.G_RET_STS_SUCCESS;
7378 
7379   --Initialize the return status , p_valid as FALSE
7380   p_valid := FALSE;
7381   p_return_status := FND_API.G_RET_STS_SUCCESS;
7382   --l_count := ZX_GLOBAL_STRUCTURES_PKG.location_info_tbl.COUNT;
7383 
7384 
7385   IF (g_level_procedure >= g_current_runtime_level ) THEN
7386     FND_LOG.STRING(g_level_procedure,
7387                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.check_rule_geography.BEGIN',
7388                    'ZX_TDS_RULE_BASE_DETM_PVT: check_rule_geography(+)');
7389   END IF;
7390 
7391 
7392       get_tsrm_num_value(
7393             p_structure_name,
7394             p_structure_index,
7395             p_rule_det_factor_cq || '_' || 'LOCATION_ID',
7396             l_location_id,
7397             p_return_status,
7398             p_error_buffer);
7399 
7400       IF (g_level_statement >= g_current_runtime_level ) THEN
7401             FND_LOG.STRING(g_level_statement,
7402                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.check_rule_geography',
7403                    p_rule_det_factor_cq || '_' || 'LOCATION_ID = '||to_char(l_location_id));
7404       END IF;
7405 
7406          ZX_TCM_GEO_JUR_PKG.get_master_geography
7407             (l_location_id,
7408              p_rule_det_factor_cq, --l_location_type
7409              p_rule_geography_type, -- geography_type
7410              l_geography_id,
7411              l_geography_code,
7412              l_geography_name,
7413              p_return_status);
7414 
7415         IF p_return_status  =  FND_API.G_RET_STS_SUCCESS THEN
7416           IF l_geography_id = p_rule_geography_id then
7417               	p_valid:=TRUE;
7418 
7419               	       IF (g_level_statement >= g_current_runtime_level ) THEN
7420                           FND_LOG.STRING(g_level_statement,
7421                             'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.check_rule_geography',
7422                             'p_valid = TRUE ');
7423 	               END IF;
7424 
7425           END IF;
7426         END IF;
7427 
7428 
7429         IF (g_level_statement >= g_current_runtime_level ) THEN
7430                   FND_LOG.STRING(g_level_statement,
7431                     'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.check_rule_geography',
7432                     'p_rule_geography_id=' || to_char(p_rule_geography_id)||
7433                     ', l_geography_id=' || to_char(l_geography_id) ||
7434                     ', l_geography_code=' || l_geography_code ||
7435                     ', l_geography_name=' || l_geography_name  );
7436 	END IF; --g_level_statement if
7437 
7438       /*
7439 	FOR i IN 1..ZX_GLOBAL_STRUCTURES_PKG.location_info_tbl.event_class_mapping_id.LAST LOOP
7440 
7441 		--l_cache_evt_cls_map_id := ZX_GLOBAL_STRUCTURES_PKG.location_info_tbl.event_class_mapping_id(i);
7442 		--l_cache_trx_id         := ZX_GLOBAL_STRUCTURES_PKG.location_info_tbl.trx_id(i);
7443 		l_cache_loc_type			 := ZX_GLOBAL_STRUCTURES_PKG.location_info_tbl.location_type(i);
7444 		l_cache_geo_type			 := ZX_GLOBAL_STRUCTURES_PKG.location_info_tbl.geography_type(i);
7445 		l_cache_geo_id				 := ZX_GLOBAL_STRUCTURES_PKG.location_info_tbl.geography_id(i);
7446 
7447 		IF (g_level_statement >= g_current_runtime_level ) THEN
7448                   FND_LOG.STRING(g_level_statement,
7449                     'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.check_rule_geography',
7450                     'l_cache_evt_cls_map_id=' || to_char(l_cache_evt_cls_map_id) ||
7451                     ', l_cache_trx_id=' || to_char(l_cache_trx_id) ||
7452                     ', l_cache_trx_line_id=' || to_char(l_cache_trx_line_id) ||
7453                     ', l_cache_loc_type=' || l_cache_loc_type ||
7454                     ', l_cache_geo_type=' || l_cache_geo_type ||
7455                     ', l_cache_geo_id=' || to_char(l_cache_geo_id));
7456 		END IF; --g_level_statement if
7457 
7458 		IF(l_cache_loc_type = p_rule_det_factor_cq AND
7459 				l_cache_geo_type = p_rule_geography_type AND
7460 				l_cache_geo_id = p_rule_geography_id ) THEN
7461 			p_valid:=TRUE;
7462 			EXIT;
7463 		END IF;
7464 	END LOOP;
7465 	*/
7466 
7467   IF (g_level_procedure >= g_current_runtime_level ) THEN
7468     FND_LOG.STRING(g_level_procedure,
7469                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.check_rule_geography.END',
7470                    'ZX_TDS_RULE_BASE_DETM_PVT: check_rule_geography(-)');
7471   END IF;
7472 EXCEPTION
7473   WHEN OTHERS THEN
7474     p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7475     p_error_buffer  := sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80);
7476 
7477     IF (g_level_unexpected >= g_current_runtime_level ) THEN
7478       FND_LOG.STRING(g_level_unexpected,
7479                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.check_rule_geography',
7480                       p_error_buffer);
7481     END IF;
7482 
7483 END check_rule_geography;
7484 
7485 
7486 -----------------------------------------------------------------------
7487 --  PUBLIC FUNCTION
7488 --  get_trx_value_index
7489 --
7490 --  DESCRIPTION
7491 --
7492 --  This function returns the hash table index from global trx
7493 --  value cache structure
7494 --
7495 
7496 FUNCTION get_trx_value_index(
7497             p_Det_Factor_Class_Code IN ZX_CONDITIONS.Determining_Factor_Class_Code%TYPE,
7498             p_determining_factor_code  IN ZX_CONDITIONS.determining_factor_code%TYPE,
7499             p_Determining_Factor_Cq_Code    IN ZX_CONDITIONS.Determining_Factor_Cq_Code%TYPE,
7500             p_condition_value   IN   ZX_CONDITIONS.ALPHANUMERIC_VALUE%TYPE )
7501 RETURN BINARY_INTEGER IS
7502   l_count          NUMBER;
7503   l_tbl_index      BINARY_INTEGER;
7504   cache_delim      CONSTANT VARCHAR2(03) := '|$|';
7505 /* Bug 5003413 : Added a delimiter to avoid concatenation of two strings
7506                  resulting into same output string */
7507 BEGIN
7508 
7509   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
7510 
7511   IF (g_level_statement >= g_current_runtime_level ) THEN
7512     FND_LOG.STRING(g_level_statement,
7513                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_trx_value_index.BEGIN',
7514                    'ZX_TDS_RULE_BASE_DETM_PVT: get_trx_value_index(+)');
7515   END IF;
7516 
7517   l_count     := ZX_TDS_CALC_SERVICES_PUB_PKG.g_trx_alphanum_value_tbl.COUNT;
7518 
7519 
7520   l_tbl_index := dbms_utility.get_hash_value(
7521                 p_Det_Factor_Class_Code || cache_delim ||
7522                 p_determining_factor_code  || cache_delim ||
7523                 p_Determining_Factor_Cq_Code || cache_delim ||
7524                 p_condition_value,
7525                 1,
7526                 8192);
7527 
7528   IF (g_level_statement >= g_current_runtime_level ) THEN
7529     FND_LOG.STRING(g_level_statement,
7530                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_trx_value_index.END',
7531                    'ZX_TDS_RULE_BASE_DETM_PVT: get_trx_value_index(-)');
7532   END IF;
7533 
7534   RETURN l_tbl_index;
7535 
7536 EXCEPTION
7537   WHEN OTHERS THEN
7538 
7539     IF (g_level_unexpected >= g_current_runtime_level ) THEN
7540       FND_LOG.STRING(g_level_unexpected,
7541                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.get_trx_value_index',
7542                       sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80));
7543     END IF;
7544 
7545 END get_trx_value_index;
7546 -----------------------------------------------------------------------
7547 
7548 --  PRIVATE FUNCTION
7549 --  evaluate_alphanum_condition
7550 --
7551 --  DESCRIPTION
7552 --
7553 --  The procedure is to evaluate condition value of alphanumeric data type
7554 --
7555 
7556 FUNCTION evaluate_alphanum_condition(
7557            p_Operator_Code         IN    ZX_CONDITIONS.Operator_Code%TYPE,
7558            p_condition_value       IN    ZX_CONDITIONS.ALPHANUMERIC_VALUE%TYPE,
7559            p_trx_value             IN    ZX_CONDITIONS.ALPHANUMERIC_VALUE%TYPE,
7560            p_value_low             IN    ZX_CONDITIONS.VALUE_LOW%TYPE,
7561            p_value_high            IN    ZX_CONDITIONS.VALUE_HIGH%TYPE,
7562            p_det_factor_templ_code IN    ZX_DET_FACTOR_TEMPL_B.DET_FACTOR_TEMPL_CODE%TYPE,
7563            p_chart_of_accounts_id  IN    ZX_CONDITION_GROUPS_B.CHART_OF_ACCOUNTS_ID%TYPE)
7564 RETURN BOOLEAN IS
7565   l_str                           ZX_CONDITIONS.ALPHANUMERIC_VALUE%TYPE;
7566   -- Start : Added for Bug#7412888 by ssohal
7567   TYPE var_tbl IS TABLE OF VARCHAR(150) INDEX BY BINARY_INTEGER;
7568 
7569   trx_acc   var_tbl;
7570   acc_low   var_tbl;
7571   acc_high  var_tbl;
7572 
7573   l_delimiter        VARCHAR2(1);
7574   l_nth_index        NUMBER;
7575   l_prev_index       NUMBER;
7576   l_curr_index       NUMBER;
7577   l_count            NUMBER;
7578   l_result           BOOLEAN;
7579   -- End : Added for Bug#7412888 by ssohal
7580 BEGIN
7581   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
7582 
7583   IF (g_level_statement >= g_current_runtime_level ) THEN
7584     FND_LOG.STRING(g_level_statement,
7585                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.evaluate_alphanum_condition.BEGIN',
7586                    'ZX_TDS_RULE_BASE_DETM_PVT: evaluate_alphanum_condition(+)');
7587     FND_LOG.STRING(g_level_statement,
7588                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.evaluate_alphanum_condition',
7589                    'p_Operator_Code: ' || p_operator_code ||
7590                    ', p_condition_value:' || p_condition_value ||
7591                    ', p_trx_value: ' || p_trx_value ||
7592                    ', p_value_low: ' || p_value_low ||
7593                    ', p_value_high: ' || p_value_high||
7594                    ', p_det_factor_templ_code: '||p_det_factor_templ_code||
7595                    ', p_chart_of_accounts_id: '||p_chart_of_accounts_id);
7596   END IF;
7597 
7598   -- bug fix: 4874898
7599   IF p_Operator_Code = '='  THEN
7600     -- this is added for the tax_classification_code is null rule.
7601     IF p_condition_value = 'NULL' THEN
7602       RETURN (p_trx_value IS NULL);
7603     ELSE
7604       IF p_trx_value is NULL THEN
7605         RETURN FALSE;
7606       ELSE
7607         RETURN  (p_trx_value = p_condition_value);
7608       END IF;
7609     END IF;
7610   ELSIF  p_Operator_Code = '=CQ'  THEN
7611     RETURN  (p_trx_value = p_condition_value);
7612 
7613   ELSIF p_Operator_Code = '>' THEN
7614     RETURN  (p_trx_value > p_condition_value);
7615 
7616   ELSIF p_Operator_Code = '<' THEN
7617     RETURN  (p_trx_value < p_condition_value);
7618 
7619   ELSIF p_Operator_Code = '<=' THEN
7620     RETURN  (p_trx_value <= p_condition_value);
7621 
7622   ELSIF p_Operator_Code  = '>=' THEN
7623      RETURN  (p_trx_value >= p_condition_value);
7624 
7625   ELSIF (p_Operator_Code = '<>' OR
7626          p_Operator_Code = '<>CQ' )  THEN
7627          IF p_trx_value is NULL THEN
7628            RETURN TRUE;
7629          ELSE
7630            RETURN (p_trx_value <> p_condition_value);
7631          END IF;
7632   ELSIF p_Operator_Code = 'BETWEEN' THEN
7633     -- Code added for Bug#7412888
7634     IF p_det_factor_templ_code = 'ACCOUNTING_FLEXFIELD' THEN
7635       l_delimiter   := FND_FLEX_EXT.GET_DELIMITER('SQLGL','GL#',p_chart_of_accounts_id);
7636       l_nth_index   := 1;
7637       l_count       := 1;
7638       l_prev_index  := 0;
7639 
7640       LOOP
7641         l_curr_index := InStr(p_trx_value,l_delimiter,1,l_nth_index);
7642         IF  l_curr_index = 0 THEN
7643           trx_acc(l_count)  := NVL(SubStr(p_trx_value,  l_prev_index+1),'!');
7644           acc_low(l_count)  := NVL(SubStr(p_value_low,  l_prev_index+1),'!');
7645           acc_high(l_count) := NVL(SubStr(p_value_high, l_prev_index+1),'~');
7646         ELSE
7647           trx_acc(l_count)  := NVL(SubStr(p_trx_value,  l_prev_index+1, l_curr_index-l_prev_index-1),'!');
7648           acc_low(l_count)  := NVL(SubStr(p_value_low,  l_prev_index+1, l_curr_index-l_prev_index-1),'!');
7649           acc_high(l_count) := NVL(SubStr(p_value_high, l_prev_index+1, l_curr_index-l_prev_index-1),'~');
7650         END IF;
7651         l_count      := l_count + 1;
7652         l_nth_index  := l_nth_index + 1;
7653         l_prev_index := l_curr_index;
7654         EXIT WHEN (l_curr_index = 0);
7655       END LOOP;
7656 
7657       FOR i IN 1..trx_acc.LAST LOOP
7658          IF (g_level_statement >= g_current_runtime_level ) THEN
7659             FND_LOG.STRING(g_level_statement,
7660                           'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.evaluate_alphanum_condition.BEGIN',
7661                           'TRX-ACC-SEG-' ||i||' = '||trx_acc(i)||', '||
7662                           'ACC-LOW-SEG-' ||i||' = '||acc_low(i)||', '||
7663                           'ACC-HIGH-SEG-'||i||' = '||acc_high(i));
7664          END IF;
7665 
7666          IF (trx_acc(i) <= acc_high(i) AND trx_acc(i) >= acc_low(i)) THEN
7667            l_result := TRUE;
7668          ELSE
7669            l_result := FALSE;
7670            EXIT;
7671          END IF;
7672       END LOOP;
7673       RETURN l_result;
7674 
7675     ELSE
7676       RETURN (p_trx_value <= p_value_high AND
7677               p_trx_value >= p_value_low);
7678     END IF;
7679 
7680   ELSIF p_Operator_Code = 'IN' THEN
7681     IF p_trx_value is NULL THEN
7682       RETURN FALSE;
7683     ELSE
7684       l_str := ';' || p_trx_value || ';';
7685       RETURN (INSTR(p_condition_value, l_str )  > 0 );
7686     END IF;
7687   ELSE
7688     --
7689     -- invalid Operator_Code
7690     --
7691 
7692     IF (g_level_statement >= g_current_runtime_level ) THEN
7693       FND_LOG.STRING(g_level_statement,
7694                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.evaluate_alphanum_condition',
7695                      'Invalid Operator_Code for alphanumeric data type');
7696     END IF;
7697 
7698     RETURN FALSE;
7699   END IF;
7700 
7701   IF (g_level_statement >= g_current_runtime_level ) THEN
7702     FND_LOG.STRING(g_level_statement,
7703                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.evaluate_alphanum_condition.END',
7704                    'ZX_TDS_RULE_BASE_DETM_PVT: evaluate_alphanum_condition(-)');
7705   END IF;
7706 
7707 EXCEPTION
7708   WHEN OTHERS THEN
7709 
7710     IF (g_level_unexpected >= g_current_runtime_level ) THEN
7711       FND_LOG.STRING(g_level_unexpected,
7712                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.evaluate_alphanum_condition',
7713                       sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80));
7714     END IF;
7715 
7716 END evaluate_alphanum_condition;
7717 -----------------------------------------------------------------------
7718 
7719 --  PRIVATE FUNCTION
7720 --  evaluate_numeric_condition
7721 --
7722 --  DESCRIPTION
7723 --
7724 --  The procedure is to evaluate condition value of numeric data type
7725 --
7726 
7727 FUNCTION evaluate_numeric_condition(
7728            p_Operator_Code         IN    ZX_CONDITIONS.Operator_Code%TYPE,
7729            p_condition_value  IN    ZX_CONDITIONS.NUMERIC_VALUE%TYPE,
7730            p_trx_value        IN    ZX_CONDITIONS.NUMERIC_VALUE%TYPE)
7731 RETURN BOOLEAN IS
7732 BEGIN
7733   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
7734 
7735   IF (g_level_statement >= g_current_runtime_level ) THEN
7736     FND_LOG.STRING(g_level_statement,
7737                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.evaluate_numeric_condition.BEGIN',
7738                    'ZX_TDS_RULE_BASE_DETM_PVT: evaluate_numeric_condition(+)');
7739     FND_LOG.STRING(g_level_statement,
7740                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.evaluate_numeric_condition',
7741                    'p_Operator_Code: ' || p_operator_code ||
7742                    ', p_condition_value: ' || to_char(p_condition_value) ||
7743                    ', p_trx_value: ' || to_char(p_trx_value));
7744   END IF;
7745 
7746   IF p_Operator_Code = '=' THEN
7747    -- Bug#5009256- below line gives ORA-06502 : numeric or value error
7748    --    IF p_condition_value = 'NULL' THEN
7749 
7750     IF p_condition_value IS NULL THEN
7751       RETURN (p_trx_value is NULL);
7752     ELSE
7753       IF p_trx_value is NULL THEN
7754         RETURN FALSE;
7755       ELSE
7756         RETURN  (p_trx_value = p_condition_value);
7757       END IF;
7758     END IF;
7759 
7760   ELSIF  p_Operator_Code = '=CQ'  THEN
7761     RETURN  (p_trx_value = p_condition_value);
7762 
7763   ELSIF p_Operator_Code = '>' THEN
7764     RETURN  (p_trx_value > p_condition_value);
7765 
7766   ELSIF p_Operator_Code = '<' THEN
7767     RETURN  (p_trx_value < p_condition_value);
7768 
7769   ELSIF p_Operator_Code = '<=' THEN
7770     RETURN  (p_trx_value <= p_condition_value);
7771 
7772   ELSIF p_Operator_Code = '>=' THEN
7773      RETURN  (p_trx_value >= p_condition_value);
7774 
7775   ELSIF (p_Operator_Code = '<>' OR
7776          p_Operator_Code = '<>CQ' )  THEN
7777     IF p_trx_value is NULL THEN
7778       RETURN TRUE;
7779     ELSE
7780       RETURN (p_trx_value <> p_condition_value);
7781     END IF;
7782 
7783   ELSE
7784     --
7785     -- invalid Operator_Code
7786     --
7787 
7788     IF (g_level_statement >= g_current_runtime_level ) THEN
7789       FND_LOG.STRING(g_level_statement,
7790                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.evaluate_numeric_condition',
7791                      'Invalid Operator_Code for numeric data type');
7792     END IF;
7793 
7794     RETURN FALSE;
7795   END IF;
7796 
7797   IF (g_level_statement >= g_current_runtime_level ) THEN
7798     FND_LOG.STRING(g_level_statement,
7799                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.evaluate_numeric_condition.END',
7800                    'ZX_TDS_RULE_BASE_DETM_PVT: evaluate_numeric_condition(-)');
7801   END IF;
7802 
7803 EXCEPTION
7804   WHEN OTHERS THEN
7805     IF (g_level_unexpected >= g_current_runtime_level ) THEN
7806       FND_LOG.STRING(g_level_unexpected,
7807                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.evaluate_numeric_condition',
7808                       sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80));
7809     END IF;
7810 
7811 END evaluate_numeric_condition;
7812 -----------------------------------------------------------------------
7813 
7814 --  PRIVATE FUNCTION
7815 --  evaluate_date_condition
7816 --
7817 --  DESCRIPTION
7818 --
7819 --  The procedure is to evaluate condition value of date data type
7820 --
7821 
7822 FUNCTION evaluate_date_condition(
7823            p_Operator_Code         IN      ZX_CONDITIONS.Operator_Code%TYPE,
7824            p_condition_value  IN      ZX_CONDITIONS.DATE_VALUE%TYPE,
7825            p_trx_value        IN      ZX_CONDITIONS.DATE_VALUE%TYPE)
7826 RETURN BOOLEAN IS
7827   l_condition_value      ZX_CONDITIONS.DATE_VALUE%TYPE;
7828   l_trx_value            ZX_CONDITIONS.DATE_VALUE%TYPE;
7829 BEGIN
7830 
7831   g_current_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
7832 
7833   IF (g_level_statement >= g_current_runtime_level ) THEN
7834     FND_LOG.STRING(g_level_statement,
7835                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.evaluate_date_condition.BEGIN',
7836                    'ZX_TDS_RULE_BASE_DETM_PVT: evaluate_date_condition(+)');
7837     FND_LOG.STRING(g_level_statement,
7838                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.evaluate_date_condition',
7839                    'p_Operator_Code: ' || p_operator_code ||
7840                    ', p_condition_value: ' || to_char(p_condition_value, 'DD-MON-YY') ||
7841                    ', p_trx_value: ' || to_char(p_trx_value,  'DD-MON-YY'));
7842   END IF;
7843 
7844   l_trx_value       := TRUNC(p_trx_value);
7845   l_condition_value := TRUNC(p_condition_value);
7846 
7847   IF p_Operator_Code = '=' THEN
7848     -- Bug#5009256- below line gives ORA-06502 numeric or value error
7849     -- IF l_condition_value = 'NULL' THEN
7850 
7851     IF l_condition_value IS NULL THEN
7852       RETURN (l_trx_value is NULL);
7853     ELSE
7854       IF l_trx_value is NULL THEN
7855         RETURN FALSE;
7856       ELSE
7857         RETURN  (l_trx_value = l_condition_value);
7858       END IF;
7859     END IF;
7860 
7861   ELSIF  p_Operator_Code = '=CQ'  THEN
7862     RETURN  (p_trx_value = p_condition_value);
7863 
7864   ELSIF p_Operator_Code = '>' THEN
7865     RETURN  (l_trx_value > l_condition_value);
7866 
7867   ELSIF p_Operator_Code = '<' THEN
7868     RETURN  (l_trx_value < l_condition_value);
7869 
7870   ELSIF p_Operator_Code = '<=' THEN
7871     RETURN  (l_trx_value <= l_condition_value);
7872 
7873   ELSIF p_Operator_Code  = '>=' THEN
7874      RETURN  (l_trx_value >= l_condition_value);
7875 
7876   ELSIF (p_Operator_Code = '<>' OR
7877          p_Operator_Code = '<>CQ' )  THEN
7878     IF l_trx_value is NULL THEN
7879       RETURN TRUE;
7880     ELSE
7881       RETURN (l_trx_value <> l_condition_value);
7882     END IF;
7883   ELSE
7884     --
7885     -- invalid Operator_Code
7886     --
7887     IF (g_level_statement >= g_current_runtime_level ) THEN
7888       FND_LOG.STRING(g_level_statement,
7889                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.evaluate_date_condition',
7890                      'Invalid Operator_Code for date data type');
7891     END IF;
7892 
7893     RETURN FALSE;
7894   END IF;
7895 
7896 
7897   IF (g_level_statement >= g_current_runtime_level ) THEN
7898     FND_LOG.STRING(g_level_statement,
7899                    'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.evaluate_date_condition.END',
7900                    'ZX_TDS_RULE_BASE_DETM_PVT: evaluate_date_condition(-)');
7901   END IF;
7902 
7903 EXCEPTION
7904   WHEN OTHERS THEN
7905 
7906     IF (g_level_unexpected >= g_current_runtime_level ) THEN
7907       FND_LOG.STRING(g_level_unexpected,
7908                      'ZX.PLSQL.ZX_TDS_RULE_BASE_DETM_PVT.evaluate_date_condition',
7909                       sqlcode || ': ' || SUBSTR(SQLERRM, 1, 80));
7910     END IF;
7911 
7912 END evaluate_date_condition;
7913 
7914 -----------------------------------------------------------------------
7915 --  PRIVATE FUNCTION
7916 --  evaluate_if_first_party
7917 --
7918 --  DESCRIPTION
7919 --
7920 -- This function evaluates if the determining factor class qualifier (for
7921 -- registrations and party fiscal classifications) represents a first party
7922 -- or not for the input event class
7923 --
7924 
7925 FUNCTION evaluate_if_first_party(
7926          p_det_fact_cq_code   IN  ZX_CONDITIONS.DETERMINING_FACTOR_CQ_CODE%TYPE)
7927 RETURN BOOLEAN IS
7928 
7929 BEGIN
7930 
7931 IF p_det_fact_cq_code IS NULL THEN
7932 Return(FALSE);
7933 END IF;
7934 
7935 IF (SUBSTR(p_det_fact_cq_code, 1, 7) = 'BILL_TO' and
7936     zx_valid_init_params_pkg.source_rec.bill_to_party_type = 'LEGAL_ESTABLISHMENT')
7937 THEN
7938    Return(TRUE);
7939 END IF;
7940 
7941 IF (SUBSTR(p_det_fact_cq_code, 1, 9) = 'BILL_FROM' and
7942     zx_valid_init_params_pkg.source_rec.bill_from_party_type = 'LEGAL_ESTABLISHMENT')
7943 THEN
7944    Return(TRUE);
7945 END IF;
7946 
7947 IF (SUBSTR(p_det_fact_cq_code, 1, 7) = 'SHIP_TO' and
7948     zx_valid_init_params_pkg.source_rec.ship_to_party_type = 'LEGAL_ESTABLISHMENT')
7949 THEN
7950    Return(TRUE);
7951 END IF;
7952 
7953 IF (SUBSTR(p_det_fact_cq_code, 1, 9) = 'SHIP_FROM' and
7954     zx_valid_init_params_pkg.source_rec.ship_from_party_type = 'LEGAL_ESTABLISHMENT')
7955 THEN
7956    Return(TRUE);
7957 END IF;
7958 
7959 IF (SUBSTR(p_det_fact_cq_code, 1, 3) = 'POO' and
7960     zx_valid_init_params_pkg.source_rec.poo_party_type = 'LEGAL_ESTABLISHMENT')
7961 THEN
7962    Return(TRUE);
7963 END IF;
7964 
7965 IF (SUBSTR(p_det_fact_cq_code, 1, 3) = 'POA' and
7966     zx_valid_init_params_pkg.source_rec.poa_party_type = 'LEGAL_ESTABLISHMENT')
7967 THEN
7968    Return(TRUE);
7969 END IF;
7970 
7971 IF (SUBSTR(p_det_fact_cq_code, 1, 6) = 'PAYING' and
7972     zx_valid_init_params_pkg.source_rec.paying_party_type = 'LEGAL_ESTABLISHMENT')
7973 THEN
7974    Return(TRUE);
7975 END IF;
7976 
7977 IF (SUBSTR(p_det_fact_cq_code, 1, 6) = 'OWN_HQ' and
7978     zx_valid_init_params_pkg.source_rec.own_hq_party_type = 'LEGAL_ESTABLISHMENT')
7979 THEN
7980    Return(TRUE);
7981 END IF;
7982 
7983 IF (SUBSTR(p_det_fact_cq_code, 1, 7) = 'TRAD_HQ' and
7984     zx_valid_init_params_pkg.source_rec.trad_hq_party_type = 'LEGAL_ESTABLISHMENT')
7985 THEN
7986    Return(TRUE);
7987 END IF;
7988 
7989 IF (SUBSTR(p_det_fact_cq_code, 1, 3) = 'POI' and
7990     zx_valid_init_params_pkg.source_rec.poi_party_type = 'LEGAL_ESTABLISHMENT')
7991 THEN
7992    Return(TRUE);
7993 END IF;
7994 
7995 IF (SUBSTR(p_det_fact_cq_code, 1, 3) = 'POD' and
7996     zx_valid_init_params_pkg.source_rec.pod_party_type = 'LEGAL_ESTABLISHMENT')
7997 THEN
7998    Return(TRUE);
7999 END IF;
8000 
8001 IF (SUBSTR(p_det_fact_cq_code, 1, 8) = 'TTL_TRNS' and
8002     zx_valid_init_params_pkg.source_rec.ttl_trns_party_type = 'LEGAL_ESTABLISHMENT')
8003 THEN
8004    Return(TRUE);
8005 END IF;
8006 
8007 IF (SUBSTR(p_det_fact_cq_code, 1, 8) = 'MERCHANT' and
8008     zx_valid_init_params_pkg.source_rec.merchant_party_type = 'LEGAL_ESTABLISHMENT')
8009 THEN
8010    Return(TRUE);
8011 END IF;
8012 
8013 Return(FALSE);
8014 
8015 END evaluate_if_first_party;
8016 
8017 END  ZX_TDS_RULE_BASE_DETM_PVT;
8018