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