DBA Data[Home] [Help]

PACKAGE BODY: APPS.QP_FORMULA_PRICE_CALC_PVT

Source


1 PACKAGE BODY QP_FORMULA_PRICE_CALC_PVT AS
2 /* $Header: QPXVCALB.pls 120.10.12020000.2 2012/07/04 12:14:24 smbalara ship $ */
3 
4 l_debug VARCHAR2(3);
5 -----------------------------------------------------
6 /* The following is a customizable Public Function */
7 -----------------------------------------------------
8 FUNCTION Get_Custom_Price(p_price_formula_id     IN NUMBER,
9                           p_list_price           IN NUMBER,
10 					 p_price_effective_date IN DATE,
11 					 p_req_line_attrs_tbl   IN QP_FORMULA_PRICE_CALC_PVT.REQ_LINE_ATTRS_TBL)
12 RETURN NUMBER
13 IS
14 BEGIN
15  RETURN NULL;
16 END;
17 
18 
19 -----------------------------------------------------------------
20 -- Wrapper for Get_Custom_Price called by Java Formula Engine
21 -- Since Java cannot pass in a table of records, use this wrapper
22 -- to construct table of records from the new INT tables, then
23 -- call Get_Custom_Price API
24 -----------------------------------------------------------------
25 FUNCTION Java_Custom_Price(p_price_formula_id      IN NUMBER,
26                            p_list_price            IN NUMBER,
27                            p_price_effective_date  IN DATE,
28                            p_line_index            IN NUMBER,
29                            p_request_id            IN NUMBER)
30 RETURN NUMBER
31 IS
32   CURSOR req_line_attrs_cur(a_line_index NUMBER)
33   IS
34     SELECT line_index, attribute_type, context, attribute, value_from value
35     FROM   qp_int_line_attrs_t lattr
36     WHERE  request_id = p_request_id
37     AND    line_index = p_line_index
38     AND    attribute_type IN ('PRICING','PRODUCT')
39     AND    pricing_status_code = QP_PREQ_GRP.G_STATUS_UNCHANGED;
40 
41   -- qual cursor
42   CURSOR req_line_attrs_qual_cur(a_line_index NUMBER)
43   IS
44     SELECT line_index, attribute_type, context, attribute, value_from value
45     FROM   qp_int_line_attrs_t lattr
46     WHERE  request_id = p_request_id
47     AND    line_index = p_line_index
48     AND    attribute_type IN ('PRICING','PRODUCT','QUALIFIER')
49     AND    pricing_status_code = QP_PREQ_GRP.G_STATUS_UNCHANGED;
50 
51   l_pass_qualifiers      VARCHAR2(10) := FND_PROFILE.VALUE('QP_PASS_QUALIFIERS_TO_GET_CUSTOM');
52   l_req_line_attrs_tbl   QP_FORMULA_PRICE_CALC_PVT.REQ_LINE_ATTRS_TBL;
53   i                      NUMBER := 1;
54 BEGIN
55   IF nvl(l_pass_qualifiers, 'N') = 'N' THEN
56     FOR l_line_attrs_rec IN req_line_attrs_cur(p_line_index) LOOP
57       l_req_line_attrs_tbl(i) := l_line_attrs_rec;
58       i := i+1;
59     END LOOP;
60   ELSE
61     FOR l_line_attrs_rec IN req_line_attrs_qual_cur(p_line_index) LOOP
62       l_req_line_attrs_tbl(i) := l_line_attrs_rec;
63       i := i+1;
64     END LOOP;
65   END IF;
66 
67   RETURN QP_CUSTOM.Get_Custom_Price(p_price_formula_id, p_list_price,
68                                     p_price_effective_date, l_req_line_attrs_tbl);
69 END Java_Custom_Price;
70 
71 
72 -------------------------------------------------------------------
73 /* The following is a public procedure to parse a formula for
74    arithmetic correctness even before substituting the step numbers
75    in it with the corresponding values */
76 -------------------------------------------------------------------
77 PROCEDURE Parse_Formula(p_formula IN VARCHAR2,
78 				    x_return_status OUT NOCOPY VARCHAR2)
79 IS
80  l_cursor   INTEGER;
81 
82 BEGIN
83 
84       x_return_status := FND_API.G_RET_STS_SUCCESS;
85 
86       EXECUTE IMMEDIATE 'SELECT ' || p_formula || ' FROM DUAL';
87 
88 EXCEPTION
89     WHEN FND_API.G_EXC_ERROR THEN
90 
91 	   x_return_status := FND_API.G_RET_STS_ERROR;
92 
93 	   IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_ERROR)
94 	   THEN
95                  fnd_message.set_name('QP','QP_FORMULA_NOT_FOUND');
96 --	       FND_MSG_PUB.Add;
97 	   END IF;
98 
99 --	   RAISE;
100 
101     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
102 
103 	   x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
104 
105 --	   RAISE;
106 
107     WHEN OTHERS THEN
108 
109 	   x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
110 
111         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
112 	   THEN
113 	       FND_MSG_PUB.Add_Exc_Msg
114 		  (G_PKG_NAME
115 		  , 'Parse Formula'
116 		  );
117 	   END IF;
118 
119 --	   RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
120 
121 END Parse_Formula;
122 
123 
124 -----------------------------------------------------------------------------
125 -- This function takes a formula string and substitutes the step numbers with
126 -- corresponding operand values, then evaluates the resulting expression in
127 -- the SQL engine to produce a result
128 -----------------------------------------------------------------------------
129 FUNCTION Select_From_Dual(p_formula       IN VARCHAR2,
130                           p_operand_tbl   IN QP_FORMULA_RULES_PVT.T_OPERAND_TBL_TYPE)
131 RETURN NUMBER
132 IS
133   l_char              VARCHAR2(1) := '';
134   l_number            VARCHAR2(2000) := '';
135   l_new_formula       VARCHAR2(20000) := '';
136   l_select_stmt       VARCHAR2(20000) := '';
137   l_component_value   NUMBER := NULL;
138   i                   NUMBER;
139   l_formula_value     NUMBER;
140 BEGIN
141   FOR i IN 1..LENGTH(p_formula) LOOP
142     l_char := SUBSTR(p_formula, i, 1);
143     IF (l_char = '0') OR (l_char = '1') OR (l_char = '2') OR (l_char = '3') OR
144        (l_char = '4') OR (l_char = '5') OR (l_char = '6') OR (l_char = '7') OR
145        (l_char = '8') OR (l_char = '9')
146     THEN
147       --If retrieved character is a digit
148       l_number := l_number || l_char;
149       IF i = LENGTH(p_formula) THEN
150         BEGIN
151           l_component_value := p_operand_tbl(l_number);
152         EXCEPTION
153         WHEN OTHERS THEN
154           l_component_value := null;
155         END;
156         l_new_formula := l_new_formula||'TO_NUMBER('''||TO_CHAR(l_component_value)||''')';
157         l_number := '';
158       END IF;
159     ELSE -- If character is not a number
160       IF l_number IS NOT NULL THEN
161         -- Convert number to step_number and append the component value of
162         -- that step_number to new_formula
163         BEGIN
164           l_component_value := p_operand_tbl(l_number);
165         EXCEPTION
166         WHEN OTHERS THEN
167           l_component_value := null;
168         END;
169         l_new_formula := l_new_formula||'TO_NUMBER('''||TO_CHAR(l_component_value)||''')';
170         l_number := '';
171       END IF;
172       l_new_formula := l_new_formula || l_char;
173     END IF;  -- If the character is a number or not
174   END LOOP; -- Loop through every character in the Formula String
175 
176   IF l_debug = FND_API.G_TRUE THEN
177     QP_PREQ_GRP.engine_debug('Formula is ' || l_new_formula);
178   END IF;
179 
180   l_select_stmt := 'SELECT '|| l_new_formula || ' FROM DUAL';
181   EXECUTE IMMEDIATE l_select_stmt INTO l_formula_value;
182   RETURN l_formula_value;
183 END Select_From_Dual;
184 
185 
186 -------------------------------------------------------------------
187 /* The following is a function to calculate the value of a
188    formula expression. This function combines the former 2 functions -
189    Calculate and Component_Value into one function Calculate.
190    This has been introduced as part of Performance Tuning for
191    POSCO, post-1806928 (07/23/2001 and after) */
192 -------------------------------------------------------------------
193 FUNCTION Calculate (p_price_formula_id      IN  NUMBER,
194                     p_list_price            IN  NUMBER,
195                     p_price_effective_date  IN  DATE,
196                     --p_req_line_attrs_tbl    IN  REQ_LINE_ATTRS_TBL,
197                     p_line_index            IN  NUMBER,
198                     p_list_line_type_code   IN  VARCHAR2,
199                     --Added parameters p_line_index and p_list_line_type_code
200                     --and commented out parameter p_req_line_attrs_tbl.
201                     --POSCO performance related.
202                     x_return_status         OUT NOCOPY VARCHAR2,
203                     p_modifier_value        IN  NUMBER default NULL) --mkarya for bug 1906545
204 RETURN NUMBER
205 IS
206 
207 /*
208 INDX,QP_FORMULA_PRICE_CALC_PVT.calculate.formula_lines_cur,QP_PRICE_FORMULA_LINES_U1,PRICE_FORMULA_ID,1
209 */
210 CURSOR formula_lines_cur (a_price_formula_id  NUMBER)
211 IS
212   SELECT step_number, price_formula_line_type_code, numeric_constant,
213          pricing_attribute, pricing_attribute_context,
214          price_formula_id, price_list_line_id
215   FROM   qp_price_formula_lines
216   WHERE  price_formula_id = a_price_formula_id;
217 
218 --Modified factors_cur to incorporate search_ind for pricing_attributes.
219 --POSCO performance related.
220 /*
221 INDX,QP_FORMULA_PRICE_CALC_PVT.calculate.factors_cur,QP_PRICE_FORMULA_LINES_N1,PRICE_FORMULA_LINE_TYPE_CODE,1
222 INDX,QP_FORMULA_PRICE_CALC_PVT.calculate.factors_cur,QP_PRICE_FORMULA_LINES_N1,PRICE_FORMULA_ID,2
223 INDX,QP_FORMULA_PRICE_CALC_PVT.calculate.factors_cur,QP_FACTOR_LIST_ATTRS_N1,LIST_HEADER_ID,1
224 INDX,QP_FORMULA_PRICE_CALC_PVT.calculate.factors_cur,QP_PREQ_LINE_ATTRS_FRML_TMP_N1,PRICING_STATUS_CODE,1
225 INDX,QP_FORMULA_PRICE_CALC_PVT.calculate.factors_cur,QP_PREQ_LINE_ATTRS_FRML_TMP_N1,ATTRIBUTE_TYPE,2
226 INDX,QP_FORMULA_PRICE_CALC_PVT.calculate.factors_cur,QP_PREQ_LINE_ATTRS_FRML_TMP_N1,CONTEXT,3
227 INDX,QP_FORMULA_PRICE_CALC_PVT.calculate.factors_cur,QP_PREQ_LINE_ATTRS_FRML_TMP_N1,ATTRIBUTE,4
228 INDX,QP_FORMULA_PRICE_CALC_PVT.calculate.factors_cur,QP_PREQ_LINE_ATTRS_FRML_TMP_N1,LINE_INDEX,5
229 INDX,QP_FORMULA_PRICE_CALC_PVT.calculate.factors_cur,QP_PRICING_ATTRIBUTES_N8,LIST_HEADER_ID,1
230 INDX,QP_FORMULA_PRICE_CALC_PVT.calculate.factors_cur,QP_PRICING_ATTRIBUTES_N8,PRICING_ATTRIBUTE_CONTEXT,2
231 INDX,QP_FORMULA_PRICE_CALC_PVT.calculate.factors_cur,QP_PRICING_ATTRIBUTES_N8,PRICING_ATTRIBUTE,3
232 INDX,QP_FORMULA_PRICE_CALC_PVT.calculate.factors_cur,QP_PRICING_ATTRIBUTES_N8,SEARCH_IND,4
233 INDX,QP_FORMULA_PRICE_CALC_PVT.calculate.factors_cur,QP_LIST_LINES_PK,LIST_LINE_ID,5
234 INDX,QP_FORMULA_PRICE_CALC_PVT.calculate.factors_cur,QP_PRICING_ATTRIBUTES_N8,PATTERN_VALUE_FROM_POSITIVE,6
235 INDX,QP_FORMULA_PRICE_CALC_PVT.calculate.factors_cur,QP_PRICING_ATTRIBUTES_N8,PATTERN_VALUE_TO_POSITIVE,7
236 INDX,QP_FORMULA_PRICE_CALC_PVT.calculate.factors_cur,QP_PRICING_ATTRIBUTES_N8,PATTERN_VALUE_FROM_NEGATIVE,8
237 INDX,QP_FORMULA_PRICE_CALC_PVT.calculate.factors_cur,QP_PRICING_ATTRIBUTES_N8,PATTERN_VALUE_TO_NEGATIVE,9
238 */
239 CURSOR factors_cur (a_price_formula_id     NUMBER,
240                     a_line_index           NUMBER,
241                     a_price_effective_date DATE)
242 IS
243   SELECT /*+ ORDERED index(a QP_PRICING_ATTRIBUTES_N8) index(t qp_preq_line_attrs_frml_tmp_n1) */ -- 9362867
244          a.list_header_id, l.list_line_id, l.operand,
245          l.start_date_active, l.end_date_active, l.group_count,
246          fl.price_formula_id, fl.step_number
247   FROM   qp_price_formula_lines fl, qp_factor_list_attrs fla,
248          qp_preq_line_attrs_formula_tmp t, qp_pricing_attributes a,
249          qp_list_lines l
250   WHERE  t.context = a.pricing_attribute_context
251   AND    t.attribute = a.pricing_attribute
252   AND    fl.price_formula_line_type_code = 'ML'
253   AND    t.line_index = a_line_index
254   AND    t.attribute_type in ('PRICING','PRODUCT')
255   AND    fl.price_formula_id = a_price_formula_id
256   AND    t.pricing_status_code = QP_PREQ_GRP.G_STATUS_UNCHANGED
257   AND    fla.list_header_id = fl.price_modifier_list_id
258   AND    fla.pricing_attribute_context = t.context
259   AND    fla.pricing_attribute =  t.attribute
260   AND    a.list_header_id = fla.list_header_id
261   AND    a.list_line_id = l.list_line_id
262   AND    a.search_ind = 1
263   AND    t.value_from between
264             a.pattern_value_from_positive and a.pattern_value_to_positive
265   AND    a_price_effective_date between                            --3520634 start
266          nvl(l.start_date_active,a_price_effective_date) and
267          nvl(l.end_date_active,a_price_effective_date)
268   UNION  --separate sqls for positive and negative pattern_values for 3520634
269   SELECT /*+ ORDERED index(a QP_PRICING_ATTRIBUTES_N10) index(t qp_preq_line_attrs_frml_tmp_n1) */ -- 9362867
270          a.list_header_id, l.list_line_id, l.operand,
271          l.start_date_active, l.end_date_active, l.group_count,
272          fl.price_formula_id, fl.step_number
273   FROM   qp_price_formula_lines fl, qp_factor_list_attrs fla,
274          qp_preq_line_attrs_formula_tmp t, qp_pricing_attributes a,
275          qp_list_lines l
276   WHERE  t.context = a.pricing_attribute_context
277   AND    t.attribute = a.pricing_attribute
278   AND    fl.price_formula_line_type_code = 'ML'
279   AND    t.line_index = a_line_index
280   AND    t.attribute_type in ('PRICING','PRODUCT')
281   AND    fl.price_formula_id = a_price_formula_id
282   AND    t.pricing_status_code = QP_PREQ_GRP.G_STATUS_UNCHANGED
283   AND    fla.list_header_id = fl.price_modifier_list_id
284   AND    fla.pricing_attribute_context = t.context
285   AND    fla.pricing_attribute =  t.attribute
286   AND    a.list_header_id = fla.list_header_id
287   AND    a.list_line_id = l.list_line_id
288   AND    a.search_ind = 1
289   AND    t.value_from between
290             a.pattern_value_from_negative and a.pattern_value_to_negative
291   AND    a_price_effective_date between
292          nvl(l.start_date_active,a_price_effective_date) and
293          nvl(l.end_date_active,a_price_effective_date)
294   ORDER BY 8;  --3520634 end
295 
296 --Introduced sub_factors_cur to incorporate search_ind for pricing_attributes.
297 --POSCO performance related.
298 /*
299 INDX,QP_FORMULA_PRICE_CALC_PVT.calculate.sub_factors_cur,QP_FACTOR_LIST_ATTRS_N1,LIST_HEADER_ID,1
300 INDX,QP_FORMULA_PRICE_CALC_PVT.calculate.sub_factors_cur,QP_PREQ_LINE_ATTRS_FRML_TMP_N1,PRICING_STATUS_CODE,1
301 INDX,QP_FORMULA_PRICE_CALC_PVT.calculate.sub_factors_cur,QP_PREQ_LINE_ATTRS_FRML_TMP_N1,ATTRIBUTE_TYPE,2
302 INDX,QP_FORMULA_PRICE_CALC_PVT.calculate.sub_factors_cur,QP_PREQ_LINE_ATTRS_FRML_TMP_N1,CONTEXT,3
303 INDX,QP_FORMULA_PRICE_CALC_PVT.calculate.sub_factors_cur,QP_PREQ_LINE_ATTRS_FRML_TMP_N1,ATTRIBUTE,4
304 INDX,QP_FORMULA_PRICE_CALC_PVT.calculate.sub_factors_cur,QP_PREQ_LINE_ATTRS_FRML_TMP_N1,LINE_INDEX,5
305 INDX,QP_FORMULA_PRICE_CALC_PVT.calculate.sub_factors_cur,QP_PRICING_ATTRIBUTES_N8,LIST_HEADER_ID,1
306 INDX,QP_FORMULA_PRICE_CALC_PVT.calculate.sub_factors_cur,QP_PRICING_ATTRIBUTES_N8,PRICING_ATTRIBUTE_CONTEXT,2
307 INDX,QP_FORMULA_PRICE_CALC_PVT.calculate.sub_factors_cur,QP_PRICING_ATTRIBUTES_N8,PRICING_ATTRIBUTE,3
308 INDX,QP_FORMULA_PRICE_CALC_PVT.calculate.sub_factors_cur,QP_PRICING_ATTRIBUTES_N8,SEARCH_IND,4
309 INDX,QP_FORMULA_PRICE_CALC_PVT.calculate.sub_factors_cur,QP_PRICING_ATTRIBUTES_N8,LIST_LINE_ID,5
310 INDX,QP_FORMULA_PRICE_CALC_PVT.calculate.sub_factors_cur,QP_PRICING_ATTRIBUTES_N8,PATTERN_VALUE_FROM_POSITIVE,6
311 INDX,QP_FORMULA_PRICE_CALC_PVT.calculate.sub_factors_cur,QP_PRICING_ATTRIBUTES_N8,PATTERN_VALUE_TO_POSITIVE,7
312 INDX,QP_FORMULA_PRICE_CALC_PVT.calculate.sub_factors_cur,QP_PRICING_ATTRIBUTES_N8,PATTERN_VALUE_FROM_NEGATIVE,8
313 INDX,QP_FORMULA_PRICE_CALC_PVT.calculate.sub_factors_cur,QP_PRICING_ATTRIBUTES_N8,PATTERN_VALUE_TO_NEGATIVE,9
314 */
315 CURSOR sub_factors_cur (a_price_formula_id     NUMBER,
316                         a_line_index           NUMBER,
317                         a_price_effective_date DATE,
318                         a_list_header_id       NUMBER,
319                         a_list_line_id         NUMBER,
320                         a_group_count          NUMBER)
321 IS
322   SELECT /*+  index(t QP_PREQ_LINE_ATTRS_FRML_TMP_N1) index(A QP_PRICING_ATTRIBUTES_N2) */ --Bug 7452538 Added index hints
323      a.list_line_id     --Bug 8359591 Removing ordered hint
324    -- /*+ ordered */ a.list_line_id     --5900728
325   FROM   qp_factor_list_attrs fla,
326          qp_preq_line_attrs_formula_tmp t, qp_pricing_attributes a
327   WHERE  fla.list_header_id = a_list_header_id
328   AND    fla.pricing_attribute_context = t.context
329   AND    fla.pricing_attribute = t.attribute
330   AND    t.context = a.pricing_attribute_context
331   AND    t.attribute = a.pricing_attribute
332   AND    t.line_index = a_line_index
333   AND    t.attribute_type in ('PRICING','PRODUCT')
334   AND    t.pricing_status_code = QP_PREQ_GRP.G_STATUS_UNCHANGED
335   AND    a.list_header_id = fla.list_header_id
336   AND    a.list_line_id = a_list_line_id
337   AND    a.search_ind = 2
338    AND(t.value_from BETWEEN a.pattern_value_from_positive
339    AND a.pattern_value_to_positive OR t.value_from BETWEEN a.pattern_value_from_negative
340    AND a.pattern_value_to_negative)
341   GROUP BY a.list_line_id
342   HAVING   count(*) = a_group_count;
343 
344 -- 5900728
345 --  SELECT /*+ ORDERED index(a QP_PRICING_ATTRIBUTES_N8) */
346 --         a.list_line_id
347 --  FROM   qp_factor_list_attrs fla,
348 --         qp_preq_line_attrs_formula_tmp t, qp_pricing_attributes a
349 --  WHERE  fla.list_header_id = a_list_header_id
350 --  AND    fla.pricing_attribute_context = t.context
351 --  AND    fla.pricing_attribute = t.attribute
352 --  AND    t.context = a.pricing_attribute_context
353 --  AND    t.attribute = a.pricing_attribute
354 --  AND    t.line_index = a_line_index
355 --  AND    t.attribute_type in ('PRICING','PRODUCT')
356 --  AND    t.pricing_status_code = QP_PREQ_GRP.G_STATUS_UNCHANGED
357 --  AND    a.list_header_id = fla.list_header_id
358 --  AND    a.list_line_id = a_list_line_id
359 --  AND    a.search_ind = 2
360 --  AND    t.value_from between               --3520634 start
361 --          a.pattern_value_from_positive and a.pattern_value_to_positive
362 --  GROUP BY a.list_line_id
363 --  HAVING   count(*) = a_group_count
364 --UNION   ----separate sqls for positive and negative pattern_values for 3520634
365 --  SELECT /*+ ORDERED index(a QP_PRICING_ATTRIBUTES_N10) */
366 --         a.list_line_id
367 --  FROM   qp_factor_list_attrs fla,
368 --         qp_preq_line_attrs_formula_tmp t, qp_pricing_attributes a
369 --  WHERE  fla.list_header_id = a_list_header_id
370 --  AND    fla.pricing_attribute_context = t.context
371 --  AND    fla.pricing_attribute = t.attribute
372 --  AND    t.context = a.pricing_attribute_context
373 --  AND    t.attribute = a.pricing_attribute
374 --  AND    t.line_index = a_line_index
375 --  AND    t.attribute_type in ('PRICING','PRODUCT')
376 --  AND    t.pricing_status_code = QP_PREQ_GRP.G_STATUS_UNCHANGED
377 --  AND    a.list_header_id = fla.list_header_id
378 --  AND    a.list_line_id = a_list_line_id
379 --  AND    a.search_ind = 2
380 --  AND    t.value_from between
381 --          a.pattern_value_from_negative and a.pattern_value_to_negative
382 --  GROUP BY a.list_line_id
383 --  HAVING   count(*) = a_group_count;  --3520634 end
384 /*
385 INDX,QP_FORMULA_PRICE_CALC_PVT.calculate.price_formulas_cur,QP_PRICE_FORMULAS_B_PK,PRICE_FORMULA_ID,1
386 */
387 CURSOR price_formulas_cur (a_price_formula_id     NUMBER,
388 			   a_price_effective_date DATE)
389 IS
390   SELECT formula
391   FROM   qp_price_formulas_b
392   WHERE  price_formula_id = a_price_formula_id
393   AND    (start_date_active IS NULL OR
394 		start_date_active <= a_price_effective_date)
395   AND    (end_date_active IS NULL   OR
396 		end_date_active >= a_price_effective_date);
397 
398 --Introduced pra_cur to process formula_line_type of PRA using temp tables
399 --instead of earlier plsql tables. POSCO performance related.
400 /*
401 INDX,QP_FORMULA_PRICE_CALC_PVT.calculate.pra_cur,QP_PREQ_LINE_ATTRS_FRML_TMP_N1,PRICING_STATUS_CODE,1
402 INDX,QP_FORMULA_PRICE_CALC_PVT.calculate.pra_cur,QP_PREQ_LINE_ATTRS_FRML_TMP_N1,ATTRIBUTE_TYPE,2
403 INDX,QP_FORMULA_PRICE_CALC_PVT.calculate.pra_cur,QP_PREQ_LINE_ATTRS_FRML_TMP_N1,CONTEXT,3
404 INDX,QP_FORMULA_PRICE_CALC_PVT.calculate.pra_cur,QP_PREQ_LINE_ATTRS_FRML_TMP_N1,ATTRIBUTE,4
405 INDX,QP_FORMULA_PRICE_CALC_PVT.calculate.pra_cur,QP_PREQ_LINE_ATTRS_FRML_TMP_N1,LINE_INDEX,5
406 */
407 CURSOR pra_cur(a_pricing_attribute_context VARCHAR2,
408                a_pricing_attribute         VARCHAR2,
409                a_line_index                NUMBER)
410 IS
411   SELECT value_from
412   FROM   qp_preq_line_attrs_formula_tmp
413   WHERE  context = a_pricing_attribute_context
414   AND    attribute = a_pricing_attribute
415   AND    line_index = a_line_index
416   AND    attribute_type in ('PRICING','PRODUCT')
417   AND    pricing_status_code = QP_PREQ_GRP.G_STATUS_UNCHANGED;
418 
419 l_pra_rec            pra_cur%ROWTYPE;
420 l_attr_count         NUMBER := 0;
421 l_attr_flag          BOOLEAN := FALSE;
422 l_count              NUMBER := 0;
423 l_customized         VARCHAR2(1);
424 
425 l_attribute_id       NUMBER := NULL;
426 l_start_date_active  date   := NULL;
427 l_end_date_active    date   := NULL;
428 
429 l_formula       	VARCHAR2(2000) := '';
430 /* increased the length of l_formula,l_number and l_new_formula to 2000
431    to fix the bug 1539041 */
432 l_formula_value     NUMBER;
433 l_no_of_comps       NUMBER := 0;
434 i                   NUMBER;
435 j                   NUMBER := 1;
436 
437 --Added as part of POSCO changes
438 TYPE Formula_Line_Rec IS RECORD
439      (step_number                    NUMBER,
440       price_formula_line_type_code   VARCHAR2(10),
441       component_value                NUMBER,
442       price_formula_id               NUMBER,
443       line_index                     NUMBER,
444       list_line_type_code            VARCHAR2(30),--of the parent line
445       list_header_id                 NUMBER, --populated for factor list steps
446       list_line_id                   NUMBER  --populated with factor line id
447       );
448 
449 --Added as part of POSCO changes
450 TYPE Formula_Line_Tbl_Type IS TABLE OF Formula_Line_Rec INDEX BY BINARY_INTEGER;
451 
452 --Added as part of POSCO changes
453 l_formula_line_tbl  Formula_Line_Tbl_Type;
454 
455 l_req_line_attrs_tbl   QP_FORMULA_PRICE_CALC_PVT.REQ_LINE_ATTRS_TBL;
456 
457 l_sub_factors_rec      sub_factors_cur%ROWTYPE;
458 l_old_step_number      NUMBER := -99999999999999;
459 l_skip_factor          BOOLEAN := FALSE;
460 l_return_status        VARCHAR2(1);
461 
462 --Bug 2772214
463 l_pass_qualifiers varchar2(10) := FND_PROFILE.VALUE('QP_PASS_QUALIFIERS_TO_GET_CUSTOM');
464 
465 /*
466 INDX,QP_FORMULA_PRICE_CALC_PVT.calculate.req_line_attrs_cur,qp_npreq_line_attrs_tmp_N7,LINE_INDEX,1
467 INDX,QP_FORMULA_PRICE_CALC_PVT.calculate.req_line_attrs_cur,qp_npreq_line_attrs_tmp_N7,ATTRIBUTE_TYPE,2
468 */
469 CURSOR req_line_attrs_cur(a_line_index NUMBER)
470 IS
471   SELECT line_index, attribute_type, context, attribute, value_from value
472   --FROM   qp_npreq_line_attrs_tmp
473   -- bug2425851
474   FROM   qp_preq_line_attrs_formula_tmp
475   WHERE  line_index = a_line_index
476   AND    attribute_type IN ('PRICING','PRODUCT');
477 
478 -- Bug 2772214, Added qual cursor
479 CURSOR req_line_attrs_qual_cur(a_line_index NUMBER)
480 IS
481   SELECT line_index, attribute_type, context, attribute, value_from value
482  FROM   qp_preq_line_attrs_formula_tmp
483   WHERE  line_index = a_line_index
484   AND    attribute_type IN ('PRICING','PRODUCT','QUALIFIER');
485 
486 
487 l_null_step_number_tbl  Step_Number_Tbl_Type;
488 
489  E_FORMULA_NOT_FOUND EXCEPTION;
490  E_INVALID_FORMULA EXCEPTION;
491  E_FORMULA_COMPONENTS_REQ EXCEPTION;
492  E_CUSTOMIZE_GET_CUSTOM_PRICE EXCEPTION;
493  E_INVALID_NUMBER EXCEPTION;
494 
495 l_Operand_Tbl          QP_FORMULA_RULES_PVT.t_Operand_Tbl_Type;
496 
497 l_formula_start_time NUMBER;
498 l_formula_end_time   NUMBER;
499 l_time_difference    NUMBER;
500 l_formula_name       qp_price_formulas_tl.name%TYPE;
501 L_MAINT_DYN_SRC_VER VARCHAR2(1) := NVL(Fnd_Profile.value('QP_MAINTAIN_DYNAMIC_SOURCE_VERSIONS'),'N'); -- 13638721
502 l_pkg_ver VARCHAR2(10);
503 BEGIN
504 
505   l_debug := QP_PREQ_GRP.G_DEBUG_ENGINE;
506   l_formula_start_time := dbms_utility.get_time;
507 
508   x_return_status := FND_API.G_RET_STS_SUCCESS;
509 
510   IF l_debug = FND_API.G_TRUE THEN
511   QP_PREQ_GRP.engine_debug('Start Formula...');
512   END IF;
513 
514   --added for formula messages
515    SELECT name
516      INTO l_formula_name
517      FROM qp_price_formulas_tl
518     WHERE price_formula_id = p_price_formula_id
519     AND   language = userenv('LANG')	   --bug#13250347
520      AND rownum<2;
521 
522   OPEN price_formulas_cur (p_price_formula_id, p_price_effective_date);
523 
524   FETCH price_formulas_cur INTO l_formula;
525 
526   IF price_formulas_cur%NOTFOUND THEN
527 
528            x_return_status := FND_API.G_RET_STS_ERROR;
529 
530            IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_ERROR)
531            THEN
532                RAISE E_FORMULA_NOT_FOUND;
533 --             FND_MSG_PUB.Add;
534            END IF;
535 
536   END IF;
537 
538   CLOSE price_formulas_cur;
539 
540   Parse_Formula (l_formula, l_return_status);
541 
542   IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
543     x_return_status := l_return_status;
544     RAISE E_INVALID_FORMULA;
545   END IF;
546 
547   --Get the no_of_components in the formula
548 /*
549 INDX,QP_FORMULA_PRICE_CALC_PVT.calculate.sel1,QP_PRICE_FORMULA_LINES_U1,PRICE_FORMULA_ID,1
550 */
551   SELECT count(*)
552   INTO   l_no_of_comps
553   FROM   qp_price_formula_lines
554   WHERE  price_formula_id = p_price_formula_id;
555 
556   IF l_no_of_comps = 0 THEN
557 
558          x_return_status := FND_API.G_RET_STS_ERROR;
559 
560          IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_ERROR)
561          THEN
562              RAISE E_FORMULA_COMPONENTS_REQ;
563 --           FND_MSG_PUB.Add;
564          END IF;
565 
566   END IF;
567   --smbalara 11898355 initializing all step values to NULL
568   FOR l_rec IN formula_lines_cur(p_price_formula_id)
569   LOOP
570 	l_Operand_Tbl(l_rec.step_number) :=null;
571   END loop;
572 
573 --process all factors before for bug 10273166 smbalara START
574     -- Now Process all Factor Lists in the formula
575 
576   IF l_debug = FND_API.G_TRUE THEN
577   QP_PREQ_GRP.engine_debug('Before populating plsql table of formula lines');
578 
579   END IF;
580   --Populate l_formula_line_tbl for all factor lists in the formula
581   FOR l_factors_rec IN factors_cur (p_price_formula_id, p_line_index,
582                                     p_price_effective_date)
583   LOOP
584     --l_Operand_Tbl(l_factors_rec.step_number):= null;--10273166,commented for 11898355
585 
586     IF l_debug = FND_API.G_TRUE THEN
587     QP_PREQ_GRP.engine_debug('enter factors_cur loop -step number -'||l_factors_rec.step_number);
588 
589     END IF;
590     IF l_skip_factor AND
591        l_factors_rec.step_number = l_old_step_number
592     THEN
593       l_old_step_number := l_factors_rec.step_number;
594       GOTO factors_loop;
595     END IF;
596 
597     IF l_debug = FND_API.G_TRUE THEN
598 	QP_PREQ_GRP.engine_debug('after skip check ');
599 	QP_PREQ_GRP.engine_debug('l_factors_rec.step_number:'||l_factors_rec.step_number);--11898355
600 	QP_PREQ_GRP.engine_debug('l_old_step_number:'|| l_old_step_number);--11898355
601 	QP_PREQ_GRP.engine_debug('l_factors_rec.group_count :'|| l_factors_rec.group_count );--11898355
602     END IF;
603     l_skip_factor := FALSE;
604 
605     --If no attributes with search_ind = 2 then no need to open sub_factors_cur
606     IF l_factors_rec.group_count = 0 THEN
607 
608       l_formula_line_tbl(l_factors_rec.step_number).component_value :=
609                                      l_factors_rec.operand;
610 
611       l_Operand_Tbl(l_factors_rec.step_number) := l_formula_line_tbl(l_factors_rec.step_number).component_value;
612 
613       l_formula_line_tbl(l_factors_rec.step_number).step_number :=
614                                      l_factors_rec.step_number;
615       l_formula_line_tbl(l_factors_rec.step_number).price_formula_line_type_code
616                                   := 'ML';
617       l_formula_line_tbl(l_factors_rec.step_number).price_formula_id :=
618                                      l_factors_rec.price_formula_id;
619       l_formula_line_tbl(l_factors_rec.step_number).line_index :=
620                                      p_line_index;
621       l_formula_line_tbl(l_factors_rec.step_number).list_header_id :=
622                                      l_factors_rec.list_header_id;
623       l_formula_line_tbl(l_factors_rec.step_number).list_line_id :=
624                                      l_factors_rec.list_line_id;
625       l_formula_line_tbl(l_factors_rec.step_number).list_line_type_code :=
626                                      p_list_line_type_code;
627 
628       IF l_debug = FND_API.G_TRUE THEN
629       QP_PREQ_GRP.engine_debug('In factors_cur, step = ' ||l_factors_rec.step_number);
630       QP_PREQ_GRP.engine_debug('Factor evaluated to = '||l_formula_line_tbl(l_factors_rec.step_number).component_value); --10273166
631       END IF;
632       l_skip_factor := TRUE;
633 
634       --added for formula messages
635       l_null_step_number_tbl.DELETE(l_factors_rec.step_number);
636 
637     ELSE --If l_factors_rec.group_count > 0
638      IF l_debug = FND_API.G_TRUE THEN
639 	QP_PREQ_GRP.engine_debug('sub factors check1 ');--11898355
640      END IF;
641       --sub_factors_cur has to be fetched to determine if all attributes match
642       OPEN sub_factors_cur(p_price_formula_id,
643                            p_line_index,
644                            p_price_effective_date,
645                            l_factors_rec.list_header_id,
646                            l_factors_rec.list_line_id,
647                            l_factors_rec.group_count);
648       FETCH sub_factors_cur
649       INTO  l_sub_factors_rec;
650 
651       IF sub_factors_cur%FOUND THEN
652 	IF l_debug = FND_API.G_TRUE THEN
653 		QP_PREQ_GRP.engine_debug('sub factors check2 ');--11898355
654 	END IF;
655         l_formula_line_tbl(l_factors_rec.step_number).component_value :=
656                                      l_factors_rec.operand;
657 
658         l_Operand_Tbl(l_factors_rec.step_number) := l_formula_line_tbl(l_factors_rec.step_number).component_value;
659 
660         l_formula_line_tbl(l_factors_rec.step_number).step_number :=
661                                      l_factors_rec.step_number;
662         l_formula_line_tbl(l_factors_rec.step_number).price_formula_line_type_code
663                                   := 'ML';
664         l_formula_line_tbl(l_factors_rec.step_number).price_formula_id :=
665                                      l_factors_rec.price_formula_id;
666         l_formula_line_tbl(l_factors_rec.step_number).line_index :=
667                                      p_line_index;
668         l_formula_line_tbl(l_factors_rec.step_number).list_header_id :=
669                                      l_factors_rec.list_header_id;
670         l_formula_line_tbl(l_factors_rec.step_number).list_line_id :=
671                                      l_factors_rec.list_line_id;
672         l_formula_line_tbl(l_factors_rec.step_number).list_line_type_code :=
673                                      p_list_line_type_code;
674 
675         IF l_debug = FND_API.G_TRUE THEN
676         QP_PREQ_GRP.engine_debug('In sub_factors_cur, step = ' ||l_factors_rec.step_number);
677 	 QP_PREQ_GRP.engine_debug('Sub Factor evaluated to = '||l_formula_line_tbl(l_factors_rec.step_number).component_value); --10273166
678         END IF;
679         l_skip_factor := TRUE;
680 
681         l_null_step_number_tbl.DELETE(l_factors_rec.step_number);
682       END IF;--sub_factors_cur%FOUND
683 
684       CLOSE sub_factors_cur;
685       IF l_debug = FND_API.G_TRUE THEN
686 	QP_PREQ_GRP.engine_debug('sub factors check3 ');--11898355
687       END IF;
688     END IF; --If l_factors_rec.group_count = 0
689 
690     l_old_step_number := l_factors_rec.step_number;
691     IF l_debug = FND_API.G_TRUE THEN
692 	QP_PREQ_GRP.engine_debug('factors check end');--11898355
693     END IF;
694 
695     <<factors_loop>>
696     null;
697 
698     IF l_debug = FND_API.G_TRUE THEN
699     QP_PREQ_GRP.engine_debug('exit factors_cur loop');
700 
701     END IF;
702   END LOOP; --Loop over factors_cur
703 
704   IF l_debug = FND_API.G_TRUE THEN
705   QP_PREQ_GRP.engine_debug('After populating plsql table of formula lines');
706 
707   END IF;
708 --process all factors before for bug 10273166 smbalara END
709 
710 --Change flexible mask to mask below for formula pattern use (Bug2195879)
711 qp_number.canonical_mask :=
712               '00999999999999999999999.99999999999999999999999999999999999999';
713   --Begin more POSCO changes.
714   FOR l_rec IN formula_lines_cur(p_price_formula_id)
715   LOOP
716 
717     IF l_rec.price_formula_line_type_code = 'NUM' THEN
718 
719       IF l_debug = FND_API.G_TRUE THEN
720       QP_PREQ_GRP.engine_debug('Formula Line Type = NUM, Step = '|| l_rec.step_number
721                         || ', Value = ' || l_rec.numeric_constant);
722       END IF;
723       l_formula_line_tbl(l_rec.step_number).component_value :=
724                                    l_rec.numeric_constant;
725 
726       l_Operand_Tbl(l_rec.step_number) := l_formula_line_tbl(l_rec.step_number).component_value;
727 
728       l_formula_line_tbl(l_rec.step_number).step_number := l_rec.step_number;
729       l_formula_line_tbl(l_rec.step_number).price_formula_line_type_code :=
730                                    l_rec.price_formula_line_type_code;
731       l_formula_line_tbl(l_rec.step_number).price_formula_id :=
732                                    l_rec.price_formula_id;
733       l_formula_line_tbl(l_rec.step_number).line_index := p_line_index;
734       l_formula_line_tbl(l_rec.step_number).list_header_id := null;
735       l_formula_line_tbl(l_rec.step_number).list_line_id := null;
736       l_formula_line_tbl(l_rec.step_number).list_line_type_code :=
737                                    p_list_line_type_code;
738 
739     ELSIF l_rec.price_formula_line_type_code = 'LP' THEN
740 
741       IF l_debug = FND_API.G_TRUE THEN
742       QP_PREQ_GRP.engine_debug('Formula Line Type = LP, Step = ' || l_rec.step_number
743                         || ', Value = '|| p_list_price);
744       END IF;
745       l_formula_line_tbl(l_rec.step_number).component_value := p_list_price;
746 
747       l_Operand_Tbl(l_rec.step_number) := l_formula_line_tbl(l_rec.step_number).component_value;
748 
749       l_formula_line_tbl(l_rec.step_number).step_number := l_rec.step_number;
750       l_formula_line_tbl(l_rec.step_number).price_formula_line_type_code :=
751                                    l_rec.price_formula_line_type_code;
752       l_formula_line_tbl(l_rec.step_number).price_formula_id :=
753                                    l_rec.price_formula_id;
754       l_formula_line_tbl(l_rec.step_number).line_index := p_line_index;
755       l_formula_line_tbl(l_rec.step_number).list_header_id := null;
756       l_formula_line_tbl(l_rec.step_number).list_line_id := null;
757       l_formula_line_tbl(l_rec.step_number).list_line_type_code :=
758                                    p_list_line_type_code;
759       --added for formula messages
760       IF p_list_price IS NULL THEN
761          l_null_step_number_tbl(l_rec.step_number):= l_rec.step_number;
762       END IF;
763 
764     ELSIF l_rec.price_formula_line_type_code = 'MV' THEN
765 
766       IF l_debug = FND_API.G_TRUE THEN
767       QP_PREQ_GRP.engine_debug('Formula Line Type = MV, Step = ' || l_rec.step_number || ', Value = '|| p_modifier_value);
768 
769       END IF;
770       l_formula_line_tbl(l_rec.step_number).component_value := p_modifier_value;
771 
772       l_Operand_Tbl(l_rec.step_number) := l_formula_line_tbl(l_rec.step_number).component_value;
773 
774       l_formula_line_tbl(l_rec.step_number).step_number := l_rec.step_number;
775       l_formula_line_tbl(l_rec.step_number).price_formula_line_type_code :=
776                                    l_rec.price_formula_line_type_code;
777       l_formula_line_tbl(l_rec.step_number).price_formula_id :=
778                                    l_rec.price_formula_id;
779       l_formula_line_tbl(l_rec.step_number).line_index := p_line_index;
780       l_formula_line_tbl(l_rec.step_number).list_header_id := null;
781       l_formula_line_tbl(l_rec.step_number).list_line_id := null;
782       l_formula_line_tbl(l_rec.step_number).list_line_type_code :=
783                                    p_list_line_type_code;
784       --added for formula messages
785       IF p_modifier_value IS NULL
786       THEN
787           l_null_step_number_tbl(l_rec.step_number) := l_rec.step_number;
788       END IF;
789 
790     ELSIF l_rec.price_formula_line_type_code = 'FUNC' THEN
791 
792       IF l_debug = FND_API.G_TRUE THEN
793       QP_PREQ_GRP.engine_debug('Formula Line Type = FUNC, Step = ' ||l_rec.step_number);
794       END IF;
795       l_customized := FND_PROFILE.VALUE('QP_GET_CUSTOM_PRICE_CUSTOMIZED');
796       IF l_customized = 'Y' THEN
797         IF l_debug = FND_API.G_TRUE THEN
798         QP_PREQ_GRP.engine_debug('l_customized is Y');
799 
800         END IF;
801         --Populate l_req_line_attrs_tbl
802         -- Bug 2772214, Added If condition
803        If nvl(l_pass_qualifiers, 'N') = 'N' Then
804         FOR l_line_attrs_rec IN req_line_attrs_cur(p_line_index)
805         LOOP
806           l_req_line_attrs_tbl(j) := l_line_attrs_rec;
807           j := j + 1;
808         END LOOP;
809        Else
810         FOR l_line_attrs_rec IN req_line_attrs_qual_cur(p_line_index)
811          LOOP
812           l_req_line_attrs_tbl(j) := l_line_attrs_rec;
813           j := j + 1;
814         END LOOP;
815        End If;
816 
817         --added for formula enhancement by dhgupta 3531890
818         l_req_line_attrs_tbl(j).line_index:=p_line_index;
819         l_req_line_attrs_tbl(j).attribute_type:=QP_GLOBALS.G_SPECIAL_ATTRIBUTE_TYPE;
820         l_req_line_attrs_tbl(j).context:=QP_GLOBALS.G_SPECIAL_CONTEXT;
821         l_req_line_attrs_tbl(j).attribute:=QP_GLOBALS.G_SPECIAL_ATTRIBUTE1;
822         l_req_line_attrs_tbl(j).value:=l_rec.step_number;
823         -- end 3531890
824 
825         BEGIN
826 	qp_debug_util.tstart('GET_CUSTOM_PRICE','Calculating the custom price in Formulas');
827         l_formula_line_tbl(l_rec.step_number).component_value :=
828                              QP_Custom.Get_Custom_Price(p_price_formula_id,
829                                                         p_list_price,
830                                                         p_price_effective_date,
831                                                         l_req_line_attrs_tbl);
832 	qp_debug_util.tstop('GET_CUSTOM_PRICE');
833         l_Operand_Tbl(l_rec.step_number) := l_formula_line_tbl(l_rec.step_number).component_value;
834 
835         l_formula_line_tbl(l_rec.step_number).step_number := l_rec.step_number;
836         l_formula_line_tbl(l_rec.step_number).price_formula_line_type_code :=
837                                        l_rec.price_formula_line_type_code;
838         l_formula_line_tbl(l_rec.step_number).price_formula_id :=
839                                        l_rec.price_formula_id;
840         l_formula_line_tbl(l_rec.step_number).line_index := p_line_index;
841         l_formula_line_tbl(l_rec.step_number).list_header_id := null;
842         l_formula_line_tbl(l_rec.step_number).list_line_id := null;
843         l_formula_line_tbl(l_rec.step_number).list_line_type_code :=
844                                        p_list_line_type_code;
845 
846         IF l_formula_line_tbl(l_rec.step_number).component_value  IS NULL
847         THEN
848             l_null_step_number_tbl(l_rec.step_number) := l_rec.step_number;
849         END IF;
850         EXCEPTION
851          WHEN OTHERS THEN
852             l_null_step_number_tbl(l_rec.step_number) := l_rec.step_number;
853         END;
854 
855       ELSE --If customized = 'N'
856         x_return_status := FND_API.G_RET_STS_ERROR;
857         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_ERROR)
858         THEN
859           RAISE E_CUSTOMIZE_GET_CUSTOM_PRICE;
860         END IF;
861       END IF;
862 
863     ELSIF l_rec.price_formula_line_type_code = 'PRA' THEN
864 
865       IF l_debug = FND_API.G_TRUE THEN
866       QP_PREQ_GRP.engine_debug('Formula Line Type = PRA, Step = ' ||l_rec.step_number);
867 
868       END IF;
869       OPEN  pra_cur(l_rec.pricing_attribute_context, l_rec.pricing_attribute,
870                     p_line_index);
871       FETCH pra_cur INTO l_pra_rec;
872 
873       IF pra_cur%FOUND THEN
874         --Return the matching pricing attribute value that is found.
875         BEGIN
876 -- bug 2195879
877 IF l_debug = FND_API.G_TRUE THEN
878 QP_PREQ_GRP.engine_debug('l_pra_rec.value_from = '||l_pra_rec.value_from);
879 END IF;
880           l_formula_line_tbl(l_rec.step_number).component_value :=
881                 qp_number.canonical_to_number(l_pra_rec.value_from);
882 
883           l_Operand_Tbl(l_rec.step_number) := l_formula_line_tbl(l_rec.step_number).component_value;
884 
885 IF l_debug = FND_API.G_TRUE THEN
886 QP_PREQ_GRP.engine_debug('Just after pra cur value from to number conversion');
887 END IF;
888         EXCEPTION
889           WHEN OTHERS THEN
890             x_return_status := FND_API.G_RET_STS_ERROR;
891             IF l_debug = FND_API.G_TRUE THEN
892             QP_PREQ_GRP.engine_debug('Error converting PRA value to number');
893             END IF;
894             IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_ERROR)
895             THEN
896               RAISE E_INVALID_NUMBER;
897             END IF;
898         END; -- for Begin block
899 
900       ELSE  --If pra_cur%NOTFOUND
901         l_formula_line_tbl(l_rec.step_number).component_value := NULL;
902 
903         l_Operand_Tbl(l_rec.step_number) := l_formula_line_tbl(l_rec.step_number).component_value;
904         l_null_step_number_tbl(l_rec.step_number) := l_rec.step_number;
905 
906       END IF; --If pra_cur%FOUND
907 
908       CLOSE pra_cur;
909 
910       l_formula_line_tbl(l_rec.step_number).step_number := l_rec.step_number;
911       l_formula_line_tbl(l_rec.step_number).price_formula_line_type_code :=
912                                        l_rec.price_formula_line_type_code;
913       l_formula_line_tbl(l_rec.step_number).price_formula_id :=
914                                        l_rec.price_formula_id;
915       l_formula_line_tbl(l_rec.step_number).line_index := p_line_index;
916       l_formula_line_tbl(l_rec.step_number).list_header_id := null;
917       l_formula_line_tbl(l_rec.step_number).list_line_id := null;
918       l_formula_line_tbl(l_rec.step_number).list_line_type_code :=
919                                        p_list_line_type_code;
920 
921     ELSIF l_rec.price_formula_line_type_code = 'PLL' THEN
922 
923       IF l_debug = FND_API.G_TRUE THEN
924       QP_PREQ_GRP.engine_debug('Formula Line Type = PLL, Step = ' ||l_rec.step_number);
925       END IF;
926 /*
927 INDX,QP_FORMULA_PRICE_CALC_PVT.calculate.sel2,QP_LIST_LINES_PK,LIST_LINE_ID,1
928 */
929       BEGIN
930         SELECT operand
931         INTO   l_formula_line_tbl(l_rec.step_number).component_value
932         FROM   qp_list_lines
933         WHERE  list_line_id = l_rec.price_list_line_id;
934 
935         l_Operand_Tbl(l_rec.step_number) := l_formula_line_tbl(l_rec.step_number).component_value;
936 
937       EXCEPTION
938         WHEN OTHERS THEN
939           l_formula_line_tbl(l_rec.step_number).component_value :=  NULL;
940 
941           l_Operand_Tbl(l_rec.step_number) := l_formula_line_tbl(l_rec.step_number).component_value;
942           l_null_step_number_tbl(l_rec.step_number) := l_rec.step_number;
943       END;
944 
945       l_formula_line_tbl(l_rec.step_number).step_number := l_rec.step_number;
946       l_formula_line_tbl(l_rec.step_number).price_formula_line_type_code :=
947                                        l_rec.price_formula_line_type_code;
948       l_formula_line_tbl(l_rec.step_number).price_formula_id :=
949                                        l_rec.price_formula_id;
950       l_formula_line_tbl(l_rec.step_number).line_index := p_line_index;
951       l_formula_line_tbl(l_rec.step_number).list_header_id := null;
952       l_formula_line_tbl(l_rec.step_number).list_line_id := null;
953       l_formula_line_tbl(l_rec.step_number).list_line_type_code :=
954                                        p_list_line_type_code;
955 
956     ELSIF l_rec.price_formula_line_type_code = 'ML' THEN
957 
958       IF l_debug = FND_API.G_TRUE THEN
959       QP_PREQ_GRP.engine_debug('Formula Line Type = ML, Step = ' ||l_rec.step_number);
960       END IF;
961       --null; --Do nothing here. All factor lists will be processed together later
962       --l_Operand_Tbl(l_rec.step_number) :=null;----6726052,7249280 smbalara 10273166-commenting as factor list is processed above
963       --added for formula messages
964       l_null_step_number_tbl(l_rec.step_number) := l_rec.step_number;
965       --smbalara 11898355 start
966       l_formula_line_tbl(l_rec.step_number).step_number := l_rec.step_number;
967       l_formula_line_tbl(l_rec.step_number).price_formula_line_type_code :=
968                                        l_rec.price_formula_line_type_code;
969       l_formula_line_tbl(l_rec.step_number).price_formula_id :=
970                                        l_rec.price_formula_id;
971       l_formula_line_tbl(l_rec.step_number).line_index := p_line_index;
972       l_formula_line_tbl(l_rec.step_number).list_header_id := null;
973       l_formula_line_tbl(l_rec.step_number).list_line_id := null;
974       l_formula_line_tbl(l_rec.step_number).list_line_type_code := p_list_line_type_code;
975       --smbalara 11898355 end
976     ELSE --if price_formula_line_type_code is not one of the expected values.
977 
978       x_return_status := FND_API.G_RET_STS_ERROR;
979       IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_ERROR)
980       THEN
981         FND_MESSAGE.SET_NAME('QP','QP_INVALID_FORMULA_LINE_TYPE');
982       END IF;
983 
984     END IF; -- IF stmt comparing price_formula_line_type_code to various values.
985         l_req_line_attrs_tbl.delete; --3531890 attribute were getting accumulated for every step
986 -- smbalara bug 7188211
987 --Based on a profile option,formula step values will be inserted into qp_nformula_step_values_tmp
988 IF QP_PREQ_GRP.G_INSERT_FORMULA_STEP_VALUES = 'Y' THEN
989 	IF l_debug = FND_API.G_TRUE THEN
990 	QP_PREQ_GRP.engine_debug('Before populating formula stepvalues temp table');
991 	QP_PREQ_GRP.engine_debug('Value price_formula_id	='||l_formula_line_tbl(l_rec.step_number).price_formula_id );
992 	QP_PREQ_GRP.engine_debug('Value step_number		='||l_formula_line_tbl(l_rec.step_number).step_number );
993 	QP_PREQ_GRP.engine_debug('Value component_value	='||l_formula_line_tbl(l_rec.step_number).component_value );
994 	QP_PREQ_GRP.engine_debug('Value price_formula_line_type_code='||l_formula_line_tbl(l_rec.step_number).price_formula_line_type_code );
995 	QP_PREQ_GRP.engine_debug('Value line_index		='||l_formula_line_tbl(l_rec.step_number).line_index );
996 	QP_PREQ_GRP.engine_debug('Value list_line_type_code	='||l_formula_line_tbl(l_rec.step_number).list_line_type_code );
997 	QP_PREQ_GRP.engine_debug('Value list_header_id	='||l_formula_line_tbl(l_rec.step_number).list_header_id );
998 	QP_PREQ_GRP.engine_debug('Value list_line_id	='||l_formula_line_tbl(l_rec.step_number).list_line_id );
999 	END IF;
1000 
1001           INSERT INTO qp_nformula_step_values_tmp
1002           (price_formula_id,
1003            step_number,
1004            component_value,
1005            price_formula_line_type_code,
1006            line_index,
1007            list_line_type_code,
1008            list_header_id,
1009            list_line_id
1010           )
1011           VALUES
1012           (l_formula_line_tbl(l_rec.step_number).price_formula_id,
1013            l_formula_line_tbl(l_rec.step_number).step_number,
1014            l_formula_line_tbl(l_rec.step_number).component_value,
1015            l_formula_line_tbl(l_rec.step_number).price_formula_line_type_code,
1016            l_formula_line_tbl(l_rec.step_number).line_index,
1017            l_formula_line_tbl(l_rec.step_number).list_line_type_code,
1018            l_formula_line_tbl(l_rec.step_number).list_header_id,
1019            l_formula_line_tbl(l_rec.step_number).list_line_id
1020           );
1021 	IF l_debug = FND_API.G_TRUE THEN
1022 		QP_PREQ_GRP.engine_debug('After populating formula step values temp table');
1023 	END IF;
1024 END IF;
1025 -- smbalara bug 7188211
1026 END LOOP; --Loop over formula_lines_cur
1027 -- Change mask back to flexible mask
1028 qp_number.canonical_mask :=
1029               'FM999999999999999999999.9999999999999999999999999999999999999999';
1030 --commenting below for bug 10273166 smbalara START
1031   -- Now Process all Factor Lists in the formula
1032 
1033 /*  IF l_debug = FND_API.G_TRUE THEN
1034   QP_PREQ_GRP.engine_debug('Before populating plsql table of formula lines');
1035 
1036   END IF;
1037   --Populate l_formula_line_tbl for all factor lists in the formula
1038   FOR l_factors_rec IN factors_cur (p_price_formula_id, p_line_index,
1039                                     p_price_effective_date)
1040   LOOP
1041 
1042     IF l_debug = FND_API.G_TRUE THEN
1043     QP_PREQ_GRP.engine_debug('enter factors_cur loop');
1044 
1045     END IF;
1046     IF l_skip_factor AND
1047        l_factors_rec.step_number = l_old_step_number
1048     THEN
1049       l_old_step_number := l_factors_rec.step_number;
1050       GOTO factors_loop;
1051     END IF;
1052 
1053     IF l_debug = FND_API.G_TRUE THEN
1054     QP_PREQ_GRP.engine_debug('after skip check ');
1055 
1056     END IF;
1057     l_skip_factor := FALSE;
1058 
1059     --If no attributes with search_ind = 2 then no need to open sub_factors_cur
1060     IF l_factors_rec.group_count = 0 THEN
1061 
1062       l_formula_line_tbl(l_factors_rec.step_number).component_value :=
1063                                      l_factors_rec.operand;
1064 
1065       l_Operand_Tbl(l_factors_rec.step_number) := l_formula_line_tbl(l_factors_rec.step_number).component_value;
1066 
1067       l_formula_line_tbl(l_factors_rec.step_number).step_number :=
1068                                      l_factors_rec.step_number;
1069       l_formula_line_tbl(l_factors_rec.step_number).price_formula_line_type_code
1070                                   := 'ML';
1071       l_formula_line_tbl(l_factors_rec.step_number).price_formula_id :=
1072                                      l_factors_rec.price_formula_id;
1073       l_formula_line_tbl(l_factors_rec.step_number).line_index :=
1074                                      p_line_index;
1075       l_formula_line_tbl(l_factors_rec.step_number).list_header_id :=
1076                                      l_factors_rec.list_header_id;
1077       l_formula_line_tbl(l_factors_rec.step_number).list_line_id :=
1078                                      l_factors_rec.list_line_id;
1079       l_formula_line_tbl(l_factors_rec.step_number).list_line_type_code :=
1080                                      p_list_line_type_code;
1081 
1082       IF l_debug = FND_API.G_TRUE THEN
1083       QP_PREQ_GRP.engine_debug('In factors_cur, step = ' ||l_factors_rec.step_number);
1084 
1085       END IF;
1086       l_skip_factor := TRUE;
1087 
1088       --added for formula messages
1089       l_null_step_number_tbl.DELETE(l_factors_rec.step_number);
1090 
1091     ELSE --If l_factors_rec.group_count > 0
1092       --sub_factors_cur has to be fetched to determine if all attributes match
1093       OPEN sub_factors_cur(p_price_formula_id,
1094                            p_line_index,
1095                            p_price_effective_date,
1096                            l_factors_rec.list_header_id,
1097                            l_factors_rec.list_line_id,
1098                            l_factors_rec.group_count);
1099       FETCH sub_factors_cur
1100       INTO  l_sub_factors_rec;
1101 
1102       IF sub_factors_cur%FOUND THEN
1103 
1104         l_formula_line_tbl(l_factors_rec.step_number).component_value :=
1105                                      l_factors_rec.operand;
1106 
1107         l_Operand_Tbl(l_factors_rec.step_number) := l_formula_line_tbl(l_factors_rec.step_number).component_value;
1108 
1109         l_formula_line_tbl(l_factors_rec.step_number).step_number :=
1110                                      l_factors_rec.step_number;
1111         l_formula_line_tbl(l_factors_rec.step_number).price_formula_line_type_code
1112                                   := 'ML';
1113         l_formula_line_tbl(l_factors_rec.step_number).price_formula_id :=
1114                                      l_factors_rec.price_formula_id;
1115         l_formula_line_tbl(l_factors_rec.step_number).line_index :=
1116                                      p_line_index;
1117         l_formula_line_tbl(l_factors_rec.step_number).list_header_id :=
1118                                      l_factors_rec.list_header_id;
1119         l_formula_line_tbl(l_factors_rec.step_number).list_line_id :=
1120                                      l_factors_rec.list_line_id;
1121         l_formula_line_tbl(l_factors_rec.step_number).list_line_type_code :=
1122                                      p_list_line_type_code;
1123 
1124         IF l_debug = FND_API.G_TRUE THEN
1125         QP_PREQ_GRP.engine_debug('In sub_factors_cur, step = ' ||l_factors_rec.step_number);
1126 
1127         END IF;
1128         l_skip_factor := TRUE;
1129 
1130         l_null_step_number_tbl.DELETE(l_factors_rec.step_number);
1131       END IF;--sub_factors_cur%FOUND
1132 
1133       CLOSE sub_factors_cur;
1134 
1135     END IF; --If l_factors_rec.group_count = 0
1136 
1137     l_old_step_number := l_factors_rec.step_number;
1138 
1139     <<factors_loop>>
1140     null;
1141 
1142     IF l_debug = FND_API.G_TRUE THEN
1143     QP_PREQ_GRP.engine_debug('exit factors_cur loop');
1144 
1145     END IF;
1146   END LOOP; --Loop over factors_cur
1147 
1148   IF l_debug = FND_API.G_TRUE THEN
1149   QP_PREQ_GRP.engine_debug('After populating plsql table of formula lines');
1150 
1151   END IF;*/
1152    --commenting above for bug 10273166 smbalara END
1153   --Based on a profile option, loop over plsql table of formula lines to
1154   --populate qp_nformula_step_values_tmp table
1155 /* commented for bug 7188211 - temp table insert moved above
1156   IF QP_PREQ_GRP.G_INSERT_FORMULA_STEP_VALUES = 'Y' THEN
1157 
1158     IF l_debug = FND_API.G_TRUE THEN
1159     QP_PREQ_GRP.engine_debug('Before populating formula stepvalues temp table');
1160 
1161     END IF;
1162     i:= l_formula_line_tbl.FIRST; --set loop index to first element in plsql tbl
1163 
1164     WHILE i IS NOT NULL
1165     LOOP
1166       BEGIN
1167 
1168         --Insert into temp table only for formulas attached to Price List Lines.
1169         IF l_formula_line_tbl(i).list_line_type_code = 'PLL'
1170         THEN
1171 
1172           INSERT INTO qp_nformula_step_values_tmp
1173           (price_formula_id,
1174            step_number,
1175            component_value,
1176            price_formula_line_type_code,
1177            line_index,
1178            list_line_type_code,
1179            list_header_id,
1180            list_line_id
1181           )
1182           VALUES
1183           (l_formula_line_tbl(i).price_formula_id,
1184            l_formula_line_tbl(i).step_number,
1185            l_formula_line_tbl(i).component_value,
1186            l_formula_line_tbl(i).price_formula_line_type_code,
1187            l_formula_line_tbl(i).line_index,
1188            l_formula_line_tbl(i).list_line_type_code,
1189            l_formula_line_tbl(i).list_header_id,
1190            l_formula_line_tbl(i).list_line_id
1191           );
1192 
1193         END IF; --If list_line_type_code = 'PLL'
1194 
1195       EXCEPTION
1196         WHEN OTHERS THEN
1197          IF l_debug = FND_API.G_TRUE THEN
1198          QP_PREQ_GRP.engine_debug(substr(sqlerrm, 1, 240));
1199          END IF;
1200       END;
1201 
1202       i :=  l_formula_line_tbl.NEXT(i);--set i to next notnull position in plsql
1203 
1204     END LOOP; --loop over l_formula_line_tbl
1205 
1206     IF l_debug = FND_API.G_TRUE THEN
1207     QP_PREQ_GRP.engine_debug('After populating formula step values temp table');
1208 
1209     END IF;
1210   END IF; --If profile option is set
1211 commented for bug 7188211*/
1212   IF l_debug = FND_API.G_TRUE THEN
1213   QP_PREQ_GRP.engine_debug('Before Calling - QP_BUILD_FORMULA_RULES.Get_Formula_Values');
1214   QP_PREQ_GRP.engine_debug('For Formula : '||l_formula);----6726052,7249280 smbalara
1215   QP_PREQ_GRP.engine_debug('Maintain Dynamic pkgs profile is :'||L_MAINT_DYN_SRC_VER);
1216   END IF;
1217   -- 13638721
1218   IF (L_MAINT_DYN_SRC_VER='N') THEN
1219   QP_BUILD_FORMULA_RULES.Get_Formula_Values(l_formula,
1220                                             l_Operand_Tbl,
1221                                             'G',               --sfiresto
1222                                             l_formula_value,
1223                                             l_return_status);
1224   ELSE
1225       BEGIN
1226       SELECT SEEDED_VALUE INTO l_pkg_ver FROM qp_parameters_b WHERE PARAMETER_CODE='BLD_FORMULA_ACTV_VER' AND ROWNUM=1;
1227 	  IF l_debug = FND_API.G_TRUE THEN
1228 	  QP_PREQ_GRP.engine_debug('1. found row in qp_params for code BLD_FORMULA_ACTV_VER pkg ver : ' || l_pkg_ver);
1229 	  END IF;
1230       EXCEPTION
1231       WHEN OTHERS THEN
1232         l_pkg_ver:='0';
1233 	  IF l_debug = FND_API.G_TRUE THEN
1234 	  QP_PREQ_GRP.engine_debug('1. when others row in qp_params for code BLD_FORMULA_ACTV_VER pkg ver: ' || l_pkg_ver);
1235 	  END IF;
1236       END;
1237         IF (l_pkg_ver='5') THEN
1238 		  QP_BUILD_FORMULA_RULES5.Get_Formula_Values(l_formula,
1239 							    l_Operand_Tbl,
1240 							    'G',
1241 							    l_formula_value,
1242 							    l_return_status);
1243         ELSIF (l_pkg_ver='4') THEN
1244 		  QP_BUILD_FORMULA_RULES4.Get_Formula_Values(l_formula,
1245 							    l_Operand_Tbl,
1246 							    'G',
1247 							    l_formula_value,
1248 							    l_return_status);
1249         ELSIF (l_pkg_ver='3') THEN
1250 		  QP_BUILD_FORMULA_RULES3.Get_Formula_Values(l_formula,
1251 							    l_Operand_Tbl,
1252 							    'G',
1253 							    l_formula_value,
1254 							    l_return_status);
1255         ELSIF (l_pkg_ver='2') THEN
1256 		  QP_BUILD_FORMULA_RULES2.Get_Formula_Values(l_formula,
1257 							    l_Operand_Tbl,
1258 							    'G',
1259 							    l_formula_value,
1260 							    l_return_status);
1261         ELSIF (l_pkg_ver='1') THEN
1262 		  QP_BUILD_FORMULA_RULES1.Get_Formula_Values(l_formula,
1263 							    l_Operand_Tbl,
1264 							    'G',
1265 							    l_formula_value,
1266 							    l_return_status);
1267         ELSE
1268 		  QP_BUILD_FORMULA_RULES.Get_Formula_Values(l_formula,
1269 							    l_Operand_Tbl,
1270 							    'G',
1271 							    l_formula_value,
1272 							    l_return_status);
1273         END IF;
1274   END IF;
1275   -- 13638721
1276 
1277   IF l_debug = FND_API.G_TRUE THEN
1278   QP_PREQ_GRP.engine_debug('After Calling - QP_BUILD_FORMULA_RULES.Get_Formula_Values');
1279 
1280   QP_PREQ_GRP.engine_debug('Return Status from Get_Formula_Values ' || l_return_status);
1281 
1282   END IF;
1283   IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) OR (l_formula_value IS NULL) THEN
1284     l_formula_value := Select_From_Dual(l_formula, l_operand_tbl);
1285 
1286     IF l_formula_value IS NULL THEN
1287       x_return_status := FND_API.G_RET_STS_ERROR;
1288       IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_ERROR)
1289       THEN
1290         Set_Message( p_price_formula_id     => p_price_formula_id,
1291                    p_formula_name         => l_formula_name,
1292                    p_null_step_number_tbl => l_null_step_number_tbl);
1293         l_null_step_number_tbl.DELETE;
1294       END IF;
1295     END IF;
1296 
1297   END IF;
1298 
1299   IF l_debug = FND_API.G_TRUE THEN
1300   QP_PREQ_GRP.engine_debug('Formula evaluated to ' || l_formula_value);
1301 
1302   QP_PREQ_GRP.engine_debug('Formula Return Status ' || l_return_status);
1303 
1304   END IF;
1305   l_formula_line_tbl.DELETE; --Clear the temp table table
1306 
1307   l_formula_end_time := dbms_utility.get_time;
1308   l_time_difference := (l_formula_end_time - l_formula_start_time)/100 ;
1309 
1310   IF l_debug = FND_API.G_TRUE THEN
1311   QP_PREQ_GRP.engine_debug('##### Total Time in QP_FORMULA_PRICE_CALC_PVT(in sec) : ' || l_time_difference || ' #####');
1312 
1313   END IF;
1314   RETURN l_formula_value;
1315   --End more POSCO changes.
1316 
1317 EXCEPTION
1318 
1319 WHEN E_FORMULA_NOT_FOUND THEN
1320 x_return_status := FND_API.G_RET_STS_ERROR;
1321 fnd_message.set_name('QP','QP_FORMULA_NOT_FOUND');
1322 fnd_message.set_token('FORMULA_NAME',l_formula_name);
1323 -- Change mask back to flexible mask
1324 qp_number.canonical_mask := 'FM999999999999999999999.9999999999999999999999999999999999999999';
1325 RETURN l_formula_value;
1326 
1327 WHEN E_INVALID_FORMULA THEN
1328 x_return_status := FND_API.G_RET_STS_ERROR;
1329 fnd_message.set_name('QP','QP_INVALID_FORMULA');
1330 fnd_message.set_token('FORMULA_NAME',l_formula_name);
1331 -- Change mask back to flexible mask
1332 qp_number.canonical_mask := 'FM999999999999999999999.9999999999999999999999999999999999999999';
1333 RETURN l_formula_value;
1334 
1335 WHEN  E_FORMULA_COMPONENTS_REQ THEN
1336 x_return_status := FND_API.G_RET_STS_ERROR;
1337 fnd_message.set_name('QP','QP_FORMULA_COMPONENTS_REQ');
1338 fnd_message.set_token('FORMULA_NAME',l_formula_name);
1339 -- Change mask back to flexible mask
1340 qp_number.canonical_mask := 'FM999999999999999999999.9999999999999999999999999999999999999999';
1341 RETURN l_formula_value;
1342 
1343 WHEN  E_CUSTOMIZE_GET_CUSTOM_PRICE THEN
1344 x_return_status := FND_API.G_RET_STS_ERROR;
1345 fnd_message.set_name('QP','QP_CUSTOMIZE_GET_CUSTOM_PRICE');
1346 fnd_message.set_token('FORMULA_NAME',l_formula_name);
1347 -- Change mask back to flexible mask
1348 qp_number.canonical_mask := 'FM999999999999999999999.9999999999999999999999999999999999999999';
1349 RETURN l_formula_value;
1350 
1351 WHEN  E_INVALID_NUMBER THEN
1352 x_return_status := FND_API.G_RET_STS_ERROR;
1353 fnd_message.set_name('QP','QP_INVALID_NUMBER');
1354 fnd_message.set_token('FORMULA_NAME',l_formula_name);
1355 -- Change mask back to flexible mask
1356 qp_number.canonical_mask := 'FM999999999999999999999.9999999999999999999999999999999999999999';
1357 RETURN l_formula_value;
1358 
1359     WHEN FND_API.G_EXC_ERROR THEN
1360 
1361       x_return_status := FND_API.G_RET_STS_ERROR;
1362 
1363       IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_ERROR)
1364       THEN
1365         FND_MESSAGE.SET_NAME('QP','QP_FORMULA_FAILED');
1366       END IF;
1367       IF l_debug = FND_API.G_TRUE THEN
1368       QP_PREQ_GRP.engine_debug('Exception '||substr(sqlerrm, 1, 240));
1369       QP_PREQ_GRP.engine_debug('Exception occurred. Formula value returned is ' ||
1370                        l_formula_value);
1371       END IF;
1372 
1373       l_formula_line_tbl.DELETE; --Clear the temp table table
1374 
1375       -- Change mask back to flexible mask
1376       qp_number.canonical_mask := 'FM999999999999999999999.9999999999999999999999999999999999999999';
1377 
1378       RETURN l_formula_value;
1379 
1380     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1381 
1382       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1383       IF l_debug = FND_API.G_TRUE THEN
1384       QP_PREQ_GRP.engine_debug('Unexpected Exception '||substr(sqlerrm, 1, 240));
1385       QP_PREQ_GRP.engine_debug('Exception occurred. Formula value returned is ' ||
1386                        l_formula_value);
1387 
1388       END IF;
1389       l_formula_line_tbl.DELETE; --Clear the temp table table
1390 
1391       -- Change mask back to flexible mask
1392       qp_number.canonical_mask := 'FM999999999999999999999.9999999999999999999999999999999999999999';
1393 
1394       RETURN l_formula_value;
1395 
1396     WHEN OTHERS THEN
1397 
1398       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1399 
1400       IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
1401       THEN
1402         FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME,
1403                                 'Calculate:'||sqlerrm);
1404       END IF;
1405 
1406       IF l_debug = FND_API.G_TRUE THEN
1407       QP_PREQ_GRP.engine_debug('Other Exception '||substr(sqlerrm, 1, 240));
1408       QP_PREQ_GRP.engine_debug('Exception occurred. Formula value returned is ' ||
1409                          l_formula_value);
1410 
1411       END IF;
1412       l_formula_line_tbl.DELETE; --Clear the temp table table
1413 
1414       -- Change mask back to flexible mask
1415       qp_number.canonical_mask := 'FM999999999999999999999.9999999999999999999999999999999999999999';
1416 
1417       RETURN l_formula_value;
1418 
1419 END Calculate;
1420 
1421 PROCEDURE Set_Message(p_price_formula_id     IN NUMBER,
1422                       p_formula_name         IN VARCHAR2,
1423                       p_null_step_number_tbl IN STEP_NUMBER_TBL_TYPE)
1424 
1425 IS
1426 
1427 l_price_formula_line_type_code qp_price_formula_lines.price_formula_line_type_code%TYPE;
1428 l_pricing_attribute_context    qp_price_formula_lines.pricing_attribute_context%TYPE;
1429 l_pricing_attribute            qp_price_formula_lines.pricing_attribute%TYPE;
1430 l_all_steps                    VARCHAR2(100);
1431 l_formula_name                 qp_price_formulas_tl.name%TYPE;
1432 l_index                        NUMBER;
1433 l_attribute                    VARCHAR2(80);
1434 --added for display of right message in case of undefined step.
1435 --can be removed once validation is done in formula form.
1436 l_no_of_comps                  NUMBER;
1437 l_formula                      VARCHAR2(2000);
1438 l_count                        NUMBER :=0;
1439 l_char                         VARCHAR2(1) :='';
1440 l_number                       VARCHAR2(2000) :='';
1441 
1442 BEGIN
1443 
1444    l_formula_name := p_formula_name;
1445    --added for display of right message in case of undefined step
1446    -- query on formula ID instead of name, SQL repos
1447    SELECT formula into l_formula from qp_price_formulas_b
1448    WHERE price_formula_id = p_price_formula_id;
1449 
1450   SELECT count(*) into l_no_of_comps from qp_price_formula_lines
1451    WHERE price_formula_id = p_price_formula_id;
1452 
1453   FOR i IN 1..LENGTH(l_formula) LOOP
1454     l_char :=SUBSTR(l_formula,i,1);
1455    IF (l_char = '0') OR (l_char = '1') OR (l_char = '2') OR (l_char = '3')
1456        OR (l_char = '4') OR (l_char = '5') OR (l_char ='6')
1457        OR (l_char = '7') OR (l_char = '8') OR (l_char = '9')
1458    THEN
1459       l_number :=l_number ||l_char;
1460        IF (i = LENGTH(l_formula))
1461         THEN
1462           l_count :=l_count+1;
1463           l_number :='';
1464        END IF;
1465    ELSE
1466      IF l_number is NOT NULL
1467        THEN
1468          l_count :=l_count+1;
1469          l_number :='';
1470      END IF;
1471    END IF;
1472  END LOOP;
1473 --added for display of right message in case of undefined step
1474    IF p_null_step_number_tbl.COUNT = 1 AND l_count = l_no_of_comps
1475    THEN
1476      l_index := p_null_step_number_tbl.FIRST;
1477      SELECT price_formula_line_type_code,
1478             pricing_attribute_context,
1479             pricing_attribute
1480        INTO l_price_formula_line_type_code,
1481             l_pricing_attribute_context,
1482             l_pricing_attribute
1483        FROM qp_price_formula_lines
1484       WHERE price_formula_id = p_price_formula_id
1485         AND step_number = l_index;
1486 
1487       IF     l_price_formula_line_type_code = 'LP'
1488       THEN
1489          fnd_message.set_name('QP','QP_FORMULA_LIST_PRICE_NULL');
1490 
1491       ELSIF  l_price_formula_line_type_code = 'MV'
1492       THEN
1493          fnd_message.set_name('QP','QP_FORMULA_MODIFIER_VALUE_NULL');
1494 
1495       ELSIF  l_price_formula_line_type_code = 'FUNC'
1496       THEN
1497          fnd_message.set_name('QP','QP_FORMULA_GET_CUSTOM_PRICE');
1498 
1499       ELSIF  l_price_formula_line_type_code = 'PRA'
1500       THEN
1501          SELECT     nvl(SEGMENTS_TL.SEEDED_SEGMENT_NAME,SEGMENTS_TL.USER_SEGMENT_NAME)
1502          INTO  l_attribute
1503  	 FROM  qp_segments_b SEGMENTS, qp_prc_contexts_b PCONTEXTS , qp_segments_tl SEGMENTS_TL
1504 		WHERE pcontexts.prc_context_code       =  l_pricing_attribute_context
1505 		AND   segments.segment_mapping_column  =  l_pricing_attribute
1506 		AND   segments.prc_context_id          =  pcontexts.prc_context_id
1507 		AND   segments.segment_id              =  segments_tl.segment_id
1508 		AND   segments_tl.language	       = userenv('LANG') --bug#13250347
1509                 AND   rownum<2;
1510 
1511          fnd_message.set_name('QP','QP_PRICING_ATTRIBUTE_NULL');
1512          fnd_message.set_token('CONTEXT',l_pricing_attribute_context);
1513          fnd_message.set_token('ATTRIBUTE',l_attribute);
1514 
1515       ELSIF  l_price_formula_line_type_code = 'PLL'
1516       THEN
1517          fnd_message.set_name('QP','QP_PRICE_LIST_LINE_NOT_EXISTS');
1518 
1519       ELSIF  l_price_formula_line_type_code = 'ML'
1520       THEN
1521          fnd_message.set_name('QP','QP_FACTOR_LIST_NULL');
1522       END IF;
1523       fnd_message.set_token('STEP_NUMBER',l_index);
1524 
1525    ELSIF p_null_step_number_tbl.COUNT>1 AND l_count = l_no_of_comps
1526    THEN                                        -- more than one step nulling out
1527       l_index := p_null_step_number_tbl.FIRST;
1528       WHILE l_index IS NOT NULL
1529       LOOP
1530          IF l_index = p_null_step_number_tbl.LAST
1531          THEN
1532             l_all_steps := l_all_steps || p_null_step_number_tbl(l_index);
1533          ELSE
1534             l_all_steps := l_all_steps || p_null_step_number_tbl(l_index) || ', ';
1535          END IF;
1536          l_index := p_null_step_number_tbl.NEXT(l_index);
1537       END LOOP;
1538          fnd_message.set_name('QP','QP_NULL_STEP_NUMBER');
1539          fnd_message.set_token('STEP_NUMBERS',l_all_steps);
1540    ELSE
1541          fnd_message.set_name('QP','QP_STEP_NO_UNDEFINED');
1542    END IF;
1543    fnd_message.set_token('FORMULA_NAME',l_formula_name);
1544 END Set_Message;
1545 
1546 
1547 -----------------------------------------------------------------------
1548 -- Wrapper for QP_Build_Formula_Rules.Get_Formula_Values called by Java
1549 -- Formula Engine.  The JDBC call will pass in a serialized string of
1550 -- operands, which this procedure deserializes into a PL/SQL table to
1551 -- pass to Get_Formula_Values
1552 -----------------------------------------------------------------------
1553 PROCEDURE Java_Get_Formula_Values(p_formula          IN VARCHAR2,
1554                                   p_operands_str     IN VARCHAR2,
1555                                   p_procedure_type   IN VARCHAR2,
1556                                   x_formula_value    OUT NOCOPY NUMBER,
1557                                   x_return_status    OUT NOCOPY VARCHAR2)
1558 IS
1559   head NUMBER;
1560   tail NUMBER;
1561   l_step_num NUMBER;
1562   l_operand_tbl QP_FORMULA_RULES_PVT.t_Operand_Tbl_Type;
1563 BEGIN
1564   -- parse the operands string into a table
1565   -- first read in step number, followed by step values
1566   -- head and tail indicate start and end positions of search in the string
1567   head := 0;
1568   tail := instr(p_operands_str, '|', head+1);
1569   WHILE tail <> 0
1570   LOOP
1571     l_step_num := substr(p_operands_str, head+1, tail-head-1); -- step number
1572     head := tail;
1573     tail := instr(p_operands_str, '|', head+1);
1574     l_operand_tbl(l_step_num) := substr(p_operands_str, head+1, tail-head-1);
1575     head := tail;
1576     tail := instr(p_operands_str, '|', head+1);
1577   END LOOP;
1578 
1579   QP_Build_Formula_Rules.Get_Formula_Values(p_formula, l_operand_tbl, p_procedure_type,
1580                                             x_formula_value, x_return_status);
1581 
1582   IF (x_return_status <> FND_API.G_RET_STS_SUCCESS) OR (x_formula_value IS NULL) THEN
1583     x_formula_value := Select_From_Dual(p_formula, l_operand_tbl);
1584 
1585     IF x_formula_value IS NULL THEN
1586       x_return_status := FND_API.G_RET_STS_ERROR;
1587     ELSE
1588       x_return_status := FND_API.G_RET_STS_SUCCESS;
1589     END IF;
1590   END IF;
1591 END Java_Get_Formula_Values;
1592 
1593 END QP_FORMULA_PRICE_CALC_PVT;