[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;