DBA Data[Home] [Help]

PACKAGE BODY: APPS.ZX_TCM_GET_EXCEPT_PKG

Source


1 PACKAGE BODY ZX_TCM_GET_EXCEPT_PKG AS
2 /* $Header: zxcgetexceptb.pls 120.10 2011/04/11 07:10:29 ssanka ship $ */
3 /* ======================================================================*
4  | Global Data Types                                                     |
5  * ======================================================================*/
6 
7 G_PKG_NAME              CONSTANT VARCHAR2(30) := 'ZX_TCM_GET_EXCEPT_PKG';
8 G_CURRENT_RUNTIME_LEVEL CONSTANT NUMBER       := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
9 G_LEVEL_UNEXPECTED      CONSTANT NUMBER       := FND_LOG.LEVEL_UNEXPECTED;
10 G_LEVEL_ERROR           CONSTANT NUMBER       := FND_LOG.LEVEL_ERROR;
11 G_LEVEL_EXCEPTION       CONSTANT NUMBER       := FND_LOG.LEVEL_EXCEPTION;
12 G_LEVEL_EVENT           CONSTANT NUMBER       := FND_LOG.LEVEL_EVENT;
13 G_LEVEL_PROCEDURE       CONSTANT NUMBER       := FND_LOG.LEVEL_PROCEDURE;
14 G_LEVEL_STATEMENT       CONSTANT NUMBER       := FND_LOG.LEVEL_STATEMENT;
15 G_MODULE_NAME           CONSTANT VARCHAR2(50) := 'ZX.PLSQL.ZX_TCM_GET_EXCEPT_PKG.';
16 
17 G_LINES_PER_FETCH       CONSTANT  NUMBER:= 1000;
18 G_MAX_LINES_PER_FETCH   CONSTANT  NUMBER:= 1000000;
19 
20 
21 PROCEDURE get_tax_exceptions(p_inventory_item_id IN NUMBER,
22                              p_inventory_organization_id IN NUMBER,
23                              p_product_category  IN VARCHAR2,
24                              p_fisc_classification_code IN VARCHAR2,
25 			     p_tax_regime_code   IN VARCHAR2,
26                              p_tax               IN VARCHAR2,
27                              p_tax_status_code   IN VARCHAR2,
28                              p_tax_rate_code     IN VARCHAR2,
29                              p_trx_date          IN DATE,
30                              p_tax_jurisdiction_id IN NUMBER,
31                              p_multiple_jurisdictions_flag   IN VARCHAR2,
32                              x_exception_rec     OUT NOCOPY exception_rec_type,
33                              x_return_status     OUT NOCOPY VARCHAR2) IS
34 
35   CURSOR item_exceptions(p_inventory_item_id   NUMBER,
36                          p_inventory_organization_id NUMBER,
37                          p_tax_regime_code     VARCHAR2,
38                          p_tax                 VARCHAR2,
39                          p_tax_status_code     VARCHAR2,
40                          p_tax_rate_code       VARCHAR2,
41                          p_tax_jurisdiction_id NUMBER
42                      ) IS
43     SELECT tax_exception_id, exception_type_code, rate_modifier
44     FROM zx_sco_exceptions
45     WHERE product_id = p_inventory_item_id
46     -- AND inventory_org_id = p_inventory_organization_id
47     AND classification_type_code IS NULL
48     AND classification_code IS NULL
49     AND tax_regime_code = p_tax_regime_code
50     AND NVL(tax, 'XX') IN (NVL(p_tax, 'XX'), 'XX')
51     AND NVL(tax_status_code, 'XX') IN (NVL(p_tax_status_code, 'XX'), 'XX')
52     AND NVL(tax_rate_code, 'XX') IN (NVL(p_tax_rate_code, 'XX'), 'XX')
53     AND NVL(tax_jurisdiction_id, -99) IN (NVL(p_tax_jurisdiction_id, -99), -99)
54     /* Added for bug 4619907 */
55     AND duplicate_exception = 0
56     AND effective_from <= p_trx_date
57     AND (effective_to >= p_trx_date or effective_to is null);
58 
59   CURSOR fisc_exceptions(p_tax_regime_code          VARCHAR2,
60                          p_tax                      VARCHAR2,
61                          p_tax_status_code          VARCHAR2,
62                          p_tax_rate_code            VARCHAR2,
63                          p_tax_jurisdiction_id      NUMBER,
64                          p_inventory_item_id        NUMBER,
65                          p_inventory_organization_id NUMBER
66                      ) IS
67     SELECT ex.tax_exception_id, ex.exception_type_code, ex.rate_modifier
68     FROM zx_sco_exceptions ex, mtl_categories_b_kfv mc, mtl_category_sets_b mcs,
69          fnd_id_flex_structures_vl fifs, mtl_item_categories mic,
70          zx_fc_types_b fc, zx_fc_types_reg_assoc fcreg
71     WHERE ex.product_id IS NULL
72     AND  ex.tax_regime_code = p_tax_regime_code
73     AND  (ex.tax = p_tax or ex.tax is null)
74     AND  (ex.tax_status_code = p_tax_status_code or ex.tax_status_code is null)
75     AND  (ex.tax_rate_code = p_tax_rate_code or ex.tax_rate_code is null)
76     AND  (ex.tax_jurisdiction_id = p_tax_jurisdiction_id or ex.tax_jurisdiction_id  is null)
77     AND  ex.duplicate_exception = 0
78     AND  ex.effective_from <= p_trx_date
79     AND (ex.effective_to >= p_trx_date or ex.effective_to is null)
80     AND  ex.classification_type_code = fc.classification_type_code
81     AND  ex.classification_code = REPLACE(mc.concatenated_segments, fifs.concatenated_segment_delimiter,'')
82     AND  mc.structure_id = fifs.id_flex_num
83     AND  fifs.application_id = 401
84     AND  fifs.id_flex_code = 'MCAT'
85     AND  mc.enabled_flag = 'Y'
86     AND  fifs.id_flex_num = mcs.structure_id
87     AND  mcs.category_set_id = fc.owner_id_num
88     AND  fc.classification_type_categ_code = 'PRODUCT_FISCAL_CLASS'
89     AND  fc.classification_type_code = fcreg.classification_type_code
90     AND  fcreg.tax_regime_code = p_tax_regime_code
91     AND  fcreg.use_in_item_exceptions_flag = 'Y'
92     AND  fcreg.effective_from <= p_trx_date
93     AND (fcreg.effective_to >= p_trx_date OR fcreg.effective_to IS NULL) --Bug 5383505
94     AND  mic.category_set_id = mcs.category_set_id
95     AND  mc.category_id = mic.category_id
96     AND  mic.inventory_item_id = p_inventory_item_id
97     AND  mic.organization_id = p_inventory_organization_id;
98 
99   CURSOR fisc_exceptions_no_item(p_tax_regime_code          VARCHAR2,
100                          p_tax                      VARCHAR2,
101                          p_tax_status_code          VARCHAR2,
102                          p_tax_rate_code            VARCHAR2,
103                          p_tax_jurisdiction_id      NUMBER,
104                          p_fiscal_classification    VARCHAR2
105                      ) IS
106     SELECT ex.tax_exception_id,
107            ex.exception_type_code,
108            ex.rate_modifier
109     FROM zx_sco_exceptions ex,
110          mtl_categories_b_kfv mc,
111          mtl_category_sets_b mcs,
112          fnd_id_flex_structures_vl fifs,
113          zx_fc_types_b fc,
114          zx_fc_types_reg_assoc fcreg
115     WHERE ex.product_id IS NULL
116     AND  ex.tax_regime_code = p_tax_regime_code
117     AND  (ex.tax = p_tax or ex.tax is null)
118     AND  (ex.tax_status_code = p_tax_status_code or ex.tax_status_code is null)
119     AND  (ex.tax_rate_code = p_tax_rate_code or ex.tax_rate_code is null)
120     AND  (ex.tax_jurisdiction_id = p_tax_jurisdiction_id or ex.tax_jurisdiction_id  is null)
121     AND  ex.duplicate_exception = 0
122     AND  ex.effective_from <= p_trx_date
123     AND (ex.effective_to >= p_trx_date or ex.effective_to is null)
124     AND  ex.classification_type_code = fc.classification_type_code
125     AND  ex.classification_code = REPLACE(mc.concatenated_segments, fifs.concatenated_segment_delimiter,'')
126     AND  mc.structure_id = fifs.id_flex_num
127     AND  fifs.application_id = 401
128     AND  fifs.id_flex_code = 'MCAT'
129     AND  mc.enabled_flag = 'Y'
130     AND  fifs.id_flex_num = mcs.structure_id
131     AND  mcs.category_set_id = fc.owner_id_num
132     AND  fc.classification_type_categ_code = 'PRODUCT_FISCAL_CLASS'
133     AND  fc.classification_type_code = fcreg.classification_type_code
134     AND  fcreg.tax_regime_code = p_tax_regime_code
135     AND  fcreg.use_in_item_exceptions_flag = 'Y'
136     AND  fcreg.effective_from <= p_trx_date
137     AND (fcreg.effective_to >= p_trx_date OR fcreg.effective_to IS NULL)
138     AND ex.classification_code = p_fiscal_classification;
139 
140   CURSOR fisc_exceptions_non_inv(p_product_category VARCHAR2,
141                          p_tax_regime_code          VARCHAR2,
142                          p_tax                      VARCHAR2,
143                          p_tax_status_code          VARCHAR2,
144                          p_tax_rate_code            VARCHAR2,
145                          p_tax_jurisdiction_id      NUMBER
146                      ) IS
147     SELECT tax_exception_id, exception_type_code, rate_modifier
148     FROM zx_sco_exceptions ex, zx_fc_types_b fct, zx_fc_types_reg_assoc fcreg, zx_fc_codes_b fcc
149     WHERE ex.tax_regime_code = p_tax_regime_code
153     AND  (ex.tax_jurisdiction_id = p_tax_jurisdiction_id or ex.tax_jurisdiction_id  is null)
150     AND  (ex.tax = p_tax or ex.tax is null)
151     AND  (ex.tax_status_code = p_tax_status_code or ex.tax_status_code is null)
152     AND  (ex.tax_rate_code = p_tax_rate_code or ex.tax_rate_code is null)
154     AND  ex.classification_type_code = fct.classification_type_code
155     AND  ex.classification_code = fcc.classification_code
156     AND  ex.duplicate_exception = 0
157     AND  ex.effective_from <= p_trx_date
158     AND (ex.effective_to >= p_trx_date or ex.effective_to is null)
159     AND  fct.classification_type_categ_code = 'PRODUCT_GENERIC_CLASSIFICATION'
160     AND  fct.classification_type_code = fcreg.classification_type_code
161     AND  fcreg.tax_regime_code = p_tax_regime_code
162     AND  fcreg.use_in_item_exceptions_flag = 'Y'
163     AND  fct.classification_type_code = fcc.classification_type_code
164     AND  p_trx_date BETWEEN fcreg.effective_from AND fcreg.effective_to
165     AND  fcc.classification_code = p_product_category;
166 
167   l_tax_jurisdiction_id NUMBER;
168 
169   l_status VARCHAR2(1);
170   l_db_status VARCHAR2(1);
171   l_api_name           CONSTANT VARCHAR2(30):= 'GET_TAX_EXCEPTIONS';
172   l_log_msg   FND_LOG_MESSAGES.MESSAGE_TEXT%TYPE;
173 
174   TYPE number_tbl_type IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
175   l_tax_jurisdiction_id_tbl NUMBER_TBL_TYPE;
176 
177 BEGIN
178 --  Get exception for inventory item;
179 --  If not found
180 --    find the fiscal classification type for the tax regime that is used to define exceptions;
181 --    Check if the inventory item passed belongs to the Fiscal classification type
182 --       find out the fiscal classification code(s).
183 --        check if an exception exists for that fiscal classification type and code(s)
184 --        If found pass it back to TDM
185 --      End if;
186 --    End if;
187 --  End if;
188     ----- Add logic to use zx_jurisdictions_gt table
189   IF ( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
190     FND_LOG.STRING(G_LEVEL_PROCEDURE,G_MODULE_NAME||l_api_name||'.BEGIN',G_PKG_NAME||': '||l_api_name||'()+');
191   END IF;
192   x_return_status := FND_API.G_RET_STS_SUCCESS;
193 
194   IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
195     l_log_msg := 'Parameters '||
196     ' p_inventory_item_id: '||to_char(p_inventory_item_id)||
197     ' p_inventory_organization_id: '||p_inventory_organization_id||
198     ' p_product_category: '||to_char(p_product_category)||
199     ' p_fiscal_classification: '||to_char(p_fisc_classification_code)||
200     ' p_tax_regime_code: '||to_char(p_tax_regime_code)||
201     ' p_tax            : '||to_char(p_tax)||
202     ' p_tax_status_code: '||to_char(p_tax_status_code)||
203     ' p_tax_rate_code  : '||to_char(p_tax_rate_code)||
204     ' p_tax_jurisdiction_id: '||to_char(p_tax_jurisdiction_id)||
205     ' p_multiple_jurisdictions_flag: '||to_char(p_multiple_jurisdictions_flag)||' ';
206 
207     FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_api_name, l_log_msg);
208   END IF;
209 
210   IF nvl(p_multiple_jurisdictions_flag,'N') = 'N' THEN
211     l_tax_jurisdiction_id_tbl(1) := p_tax_jurisdiction_id;
212   ELSE
213     SELECT tax_jurisdiction_id
214     BULK COLLECT INTO l_tax_jurisdiction_id_tbl
215     FROM zx_jurisdictions_gt
216     ORDER BY precedence_level;
217   END IF;
218 
219   FOR i in l_tax_jurisdiction_id_tbl.first..l_tax_jurisdiction_id_tbl.last LOOP
220     IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
221       FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME,'Jurisdiction ID: '||
222                              Nvl(l_tax_jurisdiction_id_tbl(i),-99));
223     END IF;
224     OPEN item_exceptions(p_inventory_item_id,
225                           p_inventory_organization_id,
226                           p_tax_regime_code,
227                           p_tax,
228                           p_tax_status_code,
229                           p_tax_rate_code,
230                           l_tax_jurisdiction_id_tbl(i));
231     LOOP
232       FETCH item_exceptions INTO x_exception_rec.tax_exception_id, x_exception_rec.exception_type_code,
233                                  x_exception_rec.exception_rate;
234       EXIT WHEN item_exceptions%NOTFOUND;
235       IF x_exception_rec.tax_exception_id IS NOT NULL THEN
236         EXIT;
237       END IF;
238     END LOOP;
239     CLOSE item_exceptions;
240     --
241     IF x_exception_rec.tax_exception_id IS NULL THEN
242       BEGIN
243         SELECT STATUS, DB_STATUS
244         INTO l_status, l_db_status
245         FROM fnd_product_installations
246         WHERE APPLICATION_ID = '401';
247       EXCEPTION WHEN OTHERS THEN
248         NULL;
249       END;
250 
251       IF (nvl(l_status,'N') = 'I' or  nvl(l_db_status,'N') = 'I') THEN  --Bug 5383505
252         IF p_inventory_item_id IS NOT NULL THEN
253           OPEN fisc_exceptions( p_tax_regime_code,
254                                 p_tax,
255                                 p_tax_status_code,
256                                 p_tax_rate_code,
257                                 l_tax_jurisdiction_id_tbl(i),
258                                 p_inventory_item_id,
259                                 p_inventory_organization_id);
260           LOOP
261             FETCH fisc_exceptions INTO x_exception_rec.tax_exception_id, x_exception_rec.exception_type_code,
262                                        x_exception_rec.exception_rate;
263             EXIT WHEN fisc_exceptions%NOTFOUND;
264             IF x_exception_rec.tax_exception_id IS NOT NULL THEN
265               EXIT;
266             END IF;
267           END LOOP;
268           CLOSE fisc_exceptions;
269         ELSIF p_fisc_classification_code IS NOT NULL THEN
270           OPEN fisc_exceptions_no_item( p_tax_regime_code,
271                                         p_tax,
272                                         p_tax_status_code,
273                                         p_tax_rate_code,
274                                         l_tax_jurisdiction_id_tbl(i),
275                                         p_fisc_classification_code);
276           LOOP
277             FETCH fisc_exceptions_no_item INTO x_exception_rec.tax_exception_id, x_exception_rec.exception_type_code,
278                                                x_exception_rec.exception_rate;
279             EXIT WHEN fisc_exceptions_no_item%NOTFOUND;
280             IF x_exception_rec.tax_exception_id IS NOT NULL THEN
281               EXIT;
282             END IF;
283           END LOOP;
284           CLOSE fisc_exceptions_no_item;
285         END IF; -- Inventory Item Id is not null
286       ELSE --l inventory is not installed then
287         OPEN fisc_exceptions_non_inv(p_product_category,
288                                       p_tax_regime_code,
289                                       p_tax,
290                                       p_tax_status_code,
291                                       p_tax_rate_code,
292                                       l_tax_jurisdiction_id_tbl(i));
293         LOOP
294           FETCH fisc_exceptions_non_inv INTO x_exception_rec.tax_exception_id, x_exception_rec.exception_type_code, x_exception_rec.exception_rate;
295           EXIT WHEN fisc_exceptions_non_inv%NOTFOUND;
296           IF x_exception_rec.tax_exception_id IS NOT NULL THEN
297             EXIT;
298           END IF;
299         END LOOP;
300         CLOSE fisc_exceptions_non_inv;
301 
302         IF x_exception_rec.tax_exception_id IS NULL THEN
303           IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
304             l_log_msg := 'No exception found ';
305             FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_api_name, l_log_msg);
306           END IF;
307         END IF;
308       END IF; --l inventory is not installed then
309     END IF; -- Exception ID is null
310   END LOOP; -- Looping over all the jurisdictions.
311   IF ( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
312     FND_LOG.STRING(G_LEVEL_PROCEDURE,G_MODULE_NAME||l_api_name||'.BEGIN',G_PKG_NAME||': '||l_api_name||'()-');
313   END IF;
314 END;
315 END;