DBA Data[Home] [Help]

PACKAGE BODY: APPS.QP_PREQ_PUB

Source


1 PACKAGE BODY QP_PREQ_PUB AS
2   /* $Header: QPXPPREB.pls 120.27.12010000.6 2008/08/29 10:44:51 smbalara ship $ */
3 
4   l_debug VARCHAR2(3);
5   G_VERSION VARCHAR2(240) := '/* $Header: QPXPPREB.pls 120.27.12010000.6 2008/08/29 10:44:51 smbalara ship $ */';
6   G_ATTR_MGR_INSTALLED CONSTANT VARCHAR2(1) := QP_UTIL.Attrmgr_Installed;
7 
8   G_ROUNDING_OPTIONS VARCHAR2(30);
9   G_USE_MULTI_CURRENCY_PUB VARCHAR2(1); -- bug 2943033
10   G_ROUND_INDIVIDUAL_ADJ VARCHAR2(30);
11   G_CALCULATE_FLAG VARCHAR2(30); --3401941
12 
13   G_NO_ROUND CONSTANT VARCHAR2(30) := 'NO_ROUND';
14   G_ROUND_ADJ CONSTANT VARCHAR2(30) := 'ROUND_ADJ';
15   G_NO_ROUND_ADJ CONSTANT VARCHAR2(30) := 'NO_ROUND_ADJ';
16   G_ROUNDING_PROFILE CONSTANT VARCHAR2(1) := 'Q';
17 
18   G_POST_ROUND CONSTANT VARCHAR2(30) := 'POST'; --[prarasto:Post Round] constant for post rounding
19 
20   G_LIMITS_INSTALLED CONSTANT VARCHAR2(1) := FND_PROFILE.VALUE('QP_LIMITS_INSTALLED');
21 
22   --prg processing pl/sql tbl
23   G_PRG_UNCH_CALC_PRICE_TBL QP_PREQ_GRP.NUMBER_TYPE;
24   G_PRG_UNCH_LINE_ID_TBL QP_PREQ_GRP.NUMBER_TYPE;
25   G_PRG_UNCH_LINE_IND_TBL QP_PREQ_GRP.NUMBER_TYPE;
26   G_prg_unch_new_index_tbl QP_PREQ_GRP.NUMBER_TYPE;
27   G_prg_unch_line_index_tbl QP_PREQ_GRP.NUMBER_TYPE;
28   G_prg_unch_process_sts_tbl QP_PREQ_GRP.VARCHAR_TYPE;
29 
30   G_ldet_plsql_index_tbl QP_PREQ_GRP.NUMBER_TYPE;
31   G_BACK_CALCULATION_CODE VARCHAR2(30);
32 
33   G_NO_ADJ_PROCESSING VARCHAR2(1); --3169430
34   G_QP_INSTALL_STATUS VARCHAR2(1) := QP_UTIL.get_qp_status; --3169430
35 
36 
37   TYPE BACK_CALC_REC_TYPE IS RECORD
38   (LINE_INDEX NUMBER
39    , LINE_DETAIL_INDEX NUMBER
40    , LIST_LINE_ID NUMBER
41    , LIST_LINE_TYPE_CODE VARCHAR2(30)
42    , ADJUSTMENT_AMOUNT NUMBER
43    , MODIFIER_LEVEL_CODE VARCHAR2(30)
44    , OPERAND_VALUE NUMBER
45    , APPLIED_FLAG VARCHAR2(1)
46    , UPDATED_FLAG VARCHAR2(1)
47    , PROCESS_CODE VARCHAR2(30)
48    , PRICING_STATUS_CODE VARCHAR2(30)
49    , PRICING_STATUS_TEXT VARCHAR2(240)
50    , ROUNDING_FACTOR NUMBER
51    , CALCULATION_CODE VARCHAR2(30)
52    , LINE_QUANTITY NUMBER
53    , LIST_HEADER_ID NUMBER
54    , LIST_TYPE_CODE VARCHAR2(30)
55    , PRICE_BREAK_TYPE_CODE VARCHAR2(30)
56    , CHARGE_TYPE_CODE VARCHAR2(30)
57    , CHARGE_SUBTYPE_CODE VARCHAR2(30)
58    , AUTOMATIC_FLAG VARCHAR2(1)
59    , PRICING_PHASE_ID NUMBER
60    , LIMIT_CODE VARCHAR2(30)
61    , LIMIT_TEXT VARCHAR2(2000)
62    , OPERAND_CALCULATION_CODE VARCHAR2(30)
63    , PRICING_GROUP_SEQUENCE NUMBER
64    , LIST_LINE_NO VARCHAR2(240));
65 
66 
67   G_NOT_MAX_FRT_CHARGE CONSTANT VARCHAR2(100) := 'QP_PREQ_PUB:DELETED TO RETURN MAX/OVERRID FREIGHT CHARGE';
68   G_FREEZE_OVERRIDE_FLAG VARCHAR2(1) := '';
69   G_GSA_ENABLED_FLAG VARCHAR2(1) := NULL; --FND_API.G_MISS_CHAR;
70 
71   FUNCTION Get_Version RETURN VARCHAR2 IS
72   BEGIN
73     RETURN G_Version;
74   END Get_Version;
75 
76   PROCEDURE INITIALIZE_CONSTANTS(p_control_rec IN QP_PREQ_GRP.CONTROL_RECORD_TYPE
77                                  , x_return_status_text OUT NOCOPY VARCHAR2
78                                  , x_return_status OUT NOCOPY VARCHAR2) IS
79   /*
80 indxno index used
81 */
82   CURSOR l_init_pricelist_phase_cur IS
83     SELECT PHASE_SEQUENCE, PRICING_PHASE_ID
84     FROM QP_PRICING_PHASES
85     WHERE  LIST_TYPE_CODE = 'PRL'
86     AND    ROWNUM < 2;
87 
88   /*
89 INDX,QP_PREQ_PUB.initialize_constants.l_check_pricing_phase_exists,QP_PRICING_PHASES_U1,PRICING_PHASE_ID,1
90 INDX,QP_PREQ_PUB.initialize_constants.l_check_pricing_phase_exists,QP_EVENT_PHASES_U1,PRICING_EVENT_CODE,1
91 INDX,QP_PREQ_PUB.initialize_constants.l_check_pricing_phase_exists,QP_EVENT_PHASES_U1,PRICING_PHASE_ID,1
92 */
93   CURSOR l_check_pricing_phase_exists(p_event VARCHAR2) IS
94     SELECT   b.pricing_phase_id
95             , nvl(b.user_freeze_override_flag, b.freeze_override_flag)
96     FROM   qp_event_phases a, qp_pricing_phases b
97     WHERE  instr(p_event, a.pricing_event_code || ',') > 0
98     AND ((G_GET_FREIGHT_FLAG = G_YES AND b.freight_exists = G_YES)
99          OR (G_GET_FREIGHT_FLAG = G_NO))
100     AND    a.pricing_phase_id = G_PRICE_LIST_PHASE_ID
101     AND    b.pricing_phase_id = G_PRICE_LIST_PHASE_ID;
102 
103   /*
104 indxno index used
105 */
106   CURSOR l_currency_code_cur IS
107     SELECT    currency_code
108     FROM qp_npreq_lines_tmp;
109 
110   /*
111 indxno index used
112 */
113   CURSOR l_min_max_eff_date_cur IS
114     SELECT MIN(pricing_effective_date)
115             , MAX(pricing_effective_date)
116     FROM qp_npreq_lines_tmp;
117 
118   /*
119 indxno index used
120 */
121   CURSOR l_attr_sourcing_cur IS
122     SELECT line_index
123             , line_quantity
124             , priced_quantity
125             , unit_price
126     FROM qp_npreq_lines_tmp;
127 
128   l_attr_sourcing_rec l_attr_sourcing_cur%ROWTYPE;
129 
130   l_bypass_pricing VARCHAR2(30);
131   l_FIXED_PRICE CONSTANT NUMBER := 11.99;
132   l_pricing_phase NUMBER;
133   l_price_phase_flag VARCHAR2(1) := G_NO;
134   l_freeze_override_flag VARCHAR2(3);
135   l_null_eff_date_line NUMBER;
136   l_currency_code VARCHAR2(30);
137   l_status_text VARCHAR2(30);
138   l_routine VARCHAR2(50) := 'QP_PREQ_PUB.Initialize_Constants';
139   --sourcing volume attributes performance changes
140   l_source_qty_flag VARCHAR2(1);
141   l_source_amt_flag VARCHAR2(1);
142   l_null_price_req_code VARCHAR2(1) := G_NO;
143   l_missing_header VARCHAR2(30) := 'MISSING HEADER';
144   l_order_header_id NUMBER := 0;
145 
146 
147   E_CURRENCY_CODE_IS_NULL EXCEPTION;
148   E_INVALID_PHASE EXCEPTION;
149   E_INVALID_CONTROL_RECORD EXCEPTION;
150   E_BYPASS_PRICING EXCEPTION;
151   E_OTHER_ERRORS EXCEPTION;
152 
153   BEGIN
154     l_debug := QP_PREQ_GRP.G_DEBUG_ENGINE;
155     IF l_debug = FND_API.G_TRUE THEN
156       QP_PREQ_GRP.engine_debug('begin initialize_constants');
157 
158     END IF;
159 
160 
161     l_bypass_pricing := FND_PROFILE.VALUE(G_BYPASS_PRICING);
162 
163     --pricing event can be null when applying manual adjustments
164     --IF(p_control_rec.PRICING_EVENT IS NULL
165     IF (p_control_rec.calculate_flag = NULL
166         OR UPPER(p_control_rec.SIMULATION_FLAG) NOT IN (G_YES, G_NO)
167         ) THEN
168       RAISE E_INVALID_CONTROL_RECORD;
169     END IF;
170 
171 
172     --update request_type_code to lines_tmp
173 
174     UPDATE qp_npreq_lines_tmp
175     SET request_type_code = p_control_rec.request_type_code
176     WHERE request_type_code IS NULL;
177 
178     IF l_debug = FND_API.G_TRUE THEN
179       QP_PREQ_GRP.engine_debug('1 initialize_constants');
180 
181     END IF;
182     --populate G_PRICE_LIST_SEQUENCE,G_PRICE_LIST_PHASE_ID
183     OPEN l_init_pricelist_phase_cur;
184     FETCH l_init_pricelist_phase_cur INTO G_PRICE_LIST_SEQUENCE, G_PRICE_LIST_PHASE_ID;
185     CLOSE l_init_pricelist_phase_cur;
186 
187 
188     IF(G_PRICE_LIST_SEQUENCE = NULL OR G_PRICE_LIST_SEQUENCE = FND_API.G_MISS_NUM
189        OR G_PRICE_LIST_PHASE_ID = NULL OR G_PRICE_LIST_PHASE_ID = FND_API.G_MISS_NUM) THEN
190       RAISE E_INVALID_PHASE;
191     END IF;
192 
193     IF l_debug = FND_API.G_TRUE THEN
194       QP_PREQ_GRP.engine_debug('2 initialize_constants');
195 
196     END IF;
197     IF (l_bypass_pricing = 'Y' ) THEN
198 
199       BEGIN
200         /*
201 	indx no index used
202 	*/
203         UPDATE qp_npreq_lines_tmp SET
204                 unit_price = l_FIXED_PRICE,
205                 adjusted_unit_price = l_FIXED_PRICE,
206                 pricing_status_code = G_STATUS_UPDATED
207         WHERE unit_price IS NULL
208                 OR adjusted_unit_price IS NULL
209                 OR unit_price = FND_API.G_MISS_NUM
210                 OR adjusted_unit_price = FND_API.G_MISS_NUM;
211       EXCEPTION
212         WHEN OTHERS THEN
213           IF l_debug = FND_API.G_TRUE THEN
214             QP_PREQ_GRP.engine_debug('QP_PREQ_PUB: Init_cons update status '|| SQLERRM);
215           END IF;
216           x_return_status_text := SQLERRM;
217           RAISE E_OTHER_ERRORS;
218       END;
219       RAISE E_BYPASS_PRICING;
220 
221     END IF;
222     IF l_debug = FND_API.G_TRUE THEN
223       QP_PREQ_GRP.engine_debug('3 initialize_constants');
224 
225     END IF;
226     OPEN l_check_pricing_phase_exists(p_control_rec.PRICING_EVENT);
227     FETCH l_check_pricing_phase_exists INTO l_pricing_phase, l_freeze_override_flag;
228     CLOSE l_check_pricing_phase_exists;
229 
230     IF (l_pricing_phase IS NOT NULL) THEN
231       l_price_phase_flag := G_YES;
232       G_PRICE_PHASE_FLAG := TRUE;
233     ELSE
234       l_price_phase_flag := G_NO;
235       G_PRICE_PHASE_FLAG := FALSE;
236     END IF;
237 
238     G_FREEZE_OVERRIDE_FLAG := l_freeze_override_flag;
239 
240     IF l_debug = FND_API.G_TRUE THEN
241       QP_PREQ_GRP.engine_debug('4 initialize_constants');
242 
243 
244     END IF;
245     OPEN l_CURRENCY_CODE_CUR;
246     FETCH l_CURRENCY_CODE_CUR INTO G_CURRENCY_CODE;
247     CLOSE l_CURRENCY_CODE_CUR;
248     --We expect that the user will pass currency code
249     --if not the engine will not return right price
250     IF G_CURRENCY_CODE IS NULL THEN
251       RAISE E_CURRENCY_CODE_IS_NULL;
252     END IF;
253 
254     IF l_debug = FND_API.G_TRUE THEN
255       QP_PREQ_GRP.engine_debug('5 initialize_constants');
256 
257     END IF;
258     OPEN l_min_max_eff_date_cur;
259     FETCH l_min_max_eff_date_cur INTO G_MIN_PRICING_DATE, G_MAX_PRICING_DATE;
260     CLOSE l_min_max_eff_date_cur;
261 
262 
263     IF l_debug = FND_API.G_TRUE THEN
264       QP_PREQ_GRP.engine_debug('5.5 initialize_constants');
265     END IF;
266     --update the price flag on summary line to 'P' if there is at least
267     --one line with price flag 'P'
268     --This is to avoid any more order level adjustments applied
269     --if any line has price_flag N/P
270     -- Not needed as this is being done in OM. Also OC folks got affected by this change wherein order level
271     -- adjustments were not getting applied on a service line pricing
272     -- Talked to Amy 01/14/03 and she confirmed that we can comment out this update
273 
274     /* update qp_npreq_lines_tmp set price_flag = G_PHASE
275 		where line_type_code = G_ORDER_LEVEL
276 		and exists(select 'Y' from qp_npreq_lines_tmp
277 		where price_flag in (G_PHASE,G_NO,G_CALCULATE_ONLY)
278 		and line_type_code = G_LINE_LEVEL); */
279 
280     IF l_debug = FND_API.G_TRUE THEN
281       QP_PREQ_GRP.engine_debug('5.6 initialize_constants');
282     END IF;
283     --fix for bug 2374591 ask for promotions not getting applied
284     --updating the list_header_id in the attribute where list_line_id is passed
285     UPDATE qp_npreq_line_attrs_tmp attr SET attr.list_header_id =
286             (SELECT qpl.list_header_id FROM
287              qp_list_lines qpl WHERE qpl.list_line_id = to_number(attr.value_from))
288             WHERE attr.context = 'MODLIST'
289             AND attribute = 'QUALIFIER_ATTRIBUTE2'
290             AND pricing_status_code = 'X';
291 
292     IF l_debug = FND_API.G_TRUE THEN
293       QP_PREQ_GRP.engine_debug('6 initialize_constants');
294       QP_PREQ_GRP.engine_debug('Before update_rounding_factor:calculate_flag '
295                                || p_control_rec.calculate_flag ||' rounding_flag '
296                                || p_control_rec.rounding_flag);
297 
298     END IF;
299     --This is to populate rounding factor based on price list on the line
300     --when engine is called with calculate_only as the calling appln does not
301     --store rounding_fac hence rounding factor will be null
302     IF p_control_rec.calculate_flag = G_CALCULATE_ONLY
303       AND nvl(p_control_rec.rounding_flag, G_YES) IN ('Q', 'U', G_YES, 'P') --[prarasto:Post Round] Added check to
304                                                                             --update rounding factor for Post Rounding
305       THEN
306       QP_PREQ_GRP.update_rounding_factor(G_USE_MULTI_CURRENCY_PUB,
307                                          x_return_status,
308                                          x_return_status_text);
309       IF x_return_status = FND_API.G_RET_STS_ERROR
310         THEN
311         RAISE E_OTHER_ERRORS;
312       END IF;
313     END IF;
314 
315     IF l_debug = FND_API.G_TRUE THEN
316       QP_PREQ_GRP.engine_debug('6.5 initialize_constants');
317 
318     END IF;
319     BEGIN
320       IF l_debug = FND_API.G_TRUE THEN
321         QP_PREQ_GRP.engine_debug('QP_PREQ_PUB before insert source line quantity ');
322       END IF;
323       --sourcing volume attributes performance changes
324       l_source_qty_flag := QP_BUILD_SOURCING_PVT.Is_Attribute_Used('VOLUME', 'PRICING_ATTRIBUTE10');
325       IF l_source_qty_flag = G_YES
326         THEN
327         IF l_debug = FND_API.G_TRUE THEN
328           QP_PREQ_GRP.engine_debug('Sourcing Line Quantity');
329 
330         END IF;
331         /*
332 indxno index used
333 */
334         INSERT INTO qp_npreq_line_attrs_tmp
335         (LINE_INDEX
336          , LINE_DETAIL_INDEX
337          , ATTRIBUTE_LEVEL
338          , NO_QUALIFIERS_IN_GRP
339          , COMPARISON_OPERATOR_TYPE_CODE
340          , VALIDATED_FLAG
341          , APPLIED_FLAG
342          , PRICING_STATUS_CODE
343          , PRICING_STATUS_TEXT
344          , QUALIFIER_PRECEDENCE
345          , PRICING_ATTR_FLAG
346          , QUALIFIER_TYPE
347          , DATATYPE
348          , PRODUCT_UOM_CODE
349          , VALUE_TO
350          , SETUP_VALUE_TO
351          , GROUPING_NUMBER
352          , GROUP_AMOUNT
353          , DISTINCT_QUALIFIER_FLAG
354          , SETUP_VALUE_FROM
355          , ATTRIBUTE_TYPE
356          , LIST_HEADER_ID
357          , LIST_LINE_ID
358          , CONTEXT
359          , ATTRIBUTE
360          , VALUE_FROM
361          , PROCESSED_CODE
362          , EXCLUDER_FLAG
363          , GROUP_QUANTITY
364          )
365         SELECT
366         LINE_INDEX
367         , NULL
368         , G_LINE_LEVEL
369         , NULL
370         , NULL
371         , G_NO
372         , G_LIST_NOT_APPLIED
373         , G_STATUS_UNCHANGED
374         , NULL
375         , NULL
376         , G_YES
377         , NULL
378         , NULL
379         , NULL
380         , NULL
381         , NULL
382         , NULL
383         , NULL
384         , NULL
385         , NULL
386         , G_PRICING_TYPE
387         , NULL
388         , NULL
389         , G_PRIC_VOLUME_CONTEXT
390         , G_QUANTITY_ATTRIBUTE
391         , decode(l_price_phase_flag, G_YES, qp_number.number_to_canonical(nvl(LINE_QUANTITY, 0)), G_NO, qp_number.number_to_canonical(NVL(nvl(PRICED_QUANTITY, LINE_QUANTITY), 0)), 0)
392         , NULL
393         , NULL
394         , NULL
395         FROM qp_npreq_lines_tmp;
396 
397         IF l_debug = FND_API.G_TRUE THEN
398           QP_PREQ_GRP.engine_debug('QP_PREQ_PUB after insert source line quantity ');
399         END IF;
400       END IF; --sourcing volume attributes performance changes
401     EXCEPTION
402       WHEN OTHERS THEN
403         IF l_debug = FND_API.G_TRUE THEN
404           QP_PREQ_GRP.engine_debug('QP_PREQ_PUB init_cons sourceqty exp '|| SQLERRM);
405         END IF;
406         x_return_status_text := SQLERRM;
407         RAISE E_OTHER_ERRORS;
408     END;
409 
410 
411 
412     BEGIN
413       IF l_debug = FND_API.G_TRUE THEN
414         QP_PREQ_GRP.engine_debug('QP_PREQ_PUB before insert source line amt ');
415       END IF;
416       --sourcing volume attributes performance changes
417       l_source_amt_flag := QP_BUILD_SOURCING_PVT.Is_Attribute_Used('VOLUME', 'PRICING_ATTRIBUTE12');
418       IF l_source_amt_flag = G_YES
419         THEN
420         IF l_debug = FND_API.G_TRUE THEN
421           QP_PREQ_GRP.engine_debug('Sourcing Line Amount');
422         END IF;
423         /*
424 indxno index used
425 */
426         INSERT INTO qp_npreq_line_attrs_tmp
427         (LINE_INDEX
428          , LINE_DETAIL_INDEX
429          , ATTRIBUTE_LEVEL
430          , NO_QUALIFIERS_IN_GRP
431          , COMPARISON_OPERATOR_TYPE_CODE
432          , VALIDATED_FLAG
433          , APPLIED_FLAG
434          , PRICING_STATUS_CODE
435          , PRICING_STATUS_TEXT
436          , QUALIFIER_PRECEDENCE
437          , PRICING_ATTR_FLAG
438          , QUALIFIER_TYPE
439          , DATATYPE
440          , PRODUCT_UOM_CODE
441          , VALUE_TO
442          , SETUP_VALUE_TO
443          , GROUPING_NUMBER
444          , GROUP_AMOUNT
445          , DISTINCT_QUALIFIER_FLAG
446          , SETUP_VALUE_FROM
447          , ATTRIBUTE_TYPE
448          , LIST_HEADER_ID
449          , LIST_LINE_ID
450          , CONTEXT
451          , ATTRIBUTE
452          , VALUE_FROM
453          , PROCESSED_CODE
454          , EXCLUDER_FLAG
455          , GROUP_QUANTITY
456          )
457         SELECT
458         LINE_INDEX
459         , NULL
460         , LINE_TYPE_CODE
461         , NULL
462         , NULL
463         , G_NO
464         , QP_PREQ_GRP.G_LIST_NOT_APPLIED
465         , G_STATUS_UNCHANGED
466         , NULL
467         , NULL
468         , G_YES
469         , NULL
470         , NULL
471         , NULL
472         , NULL
473         , NULL
474         , NULL
475         , NULL
476         , NULL
477         , NULL
478         , G_PRICING_TYPE
479         , NULL
480         , NULL
481         , G_PRIC_VOLUME_CONTEXT
482         , G_LINE_AMT_ATTRIBUTE
483         , decode(l_price_phase_flag, G_YES, qp_number.number_to_canonical(nvl(LINE_QUANTITY * UNIT_PRICE, 0)), G_NO, qp_number.number_to_canonical(NVL(nvl(PRICED_QUANTITY, LINE_QUANTITY), 0) * nvl(UNIT_PRICE, 0)), 0)
484         , NULL
485         , NULL
486         , NULL
487         FROM qp_npreq_lines_tmp;
488         IF l_debug = FND_API.G_TRUE THEN
489           QP_PREQ_GRP.engine_debug('QP_PREQ_PUB after insert source line amt ');
490         END IF;
491       END IF; --sourcing volume attributes performance changes
492     EXCEPTION
493       WHEN OTHERS THEN
494         IF l_debug = FND_API.G_TRUE THEN
495           QP_PREQ_GRP.engine_debug('QP_PREQ_PUB init_cons sourceamt exp '|| SQLERRM);
496         END IF;
497         x_return_status_text := SQLERRM;
498         RAISE E_OTHER_ERRORS;
499     END;
500 
501     -- limits check commented out per Ravi, part of accum range break changes
502     --IF G_LIMITS_INSTALLED = G_YES THEN
503     IF l_debug = FND_API.G_TRUE THEN
504       QP_PREQ_GRP.engine_debug('7.5 initialize_constants');
505     END IF;
506     BEGIN
507       --populate G_ORDER_PRICE_REQUEST_CODE for limits
508       SELECT line_id
509       INTO l_order_header_id
510       FROM qp_npreq_lines_tmp
511       WHERE line_type_code = G_ORDER_LEVEL;
512       IF l_debug = FND_API.G_TRUE THEN
513         QP_PREQ_GRP.engine_debug('l_order_header_id '|| l_order_header_id);
514       END IF;
515       QP_PREQ_GRP.G_ORDER_ID := l_order_header_id; -- accum range break
516       QP_PREQ_GRP.G_LINE_ID := null; -- 5706129, accum range break
517       IF l_order_header_id = 0 THEN
518         QP_PREQ_GRP.G_ORDER_PRICE_REQUEST_CODE := G_REQUEST_TYPE_CODE || '-' || l_missing_header;
519       ELSE
520         QP_PREQ_GRP.G_ORDER_PRICE_REQUEST_CODE := G_REQUEST_TYPE_CODE || '-' || l_order_header_id;
521       END IF; --l_order_header_id
522       IF l_debug = FND_API.G_TRUE THEN
523         QP_PREQ_GRP.engine_debug('QP_PREQ_GRP.G_ORDER_PRICE_REQUEST_CODE '|| QP_PREQ_GRP.G_ORDER_PRICE_REQUEST_CODE);
524       END IF;
525     EXCEPTION
526       WHEN OTHERS THEN
527         --this is not an error may be the summary line was not passed
528         QP_PREQ_GRP.G_ORDER_PRICE_REQUEST_CODE := G_REQUEST_TYPE_CODE || '-' || l_missing_header;
529     END;
530     --END IF;--G_LIMITS_INSTALLED
531 
532     IF G_LIMITS_INSTALLED = G_YES THEN
533       IF l_debug = FND_API.G_TRUE THEN
534         QP_PREQ_GRP.engine_debug('7.6 initialize_constants');
535       END IF;
536       BEGIN
537         --populate price_request_code if not passed
538         SELECT G_YES INTO l_null_price_req_code
539         FROM qp_npreq_lines_tmp
540         WHERE price_request_code IS NULL
541         AND price_flag IN (G_YES, G_PHASE)
542         AND ROWNUM = 1;
543 
544         IF l_null_price_req_code = G_YES THEN
545           UPDATE qp_npreq_lines_tmp SET
546           price_request_code = decode(line_type_code,
547                                       G_ORDER_LEVEL, QP_PREQ_GRP.G_ORDER_PRICE_REQUEST_CODE
548                                       , G_LINE_LEVEL, QP_PREQ_GRP.G_ORDER_PRICE_REQUEST_CODE || '-' || nvl(line_id, qp_limit_price_request_code_s.NEXTVAL))
549           WHERE price_request_code IS NULL
550           AND price_flag IN (G_YES, G_PHASE);
551         END IF; --l_null_price_req_code
552       EXCEPTION
553         WHEN OTHERS THEN
554           --this is not an error
555           IF l_debug = FND_API.G_TRUE THEN
556             QP_PREQ_GRP.engine_debug('populate price_request_code excep '|| SQLERRM);
557           END IF;
558           NULL;
559       END;
560     END IF; --G_LIMITS_INSTALLED
561 
562 
563     IF l_debug = FND_API.G_TRUE THEN
564       QP_PREQ_GRP.engine_debug('8.0 initialize_constants');
565     END IF;
566     -------------------------------------------------------------------------
567   EXCEPTION
568     WHEN E_CURRENCY_CODE_IS_NULL THEN
569       IF l_debug = FND_API.G_TRUE THEN
570         QP_PREQ_GRP.engine_debug('Currency code can not be null');
571       END IF;
572       x_return_status := FND_API.G_RET_STS_ERROR;
573       x_return_status_text := l_routine ||' Error : Currency can not be null';
574     WHEN E_INVALID_CONTROL_RECORD THEN
575       x_return_status := FND_API.G_RET_STS_ERROR;
576       x_return_status_text := l_routine ||' INVALID CONTROL RECORD';
577       IF l_debug = FND_API.G_TRUE THEN
578         QP_PREQ_GRP.engine_debug(x_return_status_text);
579       END IF;
580     WHEN E_INVALID_PHASE THEN
581       x_return_status := FND_API.G_RET_STS_ERROR;
582       x_return_status_text := l_routine ||' Invalid phase sequence for Price List phase, Check setup data';
583       IF l_debug = FND_API.G_TRUE THEN
584         QP_PREQ_GRP.engine_debug('Invalid phase sequence for Price List phase');
585       END IF;
586     WHEN E_BYPASS_PRICING THEN
587       x_return_status := 'BYPASS_PRICING';
588       x_return_status_text := l_routine ||' Pricing Bypassed';
589     WHEN E_OTHER_ERRORS THEN
590       x_return_status := FND_API.G_RET_STS_ERROR;
591       x_return_status_text := l_routine ||' '|| x_return_status_text;
592     WHEN OTHERS THEN
593       IF l_debug = FND_API.G_TRUE THEN
594         QP_PREQ_GRP.engine_debug(l_routine || l_status_text ||' '|| SQLERRM);
595       END IF;
596       x_return_status := FND_API.G_RET_STS_ERROR;
597       x_return_status_text := l_routine ||' '|| SQLERRM;
598   END INITIALIZE_CONSTANTS;
599 
600 
601 --4900095 service item lumpsum discount
602 --procedure to evaluate the quantity to prorate lumpsum
603 --to include the parent quantity
604 
605 PROCEDURE Determine_svc_item_quantity IS
606   i NUMBER;
607   l_line_index NUMBER;
608   l_lgrp_vol_attr VARCHAR2(240);
609   --need to use index by varchar as the index used is list_line_id
610   --which is a number and can go beyond the binary integer bounds
611   TYPE num_indxbyvarchar_type IS TABLE OF NUMBER INDEX BY VARCHAR2(2000);
612   l_lumpsum_qty num_indxbyvarchar_type;
613 BEGIN
614   l_debug := QP_PREQ_GRP.G_DEBUG_ENGINE;
615   IF l_debug = FND_API.G_TRUE THEN
616     QP_PREQ_GRP.engine_debug('Begin Determine_svc_item_quantity');
617   END IF;
618 --bug 4900095 get service qty for lumpsum
619   i:= QP_PREQ_GRP.G_service_line_ind_tbl.FIRST;
620   IF l_debug = FND_API.G_TRUE THEN
621     QP_PREQ_GRP.engine_debug('loop index '||i);
622   END IF;
623   While i IS NOT NULL and QP_PREQ_GRP.G_service_line_ind_tbl(i) IS NOT NULL
624   LOOP
625     l_line_index := QP_PREQ_GRP.G_service_line_ind_tbl(i);
626     IF l_debug = FND_API.G_TRUE THEN
627       QP_PREQ_GRP.engine_debug('line_index of svc line: '||l_line_index);
628     END IF;--l_debug
629 
630     for cl in
631       (select line.line_index, ldet.line_detail_index,
632               ldet.created_from_list_line_id, ldet.modifier_level_code,
633               line.priced_quantity, line.parent_quantity, line.unit_price
634            from qp_npreq_lines_tmp line, qp_npreq_ldets_tmp ldet
635            where line.line_index = l_line_index
636            and line.pricing_status_code in (G_STATUS_NEW, G_STATUS_UPDATED)
637            and line.price_flag in (G_YES, G_PHASE)
638            and line.line_type_code = G_LINE_LEVEL
639            and ldet.line_index = line.line_index
640            and ldet.pricing_status_code in
641                (QP_PREQ_GRP.G_STATUS_NEW, G_STATUS_UNCHANGED)
642            and ldet.applied_flag = G_YES
643            and nvl(ldet.operand_calculation_code,
644              QP_PREQ_GRP.G_LUMPSUM_DISCOUNT) = QP_PREQ_GRP.G_LUMPSUM_DISCOUNT
645            and ldet.created_from_list_line_type in
646              ('DIS', 'SUR', 'PBH', 'FREIGHT_CHARGE')
647            and ldet.modifier_level_code in
648              (QP_PREQ_GRP.G_LINE_LEVEL, QP_PREQ_GRP.G_LINE_GROUP))
649     loop
650       IF l_debug = FND_API.G_TRUE THEN
651         QP_PREQ_GRP.engine_debug('line_dtl_index of lumpsum adj '
652           ||cl.line_detail_index||' list_line_id '||cl.created_from_list_line_id
653           ||' modlevel '||cl.modifier_level_code||' parent_qty '
654           ||cl.parent_quantity||' priced_qty '||cl.priced_quantity
655           ||' unit_price '||cl.unit_price);
656       END IF;--l_debug
657         QP_PREQ_GRP.G_service_line_qty_tbl(cl.line_index) :=
658                     cl.parent_quantity * cl.priced_quantity;
659       IF l_debug = FND_API.G_TRUE THEN
660         IF QP_PREQ_GRP.G_service_line_qty_tbl.exists(cl.line_index) THEN
661           QP_PREQ_GRP.engine_debug('service_qty of lumpsum adj '
662             ||QP_PREQ_GRP.G_service_line_qty_tbl(cl.line_index));
663         END IF;--QP_PREQ_GRP.G_service_line_qty_tbl
664       END IF;--l_debug
665 
666       --for linegroup modifiers, need to evaluate group lumpsum qty
667       IF cl.modifier_level_code = QP_PREQ_GRP.G_LINE_GROUP
668       THEN
669         IF l_lumpsum_qty.exists(cl.created_from_list_line_id) THEN
670             QP_PREQ_GRP.G_Service_ldet_qty_tbl(cl.line_detail_index) :=
671                   l_lumpsum_qty(cl.created_from_list_line_id);
672         ELSE--new list_line_id
673           BEGIN
674             --determine the volume attribute on the linegrp modifier
675             select attribute
676             into l_lgrp_vol_attr
677             from qp_npreq_line_attrs_tmp
678             where line_detail_index = cl.line_detail_index
679             and context = QP_PREQ_GRP.G_PRIC_VOLUME_CONTEXT;
680 
681             IF l_debug = FND_API.G_TRUE THEN
682               QP_PREQ_GRP.engine_debug('vol attr for linegrp modifier'
683               ||l_lgrp_vol_attr);
684             END IF;--l_debug
685           EXCEPTION
686           When OTHERS then
687             l_lgrp_vol_attr := NULL;
688             IF l_debug = FND_API.G_TRUE THEN
689               QP_PREQ_GRP.engine_debug('null vol attr for linegrp modifier');
690             END IF;--l_debug
691           END;
692             --initialize lumpsum_qty for list_line_id
693             l_lumpsum_qty(cl.created_from_list_line_id) := 0;
694             --loop thru all the occurences of the linegrp modifier
695             --to total the group quantity as volattrval * parent_qty
696             --for svc lines and volattrval for non-svc lines
697             --this lumpsum_qty will be used to prorate the lumpsum adj_amt
698             for cl1 in (select line.line_index, lattr.value_from,
699                              line.parent_quantity, ldet.line_detail_index
700                 from qp_npreq_ldets_tmp ldet,
701                    qp_npreq_lines_tmp line,
702                    qp_npreq_line_attrs_tmp lattr
703                 where ldet.created_from_list_line_id = cl.created_from_list_line_id
704                 and ldet.pricing_status_code = G_STATUS_NEW
705                 and ldet.applied_flag = G_YES
706                 and line.line_index = ldet.line_index
707                 and lattr.context = QP_PREQ_GRP.G_PRIC_VOLUME_CONTEXT
708                 and lattr.attribute = l_lgrp_vol_attr
709                 and lattr.line_index = line.line_index
710                 and lattr.line_detail_index is null)
711             loop
712               IF QP_PREQ_GRP.G_service_line_ind_tbl.exists(cl1.line_index) THEN
713               --this is a service line linegroup lumpsum
714                 l_lumpsum_qty(cl.created_from_list_line_id) :=
715                     l_lumpsum_qty(cl.created_from_list_line_id) +
716                     cl1.parent_quantity * cl1.value_from;
717               ELSE
718               --this is a non-service line linegroup lumpsum
719                 l_lumpsum_qty(cl.created_from_list_line_id) :=
720                     l_lumpsum_qty(cl.created_from_list_line_id) +
721                     cl1.value_from;
722               END IF;--QP_PREQ_GRP.G_service_line_ind_tbl.exists
723 
724               IF l_debug = FND_API.G_TRUE THEN
725                 QP_PREQ_GRP.engine_debug('lumpsum dtls for this pass '
726                 ||'llid '||cl.created_from_list_line_id
727                 ||' line_index '||cl1.line_index
728                 ||' dtl_index '||cl1.line_detail_index
729                 ||' parent_qty '||cl1.parent_quantity
730                 ||' vol_attr '||cl1.value_from
731                 ||' qty running total '
732                 ||l_lumpsum_qty(cl.created_from_list_line_id));
733               END IF;
734             end loop; --cl1
735             IF l_lgrp_vol_attr = G_LINE_AMT_ATTRIBUTE THEN
736               G_Service_pbh_lg_amt_qty(cl.line_detail_index) :=
737                      l_lumpsum_qty(cl.created_from_list_line_id)/cl.unit_price;
738               QP_PREQ_GRP.G_Service_ldet_qty_tbl(cl.line_detail_index) :=
739                      l_lumpsum_qty(cl.created_from_list_line_id);
740             ELSE
741               QP_PREQ_GRP.G_Service_ldet_qty_tbl(cl.line_detail_index) :=
742                      l_lumpsum_qty(cl.created_from_list_line_id);
743             END IF;
744             IF l_debug = FND_API.G_TRUE THEN
745               IF QP_PREQ_GRP.G_Service_ldet_qty_tbl.exists(cl.line_detail_index)
746               THEN
747                 QP_PREQ_GRP.engine_debug('linegrp lumpsum qty for list_line_id '
748                 ||cl.created_from_list_line_id||' dtl_index '
749                 ||cl.line_detail_index||' qty '
750                 ||QP_PREQ_GRP.G_Service_ldet_qty_tbl(cl.line_detail_index));
751               END IF;--QP_PREQ_GRP.G_Service_ldet_qty_tbl.exists
752             END IF;
753         END IF;--l_lumpsum_qty.exists
754       END IF;--cl.modifier_level_code
755     end loop;--cl
756   --go to next line
757   i := QP_PREQ_GRP.G_service_line_ind_tbl.next(i);
758   END LOOP;--while
759 
760 /*
761   for cl3 in (select sum(line.parent_quantity) lumpsum_qty
762               from qp_npreq_lines_tmp line
763 --qp_npreq_line_attrs_tmp ldetattr, qp_npreq_line_attrs_tmp lattr,
764               where ldetattr.line_index = cl.line_index
765               and line.priced_uom_code <> line.line_uom_code
766               and ldetattr.context = QP_PREQ_GRP.G_PRIC_VOLUME_CONTEXT
767               and ldetattr.line_detail_index = cl.line_detail_index
768               and lattr.line_index = cl.line_index
769               and lattr.context = QP_PREQ_GRP.G_PRIC_VOLUME_CONTEXT
770               and lattr.attribute = ldetattr.attribute
771               and exists (select 'Y'
772                           from qp_npreq_ldets_tmp ldet
773                           where ldet.created_from_list_line_id = cl.created_from_list_line_id
774                           and ldet.modifier_level_code = QP_PREQ_GRP.G_LINE_GROUP
775                           and ldet.pricing_status_code = QP_PREQ_GRP.G_STATUS_NEW))
776   loop
777     IF l_debug = FND_API.G_TRUE THEN
778       QP_PREQ_GRP.engine_debug('dtl_index '||cl.line_detail_index||' sum '||cl3.lumpsum_qty);
779     END IF;
780     QP_PREQ_GRP.G_Service_ldet_qty_tbl(cl.line_detail_index) := cl3.lumpsum_qty;
781   end loop; --cl3
782 */
783 EXCEPTION
784 When OTHERS Then
785   IF l_debug = FND_API.G_TRUE THEN
786     QP_PREQ_GRP.engine_debug('EXCEPTION Determine_svc_item_quantity');
787   END IF;
788   null;
789 END Determine_svc_item_quantity;
790 
791   PROCEDURE CALCULATE_BUCKET_PRICE(
792                                    p_list_line_type_code IN QP_LIST_LINES.LIST_LINE_TYPE_CODE%TYPE
793                                    , p_price IN NUMBER
794                                    , p_priced_quantity NUMBER := 1
795                                    , p_operand_calculation_code IN QP_LIST_LINES.ARITHMETIC_OPERATOR%TYPE
796                                    , p_operand_value IN NUMBER
797                                    , x_calc_adjustment OUT NOCOPY NUMBER
798                                    , x_return_status OUT NOCOPY VARCHAR2 --DEFAULT FND_API.G_RET_STS_SUCCESS
799                                    , x_return_status_text OUT NOCOPY VARCHAR2)
800   IS
801 
802   l_routine VARCHAR2(50) := 'QP_PREQ_PUB.CALCULATE_BUCKET_PRICE';
803   BEGIN
804     l_debug := QP_PREQ_GRP.G_DEBUG_ENGINE;
805     IF l_debug = FND_API.G_TRUE THEN
806       QP_PREQ_GRP.ENGINE_DEBUG('begin calculate bucket price qty'
807                                || p_priced_quantity ||' operator '|| p_operand_calculation_code);
808 
809     END IF;
810 
811 
812     IF p_operand_calculation_code = G_PERCENT_DISCOUNT
813       THEN
814       --fix for bug 2245528
815       --included abs function for -ve price to get right adj amt
816       -- Bug#3002549 reverted the fix done for bug 2245528
817       x_calc_adjustment := p_price * p_operand_value / 100;
818       IF l_debug = FND_API.G_TRUE THEN
819         QP_PREQ_GRP.ENGINE_DEBUG('calculate % price ' || x_calc_adjustment);
820       END IF;
821     ELSIF p_operand_calculation_code = G_AMOUNT_DISCOUNT
822       THEN
823       x_calc_adjustment := p_operand_value;
824       IF l_debug = FND_API.G_TRUE THEN
825         QP_PREQ_GRP.ENGINE_DEBUG('calculate amt price '|| x_calc_adjustment);
826       END IF;
827     ELSIF p_operand_calculation_code = G_NEWPRICE_DISCOUNT
828       THEN
829       --removed absolute value to account for negative newprice
830       --bug 2065609
831       x_calc_adjustment :=  - 1 * (p_price - (p_operand_value));
832       IF l_debug = FND_API.G_TRUE THEN
833         QP_PREQ_GRP.ENGINE_DEBUG('calculate newp price '|| x_calc_adjustment);
834       END IF;
835     ELSIF p_operand_calculation_code = G_LUMPSUM_DISCOUNT
836       THEN
837       --fix for bug 2394680 for zero list price qty can be 0
838       --in case of line group lumpsum based on item amount
839       -- [julin/4571612/4671446] explicitly set FND_API.G_NULL_NUM qty means infinity; this qty and zero qty yield no adj
840       IF (p_priced_quantity = FND_API.G_NULL_NUM or p_priced_quantity = 0) THEN
841         x_calc_adjustment := 0;
842       ELSE
843         x_calc_adjustment := p_operand_value / nvl(p_priced_quantity, 1);
844       END IF;
845       IF l_debug = FND_API.G_TRUE THEN
846         QP_PREQ_GRP.ENGINE_DEBUG('calculate lump price qty '
847                                  || p_priced_quantity || x_calc_adjustment);
848       END IF;
849     ELSE NULL;
850     END IF; --p_operand_calculation_code
851 
852     X_RETURN_STATUS := FND_API.G_RET_STS_SUCCESS;
853     X_RETURN_STATUS_TEXT := l_routine ||' SUCCESS';
854 
855 
856     x_calc_adjustment := nvl(x_calc_adjustment, 0);
857 
858 
859     IF l_debug = FND_API.G_TRUE THEN
860       QP_PREQ_GRP.ENGINE_DEBUG('end calculate bucket price: passed price '
861                                || p_price ||' passed_operand '|| p_operand_value ||
862                                ' calculated rounded adjustment  '|| x_calc_adjustment);
863 
864     END IF;
865   EXCEPTION
866     WHEN OTHERS THEN
867       IF l_debug = FND_API.G_TRUE THEN
868         QP_PREQ_GRP.ENGINE_DEBUG('Error in calculating bucket price '|| SQLERRM);
869       END IF;
870       x_return_status := FND_API.G_RET_STS_ERROR;
871       x_return_status_text := l_routine ||' '|| SQLERRM;
872   END CALCULATE_BUCKET_PRICE;
873 
874 
875   PROCEDURE BACK_CALCULATE_PRICE(p_operand_calculation_code IN VARCHAR2
876                                  , p_operand_value IN NUMBER
877                                  , p_applied_flag IN VARCHAR2
878                                  , p_amount_changed IN NUMBER
879                                  , p_adjustment_amount IN NUMBER
880                                  , p_priced_quantity IN NUMBER
881                                  , p_list_price IN NUMBER
882                                  , p_adjustment_type IN VARCHAR2
883                                  , x_adjustment_amount OUT NOCOPY NUMBER
884                                  , x_operand_value OUT NOCOPY NUMBER
885                                  , x_process_code OUT NOCOPY BOOLEAN
886                                  , x_return_status OUT NOCOPY VARCHAR2 --DEFAULT FND_API.G_RET_STS_SUCCESS
887                                  , x_return_status_text OUT NOCOPY VARCHAR2) IS --DEFAULT FND_API.G_RET_STS_SUCCESS) IS
888 
889   l_routine VARCHAR2(50) := 'QP_PREQ_PUB.BACK_CALCULATE_PRICE';
890   ZERO_LIST_PRICE EXCEPTION;
891 
892   BEGIN
893     l_debug := QP_PREQ_GRP.G_DEBUG_ENGINE;
894     IF l_debug = FND_API.G_TRUE THEN
895       QP_PREQ_GRP.ENGINE_DEBUG('start back calculate adjustment:
896                                adjustment type '|| p_adjustment_type ||
897                                ' amount changed passed '|| p_amount_changed ||
898                                ' price passed '|| p_list_price ||
899                                ' adjustment_amount_passed '|| p_adjustment_amount ||
900                                ' applied flag '|| p_applied_flag);
901 
902 
903 
904     END IF;
905     --do not check for applied_flag, bcoz we are passing effective
906     --amount_changed each time --for bug 2043442
907     x_adjustment_amount := p_amount_changed;
908 
909     IF p_operand_calculation_code = G_PERCENT_DISCOUNT THEN
910       IF p_list_price = 0 THEN
911         RAISE ZERO_LIST_PRICE;
912       END IF;
913       x_operand_value := ABS(x_adjustment_amount * 100 / p_list_price);
914     ELSIF p_operand_calculation_code = G_AMOUNT_DISCOUNT THEN
915       x_operand_value := ABS(x_adjustment_amount);
916     ELSIF p_operand_calculation_code = G_NEWPRICE_DISCOUNT THEN
917       x_operand_value := p_list_price + nvl(x_adjustment_amount, 0);
918     ELSIF p_operand_calculation_code = G_LUMPSUM_DISCOUNT THEN
919       x_operand_value := ABS(x_adjustment_amount) * p_priced_quantity;
920     END IF;
921 
922     IF l_debug = FND_API.G_TRUE THEN
923       QP_PREQ_GRP.ENGINE_DEBUG('adjustment amt calculated'
924                                || x_adjustment_amount);
925 
926     END IF;
927     IF p_adjustment_type = G_DISCOUNT AND (x_adjustment_amount <= 0
928                                            OR p_operand_calculation_code = G_NEWPRICE_DISCOUNT) THEN
929       IF l_debug = FND_API.G_TRUE THEN
930         QP_PREQ_GRP.ENGINE_DEBUG('Manual Adjustment is Discount '|| p_adjustment_type);
931       END IF;
932       x_process_code := TRUE;
933     ELSIF p_adjustment_type = G_SURCHARGE AND x_adjustment_amount >= 0 THEN
934       IF l_debug = FND_API.G_TRUE THEN
935         QP_PREQ_GRP.ENGINE_DEBUG('Manual Adjustment is Surcharge '|| p_adjustment_type);
936       END IF;
937       x_process_code := TRUE;
938     ELSE
939       IF l_debug = FND_API.G_TRUE THEN
940         QP_PREQ_GRP.ENGINE_DEBUG('Manual Adjustment is not DIS/SUR'|| p_adjustment_type);
941       END IF;
942       x_process_code := FALSE;
943     END IF;
944 
945 
946 
947     X_RETURN_STATUS := FND_API.G_RET_STS_SUCCESS;
948     X_RETURN_STATUS_TEXT := l_routine ||' SUCCESS';
949 
950 
951     IF l_debug = FND_API.G_TRUE THEN
952       QP_PREQ_GRP.ENGINE_DEBUG('end back calculate adjustment:
953                                adjustment amoutn calculated '|| x_adjustment_amount ||
954                                ' operand calculated '|| x_operand_value);
955 
956     END IF;
957   EXCEPTION
958     WHEN ZERO_LIST_PRICE THEN
959       IF l_debug = FND_API.G_TRUE THEN
960         QP_PREQ_GRP.ENGINE_DEBUG('exception back calculate adj '|| SQLERRM);
961       END IF;
962       x_return_status := FND_API.G_RET_STS_ERROR;
963       x_return_status_text := l_routine ||' '||'CANNOT OVERRIDE ZERO OR NULL LIST PRICE WITH % BASED ADJUSTMENT';
964     WHEN OTHERS THEN
965       IF l_debug = FND_API.G_TRUE THEN
966         QP_PREQ_GRP.ENGINE_DEBUG('exception back calculate adj '|| SQLERRM);
967       END IF;
968       x_return_status := FND_API.G_RET_STS_ERROR;
969       x_return_status_text := l_routine ||' '|| SQLERRM;
970 
971   END BACK_CALCULATE_PRICE;
972 
973   --this procedure is to calculate the unit_selling_price
974   --operand and adjustment_amount in ordered_qty
975   --the reason we do this is because when calling applications
976   --do this, the rounding is lost
977   --catchweight_qty is the quantity in catchweight pricing
978   --where user orders 1 Chicken and 1 chicken = 10 lbs
979   --the priced_qty is 10lbs and lineqty is 1 chicken
980   --the price of the chicken and adjustments are calculated based
981   --on priced_qty = 10 lbs
982   --at the time of shipping the actual weight of chicken might be
983   --12lbs, so they do not want to change the price at that point
984   --but display the unit_price in catchweight_qty
985   PROCEDURE GET_ORDERQTY_VALUES(p_ordered_qty IN NUMBER,
986                                 p_priced_qty IN NUMBER,
987                                 p_catchweight_qty IN NUMBER,
988                                 p_actual_order_qty IN NUMBER,
989                                 p_unit_price IN NUMBER DEFAULT NULL,
990                                 p_adjusted_unit_price IN NUMBER DEFAULT NULL,
991                                 p_line_unit_price IN NUMBER DEFAULT NULL,
992                                 p_operand IN NUMBER DEFAULT NULL,
993                                 p_adjustment_amt IN NUMBER DEFAULT NULL,
994                                 p_operand_calculation_code IN VARCHAR2 DEFAULT NULL,
995                                 p_input_type IN VARCHAR2,
996                                 x_ordqty_output1 OUT NOCOPY NUMBER,
997                                 x_ordqty_output2 OUT NOCOPY NUMBER,
998                                 x_return_status OUT NOCOPY VARCHAR2,
999                                 x_return_status_text OUT NOCOPY VARCHAR2) IS
1000   BEGIN
1001     --we need not treat null adj_unit_price or zero adj_unit_price
1002     --as adj_unit_price cannot be null and if it is zero, x_ordqty_selling_price
1003     --needs to be zero
1004     --we will default the null qty to 1 so that we can avoid divide_by_zero
1005 
1006     l_debug := QP_PREQ_GRP.G_DEBUG_ENGINE;
1007     x_return_status := FND_API.G_RET_STS_SUCCESS;
1008 
1009     IF l_debug = FND_API.G_TRUE THEN
1010       QP_PREQ_GRP.engine_debug('BEGIN GET_ORDERQTY_VALUES: line_qty '
1011                                || p_ordered_qty ||' priced_qty '|| p_priced_qty ||' catchwtqty '
1012                                || p_catchweight_qty || 'actual order qty ' || p_actual_order_qty || ' unitprice '
1013                                || p_unit_price ||' sellingprice '
1014                                || p_adjusted_unit_price ||' lineunitprice '|| p_line_unit_price
1015                                ||' operand '|| p_operand ||' operator '|| p_operand_calculation_code
1016                                ||' adjamt '|| p_adjustment_amt ||' inputtype '|| p_input_type);
1017     END IF;
1018 
1019     --this procedure will be called for every adjustment
1020     --but we need calculate G_ORDQTY_SELLING_PRICE only once
1021     --for each order line
1022     IF p_input_type = 'SELLING_PRICE' THEN
1023 
1024       /* x_ordqty_output2 := ((p_adjusted_unit_price * p_priced_qty / p_ordered_qty) *
1025   (nvl(p_catchweight_qty, p_ordered_qty) / p_ordered_qty)); */
1026 
1027       IF (p_catchweight_qty IS NOT NULL) THEN
1028         --line_unit_price
1029         x_ordqty_output1 := (p_unit_price * (p_priced_qty / p_actual_order_qty) * (p_catchweight_qty / p_ordered_qty));
1030         --order_uom_selling_price
1031         x_ordqty_output2 := (p_adjusted_unit_price * (p_priced_qty / p_actual_order_qty) * (p_catchweight_qty / p_ordered_qty));
1032       ELSIF (p_actual_order_qty IS NOT NULL) THEN
1033         --line_unit_price
1034         x_ordqty_output1 := (p_unit_price * (p_priced_qty / p_actual_order_qty));
1035         --order_uom_selling_price
1036         x_ordqty_output2 := (p_adjusted_unit_price * (p_priced_qty / p_actual_order_qty));
1037       ELSE
1038         --line_unit_price
1039         --    x_ordqty_output1 := p_line_unit_price;
1040         --    x_ordqty_output1 := (p_unit_price * (p_priced_qty / p_ordered_qty));
1041         -- bug 3006661 for OC
1042         x_ordqty_output1 := (p_unit_price * (nvl(p_priced_qty, p_ordered_qty) / p_ordered_qty));
1043         --order_uom_selling_price
1044         --    x_ordqty_output2 := (p_adjusted_unit_price * (p_priced_qty/p_ordered_qty));
1045         -- bug 3006661 for OC
1046         x_ordqty_output2 := (p_adjusted_unit_price * (nvl(p_priced_qty, p_ordered_qty) / p_ordered_qty));
1047       END IF;
1048 
1049       /* IF p_catchweight_qty IS NOT NULL THEN
1050     x_ordqty_output1 := ((p_unit_price * p_priced_qty / p_ordered_qty) *
1051       (nvl(p_catchweight_qty, p_ordered_qty) / p_ordered_qty));
1052   ELSE
1053     x_ordqty_output1 := p_line_unit_price;
1054   END IF;--p_catchweight_qty */
1055 
1056 
1057     ELSE --input_type is OPERAND
1058       IF p_operand_calculation_code IN (G_PERCENT_DISCOUNT, G_LUMPSUM_DISCOUNT) THEN
1059         --x_ordqty_operand same as operand for % and LUMPSUM based modifiers
1060         x_ordqty_output1 := p_operand;
1061       ELSE
1062         -- Ravi
1063         /*x_ordqty_output1 := ((p_unit_price * p_priced_qty / p_ordered_qty) *
1064       (nvl(p_catchweight_qty, p_ordered_qty) / p_ordered_qty));*/
1065         /* x_ordqty_output1 := ((p_operand * p_priced_qty / p_ordered_qty) *
1066       (nvl(p_catchweight_qty, p_ordered_qty) / p_ordered_qty)); */
1067 
1068         IF (p_catchweight_qty IS NOT NULL) THEN
1069           x_ordqty_output1 := (p_operand * (p_priced_qty / p_actual_order_qty) * (p_catchweight_qty / p_ordered_qty));
1070         ELSIF (p_actual_order_qty IS NOT NULL) THEN
1071           x_ordqty_output1 := (p_operand * (p_priced_qty / p_actual_order_qty));
1072         ELSE
1073           -- x_ordqty_output1 := (p_operand * (p_priced_qty/p_ordered_qty));
1074           -- bug 3006661 for OC
1075           x_ordqty_output1 := (p_operand * (nvl(p_priced_qty, p_ordered_qty) / p_ordered_qty));
1076         END IF;
1077 
1078       END IF; --p_operand_calculation_code
1079 
1080       -- Ravi
1081       /*x_ordqty_output2 := ((p_unit_price * p_priced_qty / p_ordered_qty) *
1082     (nvl(p_catchweight_qty, p_ordered_qty) / p_ordered_qty));*/
1083       /* x_ordqty_output2 := ((p_adjustment_amt * p_priced_qty / p_ordered_qty) *
1084     (nvl(p_catchweight_qty, p_ordered_qty) / p_ordered_qty)); */
1085 
1086       IF (p_catchweight_qty IS NOT NULL) THEN
1087         x_ordqty_output2 := (p_adjustment_amt * (p_priced_qty / p_actual_order_qty) * (p_catchweight_qty / p_ordered_qty));
1088       ELSIF (p_actual_order_qty IS NOT NULL) THEN
1089         x_ordqty_output2 := (p_adjustment_amt * (p_priced_qty / p_actual_order_qty));
1090       ELSE
1091         -- x_ordqty_output2 := (p_adjustment_amt * (p_priced_qty/p_ordered_qty));
1092         -- bug 3006661 for OC
1093         x_ordqty_output2 := (p_adjustment_amt * (nvl(p_priced_qty, p_ordered_qty) / p_ordered_qty));
1094       END IF;
1095 
1096     END IF; --p_input_type
1097 
1098     IF l_debug = FND_API.G_TRUE THEN
1099       QP_PREQ_GRP.engine_debug('Output GET_ORDERQTY_VALUES '||'output1 '
1100                                || x_ordqty_output1 ||' output2 '|| x_ordqty_output2);
1101     END IF; --l_debug
1102 
1103     x_return_status := FND_API.G_RET_STS_SUCCESS;
1104 
1105   EXCEPTION
1106     WHEN OTHERS THEN
1107       IF l_debug = FND_API.G_TRUE THEN
1108         QP_PREQ_GRP.engine_debug('Exception in GET_ORDERQTY_VALUES '|| SQLERRM);
1109       END IF; --l_debug
1110       x_ordqty_output1 := 0;
1111       x_ordqty_output2 := 0;
1112       x_return_status := FND_API.G_RET_STS_ERROR;
1113   END GET_ORDERQTY_VALUES;
1114 
1115   --This procedure is to update the order_qty_adj_amt and order_qty_operand
1116   --on manual adjustments which do not go through calculation cursor
1117   --as they are not applied
1118   --fix for bug 2816262 where order_qty_operand is not populated for
1119   --manual adjustments are they do not go thru calculation
1120   PROCEDURE Update_Adj_orderqty_cols(x_return_status OUT NOCOPY VARCHAR2,
1121                                      x_return_status_text OUT NOCOPY VARCHAR2) IS
1122   --[julin/pbperf] tuned to use QP_PREQ_LDETS_TMP_N2
1123   CURSOR l_update_adj_cur IS
1124     SELECT /*+ ORDERED index(ldet QP_PREQ_LDETS_TMP_N2) */ ldet.line_detail_index,
1125            ldet.operand_value,
1126            ldet.operand_calculation_code,
1127            ldet.modifier_level_code,
1128            nvl(ldet.line_quantity, line.priced_quantity) priced_qty,
1129            line.actual_order_quantity actual_order_qty,
1130            line.catchweight_qty,
1131            line.line_quantity ordered_qty
1132     --       line.unit_price,
1133     --       line.adjusted_unit_price
1134     FROM qp_npreq_ldets_tmp ldet,
1135          qp_npreq_lines_tmp line
1136     WHERE ldet.pricing_phase_id > 1
1137     AND ldet.pricing_status_code = G_STATUS_NEW
1138     AND ldet.automatic_flag = G_NO
1139     AND nvl(ldet.applied_flag, G_NO) = G_NO
1140     AND nvl(ldet.updated_flag, G_NO) = G_NO
1141     AND line.line_index = ldet.line_index;
1142 
1143   l_ordqty_line_dtl_index QP_PREQ_GRP.NUMBER_TYPE;
1144   l_ordqty_operand QP_PREQ_GRP.NUMBER_TYPE;
1145   l_ordqty_operator QP_PREQ_GRP.VARCHAR_TYPE;
1146   l_ordqty_mod_lvl QP_PREQ_GRP.VARCHAR_TYPE;
1147   l_ordqty_priced_qty QP_PREQ_GRP.NUMBER_TYPE;
1148   l_ordqty_actual_order_qty QP_PREQ_GRP.NUMBER_TYPE;
1149   l_ordqty_catchweight_qty QP_PREQ_GRP.NUMBER_TYPE;
1150   l_ordqty_ordered_qty QP_PREQ_GRP.NUMBER_TYPE;
1151   l_ordqty_ord_qty_operand QP_PREQ_GRP.NUMBER_TYPE;
1152 
1153   l_dummy NUMBER;
1154   BEGIN
1155     --initialise
1156     l_debug := QP_PREQ_GRP.G_DEBUG_ENGINE;
1157 
1158     IF (l_debug = FND_API.G_TRUE) THEN
1159       QP_PREQ_GRP.engine_debug('Begin Update_Adj_orderqty_cols');
1160     END IF; --l_debug
1161 
1162     OPEN l_update_adj_cur;
1163     l_ordqty_line_dtl_index.DELETE;
1164     l_ordqty_operand.DELETE;
1165     l_ordqty_operator.DELETE;
1166     l_ordqty_mod_lvl.DELETE;
1167     l_ordqty_priced_qty.DELETE;
1168     l_ordqty_actual_order_qty.DELETE;
1169     l_ordqty_catchweight_qty.DELETE;
1170     l_ordqty_ordered_qty.DELETE;
1171     l_ordqty_ord_qty_operand.DELETE;
1172     FETCH l_update_adj_cur BULK COLLECT INTO
1173     l_ordqty_line_dtl_index,
1174     l_ordqty_operand,
1175     l_ordqty_operator,
1176     l_ordqty_mod_lvl,
1177     l_ordqty_priced_qty,
1178     l_ordqty_actual_order_qty,
1179     l_ordqty_catchweight_qty,
1180     l_ordqty_ordered_qty;
1181     CLOSE l_update_adj_cur;
1182 
1183     IF (l_debug = FND_API.G_TRUE) THEN
1184       QP_PREQ_GRP.engine_debug('After cur Update_Adj_orderqty_cols');
1185     END IF; --l_debug
1186 
1187     IF l_ordqty_line_dtl_index.COUNT > 0 THEN
1188       FOR i IN l_ordqty_line_dtl_index.FIRST..l_ordqty_line_dtl_index.LAST
1189         LOOP
1190         IF (l_ordqty_ordered_qty(i) <> 0 OR l_ordqty_mod_lvl(i) = G_ORDER_LEVEL) THEN
1191           IF (l_debug = FND_API.G_TRUE) THEN
1192             QP_PREQ_GRP.engine_debug('Before GET_ORDERQTY_VALUES #5');
1193           END IF;
1194 
1195           GET_ORDERQTY_VALUES(p_ordered_qty => l_ordqty_ordered_qty(i),
1196                               p_priced_qty => l_ordqty_priced_qty(i),
1197                               p_catchweight_qty => l_ordqty_catchweight_qty(i),
1198                               p_actual_order_qty => l_ordqty_actual_order_qty(i),
1199                               p_operand => l_ordqty_operand(i),
1200                               p_adjustment_amt => 0,  --we do not need this
1201                               --    p_unit_price => l_adj_tbl(j).unit_price,
1202                               --    p_adjusted_unit_price => l_sub_total_price,
1203                               p_operand_calculation_code => l_ordqty_operator(i),
1204                               p_input_type => 'OPERAND',
1205                               x_ordqty_output1 => l_ordqty_ord_qty_operand(i),
1206                               x_ordqty_output2 => l_dummy,
1207                               x_return_status => x_return_status,
1208                               x_return_status_text => x_return_status_text);
1209         ELSE --l_ordqty_ordered_qty
1210           IF l_debug = FND_API.G_TRUE THEN
1211             QP_PREQ_GRP.engine_debug('Ordered Qty #5: '|| l_ordqty_ordered_qty(i));
1212             QP_PREQ_GRP.engine_debug('OPERAND Ordered Qty=0 or modlvlcode <> ORDER');
1213           END IF; --l_debug
1214           l_ordqty_ord_qty_operand(i) := 0;
1215         END IF; --l_ordqty_ordered_qty
1216       END LOOP; --i
1217     END IF; --l_ordqty_line_dtl_index
1218 
1219     IF l_ordqty_line_dtl_index.COUNT > 0 THEN
1220       IF l_debug = FND_API.G_TRUE THEN
1221         FOR j IN l_ordqty_line_dtl_index.FIRST..l_ordqty_line_dtl_index.LAST
1222           LOOP
1223           QP_PREQ_GRP.engine_debug('Ordqty update line_dtl_index '
1224                                    || l_ordqty_line_dtl_index(j) ||' ordqty_operand '
1225                                    || l_ordqty_ord_qty_operand(j));
1226         END LOOP; --j
1227       END IF; --l_debug
1228 
1229       FORALL i IN l_ordqty_line_dtl_index.FIRST..l_ordqty_line_dtl_index.LAST
1230       UPDATE qp_npreq_ldets_tmp SET order_qty_operand = l_ordqty_ord_qty_operand(i)
1231       WHERE line_detail_index = l_ordqty_line_dtl_index(i);
1232     END IF; --l_ordqty_line_dtl_index.COUNT
1233 
1234     IF (l_debug = FND_API.G_TRUE) THEN
1235       QP_PREQ_GRP.engine_debug('End Update_Adj_orderqty_cols');
1236     END IF; --l_debug
1237 
1238   EXCEPTION
1239     WHEN OTHERS THEN
1240       IF l_debug = FND_API.G_TRUE THEN
1241         QP_PREQ_GRP.engine_debug('Exception in Update_Adj_orderqty_cols '|| SQLERRM);
1242       END IF; --l_debug
1243       x_return_status := FND_API.G_RET_STS_ERROR;
1244       x_return_status_text := 'Exception in Update_Adj_orderqty_cols '|| SQLERRM;
1245   END Update_Adj_orderqty_cols;
1246 
1247   --For bug 2447181 for changed lines functionality
1248   --to indicate to the calling application to make a subsequent pricing
1249   --call with calculate_only and to pass all lines when they are calling
1250   --with changed lines in case there are new/changed order level modifiers
1251   --this will be indicated in processed_flag = 'C' in qp_npreq_lines_tmp
1252   --on the summary linE
1253   PROCEDURE CHECK_ORDER_LINE_CHANGES(p_request_type_code IN VARCHAR2,
1254                                      p_full_pricing_call IN VARCHAR2,
1255                                      x_return_status OUT NOCOPY VARCHAR2,
1256                                      x_return_status_text OUT NOCOPY VARCHAR2) IS
1257 
1258   l_routine VARCHAR2(100) := 'QP_PREQ_PUB.CHECK_ORDER_LINE_CHANGES';
1259 
1260   l_exist_changed_order_adj VARCHAR2(1) := G_NO;
1261   l_header_id NUMBER;
1262   l_ldet_sum_operand NUMBER := 0;
1263   l_adj_sum_operand NUMBER := 0;
1264   BEGIN
1265 
1266     --initialise
1267     l_debug := QP_PREQ_GRP.G_DEBUG_ENGINE;
1268     l_header_id := NULL;
1269     l_exist_changed_order_adj := G_NO;
1270 
1271     IF l_debug = FND_API.G_TRUE THEN
1272       QP_PREQ_GRP.engine_debug('Begin Check_order_lines_change: chk_cust '
1273                                || G_CHECK_CUST_VIEW_FLAG ||' full_pricing_call '|| p_full_pricing_call);
1274 
1275     END IF;
1276     --do this only if caller has passed changed lines
1277     --IF p_request_type_code = 'ONT'
1278     --bug 3085453 handle pricing availability UI
1279     -- they pass reqtype ONT and insert adj into ldets
1280     IF QP_PREQ_PUB.G_CHECK_CUST_VIEW_FLAG = G_YES
1281       AND p_full_pricing_call = G_NO
1282       THEN
1283       --this is for OM/OC direct insert performance code path
1284       --there cannot be manual adjustments on the order header
1285 
1286       IF l_debug = FND_API.G_TRUE THEN
1287         QP_PREQ_GRP.engine_debug('starting order line check ');
1288       END IF;
1289       BEGIN
1290         SELECT line_id INTO l_header_id
1291         FROM qp_npreq_lines_tmp
1292         WHERE line_type_code = G_ORDER_LEVEL
1293         AND pricing_status_code IN (G_STATUS_UPDATED,
1294                                     G_STATUS_UNCHANGED, G_STATUS_GSA_VIOLATION);
1295       EXCEPTION
1296         WHEN OTHERS THEN
1297           l_header_id := NULL;
1298       END;
1299 
1300       IF l_debug = FND_API.G_TRUE THEN
1301         QP_PREQ_GRP.engine_debug('checking header id '|| l_header_id);
1302 
1303       END IF;
1304       IF l_header_id IS NOT NULL THEN
1305         BEGIN
1306           SELECT G_YES INTO l_exist_changed_order_adj
1307           FROM qp_npreq_ldets_tmp ldet
1308           WHERE ldet.process_code IN (G_STATUS_UPDATED, G_STATUS_NEW)
1309           AND ldet.pricing_status_code = G_STATUS_NEW
1310           AND ldet.modifier_level_code = G_ORDER_LEVEL
1311           AND ldet.applied_flag = G_YES;
1312         EXCEPTION
1313           WHEN OTHERS THEN
1314             l_exist_changed_order_adj := G_NO;
1315         END;
1316       ELSE --l_header_id
1317         l_exist_changed_order_adj := G_NO;
1318       END IF; --l_header_id
1319 
1320       IF l_debug = FND_API.G_TRUE THEN
1321         QP_PREQ_GRP.engine_debug('there are header adj changes '
1322                                  || l_exist_changed_order_adj);
1323 
1324       END IF;
1325       --do this only if the header does not have error status
1326       --and there are new or updated summary level automatic adjustments
1327       --	IF l_header_id is not null
1328       IF l_exist_changed_order_adj = G_YES
1329         THEN
1330         IF l_debug = FND_API.G_TRUE THEN
1331           QP_PREQ_GRP.engine_debug('checking header adj operand changes');
1332         END IF;
1333         BEGIN
1334           SELECT SUM(operand_value) INTO l_ldet_sum_operand
1335           FROM qp_npreq_ldets_tmp ldet
1336           WHERE ldet.modifier_level_code = G_ORDER_LEVEL
1337           AND ldet.pricing_status_code = G_STATUS_NEW
1338           AND ldet.automatic_flag = G_YES
1339           AND applied_flag = G_YES;
1340         EXCEPTION
1341           WHEN OTHERS THEN
1342             l_ldet_sum_operand := 0;
1343         END;
1344 
1345         l_adj_sum_operand :=
1346         QP_CLEANUP_ADJUSTMENTS_PVT.get_sum_operand(l_header_id);
1347 
1348         IF l_debug = FND_API.G_TRUE THEN
1349           QP_PREQ_GRP.engine_debug('ldet header adj sum operand '
1350                                    || l_ldet_sum_operand);
1351           QP_PREQ_GRP.engine_debug('oe_price_adj header adj sum operand '
1352                                    || l_adj_sum_operand);
1353         END IF;
1354         --only if there is a change in the operand from previous
1355         --call, we need to recalculate
1356         --it is OK to sumup operand as order level adj is % based
1357         --so find out the sum from prev call and current call
1358         IF l_ldet_sum_operand <> l_adj_sum_operand
1359           THEN
1360           --order level modifiers are mostly % based
1361           -- so if the total % of order level modifiers do not match
1362           --then caller needs to recalculate
1363           UPDATE qp_npreq_lines_tmp SET
1364                   processed_flag = G_CALCULATE_ONLY
1365                   WHERE line_type_code = G_ORDER_LEVEL;
1366         END IF;
1367       END IF; --l_exist_changed_order_adj
1368       --ELSIF p_request_type_code <> 'ONT'
1369       --bug 3085453 handle pricing availability UI
1370       -- they pass reqtype ONT and insert adj into ldets
1371     ELSIF QP_PREQ_PUB.G_CHECK_CUST_VIEW_FLAG <> G_YES
1372       AND p_full_pricing_call = G_NO THEN
1373       --this is for non-OM calling applications
1374       IF l_debug = FND_API.G_TRUE THEN
1375         QP_PREQ_GRP.engine_debug('starting order line check ');
1376       END IF;
1377       --check if there is a summary line passed and it has no errors
1378       BEGIN
1379         SELECT line_id INTO l_header_id
1380         FROM qp_npreq_lines_tmp
1381         WHERE line_type_code = G_ORDER_LEVEL
1382         AND pricing_status_code IN (G_STATUS_UPDATED,
1383                                     G_STATUS_UNCHANGED, G_STATUS_GSA_VIOLATION);
1384       EXCEPTION
1385         WHEN OTHERS THEN
1386           l_header_id := NULL;
1387       END;
1388 
1389       IF l_debug = FND_API.G_TRUE THEN
1390         QP_PREQ_GRP.engine_debug('checking header id '|| l_header_id);
1391       END IF;
1392       --if there is a summary line, make sure there are applied adj against it
1393       IF l_header_id IS NOT NULL THEN
1394         BEGIN
1395           SELECT G_YES INTO l_exist_changed_order_adj
1396           FROM qp_npreq_ldets_tmp ldet
1397           WHERE ldet.pricing_status_code = G_STATUS_NEW
1398           AND ldet.modifier_level_code = G_ORDER_LEVEL
1399           AND ldet.applied_flag = G_YES;
1400         EXCEPTION
1401           WHEN OTHERS THEN
1402             l_exist_changed_order_adj := G_NO;
1403         END;
1404       ELSE --l_header_id
1405         l_exist_changed_order_adj := G_NO;
1406       END IF; --l_header_id
1407 
1408       IF l_debug = FND_API.G_TRUE THEN
1409         QP_PREQ_GRP.engine_debug('there are header adj changes '
1410                                  || l_exist_changed_order_adj);
1411       END IF;
1412       --do this only if the header does not have error status
1413       --and there are new or updated summary level automatic adjustments
1414       --	IF l_header_id is not null
1415       IF l_exist_changed_order_adj = G_YES
1416         THEN
1417         IF l_debug = FND_API.G_TRUE THEN
1418           QP_PREQ_GRP.engine_debug('checking header adj operand changes');
1419         END IF;
1420         BEGIN
1421           SELECT SUM(operand_value) INTO l_ldet_sum_operand
1422           FROM qp_npreq_ldets_tmp ldet
1423           WHERE ldet.modifier_level_code = G_ORDER_LEVEL
1424           AND ldet.pricing_status_code = G_STATUS_NEW
1425           AND ldet.automatic_flag = G_YES
1426           AND applied_flag = G_YES;
1427         EXCEPTION
1428           WHEN OTHERS THEN
1429             l_ldet_sum_operand := 0;
1430         END;
1431 
1432         BEGIN
1433           SELECT SUM(operand_value) INTO l_adj_sum_operand
1434           FROM qp_npreq_ldets_tmp ldet
1435           WHERE ldet.modifier_level_code = G_ORDER_LEVEL
1436           AND ldet.pricing_status_code = G_STATUS_UNCHANGED
1437           AND ldet.automatic_flag = G_YES
1438           AND applied_flag = G_YES;
1439         EXCEPTION
1440           WHEN OTHERS THEN
1441             l_adj_sum_operand := 0;
1442         END;
1443 
1444         IF l_debug = FND_API.G_TRUE THEN
1445           QP_PREQ_GRP.engine_debug('ldet header adj sum operand '
1446                                    || l_ldet_sum_operand);
1447           QP_PREQ_GRP.engine_debug('oe_price_adj header adj sum operand '
1448                                    || l_adj_sum_operand);
1449         END IF; --l_debug
1450         --only if there is a change in the operand from previous
1451         --call, we need to recalculate
1452         --it is OK to sumup operand as order level adj is % based
1453         --so find out the sum from prev call and current call
1454         IF l_ldet_sum_operand <> l_adj_sum_operand
1455           THEN
1456           --order level modifiers are mostly % based
1457           -- so if the total % of order level modifiers do not match
1458           --then caller needs to recalculate
1459           UPDATE qp_npreq_lines_tmp SET
1460                   processed_flag = G_CALCULATE_ONLY
1461                   WHERE line_type_code = G_ORDER_LEVEL;
1462         END IF; --l_ldet_sum_operand
1463       END IF; --l_exist_changed_order_adj
1464     ELSE
1465       --the p_full_pricing_call is 'Y'
1466       IF l_debug = FND_API.G_TRUE THEN
1467         QP_PREQ_GRP.engine_debug('no change header adj');
1468       END IF;
1469     END IF; --p_request_type_code
1470     x_return_status := FND_API.G_RET_STS_SUCCESS;
1471 
1472   EXCEPTION
1473     WHEN OTHERS THEN
1474       x_return_status := FND_API.G_RET_STS_ERROR;
1475       x_return_status_text := l_routine ||' '|| SQLERRM;
1476       IF l_debug = FND_API.G_TRUE THEN
1477         QP_PREQ_GRP.ENGINE_DEBUG(x_return_status_text);
1478       END IF;
1479   END CHECK_ORDER_LINE_CHANGES;
1480 
1481   /*
1482      --Preinsert Logic for OM call
1483      --to fetch out-of-phases modifiers and in-phase PRG modifiers
1484      --to fetch rltd information
1485 */
1486   PROCEDURE INT_TABLES_PREINSERT(p_calculate_flag IN VARCHAR2,
1487                                  p_event_code IN VARCHAR2,
1488                                  x_return_status OUT NOCOPY VARCHAR2,
1489                                  x_return_status_text OUT NOCOPY VARCHAR2) IS
1490   CURSOR l_ldets_cur IS
1491     SELECT /*+ ORDERED USE_NL(adj qplh) */
1492               adj.price_adjustment_id line_detail_index
1493             , adj.list_line_type_code line_detail_type_code
1494             , adj.price_break_type_code
1495             , NULL list_price
1496             , line.line_index
1497             , adj.list_header_id created_from_list_header_id
1498             , adj.list_line_id created_from_list_line_id
1499             , adj.list_line_type_code created_from_list_line_type
1500             , '' created_from_list_type_code
1501             , NULL CREATED_FROM_SQL
1502             , adj.pricing_group_sequence
1503             , adj.pricing_phase_id
1504             , adj.arithmetic_operator operand_calculation_code
1505             , nvl(adj.operand_per_pqty, adj.operand) operand_value
1506             , NULL SUBSTITUTION_TYPE_CODE
1507             , NULL SUBSTITUTION_VALUE_FROM
1508             , NULL SUBSTITUTION_VALUE_TO
1509             , NULL ASK_FOR_FLAG
1510             , NULL PRICE_FORMULA_ID
1511             , 'N' pricing_status_code
1512             , ' ' pricing_status_text
1513             , NULL PRODUCT_PRECEDENCE
1514             , NULL INCOMPATABILITY_GRP_CODE
1515             , NULL PROCESSED_FLAG
1516             , adj.applied_flag
1517             , adj.automatic_flag
1518             , adj.update_allowed override_flag
1519             , NULL PRIMARY_UOM_FLAG
1520             , NULL PRINT_ON_INVOICE_FLAG
1521             , adj.modifier_level_code
1522             , adj.BENEFIT_QTY
1523             , adj.BENEFIT_UOM_CODE
1524             , adj.LIST_LINE_NO
1525             , adj.accrual_flag
1526             , adj.ACCRUAL_CONVERSION_RATE
1527             , NULL ESTIM_ACCRUAL_RATE
1528             , NULL RECURRING_FLAG
1529             , NULL SELECTED_VOLUME_ATTR
1530             , line.rounding_factor
1531             , NULL HEADER_LIMIT_EXISTS
1532             , NULL LINE_LIMIT_EXISTS
1533             , adj.charge_type_code
1534             , adj.charge_subtype_code
1535             , NULL CURRENCY_DETAIL_ID
1536             , NULL CURRENCY_HEADER_ID
1537             , NULL SELLING_ROUNDING_FACTOR
1538             , NULL ORDER_CURRENCY
1539             , NULL PRICING_EFFECTIVE_DATE
1540             , NULL BASE_CURRENCY_CODE
1541             --, line.line_quantity
1542             , adj.range_break_quantity line_quantity
1543             , nvl(adj.updated_flag, QP_PREQ_PUB.G_NO) updated_flag
1544             , NULL calculation_code
1545             , adj.CHANGE_REASON_CODE
1546             , adj.CHANGE_REASON_TEXT
1547             , adj.PRICE_ADJUSTMENT_ID
1548             , NULL ACCUM_CONTEXT
1549             , NULL ACCUM_ATTRIBUTE
1550             , NULL ACCUM_FLAG
1551             , NULL BREAK_UOM_CODE
1552             , NULL BREAK_UOM_CONTEXT
1553             , NULL BREAK_UOM_ATTRIBUTE
1554             , NULL PROCESS_CODE -- 3215497
1555     FROM qp_int_lines line, oe_price_adjustments adj,
1556             qp_list_headers_b qplh
1557     WHERE QP_PREQ_PUB.G_CHECK_CUST_VIEW_FLAG = QP_PREQ_PUB.G_YES
1558             AND line.process_status IN (QP_PREQ_PUB.G_STATUS_UPDATED,
1559                                         QP_PREQ_PUB.G_STATUS_NEW,
1560                                         QP_PREQ_PUB.G_STATUS_UNCHANGED,
1561                                         'NEW' || QP_PREQ_PUB.G_STATUS_UNCHANGED,
1562                                         'OLD' || QP_PREQ_PUB.G_STATUS_UNCHANGED)
1563             AND adj.line_id = line.line_id
1564             AND line.pricing_status_code IN (QP_PREQ_PUB.G_STATUS_UPDATED
1565                                              , QP_PREQ_PUB.G_STATUS_GSA_VIOLATION
1566                                              , QP_PREQ_PUB.G_STATUS_UNCHANGED)
1567             AND (line.price_flag IN (QP_PREQ_PUB.G_YES, QP_PREQ_PUB.G_PHASE, QP_PREQ_PUB.G_CALCULATE_ONLY)
1568                  OR nvl(line.processed_code, '0') = QP_PREQ_PUB.G_BY_ENGINE)
1569             AND line.line_type_code = QP_PREQ_PUB.G_LINE_LEVEL
1570             AND (adj.updated_flag = QP_PREQ_PUB.G_YES
1571                  OR line.price_flag = QP_PREQ_PUB.G_CALCULATE_ONLY
1572                  OR (p_event_code IS NULL AND adj.updated_flag IS NULL)
1573                  OR (adj.list_line_type_code = 'PRG'
1574                      AND  adj.pricing_phase_id IN (SELECT ph.pricing_phase_id
1575                                                    FROM qp_event_phases ev, qp_pricing_phases ph
1576                                                    WHERE ph.pricing_phase_id = ev.pricing_phase_id
1577                                                    AND ((QP_PREQ_PUB.G_GET_FREIGHT_FLAG = QP_PREQ_PUB.G_YES
1578                                                          AND ph.freight_exists = QP_PREQ_PUB.G_YES)
1579                                                         OR (QP_PREQ_PUB.G_GET_FREIGHT_FLAG = QP_PREQ_PUB.G_NO))
1580                                                    AND instr(p_event_code, ev.pricing_event_code || ',') > 0
1581                                                    --and (nvl(QP_PREQ_PUB.Get_buy_line_price_flag(adj.line_detail_index),line.price_flag) = QP_PREQ_PUB.G_YES
1582                                                    --or (nvl(QP_PREQ_PUB.Get_buy_line_price_flag(adj.line_detail_index),line.price_flag) = QP_PREQ_PUB.G_PHASE
1583                                                    AND (line.price_flag = QP_PREQ_PUB.G_YES
1584                                                         OR (line.price_flag = QP_PREQ_PUB.G_PHASE
1585                                                             AND nvl(ph.user_freeze_override_flag, ph.freeze_override_flag) = QP_PREQ_PUB.G_YES))))
1586                  OR adj.pricing_phase_id NOT IN (SELECT ph.pricing_phase_id
1587                                                  FROM qp_event_phases ev, qp_pricing_phases ph
1588                                                  WHERE ph.pricing_phase_id = ev.pricing_phase_id
1589                                                  AND ((QP_PREQ_PUB.G_GET_FREIGHT_FLAG = QP_PREQ_PUB.G_YES
1590                                                        AND ph.freight_exists = QP_PREQ_PUB.G_YES)
1591                                                       OR (QP_PREQ_PUB.G_GET_FREIGHT_FLAG = QP_PREQ_PUB.G_NO))
1592                                                  AND instr(p_event_code, ev.pricing_event_code || ',') > 0
1593                                                  --and (nvl(QP_PREQ_PUB.Get_buy_line_price_flag(adj.line_detail_index,line.price_flag) = QP_PREQ_PUB.G_YES
1594                                                  --or (nvl(QP_PREQ_PUB.Get_buy_line_price_flag(adj.line_detail_index),line.price_flag) = QP_PREQ_PUB.G_PHASE
1595                                                  AND (line.price_flag = QP_PREQ_PUB.G_YES
1596                                                       OR (line.price_flag = QP_PREQ_PUB.G_PHASE
1597                                                           AND nvl(ph.user_freeze_override_flag, ph.freeze_override_flag) =
1598                                                           QP_PREQ_PUB.G_YES))))
1599             AND adj.modifier_level_code IN (QP_PREQ_PUB.G_LINE_LEVEL, QP_PREQ_PUB.G_LINE_GROUP)
1600           AND qplh.list_header_id = adj.list_header_id
1601           AND qplh.list_type_code NOT IN (QP_PREQ_PUB.G_PRICE_LIST_HEADER,
1602                                           QP_PREQ_PUB.G_AGR_LIST_HEADER)
1603           --commented out because we want to fetch PBH childs and PRG freeline adjs
1604           --and not exists (select 'x'
1605           --                from  oe_price_adj_assocs a
1606           --                where a.RLTD_PRICE_ADJ_ID = adj.price_adjustment_id)
1607     UNION ALL
1608     SELECT /*+ ORDERED USE_NL(adj qplh) */
1609               adj.price_adjustment_id line_detail_index
1610             , adj.list_line_type_code line_detail_type_code
1611             , adj.price_break_type_code
1612             , NULL list_price
1613             , line.line_index
1614             , adj.list_header_id created_from_list_header_id
1615             , adj.list_line_id created_from_list_line_id
1616             , adj.list_line_type_code created_from_list_line_type
1617             , '' created_from_list_type_code
1618             , NULL CREATED_FROM_SQL
1619             , adj.pricing_group_sequence
1620             , adj.pricing_phase_id
1621             , adj.arithmetic_operator operand_calculation_code
1622             , nvl(adj.operand_per_pqty, adj.operand) operand_value
1623             , NULL SUBSTITUTION_TYPE_CODE
1624             , NULL SUBSTITUTION_VALUE_FROM
1625             , NULL SUBSTITUTION_VALUE_TO
1626             , NULL ASK_FOR_FLAG
1627             , NULL PRICE_FORMULA_ID
1628             , 'N' pricing_status_code
1629             , ' ' pricing_status_text
1630             , NULL PRODUCT_PRECEDENCE
1631             , NULL INCOMPATABILITY_GRP_CODE
1632             , NULL PROCESSED_FLAG
1633             , adj.applied_flag
1634             , adj.automatic_flag
1635             , adj.update_allowed override_flag
1636             , NULL PRIMARY_UOM_FLAG
1637             , NULL PRINT_ON_INVOICE_FLAG
1638             , adj.modifier_level_code
1639             , adj.BENEFIT_QTY
1640             , adj.BENEFIT_UOM_CODE
1641             , adj.LIST_LINE_NO
1642             , adj.accrual_flag
1643             , adj.ACCRUAL_CONVERSION_RATE
1644             , NULL ESTIM_ACCRUAL_RATE
1645             , NULL RECURRING_FLAG
1646             , NULL SELECTED_VOLUME_ATTR
1647             , line.rounding_factor
1648             , NULL HEADER_LIMIT_EXISTS
1649             , NULL LINE_LIMIT_EXISTS
1650             , adj.charge_type_code
1651             , adj.charge_subtype_code
1652             , NULL CURRENCY_DETAIL_ID
1653             , NULL CURRENCY_HEADER_ID
1654             , NULL SELLING_ROUNDING_FACTOR
1655             , NULL ORDER_CURRENCY
1656             , NULL PRICING_EFFECTIVE_DATE
1657             , NULL BASE_CURRENCY_CODE
1658             --, line.line_quantity
1659             , adj.range_break_quantity line_quantity
1660             , nvl(adj.updated_flag, QP_PREQ_PUB.G_NO) updated_flag
1661             , NULL calculation_code
1662             , adj.CHANGE_REASON_CODE
1663             , adj.CHANGE_REASON_TEXT
1664             , adj.PRICE_ADJUSTMENT_ID
1665             , NULL ACCUM_CONTEXT
1666             , NULL ACCUM_ATTRIBUTE
1667             , NULL ACCUM_FLAG
1668             , NULL BREAK_UOM_CODE
1669             , NULL BREAK_UOM_CONTEXT
1670             , NULL BREAK_UOM_ATTRIBUTE
1671             , NULL PROCESS_CODE -- 3215497
1672     FROM qp_int_lines line, oe_price_adjustments adj,
1673             qp_list_headers_b qplh
1674     WHERE QP_PREQ_PUB.G_CHECK_CUST_VIEW_FLAG = QP_PREQ_PUB.G_YES
1675             AND line.process_status IN (QP_PREQ_PUB.G_STATUS_UPDATED,
1676                                         QP_PREQ_PUB.G_STATUS_NEW,
1677                                         QP_PREQ_PUB.G_STATUS_UNCHANGED,
1678                                         'NEW' || QP_PREQ_PUB.G_STATUS_UNCHANGED,
1679                                         'OLD' || QP_PREQ_PUB.G_STATUS_UNCHANGED)
1680             AND adj.header_id = line.line_id
1681             AND line.pricing_status_code IN (QP_PREQ_PUB.G_STATUS_UPDATED
1682                                              , QP_PREQ_PUB.G_STATUS_GSA_VIOLATION
1683                                              , QP_PREQ_PUB.G_STATUS_UNCHANGED)
1684             AND line.line_type_code = QP_PREQ_PUB.G_ORDER_LEVEL
1685             AND (line.price_flag IN (QP_PREQ_PUB.G_YES, QP_PREQ_PUB.G_PHASE, QP_PREQ_PUB.G_CALCULATE_ONLY)
1686                  OR nvl(line.processed_code, '0') = QP_PREQ_PUB.G_BY_ENGINE)
1687             AND (adj.updated_flag = QP_PREQ_PUB.G_YES
1688                  OR line.price_flag = QP_PREQ_PUB.G_CALCULATE_ONLY
1689                  OR (p_event_code IS NULL AND adj.updated_flag IS NULL)
1690                  OR adj.pricing_phase_id NOT IN
1691                  (SELECT ph.pricing_phase_id
1692                   FROM qp_event_phases ev, qp_pricing_phases ph
1693                   WHERE ph.pricing_phase_id = ev.pricing_phase_id
1694                   AND ((QP_PREQ_PUB.G_GET_FREIGHT_FLAG = QP_PREQ_PUB.G_YES
1695                         AND ph.freight_exists = QP_PREQ_PUB.G_YES)
1696                        OR (QP_PREQ_PUB.G_GET_FREIGHT_FLAG = QP_PREQ_PUB.G_NO))
1697                   AND instr(p_event_code, ev.pricing_event_code || ',') > 0
1698                   --and (nvl(QP_PREQ_PUB.Get_buy_line_price_flag(adj.line_detail_index),line.price_flag) = QP_PREQ_PUB.G_YES
1699                   --or (nvl(QP_PREQ_PUB.Get_buy_line_price_flag(adj.line_detail_index),line.price_flag) = QP_PREQ_PUB.G_PHASE
1700                   AND (line.price_flag = QP_PREQ_PUB.G_YES
1701                        OR (line.price_flag = QP_PREQ_PUB.G_PHASE
1702                            AND nvl(ph.user_freeze_override_flag, ph.freeze_override_flag) = QP_PREQ_PUB.G_YES))))
1703             AND adj.modifier_level_code = QP_PREQ_PUB.G_ORDER_LEVEL
1704             AND adj.line_id IS NULL
1705             AND qplh.list_header_id = adj.list_header_id
1706             AND qplh.list_type_code NOT IN (QP_PREQ_PUB.G_PRICE_LIST_HEADER, QP_PREQ_PUB.G_AGR_LIST_HEADER);
1707 
1708   CURSOR l_rltd_lines_cur(pbh_exist_flag VARCHAR2, prg_exist_flag VARCHAR2) IS
1709     SELECT /*+ index(ass OE_PRICE_ADJ_ASSOCS_N1)*/ --[julin/4865213] changed from N3 to N1
1710      line.line_index             line_index,
1711      ass.price_adjustment_id     line_detail_index,
1712      QP_PREQ_PUB.G_PBH_LINE      relationship_type_code,
1713      line.line_index             related_line_index,
1714      ass.rltd_price_adj_id       related_line_detail_index,
1715      adj_pbh.list_line_id        list_line_id,
1716      adj.list_line_id            related_list_line_id,
1717      'INSERTED FOR CALCULATION'  pricing_status_text
1718     FROM qp_int_lines line
1719             , oe_price_adjustments adj_pbh
1720             , oe_price_adj_assocs ass
1721             , oe_price_adjustments adj
1722             , qp_pricing_attributes attr
1723     WHERE pbh_exist_flag = 'Y'
1724     AND QP_PREQ_PUB.G_CHECK_CUST_VIEW_FLAG = QP_PREQ_PUB.G_YES
1725     AND line.line_type_code = QP_PREQ_PUB.G_LINE_LEVEL
1726     AND line.price_flag IN (QP_PREQ_PUB.G_YES, QP_PREQ_PUB.G_PHASE)
1727     AND line.line_id = adj_pbh.line_id
1728     AND adj_pbh.list_line_type_code = QP_PREQ_PUB.G_PRICE_BREAK_TYPE
1729     AND (p_calculate_flag = QP_PREQ_PUB.G_CALCULATE_ONLY
1730          OR line.price_flag = QP_PREQ_PUB.G_CALCULATE_ONLY
1731          OR adj_pbh.updated_flag = QP_PREQ_PUB.G_YES
1732          OR p_event_code = ',' --we pad comma when it is null
1733          OR adj_pbh.pricing_phase_id NOT IN
1734          (SELECT ph.pricing_phase_id
1735           FROM qp_event_phases evt, qp_pricing_phases ph
1736           WHERE ph.pricing_phase_id = evt.pricing_phase_id
1737           --introduced for freight_rating functionality to return only modifiers in
1738           --phases where freight_exist = 'Y' if G_GET_FREIGHT_FLAG = 'Y'
1739           AND ((QP_PREQ_PUB.G_GET_FREIGHT_FLAG = QP_PREQ_PUB.G_YES
1740                 AND ph.freight_exists = QP_PREQ_PUB.G_YES)
1741                OR (QP_PREQ_PUB.G_GET_FREIGHT_FLAG = QP_PREQ_PUB.G_NO))
1742           AND instr(p_event_code, evt.pricing_event_code || ',') > 0
1743           --and (nvl(QP_PREQ_PUB.Get_buy_line_price_flag(adj.line_detail_index),line.price_flag) = QP_PREQ_PUB.G_YES
1744           AND (line.price_flag = QP_PREQ_PUB.G_YES
1745                --or (nvl(QP_PREQ_PUB.Get_buy_line_price_flag(adj.line_detail_index),line.price_flag) = QP_PREQ_PUB.G_PHASE
1746                OR (line.price_flag = QP_PREQ_PUB.G_PHASE
1747                    AND nvl(ph.user_freeze_override_flag, ph.freeze_override_flag) =
1748                    QP_PREQ_PUB.G_YES))))
1749     AND adj_pbh.price_adjustment_id = ass.price_adjustment_id
1750     AND ass.rltd_price_adj_id = adj.price_adjustment_id
1751     AND attr.list_line_id = adj.list_line_id
1752     AND attr.pricing_attribute_context = QP_PREQ_PUB.G_PRIC_VOLUME_CONTEXT
1753 UNION ALL
1754 SELECT /*+ ordered index(ass OE_PRICE_ADJ_ASSOCS_N1)*/ --[julin/4865213] changed from N3 to N1, ordered
1755          line.line_index             line_index,
1756          adj_prg.price_adjustment_id line_detail_index,
1757          QP_PREQ_PUB.G_GENERATED_LINE      relationship_type_code,
1758          getline.line_index related_line_index,
1759          ass.rltd_price_adj_id related_line_detail_index,
1760          adj_prg.list_line_id list_line_id,
1761          adj.list_line_id related_list_line_id,
1762          'INSERTED FOR CALCULATION'  pricing_status_text
1763         FROM qp_int_lines line
1764                 , oe_price_adjustments adj_prg
1765                 , oe_price_adj_assocs ass
1766                 , oe_price_adjustments adj
1767                 , qp_int_lines getline
1768         WHERE prg_exist_flag = 'Y'
1769         AND QP_PREQ_PUB.G_CHECK_CUST_VIEW_FLAG = QP_PREQ_PUB.G_YES
1770         AND line.line_type_code = QP_PREQ_PUB.G_LINE_LEVEL
1771         --and line.price_flag in (QP_PREQ_PUB.G_YES, QP_PREQ_PUB.G_PHASE)
1772         AND line.price_flag = G_YES
1773         AND line.line_id = adj_prg.line_id
1774         AND adj_prg.list_line_type_code = G_PROMO_GOODS_DISCOUNT
1775         AND adj_prg.pricing_phase_id  IN
1776                 (SELECT ph.pricing_phase_id
1777                  FROM qp_event_phases evt, qp_pricing_phases ph
1778                  WHERE ph.pricing_phase_id = evt.pricing_phase_id
1779                  AND instr(p_event_code, evt.pricing_event_code || ',') > 0
1780                  AND (line.price_flag = QP_PREQ_PUB.G_YES
1781                       OR (line.price_flag = QP_PREQ_PUB.G_PHASE
1782                           AND nvl(ph.user_freeze_override_flag, ph.freeze_override_flag) = QP_PREQ_PUB.G_YES)))
1783         AND ass.price_adjustment_id = adj_prg.price_adjustment_id
1784         AND ass.rltd_price_adj_id = adj.price_adjustment_id
1785         AND adj.list_line_type_code = 'DIS'
1786         AND adj.line_id IS NOT NULL
1787         AND getline.line_id = adj.line_id;
1788   --and getline.price_flag in (QP_PREQ_PUB.G_YES, QP_PREQ_PUB.G_PHASE);
1789 
1790   CURSOR l_pbh_adj_exists_cur IS
1791     SELECT /*+ index(adj OE_PRICE_ADJUSTMENTS_N2) */ 'Y'
1792     FROM
1793             qp_int_lines line,
1794             oe_price_adjustments adj
1795     WHERE adj.line_id = line.line_id
1796     AND line.line_type_code = QP_PREQ_PUB.G_LINE_LEVEL
1797     AND adj.list_line_type_code = QP_PREQ_PUB.G_PRICE_BREAK_TYPE
1798     AND (p_calculate_flag = QP_PREQ_PUB.G_CALCULATE_ONLY
1799          OR line.price_flag = QP_PREQ_PUB.G_CALCULATE_ONLY
1800          OR adj.updated_flag = QP_PREQ_PUB.G_YES
1801          OR p_event_code = ',' -- we pad ',' when it is null
1802          OR adj.pricing_phase_id NOT IN
1803          (SELECT ph.pricing_phase_id
1804           FROM qp_event_phases evt, qp_pricing_phases ph
1805           WHERE ph.pricing_phase_id = evt.pricing_phase_id
1806           --introduced for freight_rating functionality to return only modifiers in
1807           --phases where freight_exist = 'Y' if G_GET_FREIGHT_FLAG = 'Y'
1808           AND ((QP_PREQ_PUB.G_GET_FREIGHT_FLAG = QP_PREQ_PUB.G_YES
1809                 AND ph.freight_exists = QP_PREQ_PUB.G_YES)
1810                OR (QP_PREQ_PUB.G_GET_FREIGHT_FLAG = QP_PREQ_PUB.G_NO))
1811           AND instr(p_event_code, evt.pricing_event_code || ',') > 0
1812           AND (nvl(QP_PREQ_PUB.Get_buy_line_price_flag(adj.list_line_id, line.line_index), line.price_flag) = QP_PREQ_PUB.G_YES
1813                OR (nvl(QP_PREQ_PUB.Get_buy_line_price_flag(adj.list_line_id, line.line_index), line.price_flag) = QP_PREQ_PUB.G_PHASE
1814                    AND nvl(ph.user_freeze_override_flag, ph.freeze_override_flag) =
1815                    QP_PREQ_PUB.G_YES))))
1816     UNION
1817     SELECT /*+ index(adj OE_PRICE_ADJUSTMENTS_N1) */ 'Y'
1818     FROM
1819             qp_int_lines line,
1820             oe_price_adjustments adj
1821     WHERE adj.header_id = line.line_id
1822     AND line.line_type_code = QP_PREQ_PUB.G_ORDER_LEVEL
1823     AND adj.list_line_type_code = QP_PREQ_PUB.G_PRICE_BREAK_TYPE
1824     AND (p_calculate_flag = QP_PREQ_PUB.G_CALCULATE_ONLY
1825          OR line.price_flag = QP_PREQ_PUB.G_CALCULATE_ONLY
1826          OR p_event_code = ',' -- we pad ',' when it is null
1827          OR adj.pricing_phase_id NOT IN
1828          (SELECT ph.pricing_phase_id
1829           FROM qp_event_phases evt, qp_pricing_phases ph
1830           WHERE ph.pricing_phase_id = evt.pricing_phase_id
1831           --introduced for freight_rating functionality to return only modifiers in
1832           --phases where freight_exist = 'Y' if G_GET_FREIGHT_FLAG = 'Y'
1833           AND ((QP_PREQ_PUB.G_GET_FREIGHT_FLAG = QP_PREQ_PUB.G_YES
1834                 AND ph.freight_exists = QP_PREQ_PUB.G_YES)
1835                OR (QP_PREQ_PUB.G_GET_FREIGHT_FLAG = QP_PREQ_PUB.G_NO))
1836           AND instr(p_event_code, evt.pricing_event_code || ',') > 0
1837           AND (nvl(QP_PREQ_PUB.Get_buy_line_price_flag(adj.list_line_id, line.line_index), line.price_flag) = QP_PREQ_PUB.G_YES
1838                OR (nvl(QP_PREQ_PUB.Get_buy_line_price_flag(adj.list_line_id, line.line_index), line.price_flag) = QP_PREQ_PUB.G_PHASE
1839                    AND nvl(ph.user_freeze_override_flag, ph.freeze_override_flag) =
1840                    QP_PREQ_PUB.G_YES))));
1841 
1842 
1843   CURSOR l_prg_adj_exists_cur IS
1844     SELECT /*+ index(adj OE_PRICE_ADJUSTMENTS_N2) */ 'Y'
1845     FROM qp_int_lines line,
1846          oe_price_adjustments adj
1847     WHERE QP_PREQ_PUB.G_CHECK_CUST_VIEW_FLAG = QP_PREQ_PUB.G_YES
1848         AND adj.line_id = line.line_id
1849         AND line.line_type_code = QP_PREQ_PUB.G_LINE_LEVEL
1850         AND adj.list_line_type_code = 'PRG'
1851         AND adj.pricing_phase_id IN
1852                     (SELECT ph.pricing_phase_id
1853                      FROM qp_event_phases evt, qp_pricing_phases ph
1854                      WHERE ph.pricing_phase_id = evt.pricing_phase_id
1855                      AND instr(p_event_code, evt.pricing_event_code || ',') > 0
1856                      AND (line.price_flag = QP_PREQ_PUB.G_YES
1857                           OR (line.price_flag = QP_PREQ_PUB.G_PHASE
1858                               AND nvl(ph.user_freeze_override_flag, ph.freeze_override_flag) = QP_PREQ_PUB.G_YES)));
1859 
1860   CURSOR l_getline_dis_cur IS
1861     SELECT /*+ ORDERED USE_NL(adj qplh) */
1862               adj.price_adjustment_id line_detail_index
1863             , adj.list_line_type_code line_detail_type_code
1864             , adj.price_break_type_code
1865             , NULL list_price
1866             , getline.line_index
1867             , adj.list_header_id created_from_list_header_id
1868             , adj.list_line_id created_from_list_line_id
1869             , adj.list_line_type_code created_from_list_line_type
1870             , '' created_from_list_type_code
1871             , NULL CREATED_FROM_SQL
1872             , adj.pricing_group_sequence
1873             , adj.pricing_phase_id
1874             , adj.arithmetic_operator operand_calculation_code
1875             , nvl(adj.operand_per_pqty, adj.operand) operand_value
1876             , NULL SUBSTITUTION_TYPE_CODE
1877             , NULL SUBSTITUTION_VALUE_FROM
1878             , NULL SUBSTITUTION_VALUE_TO
1879             , NULL ASK_FOR_FLAG
1880             , NULL PRICE_FORMULA_ID
1881             , 'N' pricing_status_code
1882             , ' ' pricing_status_text
1883             , NULL PRODUCT_PRECEDENCE
1884             , NULL INCOMPATABILITY_GRP_CODE
1885             , NULL PROCESSED_FLAG
1886             , adj.applied_flag
1887             , adj.automatic_flag
1888             , adj.update_allowed override_flag
1889             , NULL PRIMARY_UOM_FLAG
1890             , NULL PRINT_ON_INVOICE_FLAG
1891             , adj.modifier_level_code
1892             , adj.BENEFIT_QTY
1893             , adj.BENEFIT_UOM_CODE
1894             , adj.LIST_LINE_NO
1895             , adj.accrual_flag
1896             , adj.ACCRUAL_CONVERSION_RATE
1897             , NULL ESTIM_ACCRUAL_RATE
1898             , NULL RECURRING_FLAG
1899             , NULL SELECTED_VOLUME_ATTR
1900             , getline.rounding_factor
1901             , NULL HEADER_LIMIT_EXISTS
1902             , NULL LINE_LIMIT_EXISTS
1903             , adj.charge_type_code
1904             , adj.charge_subtype_code
1905             , NULL CURRENCY_DETAIL_ID
1906             , NULL CURRENCY_HEADER_ID
1907             , NULL SELLING_ROUNDING_FACTOR
1908             , NULL ORDER_CURRENCY
1909             , NULL PRICING_EFFECTIVE_DATE
1910             , NULL BASE_CURRENCY_CODE
1911             --, line.line_quantity
1912             , adj.range_break_quantity line_quantity
1913             , nvl(adj.updated_flag, QP_PREQ_PUB.G_NO) updated_flag
1914             , NULL calculation_code
1915             , adj.CHANGE_REASON_CODE
1916             , adj.CHANGE_REASON_TEXT
1917             , adj.PRICE_ADJUSTMENT_ID
1918             , NULL ACCUM_CONTEXT
1919             , NULL ACCUM_ATTRIBUTE
1920             , NULL ACCUM_FLAG
1921             , NULL BREAK_UOM_CODE
1922             , NULL BREAK_UOM_CONTEXT
1923             , NULL BREAK_UOM_ATTRIBUTE
1924             , NULL PROCESS_CODE -- 3215497
1925     FROM   qp_int_lines getline, oe_price_adjustments adj,
1926            qp_int_ldets ldet, oe_price_adj_assocs ass
1927     WHERE  QP_PREQ_PUB.G_CHECK_CUST_VIEW_FLAG = QP_PREQ_PUB.G_YES
1928     AND    ldet.CREATED_FROM_LIST_LINE_TYPE = 'PRG'
1929     AND    ass.price_adjustment_id = ldet.price_adjustment_id
1930     AND    ass.rltd_price_adj_id = adj.price_adjustment_id
1931     AND    adj.line_id = getline.line_id
1932     AND    getline.line_index = ldet.line_index -- sql repos
1933     AND    getline.process_status IN (QP_PREQ_PUB.G_STATUS_UPDATED,
1934                                       QP_PREQ_PUB.G_STATUS_NEW,
1935                                       QP_PREQ_PUB.G_STATUS_UNCHANGED,
1936                                       'NEW' || QP_PREQ_PUB.G_STATUS_UNCHANGED,
1937                                       'OLD' || QP_PREQ_PUB.G_STATUS_UNCHANGED)
1938     AND    getline.pricing_status_code IN (QP_PREQ_PUB.G_STATUS_UPDATED
1939                                            , QP_PREQ_PUB.G_STATUS_GSA_VIOLATION
1940                                            , QP_PREQ_PUB.G_STATUS_UNCHANGED)
1941     AND    getline.price_flag = QP_PREQ_PUB.G_NO
1942     AND    adj.price_adjustment_id NOT IN (SELECT price_adjustment_id
1943                                            FROM qp_int_ldets);
1944   --(getline.price_flag in (QP_PREQ_PUB.G_YES, QP_PREQ_PUB.G_PHASE,QP_PREQ_PUB.G_CALCULATE_ONLY)
1945   --OR nvl(line.processed_code,'0') = QP_PREQ_PUB.G_BY_ENGINE)
1946   --and line.line_type_code = QP_PREQ_PUB.G_LINE_LEVEL
1947 
1948   l_LINE_DETAIL_index QP_PREQ_GRP.PLS_INTEGER_TYPE;
1949   l_LINE_DETAIL_TYPE_CODE QP_PREQ_GRP.VARCHAR_TYPE;
1950   l_PRICE_BREAK_TYPE_CODE QP_PREQ_GRP.VARCHAR_TYPE;
1951   l_LIST_PRICE QP_PREQ_GRP.NUMBER_TYPE;
1952   l_LINE_INDEX QP_PREQ_GRP.PLS_INTEGER_TYPE;
1953   l_CREATED_FROM_LIST_HEADER_ID QP_PREQ_GRP.NUMBER_TYPE;
1954   l_CREATED_FROM_LIST_LINE_ID QP_PREQ_GRP.NUMBER_TYPE;
1955   l_CREATED_FROM_LIST_LINE_TYPE QP_PREQ_GRP.VARCHAR_TYPE;
1956   l_CREATED_FROM_LIST_TYPE_CODE QP_PREQ_GRP.VARCHAR_TYPE;
1957   l_CREATED_FROM_SQL QP_PREQ_GRP.VARCHAR_TYPE;
1958   l_PRICING_GROUP_SEQUENCE QP_PREQ_GRP.PLS_INTEGER_TYPE;
1959   l_PRICING_PHASE_ID QP_PREQ_GRP.PLS_INTEGER_TYPE;
1960   l_OPERAND_CALCULATION_CODE QP_PREQ_GRP.VARCHAR_TYPE;
1961   l_OPERAND_VALUE QP_PREQ_GRP.VARCHAR_TYPE;
1962   l_SUBSTITUTION_TYPE_CODE QP_PREQ_GRP.VARCHAR_TYPE;
1963   l_SUBSTITUTION_VALUE_FROM QP_PREQ_GRP.VARCHAR_TYPE;
1964   l_SUBSTITUTION_VALUE_TO QP_PREQ_GRP.VARCHAR_TYPE;
1965   l_ASK_FOR_FLAG QP_PREQ_GRP.VARCHAR_TYPE;
1966   l_PRICE_FORMULA_ID QP_PREQ_GRP.NUMBER_TYPE;
1967   l_PRICING_STATUS_CODE QP_PREQ_GRP.VARCHAR_TYPE;
1968   l_PRICING_STATUS_TEXT QP_PREQ_GRP.VARCHAR_TYPE;
1969   l_PRODUCT_PRECEDENCE QP_PREQ_GRP.PLS_INTEGER_TYPE;
1970   l_INCOMPATABLILITY_GRP_CODE QP_PREQ_GRP.VARCHAR_TYPE;
1971   l_PROCESSED_FLAG QP_PREQ_GRP.VARCHAR_TYPE;
1972   l_APPLIED_FLAG QP_PREQ_GRP.VARCHAR_TYPE;
1973   l_AUTOMATIC_FLAG QP_PREQ_GRP.VARCHAR_TYPE;
1974   l_OVERRIDE_FLAG QP_PREQ_GRP.VARCHAR_TYPE;
1975   l_PRIMARY_UOM_FLAG QP_PREQ_GRP.VARCHAR_TYPE;
1976   l_PRINT_ON_INVOICE_FLAG QP_PREQ_GRP.VARCHAR_TYPE;
1977   l_MODIFIER_LEVEL_CODE QP_PREQ_GRP.VARCHAR_TYPE;
1978   l_BENEFIT_QTY QP_PREQ_GRP.NUMBER_TYPE;
1979   l_BENEFIT_UOM_CODE QP_PREQ_GRP.VARCHAR_TYPE;
1980   l_LIST_LINE_NO QP_PREQ_GRP.VARCHAR_TYPE;
1981   l_ACCRUAL_FLAG QP_PREQ_GRP.VARCHAR_TYPE;
1982   l_ACCRUAL_CONVERSION_RATE QP_PREQ_GRP.NUMBER_TYPE;
1983   l_ESTIM_ACCRUAL_RATE QP_PREQ_GRP.NUMBER_TYPE;
1984   l_RECURRING_FLAG QP_PREQ_GRP.VARCHAR_TYPE;
1985   l_SELECTED_VOLUME_ATTR QP_PREQ_GRP.VARCHAR_TYPE;
1986   l_ROUNDING_FACTOR QP_PREQ_GRP.PLS_INTEGER_TYPE;
1987   l_HEADER_LIMIT_EXISTS QP_PREQ_GRP.VARCHAR_TYPE;
1988   l_LINE_LIMIT_EXISTS QP_PREQ_GRP.VARCHAR_TYPE;
1989   l_CHARGE_TYPE_CODE QP_PREQ_GRP.VARCHAR_TYPE;
1990   l_CHARGE_SUBTYPE_CODE QP_PREQ_GRP.VARCHAR_TYPE;
1991   l_CURRENCY_DETAIL_ID QP_PREQ_GRP.NUMBER_TYPE;
1992   l_CURRENCY_HEADER_ID QP_PREQ_GRP.NUMBER_TYPE;
1993   l_SELLING_ROUNDING_FACTOR QP_PREQ_GRP.NUMBER_TYPE;
1994   l_ORDER_CURRENCY QP_PREQ_GRP.VARCHAR_TYPE;
1995   l_PRICING_EFFECTIVE_DATE QP_PREQ_GRP.DATE_TYPE;
1996   l_BASE_CURRENCY_CODE QP_PREQ_GRP.VARCHAR_TYPE;
1997   l_LINE_QUANTITY QP_PREQ_GRP.NUMBER_TYPE;
1998   l_UPDATED_FLAG QP_PREQ_GRP.VARCHAR_TYPE;
1999   l_CALCULATION_CODE QP_PREQ_GRP.VARCHAR_TYPE;
2000   l_CHANGE_REASON_CODE QP_PREQ_GRP.VARCHAR_TYPE;
2001   l_CHANGE_REASON_TEXT QP_PREQ_GRP.VARCHAR_TYPE;
2002   l_PRICE_ADJUSTMENT_ID QP_PREQ_GRP.NUMBER_TYPE; -- bug 3099847
2003   l_ACCUM_CONTEXT QP_PREQ_GRP.VARCHAR_TYPE; -- accum range break
2004   l_ACCUM_ATTRIBUTE QP_PREQ_GRP.VARCHAR_TYPE; -- accum range break
2005   l_ACCUM_FLAG QP_PREQ_GRP.VARCHAR_TYPE; -- accum range break
2006   l_BREAK_UOM_CODE QP_PREQ_GRP.VARCHAR_TYPE; /* Proration*/
2007   l_BREAK_UOM_CONTEXT QP_PREQ_GRP.VARCHAR_TYPE; /* Proration*/
2008   l_BREAK_UOM_ATTRIBUTE QP_PREQ_GRP.VARCHAR_TYPE; /* Proration*/
2009   l_PROCESS_CODE QP_PREQ_GRP.VARCHAR_TYPE; -- 3215497
2010 
2011   l_LINE_INDEX1 QP_PREQ_GRP.PLS_INTEGER_TYPE; -- 3215497
2012   l_LINE_DETAIL_INDEX1 QP_PREQ_GRP.PLS_INTEGER_TYPE; -- 3215497
2013   l_RELATIONSHIP_TYPE_CODE QP_PREQ_GRP.VARCHAR_TYPE;
2014   l_RELATED_LINE_INDEX QP_PREQ_GRP.PLS_INTEGER_TYPE; -- 3215497
2015   l_RELATED_LINE_DETAIL_INDEX QP_PREQ_GRP.PLS_INTEGER_TYPE; -- 3215497
2016   l_LIST_LINE_ID QP_PREQ_GRP.NUMBER_TYPE;
2017   l_RLTD_LIST_LINE_ID QP_PREQ_GRP.NUMBER_TYPE;
2018   --l_pricing_status_code        QP_PREQ_GRP.VARCHAR_TYPE;
2019   --l_pricing_status_text        QP_PREQ_GRP.VARCHAR_TYPE;
2020 
2021   l_debug VARCHAR2(3);
2022   l_pbh_adj_exists VARCHAR2(1) := QP_PREQ_PUB.G_NO;
2023   l_prg_adj_exists VARCHAR2(1) := QP_PREQ_PUB.G_NO;
2024 
2025   BEGIN
2026     x_return_status := FND_API.G_RET_STS_SUCCESS;
2027     l_debug := QP_PREQ_GRP.G_DEBUG_ENGINE;
2028 
2029     --per bug3238607, no need to check HVOP
2030     IF(QP_PREQ_PUB.G_CHECK_CUST_VIEW_FLAG = QP_PREQ_PUB.G_YES ) THEN
2031       --QP_UTIL_PUB.HVOP_PRICING_ON = QP_PREQ_PUB.G_NO) THEN
2032       IF QP_PREQ_GRP.G_DEBUG_ENGINE = FND_API.G_TRUE THEN
2033         QP_PREQ_GRP.ENGINE_DEBUG('QP_PREQ_PUB.G_CHECK_CUST_VIEW_FLAG=Y and ');
2034         --'QP_BULK_PREQ_GRP.G_HVOP_Pricing_ON=N');
2035         QP_PREQ_GRP.ENGINE_DEBUG('QP_PREQ_PUB.G_GET_FREIGHT_FLAG:' || QP_PREQ_PUB.G_GET_FREIGHT_FLAG);
2036       END IF;
2037 
2038       OPEN l_ldets_cur;
2039       LOOP
2040         l_LINE_DETAIL_index.DELETE;
2041         l_LINE_DETAIL_TYPE_CODE.DELETE;
2042         l_PRICE_BREAK_TYPE_CODE.DELETE;
2043         l_LIST_PRICE.DELETE;
2044         l_LINE_INDEX.DELETE;
2045         l_CREATED_FROM_LIST_HEADER_ID.DELETE;
2046         l_CREATED_FROM_LIST_LINE_ID.DELETE;
2047         l_CREATED_FROM_LIST_LINE_TYPE.DELETE;
2048         l_CREATED_FROM_LIST_TYPE_CODE.DELETE;
2049         l_CREATED_FROM_SQL.DELETE;
2050         l_PRICING_GROUP_SEQUENCE.DELETE;
2051         l_PRICING_PHASE_ID.DELETE;
2052         l_OPERAND_CALCULATION_CODE.DELETE;
2053         l_OPERAND_VALUE.DELETE;
2054         l_SUBSTITUTION_TYPE_CODE.DELETE;
2055         l_SUBSTITUTION_VALUE_FROM.DELETE;
2056         l_SUBSTITUTION_VALUE_TO.DELETE;
2057         l_ASK_FOR_FLAG.DELETE;
2058         l_PRICE_FORMULA_ID.DELETE;
2059         l_PRICING_STATUS_CODE.DELETE;
2060         l_PRICING_STATUS_TEXT.DELETE;
2061         l_PRODUCT_PRECEDENCE.DELETE;
2062         l_INCOMPATABLILITY_GRP_CODE.DELETE;
2063         l_PROCESSED_FLAG.DELETE;
2064         l_APPLIED_FLAG.DELETE;
2065         l_AUTOMATIC_FLAG.DELETE;
2066         l_OVERRIDE_FLAG.DELETE;
2067         l_PRIMARY_UOM_FLAG.DELETE;
2068         l_PRINT_ON_INVOICE_FLAG.DELETE;
2069         l_MODIFIER_LEVEL_CODE.DELETE;
2070         l_BENEFIT_QTY.DELETE;
2071         l_BENEFIT_UOM_CODE.DELETE;
2072         l_LIST_LINE_NO.DELETE;
2073         l_ACCRUAL_FLAG.DELETE;
2074         l_ACCRUAL_CONVERSION_RATE.DELETE;
2075         l_ESTIM_ACCRUAL_RATE.DELETE;
2076         l_RECURRING_FLAG.DELETE;
2077         l_SELECTED_VOLUME_ATTR.DELETE;
2078         l_ROUNDING_FACTOR.DELETE;
2079         l_HEADER_LIMIT_EXISTS.DELETE;
2080         l_LINE_LIMIT_EXISTS.DELETE;
2081         l_CHARGE_TYPE_CODE.DELETE;
2082         l_CHARGE_SUBTYPE_CODE.DELETE;
2083         l_CURRENCY_DETAIL_ID.DELETE;
2084         l_CURRENCY_HEADER_ID.DELETE;
2085         l_SELLING_ROUNDING_FACTOR.DELETE;
2086         l_ORDER_CURRENCY.DELETE;
2087         l_PRICING_EFFECTIVE_DATE.DELETE;
2088         l_BASE_CURRENCY_CODE.DELETE;
2089         l_LINE_QUANTITY.DELETE;
2090         l_UPDATED_FLAG.DELETE;
2091         l_CALCULATION_CODE.DELETE;
2092         l_CHANGE_REASON_CODE.DELETE;
2093         l_CHANGE_REASON_TEXT.DELETE;
2094         l_PRICE_ADJUSTMENT_ID.DELETE;
2095         l_ACCUM_CONTEXT.DELETE;
2096         l_ACCUM_ATTRIBUTE.DELETE;
2097         l_ACCUM_FLAG.DELETE;
2098         l_BREAK_UOM_CODE.DELETE;
2099         l_BREAK_UOM_CONTEXT.DELETE;
2100         l_BREAK_UOM_ATTRIBUTE.DELETE;
2101         l_PROCESS_CODE.DELETE; -- 3215497
2102 
2103         IF l_debug = FND_API.G_TRUE THEN
2104           QP_PREQ_GRP.engine_debug('fetching l_ldets_cur');
2105         END IF;
2106 
2107         FETCH l_ldets_cur
2108         BULK COLLECT INTO
2109         l_LINE_DETAIL_index,
2110         l_LINE_DETAIL_TYPE_CODE,
2111         l_PRICE_BREAK_TYPE_CODE,
2112         l_LIST_PRICE,
2113         l_LINE_INDEX,
2114         l_CREATED_FROM_LIST_HEADER_ID,
2115         l_CREATED_FROM_LIST_LINE_ID,
2116         l_CREATED_FROM_LIST_LINE_TYPE,
2117         l_CREATED_FROM_LIST_TYPE_CODE,
2118         l_CREATED_FROM_SQL,
2119         l_PRICING_GROUP_SEQUENCE,
2120         l_PRICING_PHASE_ID,
2121         l_OPERAND_CALCULATION_CODE,
2122         l_OPERAND_VALUE,
2123         l_SUBSTITUTION_TYPE_CODE,
2124         l_SUBSTITUTION_VALUE_FROM,
2125         l_SUBSTITUTION_VALUE_TO,
2126         l_ASK_FOR_FLAG,
2127         l_PRICE_FORMULA_ID,
2128         l_PRICING_STATUS_CODE,
2129         l_PRICING_STATUS_TEXT,
2130         l_PRODUCT_PRECEDENCE,
2131         l_INCOMPATABLILITY_GRP_CODE,
2132         l_PROCESSED_FLAG,
2133         l_APPLIED_FLAG,
2134         l_AUTOMATIC_FLAG,
2135         l_OVERRIDE_FLAG,
2136         l_PRIMARY_UOM_FLAG,
2137         l_PRINT_ON_INVOICE_FLAG,
2138         l_MODIFIER_LEVEL_CODE,
2139         l_BENEFIT_QTY,
2140         l_BENEFIT_UOM_CODE,
2141         l_LIST_LINE_NO,
2142         l_ACCRUAL_FLAG,
2143         l_ACCRUAL_CONVERSION_RATE,
2144         l_ESTIM_ACCRUAL_RATE,
2145         l_RECURRING_FLAG,
2146         l_SELECTED_VOLUME_ATTR,
2147         l_ROUNDING_FACTOR,
2148         l_HEADER_LIMIT_EXISTS,
2149         l_LINE_LIMIT_EXISTS,
2150         l_CHARGE_TYPE_CODE,
2151         l_CHARGE_SUBTYPE_CODE,
2152         l_CURRENCY_DETAIL_ID,
2153         l_CURRENCY_HEADER_ID,
2154         l_SELLING_ROUNDING_FACTOR,
2155         l_ORDER_CURRENCY,
2156         l_PRICING_EFFECTIVE_DATE,
2157         l_BASE_CURRENCY_CODE,
2158         l_LINE_QUANTITY,
2159         l_UPDATED_FLAG,
2160         l_CALCULATION_CODE,
2161         l_CHANGE_REASON_CODE,
2162         l_CHANGE_REASON_TEXT,
2163         l_PRICE_ADJUSTMENT_ID,
2164         l_ACCUM_CONTEXT,
2165         l_ACCUM_ATTRIBUTE,
2166         l_ACCUM_FLAG,
2167         l_BREAK_UOM_CODE,
2168         l_BREAK_UOM_CONTEXT,
2169         l_BREAK_UOM_ATTRIBUTE,
2170         l_PROCESS_CODE; -- 3215497
2171         --      LIMIT nrows;
2172         EXIT WHEN l_LINE_DETAIL_index.COUNT = 0;
2173 
2174         IF l_debug = FND_API.G_TRUE THEN
2175           QP_PREQ_GRP.engine_debug('rows fetched:'|| l_line_detail_index.COUNT);
2176         END IF;
2177 
2178         IF l_LINE_DETAIL_index.COUNT > 0
2179           AND l_debug = FND_API.G_TRUE
2180           THEN
2181           FOR i IN l_LINE_DETAIL_index.FIRST..l_LINE_DETAIL_index.LAST
2182             LOOP
2183             QP_PREQ_GRP.engine_debug('=======line_detail_index: '|| l_LINE_DETAIL_index(i) ||
2184                                      ' line_detail_type_code: '|| l_LINE_DETAIL_TYPE_CODE(i) ||
2185                                      ' price_break_type_code: '|| l_PRICE_BREAK_TYPE_CODE(i) ||
2186                                      ' list_price: ' || l_LIST_PRICE(i) ||
2187                                      ' line_index: '|| l_LINE_INDEX(i));
2188 
2189             QP_PREQ_GRP.engine_debug('created_from_list_header_id: '|| l_CREATED_FROM_LIST_HEADER_ID(i) ||
2190                                      ' created_from_list_line_id: '|| l_CREATED_FROM_LIST_LINE_ID(i) ||
2191                                      ' created_from_list_line_type: '|| l_CREATED_FROM_LIST_LINE_TYPE(i) ||
2192                                      ' created_from_list_type_code: '|| l_CREATED_FROM_LIST_TYPE_CODE(i) ||
2193                                      ' created_from_sql: '|| l_CREATED_FROM_SQL(i) ||
2194                                      ' pricing_group_sequence: ' || l_PRICING_GROUP_SEQUENCE(i) ||
2195                                      ' pricing_phase_id: '|| l_PRICING_PHASE_ID(i) ||
2196                                      ' oprand_calculation_code: ' || l_OPERAND_CALCULATION_CODE(i) ||
2197                                      ' operand_value: ' || l_OPERAND_VALUE(i));
2198             QP_PREQ_GRP.engine_debug(' substitution_type_code: ' || l_SUBSTITUTION_TYPE_CODE(i) ||
2199                                      ' substitution_value_from: ' || l_SUBSTITUTION_VALUE_FROM(i) ||
2200                                      ' substitution_value_to: ' || l_SUBSTITUTION_VALUE_TO(i) ||
2201                                      ' ask_for_flag: ' || l_ASK_FOR_FLAG(i) ||
2202                                      ' price_formula_id: '|| l_PRICE_FORMULA_ID(i) ||
2203                                      ' pricing_status_code: '|| l_PRICING_STATUS_CODE(i) ||
2204                                      ' pricing_status_text: '|| l_PRICING_STATUS_TEXT(i) ||
2205                                      ' product_precedence: '|| l_PRODUCT_PRECEDENCE(i) ||
2206                                      ' incompatability_grp_code: ' || l_INCOMPATABLILITY_GRP_CODE(i));
2207 
2208             QP_PREQ_GRP.engine_debug(' processed_flag: '|| l_PROCESSED_FLAG(i) ||
2209                                      ' applied_flag: '|| l_APPLIED_FLAG(i) ||
2210                                      ' automatic_flag: '|| l_AUTOMATIC_FLAG(i) ||
2211                                      ' override_flag: '|| l_OVERRIDE_FLAG(i) ||
2212                                      ' primary_uom_flag: '|| l_PRIMARY_UOM_FLAG(i) ||
2213                                      ' print_on_invoice_flag: '|| l_PRINT_ON_INVOICE_FLAG(i) ||
2214                                      ' MODIFIER_LEVEL_CODE: '|| l_MODIFIER_LEVEL_CODE(i) ||
2215                                      ' BENEFIT_QTY: '|| l_BENEFIT_QTY(i) ||
2216                                      ' BENEFIT_UOM_CODE: '|| l_BENEFIT_UOM_CODE(i));
2217 
2218             QP_PREQ_GRP.engine_debug(' LIST_LINE_NO: '|| l_LIST_LINE_NO(i) ||
2219                                      ' ACCRUAL_FLAG: '|| l_ACCRUAL_FLAG(i) ||
2220                                      ' ACCRUAL_CONVERSION_RATE: '|| l_ACCRUAL_CONVERSION_RATE(i) ||
2221                                      ' ESTIM_ACCRUAL_RATE: '|| l_ESTIM_ACCRUAL_RATE(i) ||
2222                                      ' RECURRING_FLAG: '|| l_RECURRING_FLAG(i) ||
2223                                      ' SELECTED_VOLUME_ATTR: '|| l_SELECTED_VOLUME_ATTR(i) ||
2224                                      ' ROUNDING_FACTOR: '|| l_ROUNDING_FACTOR(i) ||
2225                                      ' HEADER_LIMIT_EXISTS: '|| l_HEADER_LIMIT_EXISTS(i) ||
2226                                      ' LINE_LIMIT_EXISTS: '|| l_LINE_LIMIT_EXISTS(i));
2227 
2228             QP_PREQ_GRP.engine_debug(' CHARGE_TYPE_CODE:'|| l_CHARGE_TYPE_CODE(i) ||
2229                                      ' CHARGE_SUBTYPE_CODE:'|| l_CHARGE_SUBTYPE_CODE(i) ||
2230                                      ' CURRENCY_DETAIL_ID:'|| l_CURRENCY_DETAIL_ID(i) ||
2231                                      ' CURRENCY_HEADER_ID:'|| l_CURRENCY_HEADER_ID(i) ||
2232                                      ' SELLING_ROUNDING_FACTOR:'|| l_SELLING_ROUNDING_FACTOR(i) ||
2233                                      ' ORDER_CURRENCY:'|| l_ORDER_CURRENCY(i) ||
2234                                      ' PRICING_EFFECTIVE_DATE:'|| l_PRICING_EFFECTIVE_DATE(i) ||
2235                                      ' BASE_CURRENCY_CODE:'|| l_BASE_CURRENCY_CODE(i) ||
2236                                      ' LINE_QUANTITY:'|| l_LINE_QUANTITY(i));
2237 
2238             QP_PREQ_GRP.engine_debug(' UPDATED_FLAG:'|| l_UPDATED_FLAG(i) ||
2239                                      ' CALCULATION_CODE:'|| l_CALCULATION_CODE(i) ||
2240                                      ' CHANGE_REASON_CODE:'|| l_CHANGE_REASON_CODE(i) ||
2241                                      ' CHANGE_REASON_TEXT:'|| l_CHANGE_REASON_TEXT(i) ||
2242                                      ' PRICE_ADJUSTMENT_ID:'|| l_PRICE_ADJUSTMENT_ID(i) ||
2243                                      ' ACCUM_CONTEXT:'|| l_ACCUM_CONTEXT(i) ||
2244                                      ' ACCUM_ATTRIBUTE:'|| l_ACCUM_ATTRIBUTE(i) ||
2245                                      ' ACCUM_FLAG:'|| l_ACCUM_FLAG(i) ||
2246                                      ' BREAK_UOM_CODE:'|| l_BREAK_UOM_CODE(i) ||
2247                                      ' BREAK_UOM_CONTEXT:'|| l_BREAK_UOM_CONTEXT(i) ||
2248                                      ' BREAK_UOM_ATTRIBUTE:'|| l_BREAK_UOM_ATTRIBUTE(i));
2249 
2250           END LOOP;
2251         END IF; --l_line_detail_index.COUNT
2252 
2253         IF l_LINE_DETAIL_index.COUNT > 0 THEN
2254           IF l_debug = FND_API.G_TRUE THEN
2255             QP_PREQ_GRP.engine_debug('calling INSERT_LDETS2');
2256           END IF;
2257           QP_PREQ_GRP.INSERT_LDETS2
2258           (l_LINE_DETAIL_index,
2259            l_LINE_DETAIL_TYPE_CODE,
2260            l_PRICE_BREAK_TYPE_CODE,
2261            l_LIST_PRICE,
2262            l_LINE_INDEX,
2263            l_CREATED_FROM_LIST_HEADER_ID,
2264            l_CREATED_FROM_LIST_LINE_ID,
2265            l_CREATED_FROM_LIST_LINE_TYPE,
2266            l_CREATED_FROM_LIST_TYPE_CODE,
2267            l_CREATED_FROM_SQL,
2268            l_PRICING_GROUP_SEQUENCE,
2269            l_PRICING_PHASE_ID,
2270            l_OPERAND_CALCULATION_CODE,
2271            l_OPERAND_VALUE,
2272            l_SUBSTITUTION_TYPE_CODE,
2273            l_SUBSTITUTION_VALUE_FROM,
2274            l_SUBSTITUTION_VALUE_TO,
2275            l_ASK_FOR_FLAG,
2276            l_PRICE_FORMULA_ID,
2277            l_PRICING_STATUS_CODE,
2278            l_PRICING_STATUS_TEXT,
2279            l_PRODUCT_PRECEDENCE,
2280            l_INCOMPATABLILITY_GRP_CODE,
2281            l_PROCESSED_FLAG,
2282            l_APPLIED_FLAG,
2283            l_AUTOMATIC_FLAG,
2284            l_OVERRIDE_FLAG,
2285            l_PRIMARY_UOM_FLAG,
2286            l_PRINT_ON_INVOICE_FLAG,
2287            l_MODIFIER_LEVEL_CODE,
2288            l_BENEFIT_QTY,
2289            l_BENEFIT_UOM_CODE,
2290            l_LIST_LINE_NO,
2291            l_ACCRUAL_FLAG,
2292            l_ACCRUAL_CONVERSION_RATE,
2293            l_ESTIM_ACCRUAL_RATE,
2294            l_RECURRING_FLAG,
2295            l_SELECTED_VOLUME_ATTR,
2296            l_ROUNDING_FACTOR,
2297            l_HEADER_LIMIT_EXISTS,
2298            l_LINE_LIMIT_EXISTS,
2299            l_CHARGE_TYPE_CODE,
2300            l_CHARGE_SUBTYPE_CODE,
2301            l_CURRENCY_DETAIL_ID,
2302            l_CURRENCY_HEADER_ID,
2303            l_SELLING_ROUNDING_FACTOR,
2304            l_ORDER_CURRENCY,
2305            l_PRICING_EFFECTIVE_DATE,
2306            l_BASE_CURRENCY_CODE,
2307            l_LINE_QUANTITY,
2308            l_UPDATED_FLAG,
2309            l_CALCULATION_CODE,
2310            l_CHANGE_REASON_CODE,
2311            l_CHANGE_REASON_TEXT,
2312            l_PRICE_ADJUSTMENT_ID,
2313            l_ACCUM_CONTEXT,
2314            l_ACCUM_ATTRIBUTE,
2315            l_ACCUM_FLAG,
2316            l_BREAK_UOM_CODE,
2317            l_BREAK_UOM_CONTEXT,
2318            l_BREAK_UOM_ATTRIBUTE,
2319            l_PROCESS_CODE,  -- 3215497
2320            x_return_status,
2321            x_return_status_text);
2322         END IF;
2323       END LOOP;
2324       CLOSE l_ldets_cur;
2325 
2326       IF l_debug = FND_API.G_TRUE THEN
2327         QP_PREQ_GRP.engine_debug('close l_ldets_cur');
2328       END IF;
2329 
2330 
2331       IF l_debug = FND_API.G_TRUE THEN
2332         QP_PREQ_GRP.engine_debug('Begin Insert rltd lines');
2333       END IF;
2334 
2335       OPEN l_pbh_adj_exists_cur;
2336       FETCH l_pbh_adj_exists_cur INTO l_pbh_adj_exists;
2337       CLOSE l_pbh_adj_exists_cur;
2338 
2339       OPEN l_prg_adj_exists_cur;
2340       FETCH l_prg_adj_exists_cur INTO l_prg_adj_exists;
2341       CLOSE l_prg_adj_exists_cur;
2342 
2343       IF l_debug = FND_API.G_TRUE THEN
2344         QP_PREQ_GRP.engine_debug('Check l_pbh_adj_exists '|| l_pbh_adj_exists);
2345         QP_PREQ_GRP.engine_debug('Check l_prg_adj_exists '|| l_prg_adj_exists);
2346       END IF;
2347 
2348       --IF l_pbh_adj_exists = QP_PREQ_PUB.G_YES
2349       --THEN
2350       --  OPEN l_rltd_lines_cur;
2351       OPEN l_rltd_lines_cur(l_pbh_adj_exists, l_prg_adj_exists);
2352       LOOP
2353         l_LINE_index1.DELETE;
2354         l_LINE_DETAIL_INDEX1.DELETE;
2355         l_RELATIONSHIP_TYPE_CODE.DELETE;
2356         l_RELATED_LINE_INDEX.DELETE;
2357         l_RELATED_LINE_DETAIL_INDEX.DELETE;
2358         l_LIST_LINE_ID.DELETE;
2359         l_RLTD_LIST_LINE_ID.DELETE;
2360         l_pricing_status_text.DELETE;
2361 
2362         IF l_debug = FND_API.G_TRUE THEN
2363           QP_PREQ_GRP.engine_debug('fetching l_rltd_lines_cur');
2364         END IF;
2365 
2366         FETCH l_rltd_lines_cur
2367         BULK COLLECT INTO
2368         l_LINE_index1,
2369         l_LINE_DETAIL_INDEX1,
2370         l_RELATIONSHIP_TYPE_CODE,
2371         l_RELATED_LINE_INDEX,
2372         l_RELATED_LINE_DETAIL_INDEX,
2373         l_LIST_LINE_ID,
2374         l_RLTD_LIST_LINE_ID,
2375         l_pricing_status_text;
2376         --      LIMIT nrows;
2377         EXIT WHEN l_LINE_index1.COUNT = 0;
2378 
2379         IF l_debug = FND_API.G_TRUE THEN
2380           QP_PREQ_GRP.engine_debug('rows fetched:'|| l_line_index1.COUNT);
2381         END IF;
2382 
2383         IF l_LINE_index1.COUNT > 0
2384           AND l_debug = FND_API.G_TRUE
2385           THEN
2386           FOR i IN l_LINE_index1.FIRST..l_LINE_index1.LAST
2387             LOOP
2388             QP_PREQ_GRP.engine_debug('======line_index: '|| l_LINE_index1(i) ||
2389                                      ' line_detail_index: '|| l_LINE_DETAIL_index1(i) ||
2390                                      ' relationship_type_code: '|| l_RELATIONSHIP_TYPE_CODE(i) ||
2391                                      ' related_line_index: '|| l_RELATED_LINE_INDEX(i) ||
2392                                      ' related_line_detail_index: ' || l_RELATED_LINE_DETAIL_INDEX(i) ||
2393                                      ' list_line_id: '|| l_LIST_LINE_ID(i) ||
2394                                      ' rltd_list_line_id: '|| l_RLTD_LIST_LINE_ID(i) ||
2395                                      ' pricing_status_text:' || l_pricing_status_text(i));
2396           END LOOP;
2397         END IF; --l_LINE_index1.COUNT
2398 
2399         IF l_debug = FND_API.G_TRUE THEN
2400           QP_PREQ_GRP.engine_debug('calling INSERT_RLTD_LDETS2');
2401         END IF;
2402         QP_PREQ_GRP.INSERT_RLTD_LINES2
2403         (l_LINE_INDEX1
2404          , l_LINE_DETAIL_INDEX1
2405          , l_RELATIONSHIP_TYPE_CODE
2406          , l_RELATED_LINE_INDEX
2407          , l_RELATED_LINE_DETAIL_INDEX
2408          , x_return_status
2409          , x_return_status_text
2410          , l_LIST_LINE_ID
2411          , l_RLTD_LIST_LINE_ID
2412          , l_pricing_status_text);
2413         /* delete from qp_npreq_rltd_lines_tmp
2414          where pricing_status_code = QP_PREQ_PUB.G_STATUS_NEW
2415          and relationship_type_code = QP_PREQ_PUB.G_PBH_LINE
2416          and pricing_status_text = G_CALC_INSERT;
2417        */ --need to delete them later
2418       END LOOP;
2419       CLOSE l_rltd_lines_cur;
2420 
2421       IF l_debug = FND_API.G_TRUE THEN
2422         QP_PREQ_GRP.engine_debug('close l_rltd_lines_cur');
2423       END IF;
2424 
2425       IF l_prg_adj_exists = 'Y' THEN
2426         OPEN l_getline_dis_cur;
2427         LOOP
2428           l_LINE_DETAIL_index.DELETE;
2429           l_LINE_DETAIL_TYPE_CODE.DELETE;
2430           l_PRICE_BREAK_TYPE_CODE.DELETE;
2431           l_LIST_PRICE.DELETE;
2432           l_LINE_INDEX.DELETE;
2433           l_CREATED_FROM_LIST_HEADER_ID.DELETE;
2434           l_CREATED_FROM_LIST_LINE_ID.DELETE;
2435           l_CREATED_FROM_LIST_LINE_TYPE.DELETE;
2436           l_CREATED_FROM_LIST_TYPE_CODE.DELETE;
2437           l_CREATED_FROM_SQL.DELETE;
2438           l_PRICING_GROUP_SEQUENCE.DELETE;
2439           l_PRICING_PHASE_ID.DELETE;
2440           l_OPERAND_CALCULATION_CODE.DELETE;
2441           l_OPERAND_VALUE.DELETE;
2442           l_SUBSTITUTION_TYPE_CODE.DELETE;
2443           l_SUBSTITUTION_VALUE_FROM.DELETE;
2444           l_SUBSTITUTION_VALUE_TO.DELETE;
2445           l_ASK_FOR_FLAG.DELETE;
2446           l_PRICE_FORMULA_ID.DELETE;
2447           l_PRICING_STATUS_CODE.DELETE;
2448           l_PRICING_STATUS_TEXT.DELETE;
2449           l_PRODUCT_PRECEDENCE.DELETE;
2450           l_INCOMPATABLILITY_GRP_CODE.DELETE;
2451           l_PROCESSED_FLAG.DELETE;
2452           l_APPLIED_FLAG.DELETE;
2453           l_AUTOMATIC_FLAG.DELETE;
2454           l_OVERRIDE_FLAG.DELETE;
2455           l_PRIMARY_UOM_FLAG.DELETE;
2456           l_PRINT_ON_INVOICE_FLAG.DELETE;
2457           l_MODIFIER_LEVEL_CODE.DELETE;
2458           l_BENEFIT_QTY.DELETE;
2459           l_BENEFIT_UOM_CODE.DELETE;
2460           l_LIST_LINE_NO.DELETE;
2461           l_ACCRUAL_FLAG.DELETE;
2462           l_ACCRUAL_CONVERSION_RATE.DELETE;
2463           l_ESTIM_ACCRUAL_RATE.DELETE;
2464           l_RECURRING_FLAG.DELETE;
2465           l_SELECTED_VOLUME_ATTR.DELETE;
2466           l_ROUNDING_FACTOR.DELETE;
2467           l_HEADER_LIMIT_EXISTS.DELETE;
2468           l_LINE_LIMIT_EXISTS.DELETE;
2469           l_CHARGE_TYPE_CODE.DELETE;
2470           l_CHARGE_SUBTYPE_CODE.DELETE;
2471           l_CURRENCY_DETAIL_ID.DELETE;
2472           l_CURRENCY_HEADER_ID.DELETE;
2473           l_SELLING_ROUNDING_FACTOR.DELETE;
2474           l_ORDER_CURRENCY.DELETE;
2475           l_PRICING_EFFECTIVE_DATE.DELETE;
2476           l_BASE_CURRENCY_CODE.DELETE;
2477           l_LINE_QUANTITY.DELETE;
2478           l_UPDATED_FLAG.DELETE;
2479           l_CALCULATION_CODE.DELETE;
2480           l_CHANGE_REASON_CODE.DELETE;
2481           l_CHANGE_REASON_TEXT.DELETE;
2482           l_PRICE_ADJUSTMENT_ID.DELETE;
2483           l_ACCUM_CONTEXT.DELETE;
2484           l_ACCUM_ATTRIBUTE.DELETE;
2485           l_ACCUM_FLAG.DELETE;
2486           l_BREAK_UOM_CODE.DELETE;
2487           l_BREAK_UOM_CONTEXT.DELETE;
2488           l_BREAK_UOM_ATTRIBUTE.DELETE;
2489           l_PROCESS_CODE.DELETE; -- 3215497
2490 
2491           IF l_debug = FND_API.G_TRUE THEN
2492             QP_PREQ_GRP.engine_debug('fetching l_getline_dis_cur');
2493           END IF;
2494 
2495           FETCH l_getline_dis_cur
2496           BULK COLLECT INTO
2497           l_LINE_DETAIL_index,
2498           l_LINE_DETAIL_TYPE_CODE,
2499           l_PRICE_BREAK_TYPE_CODE,
2500           l_LIST_PRICE,
2501           l_LINE_INDEX,
2502           l_CREATED_FROM_LIST_HEADER_ID,
2503           l_CREATED_FROM_LIST_LINE_ID,
2504           l_CREATED_FROM_LIST_LINE_TYPE,
2505           l_CREATED_FROM_LIST_TYPE_CODE,
2506           l_CREATED_FROM_SQL,
2507           l_PRICING_GROUP_SEQUENCE,
2508           l_PRICING_PHASE_ID,
2509           l_OPERAND_CALCULATION_CODE,
2510           l_OPERAND_VALUE,
2511           l_SUBSTITUTION_TYPE_CODE,
2512           l_SUBSTITUTION_VALUE_FROM,
2513           l_SUBSTITUTION_VALUE_TO,
2514           l_ASK_FOR_FLAG,
2515           l_PRICE_FORMULA_ID,
2516           l_PRICING_STATUS_CODE,
2517           l_PRICING_STATUS_TEXT,
2518           l_PRODUCT_PRECEDENCE,
2519           l_INCOMPATABLILITY_GRP_CODE,
2520           l_PROCESSED_FLAG,
2521           l_APPLIED_FLAG,
2522           l_AUTOMATIC_FLAG,
2523           l_OVERRIDE_FLAG,
2524           l_PRIMARY_UOM_FLAG,
2525           l_PRINT_ON_INVOICE_FLAG,
2526           l_MODIFIER_LEVEL_CODE,
2527           l_BENEFIT_QTY,
2528           l_BENEFIT_UOM_CODE,
2529           l_LIST_LINE_NO,
2530           l_ACCRUAL_FLAG,
2531           l_ACCRUAL_CONVERSION_RATE,
2532           l_ESTIM_ACCRUAL_RATE,
2533           l_RECURRING_FLAG,
2534           l_SELECTED_VOLUME_ATTR,
2535           l_ROUNDING_FACTOR,
2536           l_HEADER_LIMIT_EXISTS,
2537           l_LINE_LIMIT_EXISTS,
2538           l_CHARGE_TYPE_CODE,
2539           l_CHARGE_SUBTYPE_CODE,
2540           l_CURRENCY_DETAIL_ID,
2541           l_CURRENCY_HEADER_ID,
2542           l_SELLING_ROUNDING_FACTOR,
2543           l_ORDER_CURRENCY,
2544           l_PRICING_EFFECTIVE_DATE,
2545           l_BASE_CURRENCY_CODE,
2546           l_LINE_QUANTITY,
2547           l_UPDATED_FLAG,
2548           l_CALCULATION_CODE,
2549           l_CHANGE_REASON_CODE,
2550           l_CHANGE_REASON_TEXT,
2551           l_PRICE_ADJUSTMENT_ID,
2552           l_ACCUM_CONTEXT,
2553           l_ACCUM_ATTRIBUTE,
2554           l_ACCUM_FLAG,
2555           l_BREAK_UOM_CODE,
2556           l_BREAK_UOM_CONTEXT,
2557           l_BREAK_UOM_ATTRIBUTE,
2558           l_PROCESS_CODE; -- 3215497
2559           --      LIMIT nrows;
2560           EXIT WHEN l_LINE_DETAIL_index.COUNT = 0;
2561 
2562           IF l_debug = FND_API.G_TRUE THEN
2563             QP_PREQ_GRP.engine_debug('rows fetched:'|| l_line_detail_index.COUNT);
2564           END IF;
2565 
2566           IF l_LINE_DETAIL_index.COUNT > 0
2567             AND l_debug = FND_API.G_TRUE
2568             THEN
2569             FOR i IN l_LINE_DETAIL_index.FIRST..l_LINE_DETAIL_index.LAST
2570               LOOP
2571               QP_PREQ_GRP.engine_debug('=======line_detail_index: '|| l_LINE_DETAIL_index(i) ||
2572                                        ' line_detail_type_code: '|| l_LINE_DETAIL_TYPE_CODE(i) ||
2573                                        ' price_break_type_code: '|| l_PRICE_BREAK_TYPE_CODE(i) ||
2574                                        ' list_price: ' || l_LIST_PRICE(i) ||
2575                                        ' line_index: '|| l_LINE_INDEX(i));
2576 
2577               QP_PREQ_GRP.engine_debug('created_from_list_header_id: '|| l_CREATED_FROM_LIST_HEADER_ID(i) ||
2578                                        ' created_from_list_line_id: '|| l_CREATED_FROM_LIST_LINE_ID(i) ||
2579                                        ' created_from_list_line_type: '|| l_CREATED_FROM_LIST_LINE_TYPE(i) ||
2580                                        ' created_from_list_type_code: '|| l_CREATED_FROM_LIST_TYPE_CODE(i) ||
2581                                        ' created_from_sql: '|| l_CREATED_FROM_SQL(i) ||
2582                                        ' pricing_group_sequence: ' || l_PRICING_GROUP_SEQUENCE(i) ||
2583                                        ' pricing_phase_id: '|| l_PRICING_PHASE_ID(i) ||
2584                                        ' oprand_calculation_code: ' || l_OPERAND_CALCULATION_CODE(i) ||
2585                                        ' operand_value: ' || l_OPERAND_VALUE(i));
2586               QP_PREQ_GRP.engine_debug(' substitution_type_code: ' || l_SUBSTITUTION_TYPE_CODE(i) ||
2587                                        ' substitution_value_from: ' || l_SUBSTITUTION_VALUE_FROM(i) ||
2588                                        ' substitution_value_to: ' || l_SUBSTITUTION_VALUE_TO(i) ||
2589                                        ' ask_for_flag: ' || l_ASK_FOR_FLAG(i) ||
2590                                        ' price_formula_id: '|| l_PRICE_FORMULA_ID(i) ||
2591                                        ' pricing_status_code: '|| l_PRICING_STATUS_CODE(i) ||
2592                                        ' pricing_status_text: '|| l_PRICING_STATUS_TEXT(i) ||
2593                                        ' product_precedence: '|| l_PRODUCT_PRECEDENCE(i) ||
2594                                        ' incompatability_grp_code: ' || l_INCOMPATABLILITY_GRP_CODE(i));
2595 
2596               QP_PREQ_GRP.engine_debug(' processed_flag: '|| l_PROCESSED_FLAG(i) ||
2597                                        ' applied_flag: '|| l_APPLIED_FLAG(i) ||
2598                                        ' automatic_flag: '|| l_AUTOMATIC_FLAG(i) ||
2599                                        ' override_flag: '|| l_OVERRIDE_FLAG(i) ||
2600                                        ' primary_uom_flag: '|| l_PRIMARY_UOM_FLAG(i) ||
2601                                        ' print_on_invoice_flag: '|| l_PRINT_ON_INVOICE_FLAG(i) ||
2602                                        ' MODIFIER_LEVEL_CODE: '|| l_MODIFIER_LEVEL_CODE(i) ||
2603                                        ' BENEFIT_QTY: '|| l_BENEFIT_QTY(i) ||
2604                                        ' BENEFIT_UOM_CODE: '|| l_BENEFIT_UOM_CODE(i));
2605 
2606               QP_PREQ_GRP.engine_debug(' LIST_LINE_NO: '|| l_LIST_LINE_NO(i) ||
2607                                        ' ACCRUAL_FLAG: '|| l_ACCRUAL_FLAG(i) ||
2608                                        ' ACCRUAL_CONVERSION_RATE: '|| l_ACCRUAL_CONVERSION_RATE(i) ||
2609                                        ' ESTIM_ACCRUAL_RATE: '|| l_ESTIM_ACCRUAL_RATE(i) ||
2610                                        ' RECURRING_FLAG: '|| l_RECURRING_FLAG(i) ||
2611                                        ' SELECTED_VOLUME_ATTR: '|| l_SELECTED_VOLUME_ATTR(i) ||
2612                                        ' ROUNDING_FACTOR: '|| l_ROUNDING_FACTOR(i) ||
2613                                        ' HEADER_LIMIT_EXISTS: '|| l_HEADER_LIMIT_EXISTS(i) ||
2614                                        ' LINE_LIMIT_EXISTS: '|| l_LINE_LIMIT_EXISTS(i));
2615 
2616               QP_PREQ_GRP.engine_debug(' CHARGE_TYPE_CODE:'|| l_CHARGE_TYPE_CODE(i) ||
2617                                        ' CHARGE_SUBTYPE_CODE:'|| l_CHARGE_SUBTYPE_CODE(i) ||
2618                                        ' CURRENCY_DETAIL_ID:'|| l_CURRENCY_DETAIL_ID(i) ||
2619                                        ' CURRENCY_HEADER_ID:'|| l_CURRENCY_HEADER_ID(i) ||
2620                                        ' SELLING_ROUNDING_FACTOR:'|| l_SELLING_ROUNDING_FACTOR(i) ||
2621                                        ' ORDER_CURRENCY:'|| l_ORDER_CURRENCY(i) ||
2622                                        ' PRICING_EFFECTIVE_DATE:'|| l_PRICING_EFFECTIVE_DATE(i) ||
2623                                        ' BASE_CURRENCY_CODE:'|| l_BASE_CURRENCY_CODE(i) ||
2624                                        ' LINE_QUANTITY:'|| l_LINE_QUANTITY(i));
2625 
2626               QP_PREQ_GRP.engine_debug(' UPDATED_FLAG:'|| l_UPDATED_FLAG(i) ||
2627                                        ' CALCULATION_CODE:'|| l_CALCULATION_CODE(i) ||
2628                                        ' CHANGE_REASON_CODE:'|| l_CHANGE_REASON_CODE(i) ||
2629                                        ' CHANGE_REASON_TEXT:'|| l_CHANGE_REASON_TEXT(i) ||
2630                                        ' PRICE_ADJUSTMENT_ID:'|| l_PRICE_ADJUSTMENT_ID(i) ||
2631                                        ' ACCUM_CONTEXT:'|| l_ACCUM_CONTEXT(i) ||
2632                                        ' ACCUM_ATTRIBUTE:'|| l_ACCUM_ATTRIBUTE(i) ||
2633                                        ' ACCUM_FLAG:'|| l_ACCUM_FLAG(i) ||
2634                                        ' BREAK_UOM_CODE:'|| l_BREAK_UOM_CODE(i) ||
2635                                        ' BREAK_UOM_CONTEXT:'|| l_BREAK_UOM_CONTEXT(i) ||
2636                                        ' BREAK_UOM_ATTRIBUTE:'|| l_BREAK_UOM_ATTRIBUTE(i));
2637 
2638             END LOOP;
2639           END IF; --l_line_detail_index.COUNT
2640 
2641           IF l_LINE_DETAIL_index.COUNT > 0 THEN
2642             IF l_debug = FND_API.G_TRUE THEN
2643               QP_PREQ_GRP.engine_debug('calling INSERT_LDETS2');
2644             END IF;
2645             QP_PREQ_GRP.INSERT_LDETS2
2646             (l_LINE_DETAIL_index,
2647              l_LINE_DETAIL_TYPE_CODE,
2648              l_PRICE_BREAK_TYPE_CODE,
2649              l_LIST_PRICE,
2650              l_LINE_INDEX,
2651              l_CREATED_FROM_LIST_HEADER_ID,
2652              l_CREATED_FROM_LIST_LINE_ID,
2653              l_CREATED_FROM_LIST_LINE_TYPE,
2654              l_CREATED_FROM_LIST_TYPE_CODE,
2655              l_CREATED_FROM_SQL,
2656              l_PRICING_GROUP_SEQUENCE,
2657              l_PRICING_PHASE_ID,
2658              l_OPERAND_CALCULATION_CODE,
2659              l_OPERAND_VALUE,
2660              l_SUBSTITUTION_TYPE_CODE,
2661              l_SUBSTITUTION_VALUE_FROM,
2662              l_SUBSTITUTION_VALUE_TO,
2663              l_ASK_FOR_FLAG,
2664              l_PRICE_FORMULA_ID,
2665              l_PRICING_STATUS_CODE,
2666              l_PRICING_STATUS_TEXT,
2667              l_PRODUCT_PRECEDENCE,
2668              l_INCOMPATABLILITY_GRP_CODE,
2669              l_PROCESSED_FLAG,
2670              l_APPLIED_FLAG,
2671              l_AUTOMATIC_FLAG,
2672              l_OVERRIDE_FLAG,
2673              l_PRIMARY_UOM_FLAG,
2674              l_PRINT_ON_INVOICE_FLAG,
2675              l_MODIFIER_LEVEL_CODE,
2676              l_BENEFIT_QTY,
2677              l_BENEFIT_UOM_CODE,
2678              l_LIST_LINE_NO,
2679              l_ACCRUAL_FLAG,
2680              l_ACCRUAL_CONVERSION_RATE,
2681              l_ESTIM_ACCRUAL_RATE,
2682              l_RECURRING_FLAG,
2683              l_SELECTED_VOLUME_ATTR,
2684              l_ROUNDING_FACTOR,
2685              l_HEADER_LIMIT_EXISTS,
2686              l_LINE_LIMIT_EXISTS,
2687              l_CHARGE_TYPE_CODE,
2688              l_CHARGE_SUBTYPE_CODE,
2689              l_CURRENCY_DETAIL_ID,
2690              l_CURRENCY_HEADER_ID,
2691              l_SELLING_ROUNDING_FACTOR,
2692              l_ORDER_CURRENCY,
2693              l_PRICING_EFFECTIVE_DATE,
2694              l_BASE_CURRENCY_CODE,
2695              l_LINE_QUANTITY,
2696              l_UPDATED_FLAG,
2697              l_CALCULATION_CODE,
2698              l_CHANGE_REASON_CODE,
2699              l_CHANGE_REASON_TEXT,
2700              l_PRICE_ADJUSTMENT_ID,
2701              l_ACCUM_CONTEXT,
2702              l_ACCUM_ATTRIBUTE,
2703              l_ACCUM_FLAG,
2704              l_BREAK_UOM_CODE,
2705              l_BREAK_UOM_CONTEXT,
2706              l_BREAK_UOM_ATTRIBUTE,
2707              l_PROCESS_CODE,  -- 3215497
2708              x_return_status,
2709              x_return_status_text);
2710           END IF;
2711         END LOOP;
2712         --CLOSE l_ldets_cur;
2713         CLOSE l_getline_dis_cur;
2714 
2715         IF l_debug = FND_API.G_TRUE THEN
2716           QP_PREQ_GRP.engine_debug('close l_getline_dis_cur');
2717         END IF;
2718 
2719       END IF;
2720 
2721       --END IF;--l_pbh_adj_exists = QP_PREQ_PUB.G_YES
2722     END IF; --(QP_PREQ_PUB.G_CHECK_CUST_VIEW_FLAG = QP_PREQ_PUB.G_YES AND
2723     --QP_BULK_PREQ_GRP.G_HVOP_Pricing_ON = QP_PREQ_PUB.G_NO)
2724   END;
2725 
2726   --This procedure is to update the passed in overridden pbh modifiers
2727   --with the setup_value_from/to, qualifier_value, price_break_type_code
2728   --etc on the child lines which the price_break_calculation procedure
2729   --looks at to evaluate the breaks
2730   --This procedure will be used in the performance code path when
2731   --the public API is called by non-OM applications
2732   -- Ravi -- Added code to update the line detail type code which will be used
2733   -- in l_calculate_cur to not fetch the child lines as they are already in the qp_npreq_rltd_lines_tmp table
2734   -- Bug was adjustment amt was being calculated for child lines where it is not satisfied also
2735   PROCEDURE Update_passed_in_pbh(x_return_status OUT NOCOPY VARCHAR2,
2736                                  x_return_status_text OUT NOCOPY VARCHAR2) IS
2737 
2738   BEGIN
2739 
2740     l_debug := QP_PREQ_GRP.G_DEBUG_ENGINE;
2741 
2742     --when any changes are made to this, the similar updated stmt
2743     --in Update_Related_Line_Info procedure in this file also needs to be changed
2744     UPDATE qp_npreq_rltd_lines_tmp rltd
2745             SET (setup_value_from,
2746                  setup_value_to,
2747                  relationship_type_detail,
2748                  list_line_id,
2749                  related_list_line_id,
2750                  related_list_line_type,
2751                  operand_calculation_code,
2752                  operand,
2753                  pricing_group_sequence,
2754                  qualifier_value)
2755                     =
2756                     (SELECT
2757                      qpa.pricing_attr_value_from,
2758                      qpa.pricing_attr_value_to,
2759                      ldet_pbh.price_break_type_code,
2760                      ldet_pbh.created_from_list_line_id,
2761                      ldet.created_from_list_line_id,
2762                      ldet.created_from_list_line_type,
2763                      ldet.operand_calculation_code,
2764                      ldet.operand_value,
2765                      ldet.pricing_group_sequence,
2766                      nvl(ldet.line_quantity,
2767                          nvl(line.priced_quantity, line.line_quantity))
2768                      FROM
2769                      qp_npreq_ldets_tmp ldet,
2770                      qp_npreq_ldets_tmp ldet_pbh,
2771                      qp_npreq_lines_tmp line,
2772                      qp_pricing_attributes qpa
2773                      WHERE
2774                      ldet.line_detail_index = rltd.related_line_detail_index
2775                      AND ldet_pbh.line_detail_index = rltd.line_detail_index
2776                      AND line.line_index = ldet.line_index
2777                      AND qpa.list_line_id = ldet.created_from_list_line_id
2778                      AND ldet.pricing_status_code = G_STATUS_UNCHANGED
2779                      AND ldet.updated_flag = G_YES
2780                      AND rltd.relationship_type_code = G_PBH_LINE
2781                      AND rltd.pricing_status_code = G_STATUS_NEW)
2782     WHERE rltd.line_detail_index IN (SELECT ldet.line_detail_index
2783                                      FROM qp_npreq_ldets_tmp ldet
2784                                      WHERE ldet.pricing_status_code = G_STATUS_UNCHANGED
2785                                      AND ldet.applied_flag = G_YES
2786                                      AND ldet.updated_flag = G_YES
2787                                      AND ldet.created_from_list_line_type = G_PRICE_BREAK_TYPE)
2788     AND rltd.relationship_type_code = G_PBH_LINE
2789     AND rltd.pricing_status_code = G_STATUS_NEW;
2790 
2791     IF (l_debug = FND_API.G_TRUE) THEN
2792       QP_PREQ_GRP.engine_debug('Updating PBH rltd dlts COUNT: '
2793                                || SQL%ROWCOUNT);
2794       QP_PREQ_GRP.engine_debug('Updating the child detail type code');
2795     END IF;
2796 
2797     UPDATE qp_npreq_ldets_tmp
2798     SET line_detail_type_code = QP_PREQ_PUB.G_CHILD_DETAIL_TYPE
2799     WHERE  line_detail_index IN (SELECT related_line_detail_index
2800                                  FROM  qp_npreq_rltd_lines_tmp
2801                                  WHERE  relationship_type_code = G_PBH_LINE
2802                                  AND pricing_status_code = G_STATUS_NEW);
2803 
2804     IF (l_debug = FND_API.G_TRUE) THEN
2805       FOR i IN (SELECT line_detail_index
2806                 FROM qp_npreq_ldets_tmp
2807                 WHERE line_detail_type_code = QP_PREQ_PUB.G_CHILD_DETAIL_TYPE)
2808         LOOP
2809         QP_PREQ_GRP.engine_debug(' PBH Child Line Detail Index : ' || i.line_detail_index);
2810       END LOOP;
2811 
2812     END IF;
2813 
2814 
2815     x_return_status := FND_API.G_RET_STS_SUCCESS;
2816   EXCEPTION
2817     WHEN OTHERS THEN
2818       x_return_status := FND_API.G_RET_STS_ERROR;
2819       x_return_status_text := 'Exception in updated_passed_pbh '|| SQLERRM;
2820   END Update_passed_in_pbh;
2821 
2822   FUNCTION CHECK_GSA_INDICATOR RETURN VARCHAR2 IS
2823 
2824   CURSOR l_check_gsa_ind_cur IS
2825     SELECT 'Y'
2826      FROM qp_npreq_lines_tmp line,
2827             qp_npreq_line_attrs_tmp gsa_attr
2828      WHERE gsa_attr.line_index = line.line_index
2829              AND gsa_attr.pricing_status_code = G_STATUS_UNCHANGED
2830             AND gsa_attr.attribute_type = G_QUALIFIER_TYPE
2831             AND gsa_attr.context = G_CUSTOMER_CONTEXT
2832             AND gsa_attr.attribute = G_GSA_ATTRIBUTE
2833             AND gsa_attr.value_from = G_YES;
2834 
2835   l_gsa_indicator VARCHAR2(1) := 'N';
2836   l_routine VARCHAR2(50) := 'QP_PREQ_PUB.CHECK_GSA_INDICATOR';
2837   BEGIN
2838     IF l_debug = FND_API.G_TRUE THEN
2839       QP_PREQ_GRP.engine_debug('Begin CHECK_GSA_INDICATOR '|| l_gsa_indicator);
2840 
2841     END IF;
2842     OPEN l_check_gsa_ind_cur;
2843     FETCH l_check_gsa_ind_cur INTO l_gsa_indicator;
2844     CLOSE l_check_gsa_ind_cur;
2845 
2846     IF l_debug = FND_API.G_TRUE THEN
2847       QP_PREQ_GRP.engine_debug('Cursor fetched '|| l_gsa_indicator);
2848 
2849     END IF;
2850     RETURN l_gsa_indicator;
2851 
2852     IF l_debug = FND_API.G_TRUE THEN
2853       QP_PREQ_GRP.engine_debug('END CHECK_GSA_INDICATOR ');
2854     END IF;
2855   EXCEPTION
2856     WHEN OTHERS THEN
2857       IF l_debug = FND_API.G_TRUE THEN
2858         QP_PREQ_GRP.engine_debug('Exception in '|| l_routine ||' '|| SQLERRM);
2859       END IF;
2860       RETURN l_gsa_indicator;
2861   END CHECK_GSA_INDICATOR;
2862 
2863   PROCEDURE CHECK_GSA_VIOLATION(
2864                                 x_return_status OUT NOCOPY VARCHAR2,
2865                                 x_return_status_text OUT NOCOPY VARCHAR2) IS
2866 
2867   -- bug 3804392 - removed the hint qp_list_headers_b_n2 and also rearranged the tables in FROM clause
2868   CURSOR l_gsa_check_cur IS
2869     SELECT /*+ ORDERED USE_NL(req lhdr lattr qpa ql) index(qpa qp_pricing_attributes_n5) */
2870              line.line_index,
2871              line.adjusted_unit_price,
2872              MIN(ql.operand) operand
2873      FROM qp_npreq_lines_tmp line,
2874              qp_price_req_sources req,
2875              qp_list_headers_b lhdr,
2876              qp_npreq_line_attrs_tmp lattr,
2877              qp_pricing_attributes qpa,
2878              qp_list_lines ql
2879      WHERE lattr.line_index = line.line_index
2880              AND lattr.pricing_status_code IN
2881                              (G_STATUS_NEW, G_STATUS_UNCHANGED)
2882              AND lattr.attribute_type = G_PRODUCT_TYPE
2883              AND lattr.context = qpa.product_attribute_context
2884              AND lattr.attribute = qpa.product_attribute
2885              AND lattr.value_from = qpa.product_attr_value
2886              AND qpa.excluder_flag = G_NO
2887              AND qpa.pricing_phase_id = 2
2888              AND qpa.qualification_ind = 6
2889              AND lattr.line_index = line.line_index
2890              AND req.request_type_code = line.request_type_code
2891              AND lhdr.list_header_id = qpa.list_header_id
2892              AND lhdr.active_flag = G_YES
2893              AND ((lhdr.currency_code IS NOT NULL AND lhdr.currency_code = line.currency_code)
2894                   OR
2895                   lhdr.currency_code IS NULL) -- optional currency
2896              AND lhdr.list_type_code = G_DISCOUNT_LIST_HEADER
2897              AND lhdr.source_system_code = req.source_system_code
2898              AND lhdr.gsa_indicator = G_YES
2899              AND trunc(line.pricing_effective_date) BETWEEN
2900              trunc(nvl(lhdr.start_date_active
2901                        , line.pricing_effective_date))
2902              AND trunc(nvl(lhdr.End_date_active
2903                            , line.pricing_effective_date))
2904              AND qpa.list_line_id = ql.list_line_id
2905              AND trunc(line.pricing_effective_date) BETWEEN
2906              trunc(nvl(ql.start_date_active
2907                        , line.pricing_effective_date))
2908              AND trunc(nvl(ql.End_date_active
2909                            , line.pricing_effective_date))
2910      GROUP BY line.line_index, line.adjusted_unit_price;
2911 
2912   -- bug 3804392 - removed the hint qp_list_headers_b_n2 and also rearranged the tables in FROM clause
2913   CURSOR l_attrmgr_gsa_check_cur IS
2914     SELECT /*+ ORDERED USE_NL(req lhdr lattr qpa ql) index(qpa qp_pricing_attributes_n5) */
2915              line.line_index,
2916              line.adjusted_unit_price,
2917              MIN(ql.operand) operand
2918      FROM qp_npreq_lines_tmp line,
2919              qp_price_req_sources_v req,
2920              qp_list_headers_b lhdr,
2921              qp_npreq_line_attrs_tmp lattr,
2922              qp_pricing_attributes qpa,
2923              qp_list_lines ql
2924      WHERE lattr.line_index = line.line_index
2925              AND lattr.pricing_status_code IN
2926                              (G_STATUS_NEW, G_STATUS_UNCHANGED)
2927              AND lattr.attribute_type = G_PRODUCT_TYPE
2928              AND lattr.context = qpa.product_attribute_context
2929              AND lattr.attribute = qpa.product_attribute
2930              AND lattr.value_from = qpa.product_attr_value
2931              AND qpa.excluder_flag = G_NO
2932              AND qpa.pricing_phase_id = 2
2933              AND qpa.qualification_ind = 6
2934              AND lattr.line_index = line.line_index
2935              AND req.request_type_code = line.request_type_code
2936              AND lhdr.list_header_id = qpa.list_header_id
2937              AND lhdr.active_flag = G_YES
2938              AND ((lhdr.currency_code IS NOT NULL AND lhdr.currency_code = line.currency_code)
2939                   OR
2940                   lhdr.currency_code IS NULL) -- optional currency
2941              AND lhdr.list_type_code = G_DISCOUNT_LIST_HEADER
2942              AND lhdr.source_system_code = req.source_system_code
2943              AND lhdr.gsa_indicator = G_YES
2944              AND trunc(line.pricing_effective_date) BETWEEN
2945              trunc(nvl(lhdr.start_date_active
2946                        , line.pricing_effective_date))
2947              AND trunc(nvl(lhdr.End_date_active
2948                            , line.pricing_effective_date))
2949              AND qpa.list_line_id = ql.list_line_id
2950              AND trunc(line.pricing_effective_date) BETWEEN
2951              trunc(nvl(ql.start_date_active
2952                        , line.pricing_effective_date))
2953              AND trunc(nvl(ql.End_date_active
2954                            , line.pricing_effective_date))
2955      GROUP BY line.line_index, line.adjusted_unit_price;
2956 
2957 
2958   l_gsa_line_index_tbl QP_PREQ_GRP.NUMBER_TYPE;
2959   l_gsa_sts_text_tbl QP_PREQ_GRP.VARCHAR_TYPE;
2960   I PLS_INTEGER := 0;
2961   BEGIN
2962     l_debug := QP_PREQ_GRP.G_DEBUG_ENGINE;
2963     l_gsa_line_index_tbl.DELETE;
2964     l_gsa_sts_text_tbl.DELETE;
2965 
2966     IF l_debug = FND_API.G_TRUE THEN
2967       QP_PREQ_GRP.engine_debug('Begin Pub GSA check');
2968 
2969     END IF;
2970     -- Call GSA Check only for non-gsa customers(GSA_QUALIFIER_FLAG IS NULL)
2971     IF G_GSA_CHECK_FLAG = G_YES
2972       AND G_GSA_ENABLED_FLAG = G_YES
2973       AND G_GSA_INDICATOR = G_NO
2974       THEN
2975       IF l_debug = FND_API.G_TRUE THEN
2976         QP_PREQ_GRP.engine_debug('IN GSA check attrmgr '|| G_ATTR_MGR_INSTALLED);
2977 
2978       END IF;
2979       IF G_ATTR_MGR_INSTALLED = G_NO
2980         THEN
2981         FOR GSA IN l_gsa_check_cur
2982           LOOP
2983           -- I := I + 1; bug2426025 placed the counter in the if condition
2984           IF l_debug = FND_API.G_TRUE THEN
2985             QP_PREQ_GRP.engine_debug('GSA check: line_index '|| GSA.line_index);
2986             QP_PREQ_GRP.engine_debug('GSA check: gsa_price '|| GSA.operand);
2987             QP_PREQ_GRP.engine_debug('GSA check: adj_price '|| GSA.adjusted_unit_price);
2988           END IF;
2989           IF GSA.adjusted_unit_price <= GSA.operand
2990             THEN
2991             I := I + 1;
2992             l_gsa_line_index_tbl(I) := GSA.line_index;
2993             l_gsa_sts_text_tbl(I) := GSA.operand;
2994             IF l_debug = FND_API.G_TRUE THEN
2995               QP_PREQ_GRP.engine_debug('GSA violtn:lineindex '
2996                                        || l_gsa_line_index_tbl(I));
2997               QP_PREQ_GRP.engine_debug('GSA violtn:gsa price '
2998                                        || l_gsa_sts_text_tbl(I));
2999             END IF;
3000           END IF;
3001         END LOOP; --l_gsa_check_cur
3002       ELSE --G_ATTR_MGR_INSTALLED --not installed
3003         FOR GSA IN l_attrmgr_gsa_check_cur
3004           LOOP
3005           -- I := I + 1; bug2426025 placed the counter in the if condition
3006           IF l_debug = FND_API.G_TRUE THEN
3007             QP_PREQ_GRP.engine_debug('GSA check: line_index '|| GSA.line_index);
3008             QP_PREQ_GRP.engine_debug('GSA check: gsa_price '|| GSA.operand);
3009             QP_PREQ_GRP.engine_debug('GSA check: adj_price '|| GSA.adjusted_unit_price);
3010           END IF;
3011           IF GSA.adjusted_unit_price <= GSA.operand
3012             THEN
3013             I := I + 1;
3014             l_gsa_line_index_tbl(I) := GSA.line_index;
3015             l_gsa_sts_text_tbl(I) := GSA.operand;
3016             IF l_debug = FND_API.G_TRUE THEN
3017               QP_PREQ_GRP.engine_debug('GSA violtn:lineindex '
3018                                        || l_gsa_line_index_tbl(I));
3019               QP_PREQ_GRP.engine_debug('GSA violtn:gsa price '
3020                                        || l_gsa_sts_text_tbl(I));
3021             END IF;
3022           END IF;
3023         END LOOP; --l_attrmgr_gsa_check_cur
3024       END IF; --G_ATTR_MGR_INSTALLED --not installed
3025 
3026       IF l_debug = FND_API.G_TRUE THEN
3027         QP_PREQ_GRP.engine_debug('AFTER GSA check');
3028       END IF;
3029     END IF;
3030 
3031     IF l_gsa_line_index_tbl.COUNT > 0
3032       THEN
3033       IF l_debug = FND_API.G_TRUE THEN
3034         QP_PREQ_GRP.engine_debug('Before GSA update '|| l_gsa_line_index_tbl.COUNT);
3035       END IF;
3036       FORALL I IN l_gsa_line_index_tbl.FIRST..l_gsa_line_index_tbl.LAST
3037       UPDATE qp_npreq_lines_tmp
3038       SET pricing_status_code = G_STATUS_GSA_VIOLATION,
3039           pricing_status_text =
3040           'GSA VIOLATION - GSA PRICE '|| l_gsa_sts_text_tbl(I)
3041       WHERE line_index = l_gsa_line_index_tbl(I);
3042     END IF; --l_gsa_line_index_tbl.COUNT
3043 
3044     IF l_debug = FND_API.G_TRUE THEN
3045       QP_PREQ_GRP.engine_debug('Pub GSA check completed');
3046 
3047     END IF;
3048     --GSA VIOLATION CHECK
3049 
3050 
3051   EXCEPTION
3052     WHEN OTHERS THEN
3053       IF l_debug = FND_API.G_TRUE THEN
3054         QP_PREQ_GRP.ENGINE_DEBUG('exception QP_PREQ_PUB.check gsa_violation: '|| SQLERRM);
3055       END IF;
3056       x_return_status := FND_API.G_RET_STS_ERROR;
3057       x_return_status_text := 'QP_PREQ_PUB.check gsa_violation: '|| SQLERRM;
3058   END CHECK_GSA_VIOLATION;
3059 
3060 
3061   PROCEDURE BACK_CALCULATION(p_line_index IN VARCHAR2
3062                              , p_amount_changed IN NUMBER
3063                              , x_back_calc_rec OUT NOCOPY BACK_CALC_REC_TYPE
3064                              , x_return_status OUT NOCOPY VARCHAR2
3065                              , x_return_status_text OUT NOCOPY VARCHAR2) IS
3066 
3067 
3068   CURSOR l_back_calculate_cur IS
3069     SELECT    ldet.created_from_list_line_id
3070             , ldet.line_index line_ind
3071             , ldet.line_detail_index
3072             , ldet.created_from_list_line_type
3073             , ldet.applied_flag
3074             , p_amount_changed  amount_changed
3075             , line.priced_quantity
3076             , ldet.operand_calculation_code
3077             , ldet.operand_value
3078             , ldet.adjustment_amount
3079             , ldet.modifier_level_code
3080             , line.unit_price
3081             , ldet.pricing_status_code
3082             , ldet.pricing_status_text
3083             , line.rounding_factor
3084             , ldet.calculation_code
3085             , ldet.line_quantity
3086             , ldet.created_from_list_header_id
3087             , ldet.created_from_list_type_code
3088             , ldet.price_break_type_code
3089             , ldet.charge_type_code
3090             , ldet.charge_subtype_code
3091             , ldet.automatic_flag
3092             , ldet.pricing_phase_id
3093             , ldet.limit_code
3094             , ldet.limit_text
3095             , ldet.pricing_group_sequence
3096             , ldet.list_line_no
3097             , ldet.calculation_code
3098 --fix for bug 2833753
3099             , decode(G_BACK_CALCULATION_CODE, 'DIS',
3100                      decode(ldet.calculation_code, 'BACK_CALCULATE', - 10000,
3101                             decode(ldet.created_from_list_line_type, 'DIS',
3102                                    decode(ldet.applied_flag, G_YES, - 100, - 1000),
3103                                    decode(ldet.applied_flag, G_YES, 1000, 100))),
3104                      decode(ldet.calculation_code, 'BACK_CALCULATE', 10000,
3105                             decode(ldet.created_from_list_line_type, 'DIS',
3106                                    decode(ldet.applied_flag, G_YES, - 1000, - 100),
3107                                    decode(ldet.applied_flag, G_YES, 100, 1000)))) precedence
3108     FROM    qp_npreq_ldets_tmp ldet, qp_npreq_lines_tmp line
3109     WHERE   line.line_index = p_line_index
3110     AND     line.line_type_code = G_LINE_LEVEL -- sql repos
3111     AND     line.price_flag IN (G_YES, G_PHASE)
3112     AND     ldet.line_index = line.line_index
3113     AND     (ldet.pricing_status_code IN (G_STATUS_NEW, G_STATUS_UNCHANGED))
3114 --commented for OC issue of duplicate manual adj in temp table
3115 --as this cursor would pick up the engine returned manual adj
3116 --		or ldet.process_code = G_STATUS_NEW)
3117     AND     ldet.created_from_list_line_type IN (G_DISCOUNT, G_SURCHARGE)
3118     AND     ldet.automatic_flag = G_NO
3119     AND     ldet.override_flag = G_YES
3120     AND     ldet.pricing_group_sequence IS NULL --only return null bucket manual modifiers
3121     AND     ldet.line_detail_index NOT IN
3122                     (SELECT rltd.related_line_detail_index
3123                      FROM qp_npreq_rltd_lines_tmp rltd
3124                      WHERE rltd.relationship_type_code = G_PBH_LINE
3125                      AND rltd.pricing_status_code = G_STATUS_NEW)
3126     --ORDER BY ldet.calculation_code,ldet.created_from_list_line_type,ldet.applied_flag desc;
3127     --ORDER BY ldet.created_from_list_line_type, precedence desc , ldet.applied_flag desc;
3128 --fix for bug 2833753
3129     ORDER BY precedence;
3130 
3131   l_back_calc_rec back_calc_rec_type;
3132 
3133   l_back_line_dtl_index_tbl QP_PREQ_GRP.NUMBER_TYPE;
3134   l_back_line_index_tbl QP_PREQ_GRP.NUMBER_TYPE;
3135   l_back_list_line_id_tbl QP_PREQ_GRP.NUMBER_TYPE;
3136   l_back_list_line_type_tbl QP_PREQ_GRP.VARCHAR_TYPE;
3137   l_back_operand_value_tbl QP_PREQ_GRP.NUMBER_TYPE;
3138   l_back_priced_qty_tbl QP_PREQ_GRP.NUMBER_TYPE;
3139   l_back_unit_price_tbl QP_PREQ_GRP.NUMBER_TYPE;
3140   l_back_adj_amt_tbl QP_PREQ_GRP.NUMBER_TYPE;
3141   l_back_amount_changed_tbl QP_PREQ_GRP.NUMBER_TYPE;
3142   l_back_applied_flag_tbl QP_PREQ_GRP.FLAG_TYPE;
3143   l_back_operand_calc_code_tbl QP_PREQ_GRP.VARCHAR_TYPE;
3144   l_back_sts_code_tbl QP_PREQ_GRP.VARCHAR_TYPE;
3145   l_back_sts_txt_tbl QP_PREQ_GRP.VARCHAR_TYPE;
3146   l_back_rounding_fac_tbl QP_PREQ_GRP.NUMBER_TYPE;
3147   l_back_calc_code_tbl QP_PREQ_GRP.VARCHAR_TYPE;
3148   l_back_line_qty_tbl QP_PREQ_GRP.NUMBER_TYPE;
3149   l_back_list_hdr_id_tbl QP_PREQ_GRP.NUMBER_TYPE;
3150   l_back_list_type_tbl QP_PREQ_GRP.VARCHAR_TYPE;
3151   l_back_price_brk_type_tbl QP_PREQ_GRP.VARCHAR_TYPE;
3152   l_back_chrg_type_tbl QP_PREQ_GRP.VARCHAR_TYPE;
3153   l_back_chrg_subtype_tbl QP_PREQ_GRP.VARCHAR_TYPE;
3154   l_back_auto_flag_tbl QP_PREQ_GRP.FLAG_TYPE;
3155   l_back_phase_id_tbl QP_PREQ_GRP.NUMBER_TYPE;
3156   l_back_limit_code_tbl QP_PREQ_GRP.VARCHAR_TYPE;
3157   l_back_limit_text_tbl QP_PREQ_GRP.VARCHAR_TYPE;
3158   l_back_bucket_tbl QP_PREQ_GRP.NUMBER_TYPE;
3159   l_back_list_line_no_tbl QP_PREQ_GRP.VARCHAR_TYPE;
3160   l_back_calculation_code_tbl QP_PREQ_GRP.VARCHAR_TYPE;
3161   l_back_calc_precedence_tbl QP_PREQ_GRP.NUMBER_TYPE;
3162   l_back_modifier_level_code_tbl QP_PREQ_GRP.VARCHAR_TYPE;
3163 
3164   BACK_CALCULATE_SUCC BOOLEAN := TRUE;
3165   l_return_status VARCHAR2(30);
3166   l_return_status_text VARCHAR2(240);
3167   l_adjustment_amount NUMBER := 0;
3168   l_operand_value NUMBER := 0;
3169 
3170   i NUMBER;
3171 
3172   BEGIN
3173 
3174     l_debug := QP_PREQ_GRP.G_DEBUG_ENGINE;
3175     --**************************************************************
3176     --BACK CALCULATION ROUTINE
3177     --**************************************************************
3178     IF l_debug = FND_API.G_TRUE THEN
3179       QP_PREQ_GRP.ENGINE_DEBUG('BACK CALCULATION ROUTINE '
3180                                || G_BACK_CALCULATION_CODE);
3181 
3182 
3183     END IF;
3184     OPEN l_back_calculate_cur;
3185     --LOOP
3186     IF l_debug = FND_API.G_TRUE THEN
3187       QP_PREQ_GRP.ENGINE_DEBUG('BACK CALCULATION ROUTINE1');
3188     END IF;
3189     l_back_list_line_id_tbl.DELETE;
3190     l_back_line_index_tbl.DELETE;
3191     l_back_line_dtl_index_tbl.DELETE;
3192     l_back_list_line_type_tbl.DELETE;
3193     l_back_applied_flag_tbl.DELETE;
3194     l_back_amount_changed_tbl.DELETE;
3195     l_back_priced_qty_tbl.DELETE;
3196     l_back_operand_calc_code_tbl.DELETE;
3197     l_back_operand_value_tbl.DELETE;
3198     l_back_adj_amt_tbl.DELETE;
3199     l_back_unit_price_tbl.DELETE;
3200     l_back_sts_code_tbl.DELETE;
3201     l_back_sts_txt_tbl.DELETE;
3202     l_back_rounding_fac_tbl.DELETE;
3203     l_back_calc_code_tbl.DELETE;
3204     l_back_line_qty_tbl.DELETE;
3205     l_back_list_hdr_id_tbl.DELETE;
3206     l_back_list_type_tbl.DELETE;
3207     l_back_price_brk_type_tbl.DELETE;
3208     l_back_chrg_type_tbl.DELETE;
3209     l_back_chrg_subtype_tbl.DELETE;
3210     l_back_auto_flag_tbl.DELETE;
3211     l_back_phase_id_tbl.DELETE;
3212     l_back_limit_code_tbl.DELETE;
3213     l_back_limit_text_tbl.DELETE;
3214     l_back_bucket_tbl.DELETE;
3215     l_back_list_line_no_tbl.DELETE;
3216     l_back_calculation_code_tbl.DELETE;
3217     l_back_calc_precedence_tbl.DELETE;
3218     l_back_modifier_level_code_tbl.DELETE;
3219 
3220     FETCH l_back_calculate_cur BULK COLLECT INTO
3221     l_back_list_line_id_tbl,
3222     l_back_line_index_tbl,
3223     l_back_line_dtl_index_tbl,
3224     l_back_list_line_type_tbl,
3225     l_back_applied_flag_tbl,
3226     l_back_amount_changed_tbl,
3227     l_back_priced_qty_tbl,
3228     l_back_operand_calc_code_tbl,
3229     l_back_operand_value_tbl,
3230     l_back_adj_amt_tbl,
3231     l_back_modifier_level_code_tbl,
3232     l_back_unit_price_tbl,
3233     l_back_sts_code_tbl,
3234     l_back_sts_txt_tbl,
3235     l_back_rounding_fac_tbl,
3236     l_back_calc_code_tbl,
3237     l_back_line_qty_tbl,
3238     l_back_list_hdr_id_tbl,
3239     l_back_list_type_tbl,
3240     l_back_price_brk_type_tbl,
3241     l_back_chrg_type_tbl,
3242     l_back_chrg_subtype_tbl,
3243     l_back_auto_flag_tbl,
3244     l_back_phase_id_tbl,
3245     l_back_limit_code_tbl,
3246     l_back_limit_text_tbl,
3247     l_back_bucket_tbl,
3248     l_back_list_line_no_tbl,
3249     l_back_calculation_code_tbl,
3250     l_back_calc_precedence_tbl;
3251     IF l_debug = FND_API.G_TRUE THEN
3252       QP_PREQ_GRP.ENGINE_DEBUG('BACK CALCULATION ROUTINE2');
3253     END IF;
3254     --EXIT WHEN l_back_list_line_id_tbl.COUNT = 0;
3255     CLOSE l_back_calculate_cur;
3256 
3257     IF l_debug = FND_API.G_TRUE THEN
3258       QP_PREQ_GRP.ENGINE_DEBUG('BACK CALCULATION ROUTINE2.5');
3259     END IF;
3260     --DEBUG
3261     IF QP_PREQ_GRP.G_DEBUG_ENGINE = FND_API.G_TRUE
3262       AND l_back_list_line_id_tbl.COUNT>0
3263       THEN
3264       IF l_debug = FND_API.G_TRUE THEN
3265         QP_PREQ_GRP.ENGINE_DEBUG('BACK CALCULATION ROUTINE3'|| l_back_list_line_id_tbl.COUNT);
3266       END IF;
3267       FOR I IN 1..l_back_list_line_id_tbl.COUNT
3268         LOOP
3269         IF l_debug = FND_API.G_TRUE THEN
3270           QP_PREQ_GRP.ENGINE_DEBUG('BACK CALCULATION ROUTINE4');
3271           QP_PREQ_GRP.ENGINE_DEBUG('BACK CALCULATION ADJ '
3272                                    || l_back_list_line_id_tbl(i) ||' line index '
3273                                    || l_back_line_index_tbl(i) ||' detail index '
3274                                    || l_back_line_dtl_index_tbl(i) ||' adj type '
3275                                    || l_back_list_line_type_tbl(i) ||' applied flag '
3276                                    || l_back_applied_flag_tbl(i) ||' adj amt '
3277                                    || l_back_adj_amt_tbl(i) ||' amt changed '
3278                                    || l_back_amount_changed_tbl(i) ||' priced qty '
3279                                    || l_back_priced_qty_tbl(i) ||' operand code '
3280                                    || l_back_operand_calc_code_tbl(i) ||' operand '
3281                                    || l_back_operand_value_tbl(i) ||' unit price '
3282                                    || l_back_unit_price_tbl(i) ||' round fac '
3283                                    || l_back_rounding_fac_tbl(i) ||' line_qty '
3284                                    || l_back_line_qty_tbl(i) || ' calculation code '
3285                                    || l_back_calculation_code_tbl(i) || ' precedence '
3286                                    || l_back_calc_precedence_tbl(i) || ' modifier level '
3287                                    || l_back_modifier_level_code_tbl(i));
3288         END IF;
3289       END LOOP;
3290     END IF;
3291 
3292     IF l_debug = FND_API.G_TRUE THEN
3293       QP_PREQ_GRP.ENGINE_DEBUG('BACK CALCULATION ROUTINE4.5');
3294     END IF;
3295     IF l_back_line_index_tbl.COUNT > 0
3296       THEN
3297       IF p_amount_changed <= 0
3298         THEN
3299         FOR I IN
3300           l_back_line_dtl_index_tbl.FIRST..l_back_line_dtl_index_tbl.LAST
3301           LOOP
3302           IF l_debug = FND_API.G_TRUE THEN
3303             QP_PREQ_GRP.ENGINE_DEBUG('forward loop '|| i);
3304           END IF;
3305 
3306           --fix for bug 2790460 to add the amount_changed to the
3307           --adjustment_amount if the adj
3308           --has been applied already and it is not back calculated
3309           IF (nvl(l_back_calculation_code_tbl(i), 'NULL')
3310               <> G_BACK_CALCULATE
3311               AND l_back_applied_flag_tbl(i) = G_YES) THEN
3312             l_back_amount_changed_tbl(i) :=
3313             nvl(l_back_adj_amt_tbl(i), 0) +
3314             l_back_amount_changed_tbl(i);
3315           END IF; --l_back_calculation_code_tbl(i)
3316 
3317           BACK_CALCULATE_PRICE(
3318                                l_back_operand_calc_code_tbl(i)
3319                                , l_back_operand_value_tbl(i)
3320                                , nvl(l_back_applied_flag_tbl(i), G_NO)
3321                                , nvl(l_back_amount_changed_tbl(i), 0)
3322                                , l_back_adj_amt_tbl(i)
3323                                , nvl(l_back_priced_qty_tbl(i), 0)
3324                                , nvl(l_back_unit_price_tbl(i), 0)
3325                                , l_back_list_line_type_tbl(i)
3326                                , l_adjustment_amount
3327                                , l_operand_value
3328                                , BACK_CALCULATE_SUCC
3329                                , l_return_status
3330                                , l_return_status_text);
3331 
3332           IF BACK_CALCULATE_SUCC
3333             AND l_return_status = FND_API.G_RET_STS_SUCCESS
3334             THEN
3335             IF l_debug = FND_API.G_TRUE THEN
3336               QP_PREQ_GRP.ENGINE_DEBUG('back cal succ '
3337                                        || l_adjustment_amount ||' list_line_id '
3338                                        || l_back_list_line_id_tbl(i) ||' operand val '
3339                                        || l_operand_value);
3340 
3341             END IF;
3342             l_back_calc_rec.line_detail_index :=
3343             l_back_line_dtl_index_tbl(i);
3344             l_back_calc_rec.line_index :=
3345             l_back_line_index_tbl(i);
3346             l_back_calc_rec.list_line_id :=
3347             l_back_list_line_id_tbl(i);
3348             l_back_calc_rec.list_line_type_code :=
3349             l_back_list_line_type_tbl(i);
3350             l_back_calc_rec.rounding_factor :=
3351             l_back_rounding_fac_tbl(i);
3352             l_back_calc_rec.line_quantity :=
3353             l_back_line_qty_tbl(i);
3354             l_back_calc_rec.list_header_id :=
3355             l_back_list_hdr_id_tbl(i);
3356             l_back_calc_rec.list_type_code :=
3357             l_back_list_type_tbl(i);
3358             l_back_calc_rec.price_break_type_code :=
3359             l_back_price_brk_type_tbl(i);
3360             l_back_calc_rec.charge_type_code :=
3361             l_back_chrg_type_tbl(i);
3362             l_back_calc_rec.charge_subtype_code :=
3363             l_back_chrg_subtype_tbl(i);
3364             l_back_calc_rec.automatic_flag :=
3365             l_back_auto_flag_tbl(i);
3366             l_back_calc_rec.pricing_phase_id :=
3367             l_back_phase_id_tbl(i);
3368             l_back_calc_rec.limit_code :=
3369             l_back_limit_code_tbl(i);
3370             l_back_calc_rec.limit_text :=
3371             l_back_limit_text_tbl(i);
3372             l_back_calc_rec.operand_calculation_code :=
3373             l_back_operand_calc_code_tbl(i);
3374             l_back_calc_rec.pricing_group_sequence :=
3375             l_back_bucket_tbl(i);
3376             l_back_calc_rec.list_line_no :=
3377             l_back_list_line_no_tbl(i);
3378             l_back_calc_rec.modifier_level_code :=
3379             l_back_modifier_level_code_tbl(i);
3380             --Fix for bug 2103325
3381             --if price is changed back to selling price
3382             --back calculated manual adj shd not be returned
3383             IF l_adjustment_amount = 0
3384               THEN
3385               l_back_calc_rec.applied_flag := G_NO;
3386               l_back_calc_rec.updated_flag := G_NO;
3387             ELSE
3388               l_back_calc_rec.applied_flag := G_YES;
3389               l_back_calc_rec.updated_flag := G_YES;
3390             END IF;
3391             l_back_calc_rec.updated_flag := G_YES;
3392             l_back_calc_rec.calculation_code :=
3393             G_BACK_CALCULATE;
3394             l_back_calc_rec.adjustment_amount :=
3395             l_adjustment_amount;
3396             l_back_calc_rec.operand_value :=
3397             l_operand_value;
3398             l_back_calc_rec.process_code :=
3399             G_STATUS_NEW;
3400             l_back_calc_rec.pricing_status_code :=
3401             G_STATUS_NEW;
3402             --						l_back_sts_code_tbl(i);
3403             l_back_calc_rec.pricing_status_text :=
3404             l_back_sts_txt_tbl(i);
3405             EXIT;
3406           ELSE
3407             NULL;
3408           END IF;
3409         END LOOP;
3410 
3411       ELSE --p_amount_changed is positive, then its a surcharge
3412         FOR I IN REVERSE
3413           l_back_line_dtl_index_tbl.FIRST..l_back_line_dtl_index_tbl.LAST
3414           LOOP
3415           IF l_debug = FND_API.G_TRUE THEN
3416             QP_PREQ_GRP.ENGINE_DEBUG('reverse loop '|| i);
3417           END IF;
3418           --fix for bug 2790460 to add the amount_changed to the
3419           --adjustment_amount if the adj
3420           --has been applied already and it is not back calculated
3421           IF (nvl(l_back_calculation_code_tbl(i), 'NULL')
3422               <> G_BACK_CALCULATE
3423               AND l_back_applied_flag_tbl(i) = G_YES) THEN
3424             l_back_amount_changed_tbl(i) :=
3425             nvl(l_back_adj_amt_tbl(i), 0) +
3426             l_back_amount_changed_tbl(i);
3427           END IF; --l_back_calculation_code_tbl(i)
3428 
3429           BACK_CALCULATE_PRICE(
3430                                l_back_operand_calc_code_tbl(i)
3431                                , l_back_operand_value_tbl(i)
3432                                , nvl(l_back_applied_flag_tbl(i), G_NO)
3433                                , nvl(l_back_amount_changed_tbl(i), 0)
3434                                , l_back_adj_amt_tbl(i)
3435                                , nvl(l_back_priced_qty_tbl(i), 0)
3436                                , nvl(l_back_unit_price_tbl(i), 0)
3437                                , l_back_list_line_type_tbl(i)
3438                                , l_adjustment_amount
3439                                , l_operand_value
3440                                , BACK_CALCULATE_SUCC
3441                                , l_return_status
3442                                , l_return_status_text);
3443 
3444           IF BACK_CALCULATE_SUCC
3445             AND l_return_status = FND_API.G_RET_STS_SUCCESS
3446             THEN
3447             IF l_debug = FND_API.G_TRUE THEN
3448               QP_PREQ_GRP.ENGINE_DEBUG('back cal succ '
3449                                        || l_adjustment_amount ||' list_line_id '
3450                                        || l_back_list_line_id_tbl(i) ||' operand val '
3451                                        || l_operand_value);
3452 
3453             END IF;
3454             l_back_calc_rec.line_detail_index :=
3455             l_back_line_dtl_index_tbl(i);
3456             l_back_calc_rec.line_index :=
3457             l_back_line_index_tbl(i);
3458             l_back_calc_rec.list_line_id :=
3459             l_back_list_line_id_tbl(i);
3460             l_back_calc_rec.rounding_factor :=
3461             l_back_rounding_fac_tbl(i);
3462             l_back_calc_rec.line_quantity :=
3463             l_back_line_qty_tbl(i);
3464             l_back_calc_rec.list_header_id :=
3465             l_back_list_hdr_id_tbl(i);
3466             l_back_calc_rec.list_type_code :=
3467             l_back_list_type_tbl(i);
3468             l_back_calc_rec.price_break_type_code :=
3469             l_back_price_brk_type_tbl(i);
3470             l_back_calc_rec.charge_type_code :=
3471             l_back_chrg_type_tbl(i);
3472             l_back_calc_rec.charge_subtype_code :=
3473             l_back_chrg_subtype_tbl(i);
3474             l_back_calc_rec.automatic_flag :=
3475             l_back_auto_flag_tbl(i);
3476             l_back_calc_rec.pricing_phase_id :=
3477             l_back_phase_id_tbl(i);
3478             l_back_calc_rec.limit_code :=
3479             l_back_limit_code_tbl(i);
3480             l_back_calc_rec.limit_text :=
3481             l_back_limit_text_tbl(i);
3482             l_back_calc_rec.operand_calculation_code :=
3483             l_back_operand_calc_code_tbl(i);
3484             l_back_calc_rec.pricing_group_sequence :=
3485             l_back_bucket_tbl(i);
3486             l_back_calc_rec.list_line_no :=
3487             l_back_list_line_no_tbl(i);
3488             l_back_calc_rec.modifier_level_code :=
3489             l_back_modifier_level_code_tbl(i);
3490             --Fix for bug 2103325
3491             --if price is changed back to selling price
3492             --back calculated manual adj shd not be returned
3493             IF l_adjustment_amount = 0
3494               THEN
3495               l_back_calc_rec.applied_flag := G_NO;
3496               l_back_calc_rec.updated_flag := G_NO;
3497             ELSE
3498               l_back_calc_rec.applied_flag := G_YES;
3499               l_back_calc_rec.updated_flag := G_YES;
3500             END IF;
3501             l_back_calc_rec.adjustment_amount :=
3502             l_adjustment_amount;
3503             l_back_calc_rec.operand_value :=
3504             l_operand_value;
3505             l_back_calc_rec.process_code :=
3506             G_STATUS_NEW;
3507             l_back_calc_rec.pricing_status_code :=
3508             G_STATUS_NEW;
3509             --						l_back_sts_code_tbl(i);
3510             l_back_calc_rec.pricing_status_text :=
3511             l_back_sts_txt_tbl(i);
3512             l_back_calc_rec.calculation_code :=
3513             G_BACK_CALCULATE;
3514             EXIT;
3515           ELSE
3516             NULL;
3517           END IF;
3518         END LOOP;
3519 
3520       END IF; --p_amount_changed
3521 
3522       IF BACK_CALCULATE_SUCC
3523         THEN
3524         IF l_return_status = FND_API.G_RET_STS_SUCCESS
3525           THEN
3526           IF l_debug = FND_API.G_TRUE THEN
3527             QP_PREQ_GRP.ENGINE_DEBUG('back cal succ set status');
3528           END IF;
3529           x_return_status := l_return_status;
3530           x_return_status_text := l_return_status_text;
3531           x_back_calc_rec := l_back_calc_rec;
3532         END IF;
3533       ELSE
3534         IF l_return_status = FND_API.G_RET_STS_SUCCESS
3535           THEN
3536           IF l_debug = FND_API.G_TRUE THEN
3537             QP_PREQ_GRP.ENGINE_DEBUG('back cal fail set status');
3538           END IF;
3539           x_return_status := G_BACK_CALCULATION_STS;
3540           x_return_status_text := 'QP_PREQ_PUB: BACK CALCULATION FAILURE ';
3541           x_back_calc_rec := l_back_calc_rec;
3542         ELSE
3543           IF l_debug = FND_API.G_TRUE THEN
3544             QP_PREQ_GRP.ENGINE_DEBUG('back cal error set status');
3545           END IF;
3546           x_return_status := G_BACK_CALCULATION_STS;
3547           x_return_status_text := 'QP_PREQ_PUB: BACK CALCULATION ERROR '|| l_return_status_text;
3548           x_back_calc_rec := l_back_calc_rec;
3549         END IF;
3550       END IF;
3551 
3552     ELSE
3553       IF l_debug = FND_API.G_TRUE THEN
3554         QP_PREQ_GRP.ENGINE_DEBUG('BACK CALCULATION ROUTINE5');
3555       END IF;
3556       x_return_status := G_BACK_CALCULATION_STS;
3557       IF l_debug = FND_API.G_TRUE THEN
3558         QP_PREQ_GRP.ENGINE_DEBUG('BACK CALCULATION ROUTINE6');
3559       END IF;
3560       x_return_status_text := 'QP_PREQ_PUB.BACK_CAL: NO MANUAL ADJ';
3561       IF l_debug = FND_API.G_TRUE THEN
3562         QP_PREQ_GRP.ENGINE_DEBUG('BACK CALCULATION ROUTINE6.5');
3563       END IF;
3564     END IF;
3565     IF l_debug = FND_API.G_TRUE THEN
3566       QP_PREQ_GRP.ENGINE_DEBUG('BACK CALCULATION ROUTINE7');
3567 
3568     END IF;
3569   EXCEPTION
3570     WHEN OTHERS THEN
3571       IF l_debug = FND_API.G_TRUE THEN
3572         QP_PREQ_GRP.ENGINE_DEBUG('BACK CALCULATION EXCEPTION '|| SQLERRM);
3573       END IF;
3574       x_return_status := FND_API.G_RET_STS_ERROR;
3575       x_return_status_text := 'Error QP_PREQ_PUB.BACK_CALCULATION '|| SQLERRM;
3576   END BACK_CALCULATION;
3577 
3578   --procedure to update the line's adjusted_unit_price with unit_price
3579   --if the engine is called with calculate_only and there are no adjustments
3580   --fix for bug 2242736
3581   PROCEDURE UPDATE_UNIT_PRICE(x_return_status OUT NOCOPY VARCHAR2,
3582                               x_return_status_text OUT NOCOPY VARCHAR2) IS
3583 
3584   CURSOR l_check_adjustments_cur IS
3585     /*
3586 SELECT line.line_index, line.unit_price, line.adjusted_unit_price
3587 ,line.line_quantity, line.priced_quantity, line.catchweight_qty,line.actual_order_quantity
3588 , line.rounding_factor
3589 FROM qp_npreq_lines_tmp line
3590 WHERE line.price_flag in (G_YES, G_PHASE,G_CALCULATE_ONLY)
3591 and line.pricing_status_code in (G_STATUS_UPDATED, G_STATUS_UNCHANGED,
3592 				G_STATUS_GSA_VIOLATION)
3593 and line.line_type_code = G_LINE_LEVEL
3594 and nvl(processed_code,'0')<> G_BY_ENGINE
3595 and (line.adjusted_unit_price <> line.unit_price
3596 --changed this for bug 2776800 to populate order_uom_selling_price
3597 --this means there are no adjustments and calculation has not taken place
3598 or line.order_uom_selling_price IS NULL )
3599 and not exists (select ldet.line_index
3600 	from qp_npreq_ldets_tmp ldet
3601 	where (ldet.line_index = line.line_index
3602 	or ldet.modifier_level_code = G_ORDER_LEVEL)
3603 	and nvl(ldet.created_from_list_type_code,'NULL') not in
3604 		(G_PRICE_LIST_HEADER,G_AGR_LIST_HEADER)
3605 --	and ldet.pricing_status_code = G_STATUS_NEW)
3606       and ldet.pricing_status_code in (G_STATUS_NEW,G_STATUS_UPDATED))  --2729744
3607 --this is for not updating the unit_price on fg lines for prg cleanup
3608 --as they will not have any adjustments
3609 and line.process_status = G_STATUS_UNCHANGED
3610 --fix for bug 2691794
3611 and nvl(line.processed_flag,'N') <> G_FREEGOOD_LINE;
3612 and not exists (select 'Y' from qp_npreq_lines_tmp line2
3613 where line2.line_id = line.line_id
3614 and line2.line_index <> line.line_index);
3615 */
3616 
3617     --fix for performance issue in bug 2928322
3618     --the column qualifiers_exists_flag will be populated to
3619     --G_CALCULATE_ONLY for all lines that went through calculation
3620     --we want to do this update only for those lines which
3621     --do not go through calculation
3622     SELECT line.line_index, line.unit_price, line.adjusted_unit_price
3623     , line.line_quantity, line.priced_quantity, line.catchweight_qty, line.actual_order_quantity
3624     , line.rounding_factor
3625     , line.updated_adjusted_unit_price
3626     , line.pricing_status_code
3627     , line.pricing_status_text
3628     , 0 amount_changed
3629     , line_unit_price
3630     FROM qp_npreq_lines_tmp line
3631     WHERE line.price_flag IN (G_YES, G_PHASE, G_CALCULATE_ONLY)
3632     AND line.pricing_status_code IN (G_STATUS_UPDATED, G_STATUS_UNCHANGED,
3633                                      G_STATUS_GSA_VIOLATION)
3634     AND line.line_type_code = G_LINE_LEVEL
3635     AND nvl(processed_code, '0') <> G_BY_ENGINE
3636     AND (line.adjusted_unit_price <> line.unit_price
3637          --changed this for bug 2776800 to populate order_uom_selling_price
3638          --this means there are no adjustments and calculation has not taken place
3639          OR line.updated_adjusted_unit_price IS NOT NULL
3640          OR line.order_uom_selling_price IS NULL )
3641     AND nvl(line.QUALIFIERS_EXIST_FLAG, G_NO) <> G_CALCULATE_ONLY
3642     AND nvl(line.processed_flag, 'N') <> G_FREEGOOD_LINE; -- added for bug 3116349 /*avallark*/
3643 
3644   l_line_index_tbl QP_PREQ_GRP.NUMBER_TYPE;
3645   l_unit_price_tbl QP_PREQ_GRP.NUMBER_TYPE;
3646   l_adj_unit_price_tbl QP_PREQ_GRP.NUMBER_TYPE;
3647   l_ord_uom_selling_price_tbl QP_PREQ_GRP.NUMBER_TYPE;
3648   l_line_qty_tbl QP_PREQ_GRP.NUMBER_TYPE;
3649   l_priced_qty_tbl QP_PREQ_GRP.NUMBER_TYPE;
3650   l_catchwt_qty_tbl QP_PREQ_GRP.NUMBER_TYPE;
3651   l_actual_order_qty_tbl QP_PREQ_GRP.NUMBER_TYPE;
3652   l_rounding_factor_tbl QP_PREQ_GRP.NUMBER_TYPE;
3653   l_upd_adj_unit_price_tbl QP_PREQ_GRP.NUMBER_TYPE;
3654   l_amount_changed_tbl QP_PREQ_GRP.NUMBER_TYPE;
3655   l_line_unit_price_tbl QP_PREQ_GRP.NUMBER_TYPE;
3656   l_pricing_sts_code_tbl QP_PREQ_GRP.VARCHAR_TYPE;
3657   l_pricing_sts_text_tbl QP_PREQ_GRP.VARCHAR_TYPE;
3658   l_routine VARCHAR2(100) := 'QP_PREQ_PUB.UPDATE_UNIT_PRICE';
3659 
3660   l_return_status VARCHAR2(30);
3661   l_return_status_text VARCHAR2(240);
3662   l_ord_qty_operand NUMBER;
3663   l_ord_qty_adj_amt NUMBER;
3664   i NUMBER;
3665 
3666   l_back_calc_ret_rec back_calc_rec_type;
3667 
3668   l_ldet_dtl_index QP_PREQ_GRP.NUMBER_TYPE;
3669   l_ldet_line_index QP_PREQ_GRP.NUMBER_TYPE;
3670   l_ldet_operand_value QP_PREQ_GRP.NUMBER_TYPE;
3671   l_ldet_adjamt QP_PREQ_GRP.NUMBER_TYPE;
3672   l_ldet_applied_flag QP_PREQ_GRP.FLAG_TYPE;
3673   l_ldet_updated_flag QP_PREQ_GRP.FLAG_TYPE;
3674   l_ldet_process_code QP_PREQ_GRP.VARCHAR_TYPE;
3675   l_ldet_sts_code QP_PREQ_GRP.VARCHAR_TYPE;
3676   l_ldet_sts_text QP_PREQ_GRP.VARCHAR_TYPE;
3677   l_ldet_calc_code QP_PREQ_GRP.VARCHAR_TYPE;
3678   l_ldet_ord_qty_operand QP_PREQ_GRP.NUMBER_TYPE; --3057395
3679   l_ldet_ord_qty_adj_amt QP_PREQ_GRP.NUMBER_TYPE; --3057395
3680 
3681   --[prarasto:Post Round] Start : new variables
3682   l_extended_selling_price_ur 	QP_PREQ_GRP.NUMBER_TYPE;
3683   l_adjusted_unit_price_ur	QP_PREQ_GRP.NUMBER_TYPE;
3684   l_unit_selling_price_ur	QP_PREQ_GRP.NUMBER_TYPE;
3685   l_extended_selling_price 	QP_PREQ_GRP.NUMBER_TYPE;
3686   l_adjusted_unit_price		QP_PREQ_GRP.NUMBER_TYPE;
3687   l_unit_selling_price		QP_PREQ_GRP.NUMBER_TYPE;
3688   --[prarasto:Post Round] End : new variables
3689 
3690   BEGIN
3691     l_debug := QP_PREQ_GRP.G_DEBUG_ENGINE;
3692     IF l_debug = FND_API.G_TRUE THEN
3693       QP_PREQ_GRP.engine_debug('Begin update_unit_price');
3694 
3695     END IF;
3696     OPEN l_check_adjustments_cur;
3697     l_line_index_tbl.DELETE;
3698     l_unit_price_tbl.DELETE;
3699     l_adj_unit_price_tbl.DELETE;
3700     l_ord_uom_selling_price_tbl.DELETE;
3701     l_line_qty_tbl.DELETE;
3702     l_priced_qty_tbl.DELETE;
3703     l_catchwt_qty_tbl.DELETE;
3704     l_actual_order_qty_tbl.DELETE;
3705     l_rounding_factor_tbl.DELETE;
3706     l_upd_adj_unit_price_tbl.DELETE;
3707     l_pricing_sts_code_tbl.DELETE;
3708     l_pricing_sts_text_tbl.DELETE;
3709     l_amount_changed_tbl.DELETE;
3710     l_line_unit_price_tbl.DELETE;
3711 
3712     l_ldet_dtl_index.DELETE;
3713     l_ldet_line_index.DELETE;
3714     l_ldet_operand_value.DELETE;
3715     l_ldet_adjamt.DELETE;
3716     l_ldet_applied_flag.DELETE;
3717     l_ldet_updated_flag.DELETE;
3718     l_ldet_process_code.DELETE;
3719     l_ldet_sts_code.DELETE;
3720     l_ldet_sts_text.DELETE;
3721     l_ldet_calc_code.DELETE;
3722     l_ldet_ord_qty_operand.DELETE; --3057395
3723     l_ldet_ord_qty_adj_amt.DELETE; --3057395
3724 
3725     FETCH l_check_adjustments_cur BULK COLLECT INTO
3726     l_line_index_tbl, l_unit_price_tbl, l_adj_unit_price_tbl,
3727     l_line_qty_tbl, l_priced_qty_tbl, l_catchwt_qty_tbl, l_actual_order_qty_tbl, l_rounding_factor_tbl,
3728     l_upd_adj_unit_price_tbl,
3729     l_pricing_sts_code_tbl,
3730     l_pricing_sts_text_tbl,
3731     l_amount_changed_tbl,
3732     l_line_unit_price_tbl;
3733     CLOSE l_check_adjustments_cur;
3734 
3735     IF QP_PREQ_GRP.G_DEBUG_ENGINE = FND_API.G_TRUE
3736       AND l_line_index_tbl.COUNT > 0
3737       THEN
3738       FOR i IN l_line_index_tbl.FIRST..l_line_index_tbl.LAST
3739         LOOP
3740         IF l_debug = FND_API.G_TRUE THEN
3741           QP_PREQ_GRP.engine_debug('line_index '
3742                                    || l_line_index_tbl(i) ||' unit_price '
3743                                    || l_unit_price_tbl(i) ||' adj_unit_price '
3744                                    || l_adj_unit_price_tbl(i) ||' price_qty '
3745                                    || l_priced_qty_tbl(i) ||' ordqty '|| l_line_qty_tbl(i)
3746                                    ||' catchwt_qty '|| l_catchwt_qty_tbl(i)
3747                                    ||' upd_adj_unit_price '|| l_upd_adj_unit_price_tbl(i)
3748                                    ||' stscode '|| l_pricing_sts_code_tbl(i)
3749                                    ||' ststext '|| l_pricing_sts_text_tbl(i));
3750         END IF;
3751       END LOOP;
3752     END IF;
3753 
3754     IF l_line_index_tbl.COUNT > 0 THEN
3755       FOR i IN l_line_index_tbl.FIRST..l_line_index_tbl.LAST
3756         LOOP
3757 
3758         --for bug 2926554 back calculation needs to be done here
3759         --if the caller has overridden the selling price
3760         --and if the line did not go thru calculation
3761         IF l_upd_adj_unit_price_tbl(i) IS NOT NULL THEN
3762           IF l_debug = FND_API.G_TRUE THEN
3763             QP_PREQ_GRP.engine_debug('back calculation for line '
3764                                      || l_line_index_tbl(i));
3765           END IF; --l_debug
3766 
3767           IF G_ROUND_INDIVIDUAL_ADJ not in (G_NO_ROUND, G_POST_ROUND)
3768 			  --[prarasto:Post Round] added check to skip rounding for Post Rounding
3769             AND l_rounding_factor_tbl(i) IS NOT NULL THEN
3770             l_upd_adj_unit_price_tbl(i) :=
3771             round(l_upd_adj_unit_price_tbl(i),  - 1 * l_rounding_factor_tbl(i));
3772           END IF; --G_ROUND_INDIVIDUAL_ADJ
3773 
3774 
3775           IF ((l_upd_adj_unit_price_tbl(i) -
3776                l_adj_unit_price_tbl(i)) <> 0) THEN
3777             --there are no applied adjustments as this line
3778             --did not go thru calculation
3779             l_amount_changed_tbl(i) :=
3780             (l_upd_adj_unit_price_tbl(i) - l_adj_unit_price_tbl(i));
3781 
3782 
3783             IF l_debug = FND_API.G_TRUE THEN
3784               QP_PREQ_GRP.engine_debug('amt chg '|| l_amount_changed_tbl(i));
3785             END IF; --l_debug
3786 
3787             IF l_amount_changed_tbl(i) <= 0 THEN
3788               G_BACK_CALCULATION_CODE := 'DIS';
3789             ELSE
3790               G_BACK_CALCULATION_CODE := 'SUR';
3791             END IF; --l_amount_changed_tbl
3792 
3793             BACK_CALCULATION(l_line_index_tbl(i)
3794                              , l_amount_changed_tbl(i)
3795                              , l_back_calc_ret_rec
3796                              , l_return_status
3797                              , l_return_status_text);
3798 
3799             IF l_return_status = FND_API.G_RET_STS_SUCCESS THEN
3800               --need to do this check for bug 2833753
3801               IF l_debug = FND_API.G_TRUE THEN
3802                 QP_PREQ_GRP.engine_debug('back cal succ insert rec ');
3803               END IF; --l_debug
3804 
3805               l_adj_unit_price_tbl(i) := l_upd_adj_unit_price_tbl(i);
3806 
3807               -- Ravi
3808               --this procedure is called to calculate the
3809               --selling_price,adjustment_amount and operand in ordered_qty
3810               --which is the line_quantity on lines_tmp
3811               -- Ravi bug# 2745337-divisor by zero
3812               IF (l_line_qty_tbl(i) <> 0
3813                   OR l_back_calc_ret_rec.modifier_level_code = G_ORDER_LEVEL) THEN
3814                 IF (l_debug = FND_API.G_TRUE) THEN
3815                   QP_PREQ_GRP.engine_debug('Before GET_ORDERQTY_VALUES #6');
3816                 END IF; --l_debug
3817                 GET_ORDERQTY_VALUES(p_ordered_qty => l_line_qty_tbl(i),
3818                                     p_priced_qty => l_priced_qty_tbl(i),
3819                                     p_catchweight_qty => l_catchwt_qty_tbl(i),
3820                                     p_actual_order_qty => l_actual_order_qty_tbl(i),
3821                                     p_operand => l_back_calc_ret_rec.operand_value,
3822                                     p_adjustment_amt => l_back_calc_ret_rec.adjustment_amount,
3823                                     p_unit_price => l_unit_price_tbl(i),
3824                                     p_adjusted_unit_price => l_adj_unit_price_tbl(i),
3825                                     p_operand_calculation_code => l_back_calc_ret_rec.operand_calculation_code,
3826                                     p_input_type => 'OPERAND',
3827                                     x_ordqty_output1 => l_ord_qty_operand,
3828                                     x_ordqty_output2 => l_ord_qty_adj_amt,
3829                                     x_return_status => x_return_status,
3830                                     x_return_status_text => x_return_status_text);
3831               ELSE --l_line_qty_tbl(i)
3832                 IF l_debug = FND_API.G_TRUE THEN
3833                   QP_PREQ_GRP.engine_debug('Ordered Qty #3 : ' || l_line_qty_tbl(i));
3834                   QP_PREQ_GRP.engine_debug('OPERAND Ordered Qty is 0 or modifier level code is not ORDER');
3835                 END IF; --l_debug
3836                 l_ord_qty_operand := 0;
3837                 l_ord_qty_adj_amt := 0;
3838               END IF; --l_line_qty_tbl(i)
3839 
3840               -- End Ravi
3841 
3842               --fix for bug 2146050 to round adjustment amt
3843               IF G_ROUND_INDIVIDUAL_ADJ = G_ROUND_ADJ
3844                 AND l_rounding_factor_tbl(i) IS NOT NULL THEN
3845                 l_back_calc_ret_rec.adjustment_amount :=
3846                 round(l_back_calc_ret_rec.adjustment_amount,
3847                       - 1 * l_rounding_factor_tbl(i));
3848                 l_ord_qty_adj_amt := round(l_ord_qty_adj_amt,
3849                                            - 1 * l_rounding_factor_tbl(i));
3850               END IF; --G_ROUND_INDIVIDUAL_ADJ
3851 
3852               --load the l_back_calc_ret_rec to plsqltbl to do bulk update
3853               l_ldet_dtl_index(l_ldet_dtl_index.COUNT + 1) :=
3854               l_back_calc_ret_rec.line_detail_index;
3855               l_ldet_line_index(l_ldet_dtl_index.COUNT) :=
3856               l_back_calc_ret_rec.line_index;
3857               l_ldet_operand_value(l_ldet_dtl_index.COUNT) :=
3858               l_back_calc_ret_rec.operand_value;
3859               l_ldet_adjamt(l_ldet_dtl_index.COUNT) :=
3860               l_back_calc_ret_rec.adjustment_amount;
3861               l_ldet_applied_flag(l_ldet_dtl_index.COUNT) :=
3862               l_back_calc_ret_rec.applied_flag;
3863               l_ldet_updated_flag(l_ldet_dtl_index.COUNT) :=
3864               l_back_calc_ret_rec.updated_flag;
3865               l_ldet_process_code(l_ldet_dtl_index.COUNT) :=
3866               l_back_calc_ret_rec.process_code;
3867               l_ldet_sts_code(l_ldet_dtl_index.COUNT) :=
3868               l_back_calc_ret_rec.pricing_status_code;
3869               l_ldet_sts_text(l_ldet_dtl_index.COUNT) :=
3870               l_back_calc_ret_rec.pricing_status_text;
3871               l_ldet_calc_code(l_ldet_dtl_index.COUNT) :=
3872               l_back_calc_ret_rec.calculation_code;
3873               l_ldet_ord_qty_operand(l_ldet_dtl_index.COUNT) :=
3874               l_ord_qty_operand; --3057395
3875               l_ldet_ord_qty_adj_amt(l_ldet_dtl_index.COUNT) :=
3876               l_ord_qty_adj_amt; --3057395
3877 
3878             ELSE --l_ret_status
3879               IF l_debug = FND_API.G_TRUE THEN
3880                 QP_PREQ_GRP.engine_debug('back cal fail no insert rec');
3881               END IF; --l_debug
3882               l_pricing_sts_code_tbl(i) := l_return_status;
3883               l_pricing_sts_text_tbl(i) := l_return_status_text;
3884             END IF; --ret_status
3885           END IF; --l_upd_adj_unit_price_tbl - l_adj_unit
3886         ELSE
3887           --if not then the line has no adjustments and the
3888           --selling price needs to be replaced as the selling price
3889           l_adj_unit_price_tbl(i) := l_unit_price_tbl(i);
3890         END IF; --l_upd_adj_unit_price_tbl IS NOT NULL
3891 
3892         IF l_debug = FND_API.G_TRUE THEN
3893           QP_PREQ_GRP.engine_debug('end back calc for line '
3894                                    ||' unit price '|| l_unit_price_tbl(i)
3895                                    ||' adj_unit_price '|| l_adj_unit_price_tbl(i)
3896                                    ||' upd_adj_unit_price '|| l_upd_adj_unit_price_tbl(i));
3897         END IF; --l_debug
3898 
3899         --fix for bug 2812738
3900         --changes to calculate the order_uom_selling_price
3901         IF (l_line_qty_tbl(i) <> 0
3902             OR l_back_calc_ret_rec.modifier_level_code =
3903             G_ORDER_LEVEL) THEN
3904           IF (l_debug = FND_API.G_TRUE) THEN
3905             QP_PREQ_GRP.engine_debug('Before GET_ORDERQTY_VALUES #6.5');
3906           END IF; --l_debug
3907           GET_ORDERQTY_VALUES(p_ordered_qty => l_line_qty_tbl(i),
3908                               p_priced_qty => l_priced_qty_tbl(i),
3909                               p_catchweight_qty => l_catchwt_qty_tbl(i),
3910                               p_actual_order_qty => l_actual_order_qty_tbl(i),
3911                               p_unit_price => l_unit_price_tbl(i),
3912                               p_adjusted_unit_price => l_adj_unit_price_tbl(i),
3913                               p_line_unit_price => l_line_unit_price_tbl(i),
3914                               p_input_type => 'SELLING_PRICE',
3915                               x_ordqty_output1 => l_line_unit_price_tbl(i),
3916                               x_ordqty_output2 => l_ord_uom_selling_price_tbl(i),
3917                               x_return_status => x_return_status,
3918                               x_return_status_text => x_return_status_text);
3919         ELSE --ordered_qty
3920           IF l_debug = FND_API.G_TRUE THEN
3921             QP_PREQ_GRP.engine_debug('Ordered Qty #2.5 : '
3922                                      || l_line_qty_tbl(i));
3923             QP_PREQ_GRP.engine_debug('SELLING PRICE Ordered Qty is '
3924                                      ||'0 or modifier level code is not ORDER');
3925           END IF; --l_debug
3926           l_line_unit_price_tbl(i) := 0;
3927           l_ord_uom_selling_price_tbl(i) := 0;
3928         END IF; --ordered_qty
3929 
3930         --round the selling price if ROUND_INDIVIDUAL_ADJ
3931         --profile is N in this case the adjustment_amt will not be rounded
3932 
3933           --===[prarasto:Post Round] Start : Calculate rounded values ==--
3934           l_adjusted_unit_price_ur(i) := l_adj_unit_price_tbl(i);
3935           l_unit_selling_price_ur(i) := l_ord_uom_selling_price_tbl(i);
3936 
3937 	IF (G_ROUND_INDIVIDUAL_ADJ not in ( G_NO_ROUND , G_POST_ROUND )) AND (l_rounding_factor_tbl(i) is not null)
3938 	THEN
3939           IF (l_catchwt_qty_tbl(i) is null) and (l_actual_order_qty_tbl(i) is not null) THEN
3940             l_extended_selling_price_ur(i) :=  round(l_unit_selling_price_ur(i), - 1 * l_rounding_factor_tbl(i))
3941 	    					* l_actual_order_qty_tbl(i);
3942           ELSE
3943             l_extended_selling_price_ur(i) := round(l_unit_selling_price_ur(i), - 1 * l_rounding_factor_tbl(i))
3944 	    					* l_line_qty_tbl(i);
3945           END IF;
3946 	ELSE
3947           IF (l_catchwt_qty_tbl(i) is null) and (l_actual_order_qty_tbl(i) is not null) THEN
3948             l_extended_selling_price_ur(i) := l_unit_selling_price_ur(i) * l_actual_order_qty_tbl(i);
3949           ELSE
3950             l_extended_selling_price_ur(i) := l_unit_selling_price_ur(i) * l_line_qty_tbl(i);
3951           END IF;
3952 	END IF;
3953 
3954 
3955           IF l_debug = FND_API.G_TRUE THEN
3956             QP_PREQ_GRP.engine_debug('roundingfac to round sellingprice: '
3957                                      || l_rounding_factor_tbl(i));
3958           END IF; --l_debug
3959 
3960           IF (G_ROUND_INDIVIDUAL_ADJ = G_NO_ROUND) or (l_rounding_factor_tbl(i) is null) THEN
3961 --            l_adj_unit_price_tbl(i) := l_adjusted_unit_price_ur(i);
3962             l_unit_selling_price(i) := l_unit_selling_price_ur(i);
3963             l_extended_selling_price(i) := l_extended_selling_price_ur(i);
3964           ELSE
3965             l_adj_unit_price_tbl(i) := round(l_adjusted_unit_price_ur(i), - 1 * l_rounding_factor_tbl(i));
3966             l_line_unit_price_tbl(i) := round(l_line_unit_price_tbl(i),  - 1 * l_rounding_factor_tbl(i));
3967             l_unit_selling_price(i) := round(l_unit_selling_price_ur(i),  - 1 * l_rounding_factor_tbl(i));
3968             l_extended_selling_price(i) := round(l_extended_selling_price_ur(i),  - 1 * l_rounding_factor_tbl(i));
3969           END IF;
3970 
3971           IF l_debug = FND_API.G_TRUE THEN
3972 	   QP_PREQ_GRP.engine_debug('Extended selling price unrounded : '||l_extended_selling_price_ur(i));
3973 	   QP_PREQ_GRP.engine_debug('Extended selling price : '||l_extended_selling_price(i));
3974 	   QP_PREQ_GRP.engine_debug('Unit selling price unrounded : '||l_unit_selling_price_ur(i));
3975 	   QP_PREQ_GRP.engine_debug('Unit selling price : '||l_unit_selling_price(i));
3976 	   QP_PREQ_GRP.engine_debug('Adjusted unit price unrounded : '||l_adjusted_unit_price_ur(i));
3977 	   QP_PREQ_GRP.engine_debug('Adjusted unit price : '||l_adj_unit_price_tbl(i));
3978           END IF; --l_debug
3979           --===[prarasto:Post Round] End : Calculate rounded values ==--
3980 
3981         /*
3982          IF (l_catchwt_qty_tbl(i) IS NOT NULL) THEN
3983           l_ord_uom_selling_price_tbl(i) := (nvl(l_adj_unit_price_tbl(i),l_unit_price_tbl(i)) *
3984           (l_priced_qty_tbl(i)/ l_actual_order_qty_tbl(i))* (l_catchwt_qty_tbl(i)/l_line_qty_tbl(i)));
3985          ELSIF (l_actual_order_qty_tbl(i) IS NOT NULL) THEN
3986           l_ord_uom_selling_price_tbl(i) := (nvl(l_adj_unit_price_tbl(i),l_unit_price_tbl(i)) *
3987           (l_priced_qty_tbl(i)/ l_actual_order_qty_tbl(i)));
3988          ELSE
3989           l_ord_uom_selling_price_tbl(i) := (nvl(l_adj_unit_price_tbl(i),l_unit_price_tbl(i)) *
3990           (l_priced_qty_tbl(i)/ l_line_qty_tbl(i)));
3991          END IF;
3992 
3993          IF l_rounding_factor_tbl(i) IS NOT NULL and G_ROUND_INDIVIDUAL_ADJ <> G_NO_ROUND THEN
3994           l_ord_uom_selling_price_tbl(i) := round(l_ord_uom_selling_price_tbl(i), (-1 * l_rounding_factor_tbl(i)));
3995          END IF;--l_rounding_factor_tbl
3996 */
3997 
3998         IF l_debug = FND_API.G_TRUE THEN
3999           QP_PREQ_GRP.engine_debug('line_index '
4000                                    || l_line_index_tbl(i) ||' ord_uom_selling_price '
4001                                    || l_ord_uom_selling_price_tbl(i));
4002         END IF; --l_debug
4003 
4004       END LOOP; --i
4005     END IF; --l_line_index_tbl.count
4006 
4007     --added for bug 2926554
4008     IF l_ldet_dtl_index.COUNT > 0
4009       THEN
4010       FORALL i IN l_ldet_dtl_index.first..l_ldet_dtl_index.last
4011       UPDATE qp_npreq_ldets_tmp ldet
4012       SET ldet.operand_value = l_ldet_operand_value(i)
4013           , ldet.adjustment_amount = l_ldet_adjamt(i)
4014           , ldet.applied_flag = l_ldet_applied_flag(i)
4015           , ldet.updated_flag = l_ldet_updated_flag(i)
4016           , ldet.process_code = l_ldet_process_code(i)
4017           , ldet.pricing_status_code = l_ldet_sts_code(i)
4018           , ldet.pricing_status_text = l_ldet_sts_text(i)
4019           , ldet.calculation_code = l_ldet_calc_code(i)
4020           , ldet.order_qty_operand = l_ldet_ord_qty_operand(i) --3057395
4021           , ldet.order_qty_adj_amt = l_ldet_ord_qty_adj_amt(i) --3057395
4022       WHERE ldet.line_detail_index = l_ldet_dtl_index(i)
4023       AND ldet.line_index = l_ldet_line_index(i);
4024 
4025     END IF; --l_ldet_dtl_index.COUNT
4026 
4027 
4028     IF l_line_index_tbl.COUNT > 0
4029       THEN
4030 
4031       IF l_debug = FND_API.G_TRUE THEN
4032         QP_PREQ_GRP.engine_debug('unit price needs to be updated');
4033       END IF;
4034 
4035       FORALL i IN l_line_index_tbl.FIRST..l_line_index_tbl.LAST
4036       UPDATE qp_npreq_lines_tmp
4037       SET    adjusted_unit_price = l_adj_unit_price_tbl(i)
4038              --, adjusted_unit_price_ur = l_adjusted_unit_price_ur(i)         --[prarasto:Post Round], [julin/postround] redesign
4039              , line_unit_price = l_line_unit_price_tbl(i)
4040              , pricing_status_code = nvl(l_pricing_sts_code_tbl(i), G_STATUS_UPDATED) /* bug 3248475 */
4041              , pricing_status_text = l_pricing_sts_text_tbl(i)  /* bug 3248475 */
4042              , order_uom_selling_price = l_unit_selling_price(i)       --[prarasto:Post Round]
4043              --, order_uom_selling_price_ur = l_unit_selling_price_ur(i) --[prarasto:Post Round], [julin/postround] redesign
4044              , extended_price = l_extended_selling_price(i)            --[prarasto:Post Round]
4045              --, extended_selling_price_ur = l_extended_selling_price_ur(i) --[prarasto:Post Round], [julin/postround] redesign
4046       WHERE line_index = l_line_index_tbl(i)
4047 --		and (l_adj_unit_price_tbl(i) <> l_unit_price_tbl(i)     --3524967
4048       AND (adjusted_unit_price <> unit_price --3524967
4049            --changes for bug 2776800 to populate order_uom_selling_price
4050            OR updated_adjusted_unit_price IS NOT NULL
4051            OR order_uom_selling_price IS NULL);
4052     END IF;
4053 
4054   EXCEPTION
4055     WHEN OTHERS THEN
4056       x_return_status := FND_API.G_RET_STS_ERROR;
4057       x_return_status_text := l_routine ||' '|| SQLERRM;
4058       IF l_debug = FND_API.G_TRUE THEN
4059         QP_PREQ_GRP.ENGINE_DEBUG(x_return_status_text);
4060       END IF;
4061   END UPDATE_UNIT_PRICE;
4062 
4063 
4064 
4065   --Procedure to update the line status to 'UPDATED' if there are
4066   --any lines with adjustments with process_code 'UPDATED'/'N'
4067 
4068   PROCEDURE Update_Line_Status(x_return_status OUT NOCOPY VARCHAR2,
4069                                x_return_status_text OUT NOCOPY VARCHAR2) IS
4070 
4071   BEGIN
4072     l_debug := QP_PREQ_GRP.G_DEBUG_ENGINE;
4073     IF l_debug = FND_API.G_TRUE THEN
4074       QP_PREQ_GRP.engine_debug('Begin Update_Line_Status:calculate_flag '|| G_CALCULATE_FLAG);
4075 
4076     END IF;
4077 
4078     IF QP_JAVA_ENGINE_UTIL_PUB.Java_Engine_Running = 'N' THEN
4079       /* Modified where clause as per suggestion of spgopal for bug 3401941 */
4080       UPDATE qp_npreq_lines_tmp line
4081               SET pricing_status_code = G_STATUS_UPDATED
4082               --for bug 2812738 not to update if back_calc_error/gsa_violatn
4083               WHERE line.pricing_status_code = G_STATUS_UNCHANGED
4084 --fix for bug 3425569 where frozen lines were set to status updated
4085 --and processing constraints cause error in OM when they update frozen lines
4086               AND (line.price_flag IN (QP_PREQ_PUB.G_YES, QP_PREQ_PUB.G_PHASE, QP_PREQ_PUB.G_CALCULATE_ONLY)
4087                    OR nvl(line.processed_code, '0') = QP_PREQ_PUB.G_BY_ENGINE)
4088               AND (G_CALCULATE_FLAG = G_CALCULATE_ONLY
4089 
4090                    OR  EXISTS (SELECT 'Y' FROM qp_npreq_ldets_tmp ldet
4091                                WHERE ldet.line_index = line.line_index
4092                                AND ldet.pricing_status_code = G_STATUS_NEW
4093                                AND ldet.applied_flag = G_YES -- bug 6111048/6328486
4094                                AND ldet.process_code IN
4095                                (G_STATUS_NEW, G_STATUS_UPDATED))
4096                    --for bug#3224658
4097                    OR  EXISTS (SELECT 'Y' FROM qp_npreq_ldets_tmp
4098                                WHERE modifier_level_code = 'ORDER'
4099                                AND applied_flag = 'YES' -- bug 6628324
4100                                AND pricing_status_code = G_STATUS_NEW
4101                                AND process_code IN (G_STATUS_NEW, G_STATUS_UPDATED))
4102                    OR EXISTS (SELECT 'Y' FROM oe_price_adjustments adj
4103                               WHERE line.line_type_code = G_LINE_LEVEL
4104                               AND line.line_id = adj.line_id
4105                               AND adj.applied_flag = G_YES
4106                               AND adj.list_line_id NOT IN (SELECT ldet.created_from_list_line_id FROM qp_npreq_ldets_tmp ldet
4107                                                            WHERE ldet.line_index = line.line_index
4108                                                            AND ldet.pricing_status_code = G_STATUS_NEW
4109                                                            AND ldet.process_code IN (G_STATUS_NEW, G_STATUS_UPDATED)
4110                                                            AND ldet.applied_flag = G_YES))
4111                    OR EXISTS (SELECT 'Y' FROM oe_price_adjustments adj
4112                               WHERE line.line_type_code = G_ORDER_LEVEL
4113                               AND line.line_id = adj.header_id
4114                               AND adj.applied_flag = G_YES
4115                               AND adj.list_line_id NOT IN (SELECT ldet.created_from_list_line_id FROM qp_npreq_ldets_tmp ldet
4116                                                            WHERE ldet.line_index = line.line_index
4117                                                            AND ldet.pricing_status_code = G_STATUS_NEW
4118                                                            AND ldet.process_code IN (G_STATUS_NEW, G_STATUS_UPDATED)
4119                                                            AND ldet.applied_flag = G_YES))
4120                    );
4121     ELSE
4122       UPDATE qp_int_lines line
4123               SET pricing_status_code = G_STATUS_UPDATED
4124               --for bug 2812738 not to update if back_calc_error/gsa_violatn
4125               WHERE line.pricing_status_code = G_STATUS_UNCHANGED
4126 --fix for bug 3425569 where frozen lines were set to status updated
4127 --and processing constraints cause error in OM when they update frozen lines
4128               AND (line.price_flag IN (QP_PREQ_PUB.G_YES, QP_PREQ_PUB.G_PHASE, QP_PREQ_PUB.G_CALCULATE_ONLY)
4129                    OR nvl(line.processed_code, '0') = QP_PREQ_PUB.G_BY_ENGINE)
4130               AND (G_CALCULATE_FLAG = G_CALCULATE_ONLY
4131 
4132                    OR  EXISTS (SELECT 'Y' FROM qp_int_ldets ldet
4133                                WHERE ldet.line_index = line.line_index
4134                                AND ldet.pricing_status_code = G_STATUS_NEW
4135                                AND ldet.applied_flag = G_YES -- bug 6111048/6328486
4136                                AND ldet.process_code IN
4137                                (G_STATUS_NEW, G_STATUS_UPDATED))
4138                    --for bug#3224658
4139                    OR  EXISTS (SELECT 'Y' FROM qp_int_ldets
4140                                WHERE modifier_level_code = 'ORDER'
4141                                AND applied_flag = 'YES' -- bug 6628324
4142                                AND pricing_status_code = G_STATUS_NEW
4143                                AND process_code IN (G_STATUS_NEW, G_STATUS_UPDATED))
4144                    OR EXISTS (SELECT 'Y' FROM oe_price_adjustments adj
4145                               WHERE line.line_type_code = G_LINE_LEVEL
4146                               AND line.line_id = adj.line_id
4147                               AND adj.applied_flag = G_YES
4148                               AND adj.list_line_id NOT IN (SELECT ldet.created_from_list_line_id FROM qp_int_ldets ldet
4149                                                            WHERE ldet.line_index = line.line_index
4150                                                            AND ldet.pricing_status_code = G_STATUS_NEW
4151                                                            AND ldet.process_code IN (G_STATUS_NEW, G_STATUS_UPDATED)
4152                                                            AND ldet.applied_flag = G_YES))
4153                    OR EXISTS (SELECT 'Y' FROM oe_price_adjustments adj
4154                               WHERE line.line_type_code = G_ORDER_LEVEL
4155                               AND line.line_id = adj.header_id
4156                               AND adj.applied_flag = G_YES
4157                               AND adj.list_line_id NOT IN (SELECT ldet.created_from_list_line_id FROM qp_int_ldets ldet
4158                                                            WHERE ldet.line_index = line.line_index
4159                                                            AND ldet.pricing_status_code = G_STATUS_NEW
4160                                                            AND ldet.process_code IN (G_STATUS_NEW, G_STATUS_UPDATED)
4161                                                            AND ldet.applied_flag = G_YES))
4162                    );
4163 
4164     END IF;
4165 
4166   EXCEPTION
4167     WHEN OTHERS THEN
4168       x_return_status := FND_API.G_RET_STS_ERROR;
4169       x_return_status_text := 'Exception in QP_PREQ_PUB.Update_Line_Status: '|| SQLERRM;
4170   END Update_Line_Status;
4171 
4172   --overloaded for QP.G reqts
4173   --this is used in performance code path called from QPXVCLNB.fetch_adjustments
4174 
4175   PROCEDURE CALCULATE_PRICE(p_request_type_code IN VARCHAR2,
4176                             p_rounding_flag IN VARCHAR2,
4177                             p_view_name IN VARCHAR2,
4178                             p_event_code IN VARCHAR2,
4179                             p_adj_tbl IN QP_PREQ_PUB.ADJ_TBL_TYPE,
4180                             x_return_status OUT NOCOPY VARCHAR2,
4181                             x_return_status_text OUT NOCOPY VARCHAR2) IS
4182 
4183   --fix for bug 2515762 to print in debug the rltd info
4184   CURSOR l_rltd_lines_cur IS
4185     SELECT line_index,
4186             related_line_index,
4187             line_detail_index,
4188             related_line_detail_index,
4189             relationship_type_code,
4190             list_line_id,
4191             related_list_line_id,
4192             related_list_line_type,
4193             operand_calculation_code,
4194             operand,
4195             pricing_group_sequence,
4196             setup_value_from,
4197             setup_value_to,
4198             qualifier_value
4199     FROM qp_npreq_rltd_lines_tmp
4200     WHERE pricing_status_code = G_STATUS_NEW;
4201 
4202   CURSOR l_net_amount_flag_cur (p_list_line_id NUMBER) IS
4203     SELECT net_amount_flag
4204     FROM qp_list_lines
4205     WHERE list_line_id = p_list_line_id;
4206 
4207 
4208   Calculate_Exc EXCEPTION;
4209 
4210 
4211   --back_calculate BOOLEAN := FALSE;
4212   back_calculate_succ BOOLEAN := FALSE;
4213   line_change BOOLEAN := FALSE;
4214 
4215   --l_amount_changed NUMBER :=0;
4216   l_adjustment_amount NUMBER := 0;
4217   l_operand_value NUMBER := 0;
4218   l_back_calculate_start_type VARCHAR2(30);
4219   --l_prev_line_index NUMBER :=0;
4220   l_prev_line_index NUMBER := - 9999; -- SL_latest 2892848
4221   l_1st_bucket VARCHAR2(1) := 'N'; -- SL_latest
4222   l_list_price NUMBER := 0;
4223   --l_adjusted_price NUMBER :=0; -- 2892848
4224   --l_prev_bucket NUMBER :=0; -- 2892848
4225   l_adjusted_price NUMBER := NULL; --2892848 so we can nvl(l_adjusted_price, unit_price) when assign l_sub_total_price
4226   l_prev_bucket NUMBER := - 9999; --2892848
4227   l_line_adjusted_price NUMBER := 0;
4228   l_sub_total_price NUMBER := NULL; -- SL_more
4229   l_return_adjustment NUMBER := 0;
4230   l_sign NUMBER := 1;
4231   l_return_status VARCHAR2(30);
4232   l_return_status_text VARCHAR2(240);
4233   l_routine VARCHAR2(50) := 'Routine :QP_PREQ_PUB.Calculate_price ';
4234   --l_processed_flag VARCHAR2(1);
4235   --l_pbh_request_qty NUMBER :=0;
4236 
4237   --l_pbh_net_adj_amount NUMBER := 0; -- 2892848 no need
4238   --l_pbh_prev_net_adj_amount NUMBER := 0; -- 2892848 no need
4239 
4240   i PLS_INTEGER;
4241   j PLS_INTEGER;
4242   x PLS_INTEGER := 0; -- 3126019
4243   y PLS_INTEGER;
4244   l_tbl_index PLS_INTEGER;
4245 
4246   l_adj_tbl QP_PREQ_PUB.adj_tbl_type;
4247   l_frt_tbl FRT_CHARGE_TBL;
4248   l_back_calc_ret_rec back_calc_rec_type;
4249 
4250   l_ldet_line_dtl_index_tbl QP_PREQ_GRP.NUMBER_TYPE;
4251   l_ldet_line_index_tbl QP_PREQ_GRP.NUMBER_TYPE;
4252   l_ldet_list_hdr_id_tbl QP_PREQ_GRP.NUMBER_TYPE;
4253   l_ldet_list_line_id_tbl QP_PREQ_GRP.NUMBER_TYPE;
4254   l_ldet_list_line_type_tbl QP_PREQ_GRP.VARCHAR_TYPE;
4255   l_ldet_operand_value_tbl QP_PREQ_GRP.NUMBER_TYPE;
4256   l_ldet_adj_amt_tbl QP_PREQ_GRP.NUMBER_TYPE;
4257   l_ldet_applied_flag_tbl QP_PREQ_GRP.FLAG_TYPE;
4258   l_ldet_updated_flag_tbl QP_PREQ_GRP.FLAG_TYPE;
4259   l_ldet_pricing_sts_code_tbl QP_PREQ_GRP.VARCHAR_TYPE;
4260   l_ldet_process_code_tbl QP_PREQ_GRP.VARCHAR_TYPE;
4261   l_ldet_pricing_sts_txt_tbl QP_PREQ_GRP.VARCHAR_TYPE;
4262   l_ldet_price_break_type_tbl QP_PREQ_GRP.VARCHAR_TYPE;
4263   l_ldet_line_quantity_tbl QP_PREQ_GRP.NUMBER_TYPE;
4264   l_ldet_operand_calc_tbl QP_PREQ_GRP.VARCHAR_TYPE;
4265   l_ldet_pricing_grp_seq_tbl QP_PREQ_GRP.NUMBER_TYPE;
4266   l_ldet_list_type_code_tbl QP_PREQ_GRP.VARCHAR_TYPE;
4267   l_ldet_limit_code_tbl QP_PREQ_GRP.VARCHAR_TYPE;
4268   l_ldet_limit_text_tbl QP_PREQ_GRP.VARCHAR_TYPE;
4269   l_ldet_list_line_no_tbl QP_PREQ_GRP.VARCHAR_TYPE;
4270   l_ldet_charge_type_tbl QP_PREQ_GRP.VARCHAR_TYPE;
4271   l_ldet_charge_subtype_tbl QP_PREQ_GRP.VARCHAR_TYPE;
4272   l_ldet_automatic_flag_tbl QP_PREQ_GRP.VARCHAR_TYPE;
4273   l_ldet_pricing_phase_id_tbl QP_PREQ_GRP.NUMBER_TYPE;
4274   l_ldet_modifier_level_tbl QP_PREQ_GRP.VARCHAR_TYPE;
4275   l_ldet_is_max_frt_tbl QP_PREQ_GRP.VARCHAR_TYPE;
4276   l_ldet_calc_code_tbl QP_PREQ_GRP.VARCHAR_TYPE;
4277   l_ldet_ordqty_operand_tbl QP_PREQ_GRP.NUMBER_TYPE;
4278   l_ldet_ordqty_adjamt_tbl QP_PREQ_GRP.NUMBER_TYPE;
4279 
4280 
4281   l_line_index_tbl QP_PREQ_GRP.NUMBER_TYPE;
4282   l_unit_price_tbl QP_PREQ_GRP.NUMBER_TYPE;
4283   l_adj_unit_price_tbl QP_PREQ_GRP.NUMBER_TYPE;
4284   l_amount_changed_tbl QP_PREQ_GRP.NUMBER_TYPE;
4285   l_ordered_qty_tbl QP_PREQ_GRP.NUMBER_TYPE;
4286   l_line_priced_qty_tbl QP_PREQ_GRP.NUMBER_TYPE;
4287   l_catchweight_qty_tbl QP_PREQ_GRP.NUMBER_TYPE;
4288   l_actual_order_qty_tbl QP_PREQ_GRP.NUMBER_TYPE;
4289   l_line_unit_price_tbl QP_PREQ_GRP.NUMBER_TYPE;
4290   l_pricing_sts_code_tbl QP_PREQ_GRP.VARCHAR_TYPE;
4291   l_pricing_sts_txt_tbl QP_PREQ_GRP.VARCHAR_TYPE;
4292   l_process_code_tbl QP_PREQ_GRP.VARCHAR_TYPE;
4293   l_upd_adj_unit_price_tbl QP_PREQ_GRP.NUMBER_TYPE;
4294   l_processed_flag_tbl QP_PREQ_GRP.FLAG_TYPE;
4295   l_rounding_factor_tbl QP_PREQ_GRP.NUMBER_TYPE;
4296   l_ordqty_selling_price_tbl QP_PREQ_GRP.NUMBER_TYPE;
4297   l_ordqty_unit_price_tbl QP_PREQ_GRP.NUMBER_TYPE;
4298   l_ntamt_adj_unit_price QP_PREQ_GRP.NUMBER_TYPE; -- 3126019
4299   l_calc_quantity NUMBER;
4300 
4301   --[prarasto:Post Round] Start : new variables
4302   l_extended_selling_price_ur 	QP_PREQ_GRP.NUMBER_TYPE;
4303   l_adjusted_unit_price_ur	QP_PREQ_GRP.NUMBER_TYPE;
4304   l_unit_selling_price_ur	QP_PREQ_GRP.NUMBER_TYPE;
4305   l_extended_selling_price 	QP_PREQ_GRP.NUMBER_TYPE;
4306   l_adjusted_unit_price		QP_PREQ_GRP.NUMBER_TYPE;
4307   l_unit_selling_price		QP_PREQ_GRP.NUMBER_TYPE;
4308   --[prarasto:Post Round] End : new variables
4309 
4310   l_back_calc_dtl_index QP_PREQ_GRP.NUMBER_TYPE;
4311   l_back_calc_adj_amt QP_PREQ_GRP.NUMBER_TYPE;
4312   l_back_calc_plsql_tbl_index QP_PREQ_GRP.NUMBER_TYPE;
4313 
4314   l_back_calc_dtl_ind NUMBER;
4315   l_back_calc_adj_amount NUMBER;
4316   l_back_calc_plsql_index NUMBER;
4317   --begin 2388011
4318   l_req_value_per_unit NUMBER; --2388011 priya added this variable
4319   l_total_value NUMBER; --group_value --2388011 priya added this variable
4320   l_bucketed_adjustment NUMBER; --2388011 priya added this variable
4321   --end 2388011
4322 
4323   l_pricing_attribute VARCHAR2(240);
4324 
4325   --added to calculate order level adjustments' adj amt
4326   l_ord_dtl_index_tbl QP_PREQ_GRP.NUMBER_TYPE;
4327   l_ord_adj_amt_tbl QP_PREQ_GRP.NUMBER_TYPE;
4328   l_ord_qty_adj_amt_tbl QP_PREQ_GRP.NUMBER_TYPE;
4329   l_ord_qty_operand_tbl QP_PREQ_GRP.NUMBER_TYPE;
4330   l_ord_qty_adj_amt NUMBER := 0;
4331   l_ord_qty_operand NUMBER := 0;
4332 
4333   -- begin 2892848, net amount
4334   l_qualifier_value NUMBER := NULL; -- to qualify PBH
4335   s PLS_INTEGER := 0; -- counter for l_line_bucket_detail_tbl
4336   l_lg_adj_amt NUMBER := NULL; -- 2892848
4337   l_prev_lg_adj_amt NUMBER := 0;
4338 
4339   /* SL_latest 2892848
4340 -- for linegroup
4341 TYPE bucket_adj_amt_tbl IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
4342 l_bucket_adj_amt_tbl bucket_adj_amt_tbl;
4343 
4344 -- for line level
4345 TYPE bucket_index_adj_tbl IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
4346 l_bucket_index_adj_tbl bucket_index_adj_tbl;
4347 
4348 TYPE prev_bucket_index_adj_tbl IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
4349 l_prev_bucket_index_adj_tbl prev_bucket_index_adj_tbl;
4350 -- end 2892848
4351 */
4352 
4353   --begin SL_latest
4354   CURSOR l_net_mod_index_cur(p_list_line_id NUMBER) IS
4355     SELECT DISTINCT ldet.line_index
4356     FROM qp_npreq_ldets_tmp ldet
4357     WHERE ldet.created_from_list_line_id = p_list_line_id
4358     AND pricing_status_code IN (G_STATUS_NEW, G_STATUS_UPDATED, G_STATUS_UNCHANGED);
4359 
4360   l_line_bucket_amt NUMBER := 0;
4361   l_lg_net_amt NUMBER := 0;
4362   l_prev_qty NUMBER := 0;
4363   l_applied_req_value_per_unit NUMBER := 0;
4364   l_prod_line_bucket_amt NUMBER := 0;
4365   l_lg_prod_net_amt NUMBER := 0;
4366 
4367   -- record bucketed USP*qtyfor each line_index upon bucket change
4368   TYPE bucket_amt_tbl IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
4369   l_bucket_amt_tbl bucket_amt_tbl;
4370   l_prev_bucket_amt_tbl bucket_amt_tbl;
4371 
4372   -- hash table of list_line_id and its corresponding lg_net_amt
4373   TYPE mod_lg_net_amt_tbl IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
4374   l_mod_lg_net_amt_tbl mod_lg_net_amt_tbl;
4375   l_mod_lg_prod_net_amt_tbl mod_lg_net_amt_tbl; -- [julin/4112395/4220399]
4376 
4377   -- end SL_latest 2892848
4378 
4379   l_adj_exists_in_tmp_tbl VARCHAR2(1) := 'N'; -- bug 3618464
4380   L_LINE_INDEX_STR VARCHAR2(2000); -- bug 3618464
4381   L_INSTR_POS NUMBER; -- bug 3618464
4382   L_INDEX NUMBER; -- bug 3618464
4383 
4384   -- [julin/3265308] net amount calculation 'P', match product only.
4385   -- given a line line id, find the product attribute and context for
4386   -- the modifier and match all request lines with that context/attr
4387   -- pair.  exclude logic included.  price_flag clause included to
4388   -- ignore free goods.
4389   CURSOR l_prod_attr_info(p_list_line_id NUMBER) IS
4390     SELECT DISTINCT qla.line_index, ql.priced_quantity, ql.unit_price
4391     FROM qp_preq_line_attrs_tmp qla, qp_pricing_attributes qpa, qp_preq_lines_tmp ql
4392     WHERE qpa.list_line_id = p_list_line_id
4393     AND qla.context = qpa.product_attribute_context
4394     AND qla.attribute = qpa.product_attribute
4395     AND qla.value_from = qpa.product_attr_value
4396     AND qla.line_index = ql.line_index
4397     AND ql.price_flag <> G_PHASE
4398     AND ql.pricing_status_code IN (QP_PREQ_PUB.G_STATUS_UPDATED,
4399                                    QP_PREQ_PUB.G_STATUS_GSA_VIOLATION,
4400                                    QP_PREQ_PUB.G_STATUS_UNCHANGED)
4401     AND NOT EXISTS (SELECT qla2.line_index
4402                     FROM qp_preq_line_attrs_tmp qla2, qp_pricing_attributes qpa2
4403                     WHERE qpa2.list_line_id = p_list_line_id
4404                     AND qpa2.excluder_flag = G_YES
4405                     AND qla2.line_index = qla.line_index
4406                     AND qla2.context = qpa2.product_attribute_context
4407                     AND qla2.attribute = qpa2.product_attribute
4408                     AND qla2.value_from = qpa2.product_attr_value);
4409 
4410   l_netamt_flag VARCHAR2(1);
4411   l_bucketed_flag VARCHAR2(1);
4412 
4413   -- [julin/5025231]
4414   l_line_ind_ind_lookup_tbl QP_PREQ_GRP.NUMBER_TYPE;
4415 
4416   BEGIN
4417     l_debug := QP_PREQ_GRP.G_DEBUG_ENGINE;
4418     IF l_debug = FND_API.G_TRUE THEN
4419       QP_PREQ_GRP.engine_debug('begin calculate price 1');
4420 
4421       QP_PREQ_GRP.engine_debug('Display related records ');
4422     END IF;
4423     IF QP_PREQ_GRP.G_DEBUG_ENGINE = FND_API.G_TRUE
4424       THEN
4425       --fix for bug 2515762 to print in debug the rltd info
4426       FOR cl IN l_rltd_lines_cur
4427         LOOP
4428         IF l_debug = FND_API.G_TRUE THEN
4429           QP_PREQ_GRP.engine_debug('related records with status N '
4430                                    ||' line_dtl_index '|| cl.line_detail_index
4431                                    ||' rltd_line_dtl_index '|| cl.related_line_detail_index
4432                                    ||' line_index '|| cl.line_index
4433                                    ||' rltd_line_index '|| cl.related_line_index
4434                                    ||' list_line_id '|| cl.list_line_id
4435                                    ||' rltd_list_line_id '|| cl.related_list_line_id
4436                                    ||' rltd_list_line_type '|| cl.related_list_line_type
4437                                    ||' operand '|| cl.operand
4438                                    ||' operator '|| cl.operand_calculation_code
4439                                    ||' bucket '|| cl.pricing_group_sequence
4440                                    ||' setval_from '|| cl.setup_value_from
4441                                    ||' setval_to '|| cl.setup_value_to
4442                                    ||' qual_value '|| cl.qualifier_value);
4443         END IF;
4444       END LOOP;
4445     END IF;
4446 
4447     --reset order lvl adjustments' adj amt
4448     l_ord_dtl_index_tbl.DELETE;
4449     l_ord_adj_amt_tbl.DELETE;
4450     l_ord_qty_adj_amt_tbl.DELETE;
4451     l_ord_qty_operand_tbl.DELETE;
4452 
4453     G_ldet_plsql_index_tbl.DELETE;
4454 
4455     l_adj_tbl.DELETE;
4456     l_frt_tbl.DELETE;
4457     l_line_index_tbl.DELETE;
4458     l_unit_price_tbl.DELETE;
4459     l_adj_unit_price_tbl.DELETE;
4460     l_amount_changed_tbl.DELETE;
4461     l_ordered_qty_tbl.DELETE;
4462     l_line_unit_price_tbl.DELETE;
4463     l_line_priced_qty_tbl.DELETE;
4464     l_catchweight_qty_tbl.DELETE;
4465     l_actual_order_qty_tbl.DELETE;
4466     l_pricing_sts_code_tbl.DELETE;
4467     l_pricing_sts_txt_tbl.DELETE;
4468     l_process_code_tbl.DELETE;
4469     l_upd_adj_unit_price_tbl.DELETE;
4470     l_processed_flag_tbl.DELETE;
4471     l_rounding_factor_tbl.DELETE;
4472     l_ordqty_unit_price_tbl.DELETE;
4473     l_ordqty_selling_price_tbl.DELETE;
4474 
4475     l_ldet_line_dtl_index_tbl.DELETE;
4476     l_ldet_line_index_tbl.DELETE;
4477     l_ldet_list_hdr_id_tbl.DELETE;
4478     l_ldet_list_line_id_tbl.DELETE;
4479     l_ldet_list_line_type_tbl.DELETE;
4480     l_ldet_operand_value_tbl.DELETE;
4481     l_ldet_adj_amt_tbl.DELETE;
4482     l_ldet_applied_flag_tbl.DELETE;
4483     l_ldet_updated_flag_tbl.DELETE;
4484     l_ldet_pricing_sts_code_tbl.DELETE;
4485     l_ldet_process_code_tbl.DELETE;
4486     l_ldet_pricing_sts_txt_tbl.DELETE;
4487     l_ldet_price_break_type_tbl.DELETE;
4488     l_ldet_line_quantity_tbl.DELETE;
4489     l_ldet_operand_calc_tbl.DELETE;
4490     l_ldet_pricing_grp_seq_tbl.DELETE;
4491     l_ldet_list_type_code_tbl.DELETE;
4492     l_ldet_limit_code_tbl.DELETE;
4493     l_ldet_limit_text_tbl.DELETE;
4494     l_ldet_list_line_no_tbl.DELETE;
4495     l_ldet_charge_type_tbl.DELETE;
4496     l_ldet_charge_subtype_tbl.DELETE;
4497     l_ldet_updated_flag_tbl.DELETE;
4498     l_ldet_automatic_flag_tbl.DELETE;
4499     l_ldet_pricing_phase_id_tbl.DELETE;
4500     l_ldet_modifier_level_tbl.DELETE;
4501     l_ldet_is_max_frt_tbl.DELETE;
4502     l_ldet_calc_code_tbl.DELETE;
4503     l_ldet_ordqty_operand_tbl.DELETE;
4504     l_ldet_ordqty_adjamt_tbl.DELETE;
4505 
4506     l_back_calc_dtl_index.DELETE;
4507     l_back_calc_adj_amt.DELETE;
4508     l_back_calc_plsql_tbl_index.DELETE;
4509 
4510     --l_bucket_adj_amt_tbl.delete; --2892848
4511     --l_bucket_index_adj_tbl.delete; --2892848
4512     --l_prev_bucket_index_adj_tbl.delete; --2892848
4513     l_bucket_amt_tbl.DELETE; -- 2892848 SL_latest
4514     l_prev_bucket_amt_tbl.DELETE;
4515     l_mod_lg_net_amt_tbl.DELETE; -- 2892848 SL_latest
4516     l_mod_lg_prod_net_amt_tbl.DELETE; --  -- [julin/4112395/4220399]
4517     l_ntamt_adj_unit_price.DELETE; --3126019
4518 
4519     l_adj_tbl := p_adj_tbl;
4520 
4521     IF l_debug = FND_API.G_TRUE THEN
4522       QP_PREQ_GRP.engine_debug('begin calculate price 2');
4523       QP_PREQ_GRP.engine_debug('SL, this direct insert path'); -- 2892848
4524 
4525     END IF;
4526     IF QP_PREQ_GRP.G_DEBUG_ENGINE = FND_API.G_TRUE
4527       THEN
4528       IF l_debug = FND_API.G_TRUE THEN
4529         QP_PREQ_GRP.engine_debug('begin calculate price 3');
4530       END IF;
4531       FOR z IN 1..l_adj_tbl.COUNT
4532         LOOP
4533         IF l_debug = FND_API.G_TRUE THEN
4534           QP_PREQ_GRP.engine_debug('Processing Adjustments:
4535                                    line index '|| l_adj_tbl(z).line_ind ||' '||
4536                                    ' line dtl index '|| l_adj_tbl(z).line_detail_index ||
4537                                    ' pricing_status '|| l_adj_tbl(z).pricing_status_code ||
4538                                    ' ldet rec '|| l_adj_tbl(z).is_ldet_rec ||
4539                                    ' list line id '|| l_adj_tbl(z).created_from_list_line_id ||  -- 2892848
4540                                    ' bucket '|| l_adj_tbl(z).pricing_group_sequence); --2892848
4541         END IF;
4542         --' bucket '||l_adj_tbl(z).pricing_group_sequence);
4543       END LOOP; --z l_adj_tbl
4544     END IF;
4545 
4546     --        back_calculate := false;
4547     --      line_change := true;
4548     --      l_prev_line_index := fnd_api.g_miss_num;
4549     i := l_ldet_line_dtl_index_tbl.COUNT;
4550     j := l_adj_tbl.COUNT;
4551     x := l_line_index_tbl.COUNT;
4552     --l_pbh_net_adj_amount := 0;  -- 2892848 no need
4553     --l_pbh_prev_net_adj_amount := 0; -- 2892848 no need
4554 
4555     j := l_adj_tbl.FIRST;
4556     WHILE J IS NOT NULL
4557       LOOP
4558 
4559       -- begin 2892848
4560       -- obtain net_adj_amount_flag from qp_list_lines table if null,
4561       -- since it may not be passed from calling application
4562       IF l_adj_tbl(j).net_amount_flag IS NULL THEN -- get it from setup just in case
4563         OPEN l_net_amount_flag_cur(l_adj_tbl(j).created_from_list_line_id);
4564         FETCH l_net_amount_flag_cur INTO l_adj_tbl(j).net_amount_flag;
4565         CLOSE l_net_amount_flag_cur;
4566       END IF;
4567       -- end 2892848
4568 
4569       IF l_debug = FND_API.G_TRUE THEN
4570         QP_PREQ_GRP.engine_debug('Processing Line: Line Index '
4571                                  || l_adj_tbl(j).line_ind ||
4572                                  ' list price: '|| l_adj_tbl(j).unit_price ||
4573                                  ' l_adj_tbl(j).updated_adjusted_unit_price: '|| l_adj_tbl(j).updated_adjusted_unit_price ||
4574                                  ' previous l_adjusted_price: '|| l_adjusted_price ||  -- 2892848
4575                                  ' list line id: '|| l_adj_tbl(j).created_from_list_line_id ||
4576                                  ' bucket: '|| l_adj_tbl(j).pricing_group_sequence ||  -- 2892848
4577                                  ' net_amount_flag: '|| l_adj_tbl(j).net_amount_flag); -- 2892828
4578 
4579       END IF; -- end debug
4580       l_return_adjustment := 0;
4581 
4582 
4583       ------------------NET AMT STUFF, SL_latest
4584       -- begin 2892848
4585       -- ldet lines are ordered by bucket, line index
4586       -- l_sub_total_price is bucketed unit price,
4587       -- l_adjusted_price is the current USP
4588       -- defaulting l_sub_total_price and l_adjusted_price
4589 
4590       -- l_sub_total_price := nvl(l_adj_tbl(j).unit_price, 0); -- SL_more, do not reset, since we need USP from prev bucket sometimes
4591       IF (l_ntamt_adj_unit_price.EXISTS(l_adj_tbl(j).line_ind)) THEN
4592         IF l_debug = FND_API.G_TRUE THEN
4593           QP_PREQ_GRP.engine_debug('l_ntamt_adj_unit_price(cur_line_ind): '|| l_ntamt_adj_unit_price(l_adj_tbl(j).line_ind));
4594         END IF; --  Added For Bug No - 4033618
4595         l_adjusted_price := nvl(l_ntamt_adj_unit_price(l_adj_tbl(j).line_ind), l_adj_tbl(j).unit_price);
4596       ELSE
4597         l_adjusted_price := nvl(l_adj_tbl(j).unit_price, 0); -- SL_more
4598       END IF;
4599 
4600       IF (l_adjusted_price IS NULL) THEN -- SL_more
4601         l_adjusted_price := 0; -- NULL cause nvl(l_ntamt_adj_unit_price(l_adj_tbl(j).line_ind),l_adj_tbl(j).unit_price) being null
4602       END IF; -- end debug
4603 
4604       IF l_debug = FND_API.G_TRUE THEN -- SL_more
4605         QP_PREQ_GRP.engine_debug('l_adjusted_price default: '|| l_adjusted_price);
4606       END IF; -- end debug
4607 
4608       IF (l_adj_tbl(j).pricing_group_sequence IS NULL OR
4609           l_adj_tbl(j).pricing_group_sequence = 0) THEN
4610         l_sub_total_price := nvl(l_adj_tbl(j).unit_price, 0);
4611         -- begin 3126019
4612         IF l_prev_line_index = l_adj_tbl(j).line_ind THEN -- will be at least 1
4613           line_change := FALSE;
4614         ELSE
4615           line_change := TRUE;
4616           l_prev_line_index := l_adj_tbl(j).line_ind;
4617         END IF;
4618         -- end 3126019
4619         --l_adjusted_price := l_sub_total_price; -- do not reset this
4620 
4621       ELSE -- not null bucket modifiers or list line
4622         /*
4623 			-- SL_more, we do not want this for same line same bucket case
4624 			-- since we wnat l_bucket_amt_tbl(l_adj_tbl(j).line_ind)  stays at end of prev bucket level
4625 	        -- default, in case there is no further lines to set this, SL_further fix
4626 	        l_bucket_amt_tbl(l_adj_tbl(j).line_ind) :=
4627 	        l_adjusted_price *l_adj_tbl(j).line_priced_quantity;
4628 		     */
4629 
4630         IF l_debug = FND_API.G_TRUE THEN -- SL_more
4631           QP_PREQ_GRP.engine_debug('l_prev_line_index: '|| l_prev_line_index);
4632         END IF; -- end debug
4633 
4634         -- same line
4635         IF l_prev_line_index = l_adj_tbl(j).line_ind THEN -- will be at least 1
4636           line_change := FALSE;
4637           -- same line, bucket change
4638           -- line at least from 1 to up, bucket atleast from 1 to up
4639           IF (l_prev_bucket <> l_adj_tbl(j).pricing_group_sequence) THEN -- same line, bucket change
4640             l_mod_lg_net_amt_tbl.DELETE; -- clear this table upon bucket change to keep it small
4641             l_mod_lg_prod_net_amt_tbl.DELETE; -- [julin/4112395/4220399]
4642             -- if they are the 1st bucketed modifiers
4643             -- later if is 1st bucket is linegroup net amt modifier, we use grp_amt as net_amt
4644             IF (l_prev_bucket = - 9999) THEN
4645               l_1st_bucket := 'Y';
4646             ELSE
4647               l_1st_bucket := 'N';
4648             END IF;
4649             l_prev_bucket := l_adj_tbl(j).pricing_group_sequence; -- preserve new bucket to be next prev_bucket
4650 
4651             -- use USP as l_sub_total_price upon bucket change
4652             IF (l_ntamt_adj_unit_price.EXISTS(l_adj_tbl(j).line_ind)) THEN
4653               l_sub_total_price := nvl(l_ntamt_adj_unit_price(l_adj_tbl(j).line_ind), l_adj_tbl(j).unit_price);
4654               l_adjusted_price := l_sub_total_price;
4655             ELSE
4656               l_sub_total_price := nvl(l_adj_tbl(j).unit_price, 0);
4657               l_adjusted_price := l_sub_total_price;
4658             END IF;
4659 
4660             -- l_bucket_amt_tbl(line_index) stores USP * ord_qty of the line upon bucket change
4661             -- we sum up amts of lines related to the net amt modifier to calculate l_lg_net_amt later
4662             l_bucket_amt_tbl(l_adj_tbl(j).line_ind) := l_adjusted_price * l_adj_tbl(j).line_priced_quantity;
4663 
4664             -- [julin/4055310]
4665             l_prev_bucket_amt_tbl := l_bucket_amt_tbl;
4666 
4667             IF l_debug = FND_API.G_TRUE THEN
4668               QP_PREQ_GRP.engine_debug('same line, different bucket.'
4669                                        ||' sub_total_price: '|| l_sub_total_price ||' adjusted_price: '|| l_adjusted_price );
4670               QP_PREQ_GRP.engine_debug('l_bucket_amt_tbl(' || l_adj_tbl(j).line_ind ||'): '
4671                                        || l_adjusted_price || '*' ||
4672                                        l_adj_tbl(j).line_priced_quantity || '=' || l_bucket_amt_tbl(l_adj_tbl(j).line_ind));
4673             END IF; -- end debug
4674 
4675           ELSE -- SL_more, same line same bucket, ELSE IF (l_prev_bucket <> l_adj_tbl(j).pricing_group_sequence)
4676             IF l_debug = FND_API.G_TRUE THEN
4677               QP_PREQ_GRP.engine_debug('same line, same bucket.'
4678                                        ||' sub_total_price: '|| l_sub_total_price ||' adjusted_price: '|| l_adjusted_price );
4679             END IF; -- end debug
4680           END IF; -- END IF (l_prev_bucket <> l_adj_tbl(j).pricing_group_sequence)
4681 
4682         ELSE -- line change (from -9999 to up, or from at least 1 to up)
4683 
4684           line_change := TRUE;
4685           -- line change , bucket change
4686           -- bucket from -9999 to up,or from at least 1 to up
4687           IF l_prev_bucket <> l_adj_tbl(j).pricing_group_sequence THEN -- line change , bucket change
4688             -- l_mod_lg_net_amt_tbl(list_line_id) sotres l_lg_net_amt of the net amt modifier
4689             -- so no need to re-calculate l_lg_net_amt if same modifier is related to other line(s) in the same bucket
4690             -- clear this table upon bucket change to keep it small
4691             l_mod_lg_net_amt_tbl.DELETE;
4692             l_mod_lg_prod_net_amt_tbl.DELETE; -- [julin/4112395/4220399]
4693 
4694             -- preserve l_prev_bucket
4695             -- if they are the 1st bucketed modifiers
4696             -- later if is 1st bucket is linegroup net amt modifier, we use grp_amt as net_amt
4697             IF (l_prev_bucket = - 9999) THEN
4698               l_1st_bucket := 'Y';
4699             ELSE
4700               l_1st_bucket := 'N';
4701             END IF;
4702             l_prev_bucket := l_adj_tbl(j).pricing_group_sequence; -- preserve new bucket to be next prev_bucket
4703 
4704             -- use USP as l_sub_total_price upon bucket change
4705             IF (l_ntamt_adj_unit_price.EXISTS(l_adj_tbl(j).line_ind)) THEN
4706               l_sub_total_price := nvl(l_ntamt_adj_unit_price(l_adj_tbl(j).line_ind), l_adj_tbl(j).unit_price);
4707               l_adjusted_price := l_sub_total_price;
4708             ELSE
4709               l_sub_total_price := nvl(l_adj_tbl(j).unit_price, 0);
4710               l_adjusted_price := l_sub_total_price;
4711             END IF;
4712             IF l_debug = FND_API.G_TRUE THEN
4713               QP_PREQ_GRP.engine_debug('different line, different bucket. '
4714                                        ||' sub_total_price: '|| l_sub_total_price ||' adjusted_price: '|| l_adjusted_price );
4715             END IF; -- end debug
4716 
4717             IF l_prev_line_index =  - 9999 THEN -- 1st line as no USP in l_adj_unit_price_tbl
4718               l_bucket_amt_tbl(l_adj_tbl(j).line_ind) := nvl(l_adj_tbl(j).unit_price, 0) * l_adj_tbl(j).line_priced_quantity;
4719               IF l_debug = FND_API.G_TRUE THEN
4720                 QP_PREQ_GRP.engine_debug('prev_line_index is -9999');
4721                 QP_PREQ_GRP.engine_debug('l_bucket_amt_tbl(' || l_adj_tbl(j).line_ind ||'): '
4722                                          || nvl(l_adj_tbl(j).unit_price, 0) || '*' ||
4723                                          l_adj_tbl(j).line_priced_quantity || '=' || l_bucket_amt_tbl(l_adj_tbl(j).line_ind));
4724               END IF; -- end debug
4725 
4726               -- bucket change, line change and not the 1st line
4727             ELSE -- l_prev_line_index <> -9999
4728 
4729               IF l_debug = FND_API.G_TRUE THEN
4730                 QP_PREQ_GRP.engine_debug('bucket change, line change and not the 1st line, sub_total_price: '|| l_sub_total_price ||' adjusted_price: '|| l_adjusted_price );
4731               END IF; -- END DEBUG
4732               IF (l_ntamt_adj_unit_price.EXISTS(l_prev_line_index)) THEN
4733                 -- moment to capture current USP for prev line_index,
4734                 -- so we have correct amts in l_bucket_amt_tbl when using it
4735                 l_bucket_amt_tbl(l_prev_line_index) := nvl(l_ntamt_adj_unit_price(l_prev_line_index), l_adj_tbl(j).unit_price) * l_prev_qty;
4736 
4737                 IF l_debug = FND_API.G_TRUE THEN
4738                   QP_PREQ_GRP.engine_debug('capture bucket amt of prev_line_index l_bucket_amt_tbl('|| l_prev_line_index ||'): '
4739                                            || nvl(l_ntamt_adj_unit_price(l_prev_line_index), l_adj_tbl(j).unit_price) || '*' ||
4740                                            l_prev_qty || '=' || l_bucket_amt_tbl(l_prev_line_index));
4741                 END IF; -- end debug
4742 
4743               ELSE -- ELSE IF (l_ntamt_adj_unit_price.EXISTS(l_prev_line_index))
4744                 l_bucket_amt_tbl(l_prev_line_index) := nvl(l_adj_tbl(j).unit_price, 0) * l_prev_qty;
4745                 IF l_debug = FND_API.G_TRUE THEN
4746 
4747                   QP_PREQ_GRP.engine_debug('l_bucket_amt_tbl(' || l_prev_line_index ||'): '
4748                                            || nvl(l_adj_tbl(j).unit_price, 0) || '*' ||
4749                                            l_prev_qty || '=' || l_bucket_amt_tbl(l_prev_line_index));
4750                 END IF; -- end debug
4751               END IF; -- END (l_ntamt_adj_unit_price.EXISTS(l_prev_line_index))
4752               -- [julin/4055310]
4753               l_prev_bucket_amt_tbl := l_bucket_amt_tbl;
4754 
4755             END IF; -- END l_prev_line_index=-9999
4756 
4757           ELSE -- line change same bucket (bucket is at least from 1 to up, line is at least from 1 to up)
4758             IF (l_ntamt_adj_unit_price.EXISTS(l_adj_tbl(j).line_ind)) THEN
4759               l_sub_total_price := nvl(l_ntamt_adj_unit_price(l_adj_tbl(j).line_ind), l_adj_tbl(j).unit_price);
4760               l_adjusted_price := l_sub_total_price;
4761 
4762             ELSE
4763               l_sub_total_price := nvl(l_adj_tbl(j).unit_price, 0);
4764               l_adjusted_price := l_sub_total_price;
4765 
4766             END IF;
4767 
4768             IF l_debug = FND_API.G_TRUE THEN
4769               QP_PREQ_GRP.engine_debug('different line, same bucket');
4770               QP_PREQ_GRP.engine_debug('sub_total_price: '|| l_sub_total_price ||' adjusted_price: '|| l_adjusted_price );
4771             END IF; -- end debug
4772 
4773             -- moment to capture current USP for prev line_index,
4774             -- so we have correct amts in l_bucket_amt_tbl when using it
4775             IF l_ntamt_adj_unit_price.EXISTS(l_prev_line_index) THEN
4776               l_bucket_amt_tbl(l_prev_line_index) := nvl(l_ntamt_adj_unit_price(l_prev_line_index), 0) * l_prev_qty;
4777               IF l_debug = FND_API.G_TRUE THEN
4778                 QP_PREQ_GRP.engine_debug('capture bucket_amt of prev line l_bucket_amt_tbl('|| l_prev_line_index ||'): '
4779                                          || nvl(l_ntamt_adj_unit_price(l_prev_line_index), 0) || '*' ||
4780                                          l_prev_qty || '=' || l_bucket_amt_tbl(l_prev_line_index));
4781               END IF; -- end debug
4782               /*
4783 				 ELSE
4784 				   l_bucket_amt_tbl(l_prev_line_index) := 0;
4785 				   */
4786             END IF; -- end if
4787 
4788             -- SL_more, default, 1st bucket for this line has no prev buckets no prev adjs
4789             IF l_1st_bucket = 'Y' THEN -- 1st bucket for this line, bucket at lease 1 up
4790               l_bucket_amt_tbl(l_adj_tbl(j).line_ind) := nvl(l_adj_tbl(j).unit_price, 0) * l_adj_tbl(j).line_priced_quantity; -- for line level net amt we need this
4791               IF l_debug = FND_API.G_TRUE THEN
4792                 QP_PREQ_GRP.engine_debug('1st bucket for this line l_bucket_amt_tbl('|| l_adj_tbl(j).line_ind ||'): '
4793                                          || nvl(l_adj_tbl(j).unit_price, 0) || '*' ||
4794                                          l_adj_tbl(j).line_priced_quantity || '=' || l_bucket_amt_tbl(l_adj_tbl(j).line_ind));
4795               END IF; -- end debug
4796             END IF; -- END IF l_1st_bucket ='Y'
4797 
4798           END IF; -- end bucket change in the line change block
4799 
4800           l_prev_line_index := l_adj_tbl(j).line_ind; -- preserve the new lind_ind to be l_prev_line_index
4801           l_prev_qty := l_adj_tbl(j).line_priced_quantity;
4802         END IF; --l_prev_line_index = line_index
4803       END IF; -- end if bucket is null or 0
4804 
4805       IF l_debug = FND_API.G_TRUE THEN
4806 
4807         QP_PREQ_GRP.engine_debug('after NET_AMT_STUFF block...');
4808         QP_PREQ_GRP.engine_debug('l_sub_total_price: '|| l_sub_total_price);
4809         QP_PREQ_GRP.engine_debug('l_adjusted_price: '|| l_adjusted_price);
4810 
4811       END IF; -- Added For 4033618
4812       --SL_more
4813       IF l_sub_total_price IS NULL THEN -- default just in case
4814         l_sub_total_price := nvl(l_adj_tbl(j).unit_price, 0);
4815       END IF;
4816       -- end 2892848, SL_latest NET_AMT STUFF
4817 
4818       /* 2892848 SL_latest
4819 	-- begin 2892848
4820 		-- ldet lines are ordered by bucket, line index
4821 		-- when line_index changes, it means it is the point where bucket changes for that line index
4822 		-- l_sub_total_price is bucketed unit price, l_adjusted_price is the current USP (diff data for diff line_index)
4823                 ---Bucket calculations
4824                 IF l_prev_line_index = l_adj_tbl(j).line_ind
4825                 THEN
4826                         IF l_debug = FND_API.G_TRUE THEN
4827                         QP_PREQ_GRP.engine_debug('no line change'
4828 			||' prev_line_index '||l_prev_line_index
4829 			||' prev_bucket '||l_prev_bucket);
4830                         END IF;
4831                         line_change := false;
4832 
4833 
4834                         IF l_debug = FND_API.G_TRUE THEN
4835                            QP_PREQ_GRP.engine_debug('same line.');
4836                            --||' sub_total_price '||l_sub_total_price ||' adjusted_price '||l_adjusted_price  );
4837                         END IF;
4838                  ELSE
4839                         line_change := true;
4840                         l_prev_line_index := l_adj_tbl(j).line_ind; -- preserve the new lind_ind to be l_prev_line_index
4841 
4842 			IF l_adj_unit_price_tbl.EXISTS(l_adj_tbl(j).line_ind) THEN -- do so 'cos first line of that each line_ind will have no data
4843 
4844 			  -- reset to last USP of prev bucket when bucket and line_ind changes
4845                           IF l_adj_tbl(j).pricing_group_sequence is NULL THEN
4846                             l_sub_total_price := l_adj_tbl(j).unit_price; -- use original unit price if null bucket
4847                           ELSE
4848                             l_sub_total_price :=l_adj_unit_price_tbl(l_adj_tbl(j).line_ind);
4849                           END IF;
4850                           l_adjusted_price :=l_adj_unit_price_tbl(l_adj_tbl(j).line_ind);
4851 
4852                          ELSE -- 1st line of each line index has no data in l_adj_unit_price_tbl, use original unit_price
4853 
4854                            l_sub_total_price := l_adj_tbl(j).unit_price;
4855                            l_adjusted_price := l_adj_tbl(j).unit_price;
4856 
4857                          END IF; -- end index exists
4858 
4859                          IF l_debug = FND_API.G_TRUE THEN
4860                             QP_PREQ_GRP.engine_debug('line change '
4861                             ||' sub_total_price '||l_sub_total_price ||' adjusted_price '||l_adjusted_price  );
4862                          END IF;
4863 
4864                    END IF;   --l_prev_line_index = line_index
4865                    -- end 2892848
4866 
4867 				   -- begin 2892848
4868                    -- MOVE TO HERE
4869                 IF l_adj_tbl(J).pricing_group_sequence <> 0 AND l_adj_tbl(J).pricing_group_sequence IS NOT NULL THEN -- bucket 0 is line event list price
4870                    -- detect bucket change, need to CAPTURE unit_adjs (LINE) and adj_amts(LINEGROUP) up to the prev bucket
4871                   IF l_prev_bucket <> l_adj_tbl(j).pricing_group_sequence THEN
4872                     IF l_debug = FND_API.G_TRUE THEN
4873                       QP_PREQ_GRP.engine_debug ('------BUCKET CHANGE----, place to debug adj_amts or unit_adjs up to prev bucket.');
4874                     END IF; -- END debug
4875 
4876                     -- for LINE GROUP
4877                     -- need capture the l_prev_lg_adj_amt
4878                     -- l_bucket_adj_amt_tbl(bucket) stores adj_amts of all lines for each bucket
4879                     -- prev_lg_adj_amt is the sum of adj_amts for all lines up to prev buckets
4880 
4881                     IF l_bucket_adj_amt_tbl.EXISTS(l_prev_bucket) THEN
4882 		      l_prev_lg_adj_amt := nvl(l_prev_lg_adj_amt,0) + l_bucket_adj_amt_tbl(l_prev_bucket);
4883 		      IF l_debug = FND_API.G_TRUE THEN
4884                         QP_PREQ_GRP.engine_debug ('debug LINEGROUP adj amts up to prev bucket - '||l_prev_bucket ||': '||l_prev_lg_adj_amt);
4885                       END IF; -- END debug
4886 
4887 		    END IF; -- END IF l_bucket_adj_amt_tbl.EXISTS(l_prev_bucket)
4888 
4889                     -- bucket change for LINE LEVEL
4890                     -- l_bucket_index_adj_tbl(line_index) stores sum of unit_adjs for each line_index
4891                     -- l_prev_bucket_index_adj_tbl(line_index) is the sum of unit_adjs for that line_index up to prev bucket
4892 
4893                     IF l_bucket_index_adj_tbl.EXISTS(l_adj_tbl(j).line_ind) THEN
4894                       IF l_prev_bucket_index_adj_tbl.EXISTS(l_adj_tbl(j).line_ind) THEN
4895                         l_prev_bucket_index_adj_tbl(l_adj_tbl(j).line_ind):= nvl(l_prev_bucket_index_adj_tbl(l_adj_tbl(j).line_ind),0)
4896                           + l_bucket_index_adj_tbl(l_adj_tbl(j).line_ind);
4897                       ELSE
4898                         l_prev_bucket_index_adj_tbl(l_adj_tbl(j).line_ind):= l_bucket_index_adj_tbl(l_adj_tbl(j).line_ind);
4899                       END IF; -- END IF l_bucket_index_adj_tbl.EXISTS(l_adj_tbl(j).line_ind)
4900 
4901                       IF l_debug = FND_API.G_TRUE THEN
4902                         QP_PREQ_GRP.engine_debug ('debug LINE unit adjs up to prev bucket for line index'||l_adj_tbl(j).line_ind ||': '||l_prev_bucket_index_adj_tbl(l_adj_tbl(j).line_ind) );
4903                       END IF; -- END debug
4904                     END IF; -- END IF l_bucket_index_adj_tbl.EXISTS
4905 
4906                     -- begin shu fix bug for special case, bucket change within same line index
4907                     IF line_change = false THEN
4908                       l_sub_total_price :=l_adj_unit_price_tbl(l_adj_tbl(j).line_ind);
4909 
4910                       IF l_debug = FND_API.G_TRUE THEN
4911                            QP_PREQ_GRP.engine_debug('bucket change within same line'
4912                            ||' sub_total_price '||l_sub_total_price ||' adjusted_price '||l_adjusted_price  );
4913                       END IF;
4914                     END IF; -- END IF line_change = flase
4915                     -- end shu fix bug
4916 
4917                     l_prev_bucket := l_adj_tbl(j).pricing_group_sequence; -- preserve new bucket to be next prev_bucket
4918 
4919                   ELSE -- bucket did not change but line changes within bucket, we also need to capture line level unit adjs of prev bucket
4920                     IF line_change = true THEN
4921                       IF l_bucket_index_adj_tbl.EXISTS(l_adj_tbl(j).line_ind) THEN
4922                       IF l_prev_bucket_index_adj_tbl.EXISTS(l_adj_tbl(j).line_ind) THEN
4923                         l_prev_bucket_index_adj_tbl(l_adj_tbl(j).line_ind):= nvl(l_prev_bucket_index_adj_tbl(l_adj_tbl(j).line_ind),0)
4924                           + l_bucket_index_adj_tbl(l_adj_tbl(j).line_ind);
4925                       ELSE
4926                         l_prev_bucket_index_adj_tbl(l_adj_tbl(j).line_ind):= l_bucket_index_adj_tbl(l_adj_tbl(j).line_ind);
4927                       END IF; -- END IF l_bucket_index_adj_tbl.EXISTS(l_adj_tbl(j).line_ind)
4928 
4929                       IF l_debug = FND_API.G_TRUE THEN
4930                         QP_PREQ_GRP.engine_debug ('line change, debug LINE unit adjs up to prev bucket for line index'||l_adj_tbl(j).line_ind ||': '||l_prev_bucket_index_adj_tbl(l_adj_tbl(j).line_ind) );
4931                       END IF; -- END debug
4932                     END IF; -- END IF l_bucket_index_adj_tbl.EXISTS
4933                     END IF; -- END IF line_change true
4934 
4935                   END IF; -- end if l_prev_bucket <> l_adj_tbl(j).pricing_group_sequence
4936 
4937                 ELSE -- bucket is 0 or null -- begin shu fix bug
4938                   l_sub_total_price := nvl(l_adj_tbl(j).unit_price, 0);
4939                   l_adjusted_price :=nvl (l_adj_unit_price_tbl(l_adj_tbl(j).line_ind),0);
4940                       IF l_debug = FND_API.G_TRUE THEN
4941                            QP_PREQ_GRP.engine_debug('bucket is 0 or null'
4942                            ||' sub_total_price '||l_sub_total_price ||' adjusted_price '||l_adjusted_price  );
4943                       END IF;
4944                   -- end shu fix bug
4945 
4946                 END IF; -- END IF l_adj_tbl(J).pricing_group_sequence <> 0 AND ...
4947                    -- end 2892848
4948 out SL_latest*/
4949 
4950       --This fix is for bug 1915355
4951       --To calculate lumpsum use group_qty/amt for linegrp
4952       --This is only for engine inserted records
4953       --for user passed adjustments, we will use only line_qty
4954       --to break the link from other lines that have this line
4955       --group adjustment
4956       l_calc_quantity := 0;
4957       --bug 4900095
4958       IF (QP_PREQ_GRP.G_service_line_qty_tbl.exists(l_adj_tbl(j).line_ind)
4959       or QP_PREQ_GRP.G_service_ldet_qty_tbl.exists(l_adj_tbl(j).line_detail_index))
4960       and l_adj_tbl(j).operand_calculation_code = G_LUMPSUM_DISCOUNT THEN
4961       --only for service items
4962       --when uom_quantity is passed as null,
4963       -- and contract_start/end_dates are passed
4964       --and for a line/linegroup lumpsum DIS/PBH/SUR/FREIGHT
4965         IF l_adj_tbl(j).modifier_level_code = G_LINE_GROUP  THEN
4966           IF G_Service_pbh_lg_amt_qty.exists(l_adj_tbl(j).line_detail_index)
4967           and QP_PREQ_GRP.G_service_ldet_qty_tbl.exists(l_adj_tbl(j).line_detail_index) THEN
4968             l_calc_quantity := nvl(G_Service_pbh_lg_amt_qty(l_adj_tbl(j).line_detail_index),
4969               QP_PREQ_GRP.G_service_ldet_qty_tbl(l_adj_tbl(j).line_detail_index));
4970           ELSIF G_Service_pbh_lg_amt_qty.exists(l_adj_tbl(j).line_detail_index) THEN
4971             l_calc_quantity := G_Service_pbh_lg_amt_qty(l_adj_tbl(j).line_detail_index);
4972           ELSIF QP_PREQ_GRP.G_service_ldet_qty_tbl.exists(l_adj_tbl(j).line_detail_index) THEN
4973             l_calc_quantity := QP_PREQ_GRP.G_service_ldet_qty_tbl(l_adj_tbl(j).line_detail_index);
4974           ELSIF QP_PREQ_GRP.G_service_line_qty_tbl.exists(l_adj_tbl(j).line_ind) THEN
4975             l_calc_quantity := QP_PREQ_GRP.G_service_line_qty_tbl(l_adj_tbl(j).line_ind);
4976           ELSE
4977             l_calc_quantity :=
4978             nvl(nvl(l_adj_tbl(j).group_quantity
4979                 , l_adj_tbl(j).group_amount) -- this is group_amount_per_unit
4980               , nvl(l_adj_tbl(j).priced_quantity
4981                   , l_adj_tbl(j).line_priced_quantity));
4982           END IF;--G_Service_pbh_lg_amt_qty.exists
4983         ELSIF l_adj_tbl(j).modifier_level_code = G_LINE_LEVEL THEN
4984           IF QP_PREQ_GRP.G_service_line_qty_tbl.exists(l_adj_tbl(j).line_ind) THEN
4985             l_calc_quantity := QP_PREQ_GRP.G_service_line_qty_tbl(l_adj_tbl(j).line_ind);
4986           ELSE
4987             l_calc_quantity := nvl(l_adj_tbl(j).line_priced_quantity
4988                                , l_adj_tbl(j).priced_quantity) ; -- request line qty, shu fix recurring 2702384
4989           END IF;--QP_PREQ_GRP.G_service_line_qty_tbl.exists
4990         END IF;--l_adj_tbl(j).modifier_level_code
4991       ELSE
4992         IF l_adj_tbl(j).modifier_level_code = G_LINE_GROUP
4993         --			and nvl(l_adj_tbl(j).is_ldet_rec,G_YES) = G_YES
4994         THEN
4995           l_calc_quantity :=
4996           nvl(nvl(l_adj_tbl(j).group_quantity
4997                 , l_adj_tbl(j).group_amount) -- this is group_amount_per_unit
4998             , nvl(l_adj_tbl(j).priced_quantity
4999                   , l_adj_tbl(j).line_priced_quantity));
5000         ELSE
5001           l_calc_quantity := nvl(l_adj_tbl(j).line_priced_quantity
5002                                , l_adj_tbl(j).priced_quantity) ; -- request line qty, shu fix recurring 2702384
5003         END IF;
5004       END IF;--QP_PREQ_GRP.G_service_line_qty_tbl.exists(
5005 
5006       l_calc_quantity := nvl(l_calc_quantity, 1);
5007 
5008       -- SHU
5009       -- priced_quantity is 4000, group_amount i.e. 20*100 + 10* 200
5010       -- group_amount is 40, group_amount_per_unit
5011       -- line_priced_quantity is 20, order qty for line 1
5012 
5013       IF l_debug = FND_API.G_TRUE THEN -- SHU
5014         QP_PREQ_GRP.engine_debug(
5015                                  'figuring out qty level '|| l_adj_tbl(j).modifier_level_code
5016                                  ||' priced_quantity '|| l_adj_tbl(j).priced_quantity -- from ldets.line_quantity
5017                                  ||' group_quantity '|| l_adj_tbl(j).group_quantity
5018                                  ||' group_amount '|| l_adj_tbl(j).group_amount
5019                                  ||' line_priced_quantity '|| l_adj_tbl(j).line_priced_quantity -- order_qty
5020                                  ||' calc '|| l_calc_quantity);
5021       END IF;
5022       --end fix for bug 1915355
5023       IF l_adj_tbl(j).created_from_list_line_type = G_PRICE_BREAK_TYPE
5024         AND l_adj_tbl(j).pricing_status_code
5025         IN (G_STATUS_NEW, G_STATUS_UPDATED, G_STATUS_UNCHANGED)
5026         THEN
5027         IF l_debug = FND_API.G_TRUE THEN
5028           QP_PREQ_GRP.engine_debug('Processing Price Break. call Price_Break_Calculation');
5029 
5030         END IF;
5031 
5032         --changes for PBH line group LUMPSUM bug 2388011 commented out
5033         --call to old signature of Price_Break_Calculation
5034         /*
5035 --fix for bug 2515762 to pass line_dtl_index instead of list_line_id
5036                 QP_Calculate_Price_PUB.Price_Break_Calculation(
5037                      l_adj_tbl(j).line_detail_index
5038                      ,l_adj_tbl(j).price_break_type_code
5039                      ,l_adj_tbl(j).line_ind
5040                      ,nvl(l_calc_quantity,1)
5041                      ,l_sub_total_price
5042                      ,l_return_adjustment
5043                      ,l_return_status
5044                      ,l_return_status_text);
5045 */
5046         --changes for PBH line group LUMPSUM bug 2388011 commented out
5047         --call to old signature of Price_Break_Calculation
5048         --changes for PBH line group LUMPSUM bug 2388011 calling new
5049         --overloaded procedure Price_Break_Calculation
5050         --for bug 2908174 for copied orders breaks from
5051         --oe_price_adj must not be re-evaluated for price_flag 'P'
5052         IF l_adj_tbl(j).price_flag = G_PHASE
5053           AND l_adj_tbl(j).is_ldet_rec IN
5054           (G_ADJ_LINE_TYPE, G_ADJ_ORDER_TYPE) THEN
5055           l_return_adjustment := nvl(l_adj_tbl(j).adjustment_amount, 0);
5056         ELSE --l_adj_tbl(j).price_flag
5057           -- [nirmkuma/4222552] since passed line group manual discounts are
5058           -- treated only as line level, using following line level path, which
5059           -- looks at updated line_priced_quantity.
5060           IF (l_adj_tbl(j).modifier_level_code IN (G_LINE_LEVEL, G_ORDER_LEVEL)
5061    or (l_adj_tbl(j).modifier_level_code = G_LINE_GROUP and l_adj_tbl(j).automatic_flag = G_NO)) THEN
5062             IF G_pbhvolattr_attribute.EXISTS(l_adj_tbl(j).created_from_list_line_id) THEN
5063               IF G_pbhvolattr_attribute(l_adj_tbl(j).created_from_list_line_id)
5064                 = G_QUANTITY_ATTRIBUTE THEN
5065                 l_total_value := 0;
5066                 l_req_value_per_unit := l_adj_tbl(j).line_priced_quantity;
5067               ELSE --same for item amount or others(treat as item_amt)
5068                 -- bug 4086952 BREAKS ARE NOT ADJUSTING ON CHANGING THE ORDERED QTY WITH ITM AMOUNT
5069                 IF G_pbhvolattr_attribute(l_adj_tbl(j).created_from_list_line_id) = G_LINE_AMT_ATTRIBUTE THEN
5070                   l_total_value := l_adj_tbl(j).unit_price * l_adj_tbl(j).line_priced_quantity;
5071                   l_req_value_per_unit := l_adj_tbl(j).line_priced_quantity;
5072                   l_qualifier_value := l_adj_tbl(j).unit_price * l_adj_tbl(j).line_priced_quantity;
5073                 ELSE --others volume attribute
5074                   l_total_value := l_adj_tbl(j).priced_quantity; --4000
5075                   l_req_value_per_unit := l_adj_tbl(j).line_priced_quantity; --20
5076                   l_qualifier_value := l_adj_tbl(j).priced_quantity; --2892848  SL_latest move to here as default
5077                 END IF;
5078                 IF l_debug = FND_API.G_TRUE THEN
5079                   QP_PREQ_GRP.engine_debug('l_qualifier_value default: '|| l_adj_tbl(j).priced_quantity);
5080                   QP_PREQ_GRP.engine_debug('l_qualifier_value : '|| l_qualifier_value);
5081                 END IF; -- end debug
5082                 -- begin 2892848
5083                 -- net_amount line level (not group of line) modifier
5084                 IF l_adj_tbl(j).net_amount_flag IN (G_YES, 'P') THEN
5085                   IF l_debug = FND_API.G_TRUE THEN
5086                     QP_PREQ_GRP.engine_debug('net amount line level modifier: '|| l_adj_tbl(J).created_from_list_line_id);
5087                   END IF; -- end debug
5088 
5089                   /* SL_latest 2892848
5090                         IF l_prev_bucket_index_adj_tbl.EXISTS(l_adj_tbl(j).line_ind) THEN
5091 						   -- priced_quantity is line amount, line_priced_quantity is order qty
5092                           l_qualifier_value:= l_adj_tbl(j).priced_quantity + nvl(l_prev_bucket_index_adj_tbl(l_adj_tbl(j).line_ind),0)* l_adj_tbl(j).line_priced_quantity;
5093                           IF l_debug = FND_API.G_TRUE THEN
5094                             QP_PREQ_GRP.engine_debug('line amount: '||l_adj_tbl(j).priced_quantity);
5095                             QP_PREQ_GRP.engine_debug('order qty : '||l_adj_tbl(j).line_priced_quantity);
5096                             QP_PREQ_GRP.engine_debug('unit adjs up to prev buckets: '|| nvl(l_prev_bucket_index_adj_tbl(l_adj_tbl(j).line_ind),0) );
5097                           END IF; -- end debug
5098                         ELSE
5099                           l_qualifier_value:= l_adj_tbl(j).priced_quantity;
5100                         END IF; -- END IF l_prev_bucket_index_adj_tbl.EXISTS(l_adj_tbl(j))
5101 
5102                         IF l_debug = FND_API.G_TRUE THEN
5103                           QP_PREQ_GRP.engine_debug('line level net amount: '||l_qualifier_value);
5104                         END IF; -- end debug
5105                       ELSE -- not net_amount modifier
5106                         l_qualifier_value  := l_adj_tbl(j).priced_quantity; --2892848
5107 
5108                         IF l_debug = FND_API.G_TRUE THEN
5109                           QP_PREQ_GRP.engine_debug('not net amount pbh qualifier value: '||l_qualifier_value);
5110                         END IF; -- end debug
5111 						*/
5112                   IF l_bucket_amt_tbl.EXISTS(l_adj_tbl(j).line_ind)THEN
5113                     l_qualifier_value := l_bucket_amt_tbl(l_adj_tbl(j).line_ind);
5114                     IF l_debug = FND_API.G_TRUE THEN
5115                       QP_PREQ_GRP.engine_debug('line level net amount: '|| l_qualifier_value);
5116                     END IF; -- end debug
5117                   END IF; -- END IF l_bucket_amt_tbl.EXISTs
5118                 END IF; -- END IF net_amount modifier
5119                 -- end 2892848
5120 
5121               END IF; --G_pbhvolattr_attribute
5122 
5123               IF l_debug = FND_API.G_TRUE THEN
5124                 QP_PREQ_GRP.engine_debug('PBH calc dtls attribute '
5125                                          || G_pbhvolattr_attribute(l_adj_tbl(j).created_from_list_line_id)
5126                                          ||' l_total_value '|| l_total_value ||' l_req_value_per_unit '
5127                                          || l_req_value_per_unit);
5128               END IF; --l_debug
5129             ELSE --no attribute
5130               --this is a setup bug where no attribute for PBH
5131               l_total_value := NULL;
5132               l_req_value_per_unit := NULL;
5133             END IF; --G_pbhvolattr_attribute.exists
5134 
5135           ELSE --linegroup level
5136             IF G_pbhvolattr_attribute.EXISTS(l_adj_tbl(j).created_from_list_line_id) THEN
5137               IF G_pbhvolattr_attribute(l_adj_tbl(j).created_from_list_line_id)
5138                 = G_QUANTITY_ATTRIBUTE THEN
5139                 l_total_value := 0;
5140                 l_req_value_per_unit := l_adj_tbl(j).group_quantity;
5141               ELSE --same for item amount or others(treat as item_amt)
5142                 l_total_value := l_adj_tbl(j).priced_quantity; --4000
5143                 IF l_adj_tbl(j).is_ldet_rec IN (G_LDET_ORDER_TYPE,
5144                                                 G_LDET_LINE_TYPE) THEN
5145                   l_req_value_per_unit := l_adj_tbl(j).group_amount; --40
5146                 ELSE
5147                   --for linegrp itemamt lumpsum, the adj_amt =
5148                   --operand/group_amount. When calculation is done after
5149                   --search, engine calculates group_amount as ldet.line_qty/
5150                   --unit_price. But when calling application passes or we
5151                   --fetch adj from OM, group_amt is range_break_qty which
5152                   --is the line_qty returned by the pricing engine and the
5153                   --the group_amt passed back by engine is not stored by OM
5154                   --so we need to do this for adj not searched by engine
5155                   -- [julin/4571612/4671446] explicitly set FND_API.G_NULL_NUM means infinity
5156                   IF (l_adj_tbl(j).unit_price = 0) THEN
5157                     l_req_value_per_unit := FND_API.G_NULL_NUM;
5158                   ELSE
5159                     l_req_value_per_unit := l_adj_tbl(j).group_amount / l_adj_tbl(j).unit_price;
5160                   END IF;
5161                 END IF;
5162 
5163                 -- begin 2892848
5164                 -- IF net amount linegroup modifier
5165                 IF l_adj_tbl(j).net_amount_flag IN (G_YES, 'P') THEN
5166 
5167                   IF l_debug = FND_API.G_TRUE THEN
5168                     QP_PREQ_GRP.engine_debug('net amount linegroup modifier list_line_id: '|| l_adj_tbl(J).created_from_list_line_id);
5169                   END IF; -- end debug
5170 
5171                   -- begin SL_latest 2892848
5172                   l_lg_net_amt := 0; --SL_latest
5173                   l_line_bucket_amt := 0; -- note 0+null is null, so we need to default this to 0
5174                   -- [julin/4112395/4220399]
5175                   l_lg_prod_net_amt := 0;
5176                   l_prod_line_bucket_amt := 0;
5177 
5178                   -- fix of latest requirement, only add up net amounts within the group
5179                   -- l_mod_lg_net_amt_tbl is hastable of modifier and its lg_net_amt for that bucket
5180                   -- so we do not need to re-calculate l_lg_net_amt if the same modifier is related to other line index within the same bucket
5181                   -- lg_net_amt is the sum of (USP at end of prev bucket *Qty) for the lines related to this modifier
5182                   -- l_net_mod_index_cur has line_indexes from ldets tmp related to this net amount modifier
5183 
5184                   -- SL_further_fix
5185                   -- if there are no prev buckets for this modifier,we use group amount as l_lg_net_amt
5186                   -- since we do not have the adjs of other lines yet, so l_bucket_amt_tbl does not have complete data
5187 
5188                   -- [julin/3265308] net amount calculation 'P', match product only.
5189                   -- For category net amount, 1st_bucket means that this is the
5190                   -- first bucket of the line, so no adjustments have been ap-
5191                   -- plied.  However, other lines of the same category might
5192                   -- have had modifiers in previous buckets applied, so we look
5193                   -- at the bucket_amt_tbl to see if those have been calculated
5194                   -- else we can assume no modifiers applied yet, and can hence
5195                   -- calculate the list price * qty for those lines.
5196                   IF nvl(l_adj_tbl(j).net_amount_flag, 'N') = 'P' THEN
5197                     IF l_mod_lg_prod_net_amt_tbl.EXISTS(l_adj_tbl(j).created_from_list_line_id) THEN
5198                       l_lg_prod_net_amt := l_mod_lg_prod_net_amt_tbl(l_adj_tbl(j).created_from_list_line_id);
5199                       IF l_debug = FND_API.G_TRUE THEN
5200                         QP_PREQ_GRP.engine_debug('recycle l_lg_prod_net_amt from l_mod_lg_net_amt_tbl: '|| l_lg_prod_net_amt);
5201                       END IF; --end debug
5202                     ELSE -- need to calculate l_lg_net_amt
5203                       IF l_debug = FND_API.G_TRUE THEN
5204                         QP_PREQ_GRP.engine_debug('1st bucket = '|| l_1st_bucket ||', net amount flag = P');
5205                       END IF;
5206                       -- calculate amount using product attribute net amount grouping
5207                       FOR t IN l_prod_attr_info(l_adj_tbl(j).created_from_list_line_id) LOOP
5208                         IF l_prev_bucket_amt_tbl.EXISTS(t.line_index) THEN
5209                           l_prod_line_bucket_amt := nvl(l_prev_bucket_amt_tbl(t.line_index), 0);
5210                           IF l_debug = FND_API.G_TRUE THEN
5211                             QP_PREQ_GRP.engine_debug(t.line_index || ':' || l_prev_bucket_amt_tbl(t.line_index));
5212                           END IF; --end debug
5213                         ELSE
5214                           -- have to compute list price * qty for the line (query from qp_npreq_lines_tmp)
5215                           l_prod_line_bucket_amt := nvl(t.priced_quantity, 0) * nvl(t.unit_price, 0);
5216                           IF l_debug = FND_API.G_TRUE THEN
5217                             QP_PREQ_GRP.engine_debug('* line index '|| t.line_index ||' not in l_prev_bucket_amt_tbl');
5218                             QP_PREQ_GRP.engine_debug('  got value '|| l_prod_line_bucket_amt ||' from lines_tmp instead');
5219                           END IF;
5220                         END IF;
5221                         l_lg_prod_net_amt := l_lg_prod_net_amt + l_prod_line_bucket_amt;
5222 
5223                         IF l_debug = FND_API.G_TRUE THEN
5224                           QP_PREQ_GRP.engine_debug('(catnetamt) l_prod_line_bucket_amt: ' || l_prod_line_bucket_amt);
5225                           QP_PREQ_GRP.engine_debug('(catnetamt) up-tp-date l_lg_prod_net_amt: ' || l_lg_prod_net_amt); -- grp amt
5226                         END IF;
5227                       END LOOP;
5228 
5229                       l_mod_lg_prod_net_amt_tbl(l_adj_tbl(j).created_from_list_line_id) := l_lg_prod_net_amt; -- preserve this for recycle
5230                     END IF;
5231                   END IF; -- end l_adj_tbl(j).net_amount_flag = 'P'   -- [julin/3265308]
5232 
5233                   IF (l_1st_bucket = 'Y') THEN
5234 
5235                     IF l_debug = FND_API.G_TRUE THEN
5236                       QP_PREQ_GRP.engine_debug(' l_1st_bucket is Y, use group amount as l_lg_net_amt'); -- grp amt
5237                     END IF; -- end debug
5238                     l_lg_net_amt := l_adj_tbl(j).priced_quantity;
5239 
5240                   ELSE -- l_1st_bucket='N'
5241 
5242                     IF l_debug = FND_API.G_TRUE THEN
5243                       QP_PREQ_GRP.engine_debug(' - not first bucket');
5244                     END IF; --Added For Bug No - 4033618
5245                     IF l_mod_lg_net_amt_tbl.EXISTS(l_adj_tbl(j).created_from_list_line_id) THEN
5246                       l_lg_net_amt := l_mod_lg_net_amt_tbl(l_adj_tbl(j).created_from_list_line_id); -- 5346093
5247                       IF l_debug = FND_API.G_TRUE THEN
5248                         QP_PREQ_GRP.engine_debug('recycle lg_net_amt from l_mod_lg_net_amt_tbl: '|| l_lg_net_amt);
5249                       END IF; --end debug
5250                     ELSE -- need to calculate l_lg_net_amt
5251                       IF l_debug = FND_API.G_TRUE THEN
5252                         QP_PREQ_GRP.engine_debug('lg_net_amt for list line '|| l_adj_tbl(j).created_from_list_line_id ||' not cached');
5253                       END IF;
5254                       -- regular net amount processing
5255                       l_adj_exists_in_tmp_tbl := 'N'; -- reset bug 3618464
5256                       FOR t IN l_net_mod_index_cur(l_adj_tbl(j).created_from_list_line_id) LOOP
5257                         l_adj_exists_in_tmp_tbl := 'Y'; -- bug 3618464
5258                         IF l_bucket_amt_tbl.EXISTS(t.line_index) THEN
5259                           l_line_bucket_amt := nvl(l_bucket_amt_tbl(t.line_index), 0);
5260                           IF l_debug = FND_API.G_TRUE THEN
5261                             QP_PREQ_GRP.engine_debug(t.line_index || ':' || l_bucket_amt_tbl(t.line_index));
5262                           END IF; --end debug
5263                         ELSE
5264                           l_line_bucket_amt := 0;
5265                         END IF;
5266                         l_lg_net_amt := l_lg_net_amt + l_line_bucket_amt;
5267 
5268                         IF l_debug = FND_API.G_TRUE THEN
5269                           QP_PREQ_GRP.engine_debug('l_line_bucket_amt: ' || l_line_bucket_amt);
5270                           QP_PREQ_GRP.engine_debug('up-tp-date l_lg_net_amt: ' || l_lg_net_amt); -- grp amt
5271                         END IF; --end debug
5272                       END LOOP; -- end l_net_mod_index_cur
5273 
5274                       -- Bug 3618464 - GROUP OF LINES, NET AMOUNT, OVERRIDE MODIFIER
5275                       -- get the line indexes from G_LINE_INDEXES_FOR_LINE_ID for the given list_line_id
5276                       IF l_adj_exists_in_tmp_tbl = 'N' THEN
5277                         IF G_LINE_INDEXES_FOR_LINE_ID.EXISTS(l_adj_tbl(j).created_from_list_line_id) THEN
5278                           l_line_index_str := G_LINE_INDEXES_FOR_LINE_ID(l_adj_tbl(j).created_from_list_line_id);
5279                         END IF;
5280                         IF l_debug = FND_API.G_TRUE THEN
5281                           QP_PREQ_GRP.engine_debug('l_line_index_str = ' || l_line_index_str);
5282                         END IF;
5283                         IF l_line_index_str IS NOT NULL THEN
5284                           LOOP
5285                             l_instr_pos := instr(l_line_index_str, ',');
5286                             EXIT WHEN (nvl(l_instr_pos, 0) = 0);
5287 
5288                             l_index := ltrim(rtrim(substr(l_line_index_str, 1, l_instr_pos - 1)));
5289                             l_line_index_str := substr(l_line_index_str, l_instr_pos + 1);
5290 
5291                             IF l_bucket_amt_tbl.EXISTS(l_index) THEN
5292                               l_line_bucket_amt := nvl(l_bucket_amt_tbl(l_index), 0);
5293                               IF l_debug = FND_API.G_TRUE THEN
5294                                 QP_PREQ_GRP.engine_debug('Net Amount Override PBH LINEGROUP ' || l_index || ':' || l_bucket_amt_tbl(l_index));
5295                               END IF; --end debug
5296                             ELSE
5297                               l_line_bucket_amt := 0;
5298                             END IF;
5299                             l_lg_net_amt := l_lg_net_amt + l_line_bucket_amt;
5300 
5301                             IF l_debug = FND_API.G_TRUE THEN
5302                               QP_PREQ_GRP.engine_debug('l_bucket_amt_tbl(' || l_index ||'): '|| l_line_bucket_amt);
5303                             END IF; --end debug
5304                           END LOOP;
5305                         END IF; --if l_line_index_str is not null
5306                       END IF; --if l_adj_exists_in_tmp_tbl = 'N'
5307 
5308                       l_mod_lg_net_amt_tbl(l_adj_tbl(j).created_from_list_line_id) := l_lg_net_amt; -- preserve this for recycle
5309 
5310                     END IF; --l_mod_lg_net_amt_tbl.EXIST
5311 
5312                   END IF; -- END IF l_prev_bucket = -9999
5313 
5314                   IF l_debug = FND_API.G_TRUE THEN
5315                     QP_PREQ_GRP.engine_debug('final l_lg_net_amt: '|| l_lg_net_amt);
5316                   END IF; --end debug
5317                   -- end SL_latest
5318 
5319                   -- [julin/4112395/4220399]
5320                   IF (nvl(l_adj_tbl(j).net_amount_flag, 'N') = 'P') THEN
5321                     l_qualifier_value := l_lg_prod_net_amt;
5322                     -- [julin/4571612/4671446] explicitly set FND_API.G_NULL_NUM means infinity
5323                     IF (l_sub_total_price = 0) THEN
5324                       l_req_value_per_unit := FND_API.G_NULL_NUM;
5325                       l_applied_req_value_per_unit := FND_API.G_NULL_NUM;
5326                     ELSE
5327                       l_req_value_per_unit := l_lg_prod_net_amt / l_sub_total_price; --bug 3404493
5328                       l_applied_req_value_per_unit := l_lg_net_amt / l_sub_total_price;
5329                     END IF;
5330                   ELSE
5331                     l_qualifier_value := l_lg_net_amt;
5332                     -- [julin/4571612/4671446] explicitly set FND_API.G_NULL_NUM means infinity
5333                     IF (l_sub_total_price = 0) THEN
5334                       l_req_value_per_unit := FND_API.G_NULL_NUM;
5335                     ELSE
5336                       l_req_value_per_unit := l_lg_net_amt / l_sub_total_price; --bug 3404493
5337                     END IF;
5338                   END IF;
5339 
5340                   IF l_debug = FND_API.G_TRUE THEN
5341                     QP_PREQ_GRP.engine_debug('group amount: ' || l_adj_tbl(j).priced_quantity); -- grp amt
5342                     QP_PREQ_GRP.engine_debug('group of lines net amt: '|| l_qualifier_value);
5343                   END IF; --end debug
5344 
5345                 ELSE -- not net amount modifier
5346                   l_qualifier_value := l_adj_tbl(j).priced_quantity; -- not net amount grouop of line modifier
5347                 END IF; -- END IF net_amount_flag = 'Y' for line group modifiers
5348                 -- end 2892848
5349 
5350               END IF; --G_pbhvolattr_attribute
5351 
5352               IF l_debug = FND_API.G_TRUE THEN
5353                 QP_PREQ_GRP.engine_debug('PBH calc dtls attribute '
5354                                          || G_pbhvolattr_attribute(l_adj_tbl(j).created_from_list_line_id)
5355                                          ||' l_total_value '|| l_total_value --4000
5356                                          ||' l_req_value_per_unit '|| l_req_value_per_unit); --40
5357               END IF; --l_debug
5358             ELSE --no attribute
5359               --this is a setup bug where no attribute for PBH
5360               l_total_value := NULL;
5361               l_req_value_per_unit := NULL;
5362             END IF; --G_pbhvolattr_attribute.exists
5363           END IF; --modifier level code
5364 
5365           /* out 2892848
5366                 -- obtain net_adj_amount_flag from qp_list_lines table if null,
5367                 -- since it may not be passed from calling application
5368                 -- net_amount_new 2720717
5369                 IF l_adj_tbl(j).net_amount_flag IS NULL THEN
5370                   OPEN l_net_amount_flag_cur(l_adj_tbl(j).created_from_list_line_id);
5371                   FETCH l_net_amount_flag_cur into l_adj_tbl(j).net_amount_flag;
5372                   CLOSE l_net_amount_flag_cur;
5373                 END IF;
5374                    	 */ -- out 2892848
5375 
5376           -- [julin/3265308] Price_Break_Calculation should have same
5377           -- behavior for both net_amount_flag = G_YES and 'P'.
5378           IF (l_adj_tbl(j).net_amount_flag IN (G_YES, 'P')) THEN
5379             l_bucketed_flag := G_YES;
5380           ELSE
5381             l_bucketed_flag := G_NO;
5382           END IF;
5383 
5384           --4900095 used in price_break_calculation
5385           G_PBH_MOD_LEVEL_CODE(l_adj_tbl(j).line_detail_index) :=
5386                     l_adj_tbl(j).modifier_level_code;
5387 
5388           QP_Calculate_Price_PUB.Price_Break_Calculation(
5389                                                          l_adj_tbl(j).line_detail_index,  -- line_detail_index
5390                                                          l_adj_tbl(j).price_break_type_code,
5391                                                          l_adj_tbl(j).line_ind,
5392                                                          l_req_value_per_unit,  -- Group Value per unit,group quantity,item qty 40
5393                                                          l_applied_req_value_per_unit,  -- [julin/4112395/4220399]
5394                                                          l_total_value,  -- Total value (Group amount or item amount) 4000
5395                                                          l_sub_total_price,
5396                                                          l_adj_tbl(j).line_priced_quantity,  -- 2388011, SHU FIX diff PRIYA, 20
5397                                                          --l_pbh_prev_net_adj_amount, -- net_amount, 2720717 -- 2892848
5398                                                          l_qualifier_value,  -- p_bucketed_adj, 2892848
5399                                                          l_bucketed_flag,  -- net_amount_new, 2720717, [julin/3265308]
5400                                                          l_adj_tbl(j).automatic_flag, -- 5413797
5401                                                          l_return_adjustment,
5402                                                          l_return_status,
5403                                                          l_return_status_text);
5404 
5405           --end changes for bug 2388011
5406 
5407           l_return_adjustment :=  - 1 * nvl(l_return_adjustment, 0);
5408 
5409           -- 2892848
5410           IF l_debug = FND_API.G_TRUE THEN
5411             QP_PREQ_GRP.engine_debug('PBH return adjustment '|| l_return_adjustment); --40
5412           END IF; --l_debug
5413           -- end 2892848
5414 
5415         END IF; --l_adj_tbl(j).price_flag
5416 
5417 
5418       ELSE --created_from_list_line_type not PBH, 2892848 change comment only
5419         IF l_debug = FND_API.G_TRUE THEN
5420           QP_PREQ_GRP.engine_debug('Processing DIS/SUR/FRT: '|| l_adj_tbl(j).created_from_list_line_id); -- 2892848, change debug msg
5421         END IF; -- end debug
5422 
5423         IF l_adj_tbl(j).created_from_list_line_type = G_DISCOUNT
5424           AND l_adj_tbl(j).operand_calculation_code <> G_NEWPRICE_DISCOUNT
5425           --included this newprice check for negative newprice bug 2065609
5426           THEN
5427           l_sign :=  - 1;
5428         ELSE
5429           l_sign := 1;
5430         END IF; --l_adj_tbl(j).created_from_list_line_type=g_discount
5431 
5432         IF l_debug = FND_API.G_TRUE THEN
5433           QP_PREQ_GRP.engine_debug('this check '
5434                                    || l_adj_tbl(j).line_type_code ||' '
5435                                    || l_calc_quantity ||' '|| l_adj_tbl(j).operand_calculation_code);
5436 
5437         END IF;
5438         IF l_adj_tbl(j).modifier_level_code = G_ORDER_LEVEL
5439           AND l_calc_quantity = 0
5440           AND l_adj_tbl(j).operand_calculation_code = G_LUMPSUM_DISCOUNT
5441           THEN
5442           l_calc_quantity := 1;
5443           IF l_debug = FND_API.G_TRUE THEN
5444             QP_PREQ_GRP.engine_debug('Order lvl qty '||
5445                                      l_calc_quantity);
5446           END IF;
5447         END IF;
5448 
5449         IF l_debug = FND_API.G_TRUE THEN
5450           QP_PREQ_GRP.engine_debug('this sign '|| l_sign);
5451         END IF;
5452 
5453         IF l_adj_tbl(j).PRICING_STATUS_CODE IN
5454           (G_STATUS_NEW, G_STATUS_UPDATED, G_STATUS_UNCHANGED)
5455           THEN
5456           /*
5457 		   IF l_adj_tbl(j).updated_flag = G_YES
5458 		   and nvl(l_adj_tbl(j).automatic_flag,G_NO) = G_NO
5459 		   and (l_adj_tbl(j).adjustment_amount IS NOT NULL
5460 			and l_adj_tbl(j).adjustment_amount <> g_miss_num) --FND_API.G_MISS_NUM)
5461 		   THEN
5462 			--to avoid rounding issues in rev calculations
5463 			--for user-overridden adjustments
5464    IF l_debug = FND_API.G_TRUE THEN
5465 			qp_preq_grp.engine_debug(' adj amt manual adj '||
5466 				l_adj_tbl(j).adjustment_amount);
5467    END IF;
5468 			l_return_adjustment := l_adj_tbl(j).adjustment_amount;
5469 		   ELSE
5470 		*/--commented to avoid overriding errors
5471           IF l_debug = FND_API.G_TRUE THEN
5472             qp_preq_grp.engine_debug(' adj amt manual adj '||
5473                                      l_adj_tbl(j).adjustment_amount);
5474 
5475           END IF;
5476           --bug 2691794
5477           IF
5478             --  l_adj_tbl(j).created_from_list_line_type <> G_FREIGHT_CHARGE and ** Commented for bug#3596827 **
5479             l_adj_tbl(j).price_flag = G_PHASE
5480             AND l_adj_tbl(j).line_category = 'RETURN'
5481             AND l_adj_tbl(j).operand_calculation_code = G_LUMPSUM_DISCOUNT
5482             and l_adj_tbl(j).is_ldet_rec not in
5483                 (G_LDET_ORDER_TYPE, G_LDET_LINE_TYPE) -- 4534961/4492066
5484           THEN
5485             l_return_adjustment := l_adj_tbl(j).adjustment_amount;
5486             l_adj_tbl(j).operand_value :=
5487             l_adj_tbl(j).line_priced_quantity *
5488             l_adj_tbl(j).adjustment_amount *
5489             l_sign;
5490             IF l_debug = FND_API.G_TRUE THEN
5491               QP_PREQ_GRP.engine_debug('return line frtchg operand '
5492                                        || l_adj_tbl(j).operand_value ||' adj amt '
5493                                        || l_return_adjustment);
5494             END IF; --l_debug
5495           ELSE --l_adj_tbl(j).created_from_list_line_type = frt
5496             IF l_adj_tbl(j).operand_calculation_code =
5497               G_LUMPSUM_DISCOUNT
5498               AND l_adj_tbl(j).modifier_level_code = G_LINE_GROUP
5499               AND l_adj_tbl(j).is_ldet_rec NOT IN
5500               (G_LDET_ORDER_TYPE, G_LDET_LINE_TYPE) THEN
5501               BEGIN
5502                 SELECT pricing_attribute INTO l_pricing_attribute
5503                 FROM qp_pricing_attributes
5504                 WHERE list_line_id =
5505                     l_adj_tbl(j).created_from_list_line_id
5506                 AND pricing_attribute_context =
5507                             G_PRIC_VOLUME_CONTEXT;
5508               EXCEPTION
5509                 WHEN OTHERS THEN
5510                   l_pricing_attribute := NULL;
5511               END;
5512 
5513               IF l_pricing_attribute IS NOT NULL
5514                 AND l_pricing_attribute = G_PRIC_ATTRIBUTE12
5515                 AND l_adj_tbl(j).modifier_level_code = G_LINE_GROUP
5516                 AND l_adj_tbl(j).is_ldet_rec NOT IN
5517                 (G_LDET_ORDER_TYPE, G_LDET_LINE_TYPE) THEN
5518                 --for linegrp itemamt lumpsum, the adj_amt =
5519                 --operand/group_amount. When calculation is done after
5520                 --search, engine calculates group_amount as ldet.line_qty/
5521                 --unit_price. But when calling application passes or we
5522                 --fetch adj from OM, group_amt is range_break_qty which
5523                 --is the line_qty returned by the pricing engine and the
5524                 --the group_amt passed back by engine is not stored by OM
5525                 --so we need to do this for adj not searched by engine
5526                 -- [julin/4571612/4671446] explicitly set FND_API.G_NULL_NUM means infinity
5527                 IF (l_adj_tbl(j).unit_price = 0) THEN
5528                   l_calc_quantity := FND_API.G_NULL_NUM;
5529                 ELSE
5530                   l_calc_quantity := l_calc_quantity / l_adj_tbl(j).unit_price;
5531                 END IF;
5532               END IF; --l_pricing_attribute
5533               IF l_debug = FND_API.G_TRUE THEN
5534                 QP_PREQ_GRP.engine_debug('l_calc_qty for lumpsum '
5535                                          || l_calc_quantity);
5536               END IF; --l_debug
5537             END IF; --l_adj_tbl(j).operand_calculation_code
5538 
5539             Calculate_bucket_price(
5540                                    l_adj_tbl(j).created_from_list_line_type
5541                                    , l_sub_total_price
5542                                    , nvl(l_calc_quantity, 1)
5543                                    , l_adj_tbl(j).operand_calculation_code
5544                                    , nvl(l_adj_tbl(j).operand_value, 0) * l_sign
5545                                    , l_return_adjustment
5546                                    , l_return_status
5547                                    , l_return_status_text);
5548           END IF; --l_adj_tbl(j).created_from_list_line_type = frt
5549 
5550           IF l_return_status = FND_API.G_RET_STS_ERROR
5551             THEN
5552             x_return_status := l_return_status;
5553             x_return_status_text := l_return_status_text;
5554           END IF;
5555           --  END IF;--manual adj updated and applied
5556         END IF;
5557       END IF;
5558 
5559       --This code is to avoid the order level adjustments being
5560       --returned with each line and to return only one order level
5561       --adjustment with the summary line
5562 
5563       IF (l_debug = FND_API.G_TRUE) THEN
5564         QP_PREQ_GRP.engine_debug('Is Ldet Rec : ' || l_adj_tbl(j).is_ldet_rec);
5565       END IF;
5566 
5567       IF ((l_adj_tbl(j).is_ldet_rec IN
5568            (G_LDET_LINE_TYPE, G_ADJ_LINE_TYPE, G_ASO_LINE_TYPE)
5569            AND l_adj_tbl(j).line_type_code = G_LINE_LEVEL)
5570           OR (l_adj_tbl(j).is_ldet_rec IN
5571               (G_LDET_ORDER_TYPE, G_ADJ_ORDER_TYPE, G_ASO_ORDER_TYPE)
5572               AND l_adj_tbl(j).line_type_code = G_ORDER_LEVEL))
5573         THEN
5574         i := i + 1;
5575         l_ldet_line_dtl_index_tbl(i) := l_adj_tbl(j).line_detail_index;
5576         --need to store this for bug 2833753
5577         G_ldet_plsql_index_tbl(l_ldet_line_dtl_index_tbl(i)) := i;
5578         IF (l_debug = FND_API.G_TRUE) THEN
5579           QP_PREQ_GRP.engine_debug('Adding line details : '
5580                                    || l_ldet_line_dtl_index_tbl(i) ||' plsqlind '
5581                                    || G_ldet_plsql_index_tbl(l_ldet_line_dtl_index_tbl(i)));
5582         END IF;
5583         l_ldet_line_index_tbl(i) := l_adj_tbl(j).curr_line_index;
5584         l_ldet_list_hdr_id_tbl(i) :=
5585         l_adj_tbl(j).created_from_list_header_id;
5586         l_ldet_list_line_id_tbl(i) :=
5587         l_adj_tbl(j).created_from_list_line_id;
5588         IF l_debug = FND_API.G_TRUE THEN
5589           QP_PREQ_GRP.engine_debug('adjusted amt 1 ');
5590         END IF;
5591         l_ldet_list_line_type_tbl(i) :=
5592         l_adj_tbl(j).created_from_list_line_type;
5593         IF l_debug = FND_API.G_TRUE THEN
5594           QP_PREQ_GRP.engine_debug('adjusted amt 2 ');
5595         END IF;
5596         l_ldet_adj_amt_tbl(i) := nvl(l_return_adjustment, 0);
5597         IF l_debug = FND_API.G_TRUE THEN
5598           QP_PREQ_GRP.engine_debug('adjusted amt 3 ');
5599         END IF;
5600 
5601         -- begin 2892848
5602         IF l_debug = FND_API.G_TRUE THEN
5603           QP_PREQ_GRP.engine_debug(' unrounded adj_amt l_ldet_adj_amt_tbl('|| i ||'): '|| l_ldet_adj_amt_tbl(i)); -- 2892848
5604         END IF; --END IF l_debug
5605         /* SL_latest 2892848
5606 		  -- CONTINUE building l_bucket_adj_amt_tbl and l_bucket_index_adj_tbl regardless of bucket
5607 		  -- only for bucket modifiers, 0 is price list line, null is reg modifier
5608 		IF l_adj_tbl(j).pricing_group_sequence IS NOT NULL AND l_adj_tbl(j).pricing_group_sequence <> 0 THEN
5609 		  IF l_bucket_adj_amt_tbl.EXISTS(l_adj_tbl(j).pricing_group_sequence) THEN -- avoid no data found or table index not exists for 1st rec
5610 		    IF l_debug = FND_API.G_TRUE THEN
5611 		      QP_PREQ_GRP.engine_debug ('    accumulated adj amts by bucket BEFORE: ' || l_bucket_adj_amt_tbl(l_adj_tbl(j).pricing_group_sequence));
5612 		    END IF; -- end debug
5613 		    l_bucket_adj_amt_tbl(l_adj_tbl(j).pricing_group_sequence):= nvl(l_bucket_adj_amt_tbl(l_adj_tbl(j).pricing_group_sequence),0) +
5614 		      nvl(l_ldet_adj_amt_tbl(i),0)* l_adj_tbl(j).line_priced_quantity;
5615 
5616 		  ELSE -- avoid no data found err
5617 		    l_bucket_adj_amt_tbl(l_adj_tbl(j).pricing_group_sequence):= nvl(l_ldet_adj_amt_tbl(i),0) * l_adj_tbl(j).line_priced_quantity;
5618 		  END IF; -- END IF l_bucket_adj_amt_tbl.EXISTS
5619 		  IF l_debug = FND_API.G_TRUE THEN
5620                     QP_PREQ_GRP.engine_debug ('    (LINEGROUP) building l_bucket_adj_amt_tbl by bucket: '||l_adj_tbl(j).pricing_group_sequence);
5621                     QP_PREQ_GRP.engine_debug ('    nvl of current unit adj: '||nvl(l_ldet_adj_amt_tbl(i), 0));
5622                     QP_PREQ_GRP.engine_debug ('    order qty: '||l_adj_tbl(j).line_priced_quantity);
5623                     QP_PREQ_GRP.engine_debug ('    accumulated adj amts for this bucket: ' || l_bucket_adj_amt_tbl(l_adj_tbl(j).pricing_group_sequence));
5624                   END IF; -- END debug
5625 
5626                   -- for LINE LEVEL
5627                   IF l_bucket_index_adj_tbl.EXISTS(l_adj_tbl(j).line_ind) THEN
5628                     IF l_debug = FND_API.G_TRUE THEN
5629 		      QP_PREQ_GRP.engine_debug ('    accumulated unit adj by line BEFORE: ' || nvl(l_bucket_index_adj_tbl(l_adj_tbl(j).line_ind), 0));
5630 		    END IF; -- end debug
5631                     l_bucket_index_adj_tbl(l_adj_tbl(j).line_ind) := nvl(l_bucket_index_adj_tbl(l_adj_tbl(j).line_ind), 0) + nvl(l_ldet_adj_amt_tbl(i), 0);
5632 		  ELSE -- avoid no datat found err
5633 		    l_bucket_index_adj_tbl(l_adj_tbl(j).line_ind) := nvl(l_ldet_adj_amt_tbl(i), 0);
5634 		  END IF; -- END IF l_bucket_index_adj_tbl.EXISTS
5635 		  IF l_debug = FND_API.G_TRUE THEN
5636 		      QP_PREQ_GRP.engine_debug ('    (LINE) building l_bucket_index_adj_tbl for line_index: '||l_adj_tbl(j).line_ind);
5637 		      QP_PREQ_GRP.engine_debug ('    accumulated unit adjs by line index: '||l_bucket_index_adj_tbl(l_adj_tbl(j).line_ind));
5638 		  END IF; -- END debug
5639 		END IF; -- END IF bucket is not null and 0
5640 
5641 		-- end 2892848
5642   */
5643         /* out 2892848
5644                 --begin net_amount, 2720717
5645                 l_pbh_net_adj_amount := l_pbh_net_adj_amount + l_ldet_adj_amt_tbl(i);
5646                 IF l_debug = FND_API.G_TRUE THEN
5647                   QP_PREQ_GRP.engine_debug('------ ');
5648                   QP_PREQ_GRP.engine_debug('i: '||i);
5649                   QP_PREQ_GRP.engine_debug('l_ldet_adj_amt_tbl(i): '||l_ldet_adj_amt_tbl(i));
5650                   QP_PREQ_GRP.engine_debug('l_pbh_net_adj_amount: '||l_pbh_net_adj_amount);
5651                 END IF; --END IF l_debug
5652                 --end net_amount, 2720717
5653                 */
5654 
5655         IF l_adj_tbl(j).calculation_code = G_BACK_CALCULATE THEN
5656           l_back_calc_dtl_index(l_adj_tbl(j).line_ind)
5657           := l_adj_tbl(j).line_detail_index;
5658           l_back_calc_adj_amt(l_adj_tbl(j).line_ind)
5659           := nvl(l_return_adjustment, 0);
5660           l_back_calc_plsql_tbl_index(l_adj_tbl(j).line_ind)
5661           := i;
5662           IF l_debug = FND_API.G_TRUE THEN
5663             QP_PREQ_GRP.engine_debug('Back calc line index '
5664                                      || l_back_calc_dtl_index(l_adj_tbl(j).line_ind)
5665                                      ||' adjamt '|| l_back_calc_adj_amt(l_adj_tbl(j).line_ind)
5666                                      ||' plsql ind '
5667                                      || l_back_calc_plsql_tbl_index(l_adj_tbl(j).line_ind));
5668           END IF; --l_debug
5669         END IF; --l_adj_tbl(j).calculation_code
5670 
5671         --this procedure is called to calculate the
5672         --selling_price,adjustment_amount and operand in ordered_qty
5673         --which is the line_quantity on lines_tmp
5674         -- Ravi bug# 2745337-divisor by zero
5675         IF (l_adj_tbl(j).ordered_qty <> 0 OR l_adj_tbl(j).modifier_level_code = 'ORDER') THEN
5676           IF (l_debug = FND_API.G_TRUE) THEN
5677             QP_PREQ_GRP.engine_debug('Before Going into GET_ORDERQTY_VALUES #1');
5678           END IF;
5679           GET_ORDERQTY_VALUES(p_ordered_qty => l_adj_tbl(j).ordered_qty,
5680                               p_priced_qty => l_adj_tbl(j).line_priced_quantity,
5681                               p_catchweight_qty => l_adj_tbl(j).catchweight_qty,
5682                               p_actual_order_qty => l_adj_tbl(j).actual_order_qty,
5683                               p_operand => l_adj_tbl(j).operand_value,
5684                               p_adjustment_amt => l_ldet_adj_amt_tbl(i),
5685                               p_unit_price => l_adj_tbl(j).unit_price,
5686                               p_adjusted_unit_price => l_sub_total_price,
5687                               p_operand_calculation_code => l_adj_tbl(j).operand_calculation_code,
5688                               p_input_type => 'OPERAND',
5689                               x_ordqty_output1 => l_ldet_ordqty_operand_tbl(i),
5690                               x_ordqty_output2 => l_ldet_ordqty_adjamt_tbl(i),
5691                               x_return_status => x_return_status,
5692                               x_return_status_text => x_return_status_text);
5693         ELSE
5694           IF l_debug = FND_API.G_TRUE THEN
5695             QP_PREQ_GRP.engine_debug('Ordered Qty #1: ' || l_adj_tbl(j).ordered_qty);
5696             QP_PREQ_GRP.engine_debug('OPERAND Ordered Qty is 0 or modifier level code is not ORDER');
5697           END IF;
5698           l_ldet_ordqty_operand_tbl(i) := 0;
5699           l_ldet_ordqty_adjamt_tbl(i) := 0;
5700         END IF;
5701 
5702         IF l_debug = FND_API.G_TRUE THEN
5703           QP_PREQ_GRP.engine_debug('Printing ordqty_operand '
5704                                    || l_ldet_ordqty_operand_tbl(i) ||' ordqty_adjamt '
5705                                    || l_ldet_ordqty_adjamt_tbl(i));
5706         END IF; --l_debug
5707 
5708         --round the adjustment_amount with factor on the line
5709         --engine updates the factor on the line
5710         --w/nvl(user_passed,price_list rounding_factor)
5711         IF G_ROUND_INDIVIDUAL_ADJ = G_ROUND_ADJ
5712           AND l_adj_tbl(j).rounding_factor IS NOT NULL
5713           THEN
5714           l_ldet_adj_amt_tbl(i) :=
5715           round(l_ldet_adj_amt_tbl(i),
5716                 ( - 1 * l_adj_tbl(j).rounding_factor));
5717           l_ldet_ordqty_adjamt_tbl(i) :=
5718           round(l_ldet_ordqty_adjamt_tbl(i),
5719                 ( - 1 * l_adj_tbl(j).rounding_factor));
5720         END IF;
5721 
5722         IF l_debug = FND_API.G_TRUE THEN
5723           QP_PREQ_GRP.engine_debug('rounded adj: '|| l_ldet_adj_amt_tbl(i) ||
5724                                    ' rounding fac '|| l_adj_tbl(j).rounding_factor ||
5725                                    ' ordqty_adjamt '|| l_ldet_ordqty_adjamt_tbl(i) ||
5726                                    ' '|| l_adj_tbl(j).curr_line_index ||' '|| l_adj_tbl(j).line_ind ||
5727                                    ' is_ldet_rec '|| l_adj_tbl(j).is_ldet_rec ||
5728                                    ' linetypecode '|| l_adj_tbl(j).line_type_code);
5729 
5730         END IF;
5731 
5732         l_ldet_process_code_tbl(i) := l_adj_tbl(j).process_code;
5733         l_ldet_calc_code_tbl(i) := l_adj_tbl(j).calculation_code;
5734         l_ldet_updated_flag_tbl(i) := l_adj_tbl(j).updated_flag;
5735         l_ldet_operand_value_tbl(i) := l_adj_tbl(j).operand_value;
5736         l_ldet_price_break_type_tbl(i) := l_adj_tbl(j).price_break_type_code;
5737         l_ldet_operand_calc_tbl(i) := l_adj_tbl(j).operand_calculation_code;
5738         l_ldet_pricing_grp_seq_tbl(i) := l_adj_tbl(j).pricing_group_sequence;
5739         l_ldet_list_type_code_tbl(i) := l_adj_tbl(j).created_from_list_type_code;
5740         l_ldet_limit_code_tbl(i) := l_adj_tbl(j).limit_code;
5741         l_ldet_limit_text_tbl(i) := l_adj_tbl(j).limit_text;
5742         l_ldet_list_line_no_tbl(i) := l_adj_tbl(j).list_line_no;
5743         l_ldet_charge_type_tbl(i) := l_adj_tbl(j).charge_type_code;
5744         l_ldet_charge_subtype_tbl(i) := l_adj_tbl(j).charge_subtype_code;
5745         l_ldet_pricing_phase_id_tbl(i) := l_adj_tbl(j).pricing_phase_id;
5746         l_ldet_automatic_flag_tbl(i) := l_adj_tbl(j).automatic_flag;
5747         l_ldet_modifier_level_tbl(i) := l_adj_tbl(j).modifier_level_code;
5748         --to store gro/line qty in line qty based on mod level
5749         --l_ldet_line_quantity_tbl(i) := nvl(l_calc_quantity,1);  -- 40,SHU, this is inconsistent with PL/SQL path
5750         l_ldet_line_quantity_tbl(i) := l_adj_tbl(j).priced_quantity; -- -- 2388011, SHU FIX diff PRIYA,to be the same as PL/SQL path
5751         l_ldet_is_max_frt_tbl(i) := G_NO;
5752         IF l_debug = FND_API.G_TRUE THEN
5753           QP_PREQ_GRP.engine_debug('adjusted amt 4 ');
5754 
5755           QP_PREQ_GRP.engine_debug('Returned adj : '|| i
5756                                    ||' line detail index '|| l_ldet_line_dtl_index_tbl(i)
5757                                    ||' adj amt '|| l_ldet_adj_amt_tbl(i));
5758 
5759 
5760         END IF;
5761         IF l_return_status = FND_API.G_RET_STS_ERROR
5762           THEN
5763           IF l_debug = FND_API.G_TRUE THEN
5764             QP_PREQ_GRP.engine_debug('Calc Error');
5765           END IF;
5766           l_ldet_pricing_sts_code_tbl(i) := G_STATUS_CALC_ERROR;
5767           l_ldet_pricing_sts_txt_tbl(i) := l_return_status_text;
5768           l_ldet_applied_flag_tbl(i) := G_NO;
5769         ELSE
5770           IF l_debug = FND_API.G_TRUE THEN
5771             QP_PREQ_GRP.engine_debug('Calc Succ');
5772           END IF;
5773           l_ldet_pricing_sts_code_tbl(i) :=
5774           l_adj_tbl(j).pricing_status_code;
5775           IF l_adj_tbl(j).pricing_status_code = G_STATUS_UNCHANGED
5776             AND l_adj_tbl(j).is_ldet_rec IN (G_ASO_ORDER_TYPE,
5777                                              G_ASO_LINE_TYPE)
5778             THEN
5779             l_ldet_pricing_sts_code_tbl(i) := G_STATUS_NEW;
5780           END IF;
5781           --manual frt charges should not have appl flag YES
5782           --and manual adj which are updated and applied shdbe app
5783           --should retain applied flag as when auto overr adj
5784           --are deleted OM Int makes applied 'N' and updated
5785           --'Y' and does not physically delete records
5786           l_ldet_applied_flag_tbl(i) :=
5787           l_adj_tbl(j).applied_flag;
5788           /*
5789 			IF nvl(l_adj_tbl(j).automatic_flag,G_NO) = G_YES
5790 			or (nvl(l_adj_tbl(j).applied_flag,G_NO) = G_YES
5791                         and nvl(l_adj_tbl(j).updated_flag,G_NO) = G_YES)
5792 			THEN
5793                         l_ldet_applied_flag_tbl(i) := G_YES;
5794 			ELSE
5795                         l_ldet_applied_flag_tbl(i) := G_NO;
5796 			END IF;
5797 */
5798           l_ldet_pricing_sts_txt_tbl(i) :=
5799           l_adj_tbl(j).pricing_status_text;
5800         END IF; --l_return_status = FND_API.G_RET_STS_ERROR
5801 
5802         IF l_adj_tbl(j).created_from_list_line_type = G_FREIGHT_CHARGE
5803           AND nvl(l_adj_tbl(j).automatic_flag, G_NO) = G_YES
5804           AND l_adj_tbl(j).pricing_status_code IN
5805           (G_STATUS_NEW, G_STATUS_UPDATED, G_STATUS_UNCHANGED)
5806           THEN
5807           IF l_debug = FND_API.G_TRUE THEN
5808             QP_PREQ_GRP.engine_debug('looping thru FRT for list_line id '
5809                                      || l_adj_tbl(j).created_from_list_line_id ||' adj amt '
5810                                      || l_ldet_adj_amt_tbl(i) ||' upd '
5811                                      || l_adj_tbl(j).updated_flag
5812                                      ||' level '|| l_adj_tbl(j).modifier_level_code);
5813           END IF;
5814           l_ldet_pricing_sts_code_tbl(i) := G_STATUS_DELETED;
5815           l_ldet_pricing_sts_txt_tbl(i) := G_NOT_MAX_FRT_CHARGE;
5816 
5817           IF l_frt_tbl.COUNT = 0
5818             THEN
5819             --no record for charge type subtype combn
5820             --so insert into l_frt_tbl
5821             IF l_debug = FND_API.G_TRUE THEN
5822               QP_PREQ_GRP.engine_debug('No frtcharge in tbl: insert rec');
5823             END IF;
5824             l_frt_tbl(1).line_index := l_adj_tbl(j).line_ind;
5825             l_frt_tbl(1).line_detail_index :=
5826             l_adj_tbl(j).line_detail_index;
5827             l_frt_tbl(1).created_from_list_line_id :=
5828             l_adj_tbl(j).created_from_list_line_id;
5829             l_frt_tbl(1).adjustment_amount :=
5830             l_ldet_adj_amt_tbl(i);
5831             l_frt_tbl(1).charge_type_code :=
5832             l_adj_tbl(j).charge_type_code;
5833             l_frt_tbl(1).charge_subtype_code :=
5834             l_adj_tbl(j).charge_subtype_code;
5835             l_frt_tbl(1).updated_flag :=
5836             nvl(l_adj_tbl(j).updated_flag, G_NO);
5837             --this is to show if a frt rec is max or not
5838             l_ldet_is_max_frt_tbl(i) := G_YES;
5839             IF l_adj_tbl(j).modifier_level_code IN
5840               (G_LINE_LEVEL, G_LINE_GROUP)
5841               THEN
5842               l_frt_tbl(1).LEVEL := G_LINE_LEVEL;
5843             ELSIF l_adj_tbl(j).modifier_level_code = G_ORDER_LEVEL
5844               THEN
5845               l_frt_tbl(1).LEVEL := G_ORDER_LEVEL;
5846             END IF;
5847           ELSIF l_frt_tbl.COUNT > 0
5848             THEN
5849             IF l_debug = FND_API.G_TRUE THEN
5850               QP_PREQ_GRP.engine_debug('frtchrg records exist');
5851 
5852             END IF;
5853             FOR N IN l_frt_tbl.FIRST..l_frt_tbl.LAST
5854               LOOP
5855               IF l_debug = FND_API.G_TRUE THEN
5856                 QP_PREQ_GRP.engine_debug('existing frt record id '
5857                                          || l_frt_tbl(N).created_from_list_line_id
5858                                          ||' level '|| l_frt_tbl(N).LEVEL);
5859 
5860               END IF;
5861               IF l_adj_tbl(j).line_ind = l_frt_tbl(N).line_index AND
5862                 nvl(l_adj_tbl(j).charge_type_code, 'NULL') =
5863                 nvl(l_frt_tbl(N).charge_type_code, 'NULL') AND
5864                 nvl(l_adj_tbl(j).charge_subtype_code, 'NULL') =
5865                 nvl(l_frt_tbl(N).charge_subtype_code, 'NULL') AND
5866                 (l_frt_tbl(N).LEVEL = l_adj_tbl(j).modifier_level_code
5867                  OR (l_frt_tbl(N).LEVEL = G_LINE_LEVEL AND
5868                      l_adj_tbl(j).modifier_level_code = G_LINE_GROUP))
5869                 THEN
5870                 --record exists for charge type subtype combn
5871                 IF l_debug = FND_API.G_TRUE THEN
5872                   QP_PREQ_GRP.engine_debug('charge combn match');
5873 
5874                 END IF;
5875                 IF nvl(l_frt_tbl(N).updated_flag, G_NO) = G_NO
5876                   THEN
5877                   IF l_debug = FND_API.G_TRUE THEN
5878                     QP_PREQ_GRP.engine_debug('Rec is NOT overriden');
5879                   END IF;
5880                   --only if user has not overridden
5881                   --replace the record with the ct adj
5882 
5883                   IF nvl(l_adj_tbl(j).updated_flag, G_NO) = G_YES
5884                     THEN
5885                     IF l_debug = FND_API.G_TRUE THEN
5886                       QP_PREQ_GRP.engine_debug('Repl overridden rec');
5887                     END IF;
5888                     --if ct adj is overridden
5889                     l_frt_tbl(N).line_detail_index
5890                     := l_adj_tbl(j).line_detail_index;
5891                     l_frt_tbl(N).created_from_list_line_id :=
5892                     l_adj_tbl(j).created_from_list_line_id;
5893                     l_frt_tbl(N).line_index
5894                     := l_adj_tbl(j).line_ind;
5895                     l_frt_tbl(N).adjustment_amount
5896                     := l_ldet_adj_amt_tbl(i);
5897                     l_frt_tbl(N).updated_flag
5898                     := l_adj_tbl(j).updated_flag;
5899                     --this is to show if a frt rec is max or not
5900                     l_ldet_is_max_frt_tbl(i) := G_YES;
5901                   ELSIF nvl(l_adj_tbl(j).updated_flag, G_NO) = G_NO
5902                     AND l_ldet_adj_amt_tbl(i)
5903                     > l_frt_tbl(N).adjustment_amount
5904                     THEN
5905                     --if ct adj's adj amt is greater
5906                     IF l_debug = FND_API.G_TRUE THEN
5907                       QP_PREQ_GRP.engine_debug('replace high adjamt');
5908                     END IF;
5909                     l_frt_tbl(N).line_detail_index
5910                     := l_adj_tbl(j).line_detail_index;
5911                     l_frt_tbl(N).created_from_list_line_id
5912                     := l_adj_tbl(j).created_from_list_line_id;
5913                     l_frt_tbl(N).line_index
5914                     := l_adj_tbl(j).line_ind;
5915                     l_frt_tbl(N).adjustment_amount
5916                     := l_ldet_adj_amt_tbl(i);
5917                     l_frt_tbl(N).updated_flag
5918                     := l_adj_tbl(j).updated_flag;
5919                     --this is to show if a frt rec is max or not
5920                     l_ldet_is_max_frt_tbl(i) := G_YES;
5921                   END IF; --l_adj_tbl(j).updated_flag
5922 
5923                 END IF; --frt_tbl.updated_flag
5924                 EXIT;
5925               ELSE
5926                 --no match for charge type subtype combn
5927                 --so insert into l_frt_tbl
5928                 IF l_debug = FND_API.G_TRUE THEN
5929                   QP_PREQ_GRP.engine_debug('charge combn no match');
5930 
5931                 END IF;
5932                 IF N = l_frt_tbl.LAST
5933                   THEN
5934                   --this is the last record and the
5935                   --charge type subtype combn not match
5936                   IF l_debug = FND_API.G_TRUE THEN
5937                     QP_PREQ_GRP.engine_debug('lastrec:insert new record');
5938                   END IF;
5939                   l_frt_tbl(N + 1).line_index :=
5940                   l_adj_tbl(j).line_ind;
5941                   l_frt_tbl(N + 1).line_detail_index :=
5942                   l_adj_tbl(j).line_detail_index;
5943                   l_frt_tbl(N + 1).created_from_list_line_id :=
5944                   l_adj_tbl(j).created_from_list_line_id;
5945                   l_frt_tbl(N + 1).adjustment_amount :=
5946                   l_ldet_adj_amt_tbl(i);
5947                   l_frt_tbl(N + 1).charge_type_code :=
5948                   l_adj_tbl(j).charge_type_code;
5949                   l_frt_tbl(N + 1).charge_subtype_code :=
5950                   l_adj_tbl(j).charge_subtype_code;
5951                   l_frt_tbl(N + 1).updated_flag :=
5952                   nvl(l_adj_tbl(j).updated_flag, G_NO);
5953                   IF l_adj_tbl(j).modifier_level_code IN
5954                     (G_LINE_LEVEL, G_LINE_GROUP)
5955                     THEN
5956                     l_frt_tbl(N + 1).LEVEL := G_LINE_LEVEL;
5957                   ELSIF l_adj_tbl(j).modifier_level_code =
5958                     G_ORDER_LEVEL
5959                     THEN
5960                     l_frt_tbl(N + 1).LEVEL := G_ORDER_LEVEL;
5961                   END IF;
5962                   --this is to show if a frt rec is max or not
5963                   l_ldet_is_max_frt_tbl(i) := G_YES;
5964                 END IF; --last rec of frt_tbl
5965               END IF; --matching charge_type/subtype
5966 
5967             END LOOP; --loop thru the frt tbl
5968           END IF; --frt charge tbl count
5969 
5970         END IF; --created_from_list_line_type
5971 
5972 
5973       END IF; --is_ldet_rec
5974 
5975       -------------------------------------------------------------------------------
5976       --code added to calculate adj amt on order lvl adj
5977       --fix for bug 1767249
5978       IF l_adj_tbl(j).modifier_level_code =
5979         G_ORDER_LEVEL
5980         AND l_adj_tbl(j).created_from_list_line_type
5981         <> G_FREIGHT_CHARGE
5982         THEN
5983         IF l_debug = FND_API.G_TRUE THEN
5984           QP_PREQ_GRP.engine_debug('ord lvl adj processing '
5985                                    || l_adj_tbl(j).modifier_level_code ||' listlineid '
5986                                    || l_adj_tbl(j).created_from_list_line_id ||' adj '
5987                                    || l_return_adjustment ||'qty '
5988                                    || l_adj_tbl(j).line_priced_quantity);
5989         END IF;
5990         IF l_ord_dtl_index_tbl.COUNT = 0
5991           THEN
5992           IF l_debug = FND_API.G_TRUE THEN
5993             QP_PREQ_GRP.engine_debug('ord lvl firstrec');
5994           END IF;
5995           l_ord_dtl_index_tbl(1) :=
5996           l_adj_tbl(j).line_detail_index;
5997           --fix for bug2424931 multiply by priced_qty
5998           l_ord_adj_amt_tbl(1) :=
5999           nvl(l_return_adjustment, 0) *
6000           nvl(l_adj_tbl(j).line_priced_quantity, 0);
6001 
6002           IF l_debug = FND_API.G_TRUE THEN
6003             QP_PREQ_GRP.engine_debug('ord lvl1');
6004             QP_PREQ_GRP.engine_debug('ord lvl2'
6005                                      || l_adj_tbl(j).line_priced_quantity);
6006             QP_PREQ_GRP.engine_debug('ord lvl3'
6007                                      || l_adj_tbl(j).ordered_qty);
6008             QP_PREQ_GRP.engine_debug('ord lvl4'
6009                                      || l_adj_tbl(j).catchweight_qty);
6010             QP_PREQ_GRP.engine_debug('ord lvl5'
6011                                      || l_adj_tbl(j).actual_order_qty);
6012             QP_PREQ_GRP.engine_debug('ord lvl6'
6013                                      || l_adj_tbl(j).operand_value);
6014             QP_PREQ_GRP.engine_debug('ord lvl7'
6015                                      || l_adj_tbl(j).unit_price);
6016             QP_PREQ_GRP.engine_debug('ord lvl8'
6017                                      || l_adj_tbl(j).operand_calculation_code);
6018             QP_PREQ_GRP.engine_debug('ord lvl9'
6019                                      || l_return_adjustment);
6020             QP_PREQ_GRP.engine_debug('ord lvl10'
6021                                      || l_sub_total_price);
6022           END IF; --l_debug
6023 
6024           --l_ord_qty_adj_amt_tbl
6025           l_ord_qty_adj_amt := 0;
6026           l_ord_qty_operand := 0;
6027           GET_ORDERQTY_VALUES(
6028                               p_ordered_qty => l_adj_tbl(j).ordered_qty,
6029                               p_priced_qty =>
6030                               l_adj_tbl(j).line_priced_quantity,
6031                               p_catchweight_qty =>
6032                               l_adj_tbl(j).catchweight_qty,
6033                               p_actual_order_qty =>
6034                               l_adj_tbl(j).actual_order_qty,
6035                               p_operand => l_adj_tbl(j).operand_value,
6036                               p_adjustment_amt => nvl(l_return_adjustment, 0),
6037                               p_unit_price => l_adj_tbl(j).unit_price,
6038                               p_adjusted_unit_price => l_sub_total_price,
6039                               p_operand_calculation_code =>
6040                               l_adj_tbl(j).operand_calculation_code,
6041                               p_input_type => 'OPERAND',
6042                               x_ordqty_output1 => l_ord_qty_operand,
6043                               x_ordqty_output2 => l_ord_qty_adj_amt,
6044                               x_return_status => x_return_status,
6045                               x_return_status_text => x_return_status_text);
6046 
6047           l_ord_qty_operand_tbl(1) := l_ord_qty_operand;
6048           l_ord_qty_adj_amt_tbl(1) := l_ord_qty_adj_amt;
6049 
6050           IF l_debug = FND_API.G_TRUE THEN
6051             QP_PREQ_GRP.engine_debug('ord lvl firstrec'
6052                                      ||' adjamt '|| l_ord_adj_amt_tbl(1)
6053                                      ||' ordqtyadjamt '|| l_ord_qty_adj_amt_tbl(1)
6054                                      ||' ordqtyoperand '|| l_ord_qty_operand_tbl(1));
6055           END IF;
6056         ELSE ---l_ord_dtl_index_tbl.COUNT
6057           FOR n IN
6058             l_ord_dtl_index_tbl.FIRST..l_ord_dtl_index_tbl.LAST
6059             LOOP
6060             IF l_debug = FND_API.G_TRUE THEN
6061               QP_PREQ_GRP.engine_debug('ord lvl adj index '||
6062                                        l_ord_dtl_index_tbl(n) ||' current rec index '
6063                                        || l_adj_tbl(j).line_detail_index
6064                                        ||' count '|| l_ord_dtl_index_tbl.COUNT
6065                                        ||' lastrec dtl index '
6066                                        || l_ord_dtl_index_tbl(l_ord_dtl_index_tbl.LAST))
6067               ;
6068             END IF;
6069             IF l_ord_dtl_index_tbl(n) =
6070               l_adj_tbl(j).line_detail_index
6071               THEN
6072               IF l_debug = FND_API.G_TRUE THEN
6073                 QP_PREQ_GRP.engine_debug('found match '
6074                                          ||' ct adjamt '|| l_ord_adj_amt_tbl(n));
6075               END IF;
6076               --fix for bug2424931 multiply by priced_qty
6077               l_ord_adj_amt_tbl(n) := l_ord_adj_amt_tbl(n) +
6078               nvl(l_return_adjustment, 0) *
6079               nvl(l_adj_tbl(j).line_priced_quantity, 0);
6080 
6081               l_ord_qty_adj_amt := 0;
6082               l_ord_qty_operand := 0;
6083 
6084               --l_ord_qty_adj_amt_tbl
6085               GET_ORDERQTY_VALUES(
6086                                   p_ordered_qty => l_adj_tbl(j).ordered_qty,
6087                                   p_priced_qty =>
6088                                   l_adj_tbl(j).line_priced_quantity,
6089                                   p_catchweight_qty =>
6090                                   l_adj_tbl(j).catchweight_qty,
6091                                   p_actual_order_qty =>
6092                                   l_adj_tbl(j).actual_order_qty,
6093                                   p_operand => l_adj_tbl(j).operand_value,
6094                                   p_adjustment_amt => nvl(l_return_adjustment, 0),
6095                                   p_unit_price => l_adj_tbl(j).unit_price,
6096                                   p_adjusted_unit_price => l_sub_total_price,
6097                                   p_operand_calculation_code =>
6098                                   l_adj_tbl(j).operand_calculation_code,
6099                                   p_input_type => 'OPERAND',
6100                                   x_ordqty_output1 => l_ord_qty_operand,
6101                                   x_ordqty_output2 => l_ord_qty_adj_amt,
6102                                   x_return_status => x_return_status,
6103                                   x_return_status_text => x_return_status_text);
6104 
6105               l_ord_qty_adj_amt_tbl(n) :=
6106               l_ord_qty_adj_amt_tbl(n) + l_ord_qty_adj_amt;
6107               l_ord_qty_operand_tbl(n) := l_ord_qty_operand;
6108 
6109               IF l_debug = FND_API.G_TRUE THEN
6110                 QP_PREQ_GRP.engine_debug('ord lvl adj amt '||
6111                                          l_ord_adj_amt_tbl(n)
6112                                          ||' ordqtyadjamt '|| l_ord_qty_adj_amt_tbl(n)
6113                                          ||' ordqtyoperand '|| l_ord_qty_operand_tbl(n));
6114               END IF;
6115               EXIT; --exit the loop once matches
6116             ELSIF l_ord_dtl_index_tbl(n) =
6117               l_ord_dtl_index_tbl(l_ord_dtl_index_tbl.LAST)
6118               AND l_ord_dtl_index_tbl(n) <>
6119               l_adj_tbl(j).line_detail_index
6120               THEN
6121               IF l_debug = FND_API.G_TRUE THEN
6122                 QP_PREQ_GRP.engine_debug('ord lvl lastrec '||
6123                                          l_adj_tbl(j).line_detail_index ||' adjamt '
6124                                          || l_return_adjustment
6125                                          ||' qty '|| l_adj_tbl(j).line_priced_quantity);
6126               END IF;
6127               l_ord_dtl_index_tbl(l_ord_dtl_index_tbl.COUNT + 1)
6128               := l_adj_tbl(j).line_detail_index;
6129               --fix for bug2424931 multiply by priced_qty
6130               l_ord_adj_amt_tbl(l_ord_dtl_index_tbl.COUNT)
6131               := nvl(l_return_adjustment, 0) *
6132               nvl(l_adj_tbl(j).line_priced_quantity, 0);
6133 
6134               --l_ord_qty_adj_amt_tbl
6135               l_ord_qty_adj_amt := 0;
6136               l_ord_qty_operand := 0;
6137 
6138               GET_ORDERQTY_VALUES(
6139                                   p_ordered_qty => l_adj_tbl(j).ordered_qty,
6140                                   p_priced_qty =>
6141                                   l_adj_tbl(j).line_priced_quantity,
6142                                   p_catchweight_qty =>
6143                                   l_adj_tbl(j).catchweight_qty,
6144                                   p_actual_order_qty =>
6145                                   l_adj_tbl(j).actual_order_qty,
6146                                   p_operand => l_adj_tbl(j).operand_value,
6147                                   p_adjustment_amt => nvl(l_return_adjustment, 0),
6148                                   p_unit_price => l_adj_tbl(j).unit_price,
6149                                   p_adjusted_unit_price => l_sub_total_price,
6150                                   p_operand_calculation_code =>
6151                                   l_adj_tbl(j).operand_calculation_code,
6152                                   p_input_type => 'OPERAND',
6153                                   x_ordqty_output1 => l_ord_qty_operand,
6154                                   x_ordqty_output2 => l_ord_qty_adj_amt,
6155                                   x_return_status => x_return_status,
6156                                   x_return_status_text => x_return_status_text);
6157 
6158               l_ord_qty_operand_tbl(l_ord_dtl_index_tbl.COUNT)
6159               := l_ord_qty_operand;
6160               l_ord_qty_adj_amt_tbl(l_ord_dtl_index_tbl.COUNT)
6161               := l_ord_qty_adj_amt;
6162 
6163               IF l_debug = FND_API.G_TRUE THEN
6164                 QP_PREQ_GRP.engine_debug('ord lvl lastadjamt '||
6165                                          l_ord_adj_amt_tbl(l_ord_dtl_index_tbl.COUNT));
6166               END IF;
6167             END IF; -----l_ord_dtl_index_tbl(n)
6168             IF l_debug = FND_API.G_TRUE THEN
6169               QP_PREQ_GRP.engine_debug('ord lvl adj:dtlindex '
6170                                        || l_ord_dtl_index_tbl(n) ||' adj amt '
6171                                        || l_ord_adj_amt_tbl(n)
6172                                        ||' ordqtyadjamt '|| l_ord_qty_adj_amt_tbl(n)
6173                                        ||' ordqtyoperand '|| l_ord_qty_operand_tbl(n));
6174             END IF;
6175           END LOOP; --l_ord_dtl_index_tbl
6176         END IF; --l_ord_dtl_index_tbl.COUNT
6177       END IF; --order level
6178       -------------------------------------------------------------------------------
6179 
6180       IF l_adj_tbl(j).created_from_list_line_type IN
6181         (G_DISCOUNT, G_SURCHARGE, G_PRICE_BREAK_TYPE)
6182         AND l_adj_tbl(j).pricing_status_code IN
6183         (G_STATUS_NEW, G_STATUS_UPDATED, G_STATUS_UNCHANGED)
6184         --added for auto overr deleted adj
6185         AND l_adj_tbl(j).applied_flag = G_YES
6186         AND nvl(l_adj_tbl(j).accrual_flag, G_NO) = G_NO
6187         THEN
6188         --Update the adjustment amount for each adjustment
6189         -- 2892848_latest
6190         -- so we have correct current USP, considered each adj shall be rounded
6191         IF G_ROUND_INDIVIDUAL_ADJ = G_ROUND_ADJ
6192           AND l_adj_tbl(j).rounding_factor IS NOT NULL
6193           THEN
6194           l_return_adjustment := round (l_return_adjustment,  - 1 * l_adj_tbl(j).rounding_factor);
6195         END IF; -- end rounding
6196         -- end 2892848_latest
6197         IF l_debug = FND_API.G_TRUE THEN
6198           QP_PREQ_GRP.engine_debug('prev USP: '|| l_adjusted_price);
6199           QP_PREQ_GRP.engine_debug('current adjustment: '|| l_return_adjustment);
6200         END IF;
6201 
6202         l_adjusted_price := l_adjusted_price + nvl(l_return_adjustment, 0);
6203         IF l_debug = FND_API.G_TRUE THEN
6204           QP_PREQ_GRP.engine_debug('adjusted price, i.e. current USP : '|| l_adjusted_price); -- 2892848, good place to debug current USP
6205         END IF;
6206       END IF; --created_from_list_line_type
6207 
6208       IF l_debug = FND_API.G_TRUE THEN
6209 
6210         QP_PREQ_GRP.engine_debug('Processed lines: line index'
6211                                  || l_adj_tbl(j).line_ind ||' adjusted price '
6212                                  --||l_adj_tbl(j).updated_adjusted_unit_price -- 2892848
6213                                  || l_adjusted_price -- 2892848
6214                                  ||' adjustment count '|| l_ldet_line_dtl_index_tbl.COUNT);
6215 
6216       END IF;
6217 
6218       -- begin 3126019 , this x loop cannot have gap for bulk insert later
6219       -- therefore we cannot do	x:=l_adj_tbl(j).line_ind;
6220       /* out 2892848*/
6221 
6222       IF line_change = TRUE
6223         THEN
6224         IF l_debug = FND_API.G_TRUE THEN
6225           QP_PREQ_GRP.engine_debug('line change ');
6226         END IF;
6227 
6228         --[julin/5025231]
6229         --x := x + 1;
6230         IF l_line_ind_ind_lookup_tbl.exists(l_adj_tbl(j).line_ind) THEN
6231           x := l_line_ind_ind_lookup_tbl(l_adj_tbl(j).line_ind);
6232         ELSE
6233           x := l_line_ind_ind_lookup_tbl.count + 1;
6234           l_line_ind_ind_lookup_tbl(l_adj_tbl(j).line_ind) := x;
6235         END IF;
6236       END IF;
6237 
6238 
6239 
6240       --x:=l_adj_tbl(j).line_ind; -- 2892848, 3126019
6241 
6242       IF l_debug = FND_API.G_TRUE THEN
6243         QP_PREQ_GRP.engine_debug('Update the adjustment amount for each adjustment...');
6244         QP_PREQ_GRP.engine_debug('line_ind: '|| l_adj_tbl(j).line_ind);
6245         QP_PREQ_GRP.engine_debug('changing price in line_tbl('|| x || ')');
6246 
6247       END IF;
6248       --Update the adjustment amount for each adjustment
6249       l_line_index_tbl(x) := l_adj_tbl(j).line_ind;
6250       l_adj_unit_price_tbl(x) := l_adjusted_price;
6251       l_unit_price_tbl(x) := l_adj_tbl(j).unit_price;
6252       l_amount_changed_tbl(x) := l_adj_tbl(j).amount_changed;
6253       l_upd_adj_unit_price_tbl(x) :=
6254       l_adj_tbl(j).updated_adjusted_unit_price;
6255 
6256       --netamt tbls, 3126019
6257       l_ntamt_adj_unit_price(l_line_index_tbl(x)) := l_adj_unit_price_tbl(x); -- 3126019
6258 
6259 
6260       -- Ravi
6261       l_ordered_qty_tbl(x) := l_adj_tbl(j).ordered_qty;
6262       l_line_unit_price_tbl(x) := l_adj_tbl(j).line_unit_price;
6263       l_line_priced_qty_tbl(x) := l_adj_tbl(j).line_priced_quantity;
6264       l_catchweight_qty_tbl(x) := l_adj_tbl(j).catchweight_qty;
6265       l_actual_order_qty_tbl(x) := l_adj_tbl(j).actual_order_qty;
6266       -- End Ravi
6267 
6268       -- Ravi bug# 2745337-divisor by zero
6269       IF (l_adj_tbl(j).ordered_qty <> 0 OR l_adj_tbl(j).modifier_level_code = 'ORDER') THEN
6270         IF (l_debug = FND_API.G_TRUE) THEN
6271           QP_PREQ_GRP.engine_debug('Before Going into GET_ORDERQTY_VALUES #2');
6272         END IF;
6273         GET_ORDERQTY_VALUES(p_ordered_qty => l_adj_tbl(j).ordered_qty,
6274                             p_priced_qty => l_adj_tbl(j).line_priced_quantity,
6275                             p_catchweight_qty => l_adj_tbl(j).catchweight_qty,
6276                             p_actual_order_qty => l_adj_tbl(j).actual_order_qty,
6277                             p_unit_price => l_adj_tbl(j).unit_price,
6278                             p_adjusted_unit_price => l_adj_unit_price_tbl(x),
6279                             p_line_unit_price => l_adj_tbl(j).line_unit_price,
6280                             p_input_type => 'SELLING_PRICE',
6281                             x_ordqty_output1 => l_ordqty_unit_price_tbl(x),
6282                             x_ordqty_output2 => l_ordqty_selling_price_tbl(x),
6283                             x_return_status => x_return_status,
6284                             x_return_status_text => x_return_status_text);
6285       ELSE
6286         IF l_debug = FND_API.G_TRUE THEN
6287           QP_PREQ_GRP.engine_debug('Ordered Qty #2 : ' || l_adj_tbl(j).ordered_qty);
6288           QP_PREQ_GRP.engine_debug('SELLING PRICE Ordered Qty is 0 or modifier level code is not ORDER');
6289         END IF;
6290         l_ordqty_unit_price_tbl(x) := 0;
6291         l_ordqty_selling_price_tbl(x) := 0;
6292       END IF;
6293 
6294       IF l_debug = FND_API.G_TRUE THEN
6295         QP_PREQ_GRP.engine_debug('Printing ordqty_selling_price '
6296                                  || l_ordqty_selling_price_tbl(x) ||' unit_price '
6297                                  || l_ordqty_unit_price_tbl(x));
6298       END IF; --l_debug
6299 
6300       --If PUB API fetches any out of phase or manual adjustments
6301       --pricing sts code on the line must be UPDATED
6302       --and should remain same otherwise
6303       --This change done because when manual adj are applied,
6304       --GRP puts pricing sts as UNCHANGED and OM Integration
6305       --will not change the new selling price
6306       IF l_adj_tbl(j).line_pricing_status_code <> G_STATUS_UPDATED
6307         AND l_adj_tbl(j).PROCESS_CODE = G_STATUS_UPDATED
6308         THEN
6309         l_pricing_sts_code_tbl(x) := G_STATUS_UPDATED;
6310       ELSE
6311         l_pricing_sts_code_tbl(x) :=
6312         l_adj_tbl(j).line_pricing_status_code;
6313       END IF;
6314       l_pricing_sts_txt_tbl(x) := l_adj_tbl(j).pricing_status_text;
6315       l_rounding_factor_tbl(x) := l_adj_tbl(j).rounding_factor;
6316 
6317       --round the selling price if ROUND_INDIVIDUAL_ADJ profile is N
6318       --in this case the adjustment_amt will not be rounded
6319       --IF G_ROUND_INDIVIDUAL_ADJ = G_NO_ROUND_ADJ
6320 
6321       /* 2892848_latest
6322 		-- we should round adjs, move rounding ahead
6323 		IF G_ROUND_INDIVIDUAL_ADJ <> G_NO_ROUND -- shu fix bug 2239061
6324 		-- this is not the final USP since now we order by bucket
6325 
6326 		and l_rounding_factor_tbl(x) IS NOT NULL
6327 		THEN
6328   IF l_debug = FND_API.G_TRUE THEN
6329 		QP_PREQ_GRP.engine_debug('need to round selling price, rounding factor: '
6330 					||l_rounding_factor_tbl(x));
6331   END IF;
6332 		  l_adj_unit_price_tbl(x) :=
6333 		  round(l_adj_unit_price_tbl(x),-1*l_rounding_factor_tbl(x));
6334 		  l_ordqty_selling_price_tbl(x) :=
6335 		  round(l_ordqty_selling_price_tbl(x),-1*l_rounding_factor_tbl(x));
6336 		  l_ordqty_unit_price_tbl(x) :=
6337 		  round(l_ordqty_unit_price_tbl(x),-1*l_rounding_factor_tbl(x));
6338 		END IF;
6339 		*/
6340 
6341       --This is for prg to get the oldfgline's selling price
6342 
6343       IF G_PRG_UNCH_LINE_IND_TBL.EXISTS(l_line_index_tbl(x)) THEN
6344         --fix for bug 2831270
6345         G_PRG_UNCH_CALC_PRICE_TBL(G_PRG_UNCH_LINE_IND_TBL(l_line_index_tbl(x))) :=
6346         l_adj_unit_price_tbl(x);
6347 
6348         IF l_debug = FND_API.G_TRUE THEN
6349           QP_PREQ_GRP.engine_debug('oldfgline line ind '
6350                                    || l_line_index_tbl(x) ||' adjprice '
6351                                    || G_PRG_UNCH_CALC_PRICE_TBL(G_PRG_UNCH_LINE_IND_TBL(l_line_index_tbl(x))));
6352         END IF; --l_debug
6353       END IF; --G_PRG_UNCH_LINE_IND_TBL
6354 
6355       IF l_debug = FND_API.G_TRUE THEN
6356         QP_PREQ_GRP.engine_debug('price in line_tbl'
6357                                  ||' table index '|| x
6358                                  ||' line index '|| l_line_index_tbl(x)
6359                                  ||' adjusted price '|| l_adj_unit_price_tbl(x)
6360                                  ||' orduomsellingprice '|| l_ordqty_selling_price_tbl(x)
6361                                  ||' lineunitprice '|| l_ordqty_unit_price_tbl(x)
6362                                  ||' amt changed '|| l_amount_changed_tbl(x));
6363 
6364 
6365 
6366         QP_PREQ_GRP.engine_debug('going to next line --------------'
6367                                  || i ||' x '|| x);
6368       END IF;
6369       J := l_adj_tbl.NEXT(j);
6370     END LOOP;
6371     IF l_debug = FND_API.G_TRUE THEN
6372       QP_PREQ_GRP.engine_debug('----------------------------------');
6373 
6374     END IF;
6375     IF l_frt_tbl.COUNT > 0
6376       OR l_ldet_line_dtl_index_tbl.COUNT > 0
6377       THEN
6378       x := l_ldet_line_dtl_index_tbl.FIRST;
6379       WHILE x IS NOT NULL
6380         LOOP
6381         IF l_debug = FND_API.G_TRUE THEN
6382           QP_PREQ_GRP.engine_debug('frt charge processing  listlineid1 ');
6383           QP_PREQ_GRP.engine_debug('frt charge processing  listlineid '
6384                                    || l_ldet_line_dtl_index_tbl(x) ||' type '
6385                                    || l_ldet_list_line_type_tbl(x) ||' is max frt ');
6386         END IF;
6387         --		||l_ldet_is_max_frt_tbl(x));
6388 
6389         --fix for bug2424931 update order lvl adj amt
6390         IF (l_debug = FND_API.G_TRUE) THEN
6391           QP_PREQ_GRP.engine_debug('Modifier Level : ' || l_ldet_modifier_level_tbl(x));
6392         END IF;
6393 
6394         IF l_ldet_modifier_level_tbl(x) = G_ORDER_LEVEL
6395           THEN
6396           IF l_debug = FND_API.G_TRUE THEN
6397             QP_PREQ_GRP.engine_debug('update ord lvl adj amt '
6398                                      ||'looping thru dtlind '|| l_ldet_line_dtl_index_tbl(x));
6399           END IF;
6400           i := l_ord_dtl_index_tbl.FIRST;
6401           WHILE i IS NOT NULL
6402             LOOP
6403             IF l_ord_dtl_index_tbl(i) =
6404               l_ldet_line_dtl_index_tbl(x)
6405               THEN
6406               IF l_debug = FND_API.G_TRUE THEN
6407                 QP_PREQ_GRP.engine_debug('update ord lvl '
6408                                          ||' line_dtl_index '|| l_ord_dtl_index_tbl(i)
6409                                          ||'adj amt '|| l_ord_adj_amt_tbl(i));
6410               END IF;
6411               l_ldet_adj_amt_tbl(x) :=
6412               l_ord_adj_amt_tbl(i);
6413               l_ldet_ordqty_adjamt_tbl(x) :=
6414               l_ord_qty_adj_amt_tbl(i);
6415               l_ldet_ordqty_operand_tbl(x) :=
6416               l_ord_qty_operand_tbl(i);
6417               l_ord_dtl_index_tbl.DELETE(i);
6418               l_ord_adj_amt_tbl.DELETE(i);
6419             END IF; --l_ord_dtl_index_tbl
6420             i := l_ord_dtl_index_tbl.NEXT(i);
6421           END LOOP;
6422         END IF; --l_ldet_modifier_level_tbl
6423 
6424         IF l_ldet_list_line_type_tbl(x) = G_FREIGHT_CHARGE
6425           THEN
6426           IF l_debug = FND_API.G_TRUE THEN
6427             QP_PREQ_GRP.engine_debug('frt charge processing  listlineid2 ');
6428           END IF;
6429           y := l_frt_tbl.FIRST;
6430           WHILE y IS NOT NULL
6431             LOOP
6432             IF l_debug = FND_API.G_TRUE THEN
6433               QP_PREQ_GRP.engine_debug('frt charge processing  listlineid3 ');
6434               QP_PREQ_GRP.engine_debug('l_ldet_line_index_tbl(x): '|| l_ldet_line_index_tbl(x));
6435             END IF;
6436             IF l_frt_tbl(y).line_detail_index =
6437               l_ldet_line_dtl_index_tbl(x)
6438               AND l_ldet_line_index_tbl(x) =  -- 2892848 fix bug,
6439               l_frt_tbl(y).line_index -- 2892848 fix bug
6440               THEN
6441               IF l_debug = FND_API.G_TRUE THEN
6442                 QP_PREQ_GRP.engine_debug('frt charge processing  listlineid4 ');
6443               END IF;
6444               l_ldet_pricing_sts_code_tbl(x) := G_STATUS_NEW;
6445               l_ldet_pricing_sts_txt_tbl(x) := 'MAX FRT CHARGE';
6446               l_frt_tbl.DELETE(y);
6447               IF l_debug = FND_API.G_TRUE THEN
6448                 QP_PREQ_GRP.engine_debug('frt charge retaind '
6449                                          || l_ldet_list_line_id_tbl(x) ||' '
6450                                          || l_ldet_pricing_sts_code_tbl(x));
6451               END IF;
6452             END IF;
6453             y := l_frt_tbl.NEXT(y);
6454           END LOOP; --frt_tbl
6455         END IF; --frt_charge
6456         x := l_ldet_line_dtl_index_tbl.NEXT(x);
6457       END LOOP; --ldet_line_dtl_index_tbl
6458       IF l_debug = FND_API.G_TRUE THEN
6459         QP_PREQ_GRP.engine_debug('----------------------------------');
6460       END IF;
6461     END IF; --frt_tbl.count
6462 
6463     IF l_debug = FND_API.G_TRUE THEN
6464       QP_PREQ_GRP.engine_debug('----------------------------------');
6465 
6466     END IF;
6467     --**************************************************************
6468     --BACK CALCULATION ROUTINE
6469     --**************************************************************
6470     --xxxxxxxxxxxxxx
6471 
6472     IF l_debug = FND_API.G_TRUE THEN
6473       QP_PREQ_GRP.engine_debug('back calculation for line ');
6474     END IF;
6475     IF l_line_index_tbl.COUNT > 0
6476       THEN
6477       IF l_debug = FND_API.G_TRUE THEN
6478         QP_PREQ_GRP.engine_debug('back calculation1 for line ');
6479       END IF;
6480       i := l_line_index_tbl.FIRST;
6481       WHILE i IS NOT NULL
6482         LOOP
6483         IF l_debug = FND_API.G_TRUE THEN
6484           QP_PREQ_GRP.engine_debug('back calculation2 for line '
6485                                    || l_amount_changed_tbl(i));
6486         END IF; --l_debug
6487 
6488         IF l_back_calc_dtl_index.EXISTS(l_line_index_tbl(i)) THEN
6489           l_back_calc_adj_amount := nvl(l_back_calc_adj_amt(l_line_index_tbl(i)), 0);
6490           l_back_calc_dtl_ind := nvl(l_back_calc_dtl_index(l_line_index_tbl(i)), 0);
6491           l_back_calc_plsql_index := l_back_calc_plsql_tbl_index(l_line_index_tbl(i));
6492         ELSE
6493           l_back_calc_adj_amount := 0;
6494           l_back_calc_dtl_ind := 0;
6495           l_back_calc_plsql_index := 0;
6496         END IF;
6497         IF l_debug = FND_API.G_TRUE THEN
6498           QP_PREQ_GRP.engine_debug('prev back calculation rec '
6499                                    || l_back_calc_dtl_ind
6500                                    ||' plsql '|| l_back_calc_plsql_index
6501                                    ||' adj amt '|| l_back_calc_adj_amount);
6502         END IF; --l_debug
6503 
6504         --l_back_calc_adj_amt has to be subtracted from amount changed
6505         --as we want to back calculate the amount overridden now
6506         --as the adjustment l_back_calc_dtl_index has been applied
6507         --already during calculation
6508         IF l_upd_adj_unit_price_tbl(i) IS NOT NULL
6509           AND ((l_upd_adj_unit_price_tbl(i) -
6510                 l_adj_unit_price_tbl(i)) <> 0)
6511           THEN
6512           IF l_debug = FND_API.G_TRUE THEN
6513             QP_PREQ_GRP.engine_debug('back calculation for line '
6514                                      || l_line_index_tbl(i));
6515 
6516           END IF;
6517           --fix for bug 2146050
6518           IF G_ROUND_INDIVIDUAL_ADJ not in (G_NO_ROUND, G_POST_ROUND)
6519 				  --[prarasto:Post Round] added check to skip rounding for Post Rounding
6520             AND l_rounding_factor_tbl(i) IS NOT NULL
6521             THEN
6522             l_upd_adj_unit_price_tbl(i) :=
6523             round(l_upd_adj_unit_price_tbl(i),
6524                   - 1 * l_rounding_factor_tbl(i));
6525 
6526             -- 2892848
6527             l_adj_unit_price_tbl(i) :=
6528             round(l_adj_unit_price_tbl(i),
6529                   - 1 * l_rounding_factor_tbl(i));
6530           END IF;
6531 
6532           --l_back_calc_adj_amt is added to remove the
6533           --adjustment applied earlier
6534           l_amount_changed_tbl(i) :=
6535           (l_upd_adj_unit_price_tbl(i) +
6536            l_back_calc_adj_amount)
6537           - l_adj_unit_price_tbl(i);
6538 
6539           IF l_debug = FND_API.G_TRUE THEN
6540             QP_PREQ_GRP.engine_debug('amt changed '
6541                                      || l_amount_changed_tbl(i));
6542           END IF; --l_debug
6543 
6544           IF l_amount_changed_tbl(i) <= 0 THEN
6545             G_BACK_CALCULATION_CODE := 'DIS';
6546           ELSE
6547             G_BACK_CALCULATION_CODE := 'SUR';
6548           END IF; --l_amount_changed_tbl
6549 
6550           BACK_CALCULATION(l_line_index_tbl(i)
6551                            , l_amount_changed_tbl(i)
6552                            , l_back_calc_ret_rec
6553                            , l_return_status
6554                            , l_return_status_text);
6555 
6556           IF l_return_status = FND_API.G_RET_STS_SUCCESS
6557             THEN
6558 
6559             --need to do this check for bug 2833753
6560             IF G_ldet_plsql_index_tbl.EXISTS(l_back_calc_ret_rec.line_detail_index) THEN
6561               --if this is an existing adjustment, need to update
6562               l_tbl_index := G_ldet_plsql_index_tbl(l_back_calc_ret_rec.line_detail_index);
6563             ELSE
6564               l_tbl_index := l_ldet_line_dtl_index_tbl.COUNT + 1;
6565             END IF; --G_ldet_plsql_index_tbl
6566 
6567             IF l_debug = FND_API.G_TRUE THEN
6568               QP_PREQ_GRP.engine_debug('back cal succ insert rec '
6569                                        || l_tbl_index);
6570             END IF;
6571             l_ldet_line_dtl_index_tbl(l_tbl_index) :=
6572             l_back_calc_ret_rec.line_detail_index;
6573             l_ldet_line_index_tbl(l_tbl_index) :=
6574             l_back_calc_ret_rec.line_index;
6575             l_ldet_list_line_id_tbl(l_tbl_index) :=
6576             l_back_calc_ret_rec.list_line_id;
6577             l_ldet_applied_flag_tbl(l_tbl_index) :=
6578             l_back_calc_ret_rec.applied_flag;
6579             l_ldet_updated_flag_tbl(l_tbl_index) :=
6580             l_back_calc_ret_rec.updated_flag;
6581             l_ldet_adj_amt_tbl(l_tbl_index) :=
6582             l_back_calc_ret_rec.adjustment_amount;
6583             l_ldet_operand_value_tbl(l_tbl_index) :=
6584             l_back_calc_ret_rec.operand_value;
6585             l_ldet_process_code_tbl(l_tbl_index) :=
6586             l_back_calc_ret_rec.process_code;
6587             l_ldet_pricing_sts_code_tbl(l_tbl_index) :=
6588             l_back_calc_ret_rec.pricing_status_code;
6589             l_ldet_pricing_sts_txt_tbl(l_tbl_index) :=
6590             l_back_calc_ret_rec.pricing_status_text;
6591             l_ldet_list_hdr_id_tbl(l_tbl_index) := NULL;
6592             l_ldet_list_line_type_tbl(l_tbl_index) :=
6593             l_back_calc_ret_rec.list_line_type_code;
6594             l_ldet_line_quantity_tbl(l_tbl_index) :=
6595             l_back_calc_ret_rec.line_quantity;
6596             l_ldet_process_code_tbl(l_tbl_index) :=
6597             G_STATUS_NEW;
6598             l_ldet_list_hdr_id_tbl(l_tbl_index) :=
6599             l_back_calc_ret_rec.list_header_id;
6600             l_ldet_list_type_code_tbl(l_tbl_index) :=
6601             l_back_calc_ret_rec.list_type_code;
6602             l_ldet_price_break_type_tbl(l_tbl_index) :=
6603             l_back_calc_ret_rec.price_break_type_code;
6604             l_ldet_charge_type_tbl(l_tbl_index) :=
6605             l_back_calc_ret_rec.charge_type_code;
6606             l_ldet_charge_subtype_tbl(l_tbl_index) :=
6607             l_back_calc_ret_rec.charge_subtype_code;
6608             l_ldet_automatic_flag_tbl(l_tbl_index) :=
6609             l_back_calc_ret_rec.automatic_flag;
6610             l_ldet_pricing_phase_id_tbl(l_tbl_index) :=
6611             l_back_calc_ret_rec.pricing_phase_id;
6612             l_ldet_limit_code_tbl(l_tbl_index) :=
6613             l_back_calc_ret_rec.limit_code;
6614             l_ldet_limit_text_tbl(l_tbl_index) :=
6615             l_back_calc_ret_rec.limit_text;
6616             l_ldet_operand_calc_tbl(l_tbl_index) :=
6617             l_back_calc_ret_rec.operand_calculation_code;
6618             l_ldet_pricing_grp_seq_tbl(l_tbl_index) :=
6619             l_back_calc_ret_rec.pricing_group_sequence;
6620             l_ldet_list_line_no_tbl(l_tbl_index) :=
6621             l_back_calc_ret_rec.list_line_no;
6622             l_ldet_calc_code_tbl(l_tbl_index) :=
6623             l_back_calc_ret_rec.calculation_code;
6624             l_ldet_modifier_level_tbl(l_tbl_index) :=
6625             l_back_calc_ret_rec.modifier_level_code;
6626 
6627             --if a different adj is selected this time
6628             --need to mark the old one as deleted
6629             IF l_back_calc_ret_rec.line_detail_index <>
6630               l_back_calc_dtl_ind
6631               AND l_back_calc_plsql_index <> 0 THEN
6632               l_ldet_applied_flag_tbl(l_back_calc_plsql_index)
6633               := G_NO;
6634               l_ldet_calc_code_tbl(l_back_calc_plsql_index)
6635               := NULL;
6636               l_ldet_pricing_sts_code_tbl(l_back_calc_plsql_index)
6637               := G_STATUS_DELETED;
6638               l_ldet_pricing_sts_txt_tbl(l_back_calc_plsql_index)
6639               := 'DELETED IN BACK CALC';
6640             END IF; --l_back_calc_ret_rec.line_detail_index
6641 
6642 
6643             l_adj_unit_price_tbl(i) := l_upd_adj_unit_price_tbl(i);
6644 
6645             --fix for bug 2812738
6646             --changes to calculate the order_uom_selling_price
6647             IF (l_ordered_qty_tbl(i) <> 0
6648                 OR l_ldet_modifier_level_tbl(l_tbl_index) =
6649                 G_ORDER_LEVEL) THEN
6650               IF (l_debug = FND_API.G_TRUE) THEN
6651                 QP_PREQ_GRP.engine_debug('Before Going into '
6652                                          ||'GET_ORDERQTY_VALUES #2.5');
6653               END IF; --l_debug
6654               GET_ORDERQTY_VALUES(p_ordered_qty =>
6655                                   l_ordered_qty_tbl(i),
6656                                   p_priced_qty => l_line_priced_qty_tbl(i),
6657                                   p_catchweight_qty => l_catchweight_qty_tbl(i),
6658                                   p_actual_order_qty => l_actual_order_qty_tbl(i),
6659                                   p_unit_price => l_unit_price_tbl(i),
6660                                   p_adjusted_unit_price => l_adj_unit_price_tbl(i),
6661                                   p_line_unit_price => l_line_unit_price_tbl(i),
6662                                   p_input_type => 'SELLING_PRICE',
6663                                   x_ordqty_output1 => l_ordqty_unit_price_tbl(i),
6664                                   x_ordqty_output2 => l_ordqty_selling_price_tbl(i),
6665                                   x_return_status => x_return_status,
6666                                   x_return_status_text => x_return_status_text);
6667             ELSE --ordered_qty
6668               IF l_debug = FND_API.G_TRUE THEN
6669                 QP_PREQ_GRP.engine_debug('Ordered Qty #2.5 : '
6670                                          || l_ordered_qty_tbl(i));
6671                 QP_PREQ_GRP.engine_debug('SELLING PRICE Ordered Qty is '
6672                                          ||'0 or modifier level code is not ORDER');
6673               END IF; --l_debug
6674               l_ordqty_unit_price_tbl(i) := 0;
6675               l_ordqty_selling_price_tbl(i) := 0;
6676             END IF; --ordered_qty
6677 
6678             -- Ravi
6679             --this procedure is called to calculate the
6680             --selling_price,adjustment_amount and operand in ordered_qty
6681             --which is the line_quantity on lines_tmp
6682             -- This needs to be called for back calculated adj record,otherwise
6683             -- l_ldet_ordqty_operand_tbl and l_ldet_ordqty_adjamt_tbl data is not there
6684             -- and is failing with error element at index[5] does not exist error when
6685             -- trying to override the selling price
6686 
6687             -- Ravi bug# 2745337-divisor by zero
6688             IF (l_ordered_qty_tbl(i) <> 0
6689                 OR l_ldet_modifier_level_tbl(l_tbl_index) =
6690                 G_ORDER_LEVEL) THEN
6691               IF (l_debug = FND_API.G_TRUE) THEN
6692                 QP_PREQ_GRP.engine_debug('Before Going into GET_ORDERQTY_VALUES #3');
6693               END IF;
6694               GET_ORDERQTY_VALUES(p_ordered_qty => l_ordered_qty_tbl(i),
6695                                   p_priced_qty => l_line_priced_qty_tbl(i),
6696                                   p_catchweight_qty => l_catchweight_qty_tbl(i),
6697                                   p_actual_order_qty => l_actual_order_qty_tbl(i),
6698                                   p_operand => l_ldet_operand_value_tbl(l_tbl_index),
6699                                   p_adjustment_amt => l_ldet_adj_amt_tbl(l_tbl_index),
6700                                   p_unit_price => l_unit_price_tbl(i),
6701                                   p_adjusted_unit_price => l_adj_unit_price_tbl(i),
6702                                   p_operand_calculation_code => l_ldet_operand_calc_tbl(l_tbl_index),
6703                                   p_input_type => 'OPERAND',
6704                                   x_ordqty_output1 => l_ldet_ordqty_operand_tbl(l_tbl_index),
6705                                   x_ordqty_output2 => l_ldet_ordqty_adjamt_tbl(l_tbl_index),
6706                                   x_return_status => x_return_status,
6707                                   x_return_status_text => x_return_status_text);
6708             ELSE
6709               IF l_debug = FND_API.G_TRUE THEN
6710                 QP_PREQ_GRP.engine_debug('Ordered Qty #3 : ' || l_ordered_qty_tbl(i));
6711                 QP_PREQ_GRP.engine_debug('OPERAND Ordered Qty is 0 or modifier level code is not ORDER');
6712               END IF;
6713               l_ldet_ordqty_operand_tbl(l_tbl_index) := 0;
6714               l_ldet_ordqty_adjamt_tbl(l_tbl_index) := 0;
6715             END IF;
6716 
6717             -- End Ravi
6718 
6719             --fix for bug 2146050 to round adjustment amt
6720             IF G_ROUND_INDIVIDUAL_ADJ = G_ROUND_ADJ
6721               AND l_rounding_factor_tbl(i) IS NOT NULL
6722               THEN
6723               l_ldet_adj_amt_tbl(l_tbl_index) :=
6724               round(l_ldet_adj_amt_tbl(l_tbl_index),
6725                     - 1 * l_rounding_factor_tbl(i));
6726               l_ldet_ordqty_adjamt_tbl(l_tbl_index) :=
6727               round(l_ldet_ordqty_adjamt_tbl(l_tbl_index),
6728                     - 1 * l_rounding_factor_tbl(i));
6729             END IF;
6730 
6731             --round the selling price if ROUND_INDIVIDUAL_ADJ
6732             --profile is N in this case the adjustment_amt
6733             --will not be rounded
6734             IF G_ROUND_INDIVIDUAL_ADJ = G_NO_ROUND_ADJ -- 2892848_latest, not to round current USP for G_ROUND_ADJ case since it is not final USP yet
6735               --IF G_ROUND_INDIVIDUAL_ADJ <> G_NO_ROUND -- shu fix 2239061
6736               AND l_rounding_factor_tbl(i) IS NOT NULL
6737               THEN
6738               IF l_debug = FND_API.G_TRUE THEN
6739                 QP_PREQ_GRP.engine_debug('need to round selling price, rounding factor: '
6740                                          || l_rounding_factor_tbl(i));
6741               END IF;
6742               l_adj_unit_price_tbl(i) :=
6743               round(l_adj_unit_price_tbl(i)
6744                     , - 1 * l_rounding_factor_tbl(i));
6745               l_ordqty_unit_price_tbl(i) :=
6746               round(l_ordqty_unit_price_tbl(i)
6747                     , - 1 * l_rounding_factor_tbl(i));
6748               l_ordqty_selling_price_tbl(i) :=
6749               round(l_ordqty_selling_price_tbl(i)
6750                     , - 1 * l_rounding_factor_tbl(i));
6751             END IF;
6752 
6753           ELSE --ret_status
6754             IF l_debug = FND_API.G_TRUE THEN
6755               QP_PREQ_GRP.engine_debug('back cal fail no insert rec');
6756             END IF;
6757             l_pricing_sts_code_tbl(i) := l_return_status;
6758             l_pricing_sts_txt_tbl(i) :=
6759             l_return_status_text;
6760           END IF; --ret_status
6761         END IF;
6762         i := l_line_index_tbl.NEXT(i);
6763       END LOOP;
6764     END IF; --count > 0
6765     IF l_debug = FND_API.G_TRUE THEN
6766       QP_PREQ_GRP.engine_debug('end back calc for line ');
6767 
6768     END IF;
6769     ---------------------------------------------------------------------
6770     --Debug Info
6771     ---------------------------------------------------------------------
6772     IF QP_PREQ_GRP.g_debug_engine = fnd_api.g_true
6773       THEN
6774       IF l_debug = FND_API.G_TRUE THEN
6775         QP_PREQ_GRP.engine_debug('in debug --------------');
6776       END IF;
6777       j := l_line_index_tbl.FIRST;
6778       WHILE j IS NOT NULL
6779         LOOP
6780         -- begin 2892848_latest
6781         /* commented out for bug 3663518
6782 			  	IF G_ROUND_INDIVIDUAL_ADJ <> G_NO_ROUND -- 2892848_latest, round finalUSP
6783                 	AND l_rounding_factor_tbl(j) IS NOT NULL THEN
6784 
6785 					l_adj_unit_price_tbl(j) := round(l_adj_unit_price_tbl(j)
6786 				         ,-1*l_rounding_factor_tbl(j));
6787 
6788 					l_ordqty_unit_price_tbl(j) := round(l_ordqty_unit_price_tbl(j)
6789 				      ,-1*l_rounding_factor_tbl(j));
6790 
6791 					l_ordqty_selling_price_tbl(j) := round(l_ordqty_selling_price_tbl(j)
6792 				       ,-1*l_rounding_factor_tbl(j));
6793 				END IF; -- end rounding 2892848
6794                         */
6795 
6796         IF l_debug = FND_API.G_TRUE THEN
6797           QP_PREQ_GRP.engine_debug('(No final rounding) Line Info '|| j
6798                                    ||' line index '|| l_line_index_tbl(j)
6799                                    ||' unit price '|| l_unit_price_tbl(j)
6800                                    ||' final adjusted_unit_price '|| l_adj_unit_price_tbl(j)
6801                                    ||' pricing_status_code '|| l_pricing_sts_code_tbl(j)
6802                                    ||' pricing_status_text '|| l_pricing_sts_txt_tbl(j));
6803         END IF;
6804         --			||' processed_flag '||l_processed_flag_tbl(j));
6805         --			||' processed_code '||l_processed_code_tbl(j));
6806         IF l_debug = FND_API.G_TRUE THEN
6807           QP_PREQ_GRP.engine_debug('----------------------------------');
6808         END IF;
6809         i := l_ldet_line_dtl_index_tbl.FIRST;
6810         WHILE i IS NOT NULL
6811           LOOP
6812           IF l_line_index_tbl(j) = l_ldet_line_index_tbl(i)
6813             THEN
6814             IF l_debug = FND_API.G_TRUE THEN
6815               QP_PREQ_GRP.engine_debug('Line detail Info '|| i
6816                                        ||' line detail index '|| l_ldet_line_dtl_index_tbl(i)
6817                                        ||' list_line_id '|| l_ldet_list_line_id_tbl(i)
6818                                        ||' operand '|| l_ldet_operand_value_tbl(i)
6819                                        ||' adjustment amount '|| l_ldet_adj_amt_tbl(i)
6820                                        ||' applied flag '|| l_ldet_applied_flag_tbl(i)
6821                                        ||' updated flag '|| l_ldet_updated_flag_tbl(i)
6822                                        ||' pricingstatus code '|| l_ldet_pricing_sts_code_tbl(i)
6823                                        ||' process code '|| l_ldet_process_code_tbl(i));
6824             END IF;
6825           END IF;
6826           i := l_ldet_line_dtl_index_tbl.NEXT(i);
6827         END LOOP;
6828         IF l_debug = FND_API.G_TRUE THEN
6829           QP_PREQ_GRP.engine_debug('----------------------------------');
6830         END IF;
6831         j := l_line_index_tbl.NEXT(j);
6832       END LOOP;
6833       IF l_debug = FND_API.G_TRUE THEN
6834         QP_PREQ_GRP.engine_debug('-------------------------------------------');
6835 
6836       END IF;
6837     END IF;
6838 
6839     IF l_debug = FND_API.G_TRUE THEN
6840       QP_PREQ_GRP.engine_debug('Updating the line details ------------------------');
6841 
6842     END IF;
6843     ---------------------------------------------------------------------
6844     --Update Adjustments
6845     ---------------------------------------------------------------------
6846     IF l_ldet_line_dtl_index_tbl.COUNT > 0
6847       THEN
6848       IF QP_PREQ_GRP.G_DEBUG_ENGINE = FND_API.G_TRUE
6849         THEN
6850         i := l_ldet_line_dtl_index_tbl.FIRST;
6851         WHILE i IS NOT NULL
6852           LOOP
6853           IF l_debug = FND_API.G_TRUE THEN
6854             QP_PREQ_GRP.engine_debug('line details: line index '
6855                                      || l_ldet_line_index_tbl(i) ||' detail index '
6856                                      || l_ldet_line_dtl_index_tbl(i) ||' operand '
6857                                      || l_ldet_operand_value_tbl(i) ||' adjamt '
6858                                      || l_ldet_adj_amt_tbl(i) ||' applied flag '
6859                                      || l_ldet_applied_flag_tbl(i) ||' pricing_status '
6860                                      || l_ldet_pricing_sts_code_tbl(i) ||' text '
6861                                      || l_ldet_pricing_sts_txt_tbl(i) ||' process code '
6862                                      || l_ldet_process_code_tbl(i) ||' list hdr id '
6863                                      || l_ldet_list_hdr_id_tbl(i) ||' adj type '
6864                                      || l_ldet_list_line_type_tbl(i) ||' adj id '
6865                                      || l_ldet_list_line_id_tbl(i) || ' list line id '
6866                                      || l_ldet_ordqty_operand_tbl(i) || ' Ord Qty Operand '
6867                                      || l_ldet_ordqty_adjamt_tbl(i) || 'Ord Qty Adj Amt');
6868             QP_PREQ_GRP.engine_debug('------------------------');
6869           END IF;
6870           i := l_ldet_line_dtl_index_tbl.NEXT(i);
6871         END LOOP;
6872       END IF;
6873 
6874       IF l_debug = FND_API.G_TRUE THEN
6875         QP_PREQ_GRP.engine_debug('line details: before update ');
6876       END IF;
6877       IF l_ldet_line_dtl_index_tbl.COUNT > 0
6878         THEN
6879         FORALL i IN l_ldet_line_dtl_index_tbl.FIRST..l_ldet_line_dtl_index_tbl.LAST
6880         UPDATE qp_npreq_ldets_tmp
6881         SET adjustment_amount = l_ldet_adj_amt_tbl(i),
6882                 operand_value = l_ldet_operand_value_tbl(i),
6883                 line_quantity = l_ldet_line_quantity_tbl(i),
6884                 applied_flag = l_ldet_applied_flag_tbl(i),
6885                 updated_flag = l_ldet_updated_flag_tbl(i),
6886                 pricing_status_code = l_ldet_pricing_sts_code_tbl(i),
6887                 pricing_status_text = l_ldet_pricing_sts_txt_tbl(i),
6888                 process_code = l_ldet_process_code_tbl(i),
6889                 calculation_code = l_ldet_calc_code_tbl(i),
6890                 order_qty_operand = l_ldet_ordqty_operand_tbl(i),
6891                 order_qty_adj_amt = nvl(l_ldet_ordqty_adjamt_tbl(i), l_ldet_adj_amt_tbl(i))
6892         WHERE line_detail_index = l_ldet_line_dtl_index_tbl(i)
6893 --                        AND line_index = l_ldet_line_index_tbl(i)
6894         AND   pricing_status_code <> G_STATUS_DELETED --[julin/4671446]
6895                 AND l_ldet_process_code_tbl(i) IN (G_STATUS_NEW,
6896                                                    G_STATUS_DELETED);
6897         IF l_debug = FND_API.G_TRUE THEN
6898           QP_PREQ_GRP.engine_debug('line details: before insert ');
6899         END IF;
6900       END IF; --l_ldet_line_dtl_index_tbl.count > 0
6901 
6902       FORALL i IN l_ldet_line_dtl_index_tbl.FIRST..l_ldet_line_dtl_index_tbl.LAST
6903       INSERT INTO qp_npreq_ldets_tmp
6904       (
6905        line_detail_index
6906        , line_index
6907        , line_detail_type_code
6908        , pricing_status_code
6909        , pricing_status_text
6910        , process_code
6911        , created_from_list_header_id
6912        , created_from_list_line_id
6913        , created_from_list_line_type
6914        , adjustment_amount
6915        , operand_value
6916        , modifier_level_code
6917        , price_break_type_code
6918        , line_quantity
6919        , operand_calculation_code
6920        , pricing_group_sequence
6921        , created_from_list_type_code
6922        , applied_flag
6923        , limit_code
6924        , limit_text
6925        , list_line_no
6926        , charge_type_code
6927        , charge_subtype_code
6928        , updated_flag
6929        , automatic_flag
6930        , pricing_phase_id
6931        , calculation_code
6932        , order_qty_operand
6933        , order_qty_adj_amt
6934        )
6935 --		VALUES
6936       SELECT
6937       l_ldet_line_dtl_index_tbl(i)
6938       , l_ldet_line_index_tbl(i)
6939       , 'NULL'
6940       , l_ldet_pricing_sts_code_tbl(i)
6941       , l_ldet_pricing_sts_txt_tbl(i)
6942       , l_ldet_process_code_tbl(i)
6943       , l_ldet_list_hdr_id_tbl(i)
6944       , l_ldet_list_line_id_tbl(i)
6945       , l_ldet_list_line_type_tbl(i)
6946       , l_ldet_adj_amt_tbl(i)
6947       , l_ldet_operand_value_tbl(i)
6948       , l_ldet_modifier_level_tbl(i)
6949       , l_ldet_price_break_type_tbl(i)
6950       , l_ldet_line_quantity_tbl(i)
6951       , l_ldet_operand_calc_tbl(i)
6952       , l_ldet_pricing_grp_seq_tbl(i)
6953       , l_ldet_list_type_code_tbl(i)
6954       , l_ldet_applied_flag_tbl(i)
6955       , l_ldet_limit_code_tbl(i)
6956       , l_ldet_limit_text_tbl(i)
6957       , l_ldet_list_line_no_tbl(i)
6958       , l_ldet_charge_type_tbl(i)
6959       , l_ldet_charge_subtype_tbl(i)
6960       , l_ldet_updated_flag_tbl(i)
6961       , l_ldet_automatic_flag_tbl(i)
6962       , l_ldet_pricing_phase_id_tbl(i)
6963       , l_ldet_calc_code_tbl(i)
6964       , l_ldet_ordqty_operand_tbl(i)
6965       , nvl(l_ldet_ordqty_adjamt_tbl(i), l_ldet_adj_amt_tbl(i))
6966       FROM dual
6967       WHERE l_ldet_process_code_tbl(i) = G_STATUS_UPDATED;
6968     END IF;
6969 
6970     ---------------------------------------------------------------------
6971     IF l_debug = FND_API.G_TRUE THEN
6972       QP_PREQ_GRP.engine_debug('Updating the line info ------------------------');
6973     END IF;
6974     ---------------------------------------------------------------------
6975     --Update Order Lines
6976     ---------------------------------------------------------------------
6977 
6978 
6979     IF l_line_index_tbl.COUNT > 0
6980       THEN
6981       FOR i IN l_line_index_tbl.FIRST..l_line_index_tbl.LAST
6982         LOOP
6983         IF l_debug = FND_API.G_TRUE THEN
6984           QP_PREQ_GRP.engine_debug('line info '|| l_line_index_tbl(i)
6985                                    ||' unit price '|| l_unit_price_tbl(i)
6986                                    ||' adj unit price '|| l_adj_unit_price_tbl(i));
6987         END IF;
6988       END LOOP;
6989       FOR i IN l_line_index_tbl.FIRST..l_line_index_tbl.LAST
6990       LOOP
6991 
6992       --===[prarasto:Post Round] Start : Calculate rounded values ==--
6993       l_adjusted_unit_price_ur(i) := l_adj_unit_price_tbl(i);
6994       l_unit_selling_price_ur(i) := l_ordqty_selling_price_tbl(i);
6995 
6996     IF (G_ROUND_INDIVIDUAL_ADJ not in ( G_NO_ROUND , G_POST_ROUND )) AND (l_rounding_factor_tbl(i) is not null)
6997     THEN
6998       IF (l_catchweight_qty_tbl(i) is null) and (l_actual_order_qty_tbl(i) is not null) THEN
6999             l_extended_selling_price_ur(i) :=  round(l_unit_selling_price_ur(i), - 1 * l_rounding_factor_tbl(i))
7000 	    					* l_actual_order_qty_tbl(i);
7001       ELSE
7002             l_extended_selling_price_ur(i) := round(l_unit_selling_price_ur(i), - 1 * l_rounding_factor_tbl(i))
7003 	    					* l_ordered_qty_tbl(i);
7004       END IF;
7005     ELSE
7006       IF (l_catchweight_qty_tbl(i) is null) and (l_actual_order_qty_tbl(i) is not null) THEN
7007         l_extended_selling_price_ur(i) := l_unit_selling_price_ur(i) * l_actual_order_qty_tbl(i);
7008       ELSE
7009         l_extended_selling_price_ur(i) := l_unit_selling_price_ur(i) * l_ordered_qty_tbl(i);
7010       END IF;
7011     END IF;
7012 
7013       IF (G_ROUND_INDIVIDUAL_ADJ = G_NO_ROUND) or (l_rounding_factor_tbl(i) is null) THEN
7014 --        l_adj_unit_price_tbl(i) := l_adjusted_unit_price_ur(i);
7015         l_unit_selling_price(i) := l_unit_selling_price_ur(i);
7016         l_extended_selling_price(i) := l_extended_selling_price_ur(i);
7017       ELSE
7018         l_adj_unit_price_tbl(i) := round(l_adjusted_unit_price_ur(i), - 1 * l_rounding_factor_tbl(i));
7019         l_ordqty_unit_price_tbl(i) := round(l_ordqty_unit_price_tbl(i),  - 1 * l_rounding_factor_tbl(i));
7020         l_unit_selling_price(i) := round(l_unit_selling_price_ur(i),  - 1 * l_rounding_factor_tbl(i));
7021         l_extended_selling_price(i) := round(l_extended_selling_price_ur(i),  - 1 * l_rounding_factor_tbl(i));
7022       END IF;
7023 
7024           IF l_debug = FND_API.G_TRUE THEN
7025 	   QP_PREQ_GRP.engine_debug('Extended selling price unrounded : '||l_extended_selling_price_ur(i));
7026 	   QP_PREQ_GRP.engine_debug('Extended selling price : '||l_extended_selling_price(i));
7027 	   QP_PREQ_GRP.engine_debug('Unit selling price unrounded : '||l_unit_selling_price_ur(i));
7028 	   QP_PREQ_GRP.engine_debug('Unit selling price : '||l_unit_selling_price(i));
7029 	   QP_PREQ_GRP.engine_debug('Adjusted unit price unrounded : '||l_adjusted_unit_price_ur(i));
7030 	   QP_PREQ_GRP.engine_debug('Adjusted unit price : '||l_adj_unit_price_tbl(i));
7031 	   QP_PREQ_GRP.engine_debug('Line unit price : '||l_ordqty_unit_price_tbl(i));
7032           END IF; --l_debug
7033       --===[prarasto:Post Round] End : Calculate rounded values ==--
7034 
7035 
7036       UPDATE qp_npreq_lines_tmp
7037       SET unit_price = l_unit_price_tbl(i),
7038           adjusted_unit_price = l_adj_unit_price_tbl(i),        --[prarasto:Post Round]
7039           --adjusted_unit_price_ur = l_adjusted_unit_price_ur(i), --[prarasto:Post Round], [julin/postround] redesign
7040 /*                                    decode(G_ROUND_INDIVIDUAL_ADJ,
7041                                        G_NO_ROUND, l_adj_unit_price_tbl(i),
7042                                        decode(l_rounding_factor_tbl(i),
7043                                               NULL, l_adj_unit_price_tbl(i),
7044                                               round(l_adj_unit_price_tbl(i),  - 1 * l_rounding_factor_tbl(i)))),
7045 */
7046 --                  updated_adjusted_unit_price = l_upd_adj_unit_price_tbl(i)
7047           pricing_status_code = l_pricing_sts_code_tbl(i),
7048           pricing_status_text = l_pricing_sts_txt_tbl(i),
7049           processed_flag = G_PROCESSED,
7050           line_unit_price = l_ordqty_unit_price_tbl(i),         --[prarasto:Post Round]
7051 /*                                   decode(G_ROUND_INDIVIDUAL_ADJ,
7052                                    G_NO_ROUND, l_ordqty_unit_price_tbl(i),
7053                                    decode(l_rounding_factor_tbl(i),
7054                                           NULL, l_ordqty_unit_price_tbl(i),
7055                                           round(l_ordqty_unit_price_tbl(i),  - 1 * l_rounding_factor_tbl(i)))),
7056 */
7057           order_uom_selling_price = l_unit_selling_price(i), --[prarasto:Post Round]
7058 /*                                           decode(G_ROUND_INDIVIDUAL_ADJ,
7059                                            G_NO_ROUND, l_ordqty_selling_price_tbl(i),
7060                                            decode(l_rounding_factor_tbl(i),
7061                                                   NULL, l_ordqty_selling_price_tbl(i),
7062                                                   round(l_ordqty_selling_price_tbl(i),  - 1 * l_rounding_factor_tbl(i)))),
7063 */
7064           --order_uom_selling_price_ur = l_unit_selling_price_ur(i),  --[prarasto:Post Round], [julin/postround] redesign
7065           extended_price = l_extended_selling_price(i),             --[prarasto:Post Round]
7066           --extended_selling_price_ur = l_extended_selling_price_ur(i), --[prarasto:Post Round], [julin/postround] redesign
7067           QUALIFIERS_EXIST_FLAG = G_CALCULATE_ONLY
7068       WHERE line_index = l_line_index_tbl(i);
7069       --                AND l_processed_code_tbl(i) = G_STATUS_NEW;
7070 
7071       END LOOP; --[prarasto:Post Round]
7072     END IF;
7073     ---------------------------------------------------------------------
7074 
7075     --	QP_CLEANUP_ADJUSTMENTS_PVT.cleanup_adjustments('ONTVIEW',G_YES);
7076 
7077 
7078     --X_RETURN_STATUS:= FND_API.G_RET_STS_SUCCESS;
7079     --X_RETURN_STATUS_TEXT:= l_routine||' SUCCESS ';
7080 
7081     IF l_debug = FND_API.G_TRUE THEN
7082       QP_PREQ_GRP.engine_debug('end calculate price');
7083     END IF;
7084   EXCEPTION
7085     WHEN Calculate_exc THEN
7086       IF l_debug = FND_API.G_TRUE THEN
7087         QP_PREQ_GRP.engine_debug('Error in calculate_price'|| X_RETURN_STATUS_TEXT);
7088       END IF;
7089       X_RETURN_STATUS := FND_API.G_RET_STS_ERROR;
7090     WHEN OTHERS THEN
7091       IF l_debug = FND_API.G_TRUE THEN
7092         QP_PREQ_GRP.engine_debug('Error in calculate_price'|| SQLERRM);
7093       END IF;
7094       X_RETURN_STATUS := FND_API.G_RET_STS_ERROR;
7095       X_RETURN_STATUS_TEXT := l_routine || SQLERRM;
7096 
7097   END CALCULATE_PRICE;
7098 
7099   --this is used in pl/sql code path for OKC/OKS/ASO
7100   --this is called from QP_PREQ_PUB.price_request
7101 
7102   PROCEDURE CALCULATE_PRICE(p_rounding_flag IN VARCHAR2,
7103                             x_return_status OUT NOCOPY VARCHAR2,
7104                             x_return_status_text OUT NOCOPY VARCHAR2) IS
7105 
7106   /*
7107 INDX,QP_PREQ_PUB.calculate_price.l_line_cur,qp_npreq_lines_tmp_N2,LINE_TYPE_CODE,1
7108 */
7109   -- for bug 3820859, to start with adjusted_unit_price should be same as unit_price
7110   -- if not, then the same discount is getting applied twice if limit profile is set, because discounts calculations happens twice -
7111   -- once from QP_PREQ_GRP and then from QP_PREQ_PUB
7112   CURSOR l_line_cur IS SELECT
7113     line.line_index
7114     , line.unit_price adjusted_unit_price -- bug 3820859
7115     , line.unit_price
7116     , line.processed_flag
7117     , line.processed_code
7118     , line.updated_adjusted_unit_price
7119     , line.rounding_factor
7120     , line.pricing_status_code, line.pricing_status_text
7121     FROM qp_npreq_lines_tmp line
7122     WHERE
7123     line.price_flag IN (G_YES, G_PHASE, G_CALCULATE_ONLY)
7124     AND line.line_type_code IN (G_LINE_LEVEL, G_ORDER_LEVEL)
7125     AND line.pricing_status_code IN (G_STATUS_UPDATED
7126                                      , G_STATUS_GSA_VIOLATION
7127                                      , G_STATUS_UNCHANGED)
7128     AND nvl(processed_code, '0') <> G_BY_ENGINE
7129     AND line.usage_pricing_type IN
7130     (QP_PREQ_GRP.G_BILLING_TYPE, QP_PREQ_GRP.G_REGULAR_USAGE_TYPE);
7131 
7132   /*
7133 INDX,QP_PREQ_PUB.calculate_price.l_bucket_price_cur,qp_npreq_lines_tmp_N1,LINE_INDEX,1
7134 INDX,QP_PREQ_PUB.calculate_price.l_bucket_price_cur,qp_npreq_lines_tmp_N1,LINE_TYPE_CODE,2
7135 INDX,QP_PREQ_PUB.calculate_price.l_bucket_price_cur,qp_npreq_lines_tmp_N2,LINE_TYPE_CODE,1
7136 INDX,QP_PREQ_PUB.calculate_price.l_bucket_price_cur,qp_npreq_ldets_tmp_N3,LINE_INDEX,1
7137 INDX,QP_PREQ_PUB.calculate_price.l_bucket_price_cur,qp_npreq_ldets_tmp_N3,CREATED_FROM_LIST_LINE_TYPE,2
7138 */
7139   CURSOR l_bucket_price_cur(p_line_index NUMBER) IS -- 2892848
7140     SELECT    ldet.created_from_list_line_id
7141             , line.line_index line_ind
7142             , ldet.line_detail_index
7143             , ldet.created_from_list_line_type
7144             , ldet.modifier_level_code
7145             , ldet.applied_flag
7146             , 1.0 amount_changed
7147             , line.adjusted_unit_price
7148 --changed to make sure lumpsum on order level frt charge divide by 1 quantity
7149             , ldet.line_quantity priced_quantity
7150             , line.priced_quantity priced_qty
7151             , ldet.group_quantity
7152             , ldet.group_amount
7153             , line.updated_adjusted_unit_price
7154             , ldet.automatic_flag
7155             , ldet.override_flag
7156             , ldet.pricing_group_sequence
7157             , ldet.operand_calculation_code
7158             , ldet.operand_value
7159             , ldet.adjustment_amount
7160             , line.unit_price
7161             , ldet.accrual_flag
7162             , ldet.updated_flag
7163             , ldet.process_code
7164             , ldet.pricing_status_code
7165             , ldet.pricing_status_text
7166             , ldet.price_break_type_code
7167             , ldet.charge_type_code
7168             , ldet.charge_subtype_code
7169             , line.rounding_factor
7170             , G_LINE_LEVEL line_type
7171             , 'N' is_max_frt
7172             , ldet.net_amount_flag
7173     FROM qp_npreq_ldets_tmp ldet, qp_npreq_lines_tmp line
7174     --where line.line_index = p_line_index -- 2892848
7175     WHERE ldet.line_index = line.line_index -- 2892848
7176             --and ldet.line_index = line.line_index --2892848
7177             AND line.price_flag IN (G_YES, G_PHASE, G_CALCULATE_ONLY)
7178             AND ldet.process_code = G_STATUS_NEW
7179             AND (ldet.applied_flag = G_YES
7180                  OR ldet.created_from_list_line_type = G_FREIGHT_CHARGE)
7181             AND ldet.created_from_list_line_type IN (G_DISCOUNT
7182                                                      , G_SURCHARGE, G_PRICE_BREAK_TYPE, G_FREIGHT_CHARGE)
7183             AND nvl(ldet.created_from_list_type_code, 'NULL') NOT IN
7184                     (G_PRICE_LIST_HEADER, G_AGR_LIST_HEADER)
7185             AND ldet.line_detail_index NOT IN
7186                     (SELECT rltd.related_line_detail_index
7187                      FROM qp_npreq_rltd_lines_tmp rltd
7188                      WHERE rltd.pricing_status_code = G_STATUS_NEW
7189                      AND rltd.relationship_type_code = G_PBH_LINE)
7190             -- next 4 conditions added for 3435240
7191             AND line.line_type_code = G_LINE_LEVEL
7192             AND line.pricing_status_code IN (G_STATUS_UPDATED
7193                                              , G_STATUS_GSA_VIOLATION
7194                                              , G_STATUS_UNCHANGED)
7195             AND nvl(line.processed_code, '0') <> G_BY_ENGINE
7196             AND line.usage_pricing_type IN
7197                     (QP_PREQ_GRP.G_BILLING_TYPE, QP_PREQ_GRP.G_REGULAR_USAGE_TYPE)
7198     UNION
7199     SELECT    ldet.created_from_list_line_id
7200             , line.line_index line_ind
7201             , ldet.line_detail_index
7202             , ldet.created_from_list_line_type
7203             , ldet.modifier_level_code
7204             , ldet.applied_flag
7205             , 1.0 amount_changed
7206             , line.adjusted_unit_price
7207 --changed to make sure lumpsum on order level frt charge divide by 1 quantity
7208             , ldet.line_quantity priced_quantity
7209             , line.priced_quantity priced_qty
7210             , ldet.group_quantity
7211             , ldet.group_amount
7212             , line.updated_adjusted_unit_price
7213             , ldet.automatic_flag
7214             , ldet.override_flag
7215             , ldet.pricing_group_sequence
7216             , ldet.operand_calculation_code
7217             , ldet.operand_value
7218             , ldet.adjustment_amount
7219             , line.unit_price
7220             , ldet.accrual_flag
7221             , ldet.updated_flag
7222             , ldet.process_code
7223             , ldet.pricing_status_code
7224             , ldet.pricing_status_text
7225             , ldet.price_break_type_code
7226             , ldet.charge_type_code
7227             , ldet.charge_subtype_code
7228             , line.rounding_factor
7229             , G_ORDER_LEVEL line_type
7230             , 'N' is_max_frt
7231             , ldet.net_amount_flag
7232     FROM qp_npreq_ldets_tmp ldet, qp_npreq_lines_tmp line
7233                                , qp_npreq_lines_tmp line1
7234     --where line.line_index = p_line_index -- 2892848
7235             --and ldet.line_index = line1.line_index -- 2892848
7236             WHERE ldet.line_index = line1.line_index -- 2892848
7237             AND line1.line_type_code = G_ORDER_LEVEL
7238             AND line1.price_flag IN (G_YES, G_PHASE, G_CALCULATE_ONLY)
7239             AND line.line_type_code = G_LINE_LEVEL
7240             AND ldet.process_code = G_STATUS_NEW
7241             AND (ldet.applied_flag = G_YES
7242                  OR ldet.created_from_list_line_type = G_FREIGHT_CHARGE)
7243             AND ldet.created_from_list_line_type IN (G_DISCOUNT,
7244                                                      G_SURCHARGE, G_PRICE_BREAK_TYPE, G_FREIGHT_CHARGE)
7245             AND nvl(ldet.created_from_list_type_code, 'NULL') NOT IN
7246                     (G_PRICE_LIST_HEADER, G_AGR_LIST_HEADER)
7247             AND ldet.line_detail_index NOT IN
7248                     (SELECT rltd.related_line_detail_index
7249                      FROM qp_npreq_rltd_lines_tmp rltd
7250                      WHERE rltd.pricing_status_code = G_STATUS_NEW
7251                      AND rltd.relationship_type_code = G_PBH_LINE)
7252             -- next 4 conditions added for 3435240
7253             AND line.price_flag IN (G_YES, G_PHASE, G_CALCULATE_ONLY)
7254             AND line.pricing_status_code IN (G_STATUS_UPDATED
7255                                              , G_STATUS_GSA_VIOLATION
7256                                              , G_STATUS_UNCHANGED)
7257             AND nvl(line.processed_code, '0') <> G_BY_ENGINE
7258             AND line.usage_pricing_type IN
7259                     (QP_PREQ_GRP.G_BILLING_TYPE, QP_PREQ_GRP.G_REGULAR_USAGE_TYPE)
7260     --order by line_ind,pricing_group_sequence; -- 2892848
7261     ORDER BY pricing_group_sequence, line_ind; -- 2829848
7262 
7263   CURSOR l_chk_backcal_adj_exist_cur(p_line_index NUMBER) IS
7264     SELECT ldet.line_detail_index
7265             , ldet.adjustment_amount
7266     FROM qp_npreq_ldets_tmp ldet
7267     WHERE line_index = p_line_index
7268     AND calculation_code = G_BACK_CALCULATE
7269     AND applied_flag = G_YES
7270     AND updated_flag = G_YES;
7271 
7272   -- net_amount 2720717
7273   CURSOR l_net_amount_flag_cur (p_list_line_id NUMBER) IS
7274     SELECT net_amount_flag
7275     FROM qp_list_lines
7276     WHERE list_line_id = p_list_line_id;
7277 
7278   l_bucket_price_rec l_bucket_price_cur%ROWTYPE;
7279   l_line_rec l_line_cur%ROWTYPE;
7280   l_return_adjustment NUMBER := g_miss_num; --FND_API.G_MISS_NUM;
7281   l_sub_total_price NUMBER := g_miss_num; --FND_API.G_MISS_NUM;
7282   l_list_price NUMBER := g_miss_num; --FND_API.G_MISS_NUM;
7283   --l_adjusted_price NUMBER := g_miss_num;--FND_API.G_MISS_NUM; -- 2892848
7284 
7285 
7286 
7287   TYPE LINES_TBL_TYPE IS TABLE OF l_line_rec%TYPE INDEX BY BINARY_INTEGER;
7288   l_lines_tbl LINES_TBL_TYPE;
7289 
7290   TYPE LBUCKET_TBL_TYPE IS TABLE OF l_bucket_price_rec%TYPE INDEX BY BINARY_INTEGER;
7291   l_ldet_tbl LBUCKET_TBL_TYPE;
7292   l_frt_charge_tbl FRT_CHARGE_TBL;
7293   l_back_calc_ret_rec back_calc_rec_type;
7294 
7295   BACK_CALCULATE BOOLEAN := TRUE;
7296 
7297   --l_prev_line_index NUMBER := g_miss_num;--FND_API.G_MISS_NUM;
7298   l_prev_line_index NUMBER :=  - 9999; -- 2892848, SL_latest
7299   l_1st_bucket VARCHAR2(1) := 'N';
7300   l_prev_adj NUMBER := g_miss_num; --FND_API.G_MISS_NUM;
7301   l_sign NUMBER := g_miss_num; --FND_API.G_MISS_NUM;
7302   l_amount_changed NUMBER := g_miss_num; --FND_API.G_MISS_NUM;
7303   l_adjustment_amount NUMBER := g_miss_num; --FND_API.G_MISS_NUM;
7304   l_operand_value NUMBER := g_miss_num; --FND_API.G_MISS_NUM;
7305   l_BACK_CALCULATE_START_TYPE VARCHAR2(30) := G_BACK_CALCULATION_STS_NONE; -- 2892848
7306   --l_prev_bucket qp_npreq_ldets_tmp.PRICING_GROUP_SEQUENCE%TYPE := g_miss_num;--FND_API.G_MISS_NUM;
7307   l_back_calc_dtl_index NUMBER := 0;
7308   l_back_calc_adj_amt NUMBER := 0;
7309 
7310   l_ldet_index_tbl QP_PREQ_GRP.NUMBER_TYPE;
7311   l_line_index NUMBER := g_miss_num; --FND_API.G_MISS_NUM;
7312   l_calc_quantity NUMBER := 0;
7313 
7314   --added to calculate order level adjustments' adj amt
7315   l_ord_dtl_index_tbl QP_PREQ_GRP.NUMBER_TYPE;
7316   l_ord_adj_amt_tbl QP_PREQ_GRP.NUMBER_TYPE;
7317 
7318   l_updated_adj_unit_price_ur QP_PREQ_GRP.NUMBER_TYPE; --[prarasto:Post Round]
7319   l_adjusted_unit_price_ur QP_PREQ_GRP.NUMBER_TYPE;    --[prarasto:Post Round]
7320 
7321   i NUMBER := 0;
7322   j NUMBER := 0;
7323   k NUMBER := 0;
7324   x NUMBER := 0;
7325   m NUMBER := 0;
7326 
7327   Calculate_Exc EXCEPTION;
7328 
7329   --begin 2388011
7330   l_req_value_per_unit NUMBER; --2388011 priya added this variable
7331   l_total_value NUMBER; --group_value --2388011 priya added this variable
7332   l_bucketed_adjustment NUMBER; --2388011 priya added this variable
7333   --end 2388011
7334 
7335   --net_amount 2720717
7336   --l_pbh_net_adj_amount NUMBER := 0; -- sum up adj amts  -- 2892848 SL_latest
7337   --l_pbh_prev_net_adj_amount NUMBER := 0; -- whenever bucket change - 2892848 SL_latest
7338 
7339   l_pbh_pricing_attr VARCHAR2(240);
7340 
7341   l_adjusted_price NUMBER := NULL; --2892848 so we can nvl(l_adjusted_price, unit_price) when assign l_sub_total_price
7342   l_prev_bucket NUMBER :=  - 9999; --2892848
7343   -- begin 2892848, net amount
7344   l_qualifier_value NUMBER := NULL; -- to qualify PBH
7345   s PLS_INTEGER := 0; -- counter for l_line_bucket_detail_tbl
7346   l_lg_adj_amt NUMBER := NULL; -- 2892848
7347   --l_prev_lg_adj_amt                  NUMBER:=0; -- 2892848 SL_latest
7348   line_change BOOLEAN := NULL;
7349 
7350   /* SL latest
7351 -- for linegroup
7352 TYPE bucket_adj_amt_tbl IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
7353 l_bucket_adj_amt_tbl bucket_adj_amt_tbl;
7354 
7355 -- for line level
7356 TYPE bucket_index_adj_tbl IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
7357 l_bucket_index_adj_tbl bucket_index_adj_tbl;
7358 
7359 TYPE prev_bucket_index_adj_tbl IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
7360 l_prev_bucket_index_adj_tbl prev_bucket_index_adj_tbl;
7361 */
7362   --begin SL_latest
7363   CURSOR l_net_mod_index_cur(p_list_line_id NUMBER) IS
7364     SELECT DISTINCT ldet.line_index
7365     FROM qp_npreq_ldets_tmp ldet
7366     WHERE ldet.created_from_list_line_id = p_list_line_id
7367     AND pricing_status_code IN (G_STATUS_NEW, G_STATUS_UPDATED, G_STATUS_UNCHANGED);
7368 
7369   l_line_bucket_amt NUMBER := NULL;
7370   l_lg_net_amt NUMBER := NULL;
7371   l_prev_qty NUMBER := 0;
7372 
7373   -- [julin/4112395/4220399]
7374   l_applied_req_value_per_unit NUMBER := 0;
7375   l_prod_line_bucket_amt NUMBER := 0;
7376   l_lg_prod_net_amt NUMBER := 0;
7377 
7378   -- record bucketed USP*qtyfor each line_index upon bucket change
7379   TYPE bucket_amt_tbl IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
7380   l_bucket_amt_tbl bucket_amt_tbl;
7381   l_prev_bucket_amt_tbl bucket_amt_tbl;
7382 
7383   -- hash table of list_line_id and its corresponding lg_net_amt
7384   TYPE mod_lg_net_amt_tbl IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
7385   l_mod_lg_net_amt_tbl mod_lg_net_amt_tbl;
7386   l_mod_lg_prod_net_amt_tbl mod_lg_net_amt_tbl; -- [julin/4112395/4220399]
7387 
7388 
7389   -- end SL_latest
7390   -- end 2892848
7391 
7392   l_return_status VARCHAR2(30);
7393   l_return_status_text VARCHAR2(240);
7394   l_routine VARCHAR2(50) := 'Routine :QP_PREQ_PUB.Calculate_price ';
7395 
7396   -- [julin/3265308] net amount calculation 'P', match product only.
7397   -- given a line line id, find the product attribute and context for
7398   -- the modifier and match all request lines with that context/attr
7399   -- pair.  exclude logic included.  price_flag clause included to
7400   -- ignore free goods.
7401   CURSOR l_prod_attr_info(p_list_line_id NUMBER) IS
7402     SELECT DISTINCT qla.line_index, ql.priced_quantity, ql.unit_price
7403     FROM qp_preq_line_attrs_tmp qla, qp_pricing_attributes qpa, qp_preq_lines_tmp ql
7404     WHERE qpa.list_line_id = p_list_line_id
7405     AND qla.context = qpa.product_attribute_context
7406     AND qla.attribute = qpa.product_attribute
7407     AND qla.value_from = qpa.product_attr_value
7408     AND qla.line_index = ql.line_index
7409     AND ql.price_flag <> G_PHASE
7410     AND ql.pricing_status_code IN (QP_PREQ_PUB.G_STATUS_UPDATED,
7411                                    QP_PREQ_PUB.G_STATUS_GSA_VIOLATION,
7412                                    QP_PREQ_PUB.G_STATUS_UNCHANGED)
7413     AND NOT EXISTS (SELECT qla2.line_index
7414                     FROM qp_preq_line_attrs_tmp qla2, qp_pricing_attributes qpa2
7415                     WHERE qpa2.list_line_id = p_list_line_id
7416                     AND qpa2.excluder_flag = G_YES
7417                     AND qla2.line_index = qla.line_index
7418                     AND qla2.context = qpa2.product_attribute_context
7419                     AND qla2.attribute = qpa2.product_attribute
7420                     AND qla2.value_from = qpa2.product_attr_value);
7421 
7422   l_netamt_flag VARCHAR2(1);
7423   l_bucketed_flag VARCHAR2(1);
7424 
7425   BEGIN
7426 
7427     l_debug := QP_PREQ_GRP.G_DEBUG_ENGINE;
7428     IF l_debug = FND_API.G_TRUE THEN
7429       QP_PREQ_GRP.ENGINE_DEBUG('begin calculate price');
7430       QP_PREQ_GRP.ENGINE_DEBUG('SL, this is Oracle IT path'); -- 2892848
7431 
7432     END IF;
7433 
7434 --4900095 call Determine_svc_item_quantity
7435  IF QP_PREQ_GRP.G_Service_line_qty_tbl.COUNT = 0 THEN
7436    Determine_svc_item_quantity;
7437  END IF;
7438 
7439 
7440 
7441     --reset order lvl adjustments' adj amt
7442     l_ord_dtl_index_tbl.DELETE;
7443     l_ord_adj_amt_tbl.DELETE;
7444     --l_bucket_adj_amt_tbl.delete; --SL_latest 2892848
7445     --l_bucket_index_adj_tbl.delete; --2892848
7446     --l_prev_bucket_index_adj_tbl.delete; --2892848
7447     l_bucket_amt_tbl.DELETE; -- 2892848 SL_latest
7448     l_prev_bucket_amt_tbl.DELETE;
7449     l_mod_lg_net_amt_tbl.DELETE; -- 2892848 SL_latest
7450     l_mod_lg_prod_net_amt_tbl.DELETE; -- [julin/4112395/4220399]
7451 
7452     l_lines_tbl.DELETE;
7453     l_ldet_tbl.DELETE;
7454     FOR l_line_rec IN l_line_cur
7455       LOOP
7456       --The freight_charge functionality to return worst freight charge
7457       --has been coded with an assumption that only one line is dealt
7458       --with in the l_bucket_price_cur below
7459       l_lines_tbl(l_line_rec.line_index) := l_line_rec; -- bug 3306349
7460 
7461       IF l_debug = FND_API.G_TRUE THEN
7462         QP_PREQ_GRP.ENGINE_DEBUG('Gather lines passed: Line_Index '|| l_line_rec.line_index ||
7463                                  ' list price '|| l_line_rec.unit_price ||
7464                                  ' adjusted unit price '|| l_line_rec.adjusted_unit_price ||
7465                                  ' updated adjusted unit price '|| l_line_rec.updated_adjusted_unit_price);
7466 
7467       END IF;
7468     END LOOP;
7469 
7470     /* shu 2892848 , move this loop head to be after l_bucket_price_cur loop end
7471 j:=0;
7472 
7473 	j:= l_lines_tbl.FIRST;
7474 	While j IS NOT NULL LOOP
7475 	*/
7476 
7477     -- net_amount_new, 2720717
7478     -- reset for every request line
7479     --l_pbh_net_adj_amount:= 0; -- 2892848
7480     --l_pbh_prev_net_adj_amount:=0; -- 2892848
7481 
7482     BACK_CALCULATE := FALSE;
7483     --l_list_price := l_lines_tbl(j).unit_price; -- 2892848
7484     --l_sub_total_price := l_list_price; -- 2892848
7485     --l_adjusted_price := l_list_price; -- 2892848
7486     --l_prev_bucket := g_miss_num;--FND_API.G_MISS_NUM; -- 2892848
7487     l_amount_changed := 0;
7488     l_BACK_CALCULATE_START_TYPE := G_BACK_CALCULATION_STS_NONE;
7489     l_return_status := '';
7490     l_return_status_text := '';
7491 
7492     IF l_debug = FND_API.G_TRUE THEN
7493       /* 2892848
7494               QP_PREQ_GRP.ENGINE_DEBUG('************************ looping through request lines');
7495 	      QP_PREQ_GRP.ENGINE_DEBUG('Processing
7496 	        Line Index'||l_lines_tbl(j).line_index||
7497 		' list price '||l_lines_tbl(j).unit_price||
7498 		' updated adjusted price '||l_lines_tbl(j).updated_adjusted_unit_price);
7499 */
7500       QP_PREQ_GRP.ENGINE_DEBUG('Display price: price '
7501                                                     || l_list_price ||' sub-t '|| l_sub_total_price
7502                                                     ||' adj price '|| l_adjusted_price);
7503 
7504     END IF; -- END IF l_debug
7505 
7506     l_frt_charge_tbl.DELETE;
7507     l_ldet_tbl.DELETE;
7508 
7509     i := 0; -- modifier lines in ldets
7510     --OPEN l_bucket_price_cur(l_lines_tbl(j).line_index);
7511     OPEN l_bucket_price_cur(1); -- 2892848
7512     LOOP -- process adjustments for each request line
7513       FETCH l_bucket_price_cur INTO l_bucket_price_rec;
7514 
7515       i := i + 1;
7516 
7517       EXIT WHEN l_bucket_price_cur%NOTFOUND;
7518 
7519       -- begin 2892848
7520       -- ASK PRIYA see if there is a way to tell if line is from calling application???
7521       -- obtain net_adj_amount_flag from qp_list_lines table if null,
7522       -- since it may not be passed from calling application
7523       IF l_bucket_price_rec.net_amount_flag IS NULL THEN -- get it from setup just in case
7524         OPEN l_net_amount_flag_cur(l_bucket_price_rec.created_from_list_line_id);
7525         FETCH l_net_amount_flag_cur INTO l_bucket_price_rec.net_amount_flag;
7526         CLOSE l_net_amount_flag_cur;
7527       END IF;
7528       l_return_adjustment := 0; -- diff other path ???
7529       -- end 2892848
7530 
7531       IF l_debug = FND_API.G_TRUE THEN
7532         QP_PREQ_GRP.ENGINE_DEBUG('------------------- looping through ldet lines');
7533         QP_PREQ_GRP.ENGINE_DEBUG('Processing Adjustments:
7534                                  line index '|| l_bucket_price_rec.line_ind ||
7535                                  ' list line id '|| l_bucket_price_rec.created_from_list_line_id ||
7536                                  ' bucket '|| l_bucket_price_rec.pricing_group_sequence ||
7537                                  ' net amount flag '|| l_bucket_price_rec.net_amount_flag ||  -- 2892848
7538                                  ' override_flag '|| l_bucket_price_rec.override_flag ||
7539                                  ' automatic '|| l_bucket_price_rec.automatic_flag ||
7540                                  ' line_type '|| l_bucket_price_rec.line_type);
7541 
7542       END IF;
7543 
7544 
7545       IF l_bucket_price_rec.created_from_list_line_type = G_DISCOUNT
7546         AND l_bucket_price_rec.operand_calculation_code <> G_NEWPRICE_DISCOUNT THEN
7547         l_sign :=  - 1;
7548       ELSE
7549         l_sign := 1;
7550       END IF;
7551 
7552       ------------------NET AMT STUFF, SL_latest
7553       -- begin 2892848
7554       -- ldet lines are ordered by bucket, line index
7555       -- l_sub_total_price is bucketed unit price, l_adjusted_unit_price is current USP
7556 
7557       -- defaults
7558       IF l_lines_tbl.EXISTS(l_bucket_price_rec.line_ind) THEN
7559         l_adjusted_price := nvl(l_lines_tbl(l_bucket_price_rec.line_ind).adjusted_unit_price, l_lines_tbl(l_bucket_price_rec.line_ind).unit_price);
7560         --l_sub_total_price := nvl(l_lines_tbl(l_bucket_price_rec.line_ind).unit_price, 0); --Bug No: 	7323594
7561       ELSE
7562         l_adjusted_price := 0;
7563         l_sub_total_price := 0;
7564       END IF;
7565 
7566       -- use original list_price for null bucket modifiers or
7567       -- use USP as l_sub_total_price for bucket modifiers
7568       IF (l_bucket_price_rec.pricing_group_sequence IS NULL OR
7569           l_bucket_price_rec.pricing_group_sequence = 0) THEN
7570 
7571         IF l_lines_tbl.EXISTS(l_bucket_price_rec.line_ind) THEN
7572           l_adjusted_price := nvl(l_lines_tbl(l_bucket_price_rec.line_ind).adjusted_unit_price, l_lines_tbl(l_bucket_price_rec.line_ind).unit_price);
7573           l_sub_total_price := nvl(l_lines_tbl(l_bucket_price_rec.line_ind).unit_price, 0);
7574         ELSE
7575           l_adjusted_price := 0;
7576           l_sub_total_price := 0;
7577         END IF;
7578 
7579       ELSE -- bucket not null and not 0
7580 
7581         /* SL_more do no want this for same line same bucket case
7582 		    -- default, in case there is no further lines to set this, SL_further fix
7583 
7584 			    l_bucket_amt_tbl(l_bucket_price_rec.line_ind) :=
7585 			      l_adjusted_price *l_bucket_price_rec.priced_qty;
7586 				*/
7587         IF l_prev_line_index = l_bucket_price_rec.line_ind THEN -- will be at least 1
7588           line_change := FALSE;
7589 
7590           -- line at least from 1 to up, bucket atleast from 1 to up
7591           IF (l_prev_bucket <> l_bucket_price_rec.pricing_group_sequence) THEN -- same line, bucket change
7592             l_mod_lg_net_amt_tbl.DELETE; -- clear this table upon bucket change to keep it small
7593             l_mod_lg_prod_net_amt_tbl.DELETE; -- [julin/4112395/4220399]
7594             -- so we can use it latest, use grp_amt as l_lg_net_amt for this case
7595             IF l_prev_bucket = - 9999 THEN
7596               l_1st_bucket := 'Y';
7597             ELSE
7598               l_1st_bucket := 'N';
7599             END IF;
7600             l_prev_bucket := l_bucket_price_rec.pricing_group_sequence; -- preserve new bucket to be next prev_bucket
7601 
7602             IF (l_lines_tbl.EXISTS(l_bucket_price_rec.line_ind)) THEN
7603               l_sub_total_price := nvl(l_lines_tbl(l_bucket_price_rec.line_ind).adjusted_unit_price, l_lines_tbl(l_bucket_price_rec.line_ind).unit_price);
7604               l_adjusted_price := l_sub_total_price;
7605               l_bucket_amt_tbl(l_bucket_price_rec.line_ind) := nvl(l_lines_tbl(l_bucket_price_rec.line_ind).adjusted_unit_price, 0) * l_bucket_price_rec.priced_qty;
7606               IF l_debug = FND_API.G_TRUE THEN
7607                 QP_PREQ_GRP.engine_debug('bucket change within same line.'
7608                                          ||' sub_total_price: '|| l_sub_total_price ||' adjusted_price: '|| l_adjusted_price );
7609                 QP_PREQ_GRP.engine_debug('l_bucket_amt_tbl(' || l_bucket_price_rec.line_ind ||'): '
7610                                          || nvl(l_lines_tbl(l_bucket_price_rec.line_ind).adjusted_unit_price, 0) || '*' ||
7611                                          l_bucket_price_rec.priced_qty || '=' || l_bucket_amt_tbl(l_bucket_price_rec.line_ind));
7612               END IF; -- end debug
7613             END IF; -- END IF 	l_lines_tbl.EXISTS(l_bucket_price_rec.line_ind)
7614 
7615             -- [julin/4055310]
7616             l_prev_bucket_amt_tbl := l_bucket_amt_tbl;
7617 
7618           END IF; -- end bucket change, (l_prev_bucket <> l_bucket_price_rec.pricing_group_sequence)
7619 
7620         ELSE -- line change (from -9999 to up, or from at least 1 to up)
7621 
7622           line_change := TRUE;
7623 
7624           -- bucket from -9999 to up,or from at least 1 to up
7625           IF l_prev_bucket <> l_bucket_price_rec.pricing_group_sequence THEN -- line change , bucket change
7626 
7627             l_mod_lg_net_amt_tbl.DELETE; -- clear this table upon bucket change to keep it small
7628             l_mod_lg_prod_net_amt_tbl.DELETE; -- [julin/4112395/4220399]
7629 
7630             -- preserve l_prev_bucket to be -9999 if this is 1st bucket
7631             -- so we can use it latest, use grp_amt as l_lg_net_amt for this case
7632             IF l_prev_bucket = - 9999 THEN
7633               l_1st_bucket := 'Y';
7634             ELSE
7635               l_1st_bucket := 'N';
7636             END IF;
7637             l_prev_bucket := l_bucket_price_rec.pricing_group_sequence; -- preserve new bucket to be next prev_bucket
7638             IF (l_lines_tbl.EXISTS(l_bucket_price_rec.line_ind)) THEN
7639               l_sub_total_price := nvl(l_lines_tbl(l_bucket_price_rec.line_ind).adjusted_unit_price, l_lines_tbl(l_bucket_price_rec.line_ind).unit_price);
7640             ELSE
7641               l_sub_total_price := 0;
7642             END IF; -- END IF l_lines_tbl.EXISTS(l_bucket_price_rec.line_ind)
7643             l_adjusted_price := l_sub_total_price;
7644             IF l_debug = FND_API.G_TRUE THEN
7645               QP_PREQ_GRP.engine_debug('bucket change, line change. '
7646                                        ||' sub_total_price: '|| l_sub_total_price ||' adjusted_price: '|| l_adjusted_price );
7647             END IF; -- end debug
7648 
7649             IF l_prev_line_index =  - 9999 THEN
7650               IF l_lines_tbl.EXISTS(l_bucket_price_rec.line_ind) THEN
7651                 l_bucket_amt_tbl(l_bucket_price_rec.line_ind) := nvl(l_lines_tbl(l_bucket_price_rec.line_ind).unit_price, 0) * l_bucket_price_rec.priced_qty;
7652                 IF l_debug = FND_API.G_TRUE THEN
7653                   QP_PREQ_GRP.engine_debug('prev_line_index is -9999');
7654                   QP_PREQ_GRP.engine_debug('l_bucket_amt_tbl(' || l_bucket_price_rec.line_ind ||'): '
7655                                            || nvl(l_lines_tbl(l_bucket_price_rec.line_ind).unit_price, 0) || '*' ||
7656                                            l_bucket_price_rec.priced_qty || '=' || l_bucket_amt_tbl(l_bucket_price_rec.line_ind));
7657                 END IF; -- end debug
7658               END IF; -- END IF l_lines_tbl.EXISTS(l_bucket_price_rec.line_ind)
7659 
7660             ELSE -- l_prev_line_index <> -9999
7661               IF (l_lines_tbl.EXISTS(l_prev_line_index)) THEN
7662                 l_bucket_amt_tbl(l_prev_line_index) := nvl(l_lines_tbl(l_prev_line_index).adjusted_unit_price, 0) * l_prev_qty;
7663                 IF l_debug = FND_API.G_TRUE THEN
7664                   QP_PREQ_GRP.engine_debug('capture bucket_amt of prev line l_bucket_amt_tbl('|| l_prev_line_index ||'): '
7665                                            || nvl(l_lines_tbl(l_prev_line_index).adjusted_unit_price, 0) || '*' ||
7666                                            l_prev_qty || '=' || l_bucket_amt_tbl(l_prev_line_index));
7667                 END IF; -- end debug
7668               END IF; -- END IF l_lines_tbl.EXISTS(l_prev_line_index)
7669 
7670               -- [julin/4055310]
7671               l_prev_bucket_amt_tbl := l_bucket_amt_tbl;
7672 
7673             END IF; -- END l_prev_line_index=-9999
7674 
7675           ELSE -- line change same bucket (bucket is at least from 1 to up, line is at least from 1 to up)
7676             IF l_lines_tbl.EXISTS(l_bucket_price_rec.line_ind) THEN
7677               l_sub_total_price := nvl(l_lines_tbl(l_bucket_price_rec.line_ind).adjusted_unit_price, l_lines_tbl(l_bucket_price_rec.line_ind).unit_price);
7678             ELSE
7679               l_sub_total_price := 0;
7680             END IF; -- END IF l_lines_tbl.EXISTS(l_bucket_price_rec.line_ind)
7681             l_adjusted_price := l_sub_total_price;
7682 
7683             IF l_debug = FND_API.G_TRUE THEN
7684               QP_PREQ_GRP.engine_debug('line change, same bucket');
7685               QP_PREQ_GRP.engine_debug('l_sub_total_price: '|| l_sub_total_price);
7686             END IF; -- end debug
7687 
7688             IF l_lines_tbl.EXISTS(l_prev_line_index) THEN
7689               l_bucket_amt_tbl(l_prev_line_index) := nvl(l_lines_tbl(l_prev_line_index).adjusted_unit_price, 0) * l_prev_qty;
7690               IF l_debug = FND_API.G_TRUE THEN
7691                 QP_PREQ_GRP.engine_debug('l_bucket_amt_tbl(' || l_prev_line_index ||'): '
7692                                          || nvl(l_lines_tbl(l_prev_line_index).adjusted_unit_price, 0) || '*' ||
7693                                          l_prev_qty || '=' || l_bucket_amt_tbl(l_prev_line_index));
7694               END IF; -- end debug
7695             END IF; -- END IF l_lines_tbl.EXISTS(l_prev_line_index)
7696 
7697             -- SL_more, to default and for line level net amt, in case no further line to set this
7698             IF l_1st_bucket = 'Y' THEN
7699               IF l_lines_tbl.EXISTS(l_bucket_price_rec.line_ind) THEN
7700                 l_bucket_amt_tbl(l_bucket_price_rec.line_ind) := nvl(l_lines_tbl(l_bucket_price_rec.line_ind).unit_price, 0) * l_bucket_price_rec.priced_qty; -- for line level net amt we need this
7701                 IF l_debug = FND_API.G_TRUE THEN
7702                   QP_PREQ_GRP.engine_debug('1st bucket for this line l_bucket_amt_tbl('|| l_bucket_price_rec.line_ind ||'): '
7703                                            || nvl(l_lines_tbl(l_bucket_price_rec.line_ind).unit_price, 0) || '*' ||
7704                                            l_bucket_price_rec.priced_qty || '=' || l_bucket_amt_tbl(l_bucket_price_rec.line_ind));
7705                 END IF; -- end debug
7706               END IF; -- END IF l_lines_tbl.EXISTS(l_bucket_price_rec.line_ind)
7707             END IF; -- END IF l_1st_bucket ='Y'
7708 
7709           END IF; -- end bucket change in the line change block
7710 
7711           l_prev_line_index := l_bucket_price_rec.line_ind; -- preserve the new lind_ind to be l_prev_line_index
7712           l_prev_qty := l_bucket_price_rec.priced_qty;
7713         END IF; --l_prev_line_index = line_index
7714       END IF; -- end if bucket is null or 0
7715       -- end 2892848, SL_latest
7716 
7717       /* SL_latest
7718                    -- begin 2892848
7719                    -- MOVE TO HERE
7720                 IF l_bucket_price_rec.pricing_group_sequence <> 0 AND l_bucket_price_rec.pricing_group_sequence IS NOT NULL THEN -- bucket 0 is line event list price
7721                    -- detect bucket change, need to CAPTURE unit_adjs (LINE) and adj_amts(LINEGROUP) up to the prev bucket
7722                   IF l_prev_bucket <> l_bucket_price_rec.pricing_group_sequence THEN
7723                     IF l_debug = FND_API.G_TRUE THEN
7724                       QP_PREQ_GRP.engine_debug ('------BUCKET CHANGE----, place to record bucket USP for each line_index');
7725                     END IF; -- END debug
7726 
7727                     -- for LINE GROUP
7728                     -- need capture the l_prev_lg_adj_amt
7729                     -- l_bucket_adj_amt_tbl(bucket) stores adj_amts of all lines for each bucket
7730                     -- prev_lg_adj_amt is the sum of adj_amts for all lines up to prev buckets
7731 
7732                     IF l_bucket_adj_amt_tbl.EXISTS(l_prev_bucket) THEN
7733 		      l_prev_lg_adj_amt := nvl(l_prev_lg_adj_amt,0) + l_bucket_adj_amt_tbl(l_prev_bucket);
7734 		      IF l_debug = FND_API.G_TRUE THEN
7735                         QP_PREQ_GRP.engine_debug ('debug LINEGROUP adj amts up to prev bucket - '||l_prev_bucket ||': '||l_prev_lg_adj_amt);
7736                       END IF; -- END debug
7737 
7738 		    END IF; -- END IF l_bucket_adj_amt_tbl.EXISTS(l_prev_bucket)
7739 
7740                     -- bucket change for LINE LEVEL
7741                     -- l_bucket_index_adj_tbl(line_index) stores sum of unit_adjs for each line_index
7742                     -- l_prev_bucket_index_adj_tbl(line_index) is the sum of unit_adjs for that line_index up to prev bucket
7743 
7744                     IF l_bucket_index_adj_tbl.EXISTS(l_bucket_price_rec.line_ind) THEN
7745                       IF l_prev_bucket_index_adj_tbl.EXISTS(l_bucket_price_rec.line_ind) THEN
7746                         l_prev_bucket_index_adj_tbl(l_bucket_price_rec.line_ind):= nvl(l_prev_bucket_index_adj_tbl(l_bucket_price_rec.line_ind),0)
7747                           + l_bucket_index_adj_tbl(l_bucket_price_rec.line_ind);
7748                       ELSE
7749                         l_prev_bucket_index_adj_tbl(l_bucket_price_rec.line_ind):= l_bucket_index_adj_tbl(l_bucket_price_rec.line_ind);
7750                       END IF; -- END IF l_bucket_index_adj_tbl.EXISTS(l_bucket_price_rec.line_ind)
7751 
7752                       IF l_debug = FND_API.G_TRUE THEN
7753                         QP_PREQ_GRP.engine_debug ('debug LINE unit adjs up to prev bucket for line index'||l_bucket_price_rec.line_ind ||': '||l_prev_bucket_index_adj_tbl(l_bucket_price_rec.line_ind) );
7754                       END IF; -- END debug
7755                     END IF; -- END IF l_bucket_index_adj_tbl.EXISTS
7756 
7757 
7758                     -- begin shu fix bug for special case, bucket change within same line index
7759                     IF line_change = false THEN
7760                       l_sub_total_price := nvl(l_adjusted_price, l_lines_tbl(l_bucket_price_rec.line_ind).unit_price);
7761                       IF l_debug = FND_API.G_TRUE THEN
7762                            QP_PREQ_GRP.engine_debug('bucket change within same line'
7763                            ||' sub_total_price '||l_sub_total_price ||' adjusted_price '||l_adjusted_price  );
7764                       END IF;
7765                     END IF; -- END IF line_change = flase
7766                     -- end shu fix bug
7767 
7768                     l_prev_bucket := l_bucket_price_rec.pricing_group_sequence; -- preserve new bucket to be next prev_bucket
7769 
7770                   ELSE -- bucket did not change but line changes within bucket, we also need to capture line level unit adjs of prev bucket
7771 
7772 
7773 					IF line_change = true THEN
7774                       IF l_bucket_index_adj_tbl.EXISTS(l_bucket_price_rec.line_ind) THEN
7775                       IF l_prev_bucket_index_adj_tbl.EXISTS(l_bucket_price_rec.line_ind) THEN
7776                         l_prev_bucket_index_adj_tbl(l_bucket_price_rec.line_ind):= nvl(l_prev_bucket_index_adj_tbl(l_bucket_price_rec.line_ind),0)
7777                           + l_bucket_index_adj_tbl(l_bucket_price_rec.line_ind);
7778                       ELSE
7779                         l_prev_bucket_index_adj_tbl(l_bucket_price_rec.line_ind):= l_bucket_index_adj_tbl(l_bucket_price_rec.line_ind);
7780                       END IF; -- END IF l_bucket_index_adj_tbl.EXISTS(l_bucket_price_rec.line_ind)
7781 
7782                       IF l_debug = FND_API.G_TRUE THEN
7783                         QP_PREQ_GRP.engine_debug ('line change, debug LINE unit adjs up to prev bucket for line index'||l_bucket_price_rec.line_ind ||': '||l_prev_bucket_index_adj_tbl(l_bucket_price_rec.line_ind) );
7784                       END IF; -- END debug
7785                     END IF; -- END IF l_bucket_index_adj_tbl.EXISTS
7786                     END IF; -- END IF line_change true
7787 
7788                   END IF; -- end if l_prev_bucket <> l_bucket_price_rec.pricing_group_sequence
7789 
7790 				ELSE -- bucket is 0 or null -- begin shu fix bug
7791                   l_sub_total_price := nvl(l_lines_tbl(l_bucket_price_rec.line_ind).unit_price, 0);
7792 	              l_adjusted_price :=  nvl(l_lines_tbl(l_bucket_price_rec.line_ind).adjusted_unit_price,l_lines_tbl(l_bucket_price_rec.line_ind).unit_price);
7793                       IF l_debug = FND_API.G_TRUE THEN
7794                            QP_PREQ_GRP.engine_debug('bucket is 0 or null'
7795                            ||' sub_total_price '||l_sub_total_price ||' adjusted_price '||l_adjusted_price  );
7796                       END IF;
7797                   -- end shu fix bug
7798                 END IF; -- END IF l_bucket_price_rec(J).pricing_group_sequence <> 0 AND ...
7799                    -- end 2892848
7800 			------------------END NET AMT STUFF
7801 */
7802 
7803       --This code is for bug 1915355
7804       --To calculate lumpsum use group_qty/amt for linegrp
7805       --This is only for engine inserted records
7806       --for user passed adjustments, we will use only line_qty
7807       --to break the link from other lines that have this line
7808       --group adjustment
7809       --for bug2897524 retain line_quantity for zerounitprice
7810       IF l_bucket_price_rec.priced_quantity = 0
7811         AND l_bucket_price_rec.unit_price <> 0
7812         THEN
7813         IF l_debug = FND_API.G_TRUE THEN
7814           QP_PREQ_GRP.engine_debug('line_qty zero changed to null');
7815         END IF;
7816         l_bucket_price_rec.priced_quantity := NULL;
7817       END IF;
7818 
7819       --bug 4900095
7820       IF (QP_PREQ_GRP.G_service_line_qty_tbl.exists(l_bucket_price_rec.line_ind)
7821       or QP_PREQ_GRP.G_service_ldet_qty_tbl.exists(l_bucket_price_rec.line_detail_index))
7822       and l_bucket_price_rec.operand_calculation_code = G_LUMPSUM_DISCOUNT THEN
7823       --only for service items
7824       --when uom_quantity is passed as null,
7825       -- and contract_start/end_dates are passed
7826       --and for a line/linegroup lumpsum DIS/PBH/SUR/FREIGHT
7827         IF l_bucket_price_rec.modifier_level_code = G_LINE_GROUP  THEN
7828           IF G_Service_pbh_lg_amt_qty.exists(l_bucket_price_rec.line_detail_index)
7829           and QP_PREQ_GRP.G_service_ldet_qty_tbl.exists(l_bucket_price_rec.line_detail_index) THEN
7830             l_calc_quantity := nvl(G_Service_pbh_lg_amt_qty(l_bucket_price_rec.line_detail_index),
7831             QP_PREQ_GRP.G_service_ldet_qty_tbl(l_bucket_price_rec.line_detail_index));
7832           ELSIF G_Service_pbh_lg_amt_qty.exists(l_bucket_price_rec.line_detail_index) THEN
7833             l_calc_quantity := G_Service_pbh_lg_amt_qty(l_bucket_price_rec.line_detail_index);
7834           ELSIF QP_PREQ_GRP.G_service_ldet_qty_tbl.exists(l_bucket_price_rec.line_detail_index) THEN
7835             l_calc_quantity := QP_PREQ_GRP.G_service_ldet_qty_tbl(l_bucket_price_rec.line_detail_index);
7836           ELSIF QP_PREQ_GRP.G_service_line_qty_tbl.exists(l_bucket_price_rec.line_ind) THEN
7837             l_calc_quantity := QP_PREQ_GRP.G_service_line_qty_tbl(l_bucket_price_rec.line_ind);
7838           ELSE
7839             l_calc_quantity :=
7840             nvl(nvl(l_bucket_price_rec.group_quantity
7841                 , l_bucket_price_rec.group_amount)
7842             , nvl(l_bucket_price_rec.priced_quantity
7843                   , l_bucket_price_rec.priced_qty));
7844           END IF;--G_Service_pbh_lg_amt_qty.exists
7845         ELSIF l_bucket_price_rec.modifier_level_code = G_LINE_LEVEL THEN
7846           IF QP_PREQ_GRP.G_service_line_qty_tbl.exists(l_bucket_price_rec.line_ind) THEN
7847             l_calc_quantity := QP_PREQ_GRP.G_service_line_qty_tbl(l_bucket_price_rec.line_ind);
7848           ELSE
7849             l_calc_quantity :=
7850             nvl(nvl(l_bucket_price_rec.group_quantity
7851                 , l_bucket_price_rec.group_amount)
7852             , nvl(l_bucket_price_rec.priced_quantity
7853                   , l_bucket_price_rec.priced_qty));
7854           END IF;--G_Service_pbh_lg_amt_qty.exists
7855         END IF;--l_bucket_price_rec.modifier_level_code
7856       ELSE
7857         IF l_bucket_price_rec.modifier_level_code =
7858           G_LINE_GROUP
7859         AND l_bucket_price_rec.pricing_status_code =
7860           G_STATUS_NEW
7861         THEN
7862           l_calc_quantity :=
7863           nvl(nvl(l_bucket_price_rec.group_quantity
7864                 , l_bucket_price_rec.group_amount)
7865             , nvl(l_bucket_price_rec.priced_quantity
7866                   , l_bucket_price_rec.priced_qty));
7867         ELSE
7868           l_calc_quantity :=
7869           nvl(l_bucket_price_rec.priced_qty, l_bucket_price_rec.priced_quantity);
7870         END IF; --_bucket_price_rec.modifier_level_code
7871       END IF;--QP_PREQ_GRP.G_service_line_qty_tbl.exists
7872 
7873       --fix for bug2424931
7874       l_calc_quantity := nvl(l_calc_quantity, 1);
7875 
7876       IF l_debug = FND_API.G_TRUE THEN
7877         QP_PREQ_GRP.engine_debug('figuring out qty level '
7878                                  || l_bucket_price_rec.modifier_level_code
7879                                  ||' pricedqty '|| l_bucket_price_rec.priced_quantity
7880                                  ||' grpqty '|| l_bucket_price_rec.group_quantity
7881                                  ||' grpamt '|| l_bucket_price_rec.group_amount
7882                                  ||' lqty '|| l_bucket_price_rec.priced_qty -- order_qty of the line
7883                                  ||' calc '|| l_calc_quantity);
7884       END IF;
7885       --End fix for bug 1915355
7886       IF l_bucket_price_rec.created_from_list_line_type
7887         = G_PRICE_BREAK_TYPE
7888         THEN
7889 
7890         BEGIN
7891           SELECT pricing_attribute
7892           INTO l_pbh_pricing_attr
7893           FROM qp_pricing_attributes
7894           WHERE list_line_id =
7895           l_bucket_price_rec.created_from_list_line_id;
7896         EXCEPTION
7897           WHEN OTHERS THEN
7898             l_pbh_pricing_attr := NULL;
7899         END;
7900 
7901         --changes for PBH line group LUMPSUM bug 2388011 commented out
7902         --call to old signature of Price_Break_Calculation
7903         /*
7904 --fix for bug 2515762 to pass line_dtl_index instead of list_line_id
7905 				QP_Calculate_Price_PUB.Price_Break_Calculation(
7906 				l_bucket_price_rec.line_detail_index
7907                                 ,l_bucket_price_rec.price_break_type_code
7908                                 ,l_bucket_price_rec.line_ind
7909                                 ,nvl(l_calc_quantity,1)
7910                                 ,l_sub_total_price
7911                                 ,l_return_adjustment
7912                                 ,l_return_status
7913                                 ,l_return_status_text);
7914 */
7915         --changes for PBH line group LUMPSUM bug 2388011 calling new
7916         --overloaded procedure Price_Break_Calculation
7917 
7918         -- [nirmkuma 4222552 ] since passed line group manual discounts are
7919         -- treated only as line level, using following line level path, which
7920         -- looks at updated line_priced_quantity.
7921 
7922         IF (l_bucket_price_rec.modifier_level_code IN (G_LINE_LEVEL, G_ORDER_LEVEL)
7923          or (l_bucket_price_rec.modifier_level_code = G_LINE_GROUP
7924                    and l_bucket_price_rec.automatic_flag = G_NO)) THEN
7925           IF nvl(l_pbh_pricing_attr, 'NULL') = G_QUANTITY_ATTRIBUTE THEN
7926             l_total_value := 0;
7927             l_req_value_per_unit := l_bucket_price_rec.priced_qty;
7928           ELSE --same for item amount or others(treat as item_amt)
7929             l_total_value := l_bucket_price_rec.priced_quantity;
7930             l_req_value_per_unit := l_bucket_price_rec.priced_qty;
7931             l_qualifier_value := l_bucket_price_rec.priced_quantity; --2892848  move to here
7932 
7933             -- begin 2892848
7934             -- net_amount line level (not group of line) modifier
7935             IF l_bucket_price_rec.net_amount_flag IN (G_YES, 'P') THEN
7936               IF l_debug = FND_API.G_TRUE THEN
7937                 QP_PREQ_GRP.engine_debug('net amount line level modifier: '|| l_bucket_price_rec.created_from_list_line_id);
7938               END IF; -- end debug
7939               /* SL_latest
7940                         IF l_prev_bucket_index_adj_tbl.EXISTS(l_bucket_price_rec.line_ind) THEN
7941                           l_qualifier_value:= l_bucket_price_rec.priced_quantity
7942 						  + nvl(l_prev_bucket_index_adj_tbl(l_bucket_price_rec.line_ind),0)* l_bucket_price_rec.priced_qty;
7943                           IF l_debug = FND_API.G_TRUE THEN
7944                             QP_PREQ_GRP.engine_debug('line amount: '||l_bucket_price_rec.priced_quantity);
7945                             QP_PREQ_GRP.engine_debug('order qty : '||l_bucket_price_rec.priced_qty);
7946                             QP_PREQ_GRP.engine_debug('unit adjs up to prev buckets: '|| nvl(l_prev_bucket_index_adj_tbl(l_bucket_price_rec.line_ind),0) );
7947                           END IF; -- end debug
7948                         ELSE
7949                           l_qualifier_value:= l_bucket_price_rec.priced_quantity;
7950                         END IF; -- END IF l_prev_bucket_index_adj_tbl.EXISTS(l_bucket_price_rec)
7951                         */
7952               IF l_bucket_amt_tbl.EXISTS(l_bucket_price_rec.line_ind)THEN
7953                 l_qualifier_value := l_bucket_amt_tbl(l_bucket_price_rec.line_ind);
7954                 IF l_debug = FND_API.G_TRUE THEN
7955                   QP_PREQ_GRP.engine_debug('line level net amount, SL_latest ?: '|| l_bucket_amt_tbl(l_bucket_price_rec.line_ind));
7956                 END IF; -- end debug
7957               END IF; -- END IF l_bucket_amt_tbl.EXISTs
7958             END IF; -- END IF net_amount modifier
7959             -- end 2892848
7960 
7961           END IF; --l_pbh_pricing_attr
7962         ELSE --linegroup level
7963           IF nvl(l_pbh_pricing_attr, 'NULL') = G_QUANTITY_ATTRIBUTE THEN
7964             l_total_value := 0;
7965             l_req_value_per_unit := l_bucket_price_rec.group_quantity;
7966           ELSE --same for item amount or others(treat as item_amt)
7967             l_total_value := l_bucket_price_rec.priced_quantity;
7968             l_req_value_per_unit := l_bucket_price_rec.group_amount;
7969 
7970             -- begin 2892848
7971             -- IF net amount linegroup modifier
7972             IF l_bucket_price_rec.net_amount_flag IN (G_YES, 'P') THEN
7973 
7974               IF l_debug = FND_API.G_TRUE THEN
7975                 QP_PREQ_GRP.engine_debug('net amount linegroup modifier id: '|| l_bucket_price_rec.created_from_list_line_id);
7976               END IF; -- end debug
7977 
7978               l_lg_net_amt := 0;
7979               l_line_bucket_amt := 0; -- note 0+null is null
7980               -- [julin/4112395/4220399]
7981               l_lg_prod_net_amt := 0;
7982               l_prod_line_bucket_amt := 0;
7983 
7984               -- net amount is grp_amt - (adj_amts of all lines from prev bucket)
7985               --l_qualifier_value  := l_bucket_price_rec.priced_quantity + l_prev_lg_adj_amt;  -- 2892848 old way
7986 
7987               -- begin SL_latest
7988               -- SL_further_fix
7989               -- if there are no prev buckets(l_prev_bucket=-9999) for this modifier, then use group amount
7990               -- since we do not have the adjs of other lines yet, l_bucket_amt_tbl does not have complete data
7991 
7992               -- [julin/3265308] net amount calculation 'P', match product only.
7993               -- For category net amount, 1st_bucket means that this is the
7994               -- first bucket of the line, so no adjustments have been ap-
7995               -- plied.  However, other lines of the same category might
7996               -- have had modifiers in previous buckets applied, so we look
7997               -- at the bucket_amt_tbl to see if those have been calculated
7998               -- else we can assume no modifiers applied yet, and can hence
7999               -- calculate the list price * qty for those lines.
8000               IF nvl(l_bucket_price_rec.net_amount_flag, 'N') = 'P' THEN
8001                 IF l_mod_lg_prod_net_amt_tbl.EXISTS(l_bucket_price_rec.created_from_list_line_id) THEN
8002                   l_lg_prod_net_amt := l_mod_lg_prod_net_amt_tbl(l_bucket_price_rec.created_from_list_line_id);
8003                   IF l_debug = FND_API.G_TRUE THEN
8004                     QP_PREQ_GRP.engine_debug('recycle l_lg_prod_net_amt from l_mod_lg_net_amt_tbl: '|| l_lg_prod_net_amt);
8005                   END IF; --end debug
8006                 ELSE -- need to calculate l_lg_net_amt
8007                   IF l_debug = FND_API.G_TRUE THEN
8008                     QP_PREQ_GRP.engine_debug('1st bucket = '|| l_1st_bucket ||', net amount flag = P');
8009                   END IF;
8010                   -- calculate amount using product attribute net amount grouping
8011                   FOR t IN l_prod_attr_info(l_bucket_price_rec.created_from_list_line_id) LOOP
8012                     IF l_prev_bucket_amt_tbl.EXISTS(t.line_index) THEN
8013                       l_prod_line_bucket_amt := nvl(l_prev_bucket_amt_tbl(t.line_index), 0);
8014                       IF l_debug = FND_API.G_TRUE THEN
8015                         QP_PREQ_GRP.engine_debug(t.line_index || ':' || l_prev_bucket_amt_tbl(t.line_index));
8016                       END IF; --end debug
8017                     ELSE
8018                       -- have to compute list price * qty for the line (query from qp_npreq_lines_tmp)
8019                       l_prod_line_bucket_amt := nvl(t.priced_quantity, 0) * nvl(t.unit_price, 0);
8020                       IF l_debug = FND_API.G_TRUE THEN
8021                         QP_PREQ_GRP.engine_debug('* line index '|| t.line_index ||' not in l_prev_bucket_amt_tbl');
8022                         QP_PREQ_GRP.engine_debug('  got value '|| l_prod_line_bucket_amt ||' from lines_tmp instead');
8023                       END IF;
8024                     END IF;
8025                     l_lg_prod_net_amt := l_lg_prod_net_amt + l_prod_line_bucket_amt;
8026 
8027                     IF l_debug = FND_API.G_TRUE THEN
8028                       QP_PREQ_GRP.engine_debug('(catnetamt) l_prod_line_bucket_amt: ' || l_prod_line_bucket_amt);
8029                       QP_PREQ_GRP.engine_debug('(catnetamt) up-tp-date l_lg_prod_net_amt: ' || l_lg_prod_net_amt); -- grp amt
8030                     END IF;
8031                   END LOOP;
8032 
8033                   l_mod_lg_prod_net_amt_tbl(l_bucket_price_rec.created_from_list_line_id) := l_lg_prod_net_amt; -- preserve this for recycle
8034                 END IF;
8035               END IF; -- end l_bucket_price_rec.net_amount_flag = 'P'   -- [julin/3265308]
8036 
8037               IF l_1st_bucket = 'Y' THEN
8038 
8039                 IF l_debug = FND_API.G_TRUE THEN
8040                   QP_PREQ_GRP.engine_debug(' l_1st_bucket is Y, use group amount as l_lg_net_amt'); -- grp amt
8041                 END IF; -- end debug
8042                 l_lg_net_amt := l_bucket_price_rec.priced_quantity;
8043 
8044               ELSE --  l_1st_bucket <>'Y'
8045 
8046                 IF l_debug = FND_API.G_TRUE THEN
8047                   QP_PREQ_GRP.engine_debug(' - not first bucket');
8048                 END IF;
8049                 IF l_mod_lg_net_amt_tbl.EXISTS(l_bucket_price_rec.created_from_list_line_id) THEN
8050                   l_qualifier_value := l_mod_lg_net_amt_tbl(l_bucket_price_rec.created_from_list_line_id);
8051                   IF l_debug = FND_API.G_TRUE THEN
8052                     QP_PREQ_GRP.engine_debug('recycle lg_net_amt from l_mod_lg_net_amt_tbl('|| l_bucket_price_rec.line_ind ||'): '|| l_qualifier_value);
8053                   END IF; --end debug
8054 
8055                 ELSE -- ELSE IF l_mod_lg_net_amt_tbl.EXISTS
8056 
8057                     -- regular net amount processing
8058                     -- fix of latest requirement, only add up net amounts with in the group
8059                     -- lg_net_amt_tbl is hastable of modifier and its lg_net_amt for that bucket, to_do
8060                     -- lg_net_amt is the sum of (USP at end of last bucket *Qty) for the lines related to this modifier
8061                     -- l_net_mod_index_cur has line_indexes related to this net amount modifier
8062 
8063                   -- regular net amount processing
8064                   -- fix of latest requirement, only add up net amounts with in the group
8065                   -- lg_net_amt_tbl is hastable of modifier and its lg_net_amt for that bucket, to_do
8066                   -- lg_net_amt is the sum of (USP at end of last bucket *Qty) for the lines related to this modifier
8067                   -- l_net_mod_index_cur has line_indexes related to this net amount modifier
8068 
8069                   FOR t IN l_net_mod_index_cur(l_bucket_price_rec.created_from_list_line_id) LOOP
8070                     IF l_bucket_amt_tbl.EXISTS(t.line_index) THEN
8071                       l_line_bucket_amt := nvl(l_bucket_amt_tbl(t.line_index), 0);
8072                       IF l_debug = FND_API.G_TRUE THEN
8073                         QP_PREQ_GRP.engine_debug(t.line_index || ':' || l_bucket_amt_tbl(t.line_index));
8074                       END IF; --end debug
8075                     ELSE
8076                       l_line_bucket_amt := 0;
8077                     END IF;
8078                     l_lg_net_amt := l_lg_net_amt + l_line_bucket_amt;
8079 
8080                     IF l_debug = FND_API.G_TRUE THEN
8081                       QP_PREQ_GRP.engine_debug('net amount l_bucket_amt_tbl('|| t.line_index ||'): '|| l_line_bucket_amt);
8082                     END IF; --end debug
8083 
8084                   END LOOP; -- end l_net_mod_index_cur
8085 
8086                   l_mod_lg_net_amt_tbl(l_bucket_price_rec.created_from_list_line_id) := l_lg_net_amt;
8087 
8088                 END IF; --l_mod_lg_net_amt_tbl.EXIST
8089               END IF; -- END IF l_prev_bucket = -9999
8090 
8091               -- end SL_latest
8092 
8093               -- [julin/4112395/4220399]
8094               IF (nvl(l_bucket_price_rec.net_amount_flag, 'N') = 'P') THEN
8095                 l_qualifier_value := l_lg_prod_net_amt;
8096                 -- [julin/4571612/4671446] explicitly set FND_API.G_NULL_NUM means infinity
8097                 IF (l_sub_total_price = 0) THEN
8098                   l_req_value_per_unit := FND_API.G_NULL_NUM;
8099                   l_applied_req_value_per_unit := FND_API.G_NULL_NUM;
8100                 ELSE
8101                   l_req_value_per_unit := l_lg_prod_net_amt / l_sub_total_price; --bug 3404493
8102                   l_applied_req_value_per_unit := l_lg_net_amt / l_sub_total_price;
8103                 END IF;
8104               ELSE
8105                 l_qualifier_value := l_lg_net_amt;
8106                 -- [julin/4571612/4671446] explicitly set FND_API.G_NULL_NUM means infinity
8107                 IF (l_sub_total_price = 0) THEN
8108                   l_req_value_per_unit := FND_API.G_NULL_NUM;
8109                 ELSE
8110                   l_req_value_per_unit := l_lg_net_amt / l_sub_total_price; --bug 3404493
8111                 END IF;
8112               END IF;
8113 
8114               IF l_debug = FND_API.G_TRUE THEN
8115                 QP_PREQ_GRP.engine_debug('group amount: ' || l_bucket_price_rec.priced_quantity); -- grp amt
8116                 QP_PREQ_GRP.engine_debug('group of lines net amt: '|| l_qualifier_value);
8117 
8118               END IF; --end debug
8119 
8120             ELSE -- not net amount modifier
8121               l_qualifier_value := l_bucket_price_rec.priced_quantity; -- not net amount grouop of line modifier
8122 
8123             END IF; -- END IF net_amount_flag = 'Y' for line group modifiers
8124             -- end 2892848
8125 
8126           END IF; --l_pbh_pricing_attr
8127         END IF; --modifier level code
8128 
8129         IF l_debug = FND_API.G_TRUE THEN
8130           QP_PREQ_GRP.engine_debug('PBH break dtls attribute '
8131                                    || l_pbh_pricing_attr ||' l_total_value '|| l_total_value
8132                                    ||' l_req_value_per_unit '|| l_req_value_per_unit);
8133         END IF; --l_debug
8134 
8135         -- obtain net_adj_amount_flag from qp_list_lines table if null,
8136         -- since it may not be passed from calling application
8137         -- net_amount_new 2720717
8138         IF l_bucket_price_rec.net_amount_flag IS NULL THEN
8139           OPEN l_net_amount_flag_cur(l_bucket_price_rec.created_from_list_line_id);
8140           FETCH l_net_amount_flag_cur INTO l_bucket_price_rec.net_amount_flag;
8141           CLOSE l_net_amount_flag_cur;
8142         END IF;
8143 
8144         -- [julin/3265308] Price_Break_Calculation should have same
8145         -- behavior for both net_amount_flag = G_YES and 'P'.
8146         IF (l_bucket_price_rec.net_amount_flag IN (G_YES, 'P')) THEN
8147           l_bucketed_flag := G_YES;
8148         ELSE
8149           l_bucketed_flag := G_NO;
8150         END IF;
8151 
8152           --4900095 used in price_break_calculation
8153           G_PBH_MOD_LEVEL_CODE(l_bucket_price_rec.line_detail_index) :=
8154                     l_bucket_price_rec.modifier_level_code;
8155 
8156         QP_Calculate_Price_PUB.Price_Break_Calculation(
8157                                                        l_bucket_price_rec.line_detail_index,  -- line_detail_index
8158                                                        l_bucket_price_rec.price_break_type_code,
8159                                                        l_bucket_price_rec.line_ind,
8160                                                        l_req_value_per_unit,  -- Group Value per unit,group quantity,item qty 40
8161                                                        l_applied_req_value_per_unit,  -- [julin/4112395/4220399]
8162                                                        l_total_value,  -- Total value (Group amount or item amount) 4000
8163                                                        l_sub_total_price,
8164                                                        --l_bucket_price_rec.priced_quantity, -- 2388011
8165                                                        l_bucket_price_rec.priced_qty,  -- FIX BUG 2880314, should be order qty of the line
8166                                                        --l_pbh_prev_net_adj_amount, -- net_amt_new 2720717--2892848
8167                                                        l_qualifier_value,  -- p_bucketed_adj, 2892848
8168                                                        l_bucketed_flag,  -- net_amt_new 2720717, [julin/3265308]
8169                                                        l_bucket_price_rec.automatic_flag, -- 5413797
8170                                                        l_return_adjustment,
8171                                                        l_return_status,
8172                                                        l_return_status_text);
8173         --end changes for bug 2388011
8174 
8175         l_return_adjustment :=
8176         - 1 * nvl(l_return_adjustment, 0);
8177 
8178         -- 2892848
8179         IF l_debug = FND_API.G_TRUE THEN
8180           QP_PREQ_GRP.engine_debug('PBH return adjustment '|| l_return_adjustment); --40
8181         END IF; --l_debug
8182         -- end 2892848
8183 
8184       ELSE --created_from_list_line_type not PBH 2892848 comment change
8185         /*
8186 		   	  IF l_bucket_price_rec.updated_flag = G_YES
8187 		   	  and nvl(l_bucket_price_rec.automatic_flag,G_NO) = G_NO
8188 		   	  and (l_bucket_price_rec.adjustment_amount IS NOT NULL
8189 				and l_bucket_price_rec.adjustment_amount <>
8190 							G_MISS_NUM) --FND_API.G_MISS_NUM)
8191 		   	  THEN
8192 				--to avoid rounding issues in rev calculations
8193 				--for user-overridden adjustments
8194 			        l_return_adjustment :=
8195 				        l_bucket_price_rec.adjustment_amount;
8196 			  ELSE
8197 			*/--commented to avoid overriding errors
8198 
8199         Calculate_bucket_price(
8200                                l_bucket_price_rec.created_from_list_line_type
8201                                , l_sub_total_price
8202                                , nvl(l_calc_quantity, 1)
8203                                , l_bucket_price_rec.operand_calculation_code
8204                                , nvl(l_bucket_price_rec.operand_value, 0) * l_sign
8205                                , l_return_adjustment
8206                                , l_return_status
8207                                , l_return_status_text);
8208         --  END IF;
8209       END IF;
8210 
8211       IF l_return_status = FND_API.G_RET_STS_ERROR
8212         THEN
8213         x_return_status := l_return_status;
8214         x_return_status_text := l_return_status_text;
8215         RAISE Calculate_Exc;
8216       END IF;
8217 
8218       -- 2892848
8219       IF l_debug = FND_API.G_TRUE THEN
8220         QP_PREQ_GRP.engine_debug(' unrounded adj_amt l_return_adjustment '|| l_return_adjustment); -- 2892848, will be rounded later, ok
8221       END IF; --END IF l_debug
8222       /* SL_latest
8223 			-- CONTINUE building l_bucket_adj_amt_tbl and l_bucket_index_adj_tbl regardless of bucket
8224 		IF l_bucket_price_rec.pricing_group_sequence IS NOT NULL THEN
8225 		  IF l_bucket_adj_amt_tbl.EXISTS(l_bucket_price_rec.pricing_group_sequence) THEN -- avoid no data found or table index not exists for 1st rec
8226 		    IF l_debug = FND_API.G_TRUE THEN
8227 		      QP_PREQ_GRP.engine_debug ('    accumulated adj amts by bucket BEFORE: ' || l_bucket_adj_amt_tbl(l_bucket_price_rec.pricing_group_sequence));
8228 		    END IF; -- end debug
8229 		    l_bucket_adj_amt_tbl(l_bucket_price_rec.pricing_group_sequence):= nvl(l_bucket_adj_amt_tbl(l_bucket_price_rec.pricing_group_sequence),0) +
8230 		      nvl(l_return_adjustment,0)* l_bucket_price_rec.priced_qty;
8231 
8232 		  ELSE -- avoid no data found err
8233 		    l_bucket_adj_amt_tbl(l_bucket_price_rec.pricing_group_sequence):= nvl(l_return_adjustment,0) * l_bucket_price_rec.priced_qty;
8234 		  END IF; -- END IF l_bucket_adj_amt_tbl.EXISTS
8235 
8236 		  IF l_debug = FND_API.G_TRUE THEN
8237                     QP_PREQ_GRP.engine_debug ('    (LINEGROUP) building l_bucket_adj_amt_tbl by bucket: '||l_bucket_price_rec.pricing_group_sequence);
8238                     QP_PREQ_GRP.engine_debug ('    nvl of current unit adj: '||nvl(l_return_adjustment, 0));
8239                     QP_PREQ_GRP.engine_debug ('    order qty: '||l_bucket_price_rec.priced_qty);
8240                     QP_PREQ_GRP.engine_debug ('    accumulated adj amts for this bucket: ' || l_bucket_adj_amt_tbl(l_bucket_price_rec.pricing_group_sequence));
8241            END IF; -- END debug
8242 
8243            -- for LINE LEVEL
8244            IF l_bucket_index_adj_tbl.EXISTS(l_bucket_price_rec.line_ind) THEN
8245               IF l_debug = FND_API.G_TRUE THEN
8246 		        QP_PREQ_GRP.engine_debug ('    accumulated unit adj by line BEFORE: ' || nvl(l_bucket_index_adj_tbl(l_bucket_price_rec.line_ind), 0));
8247 		      END IF; -- end debug
8248               l_bucket_index_adj_tbl(l_bucket_price_rec.line_ind) := nvl(l_bucket_index_adj_tbl(l_bucket_price_rec.line_ind), 0) + nvl(l_return_adjustment, 0);
8249 		  ELSE -- avoid no datat found err
8250 		    l_bucket_index_adj_tbl(l_bucket_price_rec.line_ind) := nvl(l_return_adjustment, 0);
8251 		  END IF; -- END IF l_bucket_index_adj_tbl.EXISTS
8252 
8253 		  IF l_debug = FND_API.G_TRUE THEN
8254 		      QP_PREQ_GRP.engine_debug ('    (LINE) building l_bucket_index_adj_tbl for line_index: '||l_bucket_price_rec.line_ind);
8255 		      QP_PREQ_GRP.engine_debug ('    accumulated unit adjs by line index: '||l_bucket_index_adj_tbl(l_bucket_price_rec.line_ind));
8256 		  END IF; -- END debug
8257 		END IF; -- END IF l_bucket_price_rec.pricing_group_sequence IS NOT NULL
8258 		-- end 2892848
8259 		*/
8260       --round the adjustment_amount with factor on the line
8261       --engine updates the factor on the line
8262       --w/nvl(user_passed,price_list rounding_factor)
8263       IF G_ROUND_INDIVIDUAL_ADJ = G_ROUND_ADJ -- 2892848_latest
8264         AND l_bucket_price_rec.rounding_factor IS NOT NULL
8265         THEN
8266         l_return_adjustment :=
8267         round(l_return_adjustment,
8268               ( - 1 * l_bucket_price_rec.rounding_factor));
8269       END IF;
8270 
8271       IF l_debug = FND_API.G_TRUE THEN
8272         QP_PREQ_GRP.engine_debug('rounded adj: '||
8273                                  l_return_adjustment
8274                                  ||' roundingfac: '|| l_bucket_price_rec.rounding_factor);
8275 
8276       END IF;
8277       l_bucket_price_rec.adjustment_amount :=
8278       nvl(l_return_adjustment, 0);
8279 
8280       /*	SL_latest 2892848
8281 		        l_pbh_net_adj_amount := l_pbh_net_adj_amount + l_bucket_price_rec.adjustment_amount; -- 2892848 SL_latest
8282 
8283 			IF l_debug = FND_API.G_TRUE THEN
8284 			  QP_PREQ_GRP.engine_debug('adjustment_amount: '||l_bucket_price_rec.adjustment_amount);
8285 			  QP_PREQ_GRP.engine_debug('l_pbh_net_adj_amount: '||l_pbh_net_adj_amount);
8286 			END IF; -- END IF l_debug
8287 			*/
8288       --code added to calculate adj amt on order lvl adj
8289       --fix for bug 1767249
8290       IF l_bucket_price_rec.line_type =
8291         G_ORDER_LEVEL
8292         AND l_bucket_price_rec.created_from_list_line_type
8293         <> G_FREIGHT_CHARGE
8294         THEN
8295         IF l_debug = FND_API.G_TRUE THEN
8296           QP_PREQ_GRP.engine_debug('ord lvl adj processing '
8297                                    || l_bucket_price_rec.line_type ||' listlineid '
8298                                    || l_bucket_price_rec.created_from_list_line_id);
8299         END IF;
8300         IF l_ord_dtl_index_tbl.COUNT = 0
8301           THEN
8302           IF l_debug = FND_API.G_TRUE THEN
8303             QP_PREQ_GRP.engine_debug('ord lvl firstrec');
8304           END IF;
8305           l_ord_dtl_index_tbl(1) :=
8306           l_bucket_price_rec.line_detail_index;
8307           --fix for bug2424931 multiply by priced_qty
8308           l_ord_adj_amt_tbl(1) :=
8309           nvl(l_bucket_price_rec.adjustment_amount, 0) *
8310           nvl(l_bucket_price_rec.priced_qty, 0);
8311           IF l_debug = FND_API.G_TRUE THEN
8312             QP_PREQ_GRP.engine_debug('ordlvl firstrec adj '
8313                                      || l_ord_adj_amt_tbl(1));
8314           END IF;
8315         ELSE
8316           FOR n IN
8317             l_ord_dtl_index_tbl.FIRST..l_ord_dtl_index_tbl.LAST
8318             LOOP
8319             IF l_debug = FND_API.G_TRUE THEN
8320               QP_PREQ_GRP.engine_debug('ord lvl adj index '||
8321                                        l_ord_dtl_index_tbl(n) ||' current rec index '
8322                                        || l_bucket_price_rec.line_detail_index
8323                                        ||' count '|| l_ord_dtl_index_tbl.COUNT
8324                                        ||' lastrec dtl index '
8325                                        || l_ord_dtl_index_tbl(l_ord_dtl_index_tbl.LAST));
8326             END IF;
8327             IF l_ord_dtl_index_tbl(n) =
8328               l_bucket_price_rec.line_detail_index
8329               THEN
8330               --fix for bug2424931 multiply by priced_qty
8331               l_ord_adj_amt_tbl(n) := l_ord_adj_amt_tbl(n) +
8332               nvl(l_bucket_price_rec.adjustment_amount, 0) *
8333               nvl(l_bucket_price_rec.priced_qty, 0);
8334               IF l_debug = FND_API.G_TRUE THEN
8335                 QP_PREQ_GRP.engine_debug('ord lvl adj amt '||
8336                                          l_ord_adj_amt_tbl(n));
8337               END IF;
8338               EXIT; --exit the loop once matches
8339             ELSIF l_ord_dtl_index_tbl(n) =
8340               l_ord_dtl_index_tbl(l_ord_dtl_index_tbl.LAST)
8341               AND l_ord_dtl_index_tbl(n) <>
8342               l_bucket_price_rec.line_detail_index
8343               THEN
8344               IF l_debug = FND_API.G_TRUE THEN
8345                 QP_PREQ_GRP.engine_debug('ord lvl lastrec '||
8346                                          l_bucket_price_rec.line_detail_index ||' adjamt '
8347                                          || l_bucket_price_rec.adjustment_amount
8348                                          ||' qty '|| l_bucket_price_rec.priced_qty);
8349               END IF;
8350               l_ord_dtl_index_tbl(l_ord_dtl_index_tbl.COUNT + 1)
8351               := l_bucket_price_rec.line_detail_index;
8352               --fix for bug2424931 multiply by priced_qty
8353               l_ord_adj_amt_tbl(l_ord_dtl_index_tbl.COUNT)
8354               := nvl(l_bucket_price_rec.adjustment_amount, 0) *
8355               nvl(l_bucket_price_rec.priced_qty, 0);
8356               IF l_debug = FND_API.G_TRUE THEN
8357                 QP_PREQ_GRP.engine_debug('ord lvl adj amt '||
8358                                          l_ord_adj_amt_tbl(l_ord_dtl_index_tbl.COUNT));
8359               END IF;
8360             END IF;
8361             IF l_debug = FND_API.G_TRUE THEN
8362               QP_PREQ_GRP.engine_debug('ord lvl adj:dtlindex '
8363                                        || l_ord_dtl_index_tbl(n) ||' adj amt '
8364                                        || l_ord_adj_amt_tbl(n));
8365             END IF;
8366           END LOOP; --l_ord_dtl_index_tbl
8367         END IF; --l_ord_dtl_index_tbl.COUNT
8368       END IF; --order level
8369 
8370 
8371       --end code added to calculate adj amt on order lvl adj
8372       --manual frt charges shd not be returned as applied
8373       IF nvl(l_bucket_price_rec.automatic_flag, G_NO) = G_YES
8374         OR (nvl(l_bucket_price_rec.applied_flag, G_NO) = G_YES
8375             AND nvl(l_bucket_price_rec.updated_flag, G_NO) = G_YES)
8376         THEN
8377         l_bucket_price_rec.applied_flag := G_YES;
8378       ELSE
8379         l_bucket_price_rec.applied_flag := G_NO;
8380       END IF;
8381 
8382       IF l_return_status = FND_API.G_RET_STS_ERROR THEN
8383 
8384         l_bucket_price_rec.process_code :=
8385         FND_API.G_RET_STS_ERROR;
8386         l_bucket_price_rec.pricing_status_text :=
8387         l_return_status_text;
8388       END IF;
8389 
8390 
8391       --populate grp/line qty into line qty
8392       l_bucket_price_rec.priced_quantity :=
8393       l_bucket_price_rec.priced_quantity;
8394       l_ldet_tbl(i) := l_bucket_price_rec;
8395 
8396       IF l_debug = FND_API.G_TRUE THEN
8397         QP_PREQ_GRP.ENGINE_DEBUG('Passed to table:
8398                                  line index '|| l_ldet_tbl(i).line_ind ||
8399                                  ' list_line_id '|| l_ldet_tbl(i).created_from_list_line_id ||
8400                                  ' adjustment amount '|| l_ldet_tbl(i).adjustment_amount ||
8401                                  ' applied flag '|| l_ldet_tbl(i).applied_flag);
8402 
8403 
8404 
8405 
8406       END IF;
8407       IF l_bucket_price_rec.created_from_list_line_type IN
8408         (G_DISCOUNT, G_SURCHARGE, G_PRICE_BREAK_TYPE)
8409         AND nvl(l_bucket_price_rec.accrual_flag, G_NO) = G_NO
8410         THEN
8411 
8412         l_adjusted_price := (l_adjusted_price + nvl(l_return_adjustment, 0));
8413         IF l_debug = FND_API.G_TRUE THEN
8414           QP_PREQ_GRP.ENGINE_DEBUG('Display price: price '
8415                                    --||l_list_price||' sub-t '||l_sub_total_price -- 2892848
8416                                    ||' adj price (USP) '|| l_adjusted_price
8417                                    ||' ret adj '|| l_return_adjustment);
8418         END IF; -- end debug
8419 
8420         j := l_bucket_price_rec.line_ind; -- 2892848
8421 
8422         --Update the adjustment amount for each adjustment
8423         l_lines_tbl(j).line_index := l_bucket_price_rec.line_ind;
8424         l_lines_tbl(j).adjusted_unit_price := l_adjusted_price;
8425 
8426         -- 2892848_latest, do not round here since it is not final USP
8427         --round the selling price if G_ROUND_INDIVIDUAL_ADJ=Y
8428         -- need to re-evaluate how this should work now
8429         /*
8430              IF G_ROUND_INDIVIDUAL_ADJ <> G_NO_ROUND -- shu, fix bug 2239061
8431              and l_lines_tbl(j).rounding_factor IS NOT NULL
8432                         THEN
8433              IF l_debug = FND_API.G_TRUE THEN
8434 			   QP_PREQ_GRP.engine_debug('round current USP, rounding_factor: '
8435 				||l_lines_tbl(j).rounding_factor);
8436              END IF;
8437                                 l_lines_tbl(j).adjusted_unit_price :=
8438                                 round(l_lines_tbl(j).adjusted_unit_price,
8439                                 -1*l_lines_tbl(j).rounding_factor);
8440             END IF; -- END IF G_ROUND_INDIVIDUAL_ADJ = G_ROUND_ADJ
8441             */
8442 
8443         IF l_debug = FND_API.G_TRUE THEN
8444           QP_PREQ_GRP.ENGINE_DEBUG('adjusted_price'
8445                                    || l_lines_tbl(j).adjusted_unit_price ||
8446                                    ' bucket '|| l_bucket_price_rec.pricing_group_sequence ||
8447                                    ' list_line_id '|| l_bucket_price_rec.created_from_list_line_id);
8448         END IF;
8449       END IF;
8450 
8451 
8452       --Freight Charge functionality
8453       IF l_bucket_price_rec.created_from_list_line_type =
8454         G_FREIGHT_CHARGE
8455         AND nvl(l_bucket_price_rec.automatic_flag, G_NO) = G_YES
8456         THEN
8457         IF l_debug = FND_API.G_TRUE THEN
8458           QP_PREQ_GRP.engine_debug('frt chrge func '
8459                                    ||'looping thru freight charge for list_line id '
8460                                    || l_bucket_price_rec.created_from_list_line_id
8461                                    ||' adj amt '
8462                                    || l_bucket_price_rec.adjustment_amount ||' upd '
8463                                    || l_bucket_price_rec.updated_flag);
8464 
8465         END IF;
8466         --deleting all the frt charges to start with
8467         l_ldet_tbl(i).pricing_status_code := G_STATUS_DELETED;
8468         l_ldet_tbl(i).pricing_status_text :=
8469         G_NOT_MAX_FRT_CHARGE;
8470 
8471         IF l_frt_charge_tbl.COUNT = 0
8472           THEN
8473           --no record for charge type subtype combn
8474           --so insert into l_frt_charge_tbl
8475           IF l_debug = FND_API.G_TRUE THEN
8476             QP_PREQ_GRP.engine_debug('No frt charge so far'
8477                                      ||' insert new frt record ');
8478           END IF;
8479           l_frt_charge_tbl(1).line_index :=
8480           l_bucket_price_rec.line_ind;
8481           l_frt_charge_tbl(1).line_detail_index :=
8482           l_bucket_price_rec.line_detail_index;
8483           l_frt_charge_tbl(1).created_from_list_line_id :=
8484           l_bucket_price_rec.created_from_list_line_id;
8485           l_frt_charge_tbl(1).adjustment_amount :=
8486           l_bucket_price_rec.adjustment_amount;
8487           l_frt_charge_tbl(1).charge_type_code :=
8488           l_bucket_price_rec.charge_type_code;
8489           l_frt_charge_tbl(1).charge_subtype_code :=
8490           l_bucket_price_rec.charge_subtype_code;
8491           l_frt_charge_tbl(1).updated_flag :=
8492           nvl(l_bucket_price_rec.updated_flag, G_NO);
8493           --this is to show if a frt rec is max or not
8494           l_ldet_tbl(i).is_max_frt := G_YES;
8495           IF l_bucket_price_rec.modifier_level_code IN
8496             (G_LINE_LEVEL, G_LINE_GROUP)
8497             THEN
8498             l_frt_charge_tbl(1).LEVEL := G_LINE_LEVEL;
8499           ELSIF l_bucket_price_rec.modifier_level_code =
8500             G_ORDER_LEVEL
8501             THEN
8502             l_frt_charge_tbl(1).LEVEL := G_ORDER_LEVEL;
8503           END IF;
8504         ELSIF l_frt_charge_tbl.COUNT > 0
8505           THEN
8506           IF l_debug = FND_API.G_TRUE THEN
8507             QP_PREQ_GRP.engine_debug('frtchrg records exist');
8508 
8509           END IF;
8510           FOR N IN l_frt_charge_tbl.FIRST..l_frt_charge_tbl.LAST
8511             LOOP
8512             IF l_debug = FND_API.G_TRUE THEN
8513               QP_PREQ_GRP.engine_debug('existing frt record id '
8514                                        || l_frt_charge_tbl(N).created_from_list_line_id);
8515               -- begin 2892848
8516               QP_PREQ_GRP.engine_debug('begin shu debug, line_ind: '-- 2892848
8517                                        || l_bucket_price_rec.line_ind ||' line_index: '|| l_frt_charge_tbl(N).line_index );
8518               QP_PREQ_GRP.engine_debug('charge_type_code, rec: '-- 2892848
8519                                        || l_bucket_price_rec.charge_type_code ||' frt tbl: '|| l_frt_charge_tbl(N).charge_type_code );
8520               QP_PREQ_GRP.engine_debug('charge_subtype_code, rec: '-- 2892848
8521                                        || l_bucket_price_rec.charge_subtype_code ||' frt tbl: '|| l_frt_charge_tbl(N).charge_subtype_code );
8522               QP_PREQ_GRP.engine_debug('level, rec: '-- 2892848
8523                                        || l_bucket_price_rec.modifier_level_code ||' frt tbl: '|| l_frt_charge_tbl(N).LEVEL );
8524               -- end 2892848
8525 
8526             END IF; -- end debug
8527             IF l_bucket_price_rec.line_ind = l_frt_charge_tbl(N).line_index -- 2892848, bug fix
8528               AND nvl(l_bucket_price_rec.charge_type_code, 'NULL') =  -- 2892848, bug fix
8529               nvl(l_frt_charge_tbl(N).charge_type_code, 'NULL')
8530               AND nvl(l_bucket_price_rec.charge_subtype_code, 'NULL') =
8531               nvl(l_frt_charge_tbl(N).charge_subtype_code, 'NULL')
8532               AND (l_frt_charge_tbl(N).LEVEL =
8533                    l_bucket_price_rec.modifier_level_code
8534                    OR (l_frt_charge_tbl(N).LEVEL = G_LINE_LEVEL AND
8535                        l_bucket_price_rec.modifier_level_code =
8536                        G_LINE_GROUP))
8537               THEN
8538               --record exists for charge type subtype combn
8539               IF l_debug = FND_API.G_TRUE THEN
8540                 QP_PREQ_GRP.engine_debug('charge combn match'
8541                                          || l_frt_charge_tbl(N).updated_flag);
8542               END IF;
8543               IF nvl(l_frt_charge_tbl(N).updated_flag, G_NO) = G_NO
8544                 THEN
8545                 IF l_debug = FND_API.G_TRUE THEN
8546                   QP_PREQ_GRP.engine_debug('Rec is NOT overriden');
8547                 END IF;
8548                 --only if user has not overridden
8549                 --replace the record with the ct adj
8550                 IF nvl(l_bucket_price_rec.updated_flag, G_NO) =
8551                   G_YES
8552                   THEN
8553                   IF l_debug = FND_API.G_TRUE THEN
8554                     QP_PREQ_GRP.engine_debug('Repl overridden rec');
8555                   END IF;
8556                   --if ct adj is overridden
8557                   l_frt_charge_tbl(N).line_detail_index
8558                   := l_bucket_price_rec.line_detail_index;
8559                   l_frt_charge_tbl(N).created_from_list_line_id :=
8560                   l_bucket_price_rec.created_from_list_line_id;
8561                   l_frt_charge_tbl(N).line_index
8562                   := l_bucket_price_rec.line_ind;
8563                   l_frt_charge_tbl(N).adjustment_amount
8564                   := l_bucket_price_rec.adjustment_amount;
8565                   l_frt_charge_tbl(N).updated_flag
8566                   := l_bucket_price_rec.updated_flag;
8567                 ELSIF nvl(l_bucket_price_rec.updated_flag, G_NO) =
8568                   G_NO
8569                   AND l_bucket_price_rec.adjustment_amount
8570                   > l_frt_charge_tbl(N).adjustment_amount
8571                   THEN
8572                   --if ct adj's adj amt is greater
8573                   IF l_debug = FND_API.G_TRUE THEN
8574                     QP_PREQ_GRP.engine_debug('replace high adjamt');
8575                   END IF;
8576                   l_frt_charge_tbl(N).line_detail_index
8577                   := l_bucket_price_rec.line_detail_index;
8578                   l_frt_charge_tbl(N).created_from_list_line_id
8579                   := l_bucket_price_rec.created_from_list_line_id;
8580                   l_frt_charge_tbl(N).line_index
8581                   := l_bucket_price_rec.line_ind;
8582                   l_frt_charge_tbl(N).adjustment_amount
8583                   := l_bucket_price_rec.adjustment_amount;
8584                   l_frt_charge_tbl(N).updated_flag
8585                   := l_bucket_price_rec.updated_flag;
8586                 END IF; --bucket_price_rec.updated_flag
8587               END IF; --frt_charge_tbl.updated_flag
8588               EXIT;
8589             ELSE
8590               --no match for charge type subtype combn
8591               --so insert into l_frt_charge_tbl
8592               IF l_debug = FND_API.G_TRUE THEN
8593                 QP_PREQ_GRP.engine_debug('charge combn no match');
8594               END IF;
8595               IF N = l_frt_charge_tbl.LAST
8596                 THEN
8597                 --this is the last record and the
8598                 --charge type subtype combn not match
8599                 IF l_debug = FND_API.G_TRUE THEN
8600                   QP_PREQ_GRP.engine_debug('hit last rec in tbl'
8601                                            ||' insert new record ');
8602                   QP_PREQ_GRP.engine_debug('shu debug, l_bucket_price_rec.adjustment_amount: '-- shu, 2892848
8603                                            || l_bucket_price_rec.adjustment_amount); -- 2892848
8604                 END IF;
8605                 l_frt_charge_tbl(N + 1).line_index :=
8606                 l_bucket_price_rec.line_ind;
8607                 l_frt_charge_tbl(N + 1).line_detail_index :=
8608                 l_bucket_price_rec.line_detail_index;
8609                 l_frt_charge_tbl(N + 1).created_from_list_line_id :=
8610                 l_bucket_price_rec.created_from_list_line_id;
8611                 l_frt_charge_tbl(N + 1).adjustment_amount :=
8612                 l_bucket_price_rec.adjustment_amount;
8613                 l_frt_charge_tbl(N + 1).charge_type_code :=
8614                 l_bucket_price_rec.charge_type_code;
8615                 l_frt_charge_tbl(N + 1).charge_subtype_code :=
8616                 l_bucket_price_rec.charge_subtype_code;
8617                 l_frt_charge_tbl(N + 1).updated_flag :=
8618                 nvl(l_bucket_price_rec.updated_flag, G_NO);
8619                 --this is to show if a frt rec is max or not
8620                 l_ldet_tbl(i).is_max_frt := G_YES;
8621                 IF l_bucket_price_rec.modifier_level_code IN
8622                   (G_LINE_LEVEL, G_LINE_GROUP)
8623                   THEN
8624                   l_frt_charge_tbl(N + 1).LEVEL :=
8625                   G_LINE_LEVEL;
8626                 ELSIF l_bucket_price_rec.modifier_level_code =
8627                   G_ORDER_LEVEL
8628                   THEN
8629                   l_frt_charge_tbl(N + 1).LEVEL :=
8630                   G_ORDER_LEVEL;
8631                 END IF;
8632               END IF; --last rec of frt_charge_tbl
8633             END IF; --matching charge_type/subtype
8634           END LOOP; --loop thru the frt charge tbl
8635         END IF; --frt charge tbl count
8636 
8637       END IF; --created_from_list_line_type is frt charge
8638 
8639     END LOOP;
8640     CLOSE l_bucket_price_cur;
8641 
8642     --Freight Charge Functionality update status of frt charge adj
8643     IF l_frt_charge_tbl.COUNT > 0
8644       THEN
8645       IF QP_PREQ_GRP.G_DEBUG_ENGINE = FND_API.G_TRUE
8646         THEN
8647         FOR S IN l_frt_charge_tbl.FIRST..l_frt_charge_tbl.LAST
8648           LOOP
8649           IF l_debug = FND_API.G_TRUE THEN
8650             QP_PREQ_GRP.engine_debug('shu debug, line_index: '-- shu, 2892848
8651                                      || l_frt_charge_tbl(s).line_index); -- 2892848
8652             QP_PREQ_GRP.engine_debug('shu debug, l_frt_charge_tbl.line_detail_index: '-- shu, 2892848
8653                                      || l_frt_charge_tbl(s).line_detail_index); -- 2892848
8654             QP_PREQ_GRP.engine_debug('display frt dlts '
8655                                      ||' list line id '
8656                                      || l_frt_charge_tbl(s).created_from_list_line_id);
8657           END IF;
8658         END LOOP;
8659       END IF;
8660       FOR N IN l_ldet_tbl.FIRST..l_ldet_tbl.LAST
8661         LOOP
8662         IF l_debug = FND_API.G_TRUE THEN
8663           QP_PREQ_GRP.engine_debug('in frt charge loop (SL, l_ldet_tbl loop) '-- 2892848
8664                                    || l_ldet_tbl(N).created_from_list_line_id
8665                                    ||' '|| l_ldet_tbl(N).created_from_list_line_type
8666                                    ||' sts '|| l_ldet_tbl(N).pricing_status_code
8667                                    ||' is max frt '|| l_ldet_tbl(N).is_max_frt);
8668         END IF;
8669         IF l_ldet_tbl(N).created_from_list_line_type =
8670           G_FREIGHT_CHARGE
8671           THEN
8672           M := l_frt_charge_tbl.FIRST;
8673           WHILE M IS NOT NULL
8674             LOOP
8675             IF l_ldet_tbl(N).line_detail_index =
8676               l_frt_charge_tbl(M).line_detail_index
8677               AND l_ldet_tbl(N).line_ind =  -- 2892848 fix bug
8678               l_frt_charge_tbl(M).line_index -- 2892848 fix bug
8679               THEN
8680               l_ldet_tbl(N).pricing_status_code :=
8681               G_STATUS_NEW;
8682               l_ldet_tbl(N).pricing_status_text :=
8683               'MAX FRT CHARGE';
8684               l_frt_charge_tbl.DELETE(M);
8685               IF l_debug = FND_API.G_TRUE THEN
8686                 QP_PREQ_GRP.engine_debug('applied frt charge '
8687                                          || l_ldet_tbl(N).created_from_list_line_id);
8688               END IF;
8689             END IF;
8690             M := l_frt_charge_tbl.NEXT(M);
8691           END LOOP; --frt_charge_tbl
8692         END IF;
8693       END LOOP;
8694     END IF; --frt_charge_tbl.count
8695 
8696     -- begin 2892848 shu test, move outer j loop head to here
8697     j := 0;
8698 
8699     j := l_lines_tbl.FIRST;
8700     WHILE j IS NOT NULL LOOP -- end 2892848
8701 
8702       IF l_debug = FND_API.G_TRUE THEN
8703         QP_PREQ_GRP.ENGINE_DEBUG('Processed lines:
8704                                  line index'|| l_lines_tbl(j).line_index
8705                                  ||' updated adjusted price '
8706                                  || l_lines_tbl(j).updated_adjusted_unit_price
8707                                  ||' adjustment count '|| l_ldet_tbl.COUNT);
8708 
8709       END IF;
8710       x := l_ldet_tbl.FIRST;
8711       WHILE x IS NOT NULL LOOP
8712         IF l_debug = FND_API.G_TRUE THEN
8713           QP_PREQ_GRP.ENGINE_DEBUG('line_detail_index '
8714                                    || l_ldet_tbl(x).line_detail_index
8715                                    ||'up adj price1 '
8716                                    || l_ldet_tbl(x).created_from_list_line_id
8717                                    ||' status '
8718                                    || l_ldet_tbl(x).pricing_status_code
8719                                    ||' count '|| l_ldet_tbl.COUNT);
8720         END IF;
8721 
8722         /*
8723 INDX,QP_PREQ_PUB.calculate_price.upd1,qp_npreq_ldets_tmp_U1,LINE_DETAIL_INDEX,1
8724 */
8725         UPDATE qp_npreq_ldets_tmp SET
8726                 adjustment_amount = l_ldet_tbl(x).adjustment_amount,
8727                 applied_flag = l_ldet_tbl(x).applied_flag,
8728                 line_quantity = l_ldet_tbl(x).priced_quantity,
8729                 --included for freight charge functionality
8730                 pricing_status_code = l_ldet_tbl(x).pricing_status_code,
8731                 pricing_status_text = l_ldet_tbl(x).pricing_status_text
8732                 WHERE line_detail_index = l_ldet_tbl(x).line_detail_index;
8733 
8734         x := l_ldet_tbl.NEXT(x);
8735       END LOOP;
8736 
8737 
8738       /*****************************************************************
8739 BACK CALCULATION ROUTINE
8740 ******************************************************************/
8741 
8742       IF l_debug = FND_API.G_TRUE THEN
8743         QP_PREQ_GRP.ENGINE_DEBUG('BACK CALCULATION ROUTINE ');
8744 
8745       END IF;
8746       l_ldet_tbl.DELETE;
8747 
8748       --changes for bug 1963391
8749       --if a manual adj is applied and user overrides selling price back to original
8750       --price there is no point to check for back_calculate at the beginning
8751       --as l_amount_changed will be zero whereas at this point
8752       --l_amount_changed will not be zero
8753 
8754       IF l_debug = FND_API.G_TRUE THEN
8755         QP_PREQ_GRP.ENGINE_DEBUG('BACK CALCULATION check: upd adj price '
8756                                  || l_lines_tbl(j).updated_adjusted_unit_price
8757                                  ||' adj price '|| l_lines_tbl(j).adjusted_unit_price);
8758 
8759       END IF;
8760       --fix for rounding issue for bug 2146050
8761       --round the overridden selling price
8762 
8763       l_adjusted_unit_price_ur(j) := l_lines_tbl(j).adjusted_unit_price; --[prarasto:Post Round]
8764       l_updated_adj_unit_price_ur(j) := l_lines_tbl(j).updated_adjusted_unit_price; --[prarasto:Post Round]
8765 
8766       IF l_lines_tbl(j).rounding_factor IS NOT NULL
8767         AND G_ROUND_INDIVIDUAL_ADJ not in ( G_NO_ROUND, G_POST_ROUND ) --[prarasto:Post Round] added check to
8768                                                                        --skip rounding for Post Round option
8769         THEN
8770         --first round the overridden selling price--2146050
8771         l_lines_tbl(j).updated_adjusted_unit_price :=
8772         round(l_lines_tbl(j).updated_adjusted_unit_price,
8773               - 1 * l_lines_tbl(j).rounding_factor);
8774 
8775         --also need to round final USP for the line here -2892848_latest
8776         l_lines_tbl(j).adjusted_unit_price :=
8777         round(l_lines_tbl(j).adjusted_unit_price,
8778               - 1 * l_lines_tbl(j).rounding_factor);
8779       END IF;
8780 
8781       -- 2892848
8782       IF l_debug = FND_API.G_TRUE THEN
8783         QP_PREQ_GRP.ENGINE_DEBUG('AFTER ROUNDING, adjusted_unit_price:'
8784                                  || l_lines_tbl(j).adjusted_unit_price
8785                                  ||' updated_adjusted_unit_price: '|| l_lines_tbl(j).adjusted_unit_price);
8786 
8787       END IF;
8788 
8789       --this amount changed is also rounded --2146050
8790       l_amount_changed := l_lines_tbl(j).updated_adjusted_unit_price
8791       - l_lines_tbl(j).adjusted_unit_price;
8792 
8793       l_back_calc_dtl_index := 0;
8794       l_back_calc_adj_amt := 0;
8795 
8796       --Back calculation
8797       IF (l_lines_tbl(j).updated_adjusted_unit_price IS NULL
8798           OR l_amount_changed = 0) --no back cal if no amt change
8799         THEN
8800         IF l_debug = FND_API.G_TRUE THEN
8801           QP_PREQ_GRP.ENGINE_DEBUG('no back calculation');
8802         END IF;
8803         BACK_CALCULATE := FALSE;
8804       ELSE
8805         IF l_debug = FND_API.G_TRUE THEN
8806           QP_PREQ_GRP.ENGINE_DEBUG('back calculation set');
8807         END IF;
8808         BACK_CALCULATE := TRUE;
8809 
8810         OPEN l_chk_backcal_adj_exist_cur(l_lines_tbl(j).line_index);
8811         FETCH l_chk_backcal_adj_exist_cur INTO
8812         l_back_calc_dtl_index, l_back_calc_adj_amt;
8813         CLOSE l_chk_backcal_adj_exist_cur;
8814 
8815         l_back_calc_dtl_index :=
8816         nvl(l_back_calc_dtl_index, 0);
8817         l_back_calc_adj_amt :=
8818         nvl(l_back_calc_adj_amt, 0);
8819         IF l_debug = FND_API.G_TRUE THEN
8820           QP_PREQ_GRP.engine_debug('back cal dtl '||
8821                                    l_back_calc_dtl_index ||' adjamt '|| l_back_calc_adj_amt);
8822         END IF;
8823 
8824         --changes for bug 2043442
8825         --calculate effective change in amount change which
8826         --includes the manual adjustment that may be applied
8827         --already irrespective of whether applied_flag is Y or N
8828         --This will recalculate adjustment amount rather
8829         --than calculating effective change when SP is overridden
8830         --second time or thereafter
8831         l_amount_changed := l_amount_changed +
8832         l_back_calc_adj_amt;
8833 
8834         IF l_debug = FND_API.G_TRUE THEN
8835           QP_PREQ_GRP.engine_debug('back cal dtl '||
8836                                    ' amt changed '|| l_amount_changed);
8837 
8838         END IF;
8839         IF l_amount_changed <= 0 THEN
8840           l_BACK_CALCULATE_START_TYPE := G_DISCOUNT;
8841         ELSIF l_amount_changed > 0 THEN
8842           l_BACK_CALCULATE_START_TYPE := G_SURCHARGE;
8843         END IF;
8844         IF l_debug = FND_API.G_TRUE THEN
8845           QP_PREQ_GRP.ENGINE_DEBUG('back calculation start type'
8846                                    || l_BACK_CALCULATE_START_TYPE
8847                                    ||' amount changed '|| l_amount_changed);
8848 
8849         END IF;
8850         l_return_status := '';
8851         l_return_status_text := '';
8852 
8853         IF l_debug = FND_API.G_TRUE THEN
8854           QP_PREQ_GRP.ENGINE_DEBUG('before back calculation '
8855                                    || l_lines_tbl(j).line_index
8856                                    ||' amt changed '|| l_amount_changed);
8857         END IF;
8858         IF l_amount_changed <= 0 THEN
8859           G_BACK_CALCULATION_CODE := 'DIS';
8860         ELSE
8861           G_BACK_CALCULATION_CODE := 'SUR';
8862         END IF; --l_amount_changed_tbl
8863         BACK_CALCULATION(l_lines_tbl(j).line_index
8864                          , l_amount_changed
8865                          , l_back_calc_ret_rec
8866                          , l_return_status
8867                          , l_return_status_text);
8868         IF l_debug = FND_API.G_TRUE THEN
8869           QP_PREQ_GRP.ENGINE_DEBUG('after back calculation ');
8870 
8871         END IF;
8872 
8873         IF l_lines_tbl(j).rounding_factor IS NOT NULL
8874           AND G_ROUND_INDIVIDUAL_ADJ = G_ROUND_ADJ
8875           THEN
8876           --round the adjustment amount --2146050
8877           --it must have been rounded already
8878           l_back_calc_ret_rec.adjustment_amount :=
8879           round(l_back_calc_ret_rec.adjustment_amount,
8880                 - 1 * l_back_calc_ret_rec.rounding_factor);
8881           IF l_debug = FND_API.G_TRUE THEN
8882             QP_PREQ_GRP.ENGINE_DEBUG('back calc rounded '
8883                                      || l_back_calc_ret_rec.adjustment_amount
8884                                      ||' roundingfac '
8885                                      || l_back_calc_ret_rec.rounding_factor);
8886           END IF;
8887         END IF;
8888 
8889       END IF;
8890       --end changes for bug 1963391
8891 
8892 
8893 
8894       IF BACK_CALCULATE
8895         THEN
8896         IF l_debug = FND_API.G_TRUE THEN
8897           QP_PREQ_GRP.ENGINE_DEBUG('Back calculate');
8898         END IF;
8899         IF l_back_calc_ret_rec.calculation_code
8900           = G_BACK_CALCULATE
8901           THEN
8902 
8903           IF l_debug = FND_API.G_TRUE THEN
8904             QP_PREQ_GRP.ENGINE_DEBUG('Back Calculate: '
8905                                      ||'before update ldets: line_detail_index '
8906                                      || l_back_calc_ret_rec.line_detail_index
8907                                      ||' list line id '
8908                                      || l_back_calc_ret_rec.list_line_id
8909                                      ||' adjustment amount '
8910                                      || l_back_calc_ret_rec.adjustment_amount
8911                                      ||' operand '|| l_back_calc_ret_rec.operand_value
8912                                      ||' calculation_code '
8913                                      || l_back_calc_ret_rec.calculation_code);
8914 
8915             QP_PREQ_GRP.engine_debug('chk back cal dtl '||
8916                                      l_back_calc_dtl_index);
8917 
8918           END IF;
8919           IF l_back_calc_dtl_index <> 0
8920             AND l_back_calc_dtl_index <>
8921             l_back_calc_ret_rec.line_detail_index
8922             THEN
8923             --delete the existing back calculated adj
8924             UPDATE qp_npreq_ldets_tmp
8925                     SET applied_flag = G_NO,
8926                     calculation_code = NULL,
8927                     pricing_status_code = G_STATUS_DELETED,
8928                     pricing_status_text =
8929                     'DELETED IN BACK CALC DUE TO CHANGE IN ADJ AMT'
8930             WHERE line_detail_index = l_back_calc_dtl_index;
8931 
8932           END IF;
8933 
8934           /*
8935 INDX,QP_PREQ_PUB.calculate_price.upd2,qp_npreq_ldets_tmp_U1,LINE_DETAIL_INDEX,1
8936 */
8937           UPDATE qp_npreq_ldets_tmp ldet
8938           SET ldet.operand_value =
8939                   l_back_calc_ret_rec.operand_value
8940           , ldet.adjustment_amount =
8941                   l_back_calc_ret_rec.adjustment_amount
8942           , ldet.applied_flag =
8943                   l_back_calc_ret_rec.applied_flag
8944           , ldet.updated_flag =
8945                   l_back_calc_ret_rec.updated_flag
8946           , ldet.process_code =
8947                   l_back_calc_ret_rec.process_code
8948           , ldet.pricing_status_text =
8949                   l_back_calc_ret_rec.pricing_status_text
8950           , ldet.calculation_code =
8951                   l_back_calc_ret_rec.calculation_code
8952           WHERE ldet.line_detail_index =
8953                   l_back_calc_ret_rec.line_detail_index
8954           AND ldet.line_index =
8955                   l_back_calc_ret_rec.line_index
8956           AND ldet.created_from_list_line_id =
8957                   l_back_calc_ret_rec.list_line_id;
8958         END IF;
8959       END IF; --back_calculate
8960 
8961       IF l_debug = FND_API.G_TRUE THEN
8962         QP_PREQ_GRP.engine_debug('return sts '|| l_return_status);
8963         QP_PREQ_GRP.engine_debug('return txt '|| l_return_status_text);
8964       END IF;
8965       IF BACK_CALCULATE
8966         THEN
8967         IF l_debug = FND_API.G_TRUE THEN
8968           QP_PREQ_GRP.ENGINE_DEBUG('Back calculate');
8969 
8970         END IF;
8971         IF l_return_status = FND_API.G_RET_STS_SUCCESS
8972           THEN
8973           IF l_debug = FND_API.G_TRUE THEN
8974             QP_PREQ_GRP.ENGINE_DEBUG('Back calculate Success');
8975           END IF;
8976           l_lines_tbl(j).processed_flag := G_PROCESSED;
8977           --change for bug 2146050
8978           --recalculate the selling price again after back calc
8979           l_lines_tbl(j).adjusted_unit_price :=
8980           l_lines_tbl(j).adjusted_unit_price +
8981           nvl(l_back_calc_ret_rec.adjustment_amount, 0);
8982 
8983           --[prarasto:Post Round] added to calculate unrounded adjusted unit price after calculating adjustment amount
8984           l_adjusted_unit_price_ur(j) := l_adjusted_unit_price_ur(j) +
8985                                         nvl(l_back_calc_ret_rec.adjustment_amount, 0);
8986 
8987           --round the SP if G_ROUND_INDIVIDUAL_ADJ=G_NO_ROUND_ADJ
8988           --IF G_ROUND_INDIVIDUAL_ADJ = G_NO_ROUND_ADJ
8989 
8990 --          IF G_ROUND_INDIVIDUAL_ADJ <> G_NO_ROUND -- shu fix 2239061,
8991          IF G_ROUND_INDIVIDUAL_ADJ not in ( G_NO_ROUND, G_POST_ROUND ) --[prarasto:Post Round] added check to
8992                                                                        --skip rounding for Post Round option
8993             AND l_lines_tbl(j).rounding_factor IS NOT NULL
8994             THEN
8995             IF l_debug = FND_API.G_TRUE THEN
8996               QP_PREQ_GRP.engine_debug('need to round selling price, rounding_factor: '
8997                                        || l_lines_tbl(j).rounding_factor);
8998             END IF;
8999             l_lines_tbl(j).adjusted_unit_price :=
9000             round(l_lines_tbl(j).adjusted_unit_price,
9001                   - 1 * l_lines_tbl(j).rounding_factor);
9002           END IF;
9003         ELSE
9004           IF l_debug = FND_API.G_TRUE THEN
9005             QP_PREQ_GRP.ENGINE_DEBUG('Back calculate Failure');
9006           END IF;
9007           l_lines_tbl(j).processed_flag := G_NOT_PROCESSED;
9008           l_lines_tbl(j).processed_code :=
9009           QP_PREQ_PUB.G_BACK_CALCULATION_STS;
9010           l_lines_tbl(j).pricing_status_code :=
9011           QP_PREQ_PUB.G_BACK_CALCULATION_STS;
9012           l_lines_tbl(j).pricing_status_text := l_return_status_text;
9013         END IF; --l_return_status
9014       ELSE
9015         IF l_debug = FND_API.G_TRUE THEN
9016           QP_PREQ_GRP.ENGINE_DEBUG('NO Back calculate');
9017         END IF;
9018         l_lines_tbl(j).processed_flag := G_PROCESSED;
9019       END IF; --back_calculate
9020 
9021 
9022       IF l_lines_tbl(j).processed_flag = G_PROCESSED THEN
9023         /*
9024 INDX,QP_PREQ_PUB.calculate_price.upd3,qp_npreq_lines_tmp_N1,LINE_INDEX,1
9025 */
9026         UPDATE qp_npreq_lines_tmp SET adjusted_unit_price
9027                 = nvl(l_lines_tbl(j).updated_adjusted_unit_price,
9028                       l_lines_tbl(j).adjusted_unit_price)
9029                 --, adjusted_unit_price_ur = nvl(l_updated_adj_unit_price_ur(j), --[prarasto:Post Round] added unrounded adjusted unit price, [julin/postround] redesign
9030                 --                               l_adjusted_unit_price_ur(j))
9031                 , processed_flag = l_lines_tbl(j).processed_flag
9032                 , processed_code = l_lines_tbl(j).processed_code
9033                 , pricing_status_code =
9034                                 l_lines_tbl(j).pricing_status_code
9035                 , pricing_status_text =
9036                                 l_lines_tbl(j).pricing_status_text
9037                 , QUALIFIERS_EXIST_FLAG = G_CALCULATE_ONLY
9038                 WHERE line_index = l_lines_tbl(j).line_index;
9039 
9040 
9041         IF l_debug = FND_API.G_TRUE THEN
9042           QP_PREQ_GRP.ENGINE_DEBUG('Processed Price:
9043                                    line index'|| l_lines_tbl(j).line_index ||
9044                                    ' adjusted price '|| l_lines_tbl(j).adjusted_unit_price ||
9045                                    'processed_code' || l_lines_tbl(j).processed_code);
9046         END IF;
9047       ELSE
9048         /*
9049 INDX,QP_PREQ_PUB.calculate_price.upd4,qp_npreq_lines_tmp_N1,LINE_INDEX,1
9050 */
9051         UPDATE qp_npreq_lines_tmp SET adjusted_unit_price
9052                 = l_lines_tbl(j).adjusted_unit_price
9053                 --, adjusted_unit_price_ur = l_adjusted_unit_price_ur(j) --[prarasto:Post Round] added unrounded adjusted unit price, [julin/postround] redesign
9054                 , processed_flag = l_lines_tbl(j).processed_flag
9055                 , processed_code = l_lines_tbl(j).processed_code
9056                 , pricing_status_code =
9057                                 l_lines_tbl(j).pricing_status_code
9058                 , pricing_status_text =
9059                                 l_lines_tbl(j).pricing_status_text
9060                 , QUALIFIERS_EXIST_FLAG = G_CALCULATE_ONLY
9061                 WHERE line_index = l_lines_tbl(j).line_index;
9062 
9063 
9064         IF l_debug = FND_API.G_TRUE THEN
9065           QP_PREQ_GRP.ENGINE_DEBUG('Failed Process price:
9066                                    line index '|| l_lines_tbl(j).line_index ||
9067                                    ' adjusted price '|| l_lines_tbl(j).adjusted_unit_price ||
9068                                    'processed_code' || l_lines_tbl(j).processed_code);
9069         END IF;
9070       END IF;
9071 
9072 
9073 
9074 
9075 
9076 
9077 
9078       j := l_lines_tbl.NEXT(j);
9079       IF l_debug = FND_API.G_TRUE THEN
9080         QP_PREQ_GRP.ENGINE_DEBUG('-----------------------------------');
9081       END IF;
9082     END LOOP;
9083 
9084     --to update adj amt on order level adjustments
9085     IF l_ord_dtl_index_tbl.COUNT > 0
9086       THEN
9087       IF l_debug = FND_API.G_TRUE THEN
9088         QP_PREQ_GRP.engine_debug('updating order lvl adj amt: '||
9089                                  l_ord_dtl_index_tbl.COUNT);
9090       END IF;
9091       FORALL i IN l_ord_dtl_index_tbl.FIRST..l_ord_dtl_index_tbl.LAST
9092       UPDATE qp_npreq_ldets_tmp
9093       SET adjustment_amount = l_ord_adj_amt_tbl(i)
9094               WHERE line_detail_index = l_ord_dtl_index_tbl(i);
9095     END IF;
9096 
9097 
9098 
9099     --GSA VIOLATION CHECK
9100 
9101     -- Call GSA Check only for non-gsa customers(GSA_QUALIFIER_FLAG IS NULL)
9102     IF G_GSA_CHECK_FLAG = G_YES
9103       AND G_GSA_ENABLED_FLAG = G_YES
9104       THEN
9105       IF l_debug = FND_API.G_TRUE THEN
9106         QP_PREQ_GRP.engine_debug('Begin Pub GSA check');
9107 
9108       END IF;
9109       /*
9110 INDX,QP_PREQ_PUB.calculate_price.upd5,qp_npreq_lines_tmp_N2,LINE_TYPE_CODE,1
9111 INDX,QP_PREQ_PUB.calculate_price.upd5,qp_npreq_line_attrs_tmp_N2,LINE_TYPE_CODE,1
9112 INDX,QP_PREQ_PUB.calculate_price.upd5,qp_npreq_line_attrs_tmp_N1,LINE_INDEX,1
9113 INDX,QP_PREQ_PUB.calculate_price.upd5,qp_npreq_line_attrs_tmp_N1,ATTRIBUTE_TYPE,2
9114 INDX,QP_PREQ_PUB.calculate_price.upd5,QP_PRICING_ATTRIBUTES_N5,PRICING_PHASE_ID,1
9115 INDX,QP_PREQ_PUB.calculate_price.upd5,QP_PRICING_ATTRIBUTES_N5,QUALIFICATION_IND,2
9116 INDX,QP_PREQ_PUB.calculate_price.upd5,QP_PRICING_ATTRIBUTES_N5,PRODUCT_ATTRIBUTE_CONTEXT,3
9117 INDX,QP_PREQ_PUB.calculate_price.upd5,QP_PRICING_ATTRIBUTES_N5,PRODUCT_ATTRIBUTE,4
9118 INDX,QP_PREQ_PUB.calculate_price.upd5,QP_PRICING_ATTRIBUTES_N5,PRODUCT_ATTRIBUTE_VALUE,5
9119 INDX,QP_PREQ_PUB.calculate_price.upd5,QP_PRICING_ATTRIBUTES_N5,EXCLUDER_FLAG,6
9120 INDX,QP_PREQ_PUB.calculate_price.upd5,QP_PRICING_ATTRIBUTES_N5,LIST_HEADER_ID,7
9121 INDX,QP_PREQ_PUB.calculate_price.upd5,QP_PRICING_ATTRIBUTES_N5,LIST_LINE_ID,8
9122 INDX,QP_PREQ_PUB.calculate_price.upd5,QP_PRICE_REQ_SOURCES_PK,REQUEST_TYPE_CODE,1
9123 INDX,QP_PREQ_PUB.calculate_price.upd5,QP_LIST_HEADERS_B_N1,ACTIVE_FLAG,1
9124 INDX,QP_PREQ_PUB.calculate_price.upd5,QP_LIST_HEADERS_B_N1,CURRENCY_CODE,2
9125 INDX,QP_PREQ_PUB.calculate_price.upd5,QP_LIST_HEADERS_B_N1,LIST_TYPE_CODE,3
9126 INDX,QP_PREQ_PUB.calculate_price.upd5,QP_LIST_HEADERS_B_N1,SOURCE_SYSTEM_CODE,4
9127 INDX,QP_PREQ_PUB.calculate_price.upd5,QP_LIST_HEADERS_B_N1,LIST_HEADER_ID,5
9128 INDX,QP_PREQ_PUB.calculate_price.upd5,QP_LIST_HEADERS_B_N1,GSA_INDICATOR,6
9129 INDX,QP_PREQ_PUB.calculate_price.upd5,QP_LIST_LINES_PK,LIST_LINE_ID,1
9130 */
9131       IF l_debug = FND_API.G_TRUE THEN
9132         QP_PREQ_GRP.engine_debug('Pub GSA attr_mgr_installed '
9133                                  || G_ATTR_MGR_INSTALLED);
9134       END IF;
9135       IF G_ATTR_MGR_INSTALLED = G_NO
9136         THEN
9137         UPDATE qp_npreq_lines_tmp line
9138         SET line.pricing_status_code = G_STATUS_GSA_VIOLATION
9139            , line.pricing_status_text = 'QP_PREQ_PUB: GSA VIOLATION'
9140         WHERE line.line_type_code = G_LINE_LEVEL
9141         --made this change look at only successful lines
9142                 AND line.pricing_status_code IN
9143                         (G_STATUS_UPDATED, G_STATUS_UNCHANGED)
9144                 AND NOT EXISTS (SELECT 'X'
9145                                 FROM qp_npreq_line_attrs_tmp gsa_attr
9146                                 WHERE gsa_attr.line_index = line.line_index
9147                                 --fix for bug 2080187
9148                                 AND gsa_attr.pricing_status_code = G_STATUS_UNCHANGED
9149                                 AND gsa_attr.attribute_type = G_QUALIFIER_TYPE
9150                                 AND gsa_attr.context = G_CUSTOMER_CONTEXT
9151                                 AND gsa_attr.attribute = G_GSA_ATTRIBUTE
9152                                 AND gsa_attr.value_from = G_YES)
9153                   AND line.adjusted_unit_price <=
9154                 --(SELECT /*+ ORDERED USE_NL(qpa ql req lhdr) */ MIN(ql.operand)  -- 7323912
9155 		(SELECT /*+ ORDERED USE_NL(qpa ql req lhdr) INDEX(LHDR QP_LIST_HEADERS_B_N9) */ MIN(ql.operand)  -- 7323912
9156                  FROM qp_npreq_line_attrs_tmp lattr,
9157                  qp_pricing_attributes qpa,
9158                  qp_list_headers_b lhdr,   --7323912
9159 		 qp_price_req_sources req, --7323912
9160                  qp_list_lines ql
9161                  WHERE lattr.line_index = line.line_index
9162                  AND lattr.attribute_type = G_PRODUCT_TYPE
9163                  AND lattr.context = qpa.product_attribute_context
9164                  AND lattr.attribute = qpa.product_attribute
9165                  AND lattr.value_from = qpa.product_attr_value
9166                  AND qpa.excluder_flag = G_NO
9167                  AND qpa.pricing_phase_id = 2
9168                  AND qpa.qualification_ind = 6
9169                  AND lattr.line_index = line.line_index
9170                  AND req.request_type_code = line.request_type_code
9171                  AND lhdr.list_header_id = qpa.list_header_id
9172                  AND lhdr.active_flag = G_YES
9173                  AND ((lhdr.currency_code IS NOT NULL AND lhdr.currency_code = line.currency_code)
9174                       OR
9175                       lhdr.currency_code IS NULL) -- optional currency
9176                  AND lhdr.list_type_code = G_DISCOUNT_LIST_HEADER
9177                  AND lhdr.source_system_code = req.source_system_code
9178                  AND lhdr.gsa_indicator = G_YES
9179                  AND trunc(line.pricing_effective_date) BETWEEN
9180                  trunc(nvl(lhdr.start_date_active
9181                            , line.pricing_effective_date))
9182                  AND trunc(nvl(lhdr.End_date_active
9183                                , line.pricing_effective_date))
9184                  AND qpa.list_line_id = ql.list_line_id
9185                  AND trunc(line.pricing_effective_date) BETWEEN
9186                  trunc(nvl(ql.start_date_active
9187                            , line.pricing_effective_date))
9188                  AND trunc(nvl(ql.End_date_active
9189                                , line.pricing_effective_date)));
9190       ELSE --G_ATTR_MGR_INSTALLED
9191         UPDATE qp_npreq_lines_tmp line
9192         SET line.pricing_status_code = G_STATUS_GSA_VIOLATION
9193            , line.pricing_status_text = 'QP_PREQ_PUB: GSA VIOLATION'
9194         WHERE line.line_type_code = G_LINE_LEVEL
9195         --made this change look at only successful lines
9196                 AND line.pricing_status_code IN
9197                         (G_STATUS_UPDATED, G_STATUS_UNCHANGED)
9198                 AND NOT EXISTS (SELECT 'X'
9199                                 FROM qp_npreq_line_attrs_tmp gsa_attr
9200                                 WHERE gsa_attr.line_index = line.line_index
9201                                 --fix for bug 2080187
9202                                 AND gsa_attr.pricing_status_code = G_STATUS_UNCHANGED
9203                                 AND gsa_attr.attribute_type = G_QUALIFIER_TYPE
9204                                 AND gsa_attr.context = G_CUSTOMER_CONTEXT
9205                                 AND gsa_attr.attribute = G_GSA_ATTRIBUTE
9206                                 AND gsa_attr.value_from = G_YES)
9207                   AND line.adjusted_unit_price <=
9208                  --(SELECT /*+ ORDERED USE_NL(qpa ql req lhdr) */ MIN(ql.operand)   --7323912
9209 		 (SELECT /*+ ORDERED USE_NL(qpa ql req lhdr) INDEX(LHDR QP_LIST_HEADERS_B_N9) */ MIN(ql.operand)   --7323912
9210                  FROM qp_npreq_line_attrs_tmp lattr,
9211                  qp_pricing_attributes qpa,
9212                  qp_list_headers_b lhdr,	--7323912
9213 		 qp_price_req_sources_v req,	--7323912
9214                  qp_list_lines ql
9215                  WHERE lattr.line_index = line.line_index
9216                  AND lattr.attribute_type = G_PRODUCT_TYPE
9217                  AND lattr.context = qpa.product_attribute_context
9218                  AND lattr.attribute = qpa.product_attribute
9219                  AND lattr.value_from = qpa.product_attr_value
9220                  AND qpa.excluder_flag = G_NO
9221                  AND qpa.pricing_phase_id = 2
9222                  AND qpa.qualification_ind = 6
9223                  AND lattr.line_index = line.line_index
9224                  AND req.request_type_code = line.request_type_code
9225                  AND lhdr.list_header_id = qpa.list_header_id
9226                  AND lhdr.active_flag = G_YES
9227                  AND ((lhdr.currency_code IS NOT NULL AND lhdr.currency_code = line.currency_code)
9228                       OR
9229                       lhdr.currency_code IS NULL) -- optional currency
9230                  AND lhdr.list_type_code = G_DISCOUNT_LIST_HEADER
9231                  AND lhdr.source_system_code = req.source_system_code
9232                  AND lhdr.gsa_indicator = G_YES
9233                  AND trunc(line.pricing_effective_date) BETWEEN
9234                  trunc(nvl(lhdr.start_date_active
9235                            , line.pricing_effective_date))
9236                  AND trunc(nvl(lhdr.End_date_active
9237                                , line.pricing_effective_date))
9238                  AND qpa.list_line_id = ql.list_line_id
9239                  AND trunc(line.pricing_effective_date) BETWEEN
9240                  trunc(nvl(ql.start_date_active
9241                            , line.pricing_effective_date))
9242                  AND trunc(nvl(ql.End_date_active
9243                                , line.pricing_effective_date)));
9244       END IF;
9245       IF l_debug = FND_API.G_TRUE THEN
9246         QP_PREQ_GRP.engine_debug('End Pub GSA check');
9247       END IF;
9248     END IF;
9249 
9250 
9251 
9252     --GSA VIOLATION CHECK
9253 
9254 
9255     X_RETURN_STATUS := FND_API.G_RET_STS_SUCCESS;
9256     X_RETURN_STATUS_TEXT := l_routine ||' SUCCESS ';
9257 
9258     IF l_debug = FND_API.G_TRUE THEN
9259       QP_PREQ_GRP.ENGINE_DEBUG('end calculate price');
9260     END IF;
9261   EXCEPTION
9262     WHEN Calculate_Exc THEN
9263       IF l_debug = FND_API.G_TRUE THEN
9264         QP_PREQ_GRP.ENGINE_DEBUG('Error in calculate_price'|| x_return_status_text);
9265       END IF;
9266       X_RETURN_STATUS := FND_API.G_RET_STS_ERROR;
9267     WHEN OTHERS THEN
9268       IF l_debug = FND_API.G_TRUE THEN
9269         QP_PREQ_GRP.ENGINE_DEBUG('Error in calculate_price'|| SQLERRM);
9270       END IF;
9271       X_RETURN_STATUS := FND_API.G_RET_STS_ERROR;
9272       X_RETURN_STATUS_TEXT := l_routine || SQLERRM;
9273   END CALCULATE_PRICE;
9274 
9275 
9276   --coded for bug 2264566
9277   --This is to delete/cleanup the related lines inserted by GRP
9278   --for manual PBH adjustment
9279   --when the calling application is passing the manual PBH to be applied
9280   PROCEDURE Cleanup_rltd_lines(x_return_status OUT NOCOPY VARCHAR2,
9281                                x_return_status_text OUT NOCOPY VARCHAR2) IS
9282   CURSOR l_dbg_cleanup_cur IS
9283     SELECT rltd.line_detail_index,
9284             rltd.related_line_detail_index,
9285             rltd.list_line_id,
9286             rltd.related_list_line_id,
9287             rltd.pricing_status_code
9288     FROM qp_npreq_rltd_lines_tmp rltd
9289     WHERE rltd.relationship_type_code = G_PBH_LINE;
9290   BEGIN
9291     l_debug := QP_PREQ_GRP.G_DEBUG_ENGINE;
9292     IF l_debug = FND_API.G_TRUE
9293       THEN
9294       QP_PREQ_GRP.engine_debug('------------------------------');
9295       FOR cl IN l_dbg_cleanup_cur
9296         LOOP
9297         QP_PREQ_GRP.engine_debug('Rltd lines: line_dtl_index '
9298                                  || cl.line_detail_index ||' rltd_line_dtl_index '
9299                                  || cl.related_line_detail_index ||' list_line_id '
9300                                  || cl.list_line_id ||' rltd_list_line_id '|| cl.related_list_line_id
9301                                  ||' pricing_status_code '|| cl.pricing_status_code);
9302       END LOOP;
9303     END IF;
9304 
9305     --mark the engine passed relationships of manual PBH as deleted
9306     --if the parent PBH line is deleted
9307     UPDATE qp_npreq_rltd_lines_tmp SET pricing_status_code = G_STATUS_DELETED
9308             WHERE line_detail_index IN (SELECT line_detail_index
9309                                         FROM qp_npreq_ldets_tmp ldet
9310                                         WHERE (ldet.process_code = G_STATUS_DELETED
9311                                                OR ldet.pricing_status_code = G_STATUS_DELETED))
9312 --fix for bug 2515762 automatic overrideable break
9313 --                                and ldet.automatic_flag = G_NO)
9314             AND pricing_status_code = G_STATUS_NEW
9315             AND relationship_type_code = G_PBH_LINE;
9316 
9317     --mark the engine returned manual child PBH lines as deleted
9318     UPDATE qp_npreq_ldets_tmp ldet SET pricing_status_code = G_STATUS_DELETED
9319             WHERE ldet.line_detail_index IN
9320                     (SELECT rltd.related_line_detail_index
9321                      FROM qp_npreq_rltd_lines_tmp rltd
9322                      WHERE rltd.relationship_type_code = G_PBH_LINE
9323                      AND rltd.pricing_status_code = G_STATUS_DELETED);
9324 
9325     IF l_debug = FND_API.G_TRUE THEN
9326       QP_PREQ_GRP.engine_debug('------------------------------');
9327       FOR cl IN l_dbg_cleanup_cur
9328         LOOP
9329         QP_PREQ_GRP.engine_debug('Rltd lines: line_dtl_index '
9330                                  || cl.line_detail_index ||' rltd_line_dtl_index '
9331                                  || cl.related_line_detail_index ||' list_line_id '
9332                                  || cl.list_line_id ||' rltd_list_line_id '|| cl.related_list_line_id
9333                                  ||' pricing_status_code '|| cl.pricing_status_code);
9334       END LOOP;
9335     END IF;
9336   EXCEPTION
9337     WHEN OTHERS THEN
9338       x_return_status := FND_API.G_RET_STS_ERROR;
9339       x_return_status_text := 'Exception in QP_PREQ_PUB.Cleanup_rltd_lines '|| SQLERRM;
9340   END Cleanup_rltd_lines;
9341 
9342 
9343   --coded for bug 2264566
9344   --This is to update the related lines passed by calling application
9345   --along with a manual/auto-overridden PBH adjustments with the relevant
9346   --information needed to calculate adjustment amount for PBH from the setup
9347   PROCEDURE Update_Related_Line_Info(x_return_status OUT NOCOPY VARCHAR2,
9348                                      x_return_status_text OUT NOCOPY VARCHAR2) IS
9349 
9350   CURSOR l_dbg_rltd_cur IS
9351     SELECT
9352     qpa.pricing_attr_value_from,
9353     qpa.pricing_attr_value_to,
9354     ldet_pbh.price_break_type_code,
9355     ldet_pbh.created_from_list_line_id list_line_id,
9356     ldet.created_from_list_line_id related_list_line_id,
9357     ldet.created_from_list_line_type related_list_line_type,
9358     ldet.operand_calculation_code operand_calculation_code,
9359     ldet.operand_value operand,
9360     ldet.pricing_group_sequence pricing_group_sequence,
9361     nvl(ldet.line_quantity,
9362         nvl(line.priced_quantity, line.line_quantity))
9363                     qualifier_value
9364     FROM
9365     qp_npreq_rltd_lines_tmp rltd,
9366     qp_npreq_lines_tmp line,
9367     qp_npreq_ldets_tmp ldet,
9368     qp_npreq_ldets_tmp ldet_pbh,
9369     qp_pricing_attributes qpa
9370     WHERE
9371     rltd.pricing_status_code = G_STATUS_NEW
9372     AND ldet.line_detail_index =
9373                     rltd.related_line_detail_index
9374     AND ldet_pbh.line_detail_index = rltd.line_detail_index
9375     AND line.line_index = ldet.line_index
9376     AND qpa.list_line_id = ldet.created_from_list_line_id
9377     AND qpa.pricing_attribute_context = G_PRIC_VOLUME_CONTEXT
9378     AND ldet.process_code = G_STATUS_NEW
9379     AND ldet.pricing_status_code = G_STATUS_UNCHANGED
9380     AND rltd.relationship_type_code = G_PBH_LINE;
9381 
9382   CURSOR l_dbg_rltd_upd_cur IS
9383     SELECT setup_value_from,
9384             setup_value_to,
9385             relationship_type_detail,
9386             list_line_id,
9387             related_list_line_id,
9388             related_list_line_type,
9389             operand_calculation_code,
9390             operand,
9391             pricing_group_sequence,
9392             qualifier_value
9393     FROM qp_npreq_rltd_lines_tmp rltd
9394     WHERE rltd.pricing_status_code = G_STATUS_NEW
9395     AND rltd.relationship_type_code = G_PBH_LINE;
9396 
9397   BEGIN
9398 
9399     IF l_debug = FND_API.G_TRUE THEN
9400       QP_PREQ_GRP.engine_debug('-------------------------------------');
9401       FOR cl IN l_dbg_rltd_cur
9402         LOOP
9403         QP_PREQ_GRP.engine_debug('rltd info: value_from '
9404                                  || cl.pricing_attr_value_from
9405                                  ||' value to '|| cl.pricing_attr_value_to
9406                                  ||' price brktype '|| cl.price_break_type_code
9407                                  ||' list_line_id '|| cl.list_line_id
9408                                  ||' rltd_list_line_id '|| cl.related_list_line_id
9409                                  ||' rltd_list_line_type '|| cl.related_list_line_type
9410                                  ||' operand_calculation_code '|| cl.operand_calculation_code
9411                                  ||' operand '|| cl.operand
9412                                  ||' bucket '|| cl.pricing_group_sequence
9413                                  ||' qualifier_value '|| cl.qualifier_value);
9414       END LOOP;
9415     END IF;
9416 
9417     --when any changes are made to this, the similar updated stmt
9418     --in update_passed_in_pbh procedure in this file also needs to be changed
9419     UPDATE qp_npreq_rltd_lines_tmp rltd
9420             SET (setup_value_from,
9421                  setup_value_to,
9422                  relationship_type_detail,
9423                  list_line_id,
9424                  related_list_line_id,
9425                  related_list_line_type,
9426                  operand_calculation_code,
9427                  operand,
9428                  pricing_group_sequence,
9429                  qualifier_value)
9430                     =
9431                     (SELECT
9432                      qpa.pricing_attr_value_from,
9433                      qpa.pricing_attr_value_to,
9434                      ldet_pbh.price_break_type_code,
9435                      ldet_pbh.created_from_list_line_id,
9436                      ldet.created_from_list_line_id,
9437                      ldet.created_from_list_line_type,
9438                      ldet.operand_calculation_code,
9439                      ldet.operand_value,
9440                      ldet.pricing_group_sequence,
9441                      nvl(ldet.line_quantity,
9442                          nvl(line.priced_quantity, line.line_quantity))
9443                      FROM
9444                      qp_npreq_lines_tmp line,
9445                      qp_npreq_ldets_tmp ldet,
9446                      qp_npreq_ldets_tmp ldet_pbh,
9447                      qp_pricing_attributes qpa
9448                      WHERE
9449                      ldet.line_detail_index = rltd.related_line_detail_index
9450                      AND ldet_pbh.line_detail_index = rltd.line_detail_index
9451                      AND line.line_index = ldet.line_index
9452                      AND qpa.list_line_id = ldet.created_from_list_line_id
9453                      AND ldet.process_code = G_STATUS_NEW
9454                      AND ldet.pricing_status_code = G_STATUS_UNCHANGED
9455                      AND rltd.relationship_type_code = G_PBH_LINE
9456                      AND rltd.pricing_status_code = G_STATUS_NEW)
9457     WHERE rltd.line_detail_index IN (SELECT ldet.line_detail_index
9458                                      FROM qp_npreq_ldets_tmp ldet
9459                                      WHERE ldet.process_code = G_STATUS_NEW
9460                                      AND ldet.pricing_status_code = G_STATUS_UNCHANGED
9461                                      AND ldet.created_from_list_line_type = G_PRICE_BREAK_TYPE)
9462     AND rltd.relationship_type_code = G_PBH_LINE
9463     AND rltd.pricing_status_code = G_STATUS_NEW;
9464 
9465     IF l_debug = FND_API.G_TRUE
9466       THEN
9467       QP_PREQ_GRP.engine_debug('-------------------------------------');
9468       FOR cl IN l_dbg_rltd_upd_cur
9469         LOOP
9470         QP_PREQ_GRP.engine_debug('rltd info: value_from '
9471                                  || cl.setup_value_from
9472                                  ||' value to '|| cl.setup_value_to
9473                                  ||' price brktype '|| cl.relationship_type_detail
9474                                  ||' list_line_id '|| cl.list_line_id
9475                                  ||' rltd_list_line_id '|| cl.related_list_line_id
9476                                  ||' rltd_list_line_type '|| cl.related_list_line_type
9477                                  ||' operand_calculation_code '|| cl.operand_calculation_code
9478                                  ||' operand '|| cl.operand
9479                                  ||' bucket '|| cl.pricing_group_sequence
9480                                  ||' qualifier_value '|| cl.qualifier_value);
9481       END LOOP;
9482     END IF;
9483   EXCEPTION
9484     WHEN OTHERS THEN
9485       x_return_status := FND_API.G_RET_STS_ERROR;
9486       x_return_status_text := 'Exception in QP_PREQ_PUB.Update_Related_Line_Info '|| SQLERRM;
9487   END Update_Related_Line_Info;
9488 
9489 
9490   --This is to cleanup duplicate adjustments between user passed
9491   --and engine returned adjustments and to consider out of phase adj
9492   PROCEDURE PROCESS_ADJUSTMENTS(P_PRICING_EVENT VARCHAR2
9493                                 , X_RETURN_STATUS OUT NOCOPY VARCHAR2
9494                                 , X_RETURN_STATUS_TEXT OUT NOCOPY VARCHAR2) IS
9495 
9496   /*
9497 INDX,QP_PREQ_PUB.process_adjustments.l_duplicate_cur,qp_npreq_ldets_tmp_N1,LINE_INDEX,1
9498 INDX,QP_PREQ_PUB.process_adjustments.l_duplicate_cur,qp_npreq_ldets_tmp_N1,CREATED_FROM_LIST_LINE_ID,5
9499 */
9500   CURSOR l_duplicate_cur IS
9501     SELECT ldeta.line_detail_index
9502             , ldeta.line_index
9503             , ldeta.created_from_list_line_id
9504             , ldeta.pricing_status_code
9505             , ldeta.process_code
9506             , ldeta.pricing_status_text
9507             , ldeta.applied_flag
9508             , ldeta.updated_flag
9509     FROM qp_npreq_ldets_tmp ldeta
9510     WHERE --ldeta.pricing_status_code = 'X'
9511             ldeta.process_code = G_STATUS_NEW
9512             AND ldeta.created_from_list_line_id IN
9513                     (SELECT ldetb.created_from_list_line_id
9514                      FROM qp_npreq_ldets_tmp ldetb
9515                      WHERE ldetb.created_from_list_line_id =
9516                      ldeta.created_from_list_line_id
9517                      AND ldetb.line_index = ldeta.line_index
9518                      AND ldetb.process_code = G_STATUS_NEW
9519                      GROUP BY ldetb.created_from_list_line_id
9520                      HAVING COUNT( * ) > 1)
9521     ORDER BY ldeta.line_index
9522             , ldeta.created_from_list_line_id
9523             , ldeta.pricing_status_code DESC;
9524   --		and ldetb.pricing_status_code = 'N'desc);
9525 
9526   l_duplicate_rec l_duplicate_cur%ROWTYPE;
9527   l_duplicate_rec1 l_duplicate_cur%ROWTYPE;
9528 
9529   TYPE DUP_ADJ_TBL_TYPE IS TABLE OF l_duplicate_rec%TYPE INDEX BY BINARY_INTEGER;
9530 
9531   l_dup_adj_tbl DUP_ADJ_TBL_TYPE;
9532   l_routine VARCHAR2(100) := 'Routine:QP_PREQ_PUB.PROCESS_ADJUSTMENTS';
9533 
9534   /*
9535 indxno index used
9536 */
9537   CURSOR lcur IS
9538     SELECT    line_index
9539             , created_from_list_line_id
9540             , pricing_status_code, applied_flag
9541             , updated_flag, operand_value
9542     FROM qp_npreq_ldets_tmp
9543     WHERE PRICING_STATUS_CODE = G_STATUS_UNCHANGED;
9544 
9545   lrec lcur%ROWTYPE;
9546 
9547   /*
9548 INDX,QP_PREQ_PUB.process_adjustments.lcur1,qp_npreq_ldets_tmp_N3,LINE_INDEX,1
9549 INDX,QP_PREQ_PUB.process_adjustments.lcur1,qp_npreq_ldets_tmp_N3,PRICING_STATUS_CODE,4
9550 */
9551   CURSOR lcur1 IS
9552     SELECT    created_from_list_line_id
9553             , line_detail_index
9554             , line_quantity
9555             , line_index
9556             , applied_flag
9557             , updated_flag
9558             , pricing_status_code
9559             , process_code
9560     FROM qp_npreq_ldets_tmp
9561     ORDER BY line_index;
9562 
9563   lrec1 lcur1%ROWTYPE;
9564 
9565   i PLS_INTEGER;
9566 
9567   Process_Exc EXCEPTION;
9568 
9569   BEGIN
9570 
9571 
9572 
9573     /*
9574 open lcur;LOOP
9575 fetch lcur into lrec;
9576 EXIT when lcur%NOTFOUND;
9577  IF l_debug = FND_API.G_TRUE THEN
9578 	QP_PREQ_GRP.ENGINE_DEBUG(lrec.line_index||
9579 	' user passed list_line_id '||lrec.created_from_list_line_id||
9580 	' pricing_status_code '||lrec.pricing_status_code||
9581 	' applied_flag '||lrec.applied_flag||
9582 	' updated_flag '||lrec.updated_flag||
9583 	' operand '||lrec.operand_value);
9584  END IF;
9585 END LOOP;
9586  IF l_debug = FND_API.G_TRUE THEN
9587 	QP_PREQ_GRP.ENGINE_DEBUG('--------------------------------------------------');
9588  END IF;
9589 CLOSE lcur;
9590 */
9591 
9592     ----------------------------------------------------------------------------
9593     --The following code will process the information returned by the
9594     --pricing engine in the temporary tables, compare the adjustments passes
9595     --by the calling application and mark the temporary table qp_npreq_ldets_tmp
9596     --field process_code with a value G_STATUS_NEW
9597     ----------------------------------------------------------------------------
9598     IF l_debug = FND_API.G_TRUE THEN
9599       QP_PREQ_GRP.ENGINE_DEBUG('START PROCESS ADJUSTMENTS '|| p_pricing_event);
9600 
9601     END IF;
9602     --Step 0: Update all user passed adjustments to process_code 'DELETED'
9603     --to start with
9604 
9605     UPDATE qp_npreq_ldets_tmp ldet SET ldet.process_code = G_STATUS_DELETED
9606             WHERE ldet.pricing_status_code = G_STATUS_UNCHANGED;
9607 
9608     --First Step: Retain the adjustments input by user
9609     --which are in the phase which do not belong to the
9610     --event passed in the control record
9611 
9612 
9613     /*
9614 INDX,QP_PREQ_PUB.process_adjustments.upd1,QP_EVENT_PHASES_U1,PRICING_EVENT_CODE,1
9615 */
9616     UPDATE qp_npreq_ldets_tmp ldet SET ldet.process_code = G_STATUS_NEW
9617             WHERE ldet.pricing_status_code = G_STATUS_UNCHANGED AND
9618             ldet.applied_flag = G_YES AND
9619             ldet.pricing_phase_id NOT IN (SELECT ev.pricing_phase_id
9620                                           FROM qp_event_phases ev, qp_pricing_phases ph
9621                                           , qp_npreq_lines_tmp line
9622                                           WHERE instr(p_pricing_event, ev.pricing_event_code || ',') > 0
9623                                           AND ev.pricing_phase_id = ph.pricing_phase_id
9624                                           AND line.price_flag <> G_CALCULATE_ONLY
9625                                           AND ((G_GET_FREIGHT_FLAG = G_YES AND ph.freight_exists = G_YES)
9626                                                OR (G_GET_FREIGHT_FLAG = G_NO))
9627                                           AND line.line_index = ldet.line_index
9628                                           AND ((nvl(Get_buy_line_price_flag(ldet.created_from_list_line_id, ldet.line_index), line.price_flag) = G_YES)
9629                                                OR ((nvl(Get_buy_line_price_flag(ldet.created_from_list_line_id, ldet.line_index), line.price_flag) = G_PHASE)
9630                                                    AND (nvl(ph.user_freeze_override_flag, ph.freeze_override_flag) = G_YES))));
9631 
9632     IF l_debug = FND_API.G_TRUE THEN
9633       QP_PREQ_GRP.ENGINE_DEBUG('PROCESS ADJUSTMENTS: Step1');
9634 
9635     END IF;
9636     --Second Step: Retain adjustments input by user
9637     --which have updated flag = 'Y'
9638 
9639     /*
9640 upd2 indxno index used
9641 */
9642     --bug 2264566 update the child lines of manual PBH which get
9643     --passed with applied_flag null and updated_flag = 'Y'
9644     UPDATE qp_npreq_ldets_tmp ldet SET ldet.process_code = G_STATUS_NEW
9645             WHERE ldet.pricing_status_code = G_STATUS_UNCHANGED AND
9646 --fix for bug 2515762 automatic overrideable break
9647             ldet.updated_flag = G_YES;
9648     --		((ldet.updated_flag = G_YES and ldet.applied_flag = G_YES)
9649     --		or (ldet.updated_flag = G_YES
9650     --		and nvl(ldet.automatic_flag, G_NO) = G_NO
9651     --		and ldet.line_detail_index in
9652     --			(select rltd.related_line_detail_index
9653     --			from qp_npreq_rltd_lines_tmp rltd
9654     --			where rltd.relationship_type_code = G_PBH_LINE)));
9655 
9656     IF l_debug = FND_API.G_TRUE THEN
9657       QP_PREQ_GRP.ENGINE_DEBUG('PROCESS ADJUSTMENTS: Step1.5');
9658     END IF;
9659     --summary line adjustments with price flag 'N' need to be considered for calc
9660     --reqt from contracts for performance
9661     UPDATE qp_npreq_ldets_tmp ldet SET ldet.process_code = G_STATUS_NEW
9662             WHERE ldet.line_index IN
9663             (SELECT line.line_index FROM qp_npreq_lines_tmp line
9664              WHERE line.line_type_code = G_ORDER_LEVEL
9665              AND line.price_flag = G_NO);
9666 
9667     IF l_debug = FND_API.G_TRUE THEN
9668       QP_PREQ_GRP.ENGINE_DEBUG('PROCESS ADJUSTMENTS: Step2');
9669 
9670 
9671     END IF;
9672     --Third Step : Mark the lines returned by the engine
9673     --changed this update because GRP will default process_code N for all ldets
9674 
9675     /*
9676 upd3 indxno index used
9677 */
9678     UPDATE qp_npreq_ldets_tmp ldet SET ldet.process_code = G_STATUS_DELETED
9679             WHERE ldet.process_code = G_STATUS_NEW
9680             AND ldet.pricing_status_code NOT IN
9681             (G_STATUS_NEW, G_STATUS_UNCHANGED); -- and ldet.applied_flag = 'Y';
9682 
9683     /*
9684 open lcur1; LOOP
9685 fetch lcur1 into lrec1;
9686 EXIT when lcur1%NOTFOUND;
9687  IF l_debug = FND_API.G_TRUE THEN
9688 	QP_PREQ_GRP.ENGINE_DEBUG('list_line_id'||lrec1.created_from_list_line_id);
9689  END IF;
9690 END LOOP;
9691 CLOSE lcur1;
9692 */
9693 
9694     IF l_debug = FND_API.G_TRUE THEN
9695       QP_PREQ_GRP.ENGINE_DEBUG('PROCESS ADJUSTMENTS: Step3');
9696 
9697     END IF;
9698     --Fourth Step : Among the lines with process_code = G_STATUS_NEW
9699     -- remove the duplicates. Retain lines passed by user with updated_flag 'Y' or
9700     --applied_flag 'Y' otherwise retain lines passed back by engine
9701 
9702 
9703 
9704     l_dup_adj_tbl.DELETE;
9705     i := 0;
9706 
9707     OPEN l_duplicate_cur; LOOP
9708       FETCH l_duplicate_cur INTO l_duplicate_rec;
9709       FETCH l_duplicate_cur INTO l_duplicate_rec1;
9710 
9711       EXIT WHEN l_duplicate_cur%NOTFOUND;
9712       i := i + 1;
9713 
9714 
9715 
9716       IF l_debug = FND_API.G_TRUE THEN
9717         QP_PREQ_GRP.ENGINE_DEBUG('DUPLICATE REC:
9718                                  line index '|| l_duplicate_rec.line_index ||
9719                                  ' detail_index '|| l_duplicate_rec.line_detail_index ||
9720                                  'list_line_id '|| l_duplicate_rec.created_from_list_line_id ||
9721                                  'pricing_status_code '|| l_duplicate_rec.pricing_status_code ||
9722                                  ' process_code '|| l_duplicate_rec.process_code ||
9723                                  ' applied_flag '|| l_duplicate_rec.applied_flag ||
9724                                  ' updated_flag '|| l_duplicate_rec.updated_flag);
9725         QP_PREQ_GRP.ENGINE_DEBUG('DUPLICATE REC1:
9726                                  line index '|| l_duplicate_rec1.line_index ||
9727                                  ' detail_index '|| l_duplicate_rec1.line_detail_index ||
9728                                  'list_line_id '|| l_duplicate_rec1.created_from_list_line_id ||
9729                                  'pricing_status_code '|| l_duplicate_rec1.pricing_status_code ||
9730                                  ' process_code '|| l_duplicate_rec1.process_code ||
9731                                  ' applied_flag '|| l_duplicate_rec1.applied_flag ||
9732                                  ' updated_flag '|| l_duplicate_rec1.updated_flag);
9733 
9734       END IF;
9735       IF l_duplicate_rec1.pricing_status_code = G_STATUS_NEW THEN
9736         IF (l_duplicate_rec.pricing_status_code = G_STATUS_UNCHANGED AND
9737             ((nvl(l_duplicate_rec.updated_flag, G_NO) = G_YES)
9738              OR (nvl(l_duplicate_rec.applied_flag, G_NO) = G_YES))) THEN
9739           --retain adj passed by user
9740           IF l_debug = FND_API.G_TRUE THEN
9741             QP_PREQ_GRP.ENGINE_DEBUG('retain user passed');
9742           END IF;
9743           l_duplicate_rec.process_code := G_STATUS_NEW;
9744           l_duplicate_rec1.process_code := G_STATUS_UNCHANGED;
9745           l_duplicate_rec1.pricing_status_code := G_STATUS_DELETED;
9746           l_duplicate_rec1.pricing_status_text := 'QP_PREQ_PUB:DUPLICATE RECORD';
9747 
9748         ELSIF (l_duplicate_rec.pricing_status_code = G_STATUS_UNCHANGED AND
9749                ((nvl(l_duplicate_rec.updated_flag, G_NO) = G_NO) OR
9750                 (nvl(l_duplicate_rec.updated_flag, G_NO) = G_NO))) THEN
9751           --retain adj passed by user
9752           IF l_debug = FND_API.G_TRUE THEN
9753             QP_PREQ_GRP.ENGINE_DEBUG('retain engine passed');
9754           END IF;
9755           l_duplicate_rec.process_code := G_STATUS_UNCHANGED;
9756           l_duplicate_rec.pricing_status_code := G_STATUS_DELETED;
9757           l_duplicate_rec1.pricing_status_text := 'QP_PREQ_PUB:DUPLICATE RECORD';
9758           l_duplicate_rec1.process_code := G_STATUS_NEW;
9759         ELSE
9760           --retain adj passed by engine
9761           IF l_debug = FND_API.G_TRUE THEN
9762             QP_PREQ_GRP.ENGINE_DEBUG('else retain engine');
9763 
9764           END IF;
9765           l_duplicate_rec.process_code := G_STATUS_UNCHANGED;
9766           l_duplicate_rec.pricing_status_code := G_STATUS_DELETED;
9767           l_duplicate_rec.pricing_status_text := 'QP_PREQ_PUB:DUPLICATE RECORD';
9768           l_duplicate_rec1.process_code := G_STATUS_NEW;
9769         END IF;
9770       ELSE
9771         NULL;
9772       END IF;
9773 
9774       l_dup_adj_tbl(i) := l_duplicate_rec;
9775 
9776       IF l_debug = FND_API.G_TRUE THEN
9777         QP_PREQ_GRP.ENGINE_DEBUG('Processed duplicate adj:
9778                                  line index '|| l_dup_adj_tbl(i).line_detail_index ||
9779                                  'list_line_id '|| l_dup_adj_tbl(i).created_from_list_line_id ||
9780                                  'process_code '|| l_dup_adj_tbl(i).process_code ||
9781                                  ' applied_flag '|| l_dup_adj_tbl(i).applied_flag ||
9782                                  ' updated_flag '|| l_dup_adj_tbl(i).updated_flag);
9783       END IF;
9784       i := i + 1;
9785       l_dup_adj_tbl(i) := l_duplicate_rec1;
9786       IF l_debug = FND_API.G_TRUE THEN
9787         QP_PREQ_GRP.ENGINE_DEBUG('Processed duplicate adj:
9788                                  line index '|| l_dup_adj_tbl(i).line_detail_index ||
9789                                  'list_line_id '|| l_dup_adj_tbl(i).created_from_list_line_id ||
9790                                  'process_code '|| l_dup_adj_tbl(i).process_code ||
9791                                  ' applied_flag '|| l_dup_adj_tbl(i).applied_flag ||
9792                                  ' updated_flag '|| l_dup_adj_tbl(i).updated_flag);
9793       END IF;
9794     END LOOP;
9795 
9796 
9797     i := l_dup_adj_tbl.FIRST;
9798     WHILE i IS NOT NULL LOOP
9799 
9800       /*
9801 INDX,QP_PREQ_PUB.process_adjustments.upd4,qp_npreq_ldets_tmp_U1,LINE_DETAIL_INDEX,1
9802 */
9803       UPDATE qp_npreq_ldets_tmp SET
9804               process_code = l_dup_adj_tbl(i).process_code
9805               , pricing_status_code = l_dup_adj_tbl(i).pricing_status_code
9806               , pricing_status_text = l_dup_adj_tbl(i).pricing_status_text
9807               WHERE line_detail_index = l_dup_adj_tbl(i).line_detail_index;
9808 
9809       IF l_debug = FND_API.G_TRUE THEN
9810         QP_PREQ_GRP.ENGINE_DEBUG('Update processed adjustments:
9811                                  list_line_id '|| l_dup_adj_tbl(i).created_from_list_line_id ||
9812                                  ' pricing_status_code '|| l_dup_adj_tbl(i).pricing_status_code ||
9813                                  'process_code '|| l_dup_adj_tbl(i).process_code);
9814 
9815       END IF;
9816       i := l_dup_adj_tbl.NEXT(i);
9817     END LOOP;
9818 
9819     IF QP_PREQ_GRP.G_DEBUG_ENGINE = FND_API.G_TRUE THEN
9820 
9821       OPEN lcur1; LOOP
9822         FETCH lcur1 INTO lrec1;
9823         EXIT WHEN lcur1%NOTFOUND;
9824         IF l_debug = FND_API.G_TRUE THEN
9825           QP_PREQ_GRP.ENGINE_DEBUG('line_index '|| lrec1.line_index ||
9826                                    ' line_dtl_index '|| lrec1.line_detail_index ||
9827                                    ' line_qty '|| lrec1.line_quantity ||
9828                                    ' list_line_id '|| lrec1.created_from_list_line_id ||
9829                                    ' applied '|| lrec1.applied_flag ||' status '|| lrec1.pricing_status_code ||
9830                                    ' updated '|| lrec1.updated_flag ||' process '|| lrec1.process_code);
9831         END IF;
9832       END LOOP;
9833       CLOSE lcur1;
9834     END IF;
9835     Cleanup_rltd_lines(x_return_status, x_return_status_text);
9836     IF l_debug = FND_API.G_TRUE THEN
9837       QP_PREQ_GRP.engine_debug('------------------------------------------');
9838 
9839     END IF;
9840     IF x_return_status = FND_API.G_RET_STS_ERROR
9841       THEN
9842       RAISE Process_Exc;
9843     END IF;
9844 
9845     Update_Related_Line_Info(x_return_status, x_return_status_text);
9846     IF l_debug = FND_API.G_TRUE THEN
9847       QP_PREQ_GRP.engine_debug('------------------------------------------');
9848     END IF;
9849     IF x_return_status = FND_API.G_RET_STS_ERROR
9850       THEN
9851       RAISE Process_Exc;
9852     END IF;
9853 
9854     IF QP_PREQ_GRP.G_DEBUG_ENGINE = FND_API.G_TRUE THEN
9855 
9856       OPEN lcur1; LOOP
9857         FETCH lcur1 INTO lrec1;
9858         EXIT WHEN lcur1%NOTFOUND;
9859         IF l_debug = FND_API.G_TRUE THEN
9860           QP_PREQ_GRP.ENGINE_DEBUG('line_index '|| lrec1.line_index ||
9861                                    ' list_line_id '|| lrec1.created_from_list_line_id ||
9862                                    ' applied '|| lrec1.applied_flag ||' status '|| lrec1.pricing_status_code ||
9863                                    ' updated '|| lrec1.updated_flag ||' process '|| lrec1.process_code);
9864         END IF;
9865       END LOOP;
9866       CLOSE lcur1;
9867     END IF;
9868 
9869     IF l_debug = FND_API.G_TRUE THEN
9870       QP_PREQ_GRP.ENGINE_DEBUG('PROCESS ADJUSTMENTS: Step4');
9871 
9872     END IF;
9873     X_RETURN_STATUS := FND_API.G_RET_STS_SUCCESS;
9874     X_RETURN_STATUS_TEXT := l_routine ||' SUCCESS ';
9875 
9876     IF l_debug = FND_API.G_TRUE THEN
9877       QP_PREQ_GRP.ENGINE_DEBUG('END PROCESS ADJUSTMENTS');
9878     END IF;
9879   EXCEPTION
9880     WHEN Process_Exc THEN
9881       IF l_debug = FND_API.G_TRUE THEN
9882         QP_PREQ_GRP.ENGINE_DEBUG('EXCEPTION PROCESS ADJUSTMENTS: '|| X_RETURN_STATUS_TEXT);
9883       END IF;
9884     WHEN OTHERS THEN
9885       IF l_debug = FND_API.G_TRUE THEN
9886         QP_PREQ_GRP.ENGINE_DEBUG('EXCEPTION PROCESS ADJUSTMENTS: '|| SQLERRM);
9887       END IF;
9888       x_return_status := FND_API.G_RET_STS_ERROR;
9889       x_return_status_text := l_routine ||' '|| SQLERRM;
9890   END PROCESS_ADJUSTMENTS;
9891 
9892 
9893   --This is to populate the qualifier_value in the rltd_lines_tmp
9894   --for PBH adjustments inserted by calling application during
9895   --BILLING call for usage pricing. The pricing engine would have
9896   --returned PBH adjustments and rltd_lines_tmp records for them
9897   --during the AUTHORING call
9898   --but qualifier_value would not have been populated as there
9899   --is no quantity during the AUTHORING call
9900   PROCEDURE UPDATE_QUALIFIER_VALUE(x_return_status OUT NOCOPY VARCHAR2,
9901                                    x_return_status_text OUT NOCOPY VARCHAR2)
9902   IS
9903   BEGIN
9904     l_debug := QP_PREQ_GRP.G_DEBUG_ENGINE;
9905     IF l_debug = FND_API.G_TRUE THEN
9906       QP_PREQ_GRP.engine_debug('Begin UPDATE_QUALIFIER_VALUE routine');
9907 
9908     END IF;
9909     UPDATE qp_npreq_rltd_lines_tmp rltd
9910             SET rltd.qualifier_value = (SELECT
9911                                         decode(qpa.pricing_attribute,
9912                                                G_LINE_AMT_ATTRIBUTE,
9913                                                (nvl(line.priced_quantity, line.line_quantity)
9914                                                 * nvl(line.unit_price, 0)),
9915                                                nvl(line.priced_quantity, line.line_quantity))
9916                                         FROM qp_npreq_lines_tmp line,
9917                                         qp_pricing_attributes qpa
9918                                         WHERE line.line_index = rltd.line_index
9919                                         AND qpa.list_line_id = rltd.related_list_line_id
9920                                         AND qpa.pricing_attribute_context =
9921                                         G_PRIC_VOLUME_CONTEXT)
9922     WHERE rltd.line_index IN (SELECT line.line_index
9923                               FROM qp_npreq_lines_tmp line
9924                               WHERE line.line_index = rltd.line_index
9925                               AND rltd.relationship_type_code = G_PBH_LINE
9926                               AND line.pricing_status_code IN
9927                               (G_STATUS_UNCHANGED, G_STATUS_UPDATED,
9928                                G_STATUS_GSA_VIOLATION)
9929                               AND line.usage_pricing_type =
9930                               QP_PREQ_GRP.G_BILLING_TYPE);
9931     IF l_debug = FND_API.G_TRUE THEN
9932       QP_PREQ_GRP.engine_debug('End UPDATE_QUALIFIER_VALUE routine');
9933     END IF;
9934   EXCEPTION
9935     WHEN OTHERS THEN
9936       IF l_debug = FND_API.G_TRUE THEN
9937         QP_PREQ_GRP.engine_debug('Error UPDATE_QUALIFIER_VALUE routine '|| SQLERRM);
9938       END IF;
9939       x_return_status := FND_API.G_RET_STS_ERROR;
9940       x_return_status_text := 'QP_PREQ_PUB.UPDATE_QUALIFIER_VALUE: '|| SQLERRM;
9941   END UPDATE_QUALIFIER_VALUE;
9942 
9943   --This is to update the status on the child break lines after calculation
9944   PROCEDURE Update_Child_Break_Lines(x_return_status OUT NOCOPY VARCHAR2,
9945                                      x_return_status_text OUT NOCOPY VARCHAR2) IS
9946 
9947   --[julin/pbperf] tuned to use QP_PREQ_LDETS_TMP_U1
9948   CURSOR l_child_break_cur IS
9949     SELECT /*+ ORDERED index(ldet QP_PREQ_LDETS_TMP_U1) */ldet.process_code,
9950             rltd.related_line_detail_index
9951     FROM qp_npreq_rltd_lines_tmp rltd,
9952 --		qp_npreq_ldets_tmp ldet1,
9953          qp_npreq_ldets_tmp ldet
9954     WHERE rltd.relationship_type_code = G_PBH_LINE
9955     AND rltd.pricing_status_code = G_STATUS_NEW
9956     AND ldet.line_index = rltd.line_index
9957     AND ldet.line_detail_index = rltd.line_detail_index
9958     AND ldet.pricing_status_code = G_STATUS_NEW
9959     AND ldet.process_code = G_STATUS_NEW;
9960   --	and ldet1.line_index = rltd.related_line_index
9961   --	and ldet1.line_detail_index = rltd.related_line_detail_index;
9962 
9963   l_line_dtl_index_tbl QP_PREQ_GRP.NUMBER_TYPE;
9964   l_child_sts_code_tbl QP_PREQ_GRP.VARCHAR_TYPE;
9965   nRows CONSTANT NUMBER := 500;
9966   I PLS_INTEGER;
9967   BEGIN
9968     l_debug := QP_PREQ_GRP.G_DEBUG_ENGINE;
9969     --This is to update the status on the child break lines after calculation
9970     IF l_debug = FND_API.G_TRUE THEN
9971       QP_PREQ_GRP.engine_debug('In Update_Child_break_lines routine');
9972     END IF;
9973     OPEN l_child_break_cur;
9974     IF l_debug = FND_API.G_TRUE THEN
9975       QP_PREQ_GRP.engine_debug('open l_child_break_cur');
9976     END IF;
9977     --	LOOP
9978     l_child_sts_code_tbl.DELETE;
9979     l_line_dtl_index_tbl.DELETE;
9980     FETCH l_child_break_cur
9981     BULK COLLECT INTO l_child_sts_code_tbl, l_line_dtl_index_tbl;
9982     IF l_debug = FND_API.G_TRUE THEN
9983       QP_PREQ_GRP.engine_debug('fetch l_child_break_cur');
9984     END IF;
9985     --	LIMIT nRows;
9986     IF QP_PREQ_GRP.G_DEBUG_ENGINE = FND_API.G_TRUE
9987       THEN
9988       I := l_line_dtl_index_tbl.FIRST;
9989       WHILE I IS NOT NULL
9990         --			FOR I in l_line_dtl_index_tbl.FIRST..l_line_dtl_index_tbl.LAST
9991         LOOP
9992         IF l_debug = FND_API.G_TRUE THEN
9993           QP_PREQ_GRP.engine_debug('l_child_break_cur count '|| i
9994                                    ||' childdtl index '|| l_line_dtl_index_tbl(i)
9995                                    ||' status code '|| l_child_sts_code_tbl(i));
9996         END IF;
9997         I := l_line_dtl_index_tbl.NEXT(I);
9998       END LOOP;
9999     END IF;
10000 
10001     IF l_line_dtl_index_tbl.COUNT > 0
10002       THEN
10003       IF l_debug = FND_API.G_TRUE THEN
10004         QP_PREQ_GRP.engine_debug('before update');
10005       END IF;
10006       FORALL j IN l_line_dtl_index_tbl.FIRST..l_line_dtl_index_tbl.LAST
10007       UPDATE qp_npreq_ldets_tmp
10008               SET process_code = l_child_sts_code_tbl(j)
10009               WHERE line_detail_index = l_line_dtl_index_tbl(j);
10010       IF l_debug = FND_API.G_TRUE THEN
10011         QP_PREQ_GRP.engine_debug('after update');
10012       END IF;
10013     END IF;
10014     --	EXIT WHEN l_line_dtl_index_tbl.COUNT =0;
10015     --	END LOOP;
10016     IF l_debug = FND_API.G_TRUE THEN
10017       QP_PREQ_GRP.engine_debug('END LOOP');
10018     END IF;
10019     CLOSE l_child_break_cur;
10020     IF l_debug = FND_API.G_TRUE THEN
10021       QP_PREQ_GRP.engine_debug('fetch l_child_break_cur');
10022     END IF;
10023 
10024     IF l_debug = FND_API.G_TRUE THEN
10025       QP_PREQ_GRP.engine_debug('End Update_Child_break_lines routine');
10026     END IF;
10027   EXCEPTION
10028     WHEN OTHERS THEN
10029       IF l_debug = FND_API.G_TRUE THEN
10030         QP_PREQ_GRP.engine_debug('Error Update_Child_break_lines routine '|| SQLERRM);
10031       END IF;
10032       x_return_status := FND_API.G_RET_STS_ERROR;
10033       x_return_status_text := 'QP_PREQ_PUB.Update_Child_Break_lines: '|| SQLERRM;
10034 
10035   END Update_Child_Break_Lines;
10036 
10037 
10038   --This is to calculate the line quantity on each child break line
10039   PROCEDURE PROCESS_PRICE_BREAK(p_rounding_flag IN VARCHAR2,
10040                                 p_processing_order IN NUMBER,
10041                                 x_line_index_tbl OUT NOCOPY QP_PREQ_GRP.NUMBER_TYPE,
10042                                 x_list_price_tbl OUT NOCOPY QP_PREQ_GRP.NUMBER_TYPE,
10043                                 x_pricing_sts_code_tbl OUT NOCOPY QP_PREQ_GRP.VARCHAR_TYPE,
10044                                 x_pricing_sts_txt_tbl OUT NOCOPY QP_PREQ_GRP.VARCHAR_TYPE,
10045                                 x_return_status OUT NOCOPY VARCHAR2,
10046                                 x_return_status_text OUT NOCOPY VARCHAR2) IS
10047 
10048   CURSOR l_request_line_detail_cur(p_processing_order NUMBER) IS
10049     SELECT rltd.line_detail_index parent_detail_index,
10050             rltd.line_index parent_line_index,
10051             ldet.line_detail_index child_detail_index,
10052             ldet.line_index child_line_index,
10053             ldet.line_detail_type_code,
10054             ldet.created_from_list_line_type,
10055             qpa.pricing_attr_value_from value_from,
10056             qpa.pricing_attr_value_to value_to,
10057             line.priced_quantity ordered_quantity,
10058             attr.value_from break_quantity,
10059             line.uom_quantity service_duration,
10060             line.rounding_factor,
10061 --		ldet.line_quantity line_qty,
10062             ldet.created_from_list_line_id,
10063             ldet.price_break_type_code price_break_type,
10064             ldet.modifier_level_code,
10065             ldet.group_quantity,
10066             ldet.operand_calculation_code,
10067             ldet.operand_value,
10068             ldet.group_amount,
10069             line.parent_price
10070     FROM qp_npreq_lines_tmp line,
10071             qp_npreq_rltd_lines_tmp rltd,
10072             qp_npreq_ldets_tmp ldet,
10073             qp_pricing_attributes qpa,
10074             qp_npreq_line_attrs_tmp attr
10075     WHERE line.pricing_status_code IN (G_STATUS_UNCHANGED, G_STATUS_UPDATED)
10076     AND line.price_flag = G_CALCULATE_ONLY
10077     AND nvl(line.processing_order, 1) = p_processing_order
10078     AND line.usage_pricing_type = QP_PREQ_GRP.G_BILLING_TYPE
10079     AND line.line_index = rltd.line_index
10080     AND rltd.relationship_type_code = G_PBH_LINE
10081     AND ldet.line_index = line.line_index
10082     AND ldet.pricing_status_code = 'X'
10083     AND ldet.line_detail_index = rltd.related_line_detail_index
10084     AND qpa.list_line_id = ldet.created_from_list_line_id
10085     AND qpa.pricing_attribute_context = G_PRIC_VOLUME_CONTEXT
10086     AND attr.line_index = line.line_index
10087     AND attr.line_detail_index IS NULL
10088     AND attr.context = G_PRIC_VOLUME_CONTEXT
10089     AND attr.attribute = qpa.pricing_attribute
10090     ORDER BY child_detail_index, parent_detail_index;
10091 
10092   l_quantity NUMBER;
10093   l_satisfied_qty NUMBER;
10094   l_line_dtl_index_tbl QP_PREQ_GRP.NUMBER_TYPE;
10095   l_line_index_tbl QP_PREQ_GRP.NUMBER_TYPE;
10096   l_adj_amt_tbl QP_PREQ_GRP.NUMBER_TYPE;
10097   l_total_qty_tbl QP_PREQ_GRP.NUMBER_TYPE;
10098   --l_pricing_sts_code_tbl QP_PREQ_GRP.VARCHAR_TYPE;
10099   --l_pricing_sts_txt_tbl QP_PREQ_GRP.VARCHAR_TYPE;
10100   l_total_price_tbl QP_PREQ_GRP.NUMBER_TYPE;
10101   l_percent_price_tbl QP_PREQ_GRP.NUMBER_TYPE;
10102   l_line_quantity_tbl QP_PREQ_GRP.NUMBER_TYPE;
10103   l_applied_flag_tbl QP_PREQ_GRP.FLAG_TYPE;
10104 
10105   i NUMBER := 0;
10106   l_break_satisfied VARCHAR2(1) := G_NO;
10107 
10108   BEGIN
10109 
10110     l_debug := QP_PREQ_GRP.G_DEBUG_ENGINE;
10111     IF l_debug = FND_API.G_TRUE THEN
10112       QP_PREQ_GRP.engine_debug('Begin process_price_break');
10113 
10114     END IF;
10115     FOR I IN l_request_line_detail_cur(p_processing_order)
10116       LOOP
10117       IF l_debug = FND_API.G_TRUE THEN
10118         QP_PREQ_GRP.engine_debug('Loop thru child break '|| I.parent_detail_index
10119                                  ||' child index '|| I.child_detail_index ||' list_line_id '
10120                                  || I.created_from_list_line_id ||' level '|| I.modifier_level_code
10121                                  ||' parent price '|| I.parent_price
10122                                  ||' val from '|| I.value_from ||' to '|| I.value_to
10123                                  ||' grpqty '|| I.group_quantity ||' grpamt '|| I.group_amount
10124                                  ||' ordqty '|| I.ordered_quantity ||' brktype '|| I.price_break_type
10125                                  ||' brk qty '|| I.break_quantity);
10126       END IF;
10127       --this is not applicable for price lists
10128       IF I.modifier_level_code = G_LINE_GROUP
10129         THEN
10130         IF l_debug = FND_API.G_TRUE THEN
10131           QP_PREQ_GRP.engine_debug('this is line group');
10132         END IF;
10133         l_quantity := nvl(nvl(nvl(I.group_quantity
10134                                   , I.group_amount),
10135                               nvl(I.break_quantity, I.ordered_quantity)), 0);
10136       ELSE
10137         IF l_debug = FND_API.G_TRUE THEN
10138           QP_PREQ_GRP.engine_debug('this is not line group');
10139         END IF;
10140         l_quantity := nvl(nvl(I.break_quantity,
10141                               I.ordered_quantity), 0);
10142       END IF;
10143 
10144       IF x_line_index_tbl.COUNT = 0
10145         THEN
10146         l_break_satisfied := G_NO;
10147       ELSIF x_line_index_tbl.COUNT > 0
10148         AND x_line_index_tbl(x_line_index_tbl.COUNT) <> I.child_line_index
10149         THEN
10150         l_break_satisfied := G_NO;
10151       END IF;
10152 
10153       IF l_debug = FND_API.G_TRUE THEN
10154         QP_PREQ_GRP.engine_debug('process_price_break1');
10155       END IF;
10156       IF I.price_break_type = G_POINT_BREAK
10157         THEN
10158         IF l_debug = FND_API.G_TRUE THEN
10159           QP_PREQ_GRP.engine_debug('this is point break');
10160         END IF;
10161         IF l_quantity BETWEEN I.value_from AND I.value_to
10162           THEN
10163           IF l_debug = FND_API.G_TRUE THEN
10164             QP_PREQ_GRP.engine_debug('point break satisfied');
10165           END IF;
10166           l_line_quantity_tbl(l_line_quantity_tbl.COUNT + 1)
10167           := l_quantity;
10168           l_line_index_tbl(l_line_index_tbl.COUNT + 1) :=
10169           I.child_line_index;
10170           l_applied_flag_tbl(l_applied_flag_tbl.COUNT + 1) := G_YES;
10171           l_line_dtl_index_tbl(l_line_dtl_index_tbl.COUNT + 1)
10172           := I.child_detail_index;
10173         ELSE
10174           IF l_debug = FND_API.G_TRUE THEN
10175             QP_PREQ_GRP.engine_debug('point break not satisfied');
10176           END IF;
10177           l_line_quantity_tbl(l_line_quantity_tbl.COUNT + 1) := 0;
10178           l_line_index_tbl(l_line_index_tbl.COUNT + 1) :=
10179           I.child_line_index;
10180           l_applied_flag_tbl(l_applied_flag_tbl.COUNT + 1) := G_NO;
10181           l_line_dtl_index_tbl(l_line_dtl_index_tbl.COUNT + 1)
10182           := I.child_detail_index;
10183         END IF;
10184 
10185       ELSIF I.price_break_type = G_RANGE_BREAK
10186         THEN
10187         IF l_debug = FND_API.G_TRUE THEN
10188           QP_PREQ_GRP.engine_debug('this is range break');
10189         END IF;
10190         l_satisfied_qty := 0;
10191         QP_Calculate_Price_PUB.Get_Satisfied_Range
10192         (p_value_from => I.value_from
10193          , p_value_to => I.value_to
10194          , p_qualifier_value => l_quantity
10195          , x_satisfied_value => l_satisfied_qty);
10196         IF l_debug = FND_API.G_TRUE THEN
10197           QP_PREQ_GRP.engine_debug('range break '|| l_satisfied_qty);
10198 
10199         END IF;
10200         IF l_satisfied_qty <> 0
10201           THEN
10202           IF l_debug = FND_API.G_TRUE THEN
10203             QP_PREQ_GRP.engine_debug('range break satisfied');
10204           END IF;
10205           l_line_quantity_tbl(l_line_quantity_tbl.COUNT + 1)
10206           := l_satisfied_qty;
10207           l_line_index_tbl(l_line_index_tbl.COUNT + 1) :=
10208           I.child_line_index;
10209           l_applied_flag_tbl(l_applied_flag_tbl.COUNT + 1) := G_YES;
10210           l_line_dtl_index_tbl(l_line_dtl_index_tbl.COUNT + 1)
10211           := I.child_detail_index;
10212         ELSE
10213           IF l_debug = FND_API.G_TRUE THEN
10214             QP_PREQ_GRP.engine_debug('range break not satisfied');
10215           END IF;
10216           l_line_quantity_tbl(l_line_quantity_tbl.COUNT + 1) := 0;
10217           l_applied_flag_tbl(l_applied_flag_tbl.COUNT + 1) := G_NO;
10218           l_line_index_tbl(l_line_index_tbl.COUNT + 1) :=
10219           I.child_line_index;
10220           l_line_dtl_index_tbl(l_line_dtl_index_tbl.COUNT + 1)
10221           := I.child_detail_index;
10222         END IF;
10223       END IF;
10224 
10225       IF l_line_quantity_tbl.COUNT > 0
10226         AND l_line_quantity_tbl(l_line_quantity_tbl.COUNT) > 0
10227         THEN
10228         l_break_satisfied := G_YES;
10229         QP_Calculate_Price_PUB.Calculate_List_Price
10230         (I.OPERAND_CALCULATION_CODE,
10231          I.OPERAND_VALUE,
10232          l_line_quantity_tbl(l_line_quantity_tbl.COUNT),
10233          I.parent_price,
10234          nvl(I.service_duration, 1),
10235          p_rounding_flag,
10236          I.rounding_factor,
10237          l_adj_amt_tbl(l_line_quantity_tbl.COUNT),
10238          l_percent_price_tbl(l_line_quantity_tbl.COUNT),
10239          x_return_status,
10240          x_return_status_text);
10241 
10242         IF l_debug = FND_API.G_TRUE THEN
10243           QP_PREQ_GRP.engine_debug('plsql tbl info dtlindex '
10244                                    || l_line_dtl_index_tbl(l_line_dtl_index_tbl.COUNT)
10245                                    ||' appl flag '|| l_applied_flag_tbl(l_line_dtl_index_tbl.COUNT)
10246                                    ||' line qty '|| l_line_quantity_tbl(l_line_dtl_index_tbl.COUNT)
10247                                    ||' list price '|| l_adj_amt_tbl(l_line_dtl_index_tbl.COUNT)
10248                                    ||' percent price '|| l_percent_price_tbl(l_line_dtl_index_tbl.COUNT));
10249         END IF;
10250       ELSE
10251         l_adj_amt_tbl(l_line_quantity_tbl.COUNT) := NULL;
10252       END IF;
10253 
10254       IF x_line_index_tbl.COUNT = 0
10255         THEN
10256         x_line_index_tbl(x_line_index_tbl.COUNT + 1) :=
10257         l_line_index_tbl(l_line_index_tbl.COUNT);
10258         l_total_qty_tbl(x_line_index_tbl.COUNT) :=
10259         I.ordered_quantity;
10260         l_total_price_tbl(x_line_index_tbl.COUNT) :=
10261         l_line_quantity_tbl(l_line_dtl_index_tbl.COUNT)
10262         * nvl(l_adj_amt_tbl(l_line_dtl_index_tbl.COUNT), 0);
10263         IF l_debug = FND_API.G_TRUE THEN
10264           QP_PREQ_GRP.engine_debug('first line '
10265                                    || l_total_qty_tbl(x_line_index_tbl.COUNT) ||' '
10266                                    || l_total_price_tbl(x_line_index_tbl.COUNT)
10267                                    ||' qty '|| l_line_quantity_tbl(l_line_dtl_index_tbl.COUNT)
10268                                    ||' adjamt '|| l_adj_amt_tbl(l_line_dtl_index_tbl.COUNT)
10269                                    ||' brk satisfied '|| l_break_satisfied);
10270         END IF;
10271       ELSIF x_line_index_tbl.COUNT > 0
10272         AND x_line_index_tbl(x_line_index_tbl.COUNT) =
10273         l_line_index_tbl(l_line_index_tbl.COUNT)
10274         THEN
10275         l_total_price_tbl(x_line_index_tbl.COUNT) :=
10276         l_total_price_tbl(x_line_index_tbl.COUNT) +
10277         l_line_quantity_tbl(l_line_dtl_index_tbl.COUNT)
10278         * nvl(l_adj_amt_tbl(l_line_dtl_index_tbl.COUNT), 0);
10279         IF l_debug = FND_API.G_TRUE THEN
10280           QP_PREQ_GRP.engine_debug('same line '
10281                                    || l_total_qty_tbl(x_line_index_tbl.COUNT) ||' '
10282                                    || l_total_price_tbl(x_line_index_tbl.COUNT)
10283                                    ||' qty '|| l_line_quantity_tbl(l_line_dtl_index_tbl.COUNT)
10284                                    ||' adjamt '|| l_adj_amt_tbl(l_line_dtl_index_tbl.COUNT)
10285                                    ||' brk satisfied '|| l_break_satisfied);
10286         END IF;
10287       ELSIF x_line_index_tbl.COUNT > 0
10288         AND x_line_index_tbl(x_line_index_tbl.COUNT) <>
10289         l_line_index_tbl(l_line_index_tbl.COUNT)
10290         THEN
10291         --Calculation for pervious line
10292         x_list_price_tbl(x_line_index_tbl.COUNT) :=
10293         l_total_price_tbl(x_line_index_tbl.COUNT) /
10294         l_total_qty_tbl(x_line_index_tbl.COUNT);
10295         IF l_break_satisfied = G_NO
10296           THEN
10297           x_pricing_sts_code_tbl(x_line_index_tbl.COUNT) :=
10298           G_STATUS_CALC_ERROR;
10299           x_pricing_sts_txt_tbl(x_line_index_tbl.COUNT) :=
10300           'UNABLE TO PRICE LINE';
10301         ELSE
10302           x_pricing_sts_code_tbl(x_line_index_tbl.COUNT) :=
10303           G_STATUS_UPDATED;
10304           x_pricing_sts_txt_tbl(x_line_index_tbl.COUNT) :=
10305           '';
10306         END IF;
10307         IF l_debug = FND_API.G_TRUE THEN
10308           QP_PREQ_GRP.engine_debug('next line ');
10309         END IF;
10310         x_line_index_tbl(x_line_index_tbl.COUNT + 1) :=
10311         l_line_index_tbl(l_line_index_tbl.COUNT);
10312         l_total_qty_tbl(x_line_index_tbl.COUNT) :=
10313         I.ordered_quantity;
10314         IF l_debug = FND_API.G_TRUE THEN
10315           QP_PREQ_GRP.engine_debug('price info: line index '
10316                                    || x_line_index_tbl(x_line_index_tbl.COUNT)
10317                                    ||' price '|| x_list_price_tbl(x_line_index_tbl.COUNT)
10318                                    ||' qty '|| l_line_quantity_tbl(l_line_dtl_index_tbl.COUNT)
10319                                    ||' adjamt '|| l_adj_amt_tbl(l_line_dtl_index_tbl.COUNT)
10320                                    ||' brk satisfied '|| l_break_satisfied);
10321         END IF;
10322       END IF;
10323     END LOOP;
10324 
10325     IF x_line_index_tbl.COUNT > 0
10326       --for the last line
10327       THEN
10328       IF l_debug = FND_API.G_TRUE THEN
10329         QP_PREQ_GRP.engine_debug('price info: line index ');
10330       END IF;
10331       IF l_break_satisfied = G_NO
10332         THEN
10333         x_pricing_sts_code_tbl(x_line_index_tbl.COUNT) :=
10334         G_STATUS_CALC_ERROR;
10335         x_pricing_sts_txt_tbl(x_line_index_tbl.COUNT) :=
10336         'UNABLE TO PRICE LINE';
10337       ELSE
10338         x_pricing_sts_code_tbl(x_line_index_tbl.COUNT) :=
10339         G_STATUS_UPDATED;
10340         x_pricing_sts_txt_tbl(x_line_index_tbl.COUNT) :=
10341         '';
10342       END IF;
10343       x_list_price_tbl(x_line_index_tbl.COUNT) :=
10344       l_total_price_tbl(x_line_index_tbl.COUNT) /
10345       l_total_qty_tbl(x_line_index_tbl.COUNT);
10346       IF l_debug = FND_API.G_TRUE THEN
10347         QP_PREQ_GRP.engine_debug('price info: line index '
10348                                  || x_line_index_tbl(x_line_index_tbl.COUNT)
10349                                  ||' price '|| x_list_price_tbl(x_line_index_tbl.COUNT) ||' '
10350                                  || l_total_qty_tbl(x_line_index_tbl.COUNT) ||' '
10351                                  || l_total_price_tbl(x_line_index_tbl.COUNT)
10352                                  ||' qty '|| l_line_quantity_tbl(l_line_dtl_index_tbl.COUNT)
10353                                  ||' adjamt '|| l_adj_amt_tbl(l_line_dtl_index_tbl.COUNT)
10354                                  ||' brk satisfied '|| l_break_satisfied);
10355       END IF;
10356     END IF;
10357 
10358     IF l_line_quantity_tbl.COUNT > 0
10359       THEN
10360       IF l_debug = FND_API.G_TRUE THEN
10361         QP_PREQ_GRP.engine_debug('process_price_break5: count '
10362                                  || l_line_quantity_tbl.COUNT ||' first '
10363                                  || l_line_quantity_tbl.FIRST ||' last '
10364                                  || l_line_quantity_tbl.LAST);
10365       END IF;
10366       FORALL i IN l_line_quantity_tbl.FIRST..l_line_quantity_tbl.LAST
10367       UPDATE qp_npreq_ldets_tmp
10368       SET line_quantity = l_line_quantity_tbl(i)
10369       , applied_flag = l_applied_flag_tbl(i)
10370       , adjustment_amount = l_adj_amt_tbl(i)
10371       WHERE line_detail_index = l_line_dtl_index_tbl(i);
10372     END IF;
10373 
10374     IF l_debug = FND_API.G_TRUE THEN
10375       QP_PREQ_GRP.engine_debug('process_price_break5');
10376 
10377     END IF;
10378     IF x_line_index_tbl.COUNT > 0
10379       THEN
10380       IF QP_PREQ_GRP.G_DEBUG_ENGINE = FND_API.G_TRUE
10381         THEN
10382         FOR i IN x_line_index_tbl.FIRST..x_line_index_tbl.LAST
10383           LOOP
10384           IF l_debug = FND_API.G_TRUE THEN
10385             QP_PREQ_GRP.engine_debug('line details '|| x_line_index_tbl(i)
10386                                      ||' price '|| x_list_price_tbl(i) ||' sts '
10387                                      || x_pricing_sts_code_tbl(i));
10388           END IF;
10389         END LOOP;
10390       END IF; --QP_PREQ_GRP.G_DEBUG_ENGINE
10391       IF l_debug = FND_API.G_TRUE THEN
10392         QP_PREQ_GRP.engine_debug('update PBH ');
10393       END IF;
10394       FORALL i IN x_line_index_tbl.FIRST..x_line_index_tbl.LAST
10395       UPDATE qp_npreq_ldets_tmp
10396       SET line_quantity = l_total_qty_tbl(i)
10397       , applied_flag = G_YES
10398       , adjustment_amount = x_list_price_tbl(i)
10399       WHERE line_index = x_line_index_tbl(i)
10400       AND created_from_list_line_type = G_BY_PBH
10401       AND created_from_list_type_code IN
10402               (G_PRICE_LIST_HEADER, G_AGR_LIST_HEADER)
10403       AND x_pricing_sts_code_tbl(i) = G_STATUS_UPDATED;
10404     END IF; --x_line_index_tbl.COUNT
10405 
10406     UPDATE qp_npreq_ldets_tmp
10407     SET applied_flag = G_NO
10408     WHERE created_from_list_line_type = G_PRICE_BREAK_TYPE
10409     AND created_from_list_type_code IN
10410             (G_PRICE_LIST_HEADER, G_AGR_LIST_HEADER)
10411     AND adjustment_amount IS NULL;
10412 
10413     IF l_debug = FND_API.G_TRUE THEN
10414       QP_PREQ_GRP.engine_debug('End process_price_break');
10415     END IF;
10416   EXCEPTION
10417     WHEN OTHERS THEN
10418       x_return_status := FND_API.G_RET_STS_ERROR;
10419       x_return_status_text := 'QP_PREQ_PUB.Process_Price_Break Exception: '
10420       || SQLERRM;
10421       IF l_debug = FND_API.G_TRUE THEN
10422         QP_PREQ_GRP.engine_debug('Exception process_price_break '|| SQLERRM);
10423       END IF;
10424   END PROCESS_PRICE_BREAK;
10425 
10426   PROCEDURE Update_Service_Lines(x_return_status OUT NOCOPY VARCHAR2,
10427                                  x_return_status_text OUT NOCOPY VARCHAR2) IS
10428   /*
10429 INDX,QP_PREQ_PUB.Usage_pricing.l_Service_Cur,-No Index Used-,NA,NA
10430 */
10431   CURSOR l_Service_Cur IS
10432     SELECT rltd.line_index,
10433            rltd.related_line_index,
10434            line.unit_price,
10435            line.priced_quantity,
10436            line.priced_uom_code
10437     FROM qp_npreq_rltd_lines_tmp rltd, qp_npreq_lines_tmp line
10438     WHERE rltd.line_index IS NOT NULL
10439     AND   rltd.related_line_index IS NOT NULL
10440     AND   rltd.relationship_type_code = G_SERVICE_LINE
10441     AND   line.line_index = rltd.line_index;
10442 
10443   l_parent_line_tbl QP_PREQ_GRP.NUMBER_TYPE;
10444   l_service_line_tbl QP_PREQ_GRP.NUMBER_TYPE;
10445   l_unit_price_tbl QP_PREQ_GRP.NUMBER_TYPE;
10446   l_priced_quantity_tbl QP_PREQ_GRP.NUMBER_TYPE;
10447   l_priced_uom_code_tbl QP_PREQ_GRP.VARCHAR_TYPE;
10448 
10449   BEGIN
10450 
10451     l_debug := QP_PREQ_GRP.G_DEBUG_ENGINE;
10452     IF l_debug = FND_API.G_TRUE THEN
10453       QP_PREQ_GRP.engine_debug('Begin Update_Service_Lines');
10454 
10455     END IF;
10456     OPEN l_Service_Cur;
10457     FETCH l_Service_Cur
10458     BULK COLLECT INTO
10459     l_parent_line_tbl,
10460     l_service_line_tbl,
10461     l_unit_price_tbl,
10462     l_priced_quantity_tbl,
10463     l_priced_uom_code_tbl;
10464     CLOSE l_Service_Cur;
10465 
10466     IF l_service_line_tbl.COUNT > 0
10467       THEN
10468       FORALL i IN l_service_line_tbl.FIRST..l_service_line_tbl.LAST
10469       UPDATE qp_npreq_lines_tmp
10470               SET parent_price = l_unit_price_tbl(i),
10471               parent_uom_code = l_priced_uom_code_tbl(i),
10472               processing_order = 2,
10473               parent_quantity = l_priced_quantity_tbl(i)
10474               WHERE line_index = l_service_line_tbl(i);
10475       FORALL i IN l_parent_line_tbl.FIRST..l_parent_line_tbl.LAST
10476       UPDATE qp_npreq_lines_tmp
10477               SET processing_order = 1
10478               WHERE line_index = l_parent_line_tbl(i);
10479     END IF;
10480 
10481     IF l_debug = FND_API.G_TRUE THEN
10482       QP_PREQ_GRP.engine_debug('End Update_Service_Lines');
10483     END IF;
10484   EXCEPTION
10485     WHEN OTHERS THEN
10486       x_return_status := FND_API.G_RET_STS_ERROR;
10487       x_return_status_text := 'QP_PREQ_PUB.Update_Service_Lines Exception: '
10488       || SQLERRM;
10489       IF l_debug = FND_API.G_TRUE THEN
10490         QP_PREQ_GRP.engine_debug('Exception Update_Service_Lines '|| SQLERRM);
10491       END IF;
10492   END Update_Service_Lines;
10493 
10494 
10495   PROCEDURE Usage_pricing(p_rounding_flag IN VARCHAR2,
10496                           x_return_status OUT NOCOPY VARCHAR2,
10497                           x_return_status_text OUT NOCOPY VARCHAR2) IS
10498 
10499   CURSOR l_get_price_cur(p_processing_order NUMBER) IS
10500     SELECT    ldet.created_from_list_line_id
10501             , line.line_index line_ind
10502             , ldet.line_detail_index
10503             , ldet.created_from_list_line_type
10504             , ldet.modifier_level_code
10505             , ldet.applied_flag
10506 --		, 1.0 amount_changed
10507 --		, line.adjusted_unit_price
10508 --changed to make sure lumpsum on order level frt charge divide by 1 quantity
10509             , ldet.line_quantity priced_quantity
10510             , line.priced_quantity priced_qty
10511             , ldet.group_quantity
10512             , ldet.group_amount
10513             , ldet.operand_calculation_code
10514             , ldet.operand_value
10515             , ldet.adjustment_amount
10516             , line.unit_price
10517             , ldet.process_code
10518             , ldet.price_break_type_code
10519             , line.rounding_factor
10520             , line.uom_quantity service_duration
10521             , line.processing_order
10522             , line.parent_price
10523     FROM qp_npreq_lines_tmp line, qp_npreq_ldets_tmp ldet
10524     WHERE line.usage_pricing_type = QP_PREQ_GRP.G_BILLING_TYPE
10525             AND ldet.line_index = line.line_index
10526             AND line.price_flag = G_CALCULATE_ONLY
10527             AND nvl(processing_order, 1) = p_processing_order
10528             AND ldet.applied_flag = G_YES
10529             AND ldet.created_from_list_type_code IN
10530                     (G_PRICE_LIST_HEADER, G_AGR_LIST_HEADER)
10531             AND ldet.created_from_list_line_type = G_PRICE_LIST_TYPE
10532             AND nvl(ldet.line_detail_type_code, 'NULL') <>
10533                                             G_CHILD_DETAIL_TYPE
10534             ORDER BY line_ind;
10535 
10536 
10537 
10538   l_line_dtl_index_tbl QP_PREQ_GRP.NUMBER_TYPE;
10539   l_unit_price_tbl QP_PREQ_GRP.NUMBER_TYPE;
10540   l_adj_amt_tbl QP_PREQ_GRP.NUMBER_TYPE;
10541   l_percent_price_tbl QP_PREQ_GRP.NUMBER_TYPE;
10542   l_related_item_price NUMBER;
10543   l_line_index_tbl QP_PREQ_GRP.NUMBER_TYPE;
10544   --l_detail_type_code_tbl QP_PREQ_GRP.VARCHAR_TYPE;
10545   l_pricing_sts_code_tbl QP_PREQ_GRP.VARCHAR_TYPE;
10546   l_pricing_sts_txt_tbl QP_PREQ_GRP.VARCHAR_TYPE;
10547 
10548   USAGE_EXCEPTION EXCEPTION;
10549   BEGIN
10550 
10551     l_debug := QP_PREQ_GRP.G_DEBUG_ENGINE;
10552     IF l_debug = FND_API.G_TRUE THEN
10553       QP_PREQ_GRP.engine_debug('Begin Usage Pricing');
10554 
10555 
10556     END IF;
10557     Process_Price_Break(p_rounding_flag => p_rounding_flag,
10558                         p_processing_order => 1,
10559                         x_line_index_tbl => l_line_index_tbl,
10560                         x_list_price_tbl => l_unit_price_tbl,
10561                         x_pricing_sts_code_tbl => l_pricing_sts_code_tbl,
10562                         x_pricing_sts_txt_tbl => l_pricing_sts_txt_tbl,
10563                         x_return_status => x_return_status,
10564                         x_return_status_text => x_return_status_text);
10565     IF x_return_status = FND_API.G_RET_STS_ERROR
10566       THEN
10567       RAISE Usage_Exception;
10568     END IF;
10569     FOR cl IN l_get_price_cur(1)
10570       LOOP
10571       IF l_debug = FND_API.G_TRUE THEN
10572         QP_PREQ_GRP.engine_debug('Begin Usage Pricing LOOP');
10573         QP_PREQ_GRP.engine_debug('PRL line type '
10574                                  || cl.created_from_list_line_type ||' operator '
10575                                  || cl.OPERAND_CALCULATION_CODE ||' operand '
10576                                  || cl.OPERAND_VALUE ||' svc duration '
10577                                  || nvl(cl.service_duration, 1) ||' rounding fac '
10578                                  || cl.rounding_factor ||' rounding flag '
10579                                  || p_rounding_flag);
10580       END IF;
10581       IF cl.created_from_list_line_type = G_PRICE_LIST_TYPE
10582         THEN
10583         l_line_dtl_index_tbl(l_line_dtl_index_tbl.COUNT + 1) :=
10584         cl.line_detail_index;
10585         l_line_index_tbl(l_line_index_tbl.COUNT + 1) :=
10586         cl.line_ind;
10587 
10588         QP_Calculate_Price_PUB.Calculate_List_Price
10589         (p_operand_calc_code => cl.OPERAND_CALCULATION_CODE,
10590          p_operand_value => cl.OPERAND_VALUE,
10591          p_request_qty => cl.priced_qty,
10592          p_rltd_item_price => l_related_item_price,
10593          p_service_duration => nvl(cl.service_duration, 1),
10594          p_rounding_flag => p_rounding_flag,
10595          p_rounding_factor => cl.rounding_factor,
10596          x_list_price => l_adj_amt_tbl(l_line_dtl_index_tbl.COUNT),
10597          x_percent_price => l_percent_price_tbl(l_percent_price_tbl.COUNT + 1),
10598          x_return_status => x_return_status,
10599          x_return_status_txt => x_return_status_text);
10600 
10601         l_unit_price_tbl(l_unit_price_tbl.COUNT + 1) :=
10602         l_adj_amt_tbl(l_adj_amt_tbl.COUNT);
10603 
10604         IF l_unit_price_tbl(l_unit_price_tbl.COUNT) IS NULL
10605           THEN
10606           l_pricing_sts_code_tbl(l_pricing_sts_code_tbl.COUNT + 1)
10607           := G_STATUS_CALC_ERROR;
10608           l_pricing_sts_txt_tbl(l_pricing_sts_txt_tbl.COUNT + 1)
10609           := 'UNABLE TO PRICE LINE';
10610         ELSE
10611           l_pricing_sts_code_tbl(l_pricing_sts_code_tbl.COUNT + 1)
10612           := G_STATUS_UPDATED;
10613           l_pricing_sts_txt_tbl(l_pricing_sts_txt_tbl.COUNT + 1)
10614           := '';
10615         END IF; --l_unit_price_tbl
10616 
10617         IF l_debug = FND_API.G_TRUE THEN
10618           QP_PREQ_GRP.engine_debug('price returned '
10619                                    || l_adj_amt_tbl(l_line_dtl_index_tbl.COUNT)
10620                                    ||' %price '|| l_percent_price_tbl(l_percent_price_tbl.COUNT)
10621                                    ||' line index '|| l_line_index_tbl(l_line_index_tbl.COUNT)
10622                                    ||' unit price '|| l_unit_price_tbl(l_unit_price_tbl.COUNT)
10623                                    ||' status '|| l_pricing_sts_code_tbl(l_line_index_tbl.COUNT)
10624                                    ||' text '|| l_pricing_sts_txt_tbl(l_line_index_tbl.COUNT));
10625         END IF;
10626       END IF;
10627 
10628     END LOOP;
10629 
10630     IF l_line_dtl_index_tbl.COUNT > 0
10631       THEN
10632       IF l_debug = FND_API.G_TRUE THEN
10633         QP_PREQ_GRP.engine_debug('Begin Usage Pricing LOOP1');
10634       END IF;
10635       FORALL i IN l_line_dtl_index_tbl.FIRST..l_line_dtl_index_tbl.LAST
10636       UPDATE qp_npreq_ldets_tmp
10637               SET adjustment_amount = l_adj_amt_tbl(i)
10638               WHERE line_detail_index = l_line_dtl_index_tbl(i);
10639     END IF; --l_line_dtl_index_tbl.COUNT
10640 
10641     IF l_line_index_tbl.COUNT > 0
10642       THEN
10643       IF l_debug = FND_API.G_TRUE THEN
10644         QP_PREQ_GRP.engine_debug('Begin LINES Usage Pricing LOOP1');
10645       END IF;
10646       FORALL i IN l_line_index_tbl.FIRST..l_line_index_tbl.LAST
10647       UPDATE qp_npreq_lines_tmp
10648               SET unit_price = l_unit_price_tbl(i),
10649               pricing_status_code = l_pricing_sts_code_tbl(i),
10650               pricing_status_text = l_pricing_sts_txt_tbl(i)
10651               WHERE line_index = l_line_index_tbl(i);
10652     END IF; --l_line_index_tbl.COUNT
10653 
10654     --now service lines need to be priced
10655     l_line_index_tbl.DELETE;
10656     l_unit_price_tbl.DELETE;
10657     l_pricing_sts_code_tbl.DELETE;
10658     l_pricing_sts_txt_tbl.DELETE;
10659     l_adj_amt_tbl.DELETE;
10660     l_line_dtl_index_tbl.DELETE;
10661 
10662 
10663     Update_Service_Lines(x_return_status, x_return_status_text);
10664 
10665     IF x_return_status = FND_API.G_RET_STS_ERROR
10666       THEN
10667       RAISE Usage_Exception;
10668     END IF;
10669 
10670 
10671     Process_Price_Break(p_rounding_flag => p_rounding_flag,
10672                         p_processing_order => 2,
10673                         x_line_index_tbl => l_line_index_tbl,
10674                         x_list_price_tbl => l_unit_price_tbl,
10675                         x_pricing_sts_code_tbl => l_pricing_sts_code_tbl,
10676                         x_pricing_sts_txt_tbl => l_pricing_sts_txt_tbl,
10677                         x_return_status => x_return_status,
10678                         x_return_status_text => x_return_status_text);
10679     IF x_return_status = FND_API.G_RET_STS_ERROR
10680       THEN
10681       RAISE Usage_Exception;
10682     END IF;
10683 
10684     FOR cl IN l_get_price_cur(2)
10685       LOOP
10686       IF l_debug = FND_API.G_TRUE THEN
10687         QP_PREQ_GRP.engine_debug('Begin Usage Pricing LOOP2');
10688         QP_PREQ_GRP.engine_debug('PRL line type '
10689                                  || cl.created_from_list_line_type ||' operator '
10690                                  || cl.OPERAND_CALCULATION_CODE ||' operand '
10691                                  || cl.OPERAND_VALUE ||' svc duration '
10692                                  || nvl(cl.service_duration, 1) ||' rounding fac '
10693                                  || cl.rounding_factor ||' rounding flag '
10694                                  || p_rounding_flag ||' parent price '|| cl.parent_price);
10695       END IF;
10696       IF cl.created_from_list_line_type = G_PRICE_LIST_TYPE
10697         THEN
10698         l_line_dtl_index_tbl(l_line_dtl_index_tbl.COUNT + 1) :=
10699         cl.line_detail_index;
10700         l_line_index_tbl(l_line_index_tbl.COUNT + 1) :=
10701         cl.line_ind;
10702 
10703         QP_Calculate_Price_PUB.Calculate_List_Price
10704         (p_operand_calc_code => cl.OPERAND_CALCULATION_CODE,
10705          p_operand_value => cl.OPERAND_VALUE,
10706          p_request_qty => cl.priced_qty,
10707          p_rltd_item_price => cl.parent_price,
10708          p_service_duration => nvl(cl.service_duration, 1),
10709          p_rounding_flag => p_rounding_flag,
10710          p_rounding_factor => cl.rounding_factor,
10711          x_list_price => l_adj_amt_tbl(l_line_dtl_index_tbl.COUNT),
10712          x_percent_price => l_percent_price_tbl(l_percent_price_tbl.COUNT + 1),
10713          x_return_status => x_return_status,
10714          x_return_status_txt => x_return_status_text);
10715 
10716         l_unit_price_tbl(l_unit_price_tbl.COUNT + 1) :=
10717         l_adj_amt_tbl(l_adj_amt_tbl.COUNT);
10718 
10719         IF l_unit_price_tbl(l_unit_price_tbl.COUNT) IS NULL
10720           THEN
10721           l_pricing_sts_code_tbl(l_pricing_sts_code_tbl.COUNT + 1)
10722           := G_STATUS_CALC_ERROR;
10723           l_pricing_sts_txt_tbl(l_pricing_sts_txt_tbl.COUNT + 1)
10724           := 'UNABLE TO PRICE LINE';
10725         ELSE
10726           l_pricing_sts_code_tbl(l_pricing_sts_code_tbl.COUNT + 1)
10727           := G_STATUS_UPDATED;
10728           l_pricing_sts_txt_tbl(l_pricing_sts_txt_tbl.COUNT + 1)
10729           := '';
10730         END IF; --l_unit_price_tbl
10731         IF l_debug = FND_API.G_TRUE THEN
10732           QP_PREQ_GRP.engine_debug('price returned '
10733                                    || l_adj_amt_tbl(l_line_dtl_index_tbl.COUNT)
10734                                    ||' %price '|| l_percent_price_tbl(l_percent_price_tbl.COUNT)
10735                                    ||' unit price '|| l_unit_price_tbl(l_unit_price_tbl.COUNT)
10736                                    ||' status '|| l_pricing_sts_code_tbl(l_line_index_tbl.COUNT)
10737                                    ||' text '|| l_pricing_sts_txt_tbl(l_line_index_tbl.COUNT));
10738         END IF;
10739       END IF;
10740 
10741     END LOOP;
10742 
10743     IF l_line_dtl_index_tbl.COUNT > 0
10744       THEN
10745       IF l_debug = FND_API.G_TRUE THEN
10746         QP_PREQ_GRP.engine_debug('Begin Usage Pricing LOOP2');
10747       END IF;
10748       FORALL i IN l_line_dtl_index_tbl.FIRST..l_line_dtl_index_tbl.LAST
10749       UPDATE qp_npreq_ldets_tmp
10750               SET adjustment_amount = l_adj_amt_tbl(i)
10751               WHERE line_detail_index = l_line_dtl_index_tbl(i);
10752     END IF; --l_line_dtl_index_tbl.COUNT
10753 
10754     IF l_line_index_tbl.COUNT > 0
10755       THEN
10756       IF l_debug = FND_API.G_TRUE THEN
10757         QP_PREQ_GRP.engine_debug('Begin LINES Usage Pricing LOOP2');
10758       END IF;
10759       FORALL i IN l_line_index_tbl.FIRST..l_line_index_tbl.LAST
10760       UPDATE qp_npreq_lines_tmp
10761               SET unit_price = l_unit_price_tbl(i),
10762               pricing_status_code = l_pricing_sts_code_tbl(i),
10763               pricing_status_text = l_pricing_sts_txt_tbl(i)
10764               WHERE line_index = l_line_index_tbl(i);
10765     END IF; --l_line_index_tbl.COUNT
10766 
10767 
10768 
10769     IF l_debug = FND_API.G_TRUE THEN
10770       QP_PREQ_GRP.engine_debug('End Usage Pricing');
10771 
10772     END IF;
10773   EXCEPTION
10774     WHEN USAGE_EXCEPTION THEN
10775       IF l_debug = FND_API.G_TRUE THEN
10776         QP_PREQ_GRP.engine_debug('Exception Usage Pricing '|| SQLERRM);
10777       END IF;
10778       x_return_status := FND_API.G_RET_STS_ERROR;
10779     WHEN OTHERS THEN
10780       IF l_debug = FND_API.G_TRUE THEN
10781         QP_PREQ_GRP.engine_debug('Exception Usage Pricing '|| SQLERRM);
10782       END IF;
10783       x_return_status := FND_API.G_RET_STS_ERROR;
10784       x_return_status_text := 'QP_PREQ_PUB.Usage_Pricing Exception: '
10785       || SQLERRM;
10786   END Usage_pricing;
10787 
10788   FUNCTION Call_Usage_Pricing RETURN VARCHAR2 IS
10789 
10790   CURSOR l_chk_usage_cur IS
10791     SELECT G_YES
10792     FROM qp_npreq_lines_tmp line
10793     WHERE line.pricing_status_code IN
10794     (G_STATUS_UPDATED, G_STATUS_UNCHANGED, G_STATUS_GSA_VIOLATION)
10795     AND line.usage_pricing_type = QP_PREQ_GRP.G_BILLING_TYPE;
10796 
10797   x_call_usage_pricing VARCHAR2(1) := G_NO;
10798   BEGIN
10799     OPEN l_chk_usage_cur;
10800     FETCH l_chk_usage_cur INTO x_call_usage_pricing;
10801     CLOSE l_chk_usage_cur;
10802     RETURN x_call_usage_pricing;
10803   EXCEPTION
10804     WHEN OTHERS THEN
10805       IF l_debug = FND_API.G_TRUE THEN
10806         QP_PREQ_GRP.engine_debug('QP_PREQ_PUB.Call_Usage_Pricing Exception: '|| SQLERRM);
10807       END IF;
10808       x_call_usage_pricing := NULL;
10809   END Call_Usage_Pricing;
10810 
10811   /***********************************************************************
10812 PRG PROCESSING CODE
10813 ***********************************************************************/
10814 
10815   --this procedure identifies the passed in freegood lines
10816   --and updates the process_status on them with the get line's list_line_id
10817   PROCEDURE Identify_freegood_lines(p_event_code IN VARCHAR2
10818                                     , x_return_status OUT NOCOPY VARCHAR2
10819                                     , x_return_status_text OUT NOCOPY VARCHAR2) IS
10820 
10821   --this cursor identifies the passed in freegood lines
10822   CURSOR l_Identify_freegood_cur IS
10823     SELECT /*+ ORDERED USE_NL(ev ph oldprg oldrltd oldfgdis oldfreeline)*/
10824       oldfreeline.line_index,
10825       oldfgdis.list_line_id,
10826       nvl(oldfgdis.operand_per_pqty, oldfgdis.operand) operand_value,
10827       oldfgdis.arithmetic_operator operand_calculation_code,
10828       buyline.line_index,
10829       oldprg.list_line_id,
10830       oldprg.updated_flag
10831     FROM qp_npreq_lines_tmp buyline
10832       , qp_event_phases ev
10833       , qp_pricing_phases ph
10834       , oe_price_adjustments oldprg
10835       , oe_price_adj_assocs oldrltd
10836       , oe_price_adjustments oldfgdis
10837       , qp_npreq_lines_tmp oldfreeline
10838     --where G_REQUEST_TYPE_CODE = 'ONT'
10839     --bug 3085453 handle pricing availability UI
10840     -- they pass reqtype ONT and insert adj into ldets
10841     --bug 3085453 handle pricing availability UI
10842     -- they pass reqtype ONT and insert adj into ldets
10843     WHERE QP_PREQ_PUB.G_CHECK_CUST_VIEW_FLAG = G_YES
10844     --need not do freegoods cleanup if PRG line has price_flag 'P' or 'N'
10845     AND buyline.price_flag = G_YES --in (G_YES, G_PHASE)
10846     AND instr(p_event_code, ev.pricing_event_code || ',') > 0
10847     AND ph.pricing_phase_id = ev.pricing_phase_id
10848     AND ((G_GET_FREIGHT_FLAG = G_YES AND ph.freight_exists = 'Y')
10849          OR (G_GET_FREIGHT_FLAG = G_NO))
10850     AND (buyline.line_type_code = G_LINE_LEVEL
10851          AND oldprg.line_id = buyline.line_id)
10852     AND oldprg.list_line_type_code = G_PROMO_GOODS_DISCOUNT
10853     --we need to look for in phase PRGs only otherwise
10854     --OM will keep deleting the fg lines between LINE and ORDER event
10855     --after every reprice
10856     AND oldprg.pricing_phase_id = ph.pricing_phase_id
10857     --commented this out as OM passes price_flag as 'N' on fg line
10858     --and ((oldprg.pricing_phase_id = ev.pricing_phase_id
10859     --and buyline.price_flag = G_YES)
10860     --or (oldprg.pricing_phase_id = ev.pricing_phase_id
10861     --and buyline.price_flag = G_PHASE
10862     --and ph.freeze_override_flag = G_YES))
10863     AND oldrltd.price_adjustment_id = oldprg.price_adjustment_id
10864     AND oldfgdis.price_adjustment_id = oldrltd.rltd_price_adj_id
10865     AND oldfgdis.list_line_type_code = 'DIS'
10866     --and ((oldfgdis.line_id is null
10867     --and oldfreeline.line_type_code = G_ORDER_LEVEL
10868     --and oldfreeline.line_id = oldfgdis.header_id)
10869     --freegood line is always a line need not match header
10870     AND (oldfgdis.line_id IS NOT NULL
10871          AND oldfreeline.line_type_code = G_LINE_LEVEL
10872          AND oldfreeline.line_id = oldfgdis.line_id)
10873     UNION
10874     SELECT /*+ ORDERED USE_NL(ev ph oldprg oldrltd oldfgdis oldfreeline)*/
10875       oldfreeline.line_index,
10876       oldfgdis.list_line_id,
10877       nvl(oldfgdis.operand_per_pqty, oldfgdis.operand) operand_value,
10878       oldfgdis.arithmetic_operator operand_calculation_code,
10879       buyline.line_index,
10880       oldprg.list_line_id,
10881       oldprg.updated_flag
10882     FROM qp_npreq_lines_tmp buyline
10883       , qp_event_phases ev
10884       , qp_pricing_phases ph
10885       , oe_price_adjustments oldprg
10886       , oe_price_adj_assocs oldrltd
10887       , oe_price_adjustments oldfgdis
10888       , qp_npreq_lines_tmp oldfreeline
10889     --where G_REQUEST_TYPE_CODE = 'ONT'
10890     --bug 3085453 handle pricing availability UI
10891     -- they pass reqtype ONT and insert adj into ldets
10892     WHERE QP_PREQ_PUB.G_CHECK_CUST_VIEW_FLAG = G_YES
10893     --need not do freegoods cleanup if PRG line has price_flag 'P' or 'N'
10894     AND buyline.price_flag = G_YES --in (G_YES, G_PHASE)
10895     AND instr(p_event_code, ev.pricing_event_code || ',') > 0
10896     AND ph.pricing_phase_id = ev.pricing_phase_id
10897     AND ((G_GET_FREIGHT_FLAG = G_YES AND ph.freight_exists = 'Y')
10898          OR (G_GET_FREIGHT_FLAG = G_NO))
10899     AND (buyline.line_type_code = G_ORDER_LEVEL
10900          AND oldprg.header_id = buyline.line_id
10901          AND oldprg.line_id IS NULL)
10902     AND oldprg.list_line_type_code = G_PROMO_GOODS_DISCOUNT
10903     --we need to look for in phase PRGs only otherwise
10904     --OM will keep deleting the fg lines between LINE and ORDER event
10905     --after every reprice
10906     AND oldprg.pricing_phase_id = ph.pricing_phase_id
10907     --commented this out as OM passes price_flag as 'N' on fg line
10908     --and ((oldprg.pricing_phase_id = ev.pricing_phase_id
10909     --and buyline.price_flag = G_YES)
10910     --or (oldprg.pricing_phase_id = ev.pricing_phase_id
10911     --and buyline.price_flag = G_PHASE
10912     --and ph.freeze_override_flag = G_YES))
10913     AND oldrltd.price_adjustment_id = oldprg.price_adjustment_id
10914     AND oldfgdis.price_adjustment_id = oldrltd.rltd_price_adj_id
10915     AND oldfgdis.list_line_type_code = 'DIS'
10916     --and ((oldfgdis.line_id is null
10917     --and oldfreeline.line_type_code = G_ORDER_LEVEL
10918     --and oldfreeline.line_id = oldfgdis.header_id)
10919     --freegood line is always a line need not match header
10920     AND (oldfgdis.line_id IS NOT NULL
10921          AND oldfreeline.line_type_code = G_LINE_LEVEL
10922          AND oldfreeline.line_id = oldfgdis.line_id)
10923     UNION
10924     SELECT /*+ ORDERED USE_NL(ev ph oldprg oldrltd oldfgdis oldfreeline)*/
10925       oldfreeline.line_index,
10926       oldfgdis.created_from_list_line_id,
10927       oldfgdis.operand_value,
10928       oldfgdis.operand_calculation_code,
10929       buyline.line_index,
10930       oldprg.created_from_list_line_id,
10931       oldprg.updated_flag
10932     FROM qp_npreq_lines_tmp buyline
10933       , qp_event_phases ev
10934       , qp_pricing_phases ph
10935       , qp_npreq_ldets_tmp oldprg
10936       , qp_npreq_rltd_lines_tmp oldrltd
10937       , qp_npreq_ldets_tmp oldfgdis
10938       , qp_npreq_lines_tmp oldfreeline
10939     --where G_REQUEST_TYPE_CODE <> 'ONT'
10940     --bug 3085453 handle pricing availability UI
10941     -- they pass reqtype ONT and insert adj into ldets
10942     WHERE QP_PREQ_PUB.G_CHECK_CUST_VIEW_FLAG <> G_YES
10943     AND buyline.price_flag = G_YES --in (G_YES, G_PHASE)
10944     AND instr(p_event_code, ev.pricing_event_code || ',') > 0
10945     AND ph.pricing_phase_id = ev.pricing_phase_id
10946     AND ((G_GET_FREIGHT_FLAG = G_YES AND ph.freight_exists = 'Y')
10947          OR (G_GET_FREIGHT_FLAG = G_NO))
10948     AND oldprg.line_index = buyline.line_index
10949     AND oldprg.created_from_list_line_type = G_PROMO_GOODS_DISCOUNT
10950     --we need to look for in phase PRGs only otherwise
10951     --OC will keep deleting the fg lines between LINE and ORDER event
10952     AND oldprg.pricing_phase_id = ph.pricing_phase_id
10953     --	and oldprg.pricing_status_code = G_STATUS_UNCHANGED
10954     AND oldprg.applied_flag = G_YES
10955     AND oldrltd.line_detail_index = oldprg.line_detail_index
10956     AND oldrltd.relationship_type_code = G_GENERATED_LINE
10957     --	and oldrltd.pricing_status_code = G_STATUS_UNCHANGED
10958     AND oldfgdis.line_detail_index = oldrltd.related_line_detail_index
10959     AND oldfgdis.pricing_status_code = G_STATUS_UNCHANGED
10960     AND oldfgdis.applied_flag = G_YES
10961     AND oldfgdis.created_from_list_line_type = 'DIS'
10962     AND oldfreeline.line_index = oldrltd.related_line_index;
10963   --commented this out as OM passes price_flag as 'N' on fg line
10964   --and ((buyline.price_flag = G_YES
10965   --and oldprg.pricing_phase_id = ev.pricing_phase_id)
10966   --or (buyline.price_flag = G_PHASE
10967   --and oldprg.pricing_phase_id = ev.pricing_phase_id
10968   --and ph.freeze_override_flag = G_YES));
10969 
10970   l_fg_line_index_tbl QP_PREQ_GRP.NUMBER_TYPE;
10971   l_fg_list_line_id_tbl QP_PREQ_GRP.NUMBER_TYPE;
10972   l_buy_list_line_id_tbl QP_PREQ_GRP.NUMBER_TYPE;
10973   l_buy_line_index_tbl QP_PREQ_GRP.NUMBER_TYPE;
10974   l_buy_updated_flag_tbl QP_PREQ_GRP.FLAG_TYPE;
10975   l_fg_operand_tbl QP_PREQ_GRP.NUMBER_TYPE;
10976   l_fg_operator_tbl QP_PREQ_GRP.VARCHAR_TYPE;
10977 
10978   -- bug 3639169 - changed from dynamic sql to static sql for performance
10979   CURSOR l_prg_debug IS
10980     SELECT prg.line_id buy_line_id, prg.list_line_id prg_list_line_id,
10981      fgdis.list_line_id fgdis_list_line_id, prg.pricing_phase_id prg_phase_id,
10982      prg.price_adjustment_id prg_price_adj_id,
10983      fgdis.price_adjustment_id fg_price_adj_id, fgdis.line_id fg_line_id,
10984      prg.updated_flag
10985      FROM qp_npreq_lines_tmp line, oe_price_adjustments prg,
10986      oe_price_adj_assocs ass, oe_price_adjustments fgdis
10987      WHERE line.line_type_code = G_LINE_LEVEL
10988      AND prg.line_id = line.line_id
10989      AND prg.list_line_type_code = 'PRG'
10990      AND ass.price_adjustment_id = prg.price_adjustment_id
10991      AND fgdis.price_adjustment_id = ass.rltd_price_adj_id
10992      UNION
10993      SELECT prg.line_id buy_line_id, prg.list_line_id prg_list_line_id,
10994      fgdis.list_line_id fgdis_list_line_id, prg.pricing_phase_id prg_phase_id,
10995      prg.price_adjustment_id prg_price_adj_id,
10996      fgdis.price_adjustment_id fg_price_adj_id, fgdis.line_id fg_line_id,
10997      prg.updated_flag
10998      FROM qp_npreq_lines_tmp line, oe_price_adjustments prg,
10999      oe_price_adj_assocs ass, oe_price_adjustments fgdis
11000      WHERE line.line_type_code = G_ORDER_LEVEL
11001      AND prg.header_id = line.line_id
11002      AND prg.line_id IS NULL
11003      AND prg.list_line_type_code = 'PRG'
11004      AND ass.price_adjustment_id = prg.price_adjustment_id
11005      AND fgdis.price_adjustment_id = ass.rltd_price_adj_id;
11006 
11007   l_routine VARCHAR2(100) := 'QP_PREQ_PUB.Identify_freegood_lines ';
11008   BEGIN
11009     l_debug := QP_PREQ_GRP.G_DEBUG_ENGINE;
11010     IF l_debug = FND_API.G_TRUE THEN
11011       QP_PREQ_GRP.engine_debug('Begin Identify_freegood_lines: '|| p_event_code);
11012 
11013     END IF;
11014     x_return_status := FND_API.G_RET_STS_SUCCESS;
11015     x_return_status_text := '';
11016 
11017     IF l_debug = FND_API.G_TRUE THEN
11018       -- bug 3639169 - changed from dynamic sql to static sql for performance
11019       FOR cl IN l_prg_debug
11020         LOOP
11021         QP_PREQ_GRP.engine_debug('Printing out all PRGs irrespective of phases: '
11022                                  ||' buylineid '|| cl.buy_line_id ||' prglistlineid '|| cl.prg_list_line_id
11023                                  ||' prgpriceadjid '|| cl.prg_price_adj_id ||' prgupdatedflag '|| cl.updated_flag
11024                                  ||' fglineid '|| cl.fg_line_id ||' fgdis_listlineid '|| cl.fgdis_list_line_id
11025                                  ||' fgpriceadjid '|| cl.fg_price_adj_id ||' prg_phase_id '|| cl.prg_phase_id);
11026       END LOOP;
11027     END IF; --l_debug
11028 
11029     IF QP_PREQ_GRP.G_DEBUG_ENGINE = FND_API.G_TRUE
11030       AND l_debug = FND_API.G_TRUE
11031       THEN
11032       FOR cl IN
11033         (SELECT buyline.line_index
11034          , oldprg.list_line_id, oldfgdis.line_id
11035          , oldprg.updated_flag
11036          FROM qp_npreq_lines_tmp buyline
11037          , qp_event_phases ev
11038          , qp_pricing_phases ph
11039          , oe_price_adjustments oldprg
11040          , oe_price_adj_assocs oldrltd
11041          , oe_price_adjustments oldfgdis
11042          --  where G_REQUEST_TYPE_CODE = 'ONT'
11043          --bug 3085453 handle pricing availability UI
11044          -- they pass reqtype ONT and insert adj into ldets
11045          WHERE QP_PREQ_PUB.G_CHECK_CUST_VIEW_FLAG = G_YES
11046          AND instr(p_event_code, ev.pricing_event_code || ',') > 0
11047          AND ph.pricing_phase_id = ev.pricing_phase_id
11048          AND ((buyline.line_type_code = G_LINE_LEVEL
11049                AND oldprg.line_id = buyline.line_id)
11050               OR (buyline.line_type_code = G_ORDER_LEVEL
11051                   AND oldprg.header_id = buyline.line_id
11052                   AND oldprg.line_id IS NULL))
11053          AND oldprg.list_line_type_code = 'PRG'
11054          AND oldprg.pricing_phase_id = ph.pricing_phase_id
11055          --  and ((oldprg.pricing_phase_id = ev.pricing_phase_id
11056          --  and buyline.price_flag = G_YES)
11057          --  or (oldprg.pricing_phase_id = ev.pricing_phase_id
11058          --  and buyline.price_flag = G_PHASE
11059          --  and ph.freeze_override_flag = G_YES))
11060          AND oldrltd.price_adjustment_id = oldprg.price_adjustment_id
11061          AND oldfgdis.price_adjustment_id = oldrltd.rltd_price_adj_id
11062          AND oldfgdis.list_line_type_code = 'DIS')
11063         LOOP
11064         IF l_debug = FND_API.G_TRUE THEN
11065           qp_preq_grp.engine_debug('ident fg dtls: buylineindex '|| cl.line_index
11066                                    ||' prg-list_line_id '|| cl.list_line_id
11067                                    ||' fgline_id  '|| cl.line_id ||' updated_flag '|| cl.updated_flag);
11068         END IF;
11069       END LOOP; --for cl
11070     END IF; --debug
11071 
11072     OPEN l_Identify_freegood_cur;
11073     l_fg_line_index_tbl.DELETE;
11074     l_fg_list_line_id_tbl.DELETE;
11075     l_fg_operand_tbl.DELETE;
11076     l_fg_operator_tbl.DELETE;
11077     l_buy_line_index_tbl.DELETE;
11078     l_buy_list_line_id_tbl.DELETE;
11079     FETCH l_Identify_freegood_cur
11080     BULK COLLECT INTO l_fg_line_index_tbl
11081     , l_fg_list_line_id_tbl
11082     , l_fg_operand_tbl
11083     , l_fg_operator_tbl
11084     , l_buy_line_index_tbl
11085     , l_buy_list_line_id_tbl
11086     , l_buy_updated_flag_tbl;
11087     CLOSE l_Identify_freegood_cur;
11088 
11089     IF l_fg_line_index_tbl.COUNT > 0
11090       THEN
11091       IF l_debug = FND_API.G_TRUE THEN
11092         QP_PREQ_GRP.engine_debug('Freegood lines exist: '|| l_fg_line_index_tbl.COUNT);
11093 
11094       END IF;
11095       IF QP_PREQ_GRP.G_DEBUG_ENGINE = FND_API.G_TRUE
11096         THEN
11097         FOR i IN l_fg_line_index_tbl.FIRST..l_fg_line_index_tbl.LAST
11098           LOOP
11099           IF l_debug = FND_API.G_TRUE THEN
11100             QP_PREQ_GRP.engine_debug('process_sts: line_ind '
11101                                      || l_fg_line_index_tbl(i) ||' fglist_line_id '
11102                                      || l_fg_list_line_id_tbl(i) ||' fgdis operand '
11103                                      || l_fg_operand_tbl(i) ||' fgdis operator '
11104                                      || l_fg_operator_tbl(i) ||' prglist_line_id '
11105                                      || l_buy_list_line_id_tbl(i) ||' prg-updated_flag '
11106                                      || l_buy_updated_flag_tbl(i));
11107           END IF;
11108         END LOOP; --l_fg_line_index_tbl
11109       END IF; --debug
11110 
11111       FORALL i IN l_fg_line_index_tbl.FIRST..l_fg_line_index_tbl.LAST
11112       UPDATE qp_npreq_lines_tmp
11113       SET process_status = G_FREEGOOD || l_fg_list_line_id_tbl(i) || G_BUYLINE
11114       || l_buy_line_index_tbl(i) || G_PROMO_GOODS_DISCOUNT || l_buy_list_line_id_tbl(i)
11115       || G_PROMO_GOODS_DISCOUNT || nvl(l_buy_updated_flag_tbl(i), G_NO)
11116       || G_STATUS_UPDATED || l_fg_operand_tbl(i) || l_fg_operator_tbl(i)
11117       || G_PROMO_GOODS_DISCOUNT
11118         , priced_quantity = nvl(priced_quantity, line_quantity) -- 2970402, 2997007
11119         , priced_uom_code = nvl(priced_uom_code, line_uom_code) -- 2970402, 2997007
11120       WHERE line_index = l_fg_line_index_tbl(i);
11121 
11122     END IF; --l_fg_line_index_tbl.count
11123 
11124     IF QP_PREQ_GRP.G_DEBUG_ENGINE = FND_API.G_TRUE
11125       THEN
11126       FOR cl IN (SELECT line_index, process_status FROM qp_npreq_lines_tmp
11127                  WHERE instr(process_status, G_FREEGOOD) > 0)
11128         LOOP
11129         IF l_debug = FND_API.G_TRUE THEN
11130           QP_PREQ_GRP.engine_debug('Freegood line dtl: line_ind '
11131                                    || cl.line_index ||' process_sts '|| cl.process_status);
11132         END IF;
11133       END LOOP; --for cl
11134     END IF; --debug
11135 
11136     IF l_debug = FND_API.G_TRUE THEN
11137       QP_PREQ_GRP.engine_debug('End Identify_freegood_lines');
11138     END IF;
11139   EXCEPTION
11140     WHEN OTHERS THEN
11141       x_return_status := FND_API.G_RET_STS_ERROR;
11142       x_return_status_text := 'Exception in '|| l_routine ||' '|| SQLERRM;
11143       IF l_debug = FND_API.G_TRUE THEN
11144         QP_PREQ_GRP.engine_debug('Exception in '|| l_routine ||' '|| SQLERRM);
11145       END IF;
11146   END Identify_freegood_lines;
11147 
11148   --procedure to mark the prg lines as deleted if
11149   --called by OC or any other application other than OM
11150   --this is because there will be 2 prg adjustments one passed-in
11151   --and other inserted the pricing engine
11152   --the prg against the line which is marked as invalid needs to
11153   --be marked as deleted so that it is not visible to calling application
11154   --(created for bug 2970368)
11155   PROCEDURE Update_prg_pricing_status(x_return_status OUT NOCOPY VARCHAR2,
11156                                       x_return_status_text OUT NOCOPY VARCHAR2) IS
11157   CURSOR l_mark_prg_delete_cur IS
11158     SELECT rltd.line_detail_index, rltd.related_line_detail_index
11159     FROM qp_npreq_rltd_lines_tmp rltd, qp_npreq_lines_tmp line
11160     WHERE rltd.pricing_status_code = G_STATUS_NEW
11161     AND rltd.relationship_type_code = G_GENERATED_LINE
11162     AND line.line_index = rltd.related_line_index
11163     AND line.process_status IN (G_NOT_VALID, G_STATUS_DELETED); --bug 3126969
11164 
11165   l_mark_prg_delete_index QP_PREQ_GRP.number_type;
11166   l_mark_fgdis_delete_index QP_PREQ_GRP.number_type;
11167   l_prg_list_line_id NUMBER;
11168 
11169   l_debug VARCHAR2(3);
11170   l_routine VARCHAR2(50) := 'QP_PREQ_PUB.Update_prg_pricing_status';
11171   BEGIN
11172     l_debug := QP_PREQ_GRP.G_DEBUG_ENGINE;
11173     IF l_debug = FND_API.G_TRUE THEN
11174       QP_PREQ_GRP.engine_debug('Begin Update_prg_pricing_status');
11175     END IF;
11176     OPEN l_mark_prg_delete_cur;
11177     l_mark_prg_delete_index.DELETE;
11178     l_mark_fgdis_delete_index.DELETE;
11179     FETCH l_mark_prg_delete_cur BULK COLLECT INTO
11180     l_mark_prg_delete_index, l_mark_fgdis_delete_index;
11181     CLOSE l_mark_prg_delete_cur;
11182 
11183     IF l_mark_prg_delete_index.COUNT > 0 THEN
11184       IF l_debug = FND_API.G_TRUE THEN
11185         FOR i IN l_mark_prg_delete_index.FIRST..l_mark_prg_delete_index.LAST
11186           LOOP
11187           BEGIN
11188             SELECT created_from_list_line_id INTO l_prg_list_line_id
11189             FROM qp_npreq_ldets_tmp
11190             WHERE line_detail_index = l_mark_prg_delete_index(i);
11191             QP_PREQ_GRP.engine_debug('Mark delete prg '|| l_mark_prg_delete_index(i)
11192                                      ||' list_line_id '|| l_prg_list_line_id);
11193           EXCEPTION
11194             WHEN OTHERS THEN
11195               QP_PREQ_GRP.engine_debug('Mark delete prg list_line_id -1');
11196           END;
11197         END LOOP;
11198       END IF; --l_debug
11199       IF QP_PREQ_PUB.G_CHECK_CUST_VIEW_FLAG = 'N' THEN
11200         FORALL i IN l_mark_prg_delete_index.FIRST..l_mark_prg_delete_index.LAST
11201         UPDATE qp_npreq_ldets_tmp SET pricing_status_code = G_STATUS_DELETED
11202         WHERE line_detail_index = l_mark_prg_delete_index(i);
11203       END IF;
11204     END IF; --l_mark_prg_delete_index.COUNT
11205 
11206     IF l_mark_fgdis_delete_index.COUNT > 0 THEN
11207 
11208       IF l_debug = FND_API.G_TRUE THEN
11209         FOR i IN l_mark_fgdis_delete_index.FIRST..l_mark_fgdis_delete_index.LAST
11210           LOOP
11211           BEGIN
11212             SELECT created_from_list_line_id INTO l_prg_list_line_id
11213             FROM qp_npreq_ldets_tmp
11214             WHERE line_detail_index = l_mark_fgdis_delete_index(i);
11215             QP_PREQ_GRP.engine_debug('Mark delete fgdis '|| l_mark_fgdis_delete_index
11216                                      (i)
11217                                      ||' list_line_id '|| l_prg_list_line_id);
11218           EXCEPTION
11219             WHEN OTHERS THEN
11220               QP_PREQ_GRP.engine_debug('Mark delete fgdis list_line_id -1');
11221           END;
11222         END LOOP;
11223       END IF; --l_debug
11224       FORALL i IN l_mark_fgdis_delete_index.FIRST..l_mark_fgdis_delete_index.LAST
11225       UPDATE qp_npreq_ldets_tmp SET pricing_status_code = G_STATUS_DELETED
11226       WHERE line_detail_index = l_mark_fgdis_delete_index(i);
11227     END IF; --l_mark_fgdis_delete_index.count
11228     IF l_debug = FND_API.G_TRUE THEN
11229       QP_PREQ_GRP.engine_debug('End Update_prg_pricing_status');
11230     END IF;
11231     x_return_status := FND_API.G_RET_STS_SUCCESS;
11232   EXCEPTION
11233     WHEN OTHERS THEN
11234       x_return_status := FND_API.G_RET_STS_ERROR;
11235       x_return_status_text := 'Exception in '|| l_routine ||' '|| SQLERRM;
11236       IF l_debug = FND_API.G_TRUE THEN
11237         QP_PREQ_GRP.engine_debug('Exception in '|| l_routine ||' '|| SQLERRM);
11238       END IF;
11239   END Update_prg_pricing_status;
11240 
11241   --This procedure processes the passed in freegood lines marked from the
11242   --previous procedure and tries to find matching newly created PRG modifiers
11243   --applied against the buy line
11244   --If there are no PRG modifiers applied, the passed in freegood line is
11245   --marked as deleted for the calling application to delete them
11246   --If there are matching PRG modifiers applied, then we compare the
11247   --passed in freegood lines against what the engine has newly created
11248   --If they do not match, the newly created lines are marked UPDATED
11249   --for the calling application to update
11250   --If they match, then we mark them as UNCHANGED prefixing OLD or NEW
11251   --to identify the old and new freegood line. This is to compare the
11252   --selling price later on, may be that could have changed
11253   PROCEDURE Process_PRG(x_return_status OUT NOCOPY VARCHAR2,
11254                         x_return_status_text OUT NOCOPY VARCHAR2) IS
11255 
11256   PRG_Exception EXCEPTION;
11257 
11258   CURSOR l_compare_freegood_cur IS
11259     SELECT newfgline.line_index new_line_index,
11260       newfgline.line_quantity new_line_quantity,
11261       newfgline.line_uom_code new_line_uom_code,
11262       newfgline.priced_quantity new_priced_quantity,
11263       newfgline.priced_uom_code new_priced_uom_code,
11264       newfgitem.value_from new_item,
11265       newfgline.UOM_QUANTITY new_UOM_QUANTITY,
11266       newfgline.CURRENCY_CODE new_CURRENCY_CODE,
11267       newfgline.UNIT_PRICE new_UNIT_PRICE,
11268       newfgline.PERCENT_PRICE new_PERCENT_PRICE,
11269       newfgline.ADJUSTED_UNIT_PRICE new_ADJUSTED_UNIT_PRICE,
11270       newfgline.PARENT_PRICE new_PARENT_PRICE,
11271       newfgline.PARENT_QUANTITY new_PARENT_QUANTITY,
11272       newfgline.PARENT_UOM_CODE new_PARENT_UOM_CODE,
11273       newfgline.PROCESSING_ORDER new_PROCESSING_ORDER,
11274       newfgline.PROCESSED_FLAG new_PROCESSED_FLAG,
11275       newfgline.PROCESSED_CODE new_PROCESSED_CODE,
11276       newfgline.PRICE_FLAG new_PRICE_FLAG,
11277       newfgline.PRICING_STATUS_CODE new_PRICING_STATUS_CODE,
11278       newfgline.PRICING_STATUS_TEXT new_PRICING_STATUS_TEXT,
11279       newfgline.START_DATE_ACTIVE_FIRST new_START_DATE_ACTIVE_FIRST,
11280       newfgline.ACTIVE_DATE_FIRST_TYPE new_ACTIVE_DATE_FIRST_TYPE,
11281       newfgline.START_DATE_ACTIVE_SECOND new_START_DATE_ACTIVE_SECOND,
11282       newfgline.ACTIVE_DATE_SECOND_TYPE new_ACTIVE_DATE_SECOND_TYPE,
11283       newfgline.GROUP_QUANTITY new_GROUP_QUANTITY,
11284       newfgline.GROUP_AMOUNT new_GROUP_AMOUNT,
11285       newfgline.LINE_AMOUNT new_LINE_AMOUNT,
11286       newfgline.ROUNDING_FLAG new_ROUNDING_FLAG,
11287       newfgline.ROUNDING_FACTOR new_ROUNDING_FACTOR,
11288       newfgline.UPDATED_ADJUSTED_UNIT_PRICE new_upd_ADJUSTED_UNIT_PRICE,
11289       newfgline.PRICE_REQUEST_CODE new_PRICE_REQUEST_CODE,
11290       newfgline.HOLD_CODE new_HOLD_CODE,
11291       newfgline.HOLD_TEXT new_HOLD_TEXT,
11292       newfgline.PRICE_LIST_HEADER_ID new_PRICE_LIST_HEADER_ID,
11293       newfgline.VALIDATED_FLAG new_VALIDATED_FLAG,
11294       newfgline.QUALIFIERS_EXIST_FLAG new_QUALIFIERS_EXIST_FLAG,
11295       newfgline.PRICING_ATTRS_EXIST_FLAG new_PRICING_ATTRS_EXIST_FLAG,
11296       newfgline.PRIMARY_QUALIFIERS_MATCH_FLAG new_PRIMARY_QUAL_MATCH_FLAG,
11297       newfgline.USAGE_PRICING_TYPE new_USAGE_PRICING_TYPE,
11298       newfgline.LINE_CATEGORY new_LINE_CATEGORY,
11299       newfgline.CONTRACT_START_DATE new_CONTRACT_START_DATE,
11300       newfgline.CONTRACT_END_DATE new_CONTRACT_END_DATE,
11301       newfgline.LINE_UNIT_PRICE new_LINE_UNIT_PRICE,
11302       oldfreeline.line_index old_line_index,
11303       oldfreeline.line_id old_line_id,
11304       oldfreeline.line_quantity old_line_quantity,
11305       oldfreeline.line_uom_code old_line_uom_code,
11306       oldfreeline.priced_quantity old_priced_quantity,
11307       oldfreeline.priced_uom_code old_priced_uom_code,
11308       oldfreeitem.value_from old_item,
11309       oldfreeline.UOM_QUANTITY old_UOM_QUANTITY,
11310       oldfreeline.CURRENCY_CODE old_CURRENCY_CODE,
11311       oldfreeline.UNIT_PRICE old_UNIT_PRICE,
11312       oldfreeline.PERCENT_PRICE old_PERCENT_PRICE,
11313       oldfreeline.ADJUSTED_UNIT_PRICE old_ADJUSTED_UNIT_PRICE,
11314       oldfreeline.PARENT_PRICE old_PARENT_PRICE,
11315       oldfreeline.PARENT_QUANTITY old_PARENT_QUANTITY,
11316       oldfreeline.PARENT_UOM_CODE old_PARENT_UOM_CODE,
11317       oldfreeline.PROCESSING_ORDER old_PROCESSING_ORDER,
11318       oldfreeline.PROCESSED_FLAG old_PROCESSED_FLAG,
11319       oldfreeline.PROCESSED_CODE old_PROCESSED_CODE,
11320       oldfreeline.PRICE_FLAG old_PRICE_FLAG,
11321       oldfreeline.PRICING_STATUS_CODE old_PRICING_STATUS_CODE,
11322       oldfreeline.PRICING_STATUS_TEXT old_PRICING_STATUS_TEXT,
11323       oldfreeline.START_DATE_ACTIVE_FIRST old_START_DATE_ACTIVE_FIRST,
11324       oldfreeline.ACTIVE_DATE_FIRST_TYPE old_ACTIVE_DATE_FIRST_TYPE,
11325       oldfreeline.START_DATE_ACTIVE_SECOND old_START_DATE_ACTIVE_SECOND,
11326       oldfreeline.ACTIVE_DATE_SECOND_TYPE old_ACTIVE_DATE_SECOND_TYPE,
11327       oldfreeline.GROUP_QUANTITY old_GROUP_QUANTITY,
11328       oldfreeline.GROUP_AMOUNT old_GROUP_AMOUNT,
11329       oldfreeline.LINE_AMOUNT old_LINE_AMOUNT,
11330       oldfreeline.ROUNDING_FLAG old_ROUNDING_FLAG,
11331       oldfreeline.ROUNDING_FACTOR old_ROUNDING_FACTOR,
11332       oldfreeline.UPDATED_ADJUSTED_UNIT_PRICE
11333       old_upd_ADJUSTED_UNIT_PRICE,
11334       oldfreeline.PRICE_REQUEST_CODE old_PRICE_REQUEST_CODE,
11335       oldfreeline.HOLD_CODE old_HOLD_CODE,
11336       oldfreeline.HOLD_TEXT old_HOLD_TEXT,
11337       oldfreeline.PRICE_LIST_HEADER_ID old_PRICE_LIST_HEADER_ID,
11338       oldfreeline.VALIDATED_FLAG old_VALIDATED_FLAG,
11339       oldfreeline.QUALIFIERS_EXIST_FLAG old_QUALIFIERS_EXIST_FLAG,
11340       oldfreeline.PRICING_ATTRS_EXIST_FLAG old_PRICING_ATTRS_EXIST_FLAG,
11341       oldfreeline.PRIMARY_QUALIFIERS_MATCH_FLAG
11342       old_PRIMARY_QUAL_MATCH_FLAG,
11343       oldfreeline.USAGE_PRICING_TYPE old_USAGE_PRICING_TYPE,
11344       oldfreeline.LINE_CATEGORY old_LINE_CATEGORY,
11345       oldfreeline.CONTRACT_START_DATE old_CONTRACT_START_DATE,
11346       oldfreeline.CONTRACT_END_DATE old_CONTRACT_END_DATE,
11347       oldfreeline.LINE_UNIT_PRICE old_LINE_UNIT_PRICE,
11348       oldfreeline.process_status old_list_line_id,
11349       newfgdis.created_from_list_line_id newfgdis_list_line_id,
11350       newfgdis.operand_value || newfgdis.operand_calculation_code newfgdis_operand
11351     FROM qp_npreq_lines_tmp oldfreeline
11352       , qp_npreq_rltd_lines_tmp newrltd
11353       , qp_npreq_ldets_tmp newfgdis
11354       , qp_npreq_lines_tmp newfgline
11355       , qp_npreq_line_attrs_tmp oldfreeitem
11356       , qp_npreq_line_attrs_tmp newfgitem
11357     --where G_REQUEST_TYPE_CODE = 'ONT'
11358     --bug 3085453 handle pricing availability UI
11359     -- they pass reqtype ONT and insert adj into ldets
11360     WHERE QP_PREQ_PUB.G_CHECK_CUST_VIEW_FLAG = G_YES
11361     AND instr(oldfreeline.process_status, G_FREEGOOD) > 0
11362     AND newrltd.pricing_status_code = G_STATUS_NEW
11363     AND instr(oldfreeline.process_status
11364               , G_BUYLINE || newrltd.line_index || G_PROMO_GOODS_DISCOUNT) > 0
11365     AND newfgdis.pricing_status_code = G_STATUS_NEW
11366     AND newfgdis.applied_flag = G_YES
11367     AND instr(oldfreeline.process_status
11368               , G_FREEGOOD || newfgdis.created_from_list_line_id || G_BUYLINE) > 0
11369     AND newfgdis.line_detail_index = newrltd.related_line_detail_index
11370     AND newfgline.line_index = newfgdis.line_index
11371     AND oldfreeitem.line_index = oldfreeline.line_index
11372     AND oldfreeitem.line_detail_index IS NULL
11373     AND oldfreeitem.context = G_ITEM_CONTEXT
11374     AND oldfreeitem.attribute = G_PRIC_ATTRIBUTE1
11375     AND newfgitem.line_index = newfgline.line_index
11376     AND newfgitem.context = G_ITEM_CONTEXT
11377     AND newfgitem.attribute = G_PRIC_ATTRIBUTE1
11378     UNION
11379     SELECT newfgline.line_index new_line_index,
11380       newfgline.line_quantity new_line_quantity,
11381       newfgline.line_uom_code new_line_uom_code,
11382       newfgline.priced_quantity new_priced_quantity,
11383       newfgline.priced_uom_code new_priced_uom_code,
11384       newfgitem.value_from new_item,
11385       newfgline.UOM_QUANTITY new_UOM_QUANTITY,
11386       newfgline.CURRENCY_CODE new_CURRENCY_CODE,
11387       newfgline.UNIT_PRICE new_UNIT_PRICE,
11388       newfgline.PERCENT_PRICE new_PERCENT_PRICE,
11389       newfgline.ADJUSTED_UNIT_PRICE new_ADJUSTED_UNIT_PRICE,
11390       newfgline.PARENT_PRICE new_PARENT_PRICE,
11391       newfgline.PARENT_QUANTITY new_PARENT_QUANTITY,
11392       newfgline.PARENT_UOM_CODE new_PARENT_UOM_CODE,
11393       newfgline.PROCESSING_ORDER new_PROCESSING_ORDER,
11394       newfgline.PROCESSED_FLAG new_PROCESSED_FLAG,
11395       newfgline.PROCESSED_CODE new_PROCESSED_CODE,
11396       newfgline.PRICE_FLAG new_PRICE_FLAG,
11397       newfgline.PRICING_STATUS_CODE new_PRICING_STATUS_CODE,
11398       newfgline.PRICING_STATUS_TEXT new_PRICING_STATUS_TEXT,
11399       newfgline.START_DATE_ACTIVE_FIRST new_START_DATE_ACTIVE_FIRST,
11400       newfgline.ACTIVE_DATE_FIRST_TYPE new_ACTIVE_DATE_FIRST_TYPE,
11401       newfgline.START_DATE_ACTIVE_SECOND new_START_DATE_ACTIVE_SECOND,
11402       newfgline.ACTIVE_DATE_SECOND_TYPE new_ACTIVE_DATE_SECOND_TYPE,
11403       newfgline.GROUP_QUANTITY new_GROUP_QUANTITY,
11404       newfgline.GROUP_AMOUNT new_GROUP_AMOUNT,
11405       newfgline.LINE_AMOUNT new_LINE_AMOUNT,
11406       newfgline.ROUNDING_FLAG new_ROUNDING_FLAG,
11407       newfgline.ROUNDING_FACTOR new_ROUNDING_FACTOR,
11408       newfgline.UPDATED_ADJUSTED_UNIT_PRICE new_upd_ADJUSTED_UNIT_PRICE,
11409       newfgline.PRICE_REQUEST_CODE new_PRICE_REQUEST_CODE,
11410       newfgline.HOLD_CODE new_HOLD_CODE,
11411       newfgline.HOLD_TEXT new_HOLD_TEXT,
11412       newfgline.PRICE_LIST_HEADER_ID new_PRICE_LIST_HEADER_ID,
11413       newfgline.VALIDATED_FLAG new_VALIDATED_FLAG,
11414       newfgline.QUALIFIERS_EXIST_FLAG new_QUALIFIERS_EXIST_FLAG,
11415       newfgline.PRICING_ATTRS_EXIST_FLAG new_PRICING_ATTRS_EXIST_FLAG,
11416       newfgline.PRIMARY_QUALIFIERS_MATCH_FLAG new_PRIMARY_QUAL_MATCH_FLAG,
11417       newfgline.USAGE_PRICING_TYPE new_USAGE_PRICING_TYPE,
11418       newfgline.LINE_CATEGORY new_LINE_CATEGORY,
11419       newfgline.CONTRACT_START_DATE new_CONTRACT_START_DATE,
11420       newfgline.CONTRACT_END_DATE new_CONTRACT_END_DATE,
11421       newfgline.LINE_UNIT_PRICE new_LINE_UNIT_PRICE,
11422       oldfreeline.line_index old_line_index,
11423       oldfreeline.line_id old_line_id,
11424       oldfreeline.line_quantity old_line_quantity,
11425       oldfreeline.line_uom_code old_line_uom_code,
11426       oldfreeline.priced_quantity old_priced_quantity,
11427       oldfreeline.priced_uom_code old_priced_uom_code,
11428       oldfreeitem.value_from old_item,
11429       oldfreeline.UOM_QUANTITY old_UOM_QUANTITY,
11430       oldfreeline.CURRENCY_CODE old_CURRENCY_CODE,
11431       oldfreeline.UNIT_PRICE old_UNIT_PRICE,
11432       oldfreeline.PERCENT_PRICE old_PERCENT_PRICE,
11433       oldfreeline.ADJUSTED_UNIT_PRICE old_ADJUSTED_UNIT_PRICE,
11434       oldfreeline.PARENT_PRICE old_PARENT_PRICE,
11435       oldfreeline.PARENT_QUANTITY old_PARENT_QUANTITY,
11436       oldfreeline.PARENT_UOM_CODE old_PARENT_UOM_CODE,
11437       oldfreeline.PROCESSING_ORDER old_PROCESSING_ORDER,
11438       oldfreeline.PROCESSED_FLAG old_PROCESSED_FLAG,
11439       oldfreeline.PROCESSED_CODE old_PROCESSED_CODE,
11440       oldfreeline.PRICE_FLAG old_PRICE_FLAG,
11441       oldfreeline.PRICING_STATUS_CODE old_PRICING_STATUS_CODE,
11442       oldfreeline.PRICING_STATUS_TEXT old_PRICING_STATUS_TEXT,
11443       oldfreeline.START_DATE_ACTIVE_FIRST old_START_DATE_ACTIVE_FIRST,
11444       oldfreeline.ACTIVE_DATE_FIRST_TYPE old_ACTIVE_DATE_FIRST_TYPE,
11445       oldfreeline.START_DATE_ACTIVE_SECOND old_START_DATE_ACTIVE_SECOND,
11446       oldfreeline.ACTIVE_DATE_SECOND_TYPE old_ACTIVE_DATE_SECOND_TYPE,
11447       oldfreeline.GROUP_QUANTITY old_GROUP_QUANTITY,
11448       oldfreeline.GROUP_AMOUNT old_GROUP_AMOUNT,
11449       oldfreeline.LINE_AMOUNT old_LINE_AMOUNT,
11450       oldfreeline.ROUNDING_FLAG old_ROUNDING_FLAG,
11451       oldfreeline.ROUNDING_FACTOR old_ROUNDING_FACTOR,
11452       oldfreeline.UPDATED_ADJUSTED_UNIT_PRICE
11453       old_upd_ADJUSTED_UNIT_PRICE,
11454       oldfreeline.PRICE_REQUEST_CODE old_PRICE_REQUEST_CODE,
11455       oldfreeline.HOLD_CODE old_HOLD_CODE,
11456       oldfreeline.HOLD_TEXT old_HOLD_TEXT,
11457       oldfreeline.PRICE_LIST_HEADER_ID old_PRICE_LIST_HEADER_ID,
11458       oldfreeline.VALIDATED_FLAG old_VALIDATED_FLAG,
11459       oldfreeline.QUALIFIERS_EXIST_FLAG old_QUALIFIERS_EXIST_FLAG,
11460       oldfreeline.PRICING_ATTRS_EXIST_FLAG old_PRICING_ATTRS_EXIST_FLAG,
11461       oldfreeline.PRIMARY_QUALIFIERS_MATCH_FLAG
11462       old_PRIMARY_QUAL_MATCH_FLAG,
11463       oldfreeline.USAGE_PRICING_TYPE old_USAGE_PRICING_TYPE,
11464       oldfreeline.LINE_CATEGORY old_LINE_CATEGORY,
11465       oldfreeline.CONTRACT_START_DATE old_CONTRACT_START_DATE,
11466       oldfreeline.CONTRACT_END_DATE old_CONTRACT_END_DATE,
11467       oldfreeline.LINE_UNIT_PRICE old_LINE_UNIT_PRICE,
11468       oldfreeline.process_status old_list_line_id,
11469       newfgdis.created_from_list_line_id newfgdis_list_line_id,
11470       newfgdis.operand_value || newfgdis.operand_calculation_code newfgdis_operand
11471     FROM qp_npreq_lines_tmp oldfreeline
11472       , qp_npreq_rltd_lines_tmp newrltd
11473       , qp_npreq_ldets_tmp newfgdis
11474       , qp_npreq_lines_tmp newfgline
11475       , qp_npreq_line_attrs_tmp newfgitem
11476       , qp_npreq_line_attrs_tmp oldfreeitem
11477     --WHERE G_REQUEST_TYPE_CODE <> 'ONT'
11478     --bug 3085453 handle pricing availability UI
11479     -- they pass reqtype ONT and insert adj into ldets
11480     WHERE QP_PREQ_PUB.G_CHECK_CUST_VIEW_FLAG <> G_YES
11481     AND instr(oldfreeline.process_status, G_FREEGOOD) > 0
11482     AND newfgdis.pricing_status_code = G_STATUS_NEW
11483     AND newfgdis.applied_flag = G_YES
11484     AND instr(oldfreeline.process_status, G_FREEGOOD || newfgdis.created_from_list_line_id || G_BUYLINE) > 0
11485     AND newrltd.pricing_status_code = G_STATUS_NEW
11486     AND newrltd.related_line_index = newfgdis.line_index -- 2970380
11487     AND newrltd.related_line_detail_index = newfgdis.line_detail_index -- 2970380
11488     AND instr(oldfreeline.process_status
11489               , G_BUYLINE || newrltd.line_index || G_PROMO_GOODS_DISCOUNT) > 0
11490     AND newfgline.line_index = newfgdis.line_index
11491     AND newfgline.line_index = newrltd.related_line_index -- 2970380
11492     AND newfgitem.line_detail_index = newfgdis.line_detail_index
11493     AND newfgitem.context = G_ITEM_CONTEXT
11494     AND newfgitem.attribute = G_PRIC_ATTRIBUTE1
11495     AND oldfreeitem.line_index = oldfreeline.line_index
11496     AND oldfreeitem.line_detail_index IS NULL
11497     AND oldfreeitem.context = G_ITEM_CONTEXT
11498     AND oldfreeitem.attribute = G_PRIC_ATTRIBUTE1;
11499 
11500   CURSOR l_updated_prg_fg_cur IS
11501     SELECT /*+ INDEX(prg OE_PRICE_ADJUSTMENTS_N2) */ rltd.related_line_index
11502     FROM qp_npreq_lines_tmp buyline, oe_price_adjustments prg,
11503       qp_npreq_ldets_tmp ldet, qp_npreq_rltd_lines_tmp rltd
11504     --WHERE G_REQUEST_TYPE_CODE = 'ONT'
11505     --bug 3085453 handle pricing availability UI
11506     -- they pass reqtype ONT and insert adj into ldets
11507     WHERE QP_PREQ_PUB.G_CHECK_CUST_VIEW_FLAG = G_YES
11508     AND buyline.line_type_code = G_LINE_LEVEL
11509     AND prg.line_id = buyline.line_id
11510     AND prg.list_line_type_code = G_PROMO_GOODS_DISCOUNT
11511     AND prg.updated_flag = G_YES
11512     AND ldet.line_index = buyline.line_index
11513     AND ldet.pricing_status_code = G_STATUS_NEW
11514     AND ldet.created_from_list_line_id = prg.list_line_id
11515     AND ldet.applied_flag = G_YES
11516     AND rltd.line_index = ldet.line_index
11517     AND rltd.line_detail_index = ldet.line_detail_index
11518     AND rltd.pricing_status_code = G_STATUS_NEW
11519     UNION
11520     SELECT /*+ INDEX(prg OE_PRICE_ADJUSTMENTS_N1) */ rltd.related_line_index
11521     FROM qp_npreq_lines_tmp buyline, oe_price_adjustments prg,
11522       qp_npreq_ldets_tmp ldet, qp_npreq_rltd_lines_tmp rltd
11523     --WHERE G_REQUEST_TYPE_CODE = 'ONT'
11524     --bug 3085453 handle pricing availability UI
11525     -- they pass reqtype ONT and insert adj into ldets
11526     WHERE QP_PREQ_PUB.G_CHECK_CUST_VIEW_FLAG = G_YES
11527     AND buyline.line_type_code = G_ORDER_LEVEL
11528     AND prg.line_id IS NULL
11529     AND prg.header_id = buyline.line_id
11530     AND prg.list_line_type_code = G_PROMO_GOODS_DISCOUNT
11531     AND prg.updated_flag = G_YES
11532     AND ldet.line_index = buyline.line_index
11533     AND ldet.pricing_status_code = G_STATUS_NEW
11534     AND ldet.created_from_list_line_id = prg.list_line_id
11535     AND ldet.applied_flag = G_YES
11536     AND rltd.line_index = ldet.line_index
11537     AND rltd.line_detail_index = ldet.line_detail_index
11538     AND rltd.pricing_status_code = G_STATUS_NEW
11539     UNION
11540     -- hint added for 5575718
11541     SELECT /*+ ORDERED */ rltd.related_line_index
11542     FROM qp_npreq_lines_tmp buyline, qp_npreq_ldets_tmp prg,
11543       qp_npreq_ldets_tmp ldet, qp_npreq_rltd_lines_tmp rltd
11544     --WHERE G_REQUEST_TYPE_CODE <> 'ONT'
11545     --bug 3085453 handle pricing availability UI
11546     -- they pass reqtype ONT and insert adj into ldets
11547     WHERE QP_PREQ_PUB.G_CHECK_CUST_VIEW_FLAG <> G_YES
11548     AND prg.line_index = buyline.line_index
11549     AND prg.pricing_status_code = G_STATUS_UNCHANGED
11550     AND prg.created_from_list_line_type = G_PROMO_GOODS_DISCOUNT
11551     AND prg.updated_flag = G_YES
11552     AND ldet.line_index = buyline.line_index
11553     AND ldet.pricing_status_code = G_STATUS_NEW
11554     AND ldet.created_from_list_line_id = prg.created_from_list_line_id
11555     AND ldet.applied_flag = G_YES
11556     AND rltd.line_index = ldet.line_index
11557     AND rltd.line_detail_index = ldet.line_detail_index
11558     AND rltd.pricing_status_code = G_STATUS_NEW;
11559 
11560   l_prg_line_ind_tbl QP_PREQ_GRP.NUMBER_TYPE;
11561   l_prg_process_sts_tbl QP_PREQ_GRP.VARCHAR_TYPE;
11562   l_prg_line_id_tbl QP_PREQ_GRP.NUMBER_TYPE;
11563   l_prg_price_flag_tbl QP_PREQ_GRP.VARCHAR_TYPE; -- Ravi
11564 
11565   l_upd_engine_fg_index QP_PREQ_GRP.NUMBER_TYPE;
11566 
11567   l_Process_PRG VARCHAR2(1) := G_NO;
11568   l_routine VARCHAR2(100) := 'QP_PREQ_PUB.Process_PRG ';
11569   l_oldfgdis_list_line_id VARCHAR2(2000);
11570   l_old_operand VARCHAR2(240);
11571 
11572   i PLS_INTEGER;
11573   BEGIN
11574     l_debug := QP_PREQ_GRP.G_DEBUG_ENGINE;
11575     IF l_debug = FND_API.G_TRUE THEN
11576       QP_PREQ_GRP.engine_debug('Begin process_prg');
11577       QP_PREQ_GRP.engine_debug('Process_prg req_type '|| G_REQUEST_TYPE_CODE);
11578 
11579     END IF;
11580     --initialize pl/sql tables
11581     l_prg_line_ind_tbl.DELETE;
11582     l_prg_process_sts_tbl.DELETE;
11583     l_prg_line_id_tbl.DELETE;
11584     l_prg_price_flag_tbl.DELETE;
11585 
11586     --initialize global pl/sql tables
11587     G_prg_unch_calc_price_tbl.DELETE;
11588     G_prg_unch_line_id_tbl.DELETE;
11589     G_prg_unch_line_ind_tbl.DELETE;
11590     G_prg_unch_new_index_tbl.DELETE;
11591     G_prg_unch_line_index_tbl.DELETE;
11592     G_prg_unch_process_sts_tbl.DELETE;
11593 
11594     BEGIN
11595       SELECT 'Y' INTO l_Process_PRG
11596       FROM qp_npreq_ldets_tmp
11597       WHERE created_from_list_line_type = G_PROMO_GOODS_DISCOUNT
11598       AND pricing_status_code = G_STATUS_NEW
11599       AND applied_flag = 'Y'
11600       AND ROWNUM = 1;
11601     EXCEPTION
11602       WHEN NO_DATA_FOUND THEN
11603         IF l_debug = FND_API.G_TRUE THEN
11604           QP_PREQ_GRP.engine_debug('No PRG: ');
11605         END IF;
11606         l_Process_PRG := G_NO;
11607       WHEN OTHERS THEN
11608         IF l_debug = FND_API.G_TRUE THEN
11609           QP_PREQ_GRP.engine_debug('Error in PRG: '|| SQLERRM);
11610         END IF;
11611         --x_return_status := FND_API.G_RET_STS_ERROR;
11612         --x_return_status_text := l_routine||SQLERRM;
11613         RAISE PRG_Exception;
11614     END;
11615 
11616     IF l_debug = FND_API.G_TRUE THEN
11617       QP_PREQ_GRP.engine_debug('Value of process_PRG '|| l_Process_PRG);
11618 
11619 
11620     END IF;
11621     IF l_Process_PRG = G_NO
11622       THEN
11623       BEGIN
11624         SELECT 'Y' INTO l_Process_PRG
11625         FROM qp_npreq_lines_tmp line
11626         WHERE line.pricing_status_code IN (G_STATUS_UNCHANGED,
11627                                            G_STATUS_UPDATED, G_STATUS_NEW, G_STATUS_GSA_VIOLATION, G_STATUS_INVALID_PRICE_LIST)
11628         AND instr(line.process_status, G_FREEGOOD) > 0
11629         AND ROWNUM = 1;
11630 
11631         IF l_debug = FND_API.G_TRUE THEN
11632           QP_PREQ_GRP.engine_debug('Value of process_PRG after fg '|| l_Process_PRG);
11633         END IF; --l_debug
11634 
11635         IF l_Process_PRG = G_NO THEN
11636           SELECT 'Y' INTO l_Process_PRG
11637           FROM qp_npreq_lines_tmp line
11638           WHERE line.pricing_status_code IN (G_STATUS_UNCHANGED,
11639                                              G_STATUS_UPDATED, G_STATUS_NEW, G_STATUS_GSA_VIOLATION)
11640           AND EXISTS
11641           (SELECT 'Y' FROM oe_price_adjustments adj
11642            WHERE line.line_type_code = G_LINE_LEVEL
11643            AND adj.line_id = line.line_id
11644            AND adj.list_line_type_code = G_PROMO_GOODS_DISCOUNT
11645            AND adj.updated_flag = G_YES
11646            UNION
11647            SELECT 'Y' FROM oe_price_adjustments adj
11648            WHERE line.line_type_code = G_ORDER_LEVEL
11649            AND adj.header_id = line.line_id
11650            AND adj.line_id IS NULL
11651            AND adj.list_line_type_code = G_PROMO_GOODS_DISCOUNT
11652            AND adj.updated_flag = G_YES
11653            UNION
11654            SELECT 'Y' FROM qp_npreq_ldets_tmp adj
11655            WHERE adj.created_from_list_line_type = G_PROMO_GOODS_DISCOUNT
11656            AND adj.pricing_status_code = G_STATUS_UNCHANGED
11657            AND adj.updated_flag = G_YES);
11658         END IF; --l_PROCESS_PRG
11659         IF l_debug = FND_API.G_TRUE THEN
11660           QP_PREQ_GRP.engine_debug('Value of process_PRG after over '|| l_Process_PRG);
11661         END IF; --Bug No - 4033618
11662       EXCEPTION
11663         WHEN NO_DATA_FOUND THEN
11664           l_Process_PRG := G_NO;
11665           IF l_debug = FND_API.G_TRUE THEN
11666             QP_PREQ_GRP.engine_debug('No PRG in oe_price_adj');
11667           END IF;
11668         WHEN OTHERS THEN
11669           l_Process_PRG := G_NO;
11670           IF l_debug = FND_API.G_TRUE THEN
11671             QP_PREQ_GRP.engine_debug('Exception in prg '|| SQLERRM);
11672           END IF;
11673       END;
11674     END IF; --l_Process_PRG
11675 
11676     IF l_debug = FND_API.G_TRUE THEN
11677       QP_PREQ_GRP.engine_debug('Value of process_PRG after query '|| l_Process_PRG);
11678 
11679     END IF;
11680 
11681     IF l_debug = FND_API.G_TRUE THEN
11682       FOR cl IN
11683         (SELECT adj.list_line_id, adj.updated_flag, line.line_index,
11684          adj.pricing_phase_id, adj.price_adjustment_id, adj.line_id
11685          FROM qp_npreq_lines_tmp line, oe_price_adjustments adj
11686          WHERE line.line_type_code = G_LINE_LEVEL
11687          AND adj.line_id = line.line_id
11688          AND adj.list_line_type_code = G_PROMO_GOODS_DISCOUNT
11689          UNION
11690          SELECT adj.list_line_id, adj.updated_flag, line.line_index,
11691          adj.pricing_phase_id, adj.price_adjustment_id, adj.line_id
11692          FROM qp_npreq_lines_tmp line, oe_price_adjustments adj
11693          WHERE line.line_type_code = G_ORDER_LEVEL
11694          AND adj.header_id = line.line_id
11695          AND adj.line_id IS NULL
11696          AND adj.list_line_type_code = G_PROMO_GOODS_DISCOUNT)
11697         LOOP
11698         QP_PREQ_GRP.engine_debug('PRGs check whether update_flag: '
11699                                  ||'prg listlineid '|| cl.list_line_id ||' updatedflag '|| cl.updated_flag
11700                                  ||' buylineid '|| cl.line_id ||' prgphaseid '|| cl.pricing_phase_id);
11701         FOR fg IN
11702           (SELECT rltd.related_line_index, ldet.created_from_list_line_id
11703            FROM qp_npreq_ldets_tmp ldet, qp_npreq_rltd_lines_tmp rltd
11704            WHERE ldet.line_index = cl.line_index
11705            AND ldet.pricing_status_code = G_STATUS_NEW
11706            AND ldet.applied_flag = G_YES
11707            AND ldet.created_from_list_line_id = cl.list_line_id
11708            AND rltd.line_index = ldet.line_index
11709            AND rltd.line_detail_index = ldet.line_detail_index)
11710           LOOP
11711           QP_PREQ_GRP.engine_debug('PRGs check whether engine_prg: '
11712                                    ||'engine prg listlineid '|| fg.created_from_list_line_id
11713                                    ||' fg line_index '|| fg.related_line_index);
11714         END LOOP; --fgline
11715       END LOOP; --cl
11716 
11717     END IF; --l_debug
11718 
11719 
11720     --need to mark the freegood lines if the PRG has been overridden
11721     --this means that one or more freegood lines have been deleted by the
11722     --calling application in which case all the adjustments and relationships
11723     --on the deleted freegood line have been deleted and the PRG adjustment
11724     --is marked with updated_flag = 'Y'
11725     --if there are such PRG adjustments overridden, then the freegood lines
11726     --created by the pricing engine need to be ignored and marked as
11727     --process_status = G_NOT_VALID and the freegood lines not deleted
11728     --need to be marked as process_status = G_STATUS_UNCHANGED. If there
11729     --are any changes to the setup, say the quantity on the remaining freegood
11730     --line has been increased, that will not apply to the freegood line that
11731     --has not been deleted as the PRG has been overridden
11732     --pricing_status_code needs to be set to G_NOT_VALID so that this does not get into OM's
11733     --update statement to update lines with UPDATE status
11734 
11735     IF l_debug = FND_API.G_TRUE THEN
11736       QP_PREQ_GRP.engine_debug('Updated PRGs No. of passed-in fg lines updated '
11737                                || SQL%ROWCOUNT);
11738     END IF; --l_debug
11739 
11740     OPEN l_updated_prg_fg_cur;
11741     l_upd_engine_fg_index.DELETE;
11742     FETCH l_updated_prg_fg_cur
11743     BULK COLLECT INTO
11744     l_upd_engine_fg_index; --, l_upd_passedin_fg_index;
11745     CLOSE l_updated_prg_fg_cur;
11746 
11747     IF l_debug = FND_API.G_TRUE THEN
11748       --  QP_PREQ_GRP.engine_debug('Count. of passed-in fg lines '
11749       --  ||l_upd_passedin_fg_index.count);
11750       QP_PREQ_GRP.engine_debug('Count. of engine-created fg lines '
11751                                || l_upd_engine_fg_index.COUNT);
11752     END IF;
11753 
11754 
11755     IF l_upd_engine_fg_index.COUNT > 0 THEN
11756       --update the engine inserted fg line to G_NOT_VALID
11757       FORALL i IN l_upd_engine_fg_index.FIRST..l_upd_engine_fg_index.LAST
11758       UPDATE qp_npreq_lines_tmp SET
11759         pricing_status_code = G_NOT_VALID, process_status = G_NOT_VALID
11760       WHERE line_index = l_upd_engine_fg_index(i);
11761     END IF; --l_upd_engine_fg_index
11762 
11763     --the following update will mark the overridden PRG's passed in
11764     --freegood lines as process_status = G_STATUS_UNCHANGED
11765     UPDATE qp_npreq_lines_tmp oldfg SET process_status = G_STATUS_UNCHANGED
11766   --fix for bug 2691794
11767                       , processed_flag = G_FREEGOOD_LINE
11768     WHERE oldfg.pricing_status_code IN (G_STATUS_UPDATED, G_STATUS_UNCHANGED)
11769     AND instr(oldfg.process_status, G_PROMO_GOODS_DISCOUNT || G_YES || G_STATUS_UPDATED) > 0;
11770 
11771     IF l_Process_PRG = G_YES
11772       THEN
11773       --only if there are prg based modifiers
11774       IF QP_PREQ_GRP.G_DEBUG_ENGINE = FND_API.G_TRUE
11775         AND l_debug = FND_API.G_TRUE
11776         THEN
11777         FOR cl IN (SELECT newprg.line_index line_ind
11778                    , newprg.created_from_list_line_id
11779                    FROM qp_npreq_lines_tmp oldfgline
11780                    , qp_npreq_ldets_tmp newprg
11781                    WHERE --ldet.line_index = oldfgline.line_index
11782                    instr(oldfgline.process_status
11783                          , G_BUYLINE || newprg.line_index || G_PROMO_GOODS_DISCOUNT) > 0
11784                    AND newprg.applied_flag = G_YES
11785                    AND newprg.pricing_status_code = G_STATUS_NEW
11786                    AND instr(oldfgline.process_status
11787                              , G_PROMO_GOODS_DISCOUNT || newprg.created_from_list_line_id || G_PROMO_GOODS_DISCOUNT) > 0)
11788           LOOP
11789           IF l_debug = FND_API.G_TRUE THEN
11790             QP_PREQ_GRP.engine_debug('prg fgline: ind '|| cl.line_ind
11791                                      ||' prg '|| cl.created_from_list_line_id);
11792           END IF;
11793         END LOOP; --for cl
11794       END IF; --QP_PREQ_GRP.G_DEBUG_ENGINE
11795 
11796       --the following update will update the process_status on freegood lines
11797       --identified from the previous identify_freegood_lines procedure
11798       --to G_STATUS_DELETED if the pricing engine has not created matching
11799       --PRG modifiers against its buy line
11800       UPDATE qp_npreq_lines_tmp oldfgline
11801       SET oldfgline.process_status = G_STATUS_DELETED
11802       WHERE NOT EXISTS (SELECT newprg.line_index
11803                         FROM qp_npreq_ldets_tmp newprg
11804                         --, qp_npreq_line_attrs_tmp newfgitem <-- commented out, sql repos
11805                         WHERE --G_REQUEST_TYPE_CODE = 'ONT'
11806                         newprg.pricing_status_code = G_STATUS_NEW
11807                         AND newprg.applied_flag = G_YES
11808                         AND instr(oldfgline.process_status
11809                                   , G_BUYLINE || newprg.line_index || G_PROMO_GOODS_DISCOUNT) > 0
11810                         AND newprg.created_from_list_line_type = G_PROMO_GOODS_DISCOUNT
11811                         AND instr(oldfgline.process_status
11812                                   , G_PROMO_GOODS_DISCOUNT || newprg.created_from_list_line_id || G_PROMO_GOODS_DISCOUNT) > 0)
11813         AND instr(oldfgline.process_status, G_FREEGOOD) > 0;
11814 
11815       IF l_debug = FND_API.G_TRUE THEN
11816         QP_PREQ_GRP.engine_debug('updated delete prg lines rowcnt: '|| SQL%ROWCOUNT);
11817 
11818       END IF;
11819       FOR freegood IN l_compare_freegood_cur
11820         LOOP
11821         IF l_debug = FND_API.G_TRUE THEN
11822           QP_PREQ_GRP.engine_debug('In compare_cur '
11823                                    ||'     new_priced_qty '|| freegood.new_priced_quantity
11824                                    ||' old_priced_qty '|| freegood.old_priced_quantity
11825                                    ||' new_priced_uom '|| freegood.new_priced_uom_code
11826                                    ||' old_priced_uom '|| freegood.old_priced_uom_code
11827                                    ||' new_item '|| freegood.new_item ||' old_item '|| freegood.old_item
11828                                    ||' new_currency '|| freegood.new_CURRENCY_CODE
11829                                    ||' old_currency '|| freegood.old_CURRENCY_CODE
11830                                    ||' new_unit_price '|| freegood.new_unit_price
11831                                    ||' old_unit_price '|| freegood.old_unit_price
11832                                    ||' new_adj_price '|| freegood.new_ADJUSTED_UNIT_PRICE
11833                                    ||' old_adj_unit_price '|| freegood.old_ADJUSTED_UNIT_PRICE
11834                                    ||' new_pricelist_id '|| freegood.new_PRICE_LIST_HEADER_ID
11835                                    ||' old_pricelist_id '|| freegood.old_PRICE_LIST_HEADER_ID
11836                                    ||' new_rounding_fac '|| freegood.new_rounding_factor
11837                                    ||' old_rounding_fac '|| freegood.old_rounding_factor
11838                                    ||' old_price_flag '|| freegood.old_price_flag
11839                                    ||' new_price_flag '|| freegood.new_price_flag
11840                                    ||' old_line_index '|| freegood.old_line_index
11841                                    ||' new_line_index '|| freegood.new_line_index
11842                                    ||' old_line_id '|| freegood.old_line_id
11843                                    ||' old_process_status '|| freegood.old_list_line_id
11844                                    ||' newfgdis_list_line_id '|| freegood.newfgdis_list_line_id
11845                                    ||' newoperand '|| freegood.newfgdis_operand);
11846         END IF;
11847 
11848         --this is to get the old_list_line_id for bug 2970384
11849         l_oldfgdis_list_line_id := REPLACE(substr(freegood.old_list_line_id, 1,
11850                                                   -- need to subtract 1 from instr o/p to exclude the
11851                                                   --position of 'B' from the string 'BUYLINE'
11852                                                   instr(freegood.old_list_line_id, G_BUYLINE) - 1),
11853                                            G_FREEGOOD, '');
11854         l_old_operand := REPLACE(substr(freegood.old_list_line_id,
11855                                         instr(freegood.old_list_line_id, G_STATUS_UPDATED) + 7),
11856                                  G_PROMO_GOODS_DISCOUNT, '');
11857 
11858         IF l_debug = FND_API.G_TRUE THEN
11859           QP_PREQ_GRP.engine_debug(' The old_fg_list_line_id is '
11860                                    || l_oldfgdis_list_line_id
11861                                    ||' the old_operand is '|| l_old_operand);
11862         END IF; --l_debug
11863 
11864 
11865         IF ((nvl(freegood.new_priced_quantity, freegood.new_line_quantity) =
11866              nvl(freegood.old_priced_quantity, freegood.old_line_quantity))
11867             AND (nvl(freegood.new_priced_uom_code, freegood.new_line_uom_code) =
11868                  nvl(freegood.old_priced_uom_code, freegood.old_line_uom_code))
11869             AND (nvl(freegood.new_item, 'NULL') =
11870                  nvl(freegood.old_item, 'NULL'))
11871             AND (nvl(freegood.new_CURRENCY_CODE, 'NULL') =
11872                  nvl(freegood.old_CURRENCY_CODE, 'NULL'))
11873             AND (nvl(freegood.new_unit_price, 0) =
11874                  nvl(freegood.old_unit_price, 0)))
11875           --and (nvl(freegood.new_ADJUSTED_UNIT_PRICE, 0) =
11876           --nvl(freegood.old_ADJUSTED_UNIT_PRICE, 0))
11877           --and (nvl(freegood.new_PRICING_STATUS_CODE, 'NULL') =
11878           --nvl(freegood.old_PRICING_STATUS_CODE, 'NULL'))
11879           --and (nvl(freegood.new_START_DATE_ACTIVE_FIRST, sysdate) =
11880           --nvl(freegood.old_START_DATE_ACTIVE_FIRST, sysdate))
11881           --and (nvl(freegood.new_ACTIVE_DATE_FIRST_TYPE, 'NULL') =
11882           --nvl(freegood.old_ACTIVE_DATE_FIRST_TYPE, 'NULL'))
11883           --and (nvl(freegood.new_START_DATE_ACTIVE_SECOND, sysdate) =
11884           --nvl(freegood.old_START_DATE_ACTIVE_SECOND, sysdate))
11885           --and (nvl(freegood.new_ACTIVE_DATE_SECOND_TYPE, 'NULL') =
11886           --nvl(freegood.old_ACTIVE_DATE_SECOND_TYPE, 'NULL'))
11887           AND (nvl(freegood.new_PRICE_LIST_HEADER_ID,  - 1) =
11888                nvl(freegood.old_PRICE_LIST_HEADER_ID,  - 1))
11889           --and (nvl(freegood.new_list_line_id, -1) =
11890           --nvl(freegood.old_list_line_id, -1))
11891           --and (nvl(freegood.new_rounding_factor, 0) =
11892           --nvl(freegood.old_rounding_factor, 0)))
11893           --and (nvl(freegood.new_rounding_flag, 'NULL') =
11894           --nvl(freegood.old_rounding_flag, 'NULL')))
11895           --for bug 2970384 to compare if it the fglist_line_id is the same
11896           --and if the operand has not changed in the setup
11897           AND (nvl(l_oldfgdis_list_line_id, 0) =
11898                nvl(freegood.newfgdis_list_line_id, 0))
11899           AND (nvl(l_old_operand, 0) = nvl(freegood.newfgdis_operand, 0))
11900           THEN
11901           IF l_debug = FND_API.G_TRUE THEN
11902             QP_PREQ_GRP.engine_debug('In PRG if data unchanged ');
11903           END IF;
11904           G_prg_unch_line_index_tbl(G_prg_unch_line_index_tbl.COUNT + 1) :=
11905           freegood.old_line_index;
11906           --fix for bug 2931437 this may not get populated if calculation does
11907           --not take place and raise a no_data_found populating the old
11908           --selling price just in case
11909           G_prg_unch_calc_price_tbl(G_prg_unch_line_index_tbl.COUNT) :=
11910           freegood.old_adjusted_unit_price;
11911           G_prg_unch_new_index_tbl(G_prg_unch_line_index_tbl.COUNT) :=
11912           freegood.new_line_index;
11913           --      G_prg_unch_adj_price_tbl(G_prg_unch_line_index_tbl.COUNT) :=
11914           --                freegood.old_ADJUSTED_UNIT_PRICE;
11915           G_prg_unch_line_id_tbl(G_prg_unch_line_index_tbl.COUNT) :=
11916           freegood.old_line_id;
11917           --this will be used in calculation
11918           G_prg_unch_line_ind_tbl(freegood.old_line_index) :=
11919           G_prg_unch_line_index_tbl.COUNT;
11920 
11921           IF l_debug = FND_API.G_TRUE THEN
11922             QP_PREQ_GRP.engine_debug('if data unchanged: oldfg_lineindex '
11923                                      || G_prg_unch_line_index_tbl(G_prg_unch_line_index_tbl.COUNT) ||' selprice '
11924                                      || G_prg_unch_calc_price_tbl(G_prg_unch_line_index_tbl.COUNT));
11925           END IF; --l_debug
11926 
11927           l_prg_line_ind_tbl(l_prg_line_ind_tbl.COUNT + 1) :=
11928           freegood.old_line_index;
11929           l_prg_process_sts_tbl(l_prg_line_ind_tbl.COUNT) := G_STATUS_UNCHANGED;
11930           --                'OLD'||G_STATUS_UNCHANGED;
11931           l_prg_line_id_tbl(l_prg_line_ind_tbl.COUNT) := freegood.old_line_id;
11932           l_prg_price_flag_tbl(l_prg_line_ind_tbl.COUNT) := freegood.old_price_flag; -- Ravi
11933           l_prg_line_ind_tbl(l_prg_line_ind_tbl.COUNT + 1) := freegood.new_line_index;
11934           l_prg_process_sts_tbl(l_prg_line_ind_tbl.COUNT) := G_NOT_VALID;
11935           --                'NEW'||G_STATUS_UNCHANGED;
11936           l_prg_line_id_tbl(l_prg_line_ind_tbl.COUNT) := freegood.old_line_id;
11937           l_prg_price_flag_tbl(l_prg_line_ind_tbl.COUNT) := freegood.old_price_flag; -- Ravi
11938         ELSE --freegood cur
11939           IF l_debug = FND_API.G_TRUE THEN
11940             QP_PREQ_GRP.engine_debug('In PRG if data updated ');
11941           END IF;
11942           l_prg_line_ind_tbl(l_prg_line_ind_tbl.COUNT + 1) := freegood.old_line_index;
11943           l_prg_process_sts_tbl(l_prg_line_ind_tbl.COUNT) := G_NOT_VALID;
11944           l_prg_line_id_tbl(l_prg_line_ind_tbl.COUNT) := freegood.old_line_id;
11945           l_prg_price_flag_tbl(l_prg_line_ind_tbl.COUNT) := freegood.old_price_flag; -- Ravi
11946           l_prg_line_ind_tbl(l_prg_line_ind_tbl.COUNT + 1) := freegood.new_line_index;
11947           l_prg_process_sts_tbl(l_prg_line_ind_tbl.COUNT) := G_STATUS_UPDATED;
11948           l_prg_line_id_tbl(l_prg_line_ind_tbl.COUNT) := freegood.old_line_id;
11949           l_prg_price_flag_tbl(l_prg_line_ind_tbl.COUNT) := freegood.old_price_flag; -- Ravi
11950         END IF; --freegood cur
11951       END LOOP; --freegood
11952 
11953       IF l_prg_line_ind_tbl.COUNT > 0
11954         THEN
11955         IF l_debug = FND_API.G_TRUE THEN
11956           QP_PREQ_GRP.engine_debug('prg details Here #1000');
11957         END IF; -- Bug No 4033618
11958         IF QP_PREQ_GRP.G_DEBUG_ENGINE = FND_API.G_TRUE
11959           THEN
11960           FOR i IN l_prg_line_ind_tbl.FIRST..l_prg_line_ind_tbl.LAST
11961             LOOP
11962             IF l_debug = FND_API.G_TRUE THEN
11963               QP_PREQ_GRP.engine_debug('prg details: line_index '
11964                                        || l_prg_line_ind_tbl(i) ||' process_status '
11965                                        || l_prg_process_sts_tbl(i) ||' line_id '|| l_prg_line_id_tbl(i)
11966                                        || 'price flag ' || l_prg_price_flag_tbl(i));
11967             END IF;
11968           END LOOP; --l_prg_line_ind_tbl
11969         END IF; --QP_PREQ_GRP.G_DEBUG_ENGINE
11970 
11971         IF l_debug = FND_API.G_TRUE THEN
11972           QP_PREQ_GRP.engine_debug('passed in frg update '|| l_prg_line_ind_tbl.COUNT);
11973 
11974         END IF;
11975         FORALL i IN l_prg_line_ind_tbl.FIRST..l_prg_line_ind_tbl.LAST
11976         UPDATE qp_npreq_lines_tmp line SET
11977           line.process_status = l_prg_process_sts_tbl(i)
11978   --pricing_status_code needs to be set to G_NOT_VALID so that
11979   --this does not get into OM's
11980   --update statement to update lines with UPDATE status
11981           , line.pricing_status_code = decode(l_prg_process_sts_tbl(i), G_NOT_VALID
11982                                               , l_prg_process_sts_tbl(i), line.pricing_status_code)
11983   --fix for bug 2691794
11984           , line.processed_flag = G_FREEGOOD_LINE
11985           , line.line_id = l_prg_line_id_tbl(i)
11986           , line.price_flag = l_prg_price_flag_tbl(i) -- Ravi
11987         WHERE line.line_index = l_prg_line_ind_tbl(i);
11988       END IF; --l_prg_line_ind_tbl.COUNT
11989 
11990       IF l_debug = FND_API.G_TRUE THEN
11991         QP_PREQ_GRP.engine_debug('End process_prg');
11992       END IF;
11993     END IF; --l_process_prg
11994 
11995     --bug 2970368
11996     --IF G_REQUEST_TYPE_CODE <> 'ONT' THEN
11997     --bug 3085453 handle pricing availability UI
11998     -- they pass reqtype ONT and insert adj into ldets
11999 
12000     -- Bug 3348208
12001     -- the following if condition for check_cust_view_flag is commented out so that
12002     -- update_prg_pricing_status is always run.  Previously, it was introduced only
12003     -- for ASO, not OM, but we discovered it needs to go for OM as well.
12004     --IF QP_PREQ_PUB.G_CHECK_CUST_VIEW_FLAG <> G_YES THEN
12005     update_prg_pricing_status(x_return_status, x_return_status_text);
12006 
12007     x_return_status := FND_API.G_RET_STS_SUCCESS;
12008     x_return_status_text := NULL;
12009   EXCEPTION
12010     WHEN PRG_Exception THEN
12011       x_return_status := FND_API.G_RET_STS_ERROR;
12012       x_return_status_text := 'Exception in '|| l_routine ||' '|| SQLERRM;
12013       IF l_debug = FND_API.G_TRUE THEN
12014         QP_PREQ_GRP.engine_debug('Exception in '|| l_routine ||' '|| SQLERRM);
12015       END IF;
12016     WHEN OTHERS THEN
12017       x_return_status := FND_API.G_RET_STS_ERROR;
12018       x_return_status_text := 'Exception in '|| l_routine ||' '|| SQLERRM;
12019       IF l_debug = FND_API.G_TRUE THEN
12020         QP_PREQ_GRP.engine_debug('Exception in '|| l_routine ||' '|| SQLERRM);
12021       END IF;
12022   END Process_PRG;
12023 
12024   --This procedure compares the selling price of the old and new
12025   --unchanged freegood lines that resulted from the previous procedure
12026   --If the selling price changed, then it marks the newly created line
12027   --as UPDATED, else the passed in freegood line is marked as unchanged
12028   PROCEDURE Update_PRG_Process_status(x_return_status OUT NOCOPY VARCHAR2,
12029                                       x_return_status_text OUT NOCOPY VARCHAR2) IS
12030   l_routine VARCHAR2(100) := 'QP_PREQ_PUB.Update_PRG_Process_status ';
12031 
12032   BEGIN
12033     l_debug := QP_PREQ_GRP.G_DEBUG_ENGINE;
12034     IF l_debug = FND_API.G_TRUE THEN
12035       QP_PREQ_GRP.engine_debug('Begin Update_PRG_Process_status');
12036 
12037     END IF;
12038     IF G_prg_unch_line_index_tbl.COUNT > 0
12039       THEN
12040       IF l_debug = FND_API.G_TRUE THEN
12041         QP_PREQ_GRP.engine_debug('unchanged prg update '
12042                                  || G_prg_unch_line_index_tbl.COUNT);
12043 
12044       END IF;
12045       IF QP_PREQ_GRP.G_DEBUG_ENGINE = FND_API.G_TRUE
12046         THEN
12047         FOR j IN G_prg_unch_line_index_tbl.FIRST..G_prg_unch_line_index_tbl.LAST
12048           LOOP
12049           IF l_debug = FND_API.G_TRUE THEN
12050             QP_PREQ_GRP.engine_debug('Unchanged details unch line_index '
12051                                      || G_prg_unch_line_index_tbl(j) ||' new line_index '
12052                                      || G_prg_unch_new_index_tbl(j) ||' adj_unit_price '
12053                                      || G_prg_unch_calc_price_tbl(j));
12054           END IF;
12055         END LOOP; --G_prg_unch_line_index_tbl
12056       END IF; --QP_PREQ_GRP.G_DEBUG_ENGINE
12057 
12058       FORALL i IN G_prg_unch_line_index_tbl.FIRST..G_prg_unch_line_index_tbl.LAST
12059       UPDATE qp_npreq_lines_tmp line SET line.process_status =
12060           --fix for bug 2831270
12061         decode(line.adjusted_unit_price, G_prg_unch_calc_price_tbl(i),
12062                G_NOT_VALID, G_STATUS_UPDATED)
12063   --Calling application looks at pricing_status_code this also needs to be updated
12064   --pricing_status_code needs to be set to G_NOT_VALID
12065   --so that this does not get into OM's
12066   --update statement to update lines with UPDATE status
12067         , line.pricing_status_code = decode(line.adjusted_unit_price,
12068                                             G_prg_unch_calc_price_tbl(i), G_NOT_VALID, line.pricing_status_code)
12069         , line.line_id = G_prg_unch_line_id_tbl(i)
12070       WHERE line.line_index = G_prg_unch_new_index_tbl(i)
12071       RETURNING line.process_status BULK COLLECT INTO G_prg_unch_process_sts_tbl;
12072 
12073       FORALL i IN G_prg_unch_line_index_tbl.FIRST..G_prg_unch_line_index_tbl.LAST
12074       UPDATE qp_npreq_lines_tmp line SET line.process_status =
12075         decode(G_prg_unch_process_sts_tbl(i), G_NOT_VALID
12076                , G_STATUS_UNCHANGED, G_STATUS_UPDATED, G_NOT_VALID)
12077   --pricing_status_code needs to be set
12078   --to G_NOT_VALID so that this does not get into OM's
12079   --update statement to update lines with UPDATE status
12080         , line.pricing_status_code = decode(G_prg_unch_process_sts_tbl(i)
12081                                             , G_NOT_VALID, line.pricing_status_code, G_STATUS_UPDATED, G_NOT_VALID)
12082       WHERE line.process_status = 'OLD' || G_STATUS_UNCHANGED
12083       AND line.line_index = G_prg_unch_line_index_tbl(i);
12084     END IF; --G_prg_unch_line_index_tbl.COUNT
12085 
12086     --bug 2970368
12087     --IF G_REQUEST_TYPE_CODE <> 'ONT' THEN
12088     --bug 3085453 handle pricing availability UI
12089     -- they pass reqtype ONT and insert adj into ldets
12090     IF QP_PREQ_PUB.G_CHECK_CUST_VIEW_FLAG <> G_YES THEN
12091       update_prg_pricing_status(x_return_status, x_return_status_text);
12092     END IF; --G_REQUEST_TYPE_CODE
12093 
12094     x_return_status := FND_API.G_RET_STS_SUCCESS;
12095 
12096     IF l_debug = FND_API.G_TRUE THEN
12097       QP_PREQ_GRP.engine_debug('End Update_PRG_Process_status');
12098 
12099     END IF;
12100   EXCEPTION
12101     WHEN OTHERS THEN
12102       x_return_status := FND_API.G_RET_STS_ERROR;
12103       x_return_status_text := 'Exception in '|| l_routine ||' '|| SQLERRM;
12104       IF l_debug = FND_API.G_TRUE THEN
12105         QP_PREQ_GRP.engine_debug('Exception in '|| l_routine ||' '|| SQLERRM);
12106       END IF;
12107   END Update_PRG_Process_status;
12108 
12109   --This procedure will populate g_buyline_price_flag
12110   --This information will be used to select out-of-phase adjustments
12111   --from oe tables or engine selected based on the price_flag on
12112   --the buy line for OID/PRG's child discounts
12113   PROCEDURE Populate_buy_line_price_flag(x_return_status OUT NOCOPY VARCHAR2,
12114                                          x_return_status_text OUT NOCOPY VARCHAR2) IS
12115 
12116   -- 3493716: added prg.line_detail_index to cursor
12117   CURSOR l_buyline_price_flag_cur IS
12118     SELECT /*+ ORDERED USE_NL(buyline prg dis)*/
12119     dis.created_from_list_line_id, prg.line_detail_index, buyline.price_flag, 'Y' is_ldet, dis.line_index
12120     FROM qp_npreq_rltd_lines_tmp rltd, qp_npreq_lines_tmp buyline
12121          , qp_npreq_ldets_tmp prg, qp_npreq_ldets_tmp dis
12122     WHERE rltd.pricing_status_code = G_STATUS_NEW
12123     AND rltd.relationship_type_code = G_GENERATED_LINE
12124     AND buyline.line_index = rltd.line_index
12125     AND prg.line_detail_index = rltd.line_detail_index
12126     AND prg.created_from_list_line_type IN
12127             (G_OTHER_ITEM_DISCOUNT, G_PROMO_GOODS_DISCOUNT)
12128     AND prg.pricing_status_code = G_STATUS_NEW
12129     AND dis.line_detail_index = rltd.related_line_detail_index
12130     AND dis.pricing_status_code = G_STATUS_NEW;
12131 
12132   I PLS_INTEGER;
12133   l_routine VARCHAR2(100) := 'QP_PREQ_PUB.Populate_buy_line_price_flag';
12134   BEGIN
12135     IF l_debug = FND_API.G_TRUE THEN
12136       QP_PREQ_GRP.engine_debug('Begin Populate_buy_line_price_flag');
12137 
12138     END IF;
12139     --G_buyline_price_flag.delete;
12140     G_BUYLINE_INDEXES_FOR_LINE_ID.DELETE;
12141 
12142     IF l_debug = FND_API.G_TRUE THEN
12143       FOR c1 IN (SELECT line_detail_index, related_line_detail_index, line_index
12144                  FROM qp_npreq_rltd_lines_tmp WHERE pricing_status_code = G_STATUS_NEW
12145                  AND relationship_type_code = G_GENERATED_LINE)
12146         LOOP
12147         IF l_debug = FND_API.G_TRUE THEN
12148           QP_PREQ_GRP.engine_debug('loop linedtl '|| c1.line_detail_index ||' rltddtl '
12149                                    || c1.related_line_detail_index ||' lineind '|| c1.line_index);
12150         END IF;
12151         FOR c2 IN (SELECT line_index, line_detail_index FROM qp_npreq_ldets_tmp
12152                    WHERE line_detail_index = c1.line_detail_index
12153                    AND pricing_status_code = G_STATUS_NEW
12154                    AND created_from_list_line_type IN
12155                    (G_OTHER_ITEM_DISCOUNT, G_PROMO_GOODS_DISCOUNT))
12156           LOOP
12157           IF l_debug = FND_API.G_TRUE THEN
12158             QP_PREQ_GRP.engine_debug('loop ldet linedtl '|| c2.line_detail_index);
12159           END IF;
12160         END LOOP; --c2
12161       END LOOP; --c1
12162     END IF; --QP_PREQ_GRP.G_DEBUG_ENGINE
12163 
12164     FOR buyline IN l_buyline_price_flag_cur
12165       LOOP
12166       IF l_debug = FND_API.G_TRUE THEN
12167         QP_PREQ_GRP.engine_debug('In buyline loop list_line_id '
12168                                  || buyline.created_from_list_line_id
12169                                  ||' w/PRG ldet '|| buyline.line_detail_index -- 3493716
12170                                  ||' price_flag '|| buyline.price_flag
12171                                  ||' get line_index '|| buyline.line_index);
12172       END IF;
12173       --G_buyline_price_flag(buyline.created_from_list_line_id) := buyline.price_flag;
12174       -- bug 3721860 - G_BUYLINE_INDEXES_FOR_LINE_ID stores the info like - ,line_index1,line_index2,line_index3, - for a line_id
12175       IF G_BUYLINE_INDEXES_FOR_LINE_ID.EXISTS(buyline.created_from_list_line_id) THEN
12176         G_BUYLINE_INDEXES_FOR_LINE_ID(buyline.created_from_list_line_id) := G_BUYLINE_INDEXES_FOR_LINE_ID(buyline.created_from_list_line_id) || buyline.line_index || ',';
12177       ELSE
12178         G_BUYLINE_INDEXES_FOR_LINE_ID(buyline.created_from_list_line_id) := ',' || buyline.line_index || ',';
12179       END IF;
12180     END LOOP;
12181     /*
12182   IF QP_PREQ_GRP.G_DEBUG_ENGINE = FND_API.G_TRUE THEN
12183     i := G_buyline_price_flag.FIRST;
12184     WHILE i IS NOT NULL
12185     LOOP
12186       IF l_debug = FND_API.G_TRUE THEN
12187       QP_PREQ_GRP.engine_debug('In g_buyline loop list_line_id '
12188       ||I||' price_flag '||G_buyline_price_flag(I));
12189       END IF;
12190       I := G_buyline_price_flag.NEXT(I);
12191     END LOOP;--while
12192   END IF;--QP_PREQ_GRP.G_DEBUG_ENGINE
12193 
12194   OPEN l_buyline_price_flag_cur;
12195   FETCH l_buyline_price_flag_cur BULK COLLECT INTO
12196         G_buyline_list_line_id, G_buyline_price_flag;
12197   CLOSE l_buyline_price_flag_cur;
12198 UPDATE qp_npreq_ldets_tmp freegood_dis set buy_line_price_flag =
12199     (select buyline.price_flag
12200     from qp_npreq_rltd_lines_tmp rl, qp_npreq_lines_tmp buyline
12201     where rl.pricing_status_code = G_STATUS_NEW
12202     and rl.relationship_type_code = G_GENERATED_LINE
12203     and rl.related_line_detail_index = freegood_dis.line_detail_index
12204     and buyline.line_index = rl.line_index)
12205 where freegood_dis.pricing_status_code = G_STATUS_NEW
12206 and freegood_dis.applied_flag = G_YES
12207 and freegood_dis.created_from_list_line_type in (G_OTHER_ITEM_DISCOUNT,
12208                                                  G_PROMO_GOODS_DISCOUNT)
12209 and freegood_dis.line_detail_index in (select rltd.related_line_detail_index
12210     from qp_npreq_rltd_lines_tmp rltd
12211     where rltd.pricing_status_code = G_STATUS_NEW
12212     and rltd.relationship_type_code = G_GENERATED_LINE
12213     and rltd.line_detail_index = freegood_dis.line_detail_index);
12214 */
12215 
12216     IF l_debug = FND_API.G_TRUE THEN
12217       QP_PREQ_GRP.engine_debug('End Populate_buy_line_price_flag');
12218     END IF;
12219     x_return_status := FND_API.G_RET_STS_SUCCESS;
12220   EXCEPTION
12221     WHEN OTHERS THEN
12222       x_return_status := FND_API.G_RET_STS_ERROR;
12223       x_return_status_text := 'Exception in '|| l_routine ||' '|| SQLERRM;
12224       IF l_debug = FND_API.G_TRUE THEN
12225         QP_PREQ_GRP.Engine_debug(x_return_status_text);
12226       END IF;
12227   END Populate_buy_line_price_flag;
12228 
12229   -- 3721860: Added a parameter p_line_index
12230   FUNCTION Get_buy_line_price_flag(p_list_line_id IN NUMBER,
12231                                    p_line_index IN NUMBER)
12232   RETURN VARCHAR2 IS
12233 
12234   i PLS_INTEGER;
12235   l_routine VARCHAR2(100) := 'QP_PREQ_PUB.Get_buy_line_price_flag';
12236   l_count NUMBER;
12237   BEGIN
12238     IF l_debug = FND_API.G_TRUE THEN
12239       QP_PREQ_GRP.engine_debug('Begin Get_buy_line_price_flag, p_list_line_id p_line_index: '|| p_list_line_id || ' ' || p_line_index);
12240 
12241     END IF;
12242     IF G_BUYLINE_INDEXES_FOR_LINE_ID.COUNT > 0 THEN
12243       IF G_BUYLINE_INDEXES_FOR_LINE_ID.EXISTS(p_list_line_id) THEN
12244         l_count := instr(G_BUYLINE_INDEXES_FOR_LINE_ID(p_list_line_id), ',' || p_line_index || ',');
12245         IF l_debug = FND_API.G_TRUE THEN
12246           QP_PREQ_GRP.engine_debug('G_BUYLINE_INDEXES_FOR_LINE_ID(p_list_line_id) ' || G_BUYLINE_INDEXES_FOR_LINE_ID(p_list_line_id));
12247           QP_PREQ_GRP.engine_debug('l_count ' || l_count);
12248         END IF;
12249         IF l_count > 0 THEN
12250           RETURN 'Y';
12251         ELSE
12252           RETURN NULL;
12253         END IF;
12254       ELSE
12255         RETURN NULL;
12256       END IF; --G_BUYLINE_INDEXES_FOR_LINE_ID.EXISTS
12257     ELSE
12258       RETURN NULL;
12259     END IF; --G_BUYLINE_INDEXES_FOR_LINE_ID.count
12260 
12261   EXCEPTION
12262     WHEN OTHERS THEN
12263       IF l_debug = FND_API.G_TRUE THEN
12264         QP_PREQ_GRP.Engine_debug('Exception in '|| l_routine ||' '|| SQLERRM);
12265       END IF;
12266       RETURN NULL;
12267   END Get_buy_line_price_flag;
12268 
12269 
12270   /*****************************************************************
12271 --------------------Coupon Issue Processing-----------------------
12272 *****************************************************************/
12273   --This procedure will call QP_Process_Other_Benefits_PVT.process_coupon_issue
12274   --for every coupon issue modifier applied by the search engine
12275   --We do not want to do this in GRP because, GRP would generate coupons
12276   --during every reprice. During reprice, new coupons should not be
12277   --generated for existing adjustments
12278 
12279   PROCEDURE Process_coupon_issue(p_pricing_event IN VARCHAR2,
12280                                  p_simulation_flag IN VARCHAR2,
12281                                  x_return_status OUT NOCOPY VARCHAR2,
12282                                  x_return_status_text OUT NOCOPY VARCHAR2) IS
12283 
12284   CURSOR l_get_list_lines_cur IS
12285     SELECT /*+ index (ldets qp_preq_ldets_tmp_N2) */
12286       created_from_list_line_id
12287       , line_quantity
12288       , line_detail_index
12289       , pricing_phase_id
12290     FROM   qp_npreq_ldets_tmp ldets
12291     WHERE  created_from_list_line_type = G_COUPON_ISSUE
12292     AND applied_flag = G_YES
12293     /*
12294 --you don't need to match the phase as this will be called after cleanup
12295 --and by the time adjustments w/b picked up from oe_price_adj and ldets
12296 --from the right phases
12297 AND    pricing_phase_id in (select ph.pricing_phase_id
12298   from qp_event_phases evt , qp_pricing_phases ph, qp_npreq_lines_tmp line
12299   where ph.pricing_phase_id = evt.pricing_phase_id
12300   and instr(p_pricing_event,evt.pricing_event_code||',') > 0
12301   and line.line_index = ldets.line_index
12302   and (line.price_flag = G_YES
12303   or (line.price_flag = G_PHASE
12304   and ph.freeze_override_flag = G_YES)
12305 */
12306     --  AND    LINE_INDEX = p_line_index
12307     --  AND    ASK_FOR_FLAG IN (G_YES,G_NO)
12308     AND pricing_status_code = G_STATUS_NEW
12309     AND process_code = G_STATUS_NEW;
12310 
12311   Coupon_Exception EXCEPTION;
12312 
12313   BEGIN
12314     l_debug := QP_PREQ_GRP.G_DEBUG_ENGINE;
12315     FOR ldet IN l_get_list_lines_cur
12316       LOOP
12317       QP_COUPON_PVT.PROCESS_COUPON_ISSUE(
12318                                          p_line_detail_index => ldet.line_detail_index,
12319                                          p_pricing_phase_id => ldet.pricing_phase_id,
12320                                          p_line_quantity => ldet.line_quantity,
12321                                          p_simulation_flag => p_simulation_flag,
12322                                          x_return_status => x_return_status,
12323                                          x_return_status_txt => x_return_status_text);
12324       IF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
12325         RAISE Coupon_Exception;
12326       END IF; --x_return_status
12327     END LOOP; --get_list_lines_cur
12328 
12329   EXCEPTION
12330     WHEN Coupon_Exception THEN
12331       IF l_debug = FND_API.G_TRUE THEN
12332         QP_PREQ_GRP.engine_debug('Exception in QP_PREQ_PUB.Process_coupon_issue '|| x_return_status_text);
12333       END IF;
12334     WHEN OTHERS THEN
12335       x_return_status := FND_API.G_RET_STS_ERROR;
12336       x_return_status_text := 'Exception in QP_PREQ_PUB.Process_coupon_issue '|| SQLERRM;
12337       IF l_debug = FND_API.G_TRUE THEN
12338         QP_PREQ_GRP.engine_debug(x_return_status_text);
12339       END IF;
12340   END Process_coupon_issue;
12341 
12342   --This procedure will update the line_quantity on ldets
12343   --in case of a recurring break to reflect the right quantity
12344   PROCEDURE Update_Recurring_Quantity(x_return_status OUT NOCOPY VARCHAR2,
12345                                       x_return_status_text OUT NOCOPY VARCHAR2) IS
12346 
12347   --[julin/pbperf] tuned to use QP_PREQ_LDETS_TMP_N2
12348   CURSOR l_get_recurring_cur IS
12349     SELECT /*+ ORDERED index(ldet QP_PREQ_LDETS_TMP_N2) */ ldet.line_detail_index
12350     , lattr.context
12351     , lattr.attribute
12352     , lattr.value_from
12353     , lattr.setup_value_from
12354     , ldet.modifier_level_code
12355   --  , ldet.line_detail_index
12356     , ldet.line_quantity
12357     , ldet.group_quantity
12358     , ldet.group_amount
12359     , ldet.created_from_list_line_type
12360     , ldet.operand_value
12361     , qpl.operand
12362     , ldet.benefit_qty
12363     , ldet.accrual_flag
12364     , qpl.accrual_conversion_rate
12365     , qpl.estim_accrual_rate
12366   --  , qpl.benefit_qty
12367     FROM qp_npreq_ldets_tmp ldet, qp_npreq_line_attrs_tmp lattr, qp_list_lines qpl
12368     WHERE ldet.pricing_phase_id > 1
12369     AND ldet.pricing_status_code = G_STATUS_NEW
12370     AND ldet.line_index > -1
12371     AND ldet.created_from_list_line_type IN ('DIS', 'SUR', 'FREIGHT_CHARGE',
12372                                              'CIE', 'PBH', 'IUE', 'TSN')
12373     AND ldet.price_break_type_code = G_RECURRING_BREAK
12374     AND nvl(ldet.created_from_list_type_code, 'NULL') NOT IN ('PRL', 'AGR')
12375     AND lattr.line_detail_index = ldet.line_detail_index
12376     AND lattr.context = G_PRIC_VOLUME_CONTEXT
12377     AND qpl.list_line_id = ldet.created_from_list_line_id
12378     AND qpl.automatic_flag = 'N' ;  -- this procedure is needed only for manual modifiers since for automatic modifiers will be calculated in QPXGPREB
12379 
12380   l_recur_dtl_index_tbl QP_PREQ_GRP.number_type;
12381   l_recur_tot_benefit_qty_tbl QP_PREQ_GRP.number_type;
12382   l_recur_benefit_qty_tbl QP_PREQ_GRP.number_type; --Bug 2804053
12383   l_recur_benefit_qty NUMBER;
12384   l_recur_base_qty NUMBER;
12385   l_recur_qualifying_qty NUMBER;
12386   l_routine VARCHAR2(100) := 'QP_PREQ_PUB.Update_recurring_quantity';
12387 
12388   BEGIN
12389     l_debug := QP_PREQ_GRP.G_DEBUG_ENGINE;
12390     l_recur_dtl_index_tbl.DELETE;
12391     l_recur_tot_benefit_qty_tbl.DELETE;
12392 
12393     FOR recurring IN l_get_recurring_cur
12394       LOOP
12395       IF l_debug = FND_API.G_TRUE THEN -- shu 2702384
12396         QP_PREQ_GRP.engine_debug ('------in l_get_recurring_cur loop------');
12397       END IF; -- END IF l_debug
12398 
12399       IF recurring.created_from_list_line_type IN (G_DISCOUNT, G_SURCHARGE,
12400                                                    G_PROMO_GOODS_DISCOUNT, G_COUPON_ISSUE) THEN
12401         l_recur_dtl_index_tbl(l_recur_dtl_index_tbl.COUNT + 1) :=
12402         recurring.line_detail_index;
12403         IF recurring.created_from_list_line_type IN (G_DISCOUNT, G_SURCHARGE) THEN
12404           -- gets the engine calculated value from the grp calculation engine which is wrong
12405           l_recur_benefit_qty := recurring.operand_value; -- reverted fix 2747387 for bug 4127734
12406           --l_recur_benefit_qty := recurring.operand; -- get the original value bug# 2747387
12407         ELSIF recurring.created_from_list_line_type = G_PROMO_GOODS_DISCOUNT THEN
12408           l_recur_benefit_qty := recurring.benefit_qty;
12409         ELSIF recurring.created_from_list_line_type = G_COUPON_ISSUE THEN
12410           l_recur_benefit_qty := 1;
12411         END IF; --recurring.created_from_list_line_type
12412 
12413         IF l_debug = FND_API.G_TRUE THEN -- shu 2702384
12414           QP_PREQ_GRP.engine_debug ('l_recur_benefit_qty' || l_recur_benefit_qty);
12415         END IF;
12416 
12417         IF recurring.modifier_level_code IN (G_LINE_LEVEL, G_ORDER_LEVEL) THEN
12418           l_recur_qualifying_qty := recurring.line_quantity;
12419         ELSE
12420           IF recurring.attribute = G_QUANTITY_ATTRIBUTE THEN
12421             --l_recur_qualifying_qty := recurring.group_quantity; -- SHU this is null
12422             l_recur_qualifying_qty := nvl(recurring.group_quantity, recurring.line_quantity) ; -- 2388011, SHU FIX.
12423           ELSE
12424             --l_recur_qualifying_qty := recurring.group_amount; -- SHU, wrong since group_amount is per_unit value
12425             l_recur_qualifying_qty := recurring.line_quantity; -- 2388011, SHU FIX.
12426           END IF; --recurring.attribute
12427         END IF; --recurring.modifier_level_code
12428 
12429         l_recur_base_qty := recurring.setup_value_from;
12430 
12431         l_recur_tot_benefit_qty_tbl(l_recur_dtl_index_tbl.COUNT) :=
12432         TRUNC((l_recur_qualifying_qty / l_recur_base_qty))
12433         * l_recur_benefit_qty;
12434         --Bug 2804053
12435         IF recurring.accrual_flag = G_YES THEN
12436           l_recur_benefit_qty_tbl(l_recur_dtl_index_tbl.COUNT) :=
12437           l_recur_tot_benefit_qty_tbl(l_recur_dtl_index_tbl.COUNT) *
12438           1 / nvl(recurring.accrual_conversion_rate, 1) *
12439           nvl(recurring.estim_accrual_rate, 100) / 100;
12440         ELSE
12441           l_recur_benefit_qty_tbl(l_recur_dtl_index_tbl.COUNT) :=
12442           recurring.benefit_qty;
12443         END IF;
12444 
12445         IF l_debug = FND_API.G_TRUE THEN -- shu 2702384
12446           QP_PREQ_GRP.engine_debug ('l_recur_qualifying_qty' || l_recur_qualifying_qty);
12447           QP_PREQ_GRP.engine_debug ('l_recur_base_qty' || l_recur_base_qty);
12448           QP_PREQ_GRP.engine_debug ('l_recur_tot_benefit_qty' || l_recur_tot_benefit_qty_tbl(l_recur_dtl_index_tbl.COUNT));
12449           QP_PREQ_GRP.engine_debug ('l_recur_benefit_qty' || l_recur_benefit_qty_tbl(l_recur_dtl_index_tbl.COUNT));
12450         END IF; -- END IF l_debug
12451 
12452       END IF; --recurring.created_from_list_line_type
12453     END LOOP; --recurring
12454 
12455     IF l_recur_dtl_index_tbl.COUNT > 0 THEN
12456       IF l_debug = FND_API.G_TRUE THEN
12457         QP_PREQ_GRP.engine_debug('Updating recurring qty '|| l_recur_dtl_index_tbl.COUNT);
12458       END IF;
12459       FORALL i IN l_recur_dtl_index_tbl.FIRST .. l_recur_dtl_index_tbl.LAST
12460       UPDATE qp_npreq_ldets_tmp recur SET operand_value =  -- shu fix 2702384
12461                              l_recur_tot_benefit_qty_tbl(i)
12462                             , benefit_qty = l_recur_benefit_qty_tbl(i) --Bug 2804053
12463       WHERE recur.line_detail_index = l_recur_dtl_index_tbl(i);
12464     END IF; --l_recur_dtl_index_tbl.COUNT
12465   EXCEPTION
12466     WHEN OTHERS THEN
12467       x_return_status := FND_API.G_RET_STS_ERROR;
12468       x_return_status_text := l_routine ||' '|| SQLERRM;
12469       IF l_debug = FND_API.G_TRUE THEN
12470         QP_PREQ_GRP.engine_debug('Exception in '|| x_return_status_text);
12471       END IF;
12472   END Update_recurring_quantity;
12473 
12474   --added by yangli for Java Engine
12475   --This is for debugging purposes
12476   PROCEDURE Populate_Output_INT(x_return_status OUT NOCOPY VARCHAR2,
12477                                 x_return_status_text OUT NOCOPY VARCHAR2) IS
12478 
12479   /*
12480 INDX,QP_PREQ_PUB.populate_output_int.l_lines_cur,- No Index Used -,NA,NA
12481 */
12482   CURSOR l_lines_cur IS
12483     SELECT LINE_INDEX,
12484            LINE_ID,
12485            LINE_TYPE_CODE,
12486            LINE_QUANTITY,
12487            LINE_UOM_CODE,
12488            LINE_UNIT_PRICE,  --shu_latest
12489            PRICED_QUANTITY,
12490            UOM_QUANTITY,
12491            PRICED_UOM_CODE,
12492            CURRENCY_CODE,
12493            UNIT_PRICE,
12494            PERCENT_PRICE,
12495            PARENT_PRICE,
12496            PARENT_QUANTITY,
12497            PARENT_UOM_CODE,
12498            PRICE_FLAG,
12499            ADJUSTED_UNIT_PRICE,
12500            UPDATED_ADJUSTED_UNIT_PRICE,
12501            PROCESSING_ORDER,
12502            PROCESSED_CODE,
12503            PROCESSED_FLAG,
12504            PRICING_STATUS_CODE,
12505            PRICING_STATUS_TEXT,
12506            HOLD_CODE,
12507            HOLD_TEXT,
12508            PRICE_REQUEST_CODE,
12509            PRICING_EFFECTIVE_DATE,
12510            PRICE_LIST_HEADER_ID,
12511            PROCESS_STATUS,
12512            CATCHWEIGHT_QTY,
12513            ACTUAL_ORDER_QUANTITY,
12514            ORDER_UOM_SELLING_PRICE
12515     FROM   QP_INT_LINES;
12516 
12517   /*
12518 INDX,QP_PREQ_GRP.populate_output_int.l_ldets_cur,QP_LIST_LINES_PK,LIST_LINE_ID,1
12519 INDX,QP_PREQ_GRP.populate_output_int.l_ldets_cur,QP_INT_LDETS_N4,PRICING_STATUS_CODE,1
12520 INDX,QP_PREQ_GRP.populate_output_int.l_ldets_cur,QP_LIST_HEADERS_B_PK,LIST_HEADER_ID,1
12521 */
12522   CURSOR l_ldets_cur(p_line_index NUMBER) IS
12523     SELECT /*+ ORDERED USE_NL(A B C) l_ldets_cur */
12524            a.LINE_DETAIL_INDEX,
12525            a.LINE_DETAIL_TYPE_CODE,
12526            a.LINE_INDEX,
12527            a.CREATED_FROM_LIST_HEADER_ID LIST_HEADER_ID,
12528            a.CREATED_FROM_LIST_LINE_ID   LIST_LINE_ID,
12529            a.CREATED_FROM_LIST_LINE_TYPE LIST_LINE_TYPE_CODE,
12530            a.PRICE_BREAK_TYPE_CODE,
12531            a.LINE_QUANTITY,
12532            a.ADJUSTMENT_AMOUNT,
12533            a.AUTOMATIC_FLAG,
12534            a.PRICING_PHASE_ID,
12535            a.OPERAND_CALCULATION_CODE,
12536            a.OPERAND_VALUE,
12537            a.PRICING_GROUP_SEQUENCE,
12538            a.CREATED_FROM_LIST_TYPE_CODE,
12539            a.APPLIED_FLAG,
12540            a.PRICING_STATUS_CODE,
12541            a.PRICING_STATUS_TEXT,
12542            a.LIMIT_CODE,
12543            a.LIMIT_TEXT,
12544            a.LIST_LINE_NO,
12545            a.GROUP_QUANTITY,
12546            a.UPDATED_FLAG,
12547            a.PROCESS_CODE,
12548            a.CALCULATION_CODE,
12549            a.PRICE_ADJUSTMENT_ID,
12550            b.SUBSTITUTION_VALUE SUBSTITUTION_VALUE_TO,
12551            b.SUBSTITUTION_ATTRIBUTE,
12552            b.ACCRUAL_FLAG,
12553            a.modifier_level_code,
12554            b.ESTIM_GL_VALUE,
12555            b.ACCRUAL_CONVERSION_RATE,
12556            --Pass throuh components
12557            b.OVERRIDE_FLAG,
12558            b.PRINT_ON_INVOICE_FLAG,
12559            b.INVENTORY_ITEM_ID,
12560            b.ORGANIZATION_ID,
12561            b.RELATED_ITEM_ID,
12562            b.RELATIONSHIP_TYPE_ID,
12563            b.ESTIM_ACCRUAL_RATE,
12564            b.EXPIRATION_DATE,
12565            b.BENEFIT_PRICE_LIST_LINE_ID,
12566            b.RECURRING_FLAG,
12567            b.BENEFIT_LIMIT,
12568            b.CHARGE_TYPE_CODE,
12569            b.CHARGE_SUBTYPE_CODE,
12570            a.BENEFIT_QTY,  --bug 2804053
12571            b.BENEFIT_UOM_CODE,
12572            b.PRORATION_TYPE_CODE,
12573            b.INCLUDE_ON_RETURNS_FLAG,
12574            b.REBATE_TRANSACTION_TYPE_CODE,
12575            b.NUMBER_EXPIRATION_PERIODS,
12576            b.EXPIRATION_PERIOD_UOM,
12577            b.COMMENTS,
12578            a.ORDER_QTY_OPERAND,
12579            a.ORDER_QTY_ADJ_AMT
12580     FROM  QP_INT_LDETS a,
12581           QP_LIST_LINES     b
12582     WHERE a.line_index = p_line_index
12583         AND a.CREATED_FROM_LIST_LINE_ID = b.LIST_LINE_ID
12584         AND   a.PRICING_STATUS_CODE = G_STATUS_NEW;
12585 
12586   BEGIN
12587 
12588     IF l_debug = FND_API.G_TRUE THEN
12589       QP_PREQ_GRP.engine_debug('---------------------------------------------------');
12590     END IF;
12591 
12592     FOR l_line IN l_lines_cur LOOP
12593       IF l_debug = FND_API.G_TRUE THEN
12594         QP_PREQ_GRP.engine_debug('----price line info--------------------------------');
12595         QP_PREQ_GRP.engine_debug('---------------------------------------------------');
12596       END IF;
12597 
12598       IF l_debug = FND_API.G_TRUE THEN
12599         QP_PREQ_GRP.engine_debug('*LINE_INDEX :='|| l_line.LINE_INDEX);
12600         QP_PREQ_GRP.engine_debug('*LINE_ID    :='|| l_line.LINE_ID);
12601         QP_PREQ_GRP.engine_debug('LINE_TYPE_CODE :='|| l_line.LINE_TYPE_CODE);
12602         QP_PREQ_GRP.engine_debug('UOM_QUANTITY :='|| l_line.UOM_QUANTITY);
12603         QP_PREQ_GRP.engine_debug('CURRENCY_CODE :='|| l_line.CURRENCY_CODE);
12604         QP_PREQ_GRP.engine_debug('PRICED_QUANTITY :='|| l_line.PRICED_QUANTITY);
12605         QP_PREQ_GRP.engine_debug('PRICED_UOM_CODE :='|| l_line.PRICED_UOM_CODE);
12606         QP_PREQ_GRP.engine_debug('*UNIT_PRICE :='|| l_line.UNIT_PRICE);
12607         QP_PREQ_GRP.engine_debug('*PRICE_LIST_ID :='|| l_line.PRICE_LIST_HEADER_ID);
12608         QP_PREQ_GRP.engine_debug('LINE_QUANTITY:=' || l_line.LINE_QUANTITY);
12609         QP_PREQ_GRP.engine_debug('LINE_UOM_CODE:=' || l_line.LINE_UOM_CODE);
12610         QP_PREQ_GRP.engine_debug('LINE_UNIT_PRICE:=' || l_line.LINE_UNIT_PRICE); -- shu_latest
12611         QP_PREQ_GRP.engine_debug('PERCENT_PRICE :='|| l_line.PERCENT_PRICE);
12612         QP_PREQ_GRP.engine_debug('*ADJUSTED_UNIT_PRICE :='|| l_line.ADJUSTED_UNIT_PRICE);
12613         QP_PREQ_GRP.engine_debug('PARENT_PRICE :='|| l_line.PARENT_PRICE);
12614         QP_PREQ_GRP.engine_debug('PARENT_QUANTITY :='|| l_line.PARENT_QUANTITY);
12615         QP_PREQ_GRP.engine_debug('PARENT_UOM_CODE :='|| l_line.PARENT_UOM_CODE);
12616         QP_PREQ_GRP.engine_debug('processed_code :='|| l_line.processed_code);
12617         QP_PREQ_GRP.engine_debug('processed_flag :='|| l_line.processed_flag);
12618         QP_PREQ_GRP.engine_debug('Price Flag :='|| l_line.price_flag);
12619         QP_PREQ_GRP.engine_debug('*STATUS_CODE :='|| l_line.PRICING_STATUS_CODE);
12620         QP_PREQ_GRP.engine_debug('*STATUS_TEXT :='|| substr(l_line.PRICING_STATUS_TEXT, 1, 2000));
12621         QP_PREQ_GRP.engine_debug('HOLD_CODE := '|| l_line.HOLD_CODE);
12622         QP_PREQ_GRP.engine_debug('HOLD_TEXT := '|| substr(l_line.HOLD_TEXT, 1, 240));
12623         QP_PREQ_GRP.engine_debug('PRICE_REQUEST_CODE := '|| l_line.PRICE_REQUEST_CODE);
12624         QP_PREQ_GRP.engine_debug('PRICING_DATE := '|| l_line.PRICING_EFFECTIVE_DATE);
12625         QP_PREQ_GRP.engine_debug('*PROCESS_STATUS :='|| l_line.PROCESS_STATUS);
12626         QP_PREQ_GRP.engine_debug('*CATCHWEIGHT_QTY :='|| l_line.CATCHWEIGHT_QTY);
12627         QP_PREQ_GRP.engine_debug('*ACTUAL_ORDER_QTY :='|| l_line.ACTUAL_ORDER_QUANTITY);
12628         QP_PREQ_GRP.engine_debug('*ORDER_UOM_SELLING_PRICE :='|| l_line.ORDER_UOM_SELLING_PRICE);
12629       END IF;
12630 
12631       IF l_debug = FND_API.G_TRUE THEN
12632         QP_PREQ_GRP.engine_debug('---------------------------------------------------');
12633 
12634       END IF;
12635       --Populate Line detail
12636       FOR l_dets IN l_ldets_cur(l_line.LINE_INDEX) LOOP
12637 
12638         IF l_debug = FND_API.G_TRUE THEN
12639           QP_PREQ_GRP.engine_debug('-----------Line detail Info -----------------------');
12640           QP_PREQ_GRP.engine_debug('---------------------------------------------------');
12641           QP_PREQ_GRP.engine_debug('*LINE_DETAIL_INDEX :='|| l_dets.LINE_DETAIL_INDEX);
12642           QP_PREQ_GRP.engine_debug('LINE_DETAIL_TYPE_CODE:=' || l_dets.LINE_DETAIL_TYPE_CODE);
12643           QP_PREQ_GRP.engine_debug('*LINE_INDEX:=' || l_dets.LINE_INDEX);
12644           QP_PREQ_GRP.engine_debug('*PROCESS_CODE:=' || l_dets.PROCESS_CODE);
12645           QP_PREQ_GRP.engine_debug('*CALCULATION_CODE:=' || l_dets.CALCULATION_CODE);
12646           QP_PREQ_GRP.engine_debug('*LIST_HEADER_ID:=' || l_dets.LIST_HEADER_ID);
12647           QP_PREQ_GRP.engine_debug('*LIST_LINE_ID:=' || l_dets.LIST_LINE_ID);
12648           QP_PREQ_GRP.engine_debug('*PRICE_ADJUSTMENT_ID:=' || l_dets.PRICE_ADJUSTMENT_ID);
12649           QP_PREQ_GRP.engine_debug('LIST_LINE_TYPE_CODE:=' || l_dets.LIST_LINE_TYPE_CODE);
12650           QP_PREQ_GRP.engine_debug('SUBSTITUTION_TO:=' || l_dets.SUBSTITUTION_VALUE_TO);
12651           QP_PREQ_GRP.engine_debug('LINE_QUANTITY :='|| l_dets.LINE_QUANTITY);
12652           QP_PREQ_GRP.engine_debug('*ADJUSTMENT_AMOUNT :='|| l_dets.ADJUSTMENT_AMOUNT);
12653           QP_PREQ_GRP.engine_debug('*AUTOMATIC_FLAG    :='|| l_dets.AUTOMATIC_FLAG);
12654           QP_PREQ_GRP.engine_debug('APPLIED_FLAG      :='|| l_dets.APPLIED_FLAG);
12655           QP_PREQ_GRP.engine_debug('UPDATED_FLAG      :='|| l_dets.UPDATED_FLAG);
12656           QP_PREQ_GRP.engine_debug('PRICING_GROUP_SEQUENCE :='|| l_dets.PRICING_GROUP_SEQUENCE);
12657           QP_PREQ_GRP.engine_debug('CREATED_FROM_LIST_TYPE_CODE:=' || l_dets.CREATED_FROM_LIST_TYPE_CODE);
12658           QP_PREQ_GRP.engine_debug('PRICE_BREAK_TYPE_CODE :='|| l_dets.PRICE_BREAK_TYPE_CODE);
12659           QP_PREQ_GRP.engine_debug('*OVERRIDE_FLAG   :='|| l_dets.override_flag);
12660           QP_PREQ_GRP.engine_debug('PRINT_ON_INVOICE_FLAG :='|| l_dets.print_on_invoice_flag);
12661           QP_PREQ_GRP.engine_debug('PRICING_PHASE_ID :='|| l_dets.PRICING_PHASE_ID);
12662           QP_PREQ_GRP.engine_debug('*OPERAND_CALCULATION_CODE :='|| l_dets.OPERAND_CALCULATION_CODE);
12663           QP_PREQ_GRP.engine_debug('*OPERAND_VALUE :='|| l_dets.OPERAND_VALUE);
12664           QP_PREQ_GRP.engine_debug('*ORDER_QTY_OPERAND :='|| l_dets.ORDER_QTY_OPERAND);
12665           QP_PREQ_GRP.engine_debug('*ORDER_QTY_ADJ_AMT :='|| l_dets.ORDER_QTY_ADJ_AMT);
12666           QP_PREQ_GRP.engine_debug('*STATUS_CODE:=' || l_dets.PRICING_STATUS_CODE);
12667           QP_PREQ_GRP.engine_debug('*STATUS_TEXT:=' || substr(l_dets.PRICING_STATUS_TEXT, 1, 240));
12668           QP_PREQ_GRP.engine_debug('SUBSTITUTION_ATTRIBUTE:=' || l_dets.SUBSTITUTION_ATTRIBUTE);
12669           QP_PREQ_GRP.engine_debug('ACCRUAL_FLAG:=' || l_dets.ACCRUAL_FLAG);
12670           QP_PREQ_GRP.engine_debug('LIST_LINE_NO:=' || l_dets.LIST_LINE_NO);
12671           QP_PREQ_GRP.engine_debug('ESTIM_GL_VALUE:=' || l_dets.ESTIM_GL_VALUE);
12672           QP_PREQ_GRP.engine_debug('ACCRUAL_CONVERSION_RATE:=' || l_dets.ACCRUAL_CONVERSION_RATE);
12673         END IF;
12674         --Pass throuh components
12675         IF l_debug = FND_API.G_TRUE THEN
12676           QP_PREQ_GRP.engine_debug('OVERRIDE_FLAG:=' || l_dets.OVERRIDE_FLAG);
12677           QP_PREQ_GRP.engine_debug('INVENTORY_ITEM_ID:=' || l_dets.INVENTORY_ITEM_ID);
12678           QP_PREQ_GRP.engine_debug('ORGANIZATION_ID:=' || l_dets.ORGANIZATION_ID);
12679           QP_PREQ_GRP.engine_debug('RELATED_ITEM_ID:=' || l_dets.RELATED_ITEM_ID);
12680           QP_PREQ_GRP.engine_debug('RELATIONSHIP_TYPE_ID:=' || l_dets.RELATIONSHIP_TYPE_ID);
12681           QP_PREQ_GRP.engine_debug('ESTIM_ACCRUAL_RATE:=' || l_dets.ESTIM_ACCRUAL_RATE);
12682           QP_PREQ_GRP.engine_debug('EXPIRATION_DATE:=' || l_dets.EXPIRATION_DATE);
12683           QP_PREQ_GRP.engine_debug('BENEFIT_PRICE_LIST_LINE_ID:=' || l_dets.BENEFIT_PRICE_LIST_LINE_ID);
12684           QP_PREQ_GRP.engine_debug('RECURRING_FLAG:=' || l_dets.RECURRING_FLAG);
12685           QP_PREQ_GRP.engine_debug('BENEFIT_LIMIT:=' || l_dets.BENEFIT_LIMIT);
12686           QP_PREQ_GRP.engine_debug('CHARGE_TYPE_CODE:=' || l_dets.CHARGE_TYPE_CODE);
12687           QP_PREQ_GRP.engine_debug('CHARGE_SUBTYPE_CODE:=' || l_dets.CHARGE_SUBTYPE_CODE);
12688           QP_PREQ_GRP.engine_debug('BENEFIT_QTY:=' || l_dets.BENEFIT_QTY);
12689           QP_PREQ_GRP.engine_debug('BENEFIT_UOM_CODE:=' || l_dets.BENEFIT_UOM_CODE);
12690           QP_PREQ_GRP.engine_debug('PRORATION_TYPE_CODE:=' || l_dets.PRORATION_TYPE_CODE);
12691           QP_PREQ_GRP.engine_debug('INCLUDE_ON_RETURNS_FLAG :='|| l_dets.INCLUDE_ON_RETURNS_FLAG);
12692           QP_PREQ_GRP.engine_debug('MODIFIER_LEVEL_CODE :='|| l_dets.MODIFIER_LEVEL_CODE);
12693           QP_PREQ_GRP.engine_debug('GROUP VALUE :='|| l_dets.GROUP_QUANTITY);
12694           QP_PREQ_GRP.engine_debug('LIMIT_CODE :='|| l_dets.LIMIT_CODE);
12695           QP_PREQ_GRP.engine_debug('LIMIT_TEXT :='|| substr(l_dets.LIMIT_TEXT, 1, 240));
12696 
12697           QP_PREQ_GRP.engine_debug('---------------------------------------------------');
12698         END IF;
12699       END LOOP; --l_ldets_cur
12700     END LOOP; --end l_lines_cur
12701     IF l_debug = FND_API.G_TRUE THEN
12702       QP_PREQ_GRP.engine_debug('---------------------------------------------------');
12703 
12704     END IF;
12705   EXCEPTION
12706     WHEN OTHERS THEN
12707       IF l_debug = FND_API.G_TRUE THEN
12708         QP_PREQ_GRP.engine_debug('QP_PREQ_PUB.Populate_Output_INT: '|| SQLERRM);
12709       END IF;
12710       x_return_status := FND_API.G_RET_STS_ERROR;
12711       x_return_status_text := 'QP_PREQ_PUB.Populate_Output_INT: '|| SQLERRM;
12712   END Populate_Output_INT;
12713   --added by yangli for Java Engine project
12714 
12715   --This is for debugging purposes
12716   PROCEDURE Populate_Output(x_return_status OUT NOCOPY VARCHAR2,
12717                             x_return_status_text OUT NOCOPY VARCHAR2) IS
12718 
12719   /*
12720 INDX,QP_PREQ_PUB.populate_output.l_lines_cur,- No Index Used -,NA,NA
12721 */
12722   CURSOR l_lines_cur IS
12723     SELECT LINE_INDEX,
12724            LINE_ID,
12725            LINE_TYPE_CODE,
12726            LINE_QUANTITY,
12727            LINE_UOM_CODE,
12728            LINE_UNIT_PRICE,  --shu_latest
12729            PRICED_QUANTITY,
12730            UOM_QUANTITY,
12731            PRICED_UOM_CODE,
12732            CURRENCY_CODE,
12733            UNIT_PRICE,
12734            PERCENT_PRICE,
12735            PARENT_PRICE,
12736            PARENT_QUANTITY,
12737            PARENT_UOM_CODE,
12738            PRICE_FLAG,
12739            ADJUSTED_UNIT_PRICE,
12740            UPDATED_ADJUSTED_UNIT_PRICE,
12741            PROCESSING_ORDER,
12742            PROCESSED_CODE,
12743            PROCESSED_FLAG,
12744            PRICING_STATUS_CODE,
12745            PRICING_STATUS_TEXT,
12746            HOLD_CODE,
12747            HOLD_TEXT,
12748            PRICE_REQUEST_CODE,
12749            PRICING_EFFECTIVE_DATE,
12750            PRICE_LIST_HEADER_ID,
12751            PROCESS_STATUS,
12752            CATCHWEIGHT_QTY,
12753            ACTUAL_ORDER_QUANTITY,
12754            ORDER_UOM_SELLING_PRICE
12755     FROM   qp_npreq_lines_tmp;
12756 
12757   /*
12758 INDX,QP_PREQ_GRP.populate_output.l_ldets_cur,QP_LIST_LINES_PK,LIST_LINE_ID,1
12759 INDX,QP_PREQ_GRP.populate_output.l_ldets_cur,qp_npreq_ldets_tmp_N4,PRICING_STATUS_CODE,1
12760 INDX,QP_PREQ_GRP.populate_output.l_ldets_cur,QP_LIST_HEADERS_B_PK,LIST_HEADER_ID,1
12761 */
12762   CURSOR l_ldets_cur(p_line_index NUMBER) IS
12763     SELECT /*+ ORDERED USE_NL(A B C) l_ldets_cur */
12764            a.LINE_DETAIL_INDEX,
12765            a.LINE_DETAIL_TYPE_CODE,
12766            a.LINE_INDEX,
12767            a.CREATED_FROM_LIST_HEADER_ID LIST_HEADER_ID,
12768            a.CREATED_FROM_LIST_LINE_ID   LIST_LINE_ID,
12769            a.CREATED_FROM_LIST_LINE_TYPE LIST_LINE_TYPE_CODE,
12770            a.PRICE_BREAK_TYPE_CODE,
12771            a.LINE_QUANTITY,
12772            a.ADJUSTMENT_AMOUNT,
12773            a.AUTOMATIC_FLAG,
12774            a.PRICING_PHASE_ID,
12775            a.OPERAND_CALCULATION_CODE,
12776            a.OPERAND_VALUE,
12777            a.PRICING_GROUP_SEQUENCE,
12778            a.CREATED_FROM_LIST_TYPE_CODE,
12779            a.APPLIED_FLAG,
12780            a.PRICING_STATUS_CODE,
12781            a.PRICING_STATUS_TEXT,
12782            a.LIMIT_CODE,
12783            a.LIMIT_TEXT,
12784            a.LIST_LINE_NO,
12785            a.GROUP_QUANTITY,
12786            a.UPDATED_FLAG,
12787            a.PROCESS_CODE,
12788            a.CALCULATION_CODE,
12789            a.PRICE_ADJUSTMENT_ID,
12790            b.SUBSTITUTION_VALUE SUBSTITUTION_VALUE_TO,
12791            b.SUBSTITUTION_ATTRIBUTE,
12792            b.ACCRUAL_FLAG,
12793            a.modifier_level_code,
12794            b.ESTIM_GL_VALUE,
12795            b.ACCRUAL_CONVERSION_RATE,
12796            --Pass throuh components
12797            b.OVERRIDE_FLAG,
12798            b.PRINT_ON_INVOICE_FLAG,
12799            b.INVENTORY_ITEM_ID,
12800            b.ORGANIZATION_ID,
12801            b.RELATED_ITEM_ID,
12802            b.RELATIONSHIP_TYPE_ID,
12803            b.ESTIM_ACCRUAL_RATE,
12804            b.EXPIRATION_DATE,
12805            b.BENEFIT_PRICE_LIST_LINE_ID,
12806            b.RECURRING_FLAG,
12807            b.BENEFIT_LIMIT,
12808            b.CHARGE_TYPE_CODE,
12809            b.CHARGE_SUBTYPE_CODE,
12810            a.BENEFIT_QTY,  --bug 2804053
12811            b.BENEFIT_UOM_CODE,
12812            b.PRORATION_TYPE_CODE,
12813            b.INCLUDE_ON_RETURNS_FLAG,
12814            b.REBATE_TRANSACTION_TYPE_CODE,
12815            b.NUMBER_EXPIRATION_PERIODS,
12816            b.EXPIRATION_PERIOD_UOM,
12817            b.COMMENTS,
12818            a.ORDER_QTY_OPERAND,
12819            a.ORDER_QTY_ADJ_AMT
12820     FROM  qp_npreq_ldets_tmp a,
12821           QP_LIST_LINES     b
12822     WHERE a.line_index = p_line_index
12823         AND a.CREATED_FROM_LIST_LINE_ID = b.LIST_LINE_ID
12824             AND   a.PRICING_STATUS_CODE = G_STATUS_NEW;
12825 
12826   BEGIN
12827 
12828     IF l_debug = FND_API.G_TRUE THEN
12829       QP_PREQ_GRP.engine_debug('---------------------------------------------------');
12830     END IF;
12831 
12832     FOR l_line IN l_lines_cur LOOP
12833       IF l_debug = FND_API.G_TRUE THEN
12834         QP_PREQ_GRP.engine_debug('----price line info--------------------------------');
12835         QP_PREQ_GRP.engine_debug('---------------------------------------------------');
12836       END IF;
12837 
12838       IF l_debug = FND_API.G_TRUE THEN
12839         QP_PREQ_GRP.engine_debug('*LINE_INDEX :='|| l_line.LINE_INDEX);
12840         QP_PREQ_GRP.engine_debug('*LINE_ID    :='|| l_line.LINE_ID);
12841         QP_PREQ_GRP.engine_debug('LINE_TYPE_CODE :='|| l_line.LINE_TYPE_CODE);
12842         QP_PREQ_GRP.engine_debug('UOM_QUANTITY :='|| l_line.UOM_QUANTITY);
12843         QP_PREQ_GRP.engine_debug('CURRENCY_CODE :='|| l_line.CURRENCY_CODE);
12844         QP_PREQ_GRP.engine_debug('PRICED_QUANTITY :='|| l_line.PRICED_QUANTITY);
12845         QP_PREQ_GRP.engine_debug('PRICED_UOM_CODE :='|| l_line.PRICED_UOM_CODE);
12846         QP_PREQ_GRP.engine_debug('*UNIT_PRICE :='|| l_line.UNIT_PRICE);
12847         QP_PREQ_GRP.engine_debug('*PRICE_LIST_ID :='|| l_line.PRICE_LIST_HEADER_ID);
12848         QP_PREQ_GRP.engine_debug('LINE_QUANTITY:=' || l_line.LINE_QUANTITY);
12849         QP_PREQ_GRP.engine_debug('LINE_UOM_CODE:=' || l_line.LINE_UOM_CODE);
12850         QP_PREQ_GRP.engine_debug('LINE_UNIT_PRICE:=' || l_line.LINE_UNIT_PRICE); -- shu_latest
12851         QP_PREQ_GRP.engine_debug('PERCENT_PRICE :='|| l_line.PERCENT_PRICE);
12852         QP_PREQ_GRP.engine_debug('*ADJUSTED_UNIT_PRICE :='|| l_line.ADJUSTED_UNIT_PRICE);
12853         QP_PREQ_GRP.engine_debug('PARENT_PRICE :='|| l_line.PARENT_PRICE);
12854         QP_PREQ_GRP.engine_debug('PARENT_QUANTITY :='|| l_line.PARENT_QUANTITY);
12855         QP_PREQ_GRP.engine_debug('PARENT_UOM_CODE :='|| l_line.PARENT_UOM_CODE);
12856         QP_PREQ_GRP.engine_debug('processed_code :='|| l_line.processed_code);
12857         QP_PREQ_GRP.engine_debug('processed_flag :='|| l_line.processed_flag);
12858         QP_PREQ_GRP.engine_debug('Price Flag :='|| l_line.price_flag);
12859         QP_PREQ_GRP.engine_debug('*STATUS_CODE :='|| l_line.PRICING_STATUS_CODE);
12860         QP_PREQ_GRP.engine_debug('*STATUS_TEXT :='|| substr(l_line.PRICING_STATUS_TEXT, 1, 2000));
12861         QP_PREQ_GRP.engine_debug('HOLD_CODE := '|| l_line.HOLD_CODE);
12862         QP_PREQ_GRP.engine_debug('HOLD_TEXT := '|| substr(l_line.HOLD_TEXT, 1, 240));
12863         QP_PREQ_GRP.engine_debug('PRICE_REQUEST_CODE := '|| l_line.PRICE_REQUEST_CODE);
12864         QP_PREQ_GRP.engine_debug('PRICING_DATE := '|| l_line.PRICING_EFFECTIVE_DATE);
12865         QP_PREQ_GRP.engine_debug('*PROCESS_STATUS :='|| l_line.PROCESS_STATUS);
12866         QP_PREQ_GRP.engine_debug('*CATCHWEIGHT_QTY :='|| l_line.CATCHWEIGHT_QTY);
12867         QP_PREQ_GRP.engine_debug('*ACTUAL_ORDER_QTY :='|| l_line.ACTUAL_ORDER_QUANTITY);
12868         QP_PREQ_GRP.engine_debug('*ORDER_UOM_SELLING_PRICE :='|| l_line.ORDER_UOM_SELLING_PRICE);
12869       END IF;
12870 
12871       IF l_debug = FND_API.G_TRUE THEN
12872         QP_PREQ_GRP.engine_debug('---------------------------------------------------');
12873 
12874       END IF;
12875       --Populate Line detail
12876       FOR l_dets IN l_ldets_cur(l_line.LINE_INDEX) LOOP
12877 
12878         IF l_debug = FND_API.G_TRUE THEN
12879           QP_PREQ_GRP.engine_debug('-----------Line detail Info -----------------------');
12880           QP_PREQ_GRP.engine_debug('---------------------------------------------------');
12881           QP_PREQ_GRP.engine_debug('*LINE_DETAIL_INDEX :='|| l_dets.LINE_DETAIL_INDEX);
12882           QP_PREQ_GRP.engine_debug('LINE_DETAIL_TYPE_CODE:=' || l_dets.LINE_DETAIL_TYPE_CODE);
12883           QP_PREQ_GRP.engine_debug('*LINE_INDEX:=' || l_dets.LINE_INDEX);
12884           QP_PREQ_GRP.engine_debug('*PROCESS_CODE:=' || l_dets.PROCESS_CODE);
12885           QP_PREQ_GRP.engine_debug('*CALCULATION_CODE:=' || l_dets.CALCULATION_CODE);
12886           QP_PREQ_GRP.engine_debug('*LIST_HEADER_ID:=' || l_dets.LIST_HEADER_ID);
12887           QP_PREQ_GRP.engine_debug('*LIST_LINE_ID:=' || l_dets.LIST_LINE_ID);
12888           QP_PREQ_GRP.engine_debug('*PRICE_ADJUSTMENT_ID:=' || l_dets.PRICE_ADJUSTMENT_ID);
12889           QP_PREQ_GRP.engine_debug('LIST_LINE_TYPE_CODE:=' || l_dets.LIST_LINE_TYPE_CODE);
12890           QP_PREQ_GRP.engine_debug('SUBSTITUTION_TO:=' || l_dets.SUBSTITUTION_VALUE_TO);
12891           QP_PREQ_GRP.engine_debug('LINE_QUANTITY :='|| l_dets.LINE_QUANTITY);
12892           QP_PREQ_GRP.engine_debug('*ADJUSTMENT_AMOUNT :='|| l_dets.ADJUSTMENT_AMOUNT);
12893           QP_PREQ_GRP.engine_debug('*AUTOMATIC_FLAG    :='|| l_dets.AUTOMATIC_FLAG);
12894           QP_PREQ_GRP.engine_debug('APPLIED_FLAG      :='|| l_dets.APPLIED_FLAG);
12895           QP_PREQ_GRP.engine_debug('UPDATED_FLAG      :='|| l_dets.UPDATED_FLAG);
12896           QP_PREQ_GRP.engine_debug('PRICING_GROUP_SEQUENCE :='|| l_dets.PRICING_GROUP_SEQUENCE);
12897           QP_PREQ_GRP.engine_debug('CREATED_FROM_LIST_TYPE_CODE:=' || l_dets.CREATED_FROM_LIST_TYPE_CODE);
12898           QP_PREQ_GRP.engine_debug('PRICE_BREAK_TYPE_CODE :='|| l_dets.PRICE_BREAK_TYPE_CODE);
12899           QP_PREQ_GRP.engine_debug('*OVERRIDE_FLAG   :='|| l_dets.override_flag);
12900           QP_PREQ_GRP.engine_debug('PRINT_ON_INVOICE_FLAG :='|| l_dets.print_on_invoice_flag);
12901           QP_PREQ_GRP.engine_debug('PRICING_PHASE_ID :='|| l_dets.PRICING_PHASE_ID);
12902           QP_PREQ_GRP.engine_debug('*OPERAND_CALCULATION_CODE :='|| l_dets.OPERAND_CALCULATION_CODE);
12903           QP_PREQ_GRP.engine_debug('*OPERAND_VALUE :='|| l_dets.OPERAND_VALUE);
12904           QP_PREQ_GRP.engine_debug('*ORDER_QTY_OPERAND :='|| l_dets.ORDER_QTY_OPERAND);
12905           QP_PREQ_GRP.engine_debug('*ORDER_QTY_ADJ_AMT :='|| l_dets.ORDER_QTY_ADJ_AMT);
12906           QP_PREQ_GRP.engine_debug('*STATUS_CODE:=' || l_dets.PRICING_STATUS_CODE);
12907           QP_PREQ_GRP.engine_debug('*STATUS_TEXT:=' || substr(l_dets.PRICING_STATUS_TEXT, 1, 240));
12908           QP_PREQ_GRP.engine_debug('SUBSTITUTION_ATTRIBUTE:=' || l_dets.SUBSTITUTION_ATTRIBUTE);
12909           QP_PREQ_GRP.engine_debug('ACCRUAL_FLAG:=' || l_dets.ACCRUAL_FLAG);
12910           QP_PREQ_GRP.engine_debug('LIST_LINE_NO:=' || l_dets.LIST_LINE_NO);
12911           QP_PREQ_GRP.engine_debug('ESTIM_GL_VALUE:=' || l_dets.ESTIM_GL_VALUE);
12912           QP_PREQ_GRP.engine_debug('ACCRUAL_CONVERSION_RATE:=' || l_dets.ACCRUAL_CONVERSION_RATE);
12913         END IF;
12914         --Pass throuh components
12915         IF l_debug = FND_API.G_TRUE THEN
12916           QP_PREQ_GRP.engine_debug('OVERRIDE_FLAG:=' || l_dets.OVERRIDE_FLAG);
12917           QP_PREQ_GRP.engine_debug('INVENTORY_ITEM_ID:=' || l_dets.INVENTORY_ITEM_ID);
12918           QP_PREQ_GRP.engine_debug('ORGANIZATION_ID:=' || l_dets.ORGANIZATION_ID);
12919           QP_PREQ_GRP.engine_debug('RELATED_ITEM_ID:=' || l_dets.RELATED_ITEM_ID);
12920           QP_PREQ_GRP.engine_debug('RELATIONSHIP_TYPE_ID:=' || l_dets.RELATIONSHIP_TYPE_ID);
12921           QP_PREQ_GRP.engine_debug('ESTIM_ACCRUAL_RATE:=' || l_dets.ESTIM_ACCRUAL_RATE);
12922           QP_PREQ_GRP.engine_debug('EXPIRATION_DATE:=' || l_dets.EXPIRATION_DATE);
12923           QP_PREQ_GRP.engine_debug('BENEFIT_PRICE_LIST_LINE_ID:=' || l_dets.BENEFIT_PRICE_LIST_LINE_ID);
12924           QP_PREQ_GRP.engine_debug('RECURRING_FLAG:=' || l_dets.RECURRING_FLAG);
12925           QP_PREQ_GRP.engine_debug('BENEFIT_LIMIT:=' || l_dets.BENEFIT_LIMIT);
12926           QP_PREQ_GRP.engine_debug('CHARGE_TYPE_CODE:=' || l_dets.CHARGE_TYPE_CODE);
12927           QP_PREQ_GRP.engine_debug('CHARGE_SUBTYPE_CODE:=' || l_dets.CHARGE_SUBTYPE_CODE);
12928           QP_PREQ_GRP.engine_debug('BENEFIT_QTY:=' || l_dets.BENEFIT_QTY);
12929           QP_PREQ_GRP.engine_debug('BENEFIT_UOM_CODE:=' || l_dets.BENEFIT_UOM_CODE);
12930           QP_PREQ_GRP.engine_debug('PRORATION_TYPE_CODE:=' || l_dets.PRORATION_TYPE_CODE);
12931           QP_PREQ_GRP.engine_debug('INCLUDE_ON_RETURNS_FLAG :='|| l_dets.INCLUDE_ON_RETURNS_FLAG);
12932           QP_PREQ_GRP.engine_debug('MODIFIER_LEVEL_CODE :='|| l_dets.MODIFIER_LEVEL_CODE);
12933           QP_PREQ_GRP.engine_debug('GROUP VALUE :='|| l_dets.GROUP_QUANTITY);
12934           QP_PREQ_GRP.engine_debug('LIMIT_CODE :='|| l_dets.LIMIT_CODE);
12935           QP_PREQ_GRP.engine_debug('LIMIT_TEXT :='|| substr(l_dets.LIMIT_TEXT, 1, 240));
12936 
12937           QP_PREQ_GRP.engine_debug('---------------------------------------------------');
12938         END IF;
12939       END LOOP; --l_ldets_cur
12940     END LOOP; --end l_lines_cur
12941     IF l_debug = FND_API.G_TRUE THEN
12942       QP_PREQ_GRP.engine_debug('---------------------------------------------------');
12943 
12944     END IF;
12945   EXCEPTION
12946     WHEN OTHERS THEN
12947       IF l_debug = FND_API.G_TRUE THEN
12948         QP_PREQ_GRP.engine_debug('QP_PREQ_PUB.Populate_Output: '|| SQLERRM);
12949       END IF;
12950       x_return_status := FND_API.G_RET_STS_ERROR;
12951       x_return_status_text := 'QP_PREQ_PUB.Populate_Output: '|| SQLERRM;
12952   END Populate_Output;
12953 
12954 
12955 
12956 
12957   PROCEDURE PRICE_REQUEST
12958   (p_line_tbl IN QP_PREQ_GRP.LINE_TBL_TYPE,
12959    p_qual_tbl IN QP_PREQ_GRP.QUAL_TBL_TYPE,
12960    p_line_attr_tbl IN QP_PREQ_GRP.LINE_ATTR_TBL_TYPE,
12961    p_line_detail_tbl IN QP_PREQ_GRP.LINE_DETAIL_TBL_TYPE,
12962    p_line_detail_qual_tbl IN QP_PREQ_GRP.LINE_DETAIL_QUAL_TBL_TYPE,
12963    p_line_detail_attr_tbl IN QP_PREQ_GRP.LINE_DETAIL_ATTR_TBL_TYPE,
12964    p_related_lines_tbl IN QP_PREQ_GRP.RELATED_LINES_TBL_TYPE,
12965    p_control_rec IN QP_PREQ_GRP.CONTROL_RECORD_TYPE,
12966    x_line_tbl OUT NOCOPY QP_PREQ_GRP.LINE_TBL_TYPE,
12967    x_line_qual OUT NOCOPY QP_PREQ_GRP.QUAL_TBL_TYPE,
12968    x_line_attr_tbl OUT NOCOPY QP_PREQ_GRP.LINE_ATTR_TBL_TYPE,
12969    x_line_detail_tbl OUT NOCOPY QP_PREQ_GRP.LINE_DETAIL_TBL_TYPE,
12970    x_line_detail_qual_tbl OUT NOCOPY QP_PREQ_GRP.LINE_DETAIL_QUAL_TBL_TYPE,
12971    x_line_detail_attr_tbl OUT NOCOPY QP_PREQ_GRP.LINE_DETAIL_ATTR_TBL_TYPE,
12972    x_related_lines_tbl OUT NOCOPY QP_PREQ_GRP.RELATED_LINES_TBL_TYPE,
12973    x_return_status OUT NOCOPY VARCHAR2,
12974    x_return_status_text OUT NOCOPY VARCHAR2
12975    ) IS
12976 
12977   PRICE_REQUEST_EXC EXCEPTION;
12978   E_BYPASS_PRICING EXCEPTION;
12979   E_DEBUG_ROUTINE_ERROR EXCEPTION;
12980   --added by yangli for Java Engine projecct 3086881
12981   E_ROUTINE_ERRORS EXCEPTION;
12982   Pricing_Exception EXCEPTION;
12983   JAVA_ENGINE_PRICING_EXCEPTION EXCEPTION;
12984   --added by yangli for Java Engine projecct 3086881
12985   E_NO_LINES_TO_PRICE EXCEPTION; -- 4865787
12986 
12987   l_control_rec QP_PREQ_GRP.CONTROL_RECORD_TYPE;
12988 
12989   l_routine VARCHAR2(50) := 'Routine: QP_PREQ_PUB.PRICE_REQUEST';
12990   l_output_file VARCHAR2(240);
12991 
12992   i PLS_INTEGER;
12993   j PLS_INTEGER;
12994 
12995   /*
12996 INDX,QP_PREQ_PUB.price_request.lcur1,qp_npreq_ldets_tmp_N3,LINE_INDEX,1
12997 INDX,QP_PREQ_PUB.price_request.lcur1,qp_npreq_ldets_tmp_N3,PRICING_STATUS_CODE,4
12998 */
12999   CURSOR lcur1 IS
13000     SELECT    ldet.created_from_list_line_id
13001             , line.line_index line_ind
13002             , line.price_flag
13003             , line.process_status
13004             , ldet.applied_flag
13005             , ldet.pricing_status_code
13006             , ldet.line_detail_index
13007             , ldet.process_code
13008             , ldet.automatic_flag
13009             , ldet.override_flag
13010             , line.unit_price
13011             , line.adjusted_unit_price
13012             , ldet.updated_flag
13013             , ldet.calculation_code
13014             , line.qualifiers_exist_flag
13015             , ldet.pricing_group_sequence bucket
13016     FROM qp_npreq_ldets_tmp ldet, qp_npreq_lines_tmp line
13017     WHERE line.line_index = ldet.line_index
13018     ORDER BY line_ind;
13019 
13020   --3169430
13021   CURSOR modifier_exists IS
13022     SELECT 'X'
13023     FROM
13024     QP_LIST_LINES A
13025     WHERE A.PRICING_PHASE_ID >1
13026     AND modifier_level_code IN ('LINE', 'LINEGROUP', 'ORDER')
13027     AND ROWNUM = 1;
13028 
13029   lrec1 lcur1%ROWTYPE;
13030   l_debug_switch CONSTANT VARCHAR2(30) := 'QP_DEBUG';
13031   l_return_status VARCHAR2(240);
13032   l_return_status_text VARCHAR2(240);
13033   l_pricing_event VARCHAR2(240);
13034   l_pricing_start_time NUMBER;
13035   l_pricing_end_time NUMBER;
13036   l_time_difference NUMBER;
13037   l_pricing_start_redo NUMBER;
13038   l_pricing_end_redo NUMBER;
13039   l_redo_difference NUMBER;
13040   l_request_type_code VARCHAR2(30);
13041   l_time_stats VARCHAR2(240);
13042   l_mod VARCHAR2(1);
13043   --added by yangli for JAVA ENGINE 3086881
13044   l_request_id NUMBER;
13045   l_status_text VARCHAR2(240);
13046   l_cleanup_flag VARCHAR2(1) := QP_PREQ_PUB.G_YES;
13047   --added by yangli for JAVA ENGINE 3086881
13048   l_no_of_lines NUMBER; -- 4865787
13049 
13050 --added for moac
13051   l_default_org_id NUMBER;
13052 --perf fix for bug 7309551 smbalara
13053   l_dynamic_sampling_level NUMBER :=0;
13054   l_old_dynamic_sampling_level NUMBER :=0;
13055   BEGIN
13056 	qp_debug_util.tstart(x_Marker=>'ENGINE_CALL_QPXPPREB',x_Desc=>'QPXPPREB Price Request for Event : '||p_control_rec.PRICING_EVENT,x_PutLine=>true);
13057 
13058     --===============START: Pre-pricing process needed by JAVA and PL/SQL engine====
13059     -- Set the debug variable G_DEBUG_ENGINE in QP_PREQ_GRP
13060     QP_PREQ_GRP.Set_QP_Debug;
13061     G_QP_DEBUG := FND_PROFILE.VALUE(l_debug_switch); --3085171
13062 
13063     l_debug := QP_PREQ_GRP.G_DEBUG_ENGINE;
13064     l_pricing_start_time := dbms_utility.get_time;
13065 
13066     /* 4865787: error out if there are no lines to be priced */
13067     IF nvl(p_control_rec.temp_table_insert_flag, G_YES) = G_NO
13068     THEN
13069       -- temp table/direct insert path
13070       select count(*) into l_no_of_lines
13071       from qp_npreq_lines_tmp;
13072     ELSE
13073       -- PL/SQL table path
13074       l_no_of_lines := p_line_tbl.count;
13075     END IF;
13076 
13077     IF l_no_of_lines = 0 THEN
13078       RAISE E_NO_LINES_TO_PRICE;
13079     END IF;
13080     /* 4865787 */
13081 
13082     --moved down, since specific to only PL/SQL engine
13083     /*-- Changes made for bug 3169430 Customer Handleman as this customer has price lists only, no modifiers.
13084   open modifier_exists;
13085   fetch modifier_exists into l_mod;
13086   IF modifier_exists%NOTFOUND THEN
13087         G_NO_ADJ_PROCESSING := G_NO;
13088   ELSE
13089         G_NO_ADJ_PROCESSING := G_YES;
13090   END IF;
13091   CLOSE modifier_exists;
13092   */
13093     ----------------------------------------------------
13094     --setting time
13095     ----------------------------------------------------
13096     IF G_QP_DEBUG = G_ENGINE_TIME_TRACE_ON THEN --3085171
13097       --  l_pricing_start_time := dbms_utility.get_time;
13098       --added to note redo generation
13099       BEGIN
13100         SELECT VALUE INTO l_pricing_start_redo
13101        FROM v$mystat, v$statname
13102        WHERE v$mystat.statistic# = v$statname.statistic#
13103        AND v$statname.name = 'redo size';
13104       EXCEPTION
13105         WHEN OTHERS THEN
13106           IF l_debug = FND_API.G_TRUE THEN
13107             QP_PREQ_GRP.engine_debug('Error in looking up debug in PUB '|| SQLERRM);
13108           END IF; -- Bug No 4033618
13109       END;
13110     END IF;
13111 
13112     --MOVED TO HERE SINCE BOTH JAVA ENGINE AND PL/SQL ENGINE NEED by yangli
13113     --ASO is not passing request_type_code on control_rec, it is passed
13114     --on the lines
13115     IF p_control_rec.request_type_code IS NULL THEN
13116       l_request_type_code := p_LINE_tbl(1).request_type_code;
13117     END IF; --p_control_rec.request_type_code
13118 
13119     l_control_rec := p_control_rec;
13120 
13121     --added for moac
13122     --Initialize MOAC and set org context to Org passed in nvl(p_control_rec.org_id, mo_default_org_id)
13123     --so that the pricing engine will look at data specific to the
13124     --passed org or mo_default_org plus global data only
13125 
13126     IF MO_GLOBAL.get_access_mode is null THEN
13127       MO_GLOBAL.Init('QP');
13128       l_control_rec.org_id := nvl(p_control_rec.org_id, QP_UTIL.get_org_id);
13129       MO_GLOBAL.set_policy_context('S', l_control_rec.org_id);
13130     END IF;--MO_GLOBAL
13131 
13132     --OC used to pass request_type_code only on the lines tbl
13133     l_control_rec.request_type_code := nvl(p_control_rec.request_type_code,
13134                                            l_request_type_code);
13135     G_CHECK_CUST_VIEW_FLAG := nvl(p_control_rec.check_cust_view_flag, G_NO);
13136     --3401941
13137     G_CALCULATE_FLAG := nvl(l_control_rec.CALCULATE_FLAG, 'NULL');
13138     G_REQUEST_TYPE_CODE := l_control_rec.request_type_code;
13139 
13140     --this is added for the FTE get_freight functionality to return adj
13141     --from the freight charge phases
13142     G_GET_FREIGHT_FLAG := nvl(l_control_rec.get_freight_flag, G_NO);
13143 
13144     -- for QP-PO integration
13145     IF l_debug = FND_API.G_TRUE THEN
13146       QP_PREQ_GRP.engine_debug('G_REQUEST_TYPE_CODE = ' || G_REQUEST_TYPE_CODE);
13147     END IF;
13148 
13149     IF G_REQUEST_TYPE_CODE IN ('PO', 'ICX') THEN
13150       IF G_LICENSED_FOR_PRODUCT IS NULL THEN
13151         G_LICENSED_FOR_PRODUCT := nvl(fnd_profile.VALUE('QP_LICENSED_FOR_PRODUCT'), 'ZZZZZZ');
13152       END IF;
13153 
13154       IF l_debug = FND_API.G_TRUE THEN
13155         QP_PREQ_GRP.engine_debug('G_LICENSED_FOR_PRODUCT = ' || G_LICENSED_FOR_PRODUCT);
13156       END IF;
13157 
13158       IF G_LICENSED_FOR_PRODUCT = 'PO' THEN
13159         NULL;
13160       ELSE
13161         x_return_status := FND_API.G_RET_STS_ERROR;
13162         FND_MESSAGE.SET_NAME('QP', 'QP_NOT_LICENSED_PO');
13163         x_return_status_text := FND_MESSAGE.get;
13164         RETURN;
13165       END IF;
13166     END IF;
13167 
13168     -- for QP-CMRO integration
13169     IF G_REQUEST_TYPE_CODE = 'AHL' THEN
13170       IF G_LICENSED_FOR_PRODUCT IS NULL THEN
13171         G_LICENSED_FOR_PRODUCT := nvl(fnd_profile.VALUE('QP_LICENSED_FOR_PRODUCT'), 'ZZZZZZ');
13172       END IF;
13173 
13174       IF l_debug = FND_API.G_TRUE THEN
13175         QP_PREQ_GRP.engine_debug('G_LICENSED_FOR_PRODUCT = ' || G_LICENSED_FOR_PRODUCT);
13176       END IF;
13177 
13178       IF G_LICENSED_FOR_PRODUCT = 'AHL' THEN
13179         NULL;
13180       ELSE
13181         x_return_status := FND_API.G_RET_STS_ERROR;
13182         FND_MESSAGE.SET_NAME('QP', 'QP_NOT_LICENSED_CMRO');
13183         x_return_status_text := FND_MESSAGE.get;
13184         RETURN;
13185       END IF;
13186     END IF;
13187 
13188     IF (G_QP_DEBUG = G_YES) OR
13189       (G_QP_DEBUG = G_DONT_WRITE_TO_DEBUG) THEN -- If Debug is on
13190 
13191       -- A call to QP_COPY_DEBUG_PVT.Generate_Debug_Req_Seq to initialize Global Variables
13192       QP_COPY_DEBUG_PVT.Generate_Debug_Req_Seq(l_return_status,
13193                                                l_return_status_text);
13194       x_return_status := l_return_status;
13195       x_return_status_text := l_return_status_text;
13196       IF x_return_status = FND_API.G_RET_STS_ERROR THEN
13197         RAISE E_DEBUG_ROUTINE_ERROR;
13198       END IF;
13199 
13200     END IF;
13201     --MOVED TO HERE SINCE BOTH JAVA ENGINE AND PL/SQL ENGINE NEED by yangli
13202     --===========END: Pre-pricing process needed by JAVA and PL/SQL engine=========
13203 
13204     --ADDED BY YANGLI FOR JAVA ENGINE PUB 3086881
13205     IF QP_JAVA_ENGINE_UTIL_PUB.Java_Engine_Running = 'N' THEN
13206       --===========START: Globals Initialization specific only to PL/SQL Engine=======
13207       IF l_debug = FND_API.G_TRUE THEN
13208         QP_PREQ_GRP.ENGINE_DEBUG('01 Java Engine not Installed ----------');
13209       END IF;
13210 
13211       -- Changes made for bug 3169430 Customer Handleman as this customer has price lists only, no modifiers.
13212       OPEN modifier_exists;
13213       FETCH modifier_exists INTO l_mod;
13214       IF modifier_exists%NOTFOUND THEN
13215         G_NO_ADJ_PROCESSING := G_NO;
13216       ELSE
13217         G_NO_ADJ_PROCESSING := G_YES;
13218       END IF;
13219       CLOSE modifier_exists;
13220 
13221       ----------------------------------------------------
13222       --setting debug level
13223       ----------------------------------------------------
13224       --QP_PREQ_GRP.G_DEBUG_ENGINE:= oe_debug_pub.G_DEBUG;
13225       ----------------------------------------------------
13226       --New QP profile to say whether to round adjustment_amt or selling/list_price
13227       --default to 'Y' if the profile or rounding_flag are null
13228       -- QP Profile QP_SELLING_PRICE_ROUNDING_OPTIONS
13229       --Values for the profile:
13230       --NO_ROUND - No rounding  :
13231       --        Selling Price = unrounded list price + unrounded adjustments;
13232       --ROUND_ADJ - Round Selling Price and adjustments :
13233       --        Selling Price = round(list price) + round(adjustments);
13234       --NO_ROUND_ADJ - Round Selling Price after adding unrounded list price and adjustments :
13235       --        Selling price = round(list _price + adjustments);
13236       --Rounding Option Changes:
13237       --Control Record Variable mapping to profile for backword compatibility.
13238       --    NULL - ROUND_ADJ for non-ASO req_type and look at the QP profile for ASO
13239       --    Y - ROUND_ADJ
13240       --    N - NO_ROUND
13241       --    U - NO_ROUND_ADJ
13242       --    Q - look at the QP profile
13243       --Change for 2635440 - pass 'Q' as default value for OC if request_type is 'ASO'
13244       ----------------------------------------------------
13245       G_ROUNDING_OPTIONS := FND_PROFILE.VALUE('QP_SELLING_PRICE_ROUNDING_OPTIONS');
13246       IF (l_debug = FND_API.G_TRUE) THEN
13247         QP_PREQ_GRP.engine_debug('Rounding profile value '|| G_ROUNDING_OPTIONS);
13248       END IF;
13249 
13250       /*--ASO is not passing request_type_code on control_rec, it is passed
13251 --on the lines
13252 IF p_control_rec.request_type_code IS NULL THEN
13253   l_request_type_code := p_LINE_tbl(1).request_type_code;
13254 END IF;--p_control_rec.request_type_code
13255 
13256 l_control_rec := p_control_rec;
13257 --OC used to pass request_type_code only on the lines tbl
13258 l_control_rec.request_type_code := nvl(p_control_rec.request_type_code,
13259                                             l_request_type_code);
13260 G_REQUEST_TYPE_CODE := l_control_rec.request_type_code;
13261 */ --moved to top since both PL/SQL path and Java Engine path need.
13262 
13263       /*--this is added for the FTE get_freight functionality to return adj
13264 --from the freight charge phases
13265 G_GET_FREIGHT_FLAG := nvl(l_control_rec.get_freight_flag, G_NO);
13266 */ --moved to top since needed by both PL/SQL and Java Engine
13267 
13268       -- Added new profile (QP_MULTI_CURRENCY_USAGE) with default value 'N' to maintain
13269       -- current behaviour,bug 2943033
13270       IF p_control_rec.use_multi_currency = 'Y' THEN
13271         G_USE_MULTI_CURRENCY_PUB := p_control_rec.use_multi_currency;
13272       ELSE
13273         G_USE_MULTI_CURRENCY_PUB := nvl(fnd_profile.VALUE('QP_MULTI_CURRENCY_USAGE'), 'N');
13274         l_control_rec.use_multi_currency := G_USE_MULTI_CURRENCY_PUB;
13275       END IF;
13276 
13277       IF nvl(p_control_rec.rounding_flag, G_YES) = G_ROUNDING_PROFILE
13278         THEN
13279         G_ROUND_INDIVIDUAL_ADJ := nvl(G_ROUNDING_OPTIONS, G_NO_ROUND);
13280       ELSIF nvl(p_control_rec.rounding_flag, G_YES) = G_YES
13281         THEN
13282         --this is done for bug 2635440 for OC to default the rounding_flag to 'Q'
13283         --to look at the profile for rounding if the rounding_flag is null
13284         --in the pl/sql code path. OC will pass Q for direct insert path
13285         IF G_REQUEST_TYPE_CODE = 'ASO'
13286           AND nvl(p_control_rec.temp_table_insert_flag, G_YES) = G_YES
13287           AND p_control_rec.rounding_flag IS NULL THEN
13288           G_ROUND_INDIVIDUAL_ADJ := nvl(G_ROUNDING_OPTIONS, G_NO_ROUND);
13289         ELSE
13290           G_ROUND_INDIVIDUAL_ADJ := G_ROUND_ADJ;
13291         END IF; --l_control_rec.request_type_code
13292       ELSIF nvl(p_control_rec.rounding_flag, G_YES) = G_NO
13293         THEN
13294         G_ROUND_INDIVIDUAL_ADJ := G_NO_ROUND;
13295       ELSIF nvl(p_control_rec.rounding_flag, G_YES) = 'U'
13296         THEN
13297         G_ROUND_INDIVIDUAL_ADJ := G_NO_ROUND_ADJ;
13298       ELSIF nvl(p_control_rec.rounding_flag, G_YES) = 'P' --[prarasto:Post Round] added condition to update
13299                                                           --G_ROUND_INDIVIDUAL_ADJ for post rounding
13300         THEN
13301         G_ROUND_INDIVIDUAL_ADJ := G_POST_ROUND;
13302       END IF;
13303 
13304       -- The below code is replaced with QP_PREQ_GRP.Set_QP_Debug
13305 
13306       --getting debug profilE
13307       ----------------------------------------------------
13308       --G_QP_DEBUG := FND_PROFILE.VALUE(l_debug_switch);   --3085171
13309       ----------------------------------------------------
13310 
13311       /* ----------------------------------------------------
13312 
13313  -- Introduced for facilitating debugging for non OM Applications
13314 IF (NOT OE_DEBUG_PUB.ISDebugOn) THEN --If om debug is not on , then only look at
13315                                      --qp_debug
13316 
13317  IF (G_QP_DEBUG = G_YES) OR
13318     (G_QP_DEBUG = G_DONT_WRITE_TO_DEBUG) THEN  -- If Debug is on
13319   oe_debug_pub.SetDebugLevel(10);
13320   oe_debug_pub.Initialize;
13321   oe_debug_pub.debug_on;
13322   l_output_file := oe_debug_pub.Set_Debug_Mode('FILE');
13323   IF l_debug = FND_API.G_TRUE THEN
13324   QP_PREQ_GRP.engine_debug ('The output file is : ' || l_output_file );
13325   END IF;
13326   QP_PREQ_GRP.G_DEBUG_ENGINE:= FND_API.G_TRUE;
13327  ELSE
13328   QP_PREQ_GRP.G_DEBUG_ENGINE:= FND_API.G_FALSE;
13329  END IF;
13330 ELSE
13331  QP_PREQ_GRP.G_DEBUG_ENGINE:= FND_API.G_TRUE;
13332 END IF;
13333 
13334 */
13335 
13336       --MOVED UP TO BOTH JAVA AND PL/SQL ENGINE PATH by yangli
13337       /* IF (G_QP_DEBUG = G_YES) OR
13338     (G_QP_DEBUG = G_DONT_WRITE_TO_DEBUG) THEN  -- If Debug is on
13339 
13340   -- A call to QP_COPY_DEBUG_PVT.Generate_Debug_Req_Seq to initialize Global Variables
13341   QP_COPY_DEBUG_PVT.Generate_Debug_Req_Seq(l_return_status,
13342                                            l_return_status_text);
13343   x_return_status := l_return_status;
13344   x_return_status_text := l_return_status_text;
13345   IF x_return_status = FND_API.G_RET_STS_ERROR THEN
13346      RAISE E_DEBUG_ROUTINE_ERROR;
13347   END IF;
13348 
13349  END IF;
13350 */
13351 
13352       --GSA Check
13353       IF l_debug = FND_API.G_TRUE THEN
13354         QP_PREQ_GRP.ENGINE_DEBUG('PRICE REQUEST PUB: Begin GSA check ');
13355       END IF;
13356       G_GSA_INDICATOR := Check_GSA_Indicator;
13357       IF l_debug = FND_API.G_TRUE THEN
13358         QP_PREQ_GRP.ENGINE_DEBUG('PRICE REQUEST PUB: GSA_indicator '|| G_GSA_INDICATOR);
13359         QP_PREQ_GRP.ENGINE_DEBUG('PRICE REQUEST PUB: GSA_profile '|| G_GSA_ENABLED_FLAG);
13360 
13361       END IF;
13362       G_GSA_CHECK_FLAG := nvl(p_control_rec.GSA_CHECK_FLAG, G_YES);
13363       G_GSA_ENABLED_FLAG := nvl(FND_PROFILE.VALUE(G_GSA_Max_Discount_Enabled), G_NO);
13364 
13365 
13366       IF l_debug = FND_API.G_TRUE THEN
13367         QP_PREQ_GRP.ENGINE_DEBUG('BEGIN PRICE REQUEST PUB: request_type_code '|| G_REQUEST_TYPE_CODE);
13368         QP_PREQ_GRP.ENGINE_DEBUG('BEGIN PRICE REQUEST PUB: check_cust_view_flag '|| G_check_cust_view_flag);
13369         QP_PREQ_GRP.ENGINE_DEBUG('BEGIN PRICE REQUEST PUB: round_indv_adj '|| G_ROUND_INDIVIDUAL_ADJ);
13370 
13371       END IF;
13372       --===========END: Globals Initialization specific only to PL/SQL Engine=======
13373     END IF; --java engine is not installed
13374 
13375     --============START: Debug print needed by JAVA and PL/SQL Engine=====
13376     IF l_debug = FND_API.G_TRUE THEN
13377       QP_PREQ_GRP.ENGINE_DEBUG('BEGIN PRICE REQUEST PUB: Version '|| Get_Version);
13378       QP_PREQ_GRP.ENGINE_DEBUG('BEGIN PRICE REQUEST PUB: temp table insert flag '|| p_control_rec.temp_table_insert_flag);
13379       QP_PREQ_GRP.ENGINE_DEBUG('BEGIN PRICE REQUEST PUB: calculate_flag '|| p_control_rec.calculate_flag);
13380       QP_PREQ_GRP.ENGINE_DEBUG('BEGIN PRICE REQUEST PUB: check_cust_view_flag '|| p_control_rec.check_cust_view_flag ||' reqtype '|| l_control_rec.request_type_code);
13381       QP_PREQ_GRP.ENGINE_DEBUG('BEGIN PRICE REQUEST PUB: pricing_event '|| p_control_rec.pricing_event);
13382       QP_PREQ_GRP.ENGINE_DEBUG('BEGIN PRICE REQUEST PUB: rounding_flag '|| p_control_rec.rounding_flag);
13383       QP_PREQ_GRP.ENGINE_DEBUG('BEGIN PRICE REQUEST PUB: gsa_check '|| p_control_rec.gsa_check_flag);
13384       QP_PREQ_GRP.ENGINE_DEBUG('BEGIN PRICE REQUEST PUB: full_pricing '|| p_control_rec.full_pricing_call);
13385       QP_PREQ_GRP.ENGINE_DEBUG('BEGIN PRICE REQUEST PUB: get_freight_flag '|| G_GET_FREIGHT_FLAG);
13386     END IF;
13387     --============END: Debug print needed by JAVA and PL/SQL Engine=====
13388 
13389     /*
13390 --GSA Check
13391 IF l_debug = FND_API.G_TRUE THEN
13392 QP_PREQ_GRP.ENGINE_DEBUG('PRICE REQUEST PUB: Begin GSA check ');
13393 END IF;
13394 G_GSA_INDICATOR := Check_GSA_Indicator;
13395 IF l_debug = FND_API.G_TRUE THEN
13396 QP_PREQ_GRP.ENGINE_DEBUG('PRICE REQUEST PUB: GSA_indicator '||G_GSA_INDICATOR);
13397 QP_PREQ_GRP.ENGINE_DEBUG('PRICE REQUEST PUB: GSA_profile '||G_GSA_ENABLED_FLAG);
13398 
13399 END IF;
13400 G_GSA_CHECK_FLAG := nvl(p_control_rec.GSA_CHECK_FLAG, G_YES);
13401 G_GSA_ENABLED_FLAG := nvl(FND_PROFILE.VALUE(G_GSA_Max_Discount_Enabled), G_NO);
13402 
13403 
13404 IF l_debug = FND_API.G_TRUE THEN
13405 QP_PREQ_GRP.ENGINE_DEBUG('BEGIN PRICE REQUEST PUB: request_type_code '||G_REQUEST_TYPE_CODE);
13406 QP_PREQ_GRP.ENGINE_DEBUG('BEGIN PRICE REQUEST PUB: check_cust_view_flag '||G_check_cust_view_flag);
13407 QP_PREQ_GRP.ENGINE_DEBUG('BEGIN PRICE REQUEST PUB: round_indv_adj '||G_ROUND_INDIVIDUAL_ADJ);
13408 
13409 END IF;
13410 */ --moved up into PL/SQL Engine specific path
13411 
13412     --===========START: l_control_record needed by JAVA and PL/SQL Engine===
13413     --to convert multiple events passed as string to a readable format
13414     --to remove the commas and single quotes in the pricing_event in ctrl rec
13415     IF instr(l_control_rec.pricing_event, ',') > 0
13416       THEN
13417       IF l_debug = FND_API.G_TRUE THEN
13418         QP_PREQ_GRP.ENGINE_DEBUG('BEGIN PRICE REQUEST PUB: pricing_event '|| l_control_rec.pricing_event);
13419       END IF;
13420       --Changes for bug 2258525: Introduced local vairable l_pricing_event
13421       --instead of changing the control_rec
13422       --this is to remove any blank spaces in the string
13423       l_pricing_event := REPLACE(l_control_rec.pricing_event,' ', '');
13424       --this is to remove any single quotes in the string
13425       l_pricing_event := REPLACE(l_pricing_event, '''', '');
13426     ELSE
13427       l_pricing_event := l_control_rec.pricing_event;
13428     END IF;
13429 
13430     --this is to make the cursor work for the last event
13431     l_pricing_event := l_pricing_event || ',';
13432     l_control_rec.pricing_event := l_pricing_event;
13433     IF l_debug = FND_API.G_TRUE THEN
13434       QP_PREQ_GRP.ENGINE_DEBUG('BEGIN PRICE REQUEST PUB: pricing_event '|| l_control_rec.pricing_event);
13435     END IF;
13436     l_control_rec.GSA_DUP_CHECK_FLAG := G_NO;
13437     l_control_rec.temp_table_insert_flag :=
13438     nvl(p_control_rec.temp_table_insert_flag, G_YES);
13439     l_control_rec.public_api_call_flag := G_YES;
13440     l_control_rec.check_cust_view_flag := nvl(p_control_rec.check_cust_view_flag, G_NO);
13441 
13442     --changes for bug 2635440
13443     --default rounding_flag to 'Q' when called by ASO/OC and 'Y' otherwise
13444     IF p_control_rec.rounding_flag IS NULL
13445       AND l_control_rec.temp_table_insert_flag = G_YES
13446       AND G_REQUEST_TYPE_CODE = 'ASO' THEN
13447       l_control_rec.rounding_flag := G_ROUNDING_PROFILE;
13448     ELSE
13449       l_control_rec.rounding_flag := nvl(p_control_rec.rounding_flag, G_YES);
13450     END IF; --p_control_rec.rounding_flag
13451 
13452     -- Added for Bug 2847866
13453     QP_PREQ_GRP.G_PUBLIC_API_CALL_FLAG := nvl(l_control_rec.public_api_call_flag, 'N');
13454     --============END: l_control_rec needed by JAVA and PL/SQL Engine====
13455 
13456     IF QP_JAVA_ENGINE_UTIL_PUB.Java_Engine_Running = 'N' THEN
13457       --===========START: specific only to PL/SQL Engine=======
13458       IF l_debug = FND_API.G_TRUE THEN
13459         QP_PREQ_GRP.ENGINE_DEBUG('02 Java Engine not Installed ----------');
13460       END IF;
13461       -----------------------------------------------------------------
13462       --Need to set the global constants for the engine to see
13463       --if the calling application populates into the temp tables directly
13464       -----------------------------------------------------------------
13465 
13466       --initialize for usage_pricing and OM calls
13467       IF l_control_rec.temp_table_insert_flag = G_NO THEN
13468         --removing this for bug 2830206 as calculate_flag can be 'Y', 'C' or 'N'.
13469         --l_control_rec.calculate_flag := G_SEARCH_ONLY;
13470 
13471         /*-- Added for Bug 2847866
13472 QP_PREQ_GRP.G_PUBLIC_API_CALL_FLAG:=nvl(l_control_rec.public_api_call_flag,'N');*/--moved above, needed by Java and PL/SQL Engine
13473 
13474         IF (G_NO_ADJ_PROCESSING = G_YES) AND (G_QP_INSTALL_STATUS = 'I') THEN -- Added for 3169430
13475           Identify_freegood_lines(l_control_rec.pricing_event
13476                                   , x_return_status, x_return_status_text);
13477 
13478           IF x_return_status = FND_API.G_RET_STS_ERROR THEN
13479             IF l_debug = FND_API.G_TRUE THEN
13480               QP_PREQ_GRP.ENGINE_DEBUG('Exception Initialize_cons: '
13481                                        || x_return_status_text);
13482             END IF;
13483             RAISE PRICE_REQUEST_EXC;
13484           END IF; --x_return_status
13485         END IF;
13486         Initialize_constants(
13487                              l_control_rec
13488                              , x_return_status_text
13489                              , x_return_status);
13490 
13491         IF X_RETURN_STATUS = FND_API.G_RET_STS_ERROR THEN
13492 
13493           IF l_debug = FND_API.G_TRUE THEN
13494             QP_PREQ_GRP.ENGINE_DEBUG('Exception Initialize_cons: '|| x_return_status_text);
13495           END IF;
13496           RAISE PRICE_REQUEST_EXC;
13497         ELSIF X_RETURN_STATUS = 'BYPASS_PRICING'
13498           THEN
13499           RAISE E_BYPASS_PRICING;
13500         END IF;
13501       END IF;
13502       --=======END: Specific only to PL/SQL Engine==================
13503     END IF; --java engine is not installed by yangli for Java Engine PUB 3086881
13504 
13505     --added by yangli for Java Engine PUB 3086881
13506     IF QP_JAVA_ENGINE_UTIL_PUB.Java_Engine_Running = 'N' THEN
13507       --=======START: Specific only to PL/SQL Engine==================
13508       IF l_debug = FND_API.G_TRUE THEN
13509         QP_PREQ_GRP.ENGINE_DEBUG('03 Java Engine not Installed ----------');
13510       END IF;
13511       --added by yangli for Java Engine PUB 3086881
13512       IF l_control_rec.calculate_flag IN
13513         (QP_PREQ_GRP.G_SEARCH_N_CALCULATE, QP_PREQ_GRP.G_SEARCH_ONLY)
13514         THEN
13515 
13516 	--Performance bug fix 7309551
13517             BEGIN
13518             SELECT VALUE INTO l_old_dynamic_sampling_level
13519              FROM v$parameter
13520              WHERE name = 'optimizer_dynamic_sampling';
13521             IF l_debug = FND_API.G_TRUE THEN
13522                 QP_PREQ_GRP.engine_debug('Default Dynamic sampling Level :'|| l_old_dynamic_sampling_level);
13523             END IF;
13524             l_dynamic_sampling_level := TO_NUMBER(NVL(FND_PROFILE.VALUE(G_DYNAMIC_SAMPLING_LEVEL),1));
13525             IF l_debug = FND_API.G_TRUE THEN
13526                 QP_PREQ_GRP.engine_debug('QP Profile Dynamic sampling level :'|| l_dynamic_sampling_level);
13527             END If;
13528             EXCEPTION
13529             WHEN OTHERS THEN
13530                 IF l_debug = FND_API.G_TRUE THEN
13531                     QP_PREQ_GRP.engine_debug('Error in looking up Dynamic sampling level '|| SQLERRM);
13532                     QP_PREQ_GRP.engine_debug('Setting Dynamic Sampling level to 1');
13533                 END IF;
13534                 l_dynamic_sampling_level := 1;
13535             END;
13536 
13537             IF (l_dynamic_sampling_level IN (1) AND l_dynamic_sampling_level <> l_old_dynamic_sampling_level) THEN
13538                 IF l_debug = FND_API.G_TRUE THEN
13539                     QP_PREQ_GRP.ENGINE_DEBUG('Setting dynamic sampling level to '|| l_dynamic_sampling_level);
13540                 END IF;
13541                 BEGIN
13542                 Execute immediate 'Alter session set optimizer_dynamic_sampling = '||l_dynamic_sampling_level;
13543                 EXCEPTION
13544                 WHEN OTHERS THEN
13545                   IF l_debug = FND_API.G_TRUE THEN
13546                     QP_PREQ_GRP.engine_debug('Error in setting dynamic sampling level'|| SQLERRM);
13547                   END IF;
13548                 END;
13549             END IF;
13550 	----7309551
13551 
13552         --Call pricing engine only if calculate flag is search_only or search and calculate
13553         QP_PREQ_GRP.PRICE_REQUEST
13554         (p_line_tbl => p_line_tbl,
13555          p_qual_tbl => p_qual_tbl,
13556          p_line_attr_tbl => p_line_attr_tbl,
13557          p_LINE_DETAIL_tbl => p_line_detail_tbl,
13558          p_LINE_DETAIL_qual_tbl => p_line_detail_qual_tbl,
13559          p_LINE_DETAIL_attr_tbl => p_line_detail_attr_tbl,
13560          p_related_lines_tbl => p_related_lines_tbl,
13561          p_control_rec => l_control_rec,
13562          x_line_tbl => x_line_tbl,
13563          x_line_qual => x_line_qual,
13564          x_line_attr_tbl => x_line_attr_tbl,
13565          x_line_detail_tbl => x_line_detail_tbl,
13566          x_line_detail_qual_tbl => x_line_detail_qual_tbl,
13567          x_line_detail_attr_tbl => x_line_detail_attr_tbl,
13568          x_related_lines_tbl => x_related_lines_tbl,
13569          x_return_status => x_return_status,
13570          x_return_status_text => x_return_status_text
13571          );
13572       END IF;
13573 
13574 
13575       IF X_RETURN_STATUS IN (FND_API.G_RET_STS_ERROR
13576                              , FND_API.G_RET_STS_UNEXP_ERROR) THEN
13577 
13578         IF l_debug = FND_API.G_TRUE THEN
13579           QP_PREQ_GRP.ENGINE_DEBUG('Exception Price Request GRP: '|| x_return_status_text);
13580         END IF;
13581         RAISE PRICE_REQUEST_EXC;
13582       END IF;
13583 
13584       IF QP_PREQ_GRP.G_DEBUG_ENGINE = FND_API.G_TRUE THEN
13585         OPEN lcur1; LOOP
13586           FETCH lcur1 INTO lrec1;
13587           EXIT WHEN lcur1%NOTFOUND;
13588           IF l_debug = FND_API.G_TRUE THEN
13589             QP_PREQ_GRP.ENGINE_DEBUG('line_index '|| lrec1.line_ind ||
13590                                      ' list_line_id '|| lrec1.created_from_list_line_id ||
13591                                      ' line_detail_index '|| lrec1.line_detail_index ||
13592                                      ' pricess_sts '|| lrec1.process_status ||
13593                                      ' price_flag '|| lrec1.price_flag ||
13594                                      ' automatic '|| lrec1.automatic_flag ||' overr '|| lrec1.override_flag ||
13595                                      ' applied '|| lrec1.applied_flag ||' status '|| lrec1.pricing_status_code ||
13596                                      ' unitprice '|| lrec1.unit_price ||' adjprice '|| lrec1.adjusted_unit_price
13597                                      ||' process_code '|| lrec1.process_code ||' updated '|| lrec1.updated_flag
13598                                      ||' calc_code '|| lrec1.calculation_code ||' qualex '
13599                                      || lrec1.qualifiers_exist_flag ||
13600                                      ' bucket '|| nvl(lrec1.bucket, - 1));
13601           END IF;
13602         END LOOP;
13603         CLOSE lcur1;
13604       END IF;
13605 
13606       IF nvl(l_control_rec.temp_table_insert_flag, G_YES) = G_YES
13607         AND nvl(l_control_rec.check_cust_view_flag, G_NO) = G_NO
13608         AND nvl(Call_Usage_Pricing, G_NO) = G_YES
13609         THEN
13610         --rounding of list price will be taken care of in Calculate_price_pub
13611         Usage_pricing(l_control_rec.rounding_flag,
13612                       x_return_status, x_return_status_text);
13613 
13614         IF x_return_status IN (FND_API.G_RET_STS_ERROR
13615                                , FND_API.G_RET_STS_UNEXP_ERROR)
13616           THEN
13617           IF l_debug = FND_API.G_TRUE THEN
13618             QP_PREQ_GRP.ENGINE_DEBUG('Exception Price Request PUB: '
13619                                      || x_return_status_text);
13620           END IF;
13621           RAISE PRICE_REQUEST_EXC;
13622         END IF;
13623         Update_Qualifier_Value(x_return_status, x_return_status_text);
13624         IF x_return_status IN (FND_API.G_RET_STS_ERROR
13625                                , FND_API.G_RET_STS_UNEXP_ERROR)
13626           THEN
13627           IF l_debug = FND_API.G_TRUE THEN
13628             QP_PREQ_GRP.ENGINE_DEBUG('Exception Price Request PUB: '
13629                                      || x_return_status_text);
13630           END IF;
13631           RAISE PRICE_REQUEST_EXC;
13632         END IF;
13633 
13634       END IF;
13635       IF (G_NO_ADJ_PROCESSING = G_YES) AND (G_QP_INSTALL_STATUS = 'I') THEN -- Added for 3169430
13636         QP_PREQ_PUB.process_prg(x_return_status, x_return_status_text);
13637 
13638         IF x_return_status = FND_API.G_RET_STS_ERROR THEN
13639           RAISE PRICE_REQUEST_EXC;
13640         END IF; --x_return_status
13641       END IF;
13642 
13643       IF p_control_rec.calculate_flag IN
13644         (QP_PREQ_GRP.G_SEARCH_N_CALCULATE, QP_PREQ_GRP.G_CALCULATE_ONLY)
13645         AND nvl(l_control_rec.check_cust_view_flag, G_NO) = G_NO
13646         --this needs to be changed for OC and others who do direct insert
13647         AND nvl(l_control_rec.temp_table_insert_flag, G_YES) = G_YES
13648         THEN
13649         --call calculate portion only if calculate flag is calculate or
13650         --calculate and search and overridden adjustments exist
13651 
13652         Process_Adjustments(l_CONTROL_REC.PRICING_EVENT
13653                             , x_return_status
13654                             , x_return_status_text);
13655 
13656         IF X_RETURN_STATUS = FND_API.G_RET_STS_ERROR THEN
13657 
13658           IF l_debug = FND_API.G_TRUE THEN
13659             QP_PREQ_GRP.ENGINE_DEBUG('Exception Process_Adjustments: '|| x_return_status_text);
13660           END IF;
13661           RAISE PRICE_REQUEST_EXC;
13662         END IF;
13663       END IF;
13664 
13665 
13666       IF p_control_rec.calculate_flag IN
13667         (QP_PREQ_GRP.G_SEARCH_N_CALCULATE, QP_PREQ_GRP.G_CALCULATE_ONLY)
13668         AND nvl(l_control_rec.check_cust_view_flag, G_NO) = G_NO
13669         --this needs to be changed for OC and others who do direct insert
13670         AND nvl(l_control_rec.temp_table_insert_flag, G_YES) = G_YES
13671         THEN
13672         --call calculate portion only if calculate flag is calculate or
13673         --calculate and search and overridden adjustments exist
13674         Calculate_price(nvl(l_control_rec.rounding_flag, G_YES)
13675                         , x_return_status
13676                         , x_return_status_text);
13677 
13678         IF X_RETURN_STATUS = FND_API.G_RET_STS_ERROR THEN
13679 
13680           IF l_debug = FND_API.G_TRUE THEN
13681             QP_PREQ_GRP.ENGINE_DEBUG('Exception Calculate_price: '|| x_return_status_text);
13682           END IF;
13683           RAISE PRICE_REQUEST_EXC;
13684         END IF;
13685 
13686         -- begin 2892848 instructed to add this
13687         Update_Unit_Price (x_return_status
13688                            , x_return_status_text);
13689         IF X_RETURN_STATUS = FND_API.G_RET_STS_ERROR THEN
13690 
13691           IF l_debug = FND_API.G_TRUE THEN
13692             QP_PREQ_GRP.ENGINE_DEBUG('Exception Update_Unit_Price: '|| x_return_status_text);
13693           END IF; -- end debug
13694           RAISE PRICE_REQUEST_EXC;
13695         END IF;
13696         -- end 2892848
13697 
13698       END IF;
13699 
13700 
13701       IF p_control_rec.calculate_flag IN
13702         (QP_PREQ_GRP.G_SEARCH_N_CALCULATE, QP_PREQ_GRP.G_CALCULATE_ONLY)
13703         --and nvl(l_control_rec.check_cust_view_flag,G_NO) = G_YES
13704         --this needs to be changed for OC and others who do direct insert
13705         AND nvl(l_control_rec.temp_table_insert_flag, G_YES) = G_NO
13706         AND G_NO_ADJ_PROCESSING = G_YES -- Added for 3169430
13707         THEN
13708 
13709         --before doing calculation we need to populate g_buyline_price_flag
13710         Populate_buy_line_price_flag(x_return_status, x_return_status_text);
13711 
13712         IF x_return_status = FND_API.G_RET_STS_ERROR THEN
13713           IF l_debug = FND_API.G_TRUE THEN
13714             QP_PREQ_GRP.ENGINE_DEBUG('Exception Populate_buy_line_price_flag: '
13715                                      || x_return_status_text);
13716           END IF; --l_debug
13717           RAISE PRICE_REQUEST_EXC;
13718         END IF;
13719 
13720         Update_recurring_quantity(x_return_status, x_return_status_text);
13721 
13722         IF x_return_status = FND_API.G_RET_STS_ERROR THEN
13723           IF l_debug = FND_API.G_TRUE THEN
13724             QP_PREQ_GRP.ENGINE_DEBUG('Exception Update_recurring_quantity: '
13725                                      || x_return_status_text);
13726           END IF; --l_debug
13727           RAISE PRICE_REQUEST_EXC;
13728         END IF;
13729 
13730         IF G_QP_INSTALL_STATUS = 'I' THEN -- Added for 3169430
13731           Process_Coupon_issue(l_control_rec.pricing_event,
13732                                l_control_rec.simulation_flag,
13733                                x_return_status, x_return_status_text);
13734           IF x_return_status = FND_API.G_RET_STS_ERROR THEN
13735             IF l_debug = FND_API.G_TRUE THEN
13736               QP_PREQ_GRP.ENGINE_DEBUG('Exception Process_Coupon_issue: '
13737                                        || x_return_status_text);
13738             END IF; --debug
13739             RAISE PRICE_REQUEST_EXC;
13740           END IF;
13741         END IF; --G_QP_INSTALL_STATUS
13742 
13743         QP_CLEANUP_ADJUSTMENTS_PVT.fetch_adjustments
13744         (
13745          p_view_code => l_control_rec.view_code
13746          , p_event_code => l_control_rec.pricing_event
13747          , p_calculate_flag => l_control_rec.calculate_flag
13748          , p_rounding_flag => nvl(l_control_rec.rounding_flag, G_YES)
13749          , p_request_type_code => G_REQUEST_TYPE_CODE
13750          , x_return_status => x_return_status
13751          , x_return_status_text => x_return_status_text
13752          );
13753 
13754         --		Update_Child_Break_Lines(x_return_status,
13755         --					 x_return_status_text);
13756 
13757 
13758         IF X_RETURN_STATUS = FND_API.G_RET_STS_ERROR THEN
13759 
13760           IF l_debug = FND_API.G_TRUE THEN
13761             QP_PREQ_GRP.ENGINE_DEBUG('Exception Calculate_price: '|| x_return_status_text);
13762           END IF;
13763           RAISE PRICE_REQUEST_EXC;
13764         END IF;
13765         -- bug 3487840 - duplicate PBH child lines causing ORA-01427: single-row subquery returns more than one row
13766         Cleanup_rltd_lines(x_return_status, x_return_status_text);
13767         IF X_RETURN_STATUS = FND_API.G_RET_STS_ERROR THEN
13768           IF l_debug = FND_API.G_TRUE THEN
13769             QP_PREQ_GRP.ENGINE_DEBUG('Exception Cleanup_rltd_lines: '|| x_return_status_text);
13770           END IF;
13771           RAISE PRICE_REQUEST_EXC;
13772         END IF;
13773 
13774         Update_Adj_orderqty_cols(x_return_status, x_return_status_text);
13775         IF x_return_status = FND_API.G_RET_STS_ERROR THEN
13776           IF l_debug = FND_API.G_TRUE THEN
13777             QP_PREQ_GRP.ENGINE_DEBUG('Exception Update_Adj_orderqty_cols: '
13778                                      || x_return_status_text);
13779           END IF; --debug
13780           RAISE PRICE_REQUEST_EXC;
13781         END IF;
13782 
13783         --to check if new order level adj are inserted when changed
13784         --lines are passed
13785         IF l_control_rec.full_pricing_call = G_NO
13786           THEN
13787           IF l_debug = FND_API.G_TRUE THEN
13788             QP_PREQ_GRP.engine_debug('Starting changed lines check');
13789           END IF;
13790           CHECK_ORDER_LINE_CHANGES(p_request_type_code =>
13791                                    G_REQUEST_TYPE_CODE,
13792                                    p_full_pricing_call =>
13793                                    l_control_rec.full_pricing_call,
13794                                    x_return_status => x_return_status,
13795                                    x_return_status_text => x_return_status_text);
13796           IF X_RETURN_STATUS = FND_API.G_RET_STS_ERROR THEN
13797             IF l_debug = FND_API.G_TRUE THEN
13798               QP_PREQ_GRP.ENGINE_DEBUG('Exception CHECK_ORDER_LINE_CHANGES: '|| x_return_status_text);
13799             END IF;
13800             RAISE PRICE_REQUEST_EXC;
13801           END IF;
13802         END IF;
13803 
13804         --  Update_PRG_Process_status(x_return_status, x_return_status_text);
13805         IF x_return_status = FND_API.G_RET_STS_ERROR THEN
13806           IF l_debug = FND_API.G_TRUE THEN
13807             QP_PREQ_GRP.ENGINE_DEBUG('Exception Update_PRG_Process_status: '
13808                                      || x_return_status_text);
13809           END IF; --debug
13810           RAISE PRICE_REQUEST_EXC;
13811         END IF;
13812 
13813         --this needs to be done for OC/ASO as they pass in adj as G_STATUS_UNCHANGED
13814         /*
13815 indxno index used
13816 */
13817         UPDATE qp_npreq_ldets_tmp
13818                 SET pricing_status_code = G_STATUS_NEW
13819                         WHERE process_code = G_STATUS_NEW
13820         --changes for bug 2264566
13821         --changed to populate w/updated_flag = Y for child lines of manualPBH
13822                         AND (applied_flag = G_YES OR updated_flag = G_YES)
13823                         AND pricing_status_code = G_STATUS_UNCHANGED;
13824 
13825 
13826         IF QP_PREQ_GRP.G_DEBUG_ENGINE = FND_API.G_TRUE
13827           THEN
13828           Populate_Output(x_return_status, x_return_status);
13829 
13830           IF X_RETURN_STATUS = FND_API.G_RET_STS_ERROR
13831             THEN
13832             IF l_debug = FND_API.G_TRUE THEN
13833               QP_PREQ_GRP.ENGINE_DEBUG('Exception Populate_Output: '|| x_return_status_text);
13834             END IF;
13835             RAISE PRICE_REQUEST_EXC;
13836           END IF; --X_RETURN_STATUS
13837         END IF; --QP_PREQ_GRP.G_DEBUG_ENGINE
13838 
13839         IF l_debug = FND_API.G_TRUE THEN
13840           QP_PREQ_GRP.engine_debug('-------------------rltd info--------------------');
13841 
13842         END IF;
13843         IF QP_PREQ_GRP.G_DEBUG_ENGINE = FND_API.G_TRUE THEN
13844           --this is for debug for rltd lines
13845           FOR cl IN (SELECT line_index,
13846                      related_line_index,
13847                      line_detail_index,
13848                      related_line_detail_index,
13849                      relationship_type_code,
13850                      list_line_id,
13851                      related_list_line_id,
13852                      related_list_line_type,
13853                      operand_calculation_code,
13854                      operand,
13855                      pricing_group_sequence,
13856                      setup_value_from,
13857                      setup_value_to,
13858                      qualifier_value
13859                      FROM qp_npreq_rltd_lines_tmp
13860                      WHERE pricing_status_code = G_STATUS_NEW)
13861             LOOP
13862             IF l_debug = FND_API.G_TRUE THEN
13863               QP_PREQ_GRP.engine_debug('related records with status N '
13864                                        ||' line_dtl_index '|| cl.line_detail_index
13865                                        ||' rltd_line_dtl_index '|| cl.related_line_detail_index
13866                                        ||' line_index '|| cl.line_index
13867                                        ||' rltd_line_index '|| cl.related_line_index
13868                                        ||' list_line_id '|| cl.list_line_id
13869                                        ||' rltd_list_line_id '|| cl.related_list_line_id
13870                                        ||' rltd_list_line_type '|| cl.related_list_line_type
13871                                        ||' operand '|| cl.operand
13872                                        ||' operator '|| cl.operand_calculation_code
13873                                        ||' bucket '|| cl.pricing_group_sequence
13874                                        ||' setval_from '|| cl.setup_value_from
13875                                        ||' setval_to '|| cl.setup_value_to
13876                                        ||' qual_value '|| cl.qualifier_value);
13877             END IF;
13878           END LOOP; --for cl
13879         END IF; --QP_PREQ_GRP.G_DEBUG_ENGINE
13880       END IF;
13881 
13882 
13883 
13884       IF QP_PREQ_GRP.G_DEBUG_ENGINE = FND_API.G_TRUE THEN
13885         OPEN lcur1; LOOP
13886           FETCH lcur1 INTO lrec1;
13887           EXIT WHEN lcur1%NOTFOUND;
13888           IF l_debug = FND_API.G_TRUE THEN
13889             QP_PREQ_GRP.ENGINE_DEBUG('line_index '|| lrec1.line_ind ||
13890                                      ' list_line_id '|| lrec1.created_from_list_line_id ||
13891                                      ' line_detail_index '|| lrec1.line_detail_index ||
13892                                      ' applied '|| lrec1.applied_flag ||' status '|| lrec1.pricing_status_code
13893                                      ||' process_code '|| lrec1.process_code);
13894           END IF;
13895         END LOOP;
13896         CLOSE lcur1;
13897       END IF;
13898       --Performance bug fix 7309551
13899         IF (l_dynamic_sampling_level IN (1) AND l_dynamic_sampling_level <> l_old_dynamic_sampling_level) THEN
13900             QP_PREQ_GRP.ENGINE_DEBUG('Setting dynamic sampling level back to '|| l_old_dynamic_sampling_level);
13901             BEGIN
13902             Execute immediate 'alter session set optimizer_dynamic_sampling = '||l_old_dynamic_sampling_level;
13903             EXCEPTION
13904             WHEN OTHERS THEN
13905                   IF l_debug = FND_API.G_TRUE THEN
13906                     QP_PREQ_GRP.engine_debug('Error in resetting the dynamic sampling level to old value'|| SQLERRM);
13907                   END IF;
13908             END;
13909         END IF;
13910       --End 7309551
13911 
13912       --Update_PRG_Process_status;
13913       --=======END: Specific only to PL/SQL Engine==================
13914       --added by yangli for Java Engine PUB 3086881
13915     ELSE -- java engine is installed
13916       --=======START: Specific only to JAVA Engine==================
13917       IF QP_PREQ_GRP.G_DEBUG_ENGINE = FND_API.G_TRUE THEN
13918         QP_PREQ_GRP.ENGINE_DEBUG('03 Java Engine is installed');
13919         QP_PREQ_GRP.ENGINE_DEBUG('temp_table_insert_flag:' || l_control_rec.temp_table_insert_flag);
13920         QP_PREQ_GRP.ENGINE_DEBUG('QP_PREQ_PUB.G_CHECK_CUST_VIEW_FLAG:' || QP_PREQ_PUB.G_CHECK_CUST_VIEW_FLAG);
13921       END IF;
13922 
13923       --for OM call, need Pre-Insert Logic to fetch/format data from OE tables into
13924       --Java Engine interface tables
13925       IF l_control_rec.temp_table_insert_flag = G_NO THEN
13926         --Initialize_Constants() logic for Interface Tables
13927 
13928         --    IF G_REQUEST_TYPE_CODE = 'ONT' THEN
13929         --bug 3085453 handle pricing availability UI
13930         -- they pass reqtype ONT and insert adj into ldets
13931         IF QP_PREQ_PUB.G_CHECK_CUST_VIEW_FLAG = G_YES THEN
13932           --Preinsert Logic for OM call
13933           --to fetch out-of-phases modifiers and in-phase PRG modifiers
13934           --to fetch rltd information
13935           IF QP_PREQ_GRP.G_DEBUG_ENGINE = FND_API.G_TRUE THEN
13936             QP_PREQ_GRP.ENGINE_DEBUG('Before calling INT_TABLES_PREINSERT');
13937           END IF;
13938           INT_TABLES_PREINSERT(p_calculate_flag => l_control_rec.calculate_flag,
13939                                p_event_code => l_control_rec.pricing_event,
13940                                x_return_status => l_return_status,
13941                                x_return_status_text => l_status_Text);
13942           IF QP_PREQ_GRP.G_DEBUG_ENGINE = FND_API.G_TRUE THEN
13943             QP_PREQ_GRP.ENGINE_DEBUG('Existing INT_TABLES_PREINSERT');
13944           END IF;
13945           IF(l_return_status = FND_API.G_RET_STS_ERROR) THEN
13946             l_status_text := 'INT_TABLES_PREINSERT:' || l_status_text;
13947             RAISE E_ROUTINE_ERRORS;
13948           END IF;
13949         END IF;
13950       END IF;
13951 
13952       IF l_control_rec.temp_table_insert_flag = G_NO THEN
13953         l_request_id := QP_Price_Request_Context.GET_REQUEST_ID;
13954         IF l_debug = FND_API.G_TRUE THEN
13955           QP_PREQ_GRP.engine_debug('Request Id:'|| l_request_id);
13956         END IF;
13957         QP_JAVA_ENGINE.request_price(request_id => l_request_id,
13958                                      p_control_rec => l_control_rec,
13959                                      x_return_status => l_return_status,
13960                                      x_return_status_text => l_status_Text);
13961 
13962         IF(l_return_status = FND_API.G_RET_STS_ERROR) THEN
13963           --l_status_text:= 'QP_JAVA_ENGINE.request_price failed for request id:'||l_request_id||l_status_text;
13964           IF l_debug = FND_API.G_TRUE THEN
13965             QP_PREQ_GRP.engine_debug(l_status_text);
13966           END IF; --Bug No 4033618
13967           x_return_status := l_return_status;
13968           x_return_status_text := l_status_text;
13969           RAISE JAVA_ENGINE_PRICING_EXCEPTION;
13970         END IF;
13971       ELSE
13972         IF l_debug = FND_API.G_TRUE THEN
13973           QP_PREQ_GRP.engine_debug('Before calling QP_PREQ_GRP.PRICE_REQUEST.....');
13974         END IF;
13975         QP_PREQ_GRP.PRICE_REQUEST
13976         (p_line_tbl => p_line_tbl,
13977          p_qual_tbl => p_qual_tbl,
13978          p_line_attr_tbl => p_line_attr_tbl,
13979          p_LINE_DETAIL_tbl => p_line_detail_tbl,
13980          p_LINE_DETAIL_qual_tbl => p_line_detail_qual_tbl,
13981          p_LINE_DETAIL_attr_tbl => p_line_detail_attr_tbl,
13982          p_related_lines_tbl => p_related_lines_tbl,
13983          p_control_rec => l_control_rec,
13984          x_line_tbl => x_line_tbl,
13985          x_line_qual => x_line_qual,
13986          x_line_attr_tbl => x_line_attr_tbl,
13987          x_line_detail_tbl => x_line_detail_tbl,
13988          x_line_detail_qual_tbl => x_line_detail_qual_tbl,
13989          x_line_detail_attr_tbl => x_line_detail_attr_tbl,
13990          x_related_lines_tbl => x_related_lines_tbl,
13991          x_return_status => x_return_status,
13992          x_return_status_text => x_return_status_text
13993          );
13994         IF X_RETURN_STATUS IN (FND_API.G_RET_STS_ERROR
13995                                , FND_API.G_RET_STS_UNEXP_ERROR) THEN
13996 
13997           IF l_debug = FND_API.G_TRUE THEN
13998             QP_PREQ_GRP.ENGINE_DEBUG('Exception Price Request GRP: '|| x_return_status_text);
13999           END IF;
14000           RAISE PRICE_REQUEST_EXC;
14001         END IF;
14002       END IF; --TEMP_TABLE_INSERT_FLAG=Y
14003 
14004       --  IF G_REQUEST_TYPE_CODE = 'ONT' THEN
14005       --bug 3085453 handle pricing availability UI
14006       -- they pass reqtype ONT and insert adj into ldets
14007       IF QP_PREQ_PUB.G_CHECK_CUST_VIEW_FLAG = G_YES THEN
14008         -- still need Cleanup_Adjustments logic
14009         -- and Populate_Price_Adj_Id logic
14010         -- from QP_CLEANUP_ADJUSTMENTS_PVT.Fetch_Adjustments
14011         --call cleanup of adj only for OM
14012 
14013         IF l_debug = FND_API.G_TRUE THEN
14014           QP_PREQ_GRP.engine_debug('deleting related lines');
14015         END IF;
14016         DELETE FROM qp_int_rltd_lines
14017         WHERE pricing_status_code = QP_PREQ_PUB.G_STATUS_NEW
14018         AND relationship_type_code = QP_PREQ_PUB.G_PBH_LINE
14019         AND pricing_status_text = 'INSERTED FOR CALCULATION';
14020         IF l_debug = FND_API.G_TRUE THEN
14021           QP_PREQ_GRP.engine_debug('deleted related lines '|| SQL%ROWCOUNT);
14022         END IF;
14023 
14024         IF l_control_rec.calculate_flag IN
14025           (QP_PREQ_GRP.G_SEARCH_N_CALCULATE, QP_PREQ_GRP.G_CALCULATE_ONLY)
14026           THEN
14027           l_cleanup_flag := QP_PREQ_PUB.G_YES;
14028           --added for bug 3399997 by yangli
14029           Update_Line_Status(x_return_status, x_return_status_text);
14030           IF x_return_status = FND_API.G_RET_STS_ERROR
14031             THEN
14032             RAISE Pricing_Exception;
14033           END IF;
14034           --added for bug 3399997 by yangli
14035 
14036           IF l_debug = FND_API.G_TRUE THEN
14037             QP_PREQ_GRP.engine_debug('Java Engine calling QP_CLEANUP_ADJUSTMENTS_PVT.cleanup_adjustments');
14038           END IF;
14039           QP_CLEANUP_ADJUSTMENTS_PVT.cleanup_adjustments('ONTVIEW',
14040                                                          G_REQUEST_TYPE_CODE,
14041                                                          l_cleanup_flag,
14042                                                          x_return_status,
14043                                                          x_return_status_text);
14044           IF x_return_status = FND_API.G_RET_STS_ERROR
14045             THEN
14046             RAISE Pricing_Exception;
14047           END IF;
14048           --moved down per bug3238607
14049           /*IF l_debug = FND_API.G_TRUE THEN
14050         QP_PREQ_GRP.engine_debug('Java Engine calling QP_CLEANUP_ADJUSTMENTS_PVT.Populate_Price_Adj_ID');
14051       END IF;
14052 
14053       --populate the price adjustment id from sequence for rec with process_code = N
14054       QP_CLEANUP_ADJUSTMENTS_PVT.Populate_Price_Adj_ID(x_return_status,x_return_status_text);
14055 
14056       IF x_return_status = FND_API.G_RET_STS_ERROR
14057       THEN
14058         Raise Pricing_Exception;
14059       END IF;*/
14060           --moved down per bug3238607
14061         END IF;
14062       END IF;
14063       --per bug3238607's decision, OM will pass simulation_flag=N
14064       --to indicate populate_price_adj_id is needed
14065       IF G_REQUEST_TYPE_CODE = 'ONT' AND
14066         l_control_rec.simulation_flag = G_NO THEN
14067         IF l_control_rec.calculate_flag IN
14068           (QP_PREQ_GRP.G_SEARCH_N_CALCULATE, QP_PREQ_GRP.G_CALCULATE_ONLY)
14069           THEN
14070           IF l_debug = FND_API.G_TRUE THEN
14071             QP_PREQ_GRP.engine_debug('Java Engine calling QP_CLEANUP_ADJUSTMENTS_PVT.Populate_Price_Adj_ID');
14072           END IF;
14073 
14074           --populate the price adjustment id from sequence for rec with process_code = N
14075           QP_CLEANUP_ADJUSTMENTS_PVT.Populate_Price_Adj_ID(x_return_status, x_return_status_text);
14076 
14077           IF x_return_status = FND_API.G_RET_STS_ERROR
14078             THEN
14079             RAISE Pricing_Exception;
14080           END IF;
14081         END IF;
14082       END IF;
14083 
14084       IF QP_PREQ_GRP.G_DEBUG_ENGINE = FND_API.G_TRUE
14085         THEN
14086         Populate_Output_INT(x_return_status, x_return_status);
14087 
14088         IF X_RETURN_STATUS = FND_API.G_RET_STS_ERROR
14089           THEN
14090           IF l_debug = FND_API.G_TRUE THEN
14091             QP_PREQ_GRP.ENGINE_DEBUG('Exception Populate_Output: '|| x_return_status_text);
14092           END IF;
14093           RAISE PRICE_REQUEST_EXC;
14094         END IF; --X_RETURN_STATUS
14095       END IF; --QP_PREQ_GRP.G_DEBUG_ENGINE
14096       --=======END: Specific only to JAVA Engine==================
14097     END IF; -- java  engine is installed
14098     --added by yangli for Java Engine PUB 3086881
14099 
14100 
14101     ------------------------------------------------------------
14102     --POPULATE OUT TEMPORARY TABLES
14103     ------------------------------------------------------------
14104     IF l_control_rec.temp_table_insert_flag = G_YES
14105       AND l_control_rec.check_cust_view_flag = G_NO
14106       THEN
14107 
14108       --added by yangli for Java Engine PUB 3086881
14109       IF QP_JAVA_ENGINE_UTIL_PUB.Java_Engine_Running = 'N' THEN
14110         ------------------------------------------------------------
14111         --POPULATE OUT PROCESS CODE IN PRICING_STATUS_CODE
14112         --ONLY UPDATE THE RECORDS INPUT BY USER WHCH WERE USED IN CALCULATION
14113         ------------------------------------------------------------
14114         IF l_debug = FND_API.G_TRUE THEN
14115           QP_PREQ_GRP.ENGINE_DEBUG('Java Engine not Installed ----------');
14116         END IF;
14117         --added by yangli for Java Engine PUB 3086881
14118 
14119         IF l_debug = FND_API.G_TRUE THEN
14120           QP_PREQ_GRP.ENGINE_DEBUG('Update Process code to Pricing Code ');
14121         END IF;
14122         /*
14123 indxno index used Ravi
14124 */
14125         UPDATE qp_npreq_ldets_tmp
14126                 SET pricing_status_code = G_STATUS_NEW
14127                         WHERE process_code = G_STATUS_NEW
14128         --changes for bug 2264566
14129         --changed to populate w/updated_flag = Y for child lines of manualPBH
14130                         AND (applied_flag = G_YES OR updated_flag = G_YES)
14131                         AND pricing_status_code = G_STATUS_UNCHANGED;
14132 
14133         --added by yangli for Java Engine PUB 3086881
14134       END IF; --Java Engine is not installed;
14135       --added by yangli for Java Engine PUB 3086881
14136       QP_PREQ_GRP.POPULATE_OUTPUT(
14137                                   x_line_tbl => x_line_tbl,
14138                                   x_line_qual_tbl => x_line_qual,
14139                                   x_line_attr_tbl => x_line_attr_tbl,
14140                                   x_line_detail_tbl => x_line_detail_tbl,
14141                                   x_line_detail_qual_tbl => x_line_detail_qual_tbl,
14142                                   x_line_detail_attr_tbl => x_line_detail_attr_tbl,
14143                                   x_related_lines_tbl => x_related_lines_tbl);
14144 
14145 
14146       IF l_debug = FND_API.G_TRUE THEN
14147         QP_PREQ_GRP.ENGINE_DEBUG('Line Detail Count : ' || x_line_detail_tbl.COUNT);
14148 
14149       END IF;
14150       --*******************************************************************
14151       --DEBUG
14152 
14153       IF QP_PREQ_GRP.G_DEBUG_ENGINE = FND_API.G_TRUE THEN
14154         j := x_line_tbl.FIRST;
14155         WHILE j IS NOT NULL
14156           LOOP
14157           IF l_debug = FND_API.G_TRUE THEN
14158             QP_PREQ_GRP.ENGINE_DEBUG('PRICE LINE : '||
14159                                      x_line_tbl(j).line_index ||
14160                                      ' list price '|| x_line_tbl(j).unit_price ||
14161                                      ' adj price '|| x_line_tbl(j).adjusted_unit_price ||
14162                                      ' up adj price '|| x_line_tbl(j).updated_adjusted_unit_price ||
14163                                      ' process code '|| x_line_tbl(j).processed_code);
14164 
14165             QP_PREQ_GRP.ENGINE_DEBUG('---------------------------------------------------');
14166           END IF;
14167           i := x_line_detail_tbl.FIRST;
14168           WHILE i IS NOT NULL
14169             LOOP
14170             IF x_line_detail_tbl(i).line_index = x_line_tbl(j).line_index THEN
14171               IF l_debug = FND_API.G_TRUE THEN
14172                 QP_PREQ_GRP.ENGINE_DEBUG('PRICE ADJUSTMENTS: '
14173                                          ||' mod_id '|| x_line_detail_tbl(i).list_line_id
14174                                          ||' dtl_index '|| x_line_detail_tbl(i).line_detail_index
14175                                          ||' adj amount '|| x_line_detail_tbl(i).adjustment_amount
14176                                          ||' op '|| x_line_detail_tbl(i).operand_calculation_code
14177                                          ||' operand value '|| x_line_detail_tbl(i).operand_value
14178                                          ||' applied '|| x_line_detail_tbl(i).applied_flag
14179                                          ||' updated '|| x_line_detail_tbl(i).updated_flag
14180                                          ||' process_code '|| x_line_detail_tbl(i).process_code
14181                                          ||' pricing_status '|| x_line_detail_tbl(i).status_code);
14182               END IF;
14183             END IF;
14184             i := x_line_detail_tbl.NEXT(i);
14185           END LOOP;
14186           IF l_debug = FND_API.G_TRUE THEN
14187             QP_PREQ_GRP.ENGINE_DEBUG('---------------------------------------------------');
14188           END IF;
14189           j := x_line_tbl.NEXT(j);
14190         END LOOP;
14191 
14192         --fix for bug 2515762 automatic overrideable break debug for rltd info
14193         IF l_debug = FND_API.G_TRUE THEN
14194           QP_PREQ_GRP.ENGINE_DEBUG('------------Rltd Info----------------');
14195           QP_PREQ_GRP.ENGINE_DEBUG('Rltd Info count '|| x_related_lines_tbl.COUNT);
14196         END IF;
14197         j := x_related_lines_tbl.FIRST;
14198         WHILE j IS NOT NULL
14199           LOOP
14200           IF l_debug = FND_API.G_TRUE THEN
14201             QP_PREQ_GRP.ENGINE_DEBUG('line_index '
14202                                      || x_related_lines_tbl(j).line_index ||' related_line_index '
14203                                      || x_related_lines_tbl(j).related_line_index ||' dtl_index '
14204                                      || x_related_lines_tbl(j).line_detail_index ||' rltd_dtl_index '
14205                                      || x_related_lines_tbl(j).related_line_detail_index ||' relation '
14206                                      || x_related_lines_tbl(j).relationship_type_code);
14207           END IF;
14208           j := x_related_lines_tbl.NEXT(j);
14209         END LOOP;
14210 
14211       END IF; --IF QP_PREQ_GRP.G_DEBUG_ENGINE = FND_API.G_TRUE THEN
14212       --*******************************************************************
14213     END IF; --temp_table_insert_flag = G_YES and check_cust_view_flag = G_NO
14214 
14215 
14216     --Fix for bug 3550303 need to reset QP_BULK_PREQ_GRP.G_HVOP_PRICING_ON
14217     --at the end of HVOP call
14218     QP_UTIL_PUB.RESET_HVOP_PRICING_ON;
14219 
14220 
14221 
14222     --============START: Post-pricing process needed by JAVA and PL/SQL Engine======
14223     --to write temp table data into debug tables
14224     IF (G_QP_DEBUG = G_YES) OR
14225       (G_QP_DEBUG = G_DONT_WRITE_TO_DEBUG) THEN -- If Debug is on
14226       QP_COPY_DEBUG_PVT.WRITE_TO_DEBUG_TABLES(p_control_rec,
14227                                               l_return_status,
14228                                               l_return_status_text
14229                                               );
14230       x_return_status := l_return_status;
14231       x_return_status_text := l_return_status_text;
14232       IF x_return_status = FND_API.G_RET_STS_ERROR THEN
14233         RAISE E_DEBUG_ROUTINE_ERROR;
14234       END IF;
14235     END IF;
14236 
14237     X_RETURN_STATUS := FND_API.G_RET_STS_SUCCESS;
14238     X_RETURN_STATUS_TEXT := l_routine ||' SUCCESS';
14239 
14240     l_pricing_end_time := dbms_utility.get_time;
14241 
14242     IF G_QP_DEBUG = G_ENGINE_TIME_TRACE_ON THEN --3085171
14243       --added to note redo log
14244       BEGIN
14245         SELECT VALUE INTO l_pricing_end_redo
14246          FROM v$mystat, v$statname
14247          WHERE v$mystat.statistic# = v$statname.statistic#
14248          AND v$statname.name = 'redo size';
14249       EXCEPTION
14250         WHEN OTHERS THEN
14251           IF l_debug = FND_API.G_TRUE THEN
14252             QP_PREQ_GRP.engine_debug('Error in looking up redo end in PUB '|| SQLERRM);
14253           END IF;
14254       END;
14255     END IF;
14256 
14257     l_time_difference := (l_pricing_end_time - l_pricing_start_time) / 100 ;
14258     l_redo_difference := l_pricing_end_redo - l_pricing_start_redo ;
14259 
14260     IF l_debug = FND_API.G_TRUE THEN
14261       QP_PREQ_GRP.engine_debug('Total time taken in PUB Pkg: '|| l_time_difference);
14262       QP_PREQ_GRP.engine_debug('redo log in PUB: '|| l_redo_difference);
14263 
14264     END IF;
14265 
14266     --Changes for bug2961617
14267 
14268     /*
14269  execute immediate 'select '||''''|| ' Total Time in QP_PREQ_PUB(in sec) : ' ||
14270 l_time_difference||' Total redo in QP_PREQ_PUB : '|| l_redo_difference||''''||' from dual ';
14271 */
14272 
14273     IF G_QP_DEBUG = G_ENGINE_TIME_TRACE_ON THEN --3085171
14274       BEGIN
14275 
14276         /*
14277 select 'Total Time in QP_PREQ_PUB(in sec) : ' ||l_time_difference ||
14278 ' Total redo in QP_PREQ_PUB : '||l_redo_difference into l_time_stats from dual ;
14279 */
14280 
14281         EXECUTE IMMEDIATE 'select '|| '''' || ' Total Time in QP_PREQ_PUB(in sec) : ' ||
14282         l_time_difference ||' Total redo in QP_PREQ_PUB : '|| l_redo_difference || '''' ||' from dual ';
14283 
14284       EXCEPTION
14285 
14286         WHEN OTHERS THEN
14287           IF l_debug = FND_API.G_TRUE THEN
14288             QP_PREQ_GRP.engine_debug('Failed to get time statistics in QP_PREQ_PUB');
14289           END IF;
14290       END;
14291     END IF;
14292     IF l_debug = FND_API.G_TRUE THEN
14293       QP_PREQ_GRP.ENGINE_DEBUG('End Price Request');
14294 
14295     END IF;
14296     --============END: Post-pricing process needed by JAVA and PL/SQL Engine======
14297 
14298     qp_debug_util.tstop('ENGINE_CALL_QPXPPREB');
14299     qp_debug_util.tdump;
14300     qp_debug_util.tflush;
14301 
14302   	EXCEPTION
14303     WHEN E_BYPASS_PRICING THEN
14304       IF l_debug = FND_API.G_TRUE THEN
14305         QP_PREQ_GRP.ENGINE_DEBUG('Bypassed Pricing Engine');
14306       END IF;
14307       x_return_status := FND_API.G_RET_STS_SUCCESS;
14308       --to write temp table data into debug tables
14309       IF (G_QP_DEBUG = G_YES) OR
14310         (G_QP_DEBUG = G_DONT_WRITE_TO_DEBUG) THEN -- If Debug is on
14311         QP_COPY_DEBUG_PVT.WRITE_TO_DEBUG_TABLES(p_control_rec,
14312                                                 l_return_status,
14313                                                 l_return_status_text
14314                                                 );
14315         IF l_return_status = FND_API.G_RET_STS_ERROR THEN
14316           IF l_debug = FND_API.G_TRUE THEN
14317             QP_PREQ_GRP.engine_debug('Error occured in Debug Routine: ' || l_return_status_text);
14318           END IF;
14319         END IF;
14320       END IF;
14321       --added by yangli for Java Engine PUB 3086881
14322     WHEN PRICING_EXCEPTION THEN
14323       x_return_status := FND_API.G_RET_STS_ERROR;
14324       IF l_debug = FND_API.G_TRUE THEN
14325         QP_PREQ_GRP.engine_debug('error in fetch_adjustments: '|| SQLERRM);
14326         QP_PREQ_GRP.engine_debug('error in fetch_adjustments: '|| x_return_status_text);
14327       END IF;
14328     WHEN JAVA_ENGINE_PRICING_EXCEPTION THEN
14329       x_return_status := FND_API.G_RET_STS_ERROR;
14330       IF l_debug = FND_API.G_TRUE THEN
14331         QP_PREQ_GRP.engine_debug('error in QP_JAVA_ENGINE.price_request():'|| SQLERRM);
14332         QP_PREQ_GRP.engine_debug('error in QP_JAVA_ENGINE.price_request():'|| x_return_status_text);
14333       END IF;
14334       --added by yangli for Java Engine PUB 3086881
14335 
14336     WHEN PRICE_REQUEST_EXC THEN
14337       IF l_debug = FND_API.G_TRUE THEN
14338         QP_PREQ_GRP.ENGINE_DEBUG('Exception Price Request: '|| SQLERRM);
14339       END IF;
14340       NULL;
14341       x_return_status := FND_API.G_RET_STS_ERROR;
14342       -- x_return_status_TEXT := l_routine||' '||SQLERRM;
14343       --to write temp table data into debug tables
14344       IF (G_QP_DEBUG = G_YES) OR
14345         (G_QP_DEBUG = G_DONT_WRITE_TO_DEBUG) THEN -- If Debug is on
14346         QP_COPY_DEBUG_PVT.WRITE_TO_DEBUG_TABLES(p_control_rec,
14347                                                 l_return_status,
14348                                                 l_return_status_text
14349                                                 );
14350         IF l_return_status = FND_API.G_RET_STS_ERROR THEN
14351           IF l_debug = FND_API.G_TRUE THEN
14352             QP_PREQ_GRP.engine_debug('Error occured in Debug Routine: ' || l_return_status_text);
14353           END IF;
14354         END IF;
14355       END IF;
14356     WHEN E_DEBUG_ROUTINE_ERROR THEN
14357       IF l_debug = FND_API.G_TRUE THEN
14358         QP_PREQ_GRP.engine_debug('Error occured in Debug Routine: ' || x_return_status_text);
14359       END IF;
14360     WHEN E_NO_LINES_TO_PRICE THEN -- 4865787
14361       IF l_debug = FND_API.G_TRUE THEN
14362         QP_PREQ_GRP.engine_debug('Error in QP_PREQ_PUB.Price_Request: There are no lines to price!');
14363       END IF;
14364       x_return_status := FND_API.G_RET_STS_ERROR;
14365       x_return_status_text := l_routine ||' '|| ': There are no lines to price!';
14366     WHEN OTHERS THEN
14367       IF l_debug = FND_API.G_TRUE THEN
14368         QP_PREQ_GRP.ENGINE_DEBUG('Exception Price Request: '|| SQLERRM);
14369       END IF;
14370       x_return_status := FND_API.G_RET_STS_ERROR;
14371       x_return_status_TEXT := l_routine ||' '|| SQLERRM;
14372       --to write temp table data into debug tables
14373       IF (G_QP_DEBUG = G_YES) OR
14374         (G_QP_DEBUG = G_DONT_WRITE_TO_DEBUG) THEN -- If Debug is on
14375         QP_COPY_DEBUG_PVT.WRITE_TO_DEBUG_TABLES(p_control_rec,
14376                                                 l_return_status,
14377                                                 l_return_status_text
14378                                                 );
14379         IF l_return_status = FND_API.G_RET_STS_ERROR THEN
14380           IF l_debug = FND_API.G_TRUE THEN
14381             QP_PREQ_GRP.engine_debug('Error occured in Debug Routine: ' || l_return_status_text);
14382           END IF;
14383         END IF;
14384       END IF;
14385 
14386 
14387   END PRICE_REQUEST;
14388 
14389   -- returns TRUE if given price is lower or equal than GSA price for non-GSA customer, else FALSE
14390   FUNCTION Raise_GSA_Error
14391   (
14392    p_request_type_code IN VARCHAR2
14393    , p_inventory_item_id IN NUMBER
14394    , p_pricing_date IN DATE
14395    , p_unit_price IN NUMBER
14396    , p_cust_account_id IN NUMBER
14397    )
14398   RETURN BOOLEAN
14399 
14400   IS
14401 
14402   l_operand NUMBER := 0;
14403   l_gsa_indicator_flag VARCHAR2(5) := 'N';
14404   v_return_value BOOLEAN := NULL;
14405 
14406 
14407   BEGIN
14408 
14409 
14410     IF p_cust_account_id IS NOT NULL THEN
14411 
14412       --obtain_gsa indicator_flag
14413       /*
14414 INDX,QP_PREQ_PUB.Raise_GSA_Error.sel1,HZ_CUST_ACCOUNTS_U1,CUST_ACCOUNT_ID,1
14415 INDX,QP_PREQ_PUB.Raise_GSA_Error.sel1,HZ_PARTIES_U1,PARTY_ID,1
14416 */
14417 
14418 
14419 
14420       /* begin changes made for tracking bug 2693700 */
14421       BEGIN
14422         SELECT NVL(gsa_indicator, 'N')
14423         INTO l_gsa_indicator_flag
14424         FROM hz_cust_site_uses_all hsu
14425         WHERE site_use_id = OE_ORDER_PUB.G_HDR.invoice_to_org_id
14426         AND  NVL(hsu.org_id,
14427                  NVL(TO_NUMBER(DECODE(SUBSTRB(USERENV('CLIENT_INFO'), 1, 1), ' ', NULL,
14428                                       SUBSTRB(USERENV('CLIENT_INFO'), 1, 10))), - 99)) =
14429          NVL(TO_NUMBER(DECODE(SUBSTRB(USERENV('CLIENT_INFO'), 1, 1), ' ', NULL,
14430                               SUBSTRB(USERENV('CLIENT_INFO'), 1, 10))),  - 99);
14431 
14432       EXCEPTION
14433 
14434         WHEN NO_DATA_FOUND THEN
14435           l_gsa_indicator_flag := 'N';
14436 
14437       END;
14438 
14439       IF l_gsa_indicator_flag = 'N' THEN
14440 
14441         BEGIN
14442 
14443           SELECT NVL(gsa_indicator_flag, 'N')
14444           INTO l_gsa_indicator_flag
14445           FROM hz_parties hp, hz_cust_accounts hca
14446           WHERE hp.party_id = hca.party_id
14447           AND hca.cust_account_id = p_cust_account_id ;
14448 
14449         EXCEPTION
14450 
14451           WHEN NO_DATA_FOUND THEN
14452             l_gsa_indicator_flag := NULL;
14453 
14454         END;
14455 
14456       END IF;
14457       /*		SELECT nvl(gsa_indicator_flag,'N') into l_gsa_indicator_flag
14458 		FROM hz_parties hp, hz_cust_accounts hca
14459 		WHERE hp.party_id = hca.party_id and hca.cust_account_id = p_cust_account_id;
14460 	ELSE
14461 		-- treat it as non-GSA customer if p_cust_account_id is NULL
14462 		l_gsa_indicator_flag := 'N';
14463 */
14464       --end bug 2693700
14465 
14466     END IF;
14467 
14468 
14469     -- Perform the GSA check if l_gsa_indicator_flag is N
14470     -- 'N' or NULL means it is not a GSA customer, then check if GSA error should be raised
14471     IF l_gsa_indicator_flag = 'N' THEN
14472 
14473       /*
14474 INDX,QP_PREQ_PUB.Raise_GSA_Error.sel2,QP_QUALIFIERS_N7,QUALIFIER_CONTEXT,1
14475 INDX,QP_PREQ_PUB.Raise_GSA_Error.sel2,QP_QUALIFIERS_N7,QUALIFIER_ATTRIBUTE,2
14476 INDX,QP_PREQ_PUB.Raise_GSA_Error.sel2,QP_QUALIFIERS_N7,LIST_HEADER_ID,3
14477 INDX,QP_PREQ_PUB.Raise_GSA_Error.sel2,QP_QUALIFIERS_N7,ACTIVE_FLAG,4
14478 INDX,QP_PREQ_PUB.Raise_GSA_Error.sel2,QP_QUALIFIERS_N7,QUALIFIER_ATTR_VALUE,5
14479 INDX,QP_PREQ_PUB.Raise_GSA_Error.sel2,QP_PRICING_ATTRIBUTES_N5,PRICING_PHASE_ID,1
14480 INDX,QP_PREQ_PUB.Raise_GSA_Error.sel2,QP_PRICING_ATTRIBUTES_N5,QUALIFICATION_IND,2
14481 INDX,QP_PREQ_PUB.Raise_GSA_Error.sel2,QP_PRICING_ATTRIBUTES_N5,PRODUCT_ATTRIBUTE_CONTEXT,3
14482 INDX,QP_PREQ_PUB.Raise_GSA_Error.sel2,QP_PRICING_ATTRIBUTES_N5,PRODUCT_ATTRIBUTE,4
14483 INDX,QP_PREQ_PUB.Raise_GSA_Error.sel2,QP_PRICING_ATTRIBUTES_N5,PRODUCT_ATTR_VALUE,5
14484 INDX,QP_PREQ_PUB.Raise_GSA_Error.sel2,QP_PRICING_ATTRIBUTES_N5,EXCLUDER_FLAG,6
14485 INDX,QP_PREQ_PUB.Raise_GSA_Error.sel2,QP_PRICING_ATTRIBUTES_N5,LIST_HEADER_ID,7
14486 INDX,QP_PREQ_PUB.Raise_GSA_Error.sel2,QP_PRICING_ATTRIBUTES_N5,LIST_LINE_ID,8
14487 INDX,QP_PREQ_PUB.Raise_GSA_Error.sel2,QP_LIST_HEADERS_B_PK,LIST_HEADER_ID,1
14488 INDX,QP_PREQ_PUB.Raise_GSA_Error.sel2,QP_PRICE_REQ_SOURCES_PK,REQUEST_TYPE_CODE,1
14489 INDX,QP_PREQ_PUB.Raise_GSA_Error.sel2,QP_PRICE_REQ_SOURCES_PK,SOURCE_SYSTEM_CODE,2
14490 INDX,QP_PREQ_PUB.Raise_GSA_Error.sel2,QP_LIST_LINES_PK,LIST_LINE_ID,1
14491 */
14492       SELECT MIN(qpll.operand) INTO l_operand
14493        FROM
14494               QP_QUALIFIERS qpq,
14495               QP_PRICING_ATTRIBUTES qppa,
14496               QP_LIST_LINES qpll,
14497               QP_LIST_HEADERS_B qplh,
14498               QP_PRICE_REQ_SOURCES_V qpprs
14499       WHERE
14500               qpq.qualifier_context = 'CUSTOMER' AND
14501               qpq.qualifier_attribute = 'QUALIFIER_ATTRIBUTE15' AND
14502               qpq.qualifier_attr_value = 'Y' AND
14503               qppa.list_header_id = qplh.list_header_id AND
14504               qplh.active_flag = 'Y' AND
14505               qpprs.request_type_code = p_request_type_code AND
14506               qpprs.source_system_code = qplh.source_system_code AND
14507               qppa.pricing_phase_id = 2 AND
14508               qppa.qualification_ind = 6 AND
14509               qppa.product_attribute_context = 'ITEM' AND
14510               qppa.product_attribute = 'PRICING_ATTRIBUTE1' AND
14511               qppa.product_attr_value = p_inventory_item_id AND
14512               qppa.excluder_flag = 'N' AND
14513               qppa.list_header_id = qpq.list_header_id AND
14514               qppa.list_line_id = qpll.list_line_id AND
14515               p_pricing_date BETWEEN nvl(trunc(qplh.start_date_active), p_pricing_date) AND nvl(trunc(qplh.end_date_active), p_pricing_date);
14516 
14517       IF l_operand IS NOT NULL THEN
14518 
14519         -- if given price is lower than GSA price, then raise GSA error
14520         IF p_unit_price <= l_operand THEN
14521           v_return_value := TRUE;
14522         ELSE
14523           v_return_value := FALSE;
14524         END IF;
14525       ELSE
14526         -- return FALSE if l_operand is NULL
14527         v_return_value := FALSE;
14528       END IF;
14529 
14530 
14531     ELSE -- l_gsa_indicator_flag != 'N'
14532       -- No need to check GSA error if it is a GSA customer, return FALSE
14533       v_return_value := FALSE;
14534     END IF;
14535 
14536     RETURN v_return_value;
14537   END Raise_GSA_Error;
14538 
14539   --overloaded for applications who insert into temp tables directly
14540   PROCEDURE PRICE_REQUEST
14541   (p_control_rec IN QP_PREQ_GRP.CONTROL_RECORD_TYPE,
14542    x_return_status OUT NOCOPY VARCHAR2,
14543    x_return_status_text OUT NOCOPY VARCHAR2
14544    ) IS
14545 
14546   l_line_tbl QP_PREQ_GRP.LINE_TBL_TYPE;
14547   l_qual_tbl QP_PREQ_GRP.QUAL_TBL_TYPE;
14548   l_line_attr_tbl QP_PREQ_GRP.LINE_ATTR_TBL_TYPE;
14549   l_line_detail_tbl QP_PREQ_GRP.LINE_DETAIL_TBL_TYPE;
14550   l_line_detail_qual_tbl QP_PREQ_GRP.LINE_DETAIL_QUAL_TBL_TYPE;
14551   l_line_detail_attr_tbl QP_PREQ_GRP.LINE_DETAIL_ATTR_TBL_TYPE;
14552   l_related_lines_tbl QP_PREQ_GRP.RELATED_LINES_TBL_TYPE;
14553   l_control_rec QP_PREQ_GRP.CONTROL_RECORD_TYPE;
14554   --l_return_status          VARCHAR2(30);
14555   --l_return_status_text     VARCHAR2(240);
14556 
14557   PRICE_REQUEST_EXC EXCEPTION;
14558 
14559   l_routine VARCHAR2(50) := 'Routine :QP_PREQ_PUB.Price_Request ';
14560 
14561 
14562   BEGIN
14563 
14564 
14565     PRICE_REQUEST
14566     (p_line_tbl => l_line_tbl,
14567      p_qual_tbl => l_qual_tbl,
14568      p_line_attr_tbl => l_line_attr_tbl,
14569      p_line_detail_tbl => l_line_detail_tbl,
14570      p_line_detail_qual_tbl => l_line_detail_qual_tbl,
14571      p_line_detail_attr_tbl => l_line_detail_attr_tbl,
14572      p_related_lines_tbl => l_related_lines_tbl,
14573      p_control_rec => p_control_rec,
14574      x_line_tbl => l_line_tbl,
14575      x_line_qual => l_qual_tbl,
14576      x_line_attr_tbl => l_line_attr_tbl,
14577      x_line_detail_tbl => l_line_detail_tbl,
14578      x_line_detail_qual_tbl => l_line_detail_qual_tbl,
14579      x_line_detail_attr_tbl => l_line_detail_attr_tbl,
14580      x_related_lines_tbl => l_related_lines_tbl,
14581      x_return_status => x_return_status,
14582      x_return_status_text => x_return_status_text
14583      );
14584 
14585     /*
14586 IF l_return_status IN (FND_API.G_RET_STS_ERROR
14587                                   ,FND_API.G_RET_STS_UNEXP_ERROR)
14588 THEN
14589 
14590         RAISE PRICE_REQUEST_EXC;
14591 END IF;
14592 */
14593 
14594 
14595 
14596   EXCEPTION
14597     WHEN PRICE_REQUEST_EXC THEN
14598       IF l_debug = FND_API.G_TRUE THEN
14599         QP_PREQ_GRP.ENGINE_DEBUG('Exception Price Request: '|| SQLERRM);
14600       END IF;
14601       NULL;
14602       -- x_return_status := FND_API.G_RET_STS_ERROR;
14603       -- x_return_status_TEXT := l_routine||' '||SQLERRM;
14604     WHEN OTHERS THEN
14605       IF l_debug = FND_API.G_TRUE THEN
14606         QP_PREQ_GRP.ENGINE_DEBUG('Exception Price Request: '|| SQLERRM);
14607       END IF;
14608       x_return_status := FND_API.G_RET_STS_ERROR;
14609       x_return_status_TEXT := l_routine ||' '|| SQLERRM;
14610 
14611   END PRICE_REQUEST;
14612 
14613   --procedure to return price and status code and text -- needed by PO team
14614   -- changed the out param value for x_adjusted_unit_price to qp_npreq_lines_tmp.order_uom_selling_price
14615   PROCEDURE get_price_for_line(p_line_index IN NUMBER,
14616                                p_line_id IN NUMBER,
14617                                x_line_unit_price OUT NOCOPY NUMBER,
14618                                x_adjusted_unit_price OUT NOCOPY NUMBER,
14619                                x_return_status OUT NOCOPY VARCHAR2,
14620                                x_pricing_status_code OUT NOCOPY VARCHAR2,
14621                                x_pricing_status_text OUT NOCOPY VARCHAR2
14622                                )
14623   IS
14624 
14625   l_routine VARCHAR2(100) := 'Routine :QP_PREQ_PUB.get_price_for_line ';
14626   BEGIN
14627 
14628     IF l_debug = FND_API.G_TRUE THEN
14629       QP_PREQ_GRP.ENGINE_DEBUG('In : ' || l_routine);
14630       QP_PREQ_GRP.ENGINE_DEBUG('p_line_index : ' || p_line_index);
14631       QP_PREQ_GRP.ENGINE_DEBUG('p_line_id : ' || p_line_id);
14632     END IF;
14633 
14634     --added by yangli for java engine
14635     IF QP_JAVA_ENGINE_UTIL_PUB.Java_Engine_Running = 'N' THEN
14636       IF l_debug = FND_API.G_TRUE THEN
14637         QP_PREQ_GRP.ENGINE_DEBUG('java engine is not running');
14638       END IF;
14639       IF p_line_index IS NOT NULL THEN
14640         SELECT line_unit_price,
14641              order_uom_selling_price,
14642              pricing_status_code,
14643              pricing_status_text
14644         INTO   x_line_unit_price,
14645              x_adjusted_unit_price,
14646              x_pricing_status_code,
14647              x_pricing_status_text
14648         FROM   QP_NPREQ_LINES_TMP
14649         WHERE  line_index = p_line_index;
14650       ELSIF p_line_id IS NOT NULL THEN
14651         SELECT line_unit_price,
14652              order_uom_selling_price,
14653              pricing_status_code,
14654              pricing_status_text
14655         INTO   x_line_unit_price,
14656              x_adjusted_unit_price,
14657              x_pricing_status_code,
14658              x_pricing_status_text
14659         FROM   QP_NPREQ_LINES_TMP
14660         WHERE  line_id = p_line_id;
14661       ELSE
14662         x_return_status := FND_API.G_RET_STS_ERROR;
14663         x_pricing_status_text := 'Must pass either p_line_index or p_line_id while calling ' || l_routine;
14664       END IF;
14665       --added by yangli for java engine
14666     ELSE
14667       IF l_debug = FND_API.G_TRUE THEN
14668         QP_PREQ_GRP.ENGINE_DEBUG('java engine running');
14669       END IF;
14670       IF p_line_index IS NOT NULL THEN
14671         SELECT line_unit_price,
14672              order_uom_selling_price,
14673              pricing_status_code,
14674              pricing_status_text
14675         INTO   x_line_unit_price,
14676              x_adjusted_unit_price,
14677              x_pricing_status_code,
14678              x_pricing_status_text
14679         FROM   QP_INT_LINES
14680         WHERE  line_index = p_line_index;
14681       ELSIF p_line_id IS NOT NULL THEN
14682         SELECT line_unit_price,
14683              order_uom_selling_price,
14684              pricing_status_code,
14685              pricing_status_text
14686         INTO   x_line_unit_price,
14687              x_adjusted_unit_price,
14688              x_pricing_status_code,
14689              x_pricing_status_text
14690         FROM   QP_INT_LINES
14691         WHERE  line_id = p_line_id;
14692       ELSE
14693         x_return_status := FND_API.G_RET_STS_ERROR;
14694         x_pricing_status_text := 'Must pass either p_line_index or p_line_id while calling ' || l_routine;
14695       END IF;
14696     END IF;
14697 
14698     IF l_debug = FND_API.G_TRUE THEN
14699       QP_PREQ_GRP.ENGINE_DEBUG('x_line_unit_price : ' || x_line_unit_price);
14700       QP_PREQ_GRP.ENGINE_DEBUG('x_adjusted_unit_price : ' || x_adjusted_unit_price);
14701       QP_PREQ_GRP.ENGINE_DEBUG('x_pricing_status_code : ' || x_pricing_status_code);
14702       QP_PREQ_GRP.ENGINE_DEBUG('x_pricing_status_text : ' || x_pricing_status_text);
14703     END IF;
14704 
14705     IF x_pricing_status_code IN (QP_PREQ_GRP.G_STATUS_NEW, QP_PREQ_GRP.G_STATUS_UPDATED, QP_PREQ_GRP.G_STATUS_UNCHANGED) THEN
14706       x_return_status := FND_API.G_RET_STS_SUCCESS;
14707     ELSE
14708       x_return_status := FND_API.G_RET_STS_ERROR;
14709     END IF;
14710 
14711   EXCEPTION
14712 
14713     WHEN NO_DATA_FOUND THEN
14714       IF l_debug = FND_API.G_TRUE THEN
14715         QP_PREQ_GRP.ENGINE_DEBUG('no_data_found Exception in : ' || l_routine || ' ' || SQLERRM);
14716       END IF;
14717       x_return_status := FND_API.G_RET_STS_ERROR;
14718       x_pricing_status_text := 'No record found for line_index ' || p_line_index || ' or line_id ' || p_line_id || ' in ' || l_routine;
14719 
14720     WHEN OTHERS THEN
14721       IF l_debug = FND_API.G_TRUE THEN
14722         QP_PREQ_GRP.ENGINE_DEBUG('Others Exception in : ' || l_routine || ' ' || SQLERRM);
14723       END IF;
14724       x_return_status := FND_API.G_RET_STS_ERROR;
14725       x_pricing_status_text := 'Others Exception in : ' || l_routine || ' ' || SQLERRM;
14726   END get_price_for_line;
14727 
14728 
14729 END QP_PREQ_PUB;