1 PACKAGE BODY QP_Resolve_Incompatability_PVT AS
2 /* $Header: QPXVINCB.pls 120.21.12020000.2 2012/07/04 12:16:42 smbalara ship $ */
3
4 L_PRICE_LIST_PHASE_ID CONSTANT NUMBER := 1;
5 l_debug VARCHAR2(3) ;
6
7 FUNCTION Precedence_For_List_Line(p_list_header_id NUMBER,
8 p_list_line_id NUMBER,
9 p_incomp_grp_id VARCHAR2,
10 p_line_index NUMBER,
11 p_pricing_phase_id NUMBER)
12 RETURN NUMBER IS
13
14 v_number number;
15
16 V_QUALIFIER_TYPE CONSTANT VARCHAR2(240) := 'QUALIFIER';
17 /*
18
19 INDX,QP_Resolve_Incompatability_PVTRUN.precedence_for_list_line.precedence_for_line_cur,qp_npreq_line_attrs_tmp_N1,LINE_INDEX,1
20 INDX,QP_Resolve_Incompatability_PVTRUN.precedence_for_list_line.precedence_for_line_cur,qp_npreq_line_attrs_tmp_N1,ATTRIBUTE_TYPE,2
21 INDX,QP_Resolve_Incompatability_PVTRUN.precedence_for_list_line.precedence_for_line_cur,qp_npreq_line_attrs_tmp_N1,PRICING_STATUS_CODE,3
22 INDX,QP_Resolve_Incompatability_PVTRUN.precedence_for_list_line.precedence_for_line_cur,qp_npreq_line_attrs_tmp_N1,LIST_HEADER_ID,4
23 INDX,QP_Resolve_Incompatability_PVTRUN.precedence_for_list_line.precedence_for_line_cur,qp_npreq_line_attrs_tmp_N1,LIST_LINE_ID,5
24
25 UNION
26 INDX,QP_Resolve_Incompatability_PVTRUN.precedence_for_list_line.precedence_for_line_cur,qp_npreq_ldets_tmp_N1,LINE_INDEX,1
27 INDX,QP_Resolve_Incompatability_PVTRUN.precedence_for_list_line.precedence_for_line_cur,qp_npreq_ldets_tmp_N1,PRICING_STATUS_CODE,2
28 INDX,QP_Resolve_Incompatability_PVTRUN.precedence_for_list_line.precedence_for_line_cur,qp_npreq_ldets_tmp_N1,PRICING_PHASE_ID,3
29 INDX,QP_Resolve_Incompatability_PVTRUN.precedence_for_list_line.precedence_for_line_cur,qp_npreq_ldets_tmp_N1,CREATED_FROM_LIST_HEADER_ID,4
30 INDX,QP_Resolve_Incompatability_PVTRUN.precedence_for_list_line.precedence_for_line_cur,qp_npreq_ldets_tmp_N1,CREATED_FROM_LIST_LINE_ID,5
31
32 */
33 --Precedence for line cur
34 -- Pricing Phase Change
35 CURSOR precedence_for_line_cur IS
36 SELECT nvl(a.QUALIFIER_PRECEDENCE,5000) PRECED
37 FROM qp_npreq_line_attrs_tmp a
38 WHERE a.LIST_LINE_ID = p_list_line_id
39 AND a.LIST_HEADER_ID = p_list_header_id
40 AND a.ATTRIBUTE_TYPE = 'QUALIFIER'
41 AND a.INCOMPATABILITY_GRP_CODE = p_incomp_grp_id
42 AND a.PRICING_PHASE_ID = p_pricing_phase_id
43 AND a.PRICING_STATUS_CODE = 'N'
44 AND a.LINE_INDEX = p_line_index
45 UNION
46 SELECT nvl(a.PRODUCT_PRECEDENCE,5000) PRECED
47 FROM qp_npreq_ldets_tmp a
48 WHERE a.CREATED_FROM_LIST_LINE_ID = p_list_line_id
49 AND a.CREATED_FROM_LIST_HEADER_ID = p_list_header_id
50 AND a.INCOMPATABILITY_GRP_CODE = p_incomp_grp_id
51 AND a.PRICING_PHASE_ID = p_pricing_phase_id
52 AND a.PRICING_STATUS_CODE = 'N'
53 AND a.LINE_INDEX = p_line_index
54 ORDER BY 1;
55
56 BEGIN
57
58 OPEN precedence_for_line_cur;
59 FETCH precedence_for_line_cur INTO v_number;
60 CLOSE precedence_for_line_cur;
61
62 RETURN v_number;
63
64 END Precedence_For_List_Line;
65
66 -- Used only for precedence processing of price list lines
67 PROCEDURE Precedence_For_Price_List_Line(p_line_index NUMBER,
68 p_order_uom_code VARCHAR2,
69 p_primary_uom_flag VARCHAR2,
70 x_precedence_tbl OUT NOCOPY precedence_tbl_type,
71 x_return_status OUT NOCOPY VARCHAR2,
72 x_return_status_text OUT NOCOPY VARCHAR2) IS
73
74
75 CURSOR get_product_details_cur(p_list_line_id number) IS
76 SELECT product_uom_code,attribute,value_from inventory_item_id
77 FROM qp_npreq_line_attrs_tmp a
78 WHERE a.LIST_LINE_ID = p_list_line_id
79 AND a.LINE_INDEX = p_line_index
80 AND a.ATTRIBUTE_TYPE = 'PRODUCT'
81 AND a.PRICING_PHASE_ID = 1
82 AND a.PRICING_STATUS_CODE = 'N';
83
84 CURSOR get_inventory_item_id_cur(p_line_index NUMBER) IS
85 SELECT value_from
86 FROM qp_npreq_line_attrs_tmp
87 WHERE line_index = p_line_index
88 AND attribute_type = QP_PREQ_GRP.G_PRODUCT_TYPE
89 AND context = 'ITEM'
90 AND attribute = 'PRICING_ATTRIBUTE1'
91 AND pricing_status_code = QP_PREQ_GRP.G_STATUS_UNCHANGED;
92
93 l_product_uom_code VARCHAR2(30);
94 l_attribute VARCHAR2(30);
95 l_inventory_item_id VARCHAR2(30);
96 l_list_line_id NUMBER;
97
98 g_precedence_tbl QP_PREQ_GRP.NUMBER_TYPE;
99 g_qual_precedence_tbl QP_PREQ_GRP.NUMBER_TYPE;
100 g_list_line_id_tbl QP_PREQ_GRP.NUMBER_TYPE;
101 v_number NUMBER;
102 v_routine_name CONSTANT VARCHAR2(40) := 'Precedence_For_Price_List_Line';
103
104 type refcur is ref cursor;
105
106 l_precedence_for_line_cur refcur;
107
108 l_prev_precedence NUMBER := -9999;
109 l_prev_qual_precedence NUMBER := -9999;
110 v_counter NUMBER := 0;
111 l_exit_status VARCHAR2(1) := 'F';
112 nROWS number := 1000;
113
114 BEGIN
115 l_debug := QP_PREQ_GRP.G_DEBUG_ENGINE;
116
117 IF (p_order_uom_code IS NOT NULL) THEN
118
119 IF l_debug = FND_API.G_TRUE THEN
120 QP_PREQ_GRP.engine_debug('Opening Order Uom Cur : ' || p_order_uom_code);
121
122 END IF;
123 -- Method to derive QUAL_PRECED
124 --In first select of 2 way UNION , there is a qualifier on primary price list , it will be -99999 as prim pl as high preced
125 --In second select of 2 way UNION , if there is no secondary price list , so QUAL_PRECED is defaulted to -99999,since it is
126 --coming from primary price list and not secondary price list and it should have more precedence
127
128 -- shulin
129 -- uom match comdition is added, when order_uom does not match product uom (uom conversion should happen)
130 -- this cursor should not return list_line_id, which will cause UOM conversion not happening
131 -- Bug 2490074 Join with qp_npreq_ldets_tmp is added in 1st part of union to pick only undeleted lines.
132 -- Bug 2687089 Commented exists and addded join with qp_npreq_line_attrs_tmp
133 OPEN l_precedence_for_line_cur FOR
134 SELECT distinct nvl(a.QUALIFIER_PRECEDENCE,5000) PRECED , a.LIST_LINE_ID , -99999 QUAL_PRECED
135 FROM qp_npreq_line_attrs_tmp a , qp_npreq_ldets_tmp c , qp_npreq_line_attrs_tmp b
136 WHERE a.ATTRIBUTE_TYPE = 'QUALIFIER'
137 AND a.INCOMPATABILITY_GRP_CODE = 'EXCL'
138 AND a.PRICING_PHASE_ID = 1
139 AND a.PRICING_STATUS_CODE = 'N'
140 AND a.LINE_INDEX = p_line_index
141 AND b.PRICING_STATUS_CODE = 'N'
142 AND b.LINE_INDEX = p_line_index
143 AND b.INCOMPATABILITY_GRP_CODE = 'EXCL'
144 AND b.PRICING_PHASE_ID = 1
145 AND b.ATTRIBUTE_TYPE = QP_PREQ_GRP.G_PRODUCT_TYPE
146 AND b.PRODUCT_UOM_CODE = p_order_uom_code
147 AND b.LINE_DETAIL_TYPE_CODE <> QP_PREQ_GRP.G_CHILD_DETAIL_TYPE
148 AND b.list_line_id = a.LIST_LINE_ID
149 /* AND EXISTS (SELECT 'X' -- uom match, shulin
150 FROM qp_npreq_line_attrs_tmp b
151 WHERE LINE_INDEX = p_line_index
152 AND PRICING_STATUS_CODE = 'N'
153 AND INCOMPATABILITY_GRP_CODE = 'EXCL'
154 AND PRICING_PHASE_ID = 1
155 AND ATTRIBUTE_TYPE = QP_PREQ_GRP.G_PRODUCT_TYPE
156 AND PRODUCT_UOM_CODE = p_order_uom_code
157 AND LINE_DETAIL_TYPE_CODE <> QP_PREQ_GRP.G_CHILD_DETAIL_TYPE
158 AND a.LIST_LINE_ID = b.LIST_LINE_ID) */
159 AND a.LINE_DETAIL_INDEX = c.LINE_DETAIL_INDEX
160 AND c.PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_NEW
161
162 UNION
163 SELECT z.PRECED , z.LIST_LINE_ID , z.QUALIFIER_PRECEDENCE QUAL_PRECED
164 FROM (
165 SELECT /*+ ORDERED USE_NL(b) index(c qp_preq_line_attrs_tmp_N5) rec_exist_with_order_uom_cur */
166 nvl(b.PRODUCT_PRECEDENCE,5000) PRECED , c.LIST_LINE_ID , nvl(c.QUALIFIER_PRECEDENCE,-99999) QUALIFIER_PRECEDENCE
167 FROM qp_npreq_line_attrs_tmp c,qp_npreq_ldets_tmp b
168 WHERE c.PRICING_PHASE_ID = L_PRICE_LIST_PHASE_ID
169 AND c.PRODUCT_UOM_CODE = p_order_uom_code
170 AND c.ATTRIBUTE_TYPE = QP_PREQ_GRP.G_PRODUCT_TYPE
171 AND c.LINE_INDEX = p_line_index
172 AND c.INCOMPATABILITY_GRP_CODE = 'EXCL'
173 AND c.LINE_DETAIL_TYPE_CODE <> QP_PREQ_GRP.G_CHILD_DETAIL_TYPE
174 AND c.LINE_DETAIL_INDEX = b.LINE_DETAIL_INDEX
175 AND b.PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_NEW
176 AND c.PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_NEW
177 ORDER BY 3,1) z
178 ORDER BY 3,1;
179 ELSE
180
181 IF l_debug = FND_API.G_TRUE THEN
182 QP_PREQ_GRP.engine_debug('Opening Primary Uom Cur');
183
184 END IF;
185 /* Modified cursor l_precedence_for_line_cur for 2780293 */
186 OPEN l_precedence_for_line_cur FOR
187 SELECT nvl(a.QUALIFIER_PRECEDENCE,5000) PRECED , a.LIST_LINE_ID , -99999 QUAL_PRECED
188 FROM qp_npreq_line_attrs_tmp a, qp_npreq_ldets_tmp c, qp_npreq_line_attrs_tmp b
189 WHERE a.ATTRIBUTE_TYPE = 'QUALIFIER'
190 AND a.INCOMPATABILITY_GRP_CODE = 'EXCL'
191 AND a.PRICING_PHASE_ID = 1
192 AND a.PRICING_STATUS_CODE = 'N'
193 AND a.LINE_INDEX = p_line_index
194 AND b.PRICING_STATUS_CODE = 'N'
195 AND b.LINE_INDEX = p_line_index
196 AND b.INCOMPATABILITY_GRP_CODE = 'EXCL'
197 AND b.PRICING_PHASE_ID = 1
198 AND b.ATTRIBUTE_TYPE = QP_PREQ_GRP.G_PRODUCT_TYPE
199 AND b.PRIMARY_UOM_FLAG = QP_PREQ_GRP.G_YES
200 AND b.LINE_DETAIL_TYPE_CODE <> QP_PREQ_GRP.G_CHILD_DETAIL_TYPE
201 AND b.list_line_id = a.LIST_LINE_ID
202 AND a.LINE_DETAIL_INDEX = c.LINE_DETAIL_INDEX
203 AND c.PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_NEW
204
205
206 UNION
207 SELECT z.PRECED , z.LIST_LINE_ID , z.QUALIFIER_PRECEDENCE QUAL_PRECED
208 FROM(
209 SELECT /*+ ORDERED USE_NL(c d) index(b qp_preq_line_attrs_tmp_N5) rec_exist_with_pri_flag_cur */
210 nvl(c.PRODUCT_PRECEDENCE,5000) PRECED , b.LIST_LINE_ID , nvl(b.QUALIFIER_PRECEDENCE ,-99999) QUALIFIER_PRECEDENCE
211 FROM qp_npreq_line_attrs_tmp b,qp_npreq_ldets_tmp c
212 WHERE b.PRIMARY_UOM_FLAG = QP_PREQ_GRP.G_YES
213 AND b.PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_NEW
214 AND b.CONTEXT = 'ITEM'
215 AND b.ATTRIBUTE_TYPE = QP_PREQ_GRP.G_PRODUCT_TYPE
216 AND b.LINE_DETAIL_TYPE_CODE <> QP_PREQ_GRP.G_CHILD_DETAIL_TYPE
217 AND b.INCOMPATABILITY_GRP_CODE = 'EXCL'
218 AND b.LINE_INDEX = p_line_index
219 AND b.PRICING_PHASE_ID = L_PRICE_LIST_PHASE_ID
220 AND c.LINE_DETAIL_INDEX = b.LINE_DETAIL_INDEX
221 AND c.PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_NEW
222 ORDER BY 3,1) z
223 ORDER BY 3,1;
224 END IF;
225
226 LOOP -- Outer Main Loop
227
228 g_precedence_tbl.delete;
229 g_qual_precedence_tbl.delete;
230 g_list_line_id_tbl.delete;
231
232 FETCH l_precedence_for_line_cur BULK COLLECT INTO g_precedence_tbl,g_list_line_id_tbl,g_qual_precedence_tbl LIMIT nROWS;
233 EXIT WHEN g_list_line_id_tbl.count = 0;
234
235 IF (g_list_line_id_tbl.count > 0) THEN
236
237 IF l_debug = FND_API.G_TRUE THEN
238 QP_PREQ_GRP.engine_debug('List Line Table Count: ' || g_list_line_id_tbl.count);
239
240 END IF;
241 FOR j in g_list_line_id_tbl.first .. g_list_line_id_tbl.last -- Inner Loop
242 LOOP
243
244 IF (v_counter=0) THEN
245 l_prev_precedence := g_precedence_tbl(j);
246 l_prev_qual_precedence := g_qual_precedence_tbl(j);
247 END IF;
248
249 IF l_debug = FND_API.G_TRUE THEN
250 QP_PREQ_GRP.engine_debug('High Qual Preced Is : ' || g_qual_precedence_tbl(j));
251 QP_PREQ_GRP.engine_debug('High Prod Preced Is : ' || g_precedence_tbl(j) || ' List Line Id: ' || g_list_line_id_tbl(j));
252
253 END IF;
254 -- Load all list lines with same precedence and if different exit out
255 -- On change of either qualifier and product precedence stop
256 --Ex: Qual Preced :0 Prod Preced:220
257 -- Qual Preced :0 Prod Preced:315 we should not process this record
258 IF (l_prev_qual_precedence = g_qual_precedence_tbl(j) and l_prev_precedence = g_precedence_tbl(j)) THEN
259
260 x_precedence_tbl(j).created_from_list_line_id := g_list_line_id_tbl(j);
261 x_precedence_tbl(j).product_precedence := g_precedence_tbl(j);
262 v_counter := v_counter + 1;
263
264 IF (p_primary_uom_flag IS NOT NULL) THEN -- pri uom cur
265 l_product_uom_code := NULL;
266 OPEN get_product_details_cur(g_list_line_id_tbl(j));
267 FETCH get_product_details_cur INTO l_product_uom_code,l_attribute,l_inventory_item_id;
268 CLOSE get_product_details_cur;
269
270 x_precedence_tbl(j).product_uom_code := l_product_uom_code;
271
272 IF (l_attribute <> 'PRICING_ATTRIBUTE1') THEN
273 l_inventory_item_id := NULL; -- Reset
274 OPEN get_inventory_item_id_cur(p_line_index);
275 FETCH get_inventory_item_id_cur INTO l_inventory_item_id;
276 CLOSE get_inventory_item_id_cur;
277
278 IF l_debug = FND_API.G_TRUE THEN
279 QP_PREQ_GRP.engine_debug('Attribute Is : ' || l_attribute);
280 QP_PREQ_GRP.engine_debug('Inventory Item Id For Item Specific : ' || l_inventory_item_id);
281
282 END IF;
283 IF (l_inventory_item_id IS NULL) THEN
284 IF l_debug = FND_API.G_TRUE THEN
285 QP_PREQ_GRP.engine_debug('Could not find Item Specific. Doing generic conversion');
286 END IF;
287 x_precedence_tbl(j).inventory_item_id := 0;
288 ELSE
289 x_precedence_tbl(j).inventory_item_id := l_inventory_item_id;
290 END IF;
291
292 ELSE -- IF (l_attribute <> 'PRICING_ATTRIBUTE1')
293 IF l_debug = FND_API.G_TRUE THEN
294 QP_PREQ_GRP.engine_debug('Inventory Item Id For Item: ' || l_inventory_item_id);
295 END IF;
296 x_precedence_tbl(j).inventory_item_id := l_inventory_item_id;
297 END IF; -- IF (l_attribute <> 'PRICING_ATTRIBUTE1')
298
299 END IF; -- (p_primary_uom_flag IS NOT NULL)
300 ELSE -- l_prev_precedence = g_precedence_tbl(j)
301 IF l_debug = FND_API.G_TRUE THEN
302 QP_PREQ_GRP.engine_debug('Exiting the inner loop after loading the higher precedence list lines');
303 END IF;
304 l_exit_status := 'T';
305 EXIT; -- Inner Loop
306 END IF; -- l_prev_precedence = g_precedence_tbl(j)
307
308 END LOOP;
309
310 IF (l_exit_status = 'T') THEN
311 IF l_debug = FND_API.G_TRUE THEN
312 QP_PREQ_GRP.engine_debug('Exiting the outer loop after loading the higher precedence list lines');
313 END IF;
314 EXIT; -- Outer Main Loop
315 END IF;
316
317 END IF; -- G_LIST_LINE_ID_TBL.COUNT > 0
318
319 END LOOP; -- Main Loop
320 CLOSE l_precedence_for_line_cur;
321
322 IF (x_precedence_tbl.COUNT > 0) THEN
323 FOR k in x_precedence_tbl.FIRST .. x_precedence_tbl.LAST
324 LOOP
325 IF l_debug = FND_API.G_TRUE THEN
326 QP_PREQ_GRP.engine_debug('PPL List Line Id : ' || x_precedence_tbl(k).created_from_list_line_id);
327 QP_PREQ_GRP.engine_debug('PPL Precedence : ' || x_precedence_tbl(k).product_precedence);
328 QP_PREQ_GRP.engine_debug('PPL Inventory Item Id: ' || x_precedence_tbl(k).inventory_item_id);
329 QP_PREQ_GRP.engine_debug('PPL Product Uom : ' || x_precedence_tbl(k).product_uom_code);
330 END IF;
331 END LOOP;
332 END IF;
333
334 EXCEPTION
335 WHEN OTHERS THEN
336 IF l_debug = FND_API.G_TRUE THEN
337 QP_PREQ_GRP.engine_debug('In Routine Precedence_For_Price_List_Line : ' || SQLERRM);
338 END IF;
339 x_return_status := FND_API.G_RET_STS_ERROR;
340 x_return_status_text := v_routine_name || ' ' || SQLERRM;
341 END Precedence_For_Price_List_Line;
342
343 Procedure sort_on_precedence(p_sorted_tbl in out Nocopy precedence_tbl_type) Is
344
345 h PLS_INTEGER:=1;
346 i PLS_INTEGER;
347 j PLS_INTEGER;
348 N PLS_INTEGER;
349
350 l_Sorted_Precedence_Rec precedence_rec_type;
351
352 Begin
353 N := p_sorted_tbl.count;
354 --DBMS_OUTPUT.PUT_LINE('Determining h step size...');
355
356 For k in 1..N Loop
357 h:= h*3 + 1;
358 exit when h*3 + 1 > N;
359 End Loop;
360
361 --DBMS_OUTPUT.PUT_LINE('h: '||h);
362
363 For k in 1..h Loop
364 --DBMS_OUTPUT.PUT_LINE('h2:'||h);
365 i:= h + 1;
366 For i in h+1..N Loop
367 l_Sorted_Precedence_Rec := p_sorted_tbl(i);
368 j:=i;
369 While ((j > h) and (nvl(p_sorted_tbl(j-h).product_precedence, -1) > nvl(l_Sorted_Precedence_Rec.product_precedence,-1)))
370 Loop
371 p_sorted_tbl(j) := p_sorted_tbl(j-h);
372 j:=j-h;
373 End Loop;
374 p_sorted_tbl(j):=l_Sorted_Precedence_Rec;
375 End Loop;
376 h:= h/3;
377 Exit When h < 1;
378 End Loop;
379
380 End sort_on_precedence;
381
382
383 PROCEDURE Update_Invalid_List_Lines(p_incomp_grp_code VARCHAR2,
384 p_line_index NUMBER,
385 p_pricing_phase_id NUMBER,
386 p_status_code VARCHAR2,
387 p_status_text VARCHAR2,
388 x_return_status OUT NOCOPY VARCHAR2,
389 x_return_status_text OUT NOCOPY VARCHAR2) AS
390
391 v_routine_name CONSTANT VARCHAR2(240):='Routine:QP_Resolve_Incompatability_PVTRUN.Update_Invalid_List_Lines';
392 BEGIN
393
394 /*
395 INDX,QP_Resolve_Incompatability_PVTRUN.update_invalid_list_lines.upd1,qp_npreq_lines_tmp_N1,LINE_INDEX,1
396 INDX,QP_Resolve_Incompatability_PVTRUN.update_invalid_list_lines.upd2,qp_npreq_lines_tmp_N1,LINE_INDEX,1
397 */
398
399 IF p_status_code IN (QP_PREQ_GRP.G_STATUS_DUP_PRICE_LIST,QP_PREQ_GRP.G_STATUS_INVALID_UOM_CONV) THEN
400 UPDATE qp_npreq_lines_tmp -- upd1
401 SET PRICING_STATUS_CODE = p_status_code,
402 PRICING_STATUS_TEXT = p_status_text,
403 PROCESSED_CODE = NULL -- To prevent big search from hapenning , if failed in mini search due to above reasons
404 WHERE LINE_INDEX = p_line_index;
405 ELSIF (p_status_code = QP_PREQ_GRP.G_STATUS_INVALID_UOM) THEN
406 UPDATE qp_npreq_lines_tmp -- upd2
407 SET PROCESSED_CODE = QP_PREQ_GRP.G_STS_LHS_NOT_FOUND,
408 PRICING_STATUS_CODE = p_status_code,
409 PRICING_STATUS_TEXT = p_status_text
410 WHERE LINE_INDEX = p_line_index;
411 END IF;
412
413 /*
414 INDX,QP_Resolve_Incompatability_PVTRUN.update_invalid_list_lines.upd3,qp_npreq_ldets_tmp_N1,LINE_INDEX,1
415 INDX,QP_Resolve_Incompatability_PVTRUN.update_invalid_list_lines.upd3,qp_npreq_ldets_tmp_N1,PRICING_STATUS_CODE,2
416 INDX,QP_Resolve_Incompatability_PVTRUN.update_invalid_list_lines.upd3,qp_npreq_ldets_tmp_N1,PRICING_PHASE_ID,3
417 */
418
419 UPDATE qp_npreq_ldets_tmp -- upd3
420 SET PRICING_STATUS_CODE = p_status_code
421 WHERE INCOMPATABILITY_GRP_CODE = p_incomp_grp_code
422 AND LINE_INDEX = p_line_index
423 AND PRICING_PHASE_ID = p_pricing_phase_id
424 AND PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_NEW;
425
426 /* UPDATE qp_npreq_line_attrs_tmp a
427 SET a.PRICING_STATUS_CODE = p_status_code
428 WHERE a.LIST_LINE_ID
429 IN (SELECT b.CREATED_FROM_LIST_LINE_ID
430 FROM qp_npreq_ldets_tmp b
431 WHERE b.PRICING_STATUS_CODE = p_status_code
432 AND b.PRICING_PHASE_ID = p_pricing_phase_id
433 AND b.INCOMPATABILITY_GRP_CODE = p_incomp_grp_code
434 AND b.LINE_INDEX = p_line_index)
435 AND a.LINE_INDEX = p_line_index; */
436
437 EXCEPTION
438 WHEN OTHERS THEN
439 x_return_status := FND_API.G_RET_STS_ERROR;
440 x_return_status_text := v_routine_name || ' ' || SQLERRM;
441 END Update_Invalid_List_lines;
442
443
444 PROCEDURE Determine_Pricing_UOM_And_Qty(p_line_index NUMBER,
445 p_order_uom_code VARCHAR2,
446 p_order_qty NUMBER,
447 p_pricing_phase_id NUMBER,
448 p_call_big_search BOOLEAN,
449 x_list_line_id OUT NOCOPY NUMBER,
450 x_return_status OUT NOCOPY VARCHAR2,
451 x_return_status_txt OUT NOCOPY VARCHAR2) IS
452
453 /*
454 INDX,QP_Resolve_Incompatability_PVTRUN.determine_pricing_uom_and_qty.incomp_cur,qp_npreq_ldets_tmp_N2,PRICING_PHASE_ID,1
455 INDX,QP_Resolve_Incompatability_PVTRUN.determine_pricing_uom_and_qty.incomp_cur,qp_npreq_ldets_tmp_N2,PRICING_STATUS_CODE,2
456 INDX,QP_Resolve_Incompatability_PVTRUN.determine_pricing_uom_and_qty.incomp_cur,qp_npreq_lines_tmp_N2,LINE_INDEX,3
457 */
458 --shulin bug 1829731, add contract_start_date, contract_end_date
459 --[julin/pricebook] added hint for qp_npreq_ldets_tmp
460 CURSOR incomp_cur IS
461 SELECT /*+ ORDERED USE_NL(a) INDEX(a QP_PREQ_LDETS_TMP_N2) */
462 DISTINCT a.LINE_INDEX , a.INCOMPATABILITY_GRP_CODE ,a.PRICING_STATUS_CODE,b.LINE_UOM_CODE,b.LINE_QUANTITY,
463 b.PROCESSING_ORDER,b.UOM_QUANTITY, b.CONTRACT_START_DATE, b.CONTRACT_END_DATE
464 FROM qp_npreq_lines_tmp b , qp_npreq_ldets_tmp a
465 WHERE a.INCOMPATABILITY_GRP_CODE IS NOT NULL
466 AND a.PRICING_PHASE_ID = p_pricing_phase_id
467 AND a.PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_NEW
468 AND a.LINE_INDEX = b.LINE_INDEX
469 --AND b.PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_UNCHANGED
470 ORDER BY a.LINE_INDEX;
471
472 /*
473 INDX,QP_Resolve_Incompatability_PVTRUN.determine_pricing_uom_and_qty.get_attribute_count_cur,qp_npreq_line_attrs_tmp_N1,LINE_INDEX,1
474 INDX,QP_Resolve_Incompatability_PVTRUN.determine_pricing_uom_and_qty.get_attribute_count_cur,qp_npreq_line_attrs_tmp_N1,ATTRIBUTE_TYPE,2
475 INDX,QP_Resolve_Incompatability_PVTRUN.determine_pricing_uom_and_qty.get_attribute_count_cur,qp_npreq_line_attrs_tmp_N1,PRICING_STATUS_CODE,3
476 */
477
478 CURSOR get_attribute_count_cur(p_line_index NUMBER , p_list_line_id NUMBER) IS
479 SELECT COUNT(*) ATTRIBUTE_COUNT
480 FROM qp_npreq_line_attrs_tmp
481 WHERE LIST_LINE_ID = p_list_line_id
482 AND LINE_INDEX = p_line_index
483 AND ATTRIBUTE_TYPE = QP_PREQ_GRP.G_PRICING_TYPE
484 AND PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_NEW;
485
486
487
488 v_list_line_id NUMBER;
489 v_price_list VARCHAR2(240);
490 v_list_precedence NUMBER;
491 v_primary_uom_code VARCHAR2(30);
492 v_pricing_qty NUMBER;
493 v_inventory_item_id NUMBER;
494 v_uom_rate NUMBER;
495 v_dup_list_line_id NUMBER;
496 v_dup_price_list VARCHAR2(240);
497 v_old_precedence NUMBER;
498 v_count NUMBER := 0;
499 v_return_status VARCHAR2(30) := FND_API.G_RET_STS_SUCCESS;
500 v_return_msg VARCHAR2(240);
501 v_precedence NUMBER;
502 v_counter NUMBER := 0;
503 l_id VARCHAR2(30);
504 l_status VARCHAR2(30);
505 v_return_status_text VARCHAR2(200);
506 v_list_line_count1 NUMBER;
507 v_list_line_count2 NUMBER;
508 l_order_uom_code VARCHAR2(30);
509 v_total_count NUMBER;
510
511 l_validate_qty_rtn_status varchar2(1):= NULL;
512 l_output_qty number;
513 l_primary_qty number;
514
515 -- shulin bug 1781829 fix
516 l_max_decimal_digits PLS_INTEGER := nvl(FND_PROFILE.Value ('QP_INV_DECIMAL_PRECISION'),10);
517
518 --begin shulin bug 1829731, add profile qp_time_uom_conversion
519 --l_qp_time_uom_conversion := nvl(FND_PROFILE.Value('QP_TIME_UOM_CONVERSION'), 'STANDARD');
520 l_qp_time_uom_conversion VARCHAR2(20) := 'STANDARD'; --jhkuo
521 l_oks_qty NUMBER := NULL;
522 l_uom_quantity NUMBER := NULL;
523 l_sql_stmt varchar2(240) := NULL;
524 l_order_qty NUMBER := NULL; -- shu_latest
525 -- end shulin bug 1829731
526 l_date_passed VARCHAR2(5) := null;
527 --introduced for calculating unit_price for service items
528 --detailed description of changes in bug 4900095
529 l_duration_passed VARCHAR2(1) := null;
530
531 l_precedence_tbl precedence_tbl_type;
532
533 l_old_line_index NUMBER := -9999;
534
535 v_routine_name CONSTANT VARCHAR2(240):='Routine:QP_Resolve_Incompatability_PVTRUN.Determine_Pricing_UOM_And_Qty';
536
537 l_line_quantity_tbl QP_PREQ_GRP.NUMBER_TYPE;
538 l_line_index_tbl QP_PREQ_GRP.NUMBER_TYPE;
539 l_line_uom_code_tbl QP_PREQ_GRP.VARCHAR_TYPE;
540 l_priced_quantity_tbl QP_PREQ_GRP.NUMBER_TYPE; --shu_latest
541 l_uom_quantity_tbl QP_PREQ_GRP.NUMBER_TYPE; --shu_latest
542 l_order_quantity_tbl QP_PREQ_GRP.NUMBER_TYPE; --shu_latest
543 l_upd_line_index_tbl QP_PREQ_GRP.NUMBER_TYPE; -- 3773652
544 l_upd_priced_qty_tbl QP_PREQ_GRP.NUMBER_TYPE; -- 3773652
545
546 l_line_quantity_tbl_m QP_PREQ_GRP.NUMBER_TYPE;
547 l_line_index_tbl_m QP_PREQ_GRP.NUMBER_TYPE;
548 l_line_uom_code_tbl_m QP_PREQ_GRP.VARCHAR_TYPE;
549 l_priced_quantity_tbl_m QP_PREQ_GRP.NUMBER_TYPE; --shu_latest
550 l_uom_quantity_tbl_m QP_PREQ_GRP.NUMBER_TYPE; --shu_latest
551 l_order_quantity_tbl_m QP_PREQ_GRP.NUMBER_TYPE; --shu_latest
552
553 m PLS_INTEGER := 1;
554 n PLS_INTEGER := 1; -- 3773652
555 l_list_header_id NUMBER := -9999;
556 lx_list_header_id NUMBER := -9999;
557 l_status_text VARCHAR2(500); --Increased length from 240 to 500 for 3103800
558 l_inventory_item_id NUMBER;
559 x_precedence_tbl precedence_tbl_type;
560
561 -- [julin/4330147/4335995]
562 l_uom_conv_success VARCHAR2(1);
563
564 INVALID_UOM EXCEPTION;
565 DUPLICATE_PRICE_LIST EXCEPTION;
566 INVALID_UOM_CONVERSION EXCEPTION;
567
568 BEGIN
569 l_debug := QP_PREQ_GRP.G_DEBUG_ENGINE;
570 IF l_debug = FND_API.G_TRUE THEN
571 QP_PREQ_GRP.engine_debug( 'Determine_Pricing_UOM');
572
573 QP_PREQ_GRP.engine_debug( 'After Determine_Pricing_UOM');
574 QP_PREQ_GRP.engine_debug( 'Pricing Phase Id:'|| p_pricing_phase_id);
575
576 END IF;
577 -- shulin
578 --IF l_debug = FND_API.G_TRUE THEN
579 --QP_PREQ_GRP.engine_debug('QP_TIME_UOM_CONVERSION Profile Setting: ' ||l_qp_time_uom_conversion);
580 --END IF;
581
582 FOR i IN incomp_cur
583 LOOP
584
585 -- [julin/4330147/4335995]
586 l_uom_conv_success := 'Y';
587
588 IF (l_old_line_index <> i.line_index) THEN
589 l_precedence_tbl.delete;
590 v_count := 0;
591 v_list_line_id := NULL;
592 l_list_header_id := -9999;
593 lx_list_header_id := -9999;
594 l_order_uom_code := i.line_uom_code;
595 l_old_line_index := i.line_index;
596 v_pricing_qty := NULL; -- shulin
597 l_oks_qty := NULL; --shulin
598 l_uom_quantity := NULL; -- shulin
599 l_sql_stmt := NULL; -- shulin
600 l_order_qty := i.line_quantity; --shu_latest
601 END IF;
602
603 v_counter := 0;
604 --m := 1;
605
606 --jhkuo, discontinue profile use for partial period pricing of service items
607 IF (i.contract_start_date IS NOT NULL AND i.contract_end_date IS NOT NULL)
608 OR i.uom_quantity IS NOT NULL THEN
609 l_qp_time_uom_conversion := 'ORACLE_CONTRACTS';
610 IF i.uom_quantity IS NOT NULL THEN
611 --bug 4900095
612 l_duration_passed := 'Y';
613 ELSE
614 --bug 4900095
615 l_duration_passed := 'N';
616 END IF;
617 ELSE
618 l_date_passed := 'NOT ';
619 l_qp_time_uom_conversion := 'STANDARD';
620 --bug 4900095
621 l_duration_passed := 'N';
622 END IF;
623
624 IF (FND_PROFILE.Value('QP_TIME_UOM_CONVERSION') = 'STANDARD') THEN --13404970
625 l_date_passed := 'NOT ';
626 l_qp_time_uom_conversion := 'STANDARD';
627 l_duration_passed := 'N';
628 END IF;
629
630 IF l_debug = FND_API.G_TRUE THEN
631 QP_PREQ_GRP.engine_debug('Constract start/end dates '||
632 l_date_passed||
633 'passed in ==> qp_time_uom_conversion = '||
634 l_qp_time_uom_conversion);
635 END IF;
636
637 IF l_debug = FND_API.G_TRUE THEN
638 QP_PREQ_GRP.engine_debug( 'Determine_Pricing_UOM1');
639 QP_PREQ_GRP.engine_debug( I.INCOMPATABILITY_GRP_CODE);
640 QP_PREQ_GRP.engine_debug( 'Line Index:'|| i.line_index);
641
642 END IF;
643 Precedence_For_Price_List_Line(i.line_index,i.line_uom_code,NULL,l_precedence_tbl,l_status,l_status_text);
644
645 IF l_debug = FND_API.G_TRUE THEN
646 QP_PREQ_GRP.engine_debug( ' Debug Point #0');
647
648 QP_PREQ_GRP.engine_debug('Count : ' || l_precedence_tbl.count);
649
650 END IF;
651 -- Sort the table(not needed as it would have only the price list lines with least precedence)
652 /* IF (l_precedence_tbl.COUNT > 0 ) THEN
653 --sort_on_precedence(l_precedence_tbl, l_precedence_tbl.FIRST, l_precedence_tbl.LAST);
654 sort_on_precedence(l_precedence_tbl);
655 END IF; */
656
657 IF (l_precedence_tbl.COUNT > 0 ) THEN
658 v_total_count := l_precedence_tbl.COUNT;
659 v_count := 0;
660 v_list_line_count1 := NULL;
661 IF l_debug = FND_API.G_TRUE THEN
662 QP_PREQ_GRP.engine_debug( 'Precedence Table Count Line : '|| i.line_index ||' Cnt:'|| l_precedence_tbl.count);
663 END IF;
664 FOR j IN l_precedence_tbl.FIRST .. l_precedence_tbl.LAST
665 LOOP
666 IF l_debug = FND_API.G_TRUE THEN
667 QP_PREQ_GRP.engine_debug( 'Determine_Pricing_UOM2');
668 END IF;
669 IF (v_count = 0) THEN
670 v_list_line_id := l_precedence_tbl(j).created_from_list_line_id;
671 v_list_precedence := l_precedence_tbl(j).product_precedence;
672 END IF;
673
674 IF (v_count > 0 ) THEN
675
676 IF l_debug = FND_API.G_TRUE THEN
677 QP_PREQ_GRP.engine_debug( 'Precedence 1 : '|| v_list_precedence);
678 QP_PREQ_GRP.engine_debug( 'Precedence 2 : '|| l_precedence_tbl(j).product_precedence);
679
680 END IF;
681 -- If precedence matches match pricing attributes count
682 IF (v_list_precedence = l_precedence_tbl(j).product_precedence) THEN
683
684 --Reset
685 v_list_line_count2 := NULL;
686
687 IF (v_list_line_count1 IS NULL) THEN
688 OPEN get_attribute_count_cur(i.line_index,v_list_line_id); -- For First Line
689 FETCH get_attribute_count_cur INTO v_list_line_count1;
690 CLOSE get_attribute_count_cur;
691 END IF;
692
693 IF l_debug = FND_API.G_TRUE THEN
694 QP_PREQ_GRP.engine_debug( 'Precedence Matched . Attribute Count1 : ' || v_list_line_id || ' ' || v_list_line_count1);
695
696 END IF;
697 OPEN get_attribute_count_cur(i.line_index,l_precedence_tbl(j).created_from_list_line_id); -- For Second Line
698 FETCH get_attribute_count_cur INTO v_list_line_count2;
699 CLOSE get_attribute_count_cur;
700
701 IF l_debug = FND_API.G_TRUE THEN
702 QP_PREQ_GRP.engine_debug( 'Precedence Matched . Attribute Count2 : ' || l_precedence_tbl(j).created_from_list_line_id || ' ' || v_list_line_count2);
703
704 END IF;
705 -- Update the status to duplicate list lines , only after comparing the attribute counts for all list lines
706 -- That is why the extra condition v_total_cout = v_count+1
707 IF (nvl(v_list_line_count1,0) = nvl(v_list_line_count2,0) and v_total_count = v_count + 1) THEN
708 v_dup_list_line_id := l_precedence_tbl(j).created_from_list_line_id;
709
710 --begin fix bug 2746019
711 --l_status_text := v_list_line_id || ',' || v_dup_list_line_id; --fix bug 2746019
712 select name into v_price_list from qp_list_headers_vl where
713 list_header_id = (select list_header_id from qp_list_lines
714 where list_line_id = v_list_line_id);
715
716 select name into v_dup_price_list from qp_list_headers_vl where
717 list_header_id = (select list_header_id from qp_list_lines
718 where list_line_id = v_dup_list_line_id);
719
720 FND_MESSAGE.SET_NAME('QP','QP_DUPLICATE_PRICE_LIST');
721 FND_MESSAGE.SET_TOKEN('LIST_LINE_ID', v_price_list);
722 FND_MESSAGE.SET_TOKEN('DUP_LIST_LINE_ID', v_dup_price_list);
723 l_status_text:= FND_MESSAGE.GET;
724 -- end fix bug 2746019
725
726 Update_Invalid_List_Lines(i.INCOMPATABILITY_GRP_CODE,i.line_index,p_pricing_phase_id,
727 QP_PREQ_GRP.G_STATUS_DUP_PRICE_LIST,l_status_text, v_return_status,
728 v_return_status_text);
729 GOTO NEXT_LINE;
730
731 --RAISE DUPLICATE_PRICE_LIST;
732 ELSE
733 IF (nvl(v_list_line_count1,0) < nvl(v_list_line_count2,0)) THEN
734 v_list_line_id := l_precedence_tbl(j).created_from_list_line_id; -- Second Line should be given
735 v_list_line_count1 := v_list_line_count2;
736 END IF;
737 END IF;
738 END IF;
739 END IF;
740 v_count := v_count + 1;
741 END LOOP;
742 END IF;
743
744 IF l_debug = FND_API.G_TRUE THEN
745 QP_PREQ_GRP.engine_debug('List Line Id:' || v_list_line_id);
746
747 END IF;
748 IF (v_list_line_id IS NOT NULL) THEN -- Successful in finding pll in order uom
749 -- Update all the other list lines to status 'U'
750 /*
751 INDX,QP_Resolve_Incompatability_PVTRUN.determine_pricing_uom_and_qty.upd1,qp_npreq_ldets_tmp_N2,PRICING_PHASE_ID,1
752 INDX,QP_Resolve_Incompatability_PVTRUN.determine_pricing_uom_and_qty.upd1,qp_npreq_ldets_tmp_N2,PRICING_STATUS_CODE,2
753 INDX,QP_Resolve_Incompatability_PVTRUN.determine_pricing_uom_and_qty.upd1,qp_npreq_lines_tmp_N2,LINE_INDEX,3
754 */
755 UPDATE qp_npreq_ldets_tmp -- upd1
756 SET PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_UOM_FAILURE
757 WHERE INCOMPATABILITY_GRP_CODE = i.INCOMPATABILITY_GRP_CODE
758 AND LINE_INDEX = i.line_index
759 AND PRICING_PHASE_ID = p_pricing_phase_id
760 AND CREATED_FROM_LIST_LINE_ID <> v_list_line_id
761 AND PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_NEW;
762
763 /* UPDATE qp_npreq_line_attrs_tmp a
764 SET a.PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_UOM_FAILURE
765 WHERE a.LIST_LINE_ID
766 IN (SELECT b.CREATED_FROM_LIST_LINE_ID
767 FROM qp_npreq_ldets_tmp b
768 WHERE b.PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_UOM_FAILURE
769 AND b.PRICING_PHASE_ID = p_pricing_phase_id
770 AND b.INCOMPATABILITY_GRP_CODE = i.INCOMPATABILITY_GRP_CODE
771 AND b.CREATED_FROM_LIST_LINE_ID <> v_list_line_id
772 AND b.LINE_INDEX = i.line_index)
773 AND a.LINE_INDEX = i.line_index; */
774
775 -- begin shu, fix bug 2453250, no price_list_header_id after big search
776 /* Commented for bug#2882115
777 UPDATE qp_npreq_lines_tmp a
778 SET a.price_list_header_id = (SELECT list_header_id from qp_list_lines where list_line_id = v_list_line_id )
779 WHERE ( a.price_list_header_id < 0 OR a.price_list_header_id IS NULL)
780 AND a.line_index = i.line_index;
781 */
782 -- end shu fix bug 2453250
783
784 -- begin shulin bug 1829731
785 -- use OKS API to calculate pricing_qty based on order_uom if profile set to 'ORACLE_CONTRACTS'
786 IF l_debug = FND_API.G_TRUE THEN
787 QP_PREQ_GRP.engine_debug('no uom conversion ...');
788 END IF;
789 IF l_qp_time_uom_conversion = 'ORACLE_CONTRACTS' THEN
790
794 QP_PREQ_GRP.engine_debug( 'line_uom_code/order uom :' || i.line_uom_code); -- order_uom
791 IF l_debug = FND_API.G_TRUE THEN
792 QP_PREQ_GRP.engine_debug( 'contract_start_date :' || i.contract_start_date);
793 QP_PREQ_GRP.engine_debug( 'contract_end_date :' || i.contract_end_date);
795 END IF;
796
797 --IF i.contract_start_date IS NOT NULL AND i.contract_end_date IS NOT NULL THEN
798 -- OKS_TIME_MEASURES_PUB replaced with OKS_OMINT_PUB in R12
799 /* [julin/4285975/4662388] removing dynamic SQL, unnecessary and causes error
800 * when env language has ',' delimiter
801 l_sql_stmt := 'select ' || nvl(ROUND (OKS_OMINT_PUB.get_quantity (i.contract_start_date, i.contract_end_date, i.line_uom_code, QP_PREQ_GRP.G_CURRENT_USER_OP_UNIT), l_max_decimal_digits), -999999) ||' from dual';
802 IF l_debug = FND_API.G_TRUE THEN
803 QP_PREQ_GRP.engine_debug('l_sql_stmt:' || l_sql_stmt);
804 END IF; -- end debug
805 execute immediate l_sql_stmt INTO l_oks_qty;
806 */
807 --END IF;
808 --bug 4900095
809 IF l_duration_passed = 'N' THEN --call OKS API for OKS calls where uom_quantity is passed as null
810 -- l_oks_qty := nvl(ROUND (OKS_OMINT_PUB.get_target_quantity (i.contract_start_date, i.contract_end_date, i.line_uom_code, QP_PREQ_GRP.G_CURRENT_USER_OP_UNIT), l_max_decimal_digits), -999999);
811 --bug 4900095
812 l_oks_qty := nvl(round(OKS_OMINT_PUB.get_target_duration( p_start_date => i.contract_start_date,
813 p_end_date => i.contract_end_date,
814 p_source_uom => i.line_uom_code,
815 p_source_duration => i.uom_quantity,
816 p_target_uom => i.line_uom_code,/*Default Month*/
817 p_org_id => QP_PREQ_GRP.G_CURRENT_USER_OP_UNIT), l_max_decimal_digits), -999999);
818 ELSE
819 l_oks_qty := null;
820 END IF;--l_duration_passed = 'N'
821
822 IF l_debug = FND_API.G_TRUE THEN
823 QP_PREQ_GRP.engine_debug('l_oks_qty:' || l_oks_qty);
824 END IF; -- end debug
825 -- when contract_start_date or contract_end_date is null, or uom is 'MO' instead of 'MTH', l_oks_qty = 0
826 -- when uom is not time_related or invalid to oks API, i.e. 'EA', 'MI', l_oks_qty = NULL
827
828 IF (l_oks_qty IS NOT NULL AND l_oks_qty <> -999999)
829 --bug 4900095
830 and l_duration_passed = 'N' THEN -- oks succeed
831 v_pricing_qty := round(l_oks_qty , l_max_decimal_digits);
832 l_order_qty := v_pricing_qty; -- shu_latest, this is to correct if user enter order_qty not matching the start_date end_date
833 l_uom_quantity :=1;
834 IF l_debug = FND_API.G_TRUE THEN
835 QP_PREQ_GRP.engine_debug('Pric_Qty OKS_API Conv based on Order_UOM :' || v_pricing_qty);
836 END IF; --end debug
837
838 ELSE -- oks fail, make v_pricing_qty as line_quantity just like STANDARD conversion
839 v_pricing_qty := i.line_quantity; -- STANDARD
840 --l_uom_quantity :=1;
841 l_uom_quantity := nvl(i.uom_quantity, 1); -- to back support OM, SL BUG FOUND
842 -- no need to update l_order_qty, since it has been initialized to i.line_quantity
843 IF l_debug = FND_API.G_TRUE THEN
844 QP_PREQ_GRP.engine_debug('pric_qty same as order_qty :' || v_pricing_qty); --shu 12/26/2001
845 QP_PREQ_GRP.engine_debug('uom_qty passed :' || l_uom_quantity); --shu 12/26/2001
846 END IF; -- end debug
847
848 END IF; -- END IF (l_oks_qty IS NOT NULL AND l_oks_qty <> 0)
849 ELSE -- l_qp_time_uom_conversion = 'STANDARD' THEN
850 --commeneted for 9977712 smbalara
851 --v_pricing_qty := i.line_quantity; -- STANDARD
852 v_pricing_qty := ROUND(i.line_quantity,l_max_decimal_digits); --added ROUND for 9977712 smbalara
853 -- no need to update l_order_qty, since it has been initialized to i.line_quantity
854 l_uom_quantity := nvl(i.uom_quantity, 1); -- to back support OM, for case user order 2 of 6 MTH service
855 IF l_debug = FND_API.G_TRUE THEN
856 QP_PREQ_GRP.engine_debug('pric_qty same as order_qty :' || v_pricing_qty);
857 END IF;
858 END IF;
859 -- end shulin bug 1829731
860
861 -- The followings are used to bulk update at the end of the procedure for no uom conversion cases
862 l_line_quantity_tbl(m) := l_order_qty; -- shu_latest
863 l_line_index_tbl(m) := i.line_index;
864 l_line_uom_code_tbl(m) := i.line_uom_code;
865 l_priced_quantity_tbl(m) := v_pricing_qty; --shu_latest
866 l_uom_quantity_tbl(m) := l_uom_quantity; --shu_latest
867 m := m+1;
868
869 /* no need if bulk update later
870 UPDATE qp_npreq_lines_tmp
871 SET PRICED_UOM_CODE = i.line_uom_code,
872 PRICED_QUANTITY = v_pricing_qty, -- shulin bug 1829731
873 LINE_UOM_CODE = i.line_uom_code, -- order_uom
874 LINE_QUANTITY = l_order_qty, -- shu_latest
875 UOM_QUANTITY =1
876 WHERE LINE_INDEX = i.line_index;
877 */
878
879 x_list_line_id := v_list_line_id;
880 ELSE -- uom conversion cases
881
882 Precedence_For_Price_List_Line(i.line_index,NULL,'Y',l_precedence_tbl,l_status,l_status_text);
883
884 -- Sort the table(not needed as it would have only the price list lines with least precedence)
885 /* IF (l_precedence_tbl.COUNT > 0) THEN
886 --sort_on_precedence(l_precedence_tbl, l_precedence_tbl.FIRST, l_precedence_tbl.LAST);
887 sort_on_precedence(l_precedence_tbl);
888 END IF; */
889
890 /* IF (l_precedence_tbl.COUNT > 0) THEN
891 FOR j IN l_precedence_tbl.FIRST .. l_precedence_tbl.LAST
892 LOOP
893 IF l_debug = FND_API.G_TRUE THEN
894 QP_PREQ_GRP.engine_debug('List Line Id : ' || l_precedence_tbl(j).created_from_list_line_id);
895 QP_PREQ_GRP.engine_debug('Precedence : ' || l_precedence_tbl(j).product_precedence);
896 QP_PREQ_GRP.engine_debug('Inventory Item Id: ' || l_precedence_tbl(j).inventory_item_id);
897 QP_PREQ_GRP.engine_debug('Product Uom : ' || l_precedence_tbl(j).product_uom_code);
898 END IF;
899 END LOOP;
900 END IF; */
901
902 IF (l_precedence_tbl.COUNT > 0) THEN
903 v_total_count := l_precedence_tbl.COUNT;
904 v_count := 0;
905 v_list_line_count1 := NULL;
906 FOR j IN l_precedence_tbl.FIRST .. l_precedence_tbl.LAST
907 LOOP
908 IF l_debug = FND_API.G_TRUE THEN
909 QP_PREQ_GRP.engine_debug('pri flag');
910 END IF;
911 IF (v_count = 0) THEN
912 v_list_line_id := l_precedence_tbl(j).created_from_list_line_id;
913 v_list_precedence := l_precedence_tbl(j).product_precedence;
914 v_primary_uom_code := l_precedence_tbl(j).product_uom_code;
915 v_inventory_item_id := to_number(l_precedence_tbl(j).inventory_item_id);
916 END IF;
917
918 IF (v_count > 0 ) THEN
919 IF (v_list_precedence = l_precedence_tbl(j).product_precedence) THEN
920
921 --Reset
922 v_list_line_count2 := NULL;
923
924 IF (v_list_line_count1 IS NULL) THEN
925 OPEN get_attribute_count_cur(i.line_index,v_list_line_id); -- For First Line
926 FETCH get_attribute_count_cur INTO v_list_line_count1;
927 CLOSE get_attribute_count_cur;
928 END IF;
929
930 IF l_debug = FND_API.G_TRUE THEN
931 QP_PREQ_GRP.engine_debug( 'Precedence Matched . Attribute Count Pri1 : ' || v_list_line_id || ' ' || v_list_line_count1);
932
933 END IF;
934 OPEN get_attribute_count_cur(i.line_index,l_precedence_tbl(j).created_from_list_line_id); -- For Second Line
935 FETCH get_attribute_count_cur INTO v_list_line_count2;
936 CLOSE get_attribute_count_cur;
937
938 IF l_debug = FND_API.G_TRUE THEN
939 QP_PREQ_GRP.engine_debug( 'Precedence Matched . Attribute Count Pri2 : ' || l_precedence_tbl(j).created_from_list_line_id || ' ' || v_list_line_count2);
940
941 END IF;
942 IF (nvl(v_list_line_count1,0) = nvl(v_list_line_count2,0) and v_total_count = v_count + 1) THEN
943
944 v_dup_list_line_id := l_precedence_tbl(j).created_from_list_line_id;
945
946 --begin fix bug 2746019
947 --l_status_text := v_list_line_id || ',' || v_dup_list_line_id; --fix bug 2746019
948 select name into v_price_list from qp_list_headers_vl where
949 list_header_id = (select list_header_id from qp_list_lines
950 where list_line_id = v_list_line_id);
951
952 select name into v_dup_price_list from qp_list_headers_vl where
953 list_header_id = (select list_header_id from qp_list_lines
954 where list_line_id = v_dup_list_line_id);
955
956 FND_MESSAGE.SET_NAME('QP','QP_DUPLICATE_PRICE_LIST');
957 FND_MESSAGE.SET_TOKEN('LIST_LINE_ID', v_price_list);
958 FND_MESSAGE.SET_TOKEN('DUP_LIST_LINE_ID', v_dup_price_list);
959 l_status_text:= FND_MESSAGE.GET;
960 -- end fix bug 2746019
961
962 Update_Invalid_List_Lines(i.INCOMPATABILITY_GRP_CODE,i.line_index,p_pricing_phase_id,
963 QP_PREQ_GRP.G_STATUS_DUP_PRICE_LIST,l_status_text, v_return_status,
964 v_return_status_text);
965 GOTO NEXT_LINE;
966 --RAISE DUPLICATE_PRICE_LIST;
967 ELSE
968 IF (nvl(v_list_line_count1,0) < nvl(v_list_line_count2,0)) THEN
969 v_list_line_id := l_precedence_tbl(j).created_from_list_line_id; -- Second Line should be given
970 v_list_line_count1 := v_list_line_count2;
971 END IF;
972 END IF;
973 END IF;
974 END IF;
975 v_count := v_count + 1;
976 END LOOP;
977 END IF; -- v_list_line_id IS NOT NULL
978
979 IF l_debug = FND_API.G_TRUE THEN
980 QP_PREQ_GRP.engine_debug('Pri Flag List Line Id:' || v_list_line_id);
981
982 END IF;
983 IF (v_list_line_id IS NOT NULL) THEN
984 /*
985 INDX,QP_Resolve_Incompatability_PVTRUN.determine_pricing_uom_and_qty.upd2,qp_npreq_ldets_tmp_N2,PRICING_PHASE_ID,1
986 INDX,QP_Resolve_Incompatability_PVTRUN.determine_pricing_uom_and_qty.upd2,qp_npreq_ldets_tmp_N2,PRICING_STATUS_CODE,2
987 INDX,QP_Resolve_Incompatability_PVTRUN.determine_pricing_uom_and_qty.upd2,qp_npreq_lines_tmp_N2,LINE_INDEX,3
988 */
989 -- Update all the other list lines to status 'P'
990 UPDATE qp_npreq_ldets_tmp -- upd2
991 SET PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_PRIMARY_UOM_FLAG
992 WHERE INCOMPATABILITY_GRP_CODE = i.INCOMPATABILITY_GRP_CODE
993 AND LINE_INDEX = i.line_index
994 AND PRICING_PHASE_ID = p_pricing_phase_id
995 AND CREATED_FROM_LIST_LINE_ID <> v_list_line_id
996 AND PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_NEW;
997
998
1002 FROM qp_npreq_ldets_tmp b
999 /* UPDATE qp_npreq_line_attrs_tmp a
1000 SET a.PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_PRIMARY_UOM_FLAG
1001 WHERE a.LIST_LINE_ID IN (SELECT b.CREATED_FROM_LIST_LINE_ID
1003 WHERE b.PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_PRIMARY_UOM_FLAG
1004 AND b.CREATED_FROM_LIST_LINE_ID <> v_list_line_id
1005 AND b.LINE_INDEX = i.line_index)
1006 AND a.LINE_INDEX = i.line_index; */
1007
1008 /* UPDATE qp_npreq_line_attrs_tmp a
1009 SET a.PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_PRIMARY_UOM_FLAG
1010 WHERE a.LIST_LINE_ID
1011 IN (SELECT b.CREATED_FROM_LIST_LINE_ID
1012 FROM qp_npreq_ldets_tmp b
1013 WHERE b.PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_PRIMARY_UOM_FLAG
1014 AND b.PRICING_PHASE_ID = p_pricing_phase_id
1015 AND b.INCOMPATABILITY_GRP_CODE = i.INCOMPATABILITY_GRP_CODE
1016 AND b.CREATED_FROM_LIST_LINE_ID <> v_list_line_id
1017 AND b.LINE_INDEX = i.line_index)
1018 AND a.LINE_INDEX = i.line_index; */
1019
1020 -- begin shu, fix bug 2453250, no price_list_header_id after big search
1021 /* Commented for bug#2882115
1022 UPDATE qp_npreq_lines_tmp a
1023 SET a.price_list_header_id = (SELECT list_header_id from qp_list_lines where list_line_id = v_list_line_id )
1024 WHERE ( a.price_list_header_id < 0 OR a.price_list_header_id IS NULL)
1025 AND a.line_index = i.line_index;
1026 */
1027 -- end shu fix bug 2453250
1028
1029 IF l_debug = FND_API.G_TRUE THEN
1030 QP_PREQ_GRP.engine_debug('Data Updated');
1031 QP_PREQ_GRP.engine_debug('Order Uom:' || i.line_uom_code);
1032 QP_PREQ_GRP.engine_debug('Prim UOM:' || v_primary_uom_code);
1033 QP_PREQ_GRP.engine_debug('Inventory Id:' || v_inventory_item_id);
1034 QP_PREQ_GRP.engine_debug('v_pricing_qty:' || v_pricing_qty);
1035 END IF;
1036
1037 -- begin Bug 1829731 fix, shulin
1038 IF l_debug = FND_API.G_TRUE THEN
1039 QP_PREQ_GRP.engine_debug('uom conversion...');
1040 END IF;
1041 l_uom_quantity := i.uom_quantity; --shu_latest, to back support OM, either from usr input or null
1042 -- shulin, do OKS conversion if profile set to 'ORCALE_CONTRACTS'
1043 IF (l_qp_time_uom_conversion = 'ORACLE_CONTRACTS') THEN -- do oks conversion
1044
1045 IF l_debug = FND_API.G_TRUE THEN
1046 QP_PREQ_GRP.engine_debug( 'contract_start_date :' || i.contract_start_date);
1047 QP_PREQ_GRP.engine_debug( 'contract_end_date :' || i.contract_end_date);
1048 QP_PREQ_GRP.engine_debug( 'primary_uom_code :' || v_primary_uom_code);
1049 QP_PREQ_GRP.engine_debug('v_pricing_qty:' || v_pricing_qty);
1050 END IF;
1051 -- when contract_start_date or contract_end_date is null, or uom is 'MO' instead of 'MTH', l_oks_qty = 0
1052 -- when uom is not time_related or invalid to oks API, i.e. 'EA', 'MI', l_oks_qty = NULL
1053
1054 --IF i.contract_start_date IS NOT NULL AND i.contract_end_date IS NOT NULL THEN
1055 -- OKS_TIME_MEASURES_PUB replaced with OKS_OMINT_PUB in R12
1056 /* [julin/4285975/4662388] removing dynamic SQL, unnecessary and causes error
1057 * when env language has ',' delimiter
1058 l_sql_stmt := 'select ' || ROUND (OKS_OMINT_PUB.get_quantity (i.contract_start_date,
1059 i.contract_end_date, v_primary_uom_code, QP_PREQ_GRP.G_CURRENT_USER_OP_UNIT), l_max_decimal_digits) ||' from dual';
1060 execute immediate l_sql_stmt INTO l_oks_qty; -- shulin
1061 */
1062 --END IF;
1063 -- l_oks_qty := ROUND (OKS_OMINT_PUB.get_quantity (i.contract_start_date, i.contract_end_date, v_primary_uom_code, QP_PREQ_GRP.G_CURRENT_USER_OP_UNIT), l_max_decimal_digits);
1064 --bug 4900095
1065 l_oks_qty := nvl(round(OKS_OMINT_PUB.get_target_duration( p_start_date => i.contract_start_date,
1066 p_end_date => i.contract_end_date,
1067 p_source_uom => i.line_uom_code,
1068 p_source_duration => i.uom_quantity,
1069 p_target_uom => v_primary_uom_code,/*Default Month*/
1070 p_org_id => QP_PREQ_GRP.G_CURRENT_USER_OP_UNIT), l_max_decimal_digits), -999999);
1071
1072 IF l_debug = FND_API.G_TRUE THEN
1073 QP_PREQ_GRP.engine_debug('l_oks_qty1:' || l_oks_qty);
1074 END IF; -- end debug
1075
1076 IF (l_oks_qty IS NOT NULL OR l_oks_qty <> 0)
1077 --bug 4900095
1078 and l_duration_passed = 'N' THEN -- oks succeed
1079
1080 -- order_qty is based on odr_uom
1081 /* [julin/4285975/4662388] removing dynamic SQL, unnecessary and causes error
1082 * when env language has ',' delimiter
1083 l_sql_stmt := 'select ' || ROUND (OKS_OMINT_PUB.get_quantity (i.contract_start_date,
1084 i.contract_end_date, i.line_uom_code, QP_PREQ_GRP.G_CURRENT_USER_OP_UNIT), l_max_decimal_digits) ||' from dual';
1085 execute immediate l_sql_stmt INTO l_order_qty; -- shu_latest
1086 */
1087 -- l_order_qty := ROUND (OKS_OMINT_PUB.get_quantity (i.contract_start_date, i.contract_end_date, i.line_uom_code, QP_PREQ_GRP.G_CURRENT_USER_OP_UNIT), l_max_decimal_digits);
1088 --bug 4900095
1089 l_order_qty := nvl(round(OKS_OMINT_PUB.get_target_duration( p_start_date => i.contract_start_date,
1090 p_end_date => i.contract_end_date,
1091 p_source_uom => i.line_uom_code,
1092 p_source_duration => i.uom_quantity,
1093 p_target_uom => i.line_uom_code,/*Default Month*/
1094 p_org_id => QP_PREQ_GRP.G_CURRENT_USER_OP_UNIT), l_max_decimal_digits), -999999);
1095 IF l_debug = FND_API.G_TRUE THEN
1096 QP_PREQ_GRP.engine_debug('l_oks_qty2:' || l_oks_qty);
1097 END IF; -- end debug
1098
1099 v_pricing_qty := round (l_oks_qty , l_max_decimal_digits);
1100
1101 l_uom_quantity := 1; --shulin
1102 IF l_debug = FND_API.G_TRUE THEN
1103 QP_PREQ_GRP.engine_debug('OKS_API conversion...');
1104 QP_PREQ_GRP.engine_debug('pricing_qty:' || v_pricing_qty);
1105 QP_PREQ_GRP.engine_debug('pricing_uom:' || v_primary_uom_code);
1106 QP_PREQ_GRP.engine_debug('order_qty:' || l_order_qty);
1107 QP_PREQ_GRP.engine_debug('order_uom:' || l_order_uom_code);
1108 QP_PREQ_GRP.engine_debug('uom_quantity:' || l_uom_quantity);
1109 END IF;
1110
1111 ELSIF (l_oks_qty <> -999999 AND l_oks_qty <> 0) -- OM/ASO/IBE call for service line duration/uom_quantity is not null
1112 --bug 4900095
1113 and l_duration_passed = 'Y' THEN
1114 l_uom_quantity := l_oks_qty;
1115 v_pricing_qty := ROUND( i.line_quantity * l_oks_qty, l_max_decimal_digits) ; -- nvl is case we only have line_quantity
1116 --changed for service pricing
1117 --v_pricing_qty := ROUND( i.line_quantity * l_oks_qty * nvl(i.uom_quantity,1), l_max_decimal_digits) ; -- nvl is case we only have line_quantity
1118 --l_uom_quantity := ROUND( i.uom_quantity * v_uom_rate, l_max_decimal_digits); -- do not nvl uom_quantity
1119 l_uom_quantity :=1; -- reset to 1, so the unit price by pricing uom does not change
1120 l_order_qty := i.line_quantity;
1121 IF l_debug = FND_API.G_TRUE THEN
1122 QP_PREQ_GRP.engine_debug('OKS_API conversion for OM...');
1123 QP_PREQ_GRP.engine_debug('pricing_qty:' || v_pricing_qty);
1124 QP_PREQ_GRP.engine_debug('pricing_uom:' || v_primary_uom_code);
1125 QP_PREQ_GRP.engine_debug('order_qty:' || l_order_qty);
1126 QP_PREQ_GRP.engine_debug('order_uom:' || l_order_uom_code);
1127 QP_PREQ_GRP.engine_debug('uom_quantity:' || l_uom_quantity);
1128 END IF;
1129 END IF; --oks succeed
1130 END IF; -- end profile is ORACLE_CONTRACTS
1131
1132 -- not 'ORACLE_CONTACTS' or OKS conversion failed, use standard inventory uom conversion
1133 IF (l_qp_time_uom_conversion = 'STANDARD') OR (l_oks_qty = -999999 OR l_oks_qty = 0) THEN
1134
1135 IF (l_qp_time_uom_conversion = 'ORACLE_CONTRACTS') then
1136 IF l_debug = FND_API.G_TRUE THEN
1137 QP_PREQ_GRP.engine_debug('oks conversion had failed...');
1138 END IF;
1139 END IF; -- for debug, to distinglish if it is oks failed case or if profile set to standard case
1140
1141 -- Get the conversion rate based on prclist's primary_uom
1142 Inv_convert.inv_um_conversion(i.line_uom_code,
1143 v_primary_uom_code,
1144 v_inventory_item_id,
1145 v_uom_rate);
1146 IF (v_uom_rate = -99999) THEN
1147 l_status_text := 'invalid conversion rate from ' || l_order_uom_code || ' to ' || v_primary_uom_code;
1148 Update_Invalid_List_Lines(i.INCOMPATABILITY_GRP_CODE,i.line_index,p_pricing_phase_id,
1149 QP_PREQ_GRP.G_STATUS_INVALID_UOM_CONV,l_status_text, v_return_status,
1150 v_return_status_text);
1151 -- [julin/4330147/4335995]
1152 l_uom_conv_success := 'N';
1153 --RAISE INVALID_UOM_CONVERSION;
1154 ELSE
1155 IF (i.PROCESSING_ORDER <> 2 or i.PROCESSING_ORDER IS NULL ) THEN -- It is not a service line
1156
1157 v_pricing_qty := ROUND( i.line_quantity * v_uom_rate, l_max_decimal_digits);
1158 l_uom_quantity := 1; --shu_latest
1159 l_order_qty := i.line_quantity;
1160 IF l_debug = FND_API.G_TRUE THEN
1161 QP_PREQ_GRP.engine_debug('Standard uom conversion, non-service line...');
1162 QP_PREQ_GRP.engine_debug('pricing_qty:' || v_pricing_qty);
1163 QP_PREQ_GRP.engine_debug('pricing_uom:' || v_primary_uom_code);
1164 QP_PREQ_GRP.engine_debug('order_qty:' || l_order_qty);
1165 QP_PREQ_GRP.engine_debug('order_uom:' || l_order_uom_code);
1166 QP_PREQ_GRP.engine_debug('uom_quantity:' || l_uom_quantity);
1167 END IF;
1168
1169 ELSE -- service line, l_uom_quantity matters
1170
1171 IF (l_qp_time_uom_conversion = 'ORACLE_CONTRACTS') THEN -- from oks failed case
1172 v_pricing_qty := ROUND( i.line_quantity * v_uom_rate, l_max_decimal_digits);
1173 l_uom_quantity := 1;
1174 l_order_qty := i.line_quantity;
1175 IF l_debug = FND_API.G_TRUE THEN
1176 QP_PREQ_GRP.engine_debug('Standard uom conversion (oks failed), service line...');
1177 QP_PREQ_GRP.engine_debug('pricing_qty:' || v_pricing_qty);
1178 QP_PREQ_GRP.engine_debug('pricing_uom:' || v_primary_uom_code);
1179 QP_PREQ_GRP.engine_debug('order_qty:' || l_order_qty);
1180 QP_PREQ_GRP.engine_debug('order_uom:' || l_order_uom_code);
1181 QP_PREQ_GRP.engine_debug('uom_quantity:' || l_uom_quantity);
1182 END IF;
1183
1184 ELSE -- from profile being standard case, l_uom_quantity matters for OM
1185 -- assuming OM pass l_uom_quantity is converted to order uom like the following
1186 -- 1 of 2 YR services, order_uom=YR, l_uom_quantity = 2 (YR)
1187 IF l_debug = FND_API.G_TRUE THEN
1188 QP_PREQ_GRP.engine_debug('uom_quantity from calling application:' || i.uom_quantity);
1189 END IF;
1190 v_pricing_qty := ROUND( i.line_quantity * v_uom_rate * nvl(i.uom_quantity,1), l_max_decimal_digits) ; -- nvl is case we only have line_quantity
1191 --l_uom_quantity := ROUND( i.uom_quantity * v_uom_rate, l_max_decimal_digits); -- do not nvl uom_quantity
1192 l_uom_quantity :=1; -- reset to 1, so the unit price by pricing uom does not change
1193 l_order_qty := i.line_quantity;
1194
1195 IF l_debug = FND_API.G_TRUE THEN
1196 QP_PREQ_GRP.engine_debug('Standard uom conversion, service line...');
1197 QP_PREQ_GRP.engine_debug('pricing_qty:' || v_pricing_qty);
1198 QP_PREQ_GRP.engine_debug('pricing_uom:' || v_primary_uom_code);
1199 QP_PREQ_GRP.engine_debug('order_qty:' || l_order_qty);
1200 QP_PREQ_GRP.engine_debug('order_uom:' || l_order_uom_code);
1201 END IF;
1202
1203 END IF;
1204
1205 END IF; -- end if service or non-service line
1206
1207 END IF; -- end if v_uom_rate
1208
1209 END IF; -- end profile is 'STANDARD'
1210
1211
1212 /*
1213 INDX,QP_Resolve_Incompatability_PVTRUN.determine_pricing_uom_and_qty.upd1,qp_npreq_lines_tmp_N1,LINE_INDEX,1
1214 */
1215 -- do not nvl UOM_QUANTITY when updating UOM_QUANTITY , for a case if uom_quantity is null for a regular line , we could
1216 -- potentially update it to value by nvl'ing it , when uom_quantity is supposed to be null.
1217 -- Ex: 1Ton = 1000Kg , UOM_QUANTITY passed is null . in this case if we nvl(UOM_QUANTITY,1) then the new uom_quantity after the
1218 -- update will be nvl(uom_quantity,1) * 1000(v_uom_rate) = 1000 which is wrong .. bug# 2028618
1219
1220 UPDATE qp_npreq_lines_tmp -- upd1
1221 SET PRICED_UOM_CODE = v_primary_uom_code,
1222 PRICED_QUANTITY = v_pricing_qty, -- shulin bug 1829731
1223 LINE_UOM_CODE = l_order_uom_code, -- order_uom, i.line_uom_code
1224 LINE_QUANTITY = l_order_qty, -- shu_latest
1225 UOM_QUANTITY = decode(l_duration_passed,
1226 'Y', l_uom_quantity,
1227 'N', uom_quantity,
1228 uom_quantity)
1229 WHERE LINE_INDEX = i.line_index;
1230 x_list_line_id := v_list_line_id;
1231
1232 -- [julin/4330147/4335995] only update line_attrs when uom conversion successful
1233 IF (l_uom_conv_success = 'Y') THEN
1234 -- 3773652
1235 -- used for bulk update for UOM conversion cases
1236 l_upd_line_index_tbl(n) := i.line_index;
1237 l_upd_priced_qty_tbl(n) := v_pricing_qty;
1238 n := n+1;
1239 END IF;
1240 ELSE -- No record found in primary uom and also in order uom, else IF (v_list_line_id IS NOT NULL)
1241 l_status_text := 'Could not find a price list in Ordered UOM or Primary UOM';
1242 IF l_debug = FND_API.G_TRUE THEN
1243 QP_PREQ_GRP.engine_debug(l_status_text);
1244 END IF;
1245 Update_Invalid_List_Lines(i.INCOMPATABILITY_GRP_CODE,i.line_index,p_pricing_phase_id,
1246 QP_PREQ_GRP.G_STATUS_INVALID_UOM,l_status_text, v_return_status,
1247 v_return_status_text);
1248 GOTO NEXT_LINE;
1249 -- RAISE INVALID_UOM;
1250 END IF;
1251 END IF;
1252
1253 <<NEXT_LINE>>
1254 null;
1255 END LOOP;
1256
1257
1258 /*
1259 INDX,QP_Resolve_Incompatability_PVTRUN.determine_pricing_uom_and_qty.upd2,qp_npreq_lines_tmp_N1,LINE_INDEX,1
1260 */
1261
1262 -- Bulk Update, from no uom conversion cases
1263 FORALL i in 1 .. l_line_index_tbl.COUNT --upd2
1264 UPDATE qp_npreq_lines_tmp
1265 SET PRICED_UOM_CODE = l_line_uom_code_tbl(i), --priced uom is the same as order uom
1266 PRICED_QUANTITY = l_priced_quantity_tbl(i), -- shu_latest
1267 LINE_UOM_CODE = l_line_uom_code_tbl(i), -- order uom
1268 LINE_QUANTITY = l_line_quantity_tbl(i), -- shu_latest
1269 UOM_QUANTITY = l_uom_quantity_tbl(i) -- shu_latest
1270 WHERE LINE_INDEX = l_line_index_tbl(i);
1271
1272 l_line_uom_code_tbl := l_line_uom_code_tbl_m;
1273 l_line_quantity_tbl := l_line_quantity_tbl_m;
1274 l_line_index_tbl := l_line_index_tbl_m;
1275 l_priced_quantity_tbl := l_priced_quantity_tbl_m; --shu_latest
1276 l_uom_quantity_tbl := l_uom_quantity_tbl_m; --shu_latest
1277
1278 -- 3773652
1279 -- bulk update, from uom conversion cases
1280 FORALL i in 1..l_upd_line_index_tbl.COUNT
1281 UPDATE qp_npreq_line_attrs_tmp
1282 SET VALUE_FROM = qp_number.number_to_canonical(l_upd_priced_qty_tbl(i))
1283 WHERE LINE_INDEX = l_upd_line_index_tbl(i)
1284 AND CONTEXT = QP_PREQ_GRP.G_PRIC_VOLUME_CONTEXT
1285 AND ATTRIBUTE = QP_PREQ_GRP.G_QUANTITY_ATTRIBUTE
1286 AND ATTRIBUTE_TYPE = QP_PREQ_GRP.G_PRICING_TYPE
1287 AND PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_UNCHANGED;
1288 l_upd_line_index_tbl := l_line_index_tbl_m;
1289 l_upd_priced_qty_tbl := l_priced_quantity_tbl_m;
1290
1291 IF l_debug = FND_API.G_TRUE THEN
1292 QP_PREQ_GRP.engine_debug('Incomp Return Status : ' || v_return_status);
1293 END IF;
1294 v_return_status := x_return_status;
1295 EXCEPTION
1296 WHEN INVALID_UOM_CONVERSION THEN
1297 IF l_debug = FND_API.G_TRUE THEN
1298 QP_PREQ_GRP.engine_debug(v_routine_name ||' Invalid Unit of Measure Conversion'|| l_order_uom_code || ','
1299 || v_primary_uom_code);
1300 END IF;
1301 x_return_status_txt := l_order_uom_code || ',' || v_primary_uom_code;
1302 v_return_status := QP_PREQ_GRP.G_STATUS_INVALID_UOM_CONV;
1303 x_return_status := v_return_status;
1304 x_list_line_id := NULL;
1305 WHEN DUPLICATE_PRICE_LIST THEN
1306 IF l_debug = FND_API.G_TRUE THEN
1307 QP_PREQ_GRP.engine_debug(v_routine_name || ' Duplicate Price List '|| v_list_line_id || ',' || v_dup_list_line_id);
1308 END IF;
1309 v_return_msg := v_list_line_id || ',' || v_dup_list_line_id ;
1310 IF l_debug = FND_API.G_TRUE THEN
1311 QP_PREQ_GRP.engine_debug(v_return_msg);
1312 END IF;
1313 x_return_status_txt := v_return_msg;
1314 v_return_status := QP_PREQ_GRP.G_STATUS_DUP_PRICE_LIST;
1315 x_return_status := v_return_status;
1316 x_list_line_id := NULL;
1317 WHEN INVALID_UOM THEN
1318 IF l_debug = FND_API.G_TRUE THEN
1319 QP_PREQ_GRP.engine_debug(v_routine_name || ' Could not find a price list in Ordered UOM or Primary UOM');
1320 END IF;
1321 x_return_status_txt := 'Could not find a price list in Ordered UOM or Primary UOM';
1322 v_return_status := QP_PREQ_GRP.G_STATUS_INVALID_UOM;
1323 x_return_status := v_return_status;
1324 x_list_line_id := NULL;
1325 WHEN OTHERS THEN
1326 IF l_debug = FND_API.G_TRUE THEN
1327 QP_PREQ_GRP.engine_debug(v_routine_name || 'Unexpected Error');
1328 QP_PREQ_GRP.engine_debug(v_routine_name || ' ' || SQLERRM);
1329 END IF;
1330 v_return_status := FND_API.G_RET_STS_ERROR;
1331 x_return_status := v_return_status;
1332 x_return_status_txt := v_routine_name || ' ' || SQLERRM;
1333 x_list_line_id := NULL;
1334 END Determine_Pricing_UOM_And_Qty;
1335
1336 PROCEDURE Best_Price_Evaluation(p_list_price NUMBER,
1337 p_line_index NUMBER,
1338 p_pricing_phase_id NUMBER,
1339 p_incomp_grp_id VARCHAR2,
1340 p_precedence NUMBER, -- Added for bug#2661540
1341 p_manual_dis_flag VARCHAR2,
1342 x_list_line_id OUT NOCOPY NUMBER,
1343 x_return_status OUT NOCOPY VARCHAR2) AS
1344
1345
1346 v_index NUMBER := 1;
1347 v_list_price NUMBER;
1348 v_benefit_price NUMBER;
1349 v_benefit_percent NUMBER;
1350 v_list_line_id NUMBER;
1351 v_request_qty NUMBER;
1352 v_return_status VARCHAR2(30) := FND_API.G_RET_STS_SUCCESS;
1353 x_benefit_amount NUMBER;
1354 l_return_status VARCHAR2(30);
1355 l_return_status_text VARCHAR2(240);
1356 l_sign NUMBER;
1357 l_request_qty NUMBER;
1358 l_line_id NUMBER; --3244060
1359
1360 v_routine_name CONSTANT VARCHAR2(240) := 'Routine:QP_Resolve_Incompatability_PVTRUN.Best_Price_Evaluation';
1361
1362 /*
1363 INDX,QP_Resolve_Incompatability_PVTRUN.best_price_evaluation.get_list_lines_cur,qp_npreq_ldets_tmp_N1,LINE_INDEX,1
1364 INDX,QP_Resolve_Incompatability_PVTRUN.best_price_evaluation.get_list_lines_cur,qp_npreq_ldets_tmp_N1,PRICING_STATUS_CODE,2
1365 INDX,QP_Resolve_Incompatability_PVTRUN.best_price_evaluation.get_list_lines_cur,qp_npreq_ldets_tmp_N1,PRICING_PHASE_ID,3
1366 INDX,QP_Resolve_Incompatability_PVTRUN.best_price_evaluation.get_list_lines_cur,qp_npreq_ldets_tmp_N1,CREATED_FROM_LIST_HEADER_ID,4
1367
1368 INDX,QP_Resolve_Incompatability_PVTRUN.best_price_evaluation.get_list_lines_cur,qp_npreq_ldets_tmp_N1,CREATED_FROM_LIST_LINE_ID,5
1372 CURSOR get_list_lines_cur IS
1369 INDX,QP_Resolve_Incompatability_PVTRUN.best_price_evaluation.get_list_lines_cur,QP_LIST_LINES_PK,LIST_LINE_ID,1
1370 */
1371 -- For bug#2661540
1373 SELECT b.CREATED_FROM_LIST_HEADER_ID, b.CREATED_FROM_LIST_LINE_ID,b.line_detail_index, --3244060
1374 b.CREATED_FROM_LIST_LINE_TYPE, b.OPERAND_CALCULATION_CODE, b.OPERAND_VALUE,a.ESTIM_GL_VALUE ,
1375 a.BENEFIT_PRICE_LIST_LINE_ID,a.PRICE_BREAK_TYPE_CODE,b.LINE_QUANTITY,b.GROUP_QUANTITY,b.GROUP_AMOUNT, --[julin/4240067/4307242]
1376 b.modifier_level_code
1377 FROM QP_LIST_LINES a, qp_npreq_ldets_tmp b, qp_npreq_line_attrs_tmp c
1378 WHERE a.LIST_HEADER_ID = b.CREATED_FROM_LIST_HEADER_ID
1379 AND a.LIST_LINE_ID = b.CREATED_FROM_LIST_LINE_ID
1380 AND b.CREATED_FROM_LIST_TYPE_CODE not in (QP_PREQ_GRP.G_PRICE_LIST_HEADER,QP_PREQ_GRP.G_AGR_LIST_HEADER)
1381 AND b.PRICING_PHASE_ID = p_pricing_phase_id
1382 AND b.INCOMPATABILITY_GRP_CODE = p_incomp_grp_id
1383 AND b.LINE_INDEX = p_line_index
1384 AND b.PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_NEW
1385 AND ((b.AUTOMATIC_FLAG = QP_PREQ_GRP.G_YES AND p_manual_dis_flag = QP_PREQ_GRP.G_YES)
1386 OR p_manual_dis_flag = QP_PREQ_GRP.G_NO)
1387 AND c.LIST_LINE_ID(+) = a.LIST_LINE_ID
1388 AND c.LIST_HEADER_ID(+) = a.LIST_HEADER_ID
1389 AND c.ATTRIBUTE_TYPE(+) = 'QUALIFIER'
1390 AND c.INCOMPATABILITY_GRP_CODE(+) = p_incomp_grp_id
1391 AND c.PRICING_PHASE_ID(+) = p_pricing_phase_id
1392 AND c.PRICING_STATUS_CODE(+) = 'N'
1393 AND c.LINE_INDEX(+) = p_line_index
1394 AND least(nvl(b.PRODUCT_PRECEDENCE,5000),nvl(c.QUALIFIER_PRECEDENCE,5000)) = nvl(p_precedence, least(nvl(b.PRODUCT_PRECEDENCE,5000),nvl(c.QUALIFIER_PRECEDENCE,5000)));
1395
1396 /* Commented for bug 2661540
1397 CURSOR get_list_lines_cur IS
1398 SELECT b.CREATED_FROM_LIST_HEADER_ID, b.CREATED_FROM_LIST_LINE_ID,
1399 b.CREATED_FROM_LIST_LINE_TYPE, b.OPERAND_CALCULATION_CODE, b.OPERAND_VALUE,a.ESTIM_GL_VALUE ,
1400 a.BENEFIT_PRICE_LIST_LINE_ID,a.PRICE_BREAK_TYPE_CODE,b.GROUP_QUANTITY,b.GROUP_AMOUNT
1401 FROM QP_LIST_LINES a, qp_npreq_ldets_tmp b
1402 WHERE a.LIST_HEADER_ID = b.CREATED_FROM_LIST_HEADER_ID
1403 AND a.LIST_LINE_ID = b.CREATED_FROM_LIST_LINE_ID
1404 AND b.CREATED_FROM_LIST_TYPE_CODE not in (QP_PREQ_GRP.G_PRICE_LIST_HEADER,QP_PREQ_GRP.G_AGR_LIST_HEADER)
1405 AND b.PRICING_PHASE_ID = p_pricing_phase_id
1406 AND b.INCOMPATABILITY_GRP_CODE = p_incomp_grp_id
1407 AND b.LINE_INDEX = p_line_index
1408 AND b.PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_NEW
1409 AND ((b.AUTOMATIC_FLAG = QP_PREQ_GRP.G_YES AND p_manual_dis_flag = QP_PREQ_GRP.G_YES) OR
1410 p_manual_dis_flag = QP_PREQ_GRP.G_NO);
1411 */
1412 /*
1413 INDX,QP_Resolve_Incompatability_PVTRUN.best_price_evaluation.get_request_qty_cur,qp_npreq_lines_tmp_N1,LINE_INDEX,1*/
1414
1415 CURSOR get_request_qty_cur IS
1416 SELECT nvl(PRICED_QUANTITY,LINE_QUANTITY)
1417 FROM qp_npreq_lines_tmp
1418 WHERE LINE_INDEX = p_line_index;
1419
1420 /*
1421 INDX,QP_Resolve_Incompatability_PVTRUN.best_price_evaluation.get_list_price_cur,QP_LIST_LINES_PK,LIST_LINE_ID,1
1422 */
1423
1424 CURSOR get_list_price_cur(p_list_line_id NUMBER) IS
1425 SELECT OPERAND
1426 FROM QP_LIST_LINES
1427 WHERE LIST_LINE_ID = p_list_line_id
1428 AND ARITHMETIC_OPERATOR = QP_PREQ_GRP.G_UNIT_PRICE;
1429
1430 /*
1431 INDX,QP_Resolve_Incompatability_PVTRUN.best_price_evaluation.get_list_lines_in_order,qp_npreq_ldets_tmp_N1,LINE_INDEX,1
1432 INDX,QP_Resolve_Incompatability_PVTRUN.best_price_evaluation.get_list_lines_in_order,qp_npreq_ldets_tmp_N1,PRICING_STATUS_CODE,2
1433 INDX,QP_Resolve_Incompatability_PVTRUN.best_price_evaluation.get_list_lines_in_order,qp_npreq_ldets_tmp_N1,PRICING_PHASE_ID,3
1434 */
1435
1436 -- For bug 2661540
1437 CURSOR get_list_lines_in_order IS
1438 SELECT a.CREATED_FROM_LIST_LINE_ID
1439 FROM qp_npreq_ldets_tmp a, qp_npreq_line_attrs_tmp b
1440 WHERE a.CREATED_FROM_LIST_TYPE_CODE not in (QP_PREQ_GRP.G_PRICE_LIST_HEADER,QP_PREQ_GRP.G_AGR_LIST_HEADER)
1441 AND a.PRICING_PHASE_ID = p_pricing_phase_id
1442 AND a.INCOMPATABILITY_GRP_CODE = p_incomp_grp_id
1443 AND a.LINE_INDEX = p_line_index
1444 AND a.PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_NEW
1445 AND ((a.AUTOMATIC_FLAG = QP_PREQ_GRP.G_YES AND p_manual_dis_flag = QP_PREQ_GRP.G_YES) OR
1446 p_manual_dis_flag = QP_PREQ_GRP.G_NO)
1447 AND b.LIST_LINE_ID(+) = a.CREATED_FROM_LIST_LINE_ID
1448 AND b.LIST_HEADER_ID(+) = a.CREATED_FROM_LIST_HEADER_ID
1449 AND b.ATTRIBUTE_TYPE(+) = 'QUALIFIER'
1450 AND b.INCOMPATABILITY_GRP_CODE(+) = p_incomp_grp_id
1451 AND b.PRICING_PHASE_ID(+) = p_pricing_phase_id
1452 AND b.PRICING_STATUS_CODE(+) = 'N'
1453 AND b.LINE_INDEX(+) = p_line_index
1454 AND least(nvl(a.PRODUCT_PRECEDENCE,5000),nvl(b.QUALIFIER_PRECEDENCE,5000)) = nvl(p_precedence, least(nvl(a.PRODUCT_PRECEDENCE,5000),nvl(b.QUALIFIER_PRECEDENCE,5000)))
1455 ORDER BY BEST_PERCENT DESC;
1456
1457 /* Commented for Bug 2661540
1458 CURSOR get_list_lines_in_order IS
1459 SELECT CREATED_FROM_LIST_LINE_ID
1460 FROM qp_npreq_ldets_tmp
1461 WHERE CREATED_FROM_LIST_TYPE_CODE not in (QP_PREQ_GRP.G_PRICE_LIST_HEADER,QP_PREQ_GRP.G_AGR_LIST_HEADER)
1462 AND PRICING_PHASE_ID = p_pricing_phase_id
1463 AND INCOMPATABILITY_GRP_CODE = p_incomp_grp_id
1464 AND LINE_INDEX = p_line_index
1465 AND PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_NEW
1466 AND ((AUTOMATIC_FLAG = QP_PREQ_GRP.G_YES AND p_manual_dis_flag = QP_PREQ_GRP.G_YES) OR
1467 p_manual_dis_flag = QP_PREQ_GRP.G_NO)
1468 ORDER BY BEST_PERCENT DESC;
1469 */
1470
1471 --[julin/5456188]
1472 l_req_value_per_unit NUMBER;
1473 l_total_value NUMBER;
1474 l_volume_attribute VARCHAR2(240);
1475 l_calc_quantity NUMBER;
1476
1477 BEGIN
1478 l_debug := QP_PREQ_GRP.G_DEBUG_ENGINE;
1479 FOR i IN get_list_lines_cur
1480 LOOP
1481 /*IF (i.CREATED_FROM_LIST_LINE_TYPE = QP_PREQ_GRP.G_OTHER_ITEM_DISCOUNT) THEN
1482 IF l_debug = FND_API.G_TRUE THEN
1483 QP_PREQ_GRP.engine_debug('Benefit Price List Line Id is Very important: ' || i.BENEFIT_PRICE_LIST_LINE_ID);
1484 END IF;
1485 OPEN get_list_price_cur(i.BENEFIT_PRICE_LIST_LINE_ID);
1486 FETCH get_list_price_cur INTO v_list_price;
1487 CLOSE get_list_price_cur;
1488 IF (i.OPERAND_CALCULATION_CODE = QP_PREQ_GRP.G_PERCENT_DISCOUNT) THEN
1489 v_benefit_price := (v_list_price) * (i.OPERAND_VALUE / 100);
1490 ELSIF (i.OPERAND_CALCULATION_CODE = QP_PREQ_GRP.G_AMOUNT_DISCOUNT) THEN
1491 v_benefit_price := (v_list_price - i.OPERAND_VALUE);
1492 ELSIF (i.OPERAND_CALCULATION_CODE IS NULL) THEN
1493 v_benefit_price := v_list_price;
1494 END IF; */
1495 IF (i.CREATED_FROM_LIST_LINE_TYPE IN (QP_PREQ_GRP.G_ITEM_UPGRADE,QP_PREQ_GRP.G_TERMS_SUBSTITUTION,
1496 QP_PREQ_GRP.G_COUPON_ISSUE,QP_PREQ_GRP.G_OTHER_ITEM_DISCOUNT,
1497 QP_PREQ_GRP.G_PROMO_GOODS_DISCOUNT)) THEN
1498 v_benefit_price := nvl(i.ESTIM_GL_VALUE,0);
1499 ELSIF (i.CREATED_FROM_LIST_LINE_TYPE IN (QP_PREQ_GRP.G_DISCOUNT,QP_PREQ_GRP.G_SURCHARGE,QP_PREQ_GRP.G_FREIGHT_CHARGE)) THEN
1500
1501 IF (i.CREATED_FROM_LIST_LINE_TYPE = QP_PREQ_GRP.G_DISCOUNT) THEN
1502 l_sign := 1;
1503 ELSE
1504 l_sign := -1;
1505 END IF;
1506
1507 IF l_debug = FND_API.G_TRUE THEN
1508 QP_PREQ_GRP.engine_debug('List Price For Best Price Eval: ' || p_list_price);
1509
1510 END IF;
1511
1512 IF(i.modifier_level_code <> 'ORDER') THEN -- bug 4234043
1513 IF (i.OPERAND_CALCULATION_CODE = QP_PREQ_GRP.G_PERCENT_DISCOUNT) THEN
1514 v_benefit_price := l_sign * p_list_price * (i.OPERAND_VALUE / 100);
1515 ELSIF (i.OPERAND_CALCULATION_CODE = QP_PREQ_GRP.G_AMOUNT_DISCOUNT) THEN
1516 v_benefit_price := l_sign * i.OPERAND_VALUE;
1517 ELSIF (i.OPERAND_CALCULATION_CODE = QP_PREQ_GRP.G_NEWPRICE_DISCOUNT) THEN
1518 l_sign := 1; -- For NEWPRICE l_sign will always be 1 irrespective of whether it is a discount or surcharge
1519 v_benefit_price := l_sign * (p_list_price - i.OPERAND_VALUE);
1520 ELSIF (i.OPERAND_CALCULATION_CODE = QP_PREQ_GRP.G_LUMPSUM_DISCOUNT) THEN
1521 OPEN get_request_qty_cur;
1522 FETCH get_request_qty_cur INTO v_request_qty;
1523 CLOSE get_request_qty_cur;
1524 IF (i.modifier_level_code = QP_PREQ_GRP.G_LINE_GROUP) THEN
1525 l_calc_quantity := nvl(nvl(i.group_quantity, i.group_amount), v_request_qty);
1526 ELSE
1527 l_calc_quantity := v_request_qty;
1528 END IF;
1529 v_benefit_price := l_sign * i.OPERAND_VALUE/l_calc_quantity;
1530 END IF;
1531 ELSE ---- modifier_level_code='ORDER'
1532 IF (i.OPERAND_CALCULATION_CODE IN (QP_PREQ_GRP.G_PERCENT_DISCOUNT)) THEN
1533 v_benefit_price := l_sign * i.OPERAND_VALUE;
1534 END IF;
1535 END IF;
1536
1537 ELSIF (i.CREATED_FROM_LIST_LINE_TYPE = QP_PREQ_GRP.G_PRICE_BREAK_TYPE) THEN
1538
1539 IF l_debug = FND_API.G_TRUE THEN
1540 QP_PREQ_GRP.engine_debug('Best Price Eval For Price Break Line Quantity : ' || i.line_quantity); --[julin/4240067/4307242]
1541 QP_PREQ_GRP.engine_debug('Best Price Eval For Price Break Group Quantity : ' || i.group_quantity);
1542 QP_PREQ_GRP.engine_debug('Best Price Eval For Price Break Group Amount : ' || i.group_amount);
1543
1544 END IF;
1545 --[julin/4240067/4307242] using i.line_quantity
1546 l_request_qty := nvl(nvl(i.group_quantity,i.group_amount),i.line_quantity);
1547
1548 IF l_debug = FND_API.G_TRUE THEN
1549 QP_PREQ_GRP.engine_debug('Best Price Eval For Price Break Qualifier Value : ' || l_request_qty);
1550
1551 END IF;
1552
1553 /* Added for 3244060 */
1554 IF QP_PREQ_GRP.G_PUBLIC_API_CALL_FLAG = 'Y' THEN
1555 l_line_id :=i.line_detail_index;
1556 ELSE
1557 l_line_id :=i.created_from_list_line_id;
1558 END IF;
1559
1560 --[julin/5456188] using same price_break_calculation as PPREB, but with no bucket/netamt support
1561 OPEN get_request_qty_cur;
1562 FETCH get_request_qty_cur INTO v_request_qty;
1563 CLOSE get_request_qty_cur;
1564
1565 BEGIN
1566 select pricing_attribute
1567 into l_volume_attribute
1568 from qp_pricing_attributes
1569 where list_line_id = i.created_from_list_line_id
1570 and pricing_attribute_context = QP_PREQ_GRP.G_PRIC_VOLUME_CONTEXT
1571 and excluder_flag='N'; --3607956
1572 EXCEPTION
1573 When OTHERS Then
1574 l_volume_attribute := null;
1575 END;
1576
1577 IF (i.modifier_level_code IN (QP_PREQ_PUB.G_LINE_LEVEL, QP_PREQ_PUB.G_ORDER_LEVEL)) THEN
1578 IF l_volume_attribute = QP_PREQ_PUB.G_QUANTITY_ATTRIBUTE THEN
1579 l_total_value := 0;
1580 l_req_value_per_unit := v_request_qty;
1581 ELSE
1582 l_total_value := i.line_quantity;
1583 l_req_value_per_unit := v_request_qty;
1584 END IF;
1585 ELSE -- linegroup
1586 IF l_volume_attribute = QP_PREQ_PUB.G_QUANTITY_ATTRIBUTE THEN
1587 l_total_value := 0;
1588 l_req_value_per_unit := i.group_quantity;
1589 ELSE
1590 l_total_value := i.line_quantity;
1591 l_req_value_per_unit := i.group_amount;
1592 END IF;
1593 END IF;
1594
1595 QP_Calculate_Price_PUB.Price_Break_Calculation(l_line_id, --3244060
1596 i.price_break_type_code,
1597 p_line_index,
1598 l_req_value_per_unit,--p_req_value_per_unit
1599 0,--p_applied_req_value_per_unit, no net amt support here
1600 l_total_value,--p_total_value
1601 p_list_price,
1602 0,--p_line_quantity, not used
1603 0,--p_bucketed_adjustment, no bucket support here
1604 'N',--p_bucketed_flag, no bucket support here
1605 'N',--p_automatic_flag, don't want deletion
1606 x_benefit_amount,
1607 l_return_status,
1608 l_return_status_text);
1609
1610 IF (l_return_status = FND_API.G_RET_STS_ERROR) THEN
1611 NULL;
1612 END IF;
1613
1614 v_benefit_price := x_benefit_amount;
1615 END IF;
1616
1617 IF l_debug = FND_API.G_TRUE THEN
1618 QP_PREQ_GRP.engine_debug('Benefit Price For Best Price Eval: ' || v_benefit_price);
1619
1620 END IF;
1621 IF (i.modifier_level_code <> 'ORDER') THEN --bug 4234043
1622 IF (p_list_price > 0) THEN
1623 v_benefit_percent := (nvl(v_benefit_price,0) / p_list_price) * 100;
1624 ELSIF (p_list_price < 0) THEN
1625 v_benefit_percent := (nvl(ABS(v_benefit_price),0) / ABS(p_list_price)) * 100;
1626 ELSE
1627 --v_benefit_percent := 0;
1628 v_benefit_percent := v_benefit_price;--14054072
1629 END IF;
1630 ELSE -- bug 4234043
1631 v_benefit_percent :=v_benefit_price;
1632 END IF;
1633
1634 IF l_debug = FND_API.G_TRUE THEN
1635 QP_PREQ_GRP.engine_debug('Benefit Percent For Best Price Eval: ' || v_benefit_percent);
1636
1637 END IF;
1638 /*
1639 INDX,QP_Resolve_Incompatability_PVTRUN.best_price_evaluation.upd1,qp_npreq_ldets_tmp_N1,LINE_INDEX,1
1640 INDX,QP_Resolve_Incompatability_PVTRUN.best_price_evaluation.upd1,qp_npreq_ldets_tmp_N1,PRICING_STATUS_CODE,2
1641 INDX,QP_Resolve_Incompatability_PVTRUN.best_price_evaluation.upd1,qp_npreq_ldets_tmp_N1,PRICING_PHASE_ID,3
1642 INDX,QP_Resolve_Incompatability_PVTRUN.best_price_evaluation.upd1,qp_npreq_ldets_tmp_N1,CREATED_FROM_LIST_HEADER_ID,4
1646 SET BEST_PERCENT = v_benefit_percent
1643 INDX,QP_Resolve_Incompatability_PVTRUN.best_price_evaluation.upd1,qp_npreq_ldets_tmp_N1,CREATED_FROM_LIST_LINE_ID,5
1644 */
1645 UPDATE qp_npreq_ldets_tmp -- upd1
1647 WHERE CREATED_FROM_LIST_HEADER_ID = i.CREATED_FROM_LIST_HEADER_ID
1648 AND CREATED_FROM_LIST_LINE_ID = i.CREATED_FROM_LIST_LINE_ID
1649 AND PRICING_PHASE_ID = p_pricing_phase_id
1650 AND INCOMPATABILITY_GRP_CODE = p_incomp_grp_id
1651 AND PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_NEW
1652 AND LINE_INDEX = p_line_index;
1653
1654 END LOOP;
1655
1656 OPEN get_list_lines_in_order;
1657 FETCH get_list_lines_in_order into v_list_line_id;
1658 CLOSE get_list_lines_in_order;
1659
1660 /*
1661 INDX,QP_Resolve_Incompatability_PVTRUN.best_price_evaluation.upd2,qp_npreq_ldets_tmp_N1,LINE_INDEX,1
1662 INDX,QP_Resolve_Incompatability_PVTRUN.best_price_evaluation.upd2,qp_npreq_ldets_tmp_N1,PRICING_STATUS_CODE,2
1663 INDX,QP_Resolve_Incompatability_PVTRUN.best_price_evaluation.upd2,qp_npreq_ldets_tmp_N1,PRICING_PHASE_ID,3
1664 */
1665
1666 UPDATE qp_npreq_ldets_tmp -- upd2
1667 SET PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_BEST_PRICE_EVAL
1668 WHERE CREATED_FROM_LIST_LINE_ID <> v_list_line_id
1669 AND CREATED_FROM_LIST_TYPE_CODE not in (QP_PREQ_GRP.G_PRICE_LIST_HEADER,QP_PREQ_GRP.G_AGR_LIST_HEADER)
1670 AND PRICING_PHASE_ID = p_pricing_phase_id
1671 AND INCOMPATABILITY_GRP_CODE = p_incomp_grp_id
1672 AND LINE_INDEX = p_line_index
1673 AND PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_NEW;
1674
1675
1676 --smbalara start 11924159 START :issue PBH child lines not getting updated to status B, hence best price not working correctly when PBH
1677 --line is involved
1678 IF l_debug = FND_API.G_TRUE THEN
1679 QP_PREQ_GRP.engine_debug('Number of parent lines updated with status B :' || SQL%ROWCOUNT);
1680 END IF;
1681 -- print_tmp_tabs();
1682
1683 UPDATE qp_npreq_ldets_tmp x-- upd2
1684 SET PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_BEST_PRICE_EVAL
1685 WHERE CREATED_FROM_LIST_LINE_ID in
1686 (select RELATED_LIST_LINE_ID
1687 FROM QP_NPREQ_RLTD_LINES_TMP y,qp_npreq_ldets_tmp z
1688 WHERE y.LIST_LINE_ID =z.CREATED_FROM_LIST_LINE_ID
1689 AND y.LINE_DETAIL_INDEX = z.LINE_DETAIL_INDEX
1690 AND z.PRICING_STATUS_CODE=QP_PREQ_GRP.G_STATUS_BEST_PRICE_EVAL
1691 );
1692
1693 IF l_debug = FND_API.G_TRUE THEN
1694 QP_PREQ_GRP.engine_debug('Number of lines child updated with status B :' || SQL%ROWCOUNT);
1695 END IF;
1696 --print_tmp_tabs();
1697 --smbalara start 11924159 END
1698
1699 /* UPDATE qp_npreq_line_attrs_tmp a
1700 SET a.PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_BEST_PRICE_EVAL
1701 WHERE a.LIST_LINE_ID IN (SELECT b.CREATED_FROM_LIST_LINE_ID
1702 FROM qp_npreq_ldets_tmp b
1703 WHERE b.PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_BEST_PRICE_EVAL
1704 AND b.CREATED_FROM_LIST_LINE_ID <> v_list_line_id
1705 AND b.LINE_INDEX = p_line_index)
1706 AND a.LINE_INDEX = p_line_index; */
1707
1708 /* UPDATE qp_npreq_line_attrs_tmp a
1709 SET a.PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_BEST_PRICE_EVAL
1710 WHERE a.LIST_LINE_ID
1711 IN (SELECT b.CREATED_FROM_LIST_LINE_ID
1712 FROM qp_npreq_ldets_tmp b
1713 WHERE b.PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_BEST_PRICE_EVAL
1714 AND b.PRICING_PHASE_ID = p_pricing_phase_id
1715 AND b.INCOMPATABILITY_GRP_CODE = p_incomp_grp_id
1716 AND b.CREATED_FROM_LIST_LINE_ID <> v_list_line_id
1717 AND b.LINE_INDEX = p_line_index)
1718 AND a.LINE_INDEX = p_line_index; */
1719
1720 x_list_line_id := v_list_line_id;
1721 IF l_debug = FND_API.G_TRUE THEN
1722 QP_PREQ_GRP.engine_debug('Best List line Id: ' || v_list_line_id);
1723
1724 END IF;
1725 x_return_status := v_return_status; -- SUCCESS
1726
1727 EXCEPTION
1728 WHEN OTHERS THEN
1729 IF l_debug = FND_API.G_TRUE THEN
1730 QP_PREQ_GRP.engine_debug(v_routine_name || 'Unexpected Error');
1731 QP_PREQ_GRP.engine_debug(v_routine_name || ' ' || SQLERRM);
1732 END IF;
1733 v_return_status := FND_API.G_RET_STS_ERROR;
1734 x_return_status := v_return_status;
1735 END Best_Price_Evaluation;
1736
1737 PROCEDURE Delete_Lines_Complete (p_line_index_tbl IN QP_PREQ_GRP.NUMBER_TYPE,
1738 p_pricing_status_text IN VARCHAR2,
1739 x_return_status OUT NOCOPY VARCHAR2,
1740 x_return_status_txt OUT NOCOPY VARCHAR2) AS
1741 BEGIN
1742 l_debug := QP_PREQ_GRP.G_DEBUG_ENGINE;
1743 IF l_debug = FND_API.G_TRUE THEN
1744 QP_PREQ_GRP.engine_debug('deleting lines/ldets/attrs/rltd:'||p_pricing_status_text);
1745 END IF;
1746
1747 FORALL i IN p_line_index_tbl.FIRST..p_line_index_tbl.LAST
1748 UPDATE qp_npreq_lines_tmp
1749 SET pricing_status_code = QP_PREQ_PUB.G_NOT_VALID, process_status = QP_PREQ_PUB.G_NOT_VALID
1750 WHERE line_index = p_line_index_tbl(i)
1751 and line_id is null; --bug 7539796
1752 FORALL i IN p_line_index_tbl.FIRST..p_line_index_tbl.LAST
1753 UPDATE qp_npreq_ldets_tmp
1754 SET PRICING_STATUS_CODE = QP_PREQ_PUB.G_STATUS_DELETED,
1755 PRICING_STATUS_TEXT = substr(p_pricing_status_text,1,2000)
1756 WHERE LINE_INDEX = p_line_index_tbl(i);
1757 FORALL i IN p_line_index_tbl.FIRST..p_line_index_tbl.LAST
1758 UPDATE qp_npreq_line_attrs_tmp
1759 SET PRICING_STATUS_CODE = QP_PREQ_PUB.G_STATUS_DELETED,
1760 PRICING_STATUS_TEXT = substr(p_pricing_status_text,1,240)
1761 WHERE LINE_INDEX = p_line_index_tbl(i);
1762 FORALL i IN p_line_index_tbl.FIRST..p_line_index_tbl.LAST
1763 UPDATE qp_npreq_rltd_lines_tmp
1764 SET PRICING_STATUS_CODE = QP_PREQ_PUB.G_STATUS_DELETED,
1765 PRICING_STATUS_TEXT = substr(p_pricing_status_text,1,240)
1766 WHERE RELATED_LINE_INDEX = p_line_index_tbl(i);
1767 EXCEPTION
1768 WHEN OTHERS THEN
1769 x_return_status := FND_API.G_RET_STS_ERROR;
1770 x_return_status_txt := 'Unexpected error in QP_Resolve_Incompatability_PVT.Delete_Lines_Complete: ' || SQLERRM;
1771 END Delete_Lines_Complete;
1772
1773 PROCEDURE Delete_Ldets_Complete (p_line_detail_index_tbl IN QP_PREQ_GRP.NUMBER_TYPE,
1774 p_pricing_status_text IN VARCHAR2,
1775 x_return_status OUT NOCOPY VARCHAR2,
1776 x_return_status_txt OUT NOCOPY VARCHAR2) AS
1777 BEGIN
1778 l_debug := QP_PREQ_GRP.G_DEBUG_ENGINE;
1779 IF l_debug = FND_API.G_TRUE THEN
1780 QP_PREQ_GRP.engine_debug('deleting ldets/rltd:'||p_pricing_status_text);
1781 END IF;
1782
1783 FORALL i IN p_line_detail_index_tbl.FIRST..p_line_detail_index_tbl.LAST
1784 UPDATE qp_npreq_ldets_tmp a
1785 SET PRICING_STATUS_CODE = QP_PREQ_PUB.G_STATUS_DELETED,
1786 PRICING_STATUS_TEXT = substr(p_pricing_status_text,1,2000)
1787 WHERE LINE_DETAIL_INDEX = p_line_detail_index_tbl(i) OR
1788 EXISTS (SELECT 1 --[julin/4671446] also deleting children ldets
1789 FROM qp_npreq_rltd_lines_tmp
1790 WHERE LINE_DETAIL_INDEX = p_line_detail_index_tbl(i)
1791 AND RELATED_LINE_DETAIL_INDEX = a.LINE_DETAIL_INDEX);
1792 FORALL i IN p_line_detail_index_tbl.FIRST..p_line_detail_index_tbl.LAST
1793 UPDATE qp_npreq_rltd_lines_tmp
1794 SET PRICING_STATUS_CODE = QP_PREQ_PUB.G_STATUS_DELETED,
1795 PRICING_STATUS_TEXT = substr(p_pricing_status_text,1,240)
1796 WHERE (LINE_DETAIL_INDEX = p_line_detail_index_tbl(i) OR
1797 RELATED_LINE_DETAIL_INDEX = p_line_detail_index_tbl(i)); --[julin/4671446] also deleting children ldets
1798 EXCEPTION
1799 WHEN OTHERS THEN
1800 x_return_status := FND_API.G_RET_STS_ERROR;
1801 x_return_status_txt := 'Unexpected error in QP_Resolve_Incompatability_PVT.Delete_Ldets_Complete: ' || SQLERRM;
1802 END Delete_Ldets_Complete;
1803
1804
1805 PROCEDURE Delete_Incompatible_Lines(p_pricing_phase_id NUMBER,
1806 p_line_index NUMBER,
1807 p_incomp_grp_id VARCHAR2 := NULL,
1808 p_list_line_id NUMBER,
1809 p_excl_discount BOOLEAN,
1810 p_manual_dis_flag VARCHAR2,
1811 x_return_status OUT NOCOPY VARCHAR2) AS
1812
1813
1814 -- [prarasto/4141235] find loser prg line indexes to be deleted, incompatibility group
1815 --frontported fix done in 4134088
1816 CURSOR l_del_prg_lines_grp_cur IS
1817 SELECT rltd.RELATED_LINE_INDEX
1818 FROM qp_npreq_ldets_tmp ldets, qp_npreq_rltd_lines_tmp rltd
1819 WHERE ldets.INCOMPATABILITY_GRP_CODE = p_incomp_grp_id
1820 AND ldets.LINE_INDEX = p_line_index
1821 AND ldets.PRICING_PHASE_ID = p_pricing_phase_id
1822 AND ldets.CREATED_FROM_LIST_LINE_ID <> p_list_line_id
1823 AND ldets.LINE_DETAIL_TYPE_CODE <> QP_PREQ_GRP.G_CHILD_DETAIL_TYPE
1824 AND ldets.CREATED_FROM_LIST_LINE_TYPE IN (QP_PREQ_GRP.G_PROMO_GOODS_DISCOUNT)
1825 AND ldets.CREATED_FROM_LIST_LINE_ID = rltd.LIST_LINE_ID
1826 AND rltd.LINE_INDEX = p_line_index;
1827
1828 -- [prarasto/4141235] find loser prg line indexes to be deleted, incompatibility group
1829 --frontported fix done in 4134088
1830 CURSOR l_del_oid_ldets_grp_cur IS
1831 SELECT rltd.RELATED_LINE_DETAIL_INDEX
1832 FROM qp_npreq_ldets_tmp ldets, qp_npreq_rltd_lines_tmp rltd
1833 WHERE ldets.INCOMPATABILITY_GRP_CODE = p_incomp_grp_id
1834 AND ldets.LINE_INDEX = p_line_index
1835 AND ldets.PRICING_PHASE_ID = p_pricing_phase_id
1836 AND ldets.CREATED_FROM_LIST_LINE_ID <> p_list_line_id
1837 AND ldets.LINE_DETAIL_TYPE_CODE <> QP_PREQ_GRP.G_CHILD_DETAIL_TYPE
1838 AND ldets.CREATED_FROM_LIST_LINE_TYPE IN (QP_PREQ_GRP.G_OTHER_ITEM_DISCOUNT)
1839 AND ldets.CREATED_FROM_LIST_LINE_ID = rltd.LIST_LINE_ID
1840 AND rltd.LINE_INDEX = p_line_index;
1841
1842 -- [prarasto/4141235] find loser prg line indexes to be deleted, incompatibility group
1843 --frontported fix done in 4134088
1844 CURSOR l_del_prg_lines_excl_cur IS
1845 SELECT rltd.RELATED_LINE_INDEX
1846 FROM qp_npreq_ldets_tmp ldets, qp_npreq_rltd_lines_tmp rltd
1847 WHERE ldets.LINE_INDEX = p_line_index
1848 AND ldets.PRICING_PHASE_ID = p_pricing_phase_id
1849 AND ldets.CREATED_FROM_LIST_LINE_ID <> p_list_line_id
1850 AND ldets.LINE_DETAIL_TYPE_CODE <> QP_PREQ_GRP.G_CHILD_DETAIL_TYPE
1851 AND ldets.CREATED_FROM_LIST_LINE_TYPE IN (QP_PREQ_GRP.G_PROMO_GOODS_DISCOUNT)
1852 AND ldets.CREATED_FROM_LIST_LINE_ID = rltd.LIST_LINE_ID
1853 AND rltd.LINE_INDEX = p_line_index;
1857 CURSOR l_del_oid_ldets_excl_cur IS
1854
1855 -- [prarasto/4141235] find loser prg line indexes to be deleted, incompatibility group
1856 --frontported fix done in 4134088
1858 SELECT rltd.RELATED_LINE_DETAIL_INDEX
1859 FROM qp_npreq_ldets_tmp ldets, qp_npreq_rltd_lines_tmp rltd
1860 WHERE ldets.LINE_INDEX = p_line_index
1861 AND ldets.PRICING_PHASE_ID = p_pricing_phase_id
1862 AND ldets.CREATED_FROM_LIST_LINE_ID <> p_list_line_id
1863 AND ldets.LINE_DETAIL_TYPE_CODE <> QP_PREQ_GRP.G_CHILD_DETAIL_TYPE
1864 AND ldets.CREATED_FROM_LIST_LINE_TYPE IN (QP_PREQ_GRP.G_OTHER_ITEM_DISCOUNT)
1865 AND ldets.CREATED_FROM_LIST_LINE_ID = rltd.LIST_LINE_ID
1866 AND rltd.LINE_INDEX = p_line_index;
1867
1868 l_del_index_tbl QP_PREQ_GRP.NUMBER_TYPE;
1869
1870 l_status_code VARCHAR2(30);
1871 l_status_text VARCHAR2(240);
1872
1873 v_return_status VARCHAR2(30) := FND_API.G_RET_STS_SUCCESS;
1874 v_routine_name CONSTANT VARCHAR2(240):='Routine:QP_Resolve_Incompatability_PVTRUN.Delete_Incompatible_Lines';
1875
1876 BEGIN
1877 l_debug := QP_PREQ_GRP.G_DEBUG_ENGINE;
1878
1879 IF l_debug = FND_API.G_TRUE THEN
1880 QP_PREQ_GRP.engine_debug('Enter Delete_Incompatible_Lines:'||p_line_index||':'||p_incomp_grp_id||':'||p_list_line_id||':'||p_manual_dis_flag);
1881 END IF;
1882
1883 IF (p_manual_dis_flag = QP_PREQ_GRP.G_YES) THEN
1884 IF (p_excl_discount = FALSE) THEN
1885
1886 /*
1887 INDX,QP_Resolve_Incompatability_PVTRUN.delete_incompatible_lines.upd1,qp_npreq_ldets_tmp_N1,LINE_INDEX,1
1888 INDX,QP_Resolve_Incompatability_PVTRUN.delete_incompatible_lines.upd1,qp_npreq_ldets_tmp_N1,PRICING_STATUS_CODE,2
1889 INDX,QP_Resolve_Incompatability_PVTRUN.delete_incompatible_lines.upd1,qp_npreq_ldets_tmp_N1,PRICING_PHASE_ID,3
1890 */
1891
1892 UPDATE qp_npreq_ldets_tmp --upd1
1893 SET PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_INCOMP_LOGIC
1894 WHERE INCOMPATABILITY_GRP_CODE = p_incomp_grp_id
1895 AND LINE_INDEX = p_line_index
1896 AND PRICING_PHASE_ID = p_pricing_phase_id
1897 AND CREATED_FROM_LIST_LINE_ID <> p_list_line_id
1898 AND CREATED_FROM_LIST_LINE_TYPE NOT IN (QP_PREQ_GRP.G_DISCOUNT,QP_PREQ_GRP.G_SURCHARGE)
1899 AND LINE_DETAIL_TYPE_CODE <> QP_PREQ_GRP.G_CHILD_DETAIL_TYPE -- Don't delete PBH Children any time
1900 AND PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_NEW;
1901
1902 --Begin Bug No: 7691661
1903 UPDATE qp_npreq_ldets_tmp
1904 SET PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_INCOMP_LOGIC
1905 WHERE INCOMPATABILITY_GRP_CODE = p_incomp_grp_id
1906 AND LINE_INDEX = p_line_index
1907 AND PRICING_PHASE_ID = p_pricing_phase_id
1908 AND CREATED_FROM_LIST_LINE_ID <> p_list_line_id
1909 AND ASK_FOR_FLAG = QP_PREQ_GRP.G_YES
1910 AND CREATED_FROM_LIST_LINE_TYPE IN (QP_PREQ_GRP.G_DISCOUNT,QP_PREQ_GRP.G_SURCHARGE)
1911 AND LINE_DETAIL_TYPE_CODE <> QP_PREQ_GRP.G_CHILD_DETAIL_TYPE -- Don't delete PBH Children any time
1912 AND PRICING_STATUS_CODE IN (QP_PREQ_GRP.G_STATUS_NEW,QP_PREQ_GRP.G_STATUS_BEST_PRICE_EVAL);
1913 --End Bug No: 7691661
1914
1915
1916 /*
1917 INDX,QP_Resolve_Incompatability_PVTRUN.delete_incompatible_lines.upd2,qp_npreq_ldets_tmp_N3,LINE_INDEX,1
1918 INDX,QP_Resolve_Incompatability_PVTRUN.delete_incompatible_lines.upd2,qp_npreq_ldets_tmp_N3,PRICING_PHASE_ID,2
1919 INDX,QP_Resolve_Incompatability_PVTRUN.delete_incompatible_lines.upd2,qp_npreq_ldets_tmp_N3,ASK_FOR_FLAG,3
1920 INDX,QP_Resolve_Incompatability_PVTRUN.delete_incompatible_lines.upd2,qp_npreq_ldets_tmp_N3,CREATED_FROM_LIST_LINE_TYPE,4
1921 INDX,QP_Resolve_Incompatability_PVTRUN.delete_incompatible_lines.upd2,qp_npreq_ldets_tmp_N3,PRICING_STATUS_CODE,5
1922 */
1923
1924 UPDATE qp_npreq_ldets_tmp --upd2
1925 SET PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_NEW,
1926 AUTOMATIC_FLAG = QP_PREQ_GRP.G_NO,
1927 APPLIED_FLAG = QP_PREQ_GRP.G_NO
1928 WHERE INCOMPATABILITY_GRP_CODE = p_incomp_grp_id
1929 AND LINE_INDEX = p_line_index
1930 AND PRICING_PHASE_ID = p_pricing_phase_id
1931 AND CREATED_FROM_LIST_LINE_ID <> p_list_line_id
1932 AND ASK_FOR_FLAG = QP_PREQ_GRP.G_NO
1933 AND CREATED_FROM_LIST_LINE_TYPE IN (QP_PREQ_GRP.G_DISCOUNT,QP_PREQ_GRP.G_SURCHARGE)
1934 AND LINE_DETAIL_TYPE_CODE <> QP_PREQ_GRP.G_CHILD_DETAIL_TYPE -- Don't delete PBH Children any time
1935 AND PRICING_STATUS_CODE IN (QP_PREQ_GRP.G_STATUS_NEW,QP_PREQ_GRP.G_STATUS_BEST_PRICE_EVAL);
1936
1937 /* UPDATE qp_npreq_line_attrs_tmp a
1938 SET a.PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_NEW
1939 WHERE a.LIST_LINE_ID
1940 IN (SELECT b.CREATED_FROM_LIST_LINE_ID
1941 FROM qp_npreq_ldets_tmp b
1942 WHERE b.PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_NEW
1943 AND b.PRICING_PHASE_ID = p_pricing_phase_id
1944 AND b.INCOMPATABILITY_GRP_CODE = p_incomp_grp_id
1945 AND b.CREATED_FROM_LIST_LINE_ID <> p_list_line_id
1946 AND ASK_FOR_FLAG = QP_PREQ_GRP.G_NO
1947 AND b.CREATED_FROM_LIST_LINE_TYPE IN (QP_PREQ_GRP.G_DISCOUNT,QP_PREQ_GRP.G_SURCHARGE)
1948 AND b.LINE_INDEX = p_line_index)
1949 AND a.LINE_INDEX = p_line_index; */
1950
1951 ELSE
1952 /*
1953 INDX,QP_Resolve_Incompatability_PVTRUN.delete_incompatible_lines.upd3,qp_npreq_ldets_tmp_N1,LINE_INDEX,1
1954 INDX,QP_Resolve_Incompatability_PVTRUN.delete_incompatible_lines.upd3,qp_npreq_ldets_tmp_N1,PRICING_STATUS_CODE,2
1955 INDX,QP_Resolve_Incompatability_PVTRUN.delete_incompatible_lines.upd3,qp_npreq_ldets_tmp_N1,PRICING_PHASE_ID,3
1956 */
1957
1958 UPDATE qp_npreq_ldets_tmp --upd3
1959 SET PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_INCOMP_LOGIC
1960 WHERE LINE_INDEX = p_line_index
1961 AND PRICING_PHASE_ID = p_pricing_phase_id
1962 AND CREATED_FROM_LIST_LINE_ID <> p_list_line_id
1966
1963 AND CREATED_FROM_LIST_LINE_TYPE NOT IN (QP_PREQ_GRP.G_DISCOUNT,QP_PREQ_GRP.G_SURCHARGE)
1964 AND LINE_DETAIL_TYPE_CODE <> QP_PREQ_GRP.G_CHILD_DETAIL_TYPE -- Don't delete PBH Children any time
1965 AND PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_NEW;
1967 /*
1968 INDX,QP_Resolve_Incompatability_PVTRUN.delete_incompatible_lines.upd4,qp_npreq_ldets_tmp_N3,LINE_INDEX,1
1969 INDX,QP_Resolve_Incompatability_PVTRUN.delete_incompatible_lines.upd4,qp_npreq_ldets_tmp_N3,PRICING_PHASE_ID,2
1970 INDX,QP_Resolve_Incompatability_PVTRUN.delete_incompatible_lines.upd4,qp_npreq_ldets_tmp_N3,ASK_FOR_FLAG,3
1971 INDX,QP_Resolve_Incompatability_PVTRUN.delete_incompatible_lines.upd4,qp_npreq_ldets_tmp_N3,CREATED_FROM_LIST_LINE_TYPE,4
1972 INDX,QP_Resolve_Incompatability_PVTRUN.delete_incompatible_lines.upd4,qp_npreq_ldets_tmp_N3,PRICING_STATUS_CODE,5
1973 */
1974 --Begin Bug No: 7691661
1975 UPDATE qp_npreq_ldets_tmp
1976 SET PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_INCOMP_LOGIC
1977 WHERE LINE_INDEX = p_line_index
1978 AND PRICING_PHASE_ID = p_pricing_phase_id
1979 AND CREATED_FROM_LIST_LINE_ID <> p_list_line_id
1980 AND ASK_FOR_FLAG = QP_PREQ_GRP.G_YES
1981 AND CREATED_FROM_LIST_LINE_TYPE IN (QP_PREQ_GRP.G_DISCOUNT,QP_PREQ_GRP.G_SURCHARGE)
1982 AND LINE_DETAIL_TYPE_CODE <> QP_PREQ_GRP.G_CHILD_DETAIL_TYPE -- Don't delete PBH Children any time
1983 AND PRICING_STATUS_CODE IN (QP_PREQ_GRP.G_STATUS_NEW,QP_PREQ_GRP.G_STATUS_BEST_PRICE_EVAL);
1984 --End Bug No: 7691661
1985
1986
1987 UPDATE qp_npreq_ldets_tmp --upd4
1988 SET PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_NEW,
1989 AUTOMATIC_FLAG = QP_PREQ_GRP.G_NO,
1990 APPLIED_FLAG = QP_PREQ_GRP.G_NO
1991 WHERE LINE_INDEX = p_line_index
1992 AND PRICING_PHASE_ID = p_pricing_phase_id
1993 AND CREATED_FROM_LIST_LINE_ID <> p_list_line_id
1994 AND ASK_FOR_FLAG = QP_PREQ_GRP.G_NO
1995 AND CREATED_FROM_LIST_LINE_TYPE IN (QP_PREQ_GRP.G_DISCOUNT,QP_PREQ_GRP.G_SURCHARGE)
1996 AND LINE_DETAIL_TYPE_CODE <> QP_PREQ_GRP.G_CHILD_DETAIL_TYPE -- Don't delete PBH Children any time
1997 AND PRICING_STATUS_CODE IN (QP_PREQ_GRP.G_STATUS_NEW,QP_PREQ_GRP.G_STATUS_BEST_PRICE_EVAL);
1998
1999 /* UPDATE qp_npreq_line_attrs_tmp a
2000 SET a.PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_NEW
2001 WHERE a.LIST_LINE_ID
2002 IN (SELECT b.CREATED_FROM_LIST_LINE_ID
2003 FROM qp_npreq_ldets_tmp b
2004 WHERE b.PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_NEW
2005 AND b.PRICING_PHASE_ID = p_pricing_phase_id
2006 AND b.INCOMPATABILITY_GRP_CODE = p_incomp_grp_id
2007 AND b.CREATED_FROM_LIST_LINE_ID <> p_list_line_id
2008 AND ASK_FOR_FLAG = QP_PREQ_GRP.G_NO
2009 AND b.CREATED_FROM_LIST_LINE_TYPE IN (QP_PREQ_GRP.G_DISCOUNT,QP_PREQ_GRP.G_SURCHARGE)
2010 AND b.LINE_INDEX = p_line_index)
2011 AND a.LINE_INDEX = p_line_index; */
2012
2013 END IF; --p_exclusive_discount = TRUE
2014 ELSE -- Automatic discounts
2015 IF (p_excl_discount = FALSE) THEN
2016
2017 /*
2018 INDX,QP_Resolve_Incompatability_PVTRUN.delete_incompatible_lines.upd5,qp_npreq_ldets_tmp_N1,LINE_INDEX,1
2019 INDX,QP_Resolve_Incompatability_PVTRUN.delete_incompatible_lines.upd5,qp_npreq_ldets_tmp_N1,PRICING_STATUS_CODE,2
2020 INDX,QP_Resolve_Incompatability_PVTRUN.delete_incompatible_lines.upd5,qp_npreq_ldets_tmp_N1,PRICING_PHASE_ID,3
2021 */
2022
2023 UPDATE qp_npreq_ldets_tmp --upd5
2024 SET PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_INCOMP_LOGIC
2025 WHERE INCOMPATABILITY_GRP_CODE = p_incomp_grp_id
2026 AND LINE_INDEX = p_line_index
2027 AND PRICING_PHASE_ID = p_pricing_phase_id
2028 AND CREATED_FROM_LIST_LINE_ID <> p_list_line_id
2029 AND LINE_DETAIL_TYPE_CODE <> QP_PREQ_GRP.G_CHILD_DETAIL_TYPE -- Don't delete PBH Children any time
2030 AND PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_NEW;
2031 ELSE
2032 UPDATE qp_npreq_ldets_tmp
2033 SET PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_INCOMP_LOGIC
2034 WHERE LINE_INDEX = p_line_index
2035 AND PRICING_PHASE_ID = p_pricing_phase_id
2036 AND CREATED_FROM_LIST_LINE_ID <> p_list_line_id
2037 AND LINE_DETAIL_TYPE_CODE <> QP_PREQ_GRP.G_CHILD_DETAIL_TYPE -- Don't delete PBH Children any time
2038 AND PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_NEW;
2039 END IF; -- p_exclusive_discount = FALSE
2040 END IF;
2041
2042 IF (p_excl_discount = FALSE) THEN
2043
2044 IF l_debug = FND_API.G_TRUE THEN
2045 QP_PREQ_GRP.engine_debug('Checking for PRG/OID losers in incompatibility group '||p_incomp_grp_id);
2046 END IF;
2047
2048 -- [prarasto/4141235] delete loser prg/oid lines/ldets/attrs/rltd
2049 --frontported fix done in 41340888
2050 OPEN l_del_prg_lines_grp_cur;
2051 FETCH l_del_prg_lines_grp_cur
2052 BULK COLLECT INTO l_del_index_tbl;
2053 CLOSE l_del_prg_lines_grp_cur;
2054
2055 IF (l_del_index_tbl.count > 0) THEN
2056 Delete_Lines_Complete(l_del_index_tbl, 'PRG DELETED BY INCOMPATIBILITY LOGIC', l_status_code, l_status_text);
2057 END IF;
2058
2059 -- [prarasto/4141235] delete loser oid ldets/rltd
2060 --frontported fix done in 41340888
2061 OPEN l_del_oid_ldets_grp_cur;
2062 FETCH l_del_oid_ldets_grp_cur
2063 BULK COLLECT INTO l_del_index_tbl;
2064 CLOSE l_del_oid_ldets_grp_cur;
2065
2066 IF (l_del_index_tbl.count > 0) THEN
2067 Delete_Ldets_Complete(l_del_index_tbl, 'OID DELETED BY INCOMPATIBILITY LOGIC', l_status_code, l_status_text);
2068 END IF;
2069
2070 ELSE
2071
2072 IF l_debug = FND_API.G_TRUE THEN
2073 QP_PREQ_GRP.engine_debug('Checking for PRG/OID losers to exclusive group line' );
2074 END IF;
2075
2076 -- [prarasto/4141235] delete loser prg/oid lines/ldets/attrs/rltd, exclusive winner
2077 --frontported fix done in 41340888
2078 OPEN l_del_prg_lines_excl_cur;
2079 FETCH l_del_prg_lines_excl_cur
2080 BULK COLLECT INTO l_del_index_tbl;
2081 CLOSE l_del_prg_lines_excl_cur;
2082
2083 IF (l_del_index_tbl.count > 0) THEN
2084 Delete_Lines_Complete(l_del_index_tbl, 'PRG DELETED BY INCOMPATIBILITY LOGIC', l_status_code, l_status_text);
2085 END IF;
2086
2087 -- [prarasto/4141235] delete loser oid ldets/rltd, exclusive winner
2088 --frontported fix done in 41340888
2089 OPEN l_del_oid_ldets_excl_cur;
2090 FETCH l_del_oid_ldets_excl_cur
2091 BULK COLLECT INTO l_del_index_tbl;
2092 CLOSE l_del_oid_ldets_excl_cur;
2093
2094 IF (l_del_index_tbl.count > 0) THEN
2095 Delete_Ldets_Complete(l_del_index_tbl, 'OID DELETED BY INCOMPATIBILITY LOGIC', l_status_code, l_status_text);
2096 END IF;
2097
2098 END IF;
2099
2100 x_return_status := v_return_status;
2101 EXCEPTION
2102 WHEN OTHERS THEN
2103 IF l_debug = FND_API.G_TRUE THEN
2104 QP_PREQ_GRP.engine_debug(v_routine_name || ' ' || SQLERRM);
2105 END IF;
2106 v_return_status := FND_API.G_RET_STS_ERROR;
2107 x_return_status := v_return_status;
2108 END Delete_Incompatible_Lines;
2109
2110 PROCEDURE Best_Price_For_Phase(p_list_price NUMBER,
2111 p_line_index NUMBER,
2112 p_pricing_phase_id NUMBER,
2113 x_return_status OUT NOCOPY VARCHAR2,
2114 x_return_status_txt OUT NOCOPY VARCHAR2) AS
2115 -- Index Certificate
2116
2117 /*
2118 INDX,QP_Resolve_Incompatability_PVTRUN.best_price_for_phase.incomp_cur,qp_npreq_ldets_tmp_N1,LINE_INDEX,1
2119 INDX,QP_Resolve_Incompatability_PVTRUN.best_price_for_phase.incomp_cur,qp_npreq_ldets_tmp_N1,PRICING_STATUS_CODE,2
2120 INDX,QP_Resolve_Incompatability_PVTRUN.best_price_for_phase.incomp_cur,qp_npreq_ldets_tmp_N1,PRICING_PHASE_ID,3
2121 */
2122
2123 CURSOR incomp_cur(p_manual_dis_flag VARCHAR2) IS
2124 SELECT DISTINCT INCOMPATABILITY_GRP_CODE
2125 FROM qp_npreq_ldets_tmp
2126 WHERE PRICING_PHASE_ID = p_pricing_phase_id
2127 AND INCOMPATABILITY_GRP_CODE IS NOT NULL
2128 AND LINE_INDEX = p_line_index
2129 AND ((AUTOMATIC_FLAG = QP_PREQ_GRP.G_YES AND p_manual_dis_flag = QP_PREQ_GRP.G_YES) OR
2130 p_manual_dis_flag = QP_PREQ_GRP.G_NO)
2131 AND PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_NEW;
2132
2133
2134 x_list_line_id NUMBER;
2135 v_return_status VARCHAR2(30) := FND_API.G_RET_STS_SUCCESS;
2136 x_ret_status VARCHAR2(30);
2137 v_excl_flag BOOLEAN := FALSE;
2138 v_manual_dis_flag VARCHAR2(1) := nvl(QP_PREQ_GRP.G_MANUAL_DISCOUNT_FLAG,'Y');
2139
2140 INVALID_BEST_PRICE EXCEPTION;
2141
2142 v_routine_name CONSTANT VARCHAR2(240) := 'Routine:QP_Resolve_Incompatability_PVTRUN.Best_Price_For_Phase';
2143
2144 BEGIN
2145 l_debug := QP_PREQ_GRP.G_DEBUG_ENGINE;
2146
2147 --[julin/4116856] moved deletion of un-asked-for promotions to QP_PREQ_GRP
2148
2149 /* UPDATE qp_npreq_line_attrs_tmp a
2150 SET a.PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_BEST_PRICE_EVAL
2151 WHERE a.LIST_LINE_ID IN (SELECT b.CREATED_FROM_LIST_LINE_ID
2152 FROM qp_npreq_ldets_tmp b
2153 WHERE b.PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_BEST_PRICE_EVAL
2154 AND b.PRICING_PHASE_ID = p_pricing_phase_id
2155 AND b.ASK_FOR_FLAG = QP_PREQ_GRP.G_YES
2156 AND b.LINE_INDEX = p_line_index)
2157 AND a.LINE_INDEX = p_line_index; */
2158
2159 FOR i IN incomp_cur(v_manual_dis_flag)
2160 LOOP
2161 IF (v_excl_flag = FALSE) THEN
2162 -- Best Price Evaluation
2163 IF l_debug = FND_API.G_TRUE THEN
2164 QP_PREQ_GRP.engine_debug('Best Price For Phase .....');
2165 END IF;
2166 Best_Price_Evaluation(p_list_price,
2167 p_line_index,
2168 p_pricing_phase_id,
2169 i.INCOMPATABILITY_GRP_CODE,
2170 NULL, -- Added for bug#2661540
2171 v_manual_dis_flag,
2172 x_list_line_id,
2173 x_ret_status);
2174 IF (x_ret_status = FND_API.G_RET_STS_ERROR) THEN
2175 RAISE INVALID_BEST_PRICE;
2176 END IF;
2177 END IF;
2178 -- Incomp_grp_id ='EXCL' has the highest priority(exclusivity)
2182 IF (v_excl_flag = FALSE) THEN
2179 IF (i.INCOMPATABILITY_GRP_CODE = QP_PREQ_GRP.G_INCOMP_EXCLUSIVE) THEN
2180 v_excl_flag := TRUE;
2181 END IF;
2183 Delete_Incompatible_Lines(p_pricing_phase_id,
2184 p_line_index,
2185 i.INCOMPATABILITY_GRP_CODE,
2186 x_list_line_id,
2187 v_excl_flag,
2188 v_manual_dis_flag,
2189 x_ret_status);
2190
2191 END IF;
2192 END LOOP;
2193 IF(v_excl_flag = TRUE) THEN
2194 Delete_Incompatible_Lines(p_pricing_phase_id,
2195 p_line_index,
2196 NULL, -- incomp_grp_id
2197 x_list_line_id,
2198 v_excl_flag,
2199 v_manual_dis_flag,
2200 x_ret_status);
2201
2202 END IF;
2203 EXCEPTION
2204 WHEN INVALID_BEST_PRICE THEN
2205 IF l_debug = FND_API.G_TRUE THEN
2206 QP_PREQ_GRP.engine_debug(v_routine_name || ' ' || SQLERRM);
2207 END IF;
2208 x_return_status_txt := v_routine_name || ' ' || SQLERRM;
2209 v_return_status := QP_PREQ_GRP.G_STATUS_BEST_PRICE_EVAL_ERROR;
2210 x_return_status := v_return_status;
2211 WHEN OTHERS THEN
2212 IF l_debug = FND_API.G_TRUE THEN
2213 QP_PREQ_GRP.engine_debug(v_routine_name || 'Unexpected Error');
2214 QP_PREQ_GRP.engine_debug(v_routine_name || ' ' || SQLERRM);
2215 END IF;
2216 v_return_status := FND_API.G_RET_STS_ERROR;
2217 x_return_status := v_return_status;
2218 END Best_Price_For_Phase;
2219
2220 PROCEDURE Resolve_Incompatability(p_pricing_phase_id NUMBER,
2221 p_processing_flag VARCHAR2,
2222 p_list_price NUMBER,
2223 p_line_index NUMBER,
2224 x_return_status OUT NOCOPY VARCHAR2,
2225 x_return_status_txt OUT NOCOPY VARCHAR2) AS
2226
2227 -- Index Certificate
2228
2229 /*
2230 INDX,QP_Resolve_Incompatability_PVTRUN.resolve_incompatability.incomp_cur,qp_npreq_ldets_tmp_N1,LINE_INDEX,1
2231 INDX,QP_Resolve_Incompatability_PVTRUN.resolve_incompatability.incomp_cur,qp_npreq_ldets_tmp_N1,PRICING_STATUS_CODE,2
2232 INDX,QP_Resolve_Incompatability_PVTRUN.resolve_incompatability.incomp_cur,qp_npreq_ldets_tmp_N1,PRICING_PHASE_ID,3
2233 */
2234
2235 CURSOR incomp_cur(l_manual_dis_flag VARCHAR2) IS
2236 SELECT DISTINCT INCOMPATABILITY_GRP_CODE , PRICING_STATUS_CODE
2237 FROM qp_npreq_ldets_tmp
2238 WHERE PRICING_PHASE_ID = p_pricing_phase_id
2239 AND INCOMPATABILITY_GRP_CODE IS NOT NULL
2240 AND PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_NEW
2241 AND ((AUTOMATIC_FLAG = QP_PREQ_GRP.G_YES AND l_manual_dis_flag = QP_PREQ_GRP.G_YES) OR
2242 l_manual_dis_flag = QP_PREQ_GRP.G_NO)
2243 AND LINE_INDEX = p_line_index;
2244
2245 /*
2246 INDX,QP_Resolve_Incompatability_PVTRUN.resolve_incompatability.each_incomp_cur,qp_npreq_ldets_tmp_N3,LINE_INDEX,1
2247 INDX,QP_Resolve_Incompatability_PVTRUN.resolve_incompatability.each_incomp_cur,qp_npreq_ldets_tmp_N3,PRICING_PHASE_ID,2
2248 INDX,QP_Resolve_Incompatability_PVTRUN.resolve_incompatability.each_incomp_cur,qp_npreq_ldets_tmp_N3,ASK_FOR_FLAG,3
2249
2250 INDX,QP_Resolve_Incompatability_PVTRUN.resolve_incompatability.each_incomp_cur,qp_npreq_line_attrs_tmp_N2,PRICING_STATUS_CODE,1
2251 INDX,QP_Resolve_Incompatability_PVTRUN.resolve_incompatability.each_incomp_cur,qp_npreq_line_attrs_tmp_N2,ATTRIBUTE_TYPE,2
2252 INDX,QP_Resolve_Incompatability_PVTRUN.resolve_incompatability.each_incomp_cur,qp_npreq_line_attrs_tmp_N2,CONTEXT,3
2253 INDX,QP_Resolve_Incompatability_PVTRUN.resolve_incompatability.each_incomp_cur,qp_npreq_line_attrs_tmp_N2,ATTRIBUTE,4
2254 INDX,QP_Resolve_Incompatability_PVTRUN.resolve_incompatability.each_incomp_cur,qp_npreq_line_attrs_tmp_N2,LINE_INDEX,5
2255 INDX,QP_Resolve_Incompatability_PVTRUN.resolve_incompatability.each_incomp_cur,qp_npreq_line_attrs_tmp_N2,VALUE_FROM,6
2256 */
2257
2258 --UNION
2259
2260 /*
2261 INDX,QP_Resolve_Incompatability_PVTRUN.resolve_incompatability.each_incomp_cur,qp_npreq_ldets_tmp_N3,LINE_INDEX,1
2262 INDX,QP_Resolve_Incompatability_PVTRUN.resolve_incompatability.each_incomp_cur,qp_npreq_ldets_tmp_N3,PRICING_PHASE_ID,2
2263 INDX,QP_Resolve_Incompatability_PVTRUN.resolve_incompatability.each_incomp_cur,qp_npreq_ldets_tmp_N3,ASK_FOR_FLAG,3
2264 */
2265
2266 CURSOR each_incomp_cur(p_incomp_grp_id VARCHAR2,l_manual_dis_flag VARCHAR2) IS
2267 SELECT a.CREATED_FROM_LIST_HEADER_ID,a.CREATED_FROM_LIST_LINE_ID,a.INCOMPATABILITY_GRP_CODE,a.ASK_FOR_FLAG
2268 FROM qp_npreq_ldets_tmp a
2269 WHERE EXISTS (SELECT 'X'
2270 FROM qp_npreq_line_attrs_tmp b
2271 WHERE a.LINE_INDEX = b.LINE_INDEX
2272 AND b.ATTRIBUTE_TYPE = QP_PREQ_GRP.G_QUALIFIER_TYPE
2273 AND b.PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_UNCHANGED
2274 AND b.ATTRIBUTE IN (QP_PREQ_GRP.G_QUAL_ATTRIBUTE1,
2275 QP_PREQ_GRP.G_QUAL_ATTRIBUTE2,
2276 QP_PREQ_GRP.G_QUAL_ATTRIBUTE6)
2277 AND b.CONTEXT = QP_PREQ_GRP.G_LIST_HEADER_CONTEXT
2278 AND b.VALUE_FROM = decode(b.ATTRIBUTE,
2279 QP_PREQ_GRP.G_QUAL_ATTRIBUTE1,to_char(a.CREATED_FROM_LIST_HEADER_ID),
2280 QP_PREQ_GRP.G_QUAL_ATTRIBUTE2,to_char(a.CREATED_FROM_LIST_LINE_ID),
2281 QP_PREQ_GRP.G_QUAL_ATTRIBUTE6,to_char(a.CREATED_FROM_LIST_HEADER_ID)))
2282 AND a.ASK_FOR_FLAG = QP_PREQ_GRP.G_YES
2283 AND a.INCOMPATABILITY_GRP_CODE = p_incomp_grp_id
2284 AND a.PRICING_PHASE_ID = p_pricing_phase_id
2285 AND a.LINE_INDEX = p_line_index
2286 AND a.LINE_DETAIL_TYPE_CODE <> QP_PREQ_GRP.G_CHILD_DETAIL_TYPE
2287 AND a.PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_NEW
2291 SELECT a.CREATED_FROM_LIST_HEADER_ID,a.CREATED_FROM_LIST_LINE_ID,a.INCOMPATABILITY_GRP_CODE,'N' ASK_FOR_FLAG
2288 AND ((a.AUTOMATIC_FLAG = QP_PREQ_GRP.G_YES AND l_manual_dis_flag = QP_PREQ_GRP.G_YES) OR
2289 l_manual_dis_flag = QP_PREQ_GRP.G_NO)
2290 UNION
2292 FROM qp_npreq_ldets_tmp a
2293 WHERE a.ASK_FOR_FLAG = QP_PREQ_GRP.G_NO -- Removed NVL , expect some issues
2294 AND a.INCOMPATABILITY_GRP_CODE = p_incomp_grp_id
2295 AND a.PRICING_PHASE_ID = p_pricing_phase_id
2296 AND a.LINE_INDEX = p_line_index
2297 AND a.LINE_DETAIL_TYPE_CODE <> QP_PREQ_GRP.G_CHILD_DETAIL_TYPE
2298 AND a.PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_NEW
2299 AND ((a.AUTOMATIC_FLAG = QP_PREQ_GRP.G_YES AND l_manual_dis_flag = QP_PREQ_GRP.G_YES) OR
2300 l_manual_dis_flag = QP_PREQ_GRP.G_NO)
2301 ORDER BY 4 desc;
2302
2303 v_this_is_the_list_line_id NUMBER;
2304 v_first_list_line_id NUMBER;
2305 v_count NUMBER:= 0;
2306 v_others_flag BOOLEAN:= TRUE;
2307 v_high_precedence NUMBER;
2308 v_ask_for_flag VARCHAR2(1);
2309 v_excl_flag BOOLEAN := FALSE;
2310 v_excl_list_line_id NUMBER;
2311 x_best_list_line_id NUMBER;
2312 x_ret_status VARCHAR2(30);
2313 v_return_status VARCHAR2(30) := FND_API.G_RET_STS_SUCCESS;
2314 v_routine_name CONSTANT VARCHAR2(240):='Routine:QP_Resolve_Incompatability_PVTRUN.Resolve_Incompatability';
2315 p_manual_dis_flag VARCHAR2(1) := nvl(QP_PREQ_GRP.G_MANUAL_DISCOUNT_FLAG,'Y');
2316 v_ask_for_constant CONSTANT NUMBER := -100000;
2317
2318
2319 l_precedence_tbl precedence_tbl_type;
2320
2321 v_precedence NUMBER;
2322 v_counter NUMBER := 0;
2323
2324 INVALID_INCOMPATIBILITY EXCEPTION;
2325 INVALID_BEST_PRICE EXCEPTION;
2326
2327 BEGIN
2328 l_debug := QP_PREQ_GRP.G_DEBUG_ENGINE;
2329 IF l_debug = FND_API.G_TRUE THEN
2330 QP_PREQ_GRP.engine_debug ('S1');
2331
2332 END IF;
2333
2334 -- [julin/4116856] moved deletion of un-asked-for promotions to QP_PREQ_GRP
2335
2336
2337 /* UPDATE qp_npreq_line_attrs_tmp a
2338 SET a.PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_INCOMP_LOGIC
2339 WHERE a.LIST_LINE_ID IN (SELECT b.CREATED_FROM_LIST_LINE_ID
2340 FROM qp_npreq_ldets_tmp b
2341 WHERE b.PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_INCOMP_LOGIC
2342 AND b.PRICING_PHASE_ID = p_pricing_phase_id
2343 AND b.ASK_FOR_FLAG = QP_PREQ_GRP.G_YES
2344 AND b.LINE_INDEX = p_line_index)
2345 AND a.LINE_INDEX = p_line_index; */
2346
2347
2348 FOR i IN incomp_cur(p_manual_dis_flag)
2349 LOOP
2350 IF l_debug = FND_API.G_TRUE THEN
2351 QP_PREQ_GRP.engine_debug ('#2');
2352
2353 END IF;
2354 l_precedence_tbl.delete;
2355 v_counter := 0;
2356
2357 FOR j IN each_incomp_cur(i.INCOMPATABILITY_GRP_CODE,p_manual_dis_flag)
2358 LOOP
2359 v_precedence := Precedence_For_List_Line(j.CREATED_FROM_LIST_HEADER_ID,j.CREATED_FROM_LIST_LINE_ID,
2360 i.incompatability_grp_code, p_line_index,p_pricing_phase_id);
2361 v_counter := v_counter + 1;
2362 l_precedence_tbl(v_counter).created_from_list_line_id := j.created_from_list_line_id;
2363 l_precedence_tbl(v_counter).incompatability_grp_code := j.incompatability_grp_code;
2364 l_precedence_tbl(v_counter).ask_for_flag := j.ask_for_flag;
2365 l_precedence_tbl(v_counter).original_precedence := v_precedence;
2366 IF (j.ask_for_flag = QP_PREQ_GRP.G_YES) THEN
2367 v_precedence := v_precedence + v_ask_for_constant;
2368 END IF;
2369 l_precedence_tbl(v_counter).product_precedence := v_precedence;
2370 END LOOP;
2371
2372 -- Sort the table
2373 IF (l_precedence_tbl.COUNT > 0 ) THEN
2374 --sort_on_precedence(l_precedence_tbl, l_precedence_tbl.FIRST, l_precedence_tbl.LAST);
2375 sort_on_precedence(l_precedence_tbl);
2376 END IF;
2377
2378 IF (l_precedence_tbl.COUNT > 0) THEN
2379 FOR j IN l_precedence_tbl.FIRST .. l_precedence_tbl.LAST
2380 LOOP
2381 IF l_debug = FND_API.G_TRUE THEN
2382 QP_PREQ_GRP.engine_debug ('#3');
2383
2384 END IF;
2385 -- Store the first list_line_id
2386 IF (v_count = 0) THEN
2387 v_first_list_line_id := l_precedence_tbl(j).CREATED_FROM_LIST_LINE_ID;
2388 IF l_debug = FND_API.G_TRUE THEN
2389 QP_PREQ_GRP.engine_debug('The First List Line Id : ' || v_first_list_line_id);
2390 QP_PREQ_GRP.engine_debug('Pricing Status Code: ' || i.pricing_status_code);
2391 END IF;
2392 v_high_precedence := l_precedence_tbl(j).ORIGINAL_PRECEDENCE;
2393 v_ask_for_flag := l_precedence_tbl(j).ASK_FOR_FLAG;
2394 END IF;
2395 IF l_debug = FND_API.G_TRUE THEN
2396 QP_PREQ_GRP.engine_debug ('#4');
2397
2398 END IF;
2399 -- Incomp_grp_id ='EXCL' has the highest priority(exclusivity)
2400 IF (i.INCOMPATABILITY_GRP_CODE = QP_PREQ_GRP.G_INCOMP_EXCLUSIVE) THEN
2401 IF(v_count = 0) THEN
2402 v_this_is_the_list_line_id := l_precedence_tbl(j).CREATED_FROM_LIST_LINE_ID;
2403 v_excl_list_line_id := l_precedence_tbl(j).CREATED_FROM_LIST_LINE_ID;
2404 --v_others_flag := FALSE;
2405 v_excl_flag := TRUE;
2406 ELSE -- If there are multiple list lines in EXCL incomp
2407 IF (v_others_flag = TRUE) THEN
2408 IF (v_high_precedence = l_precedence_tbl(j).ORIGINAL_PRECEDENCE) THEN
2409 IF ((v_ask_for_flag = QP_PREQ_GRP.G_YES and l_precedence_tbl(j).ASK_FOR_FLAG = QP_PREQ_GRP.G_YES) OR
2410 (v_ask_for_flag = QP_PREQ_GRP.G_NO and l_precedence_tbl(j).ASK_FOR_FLAG = QP_PREQ_GRP.G_NO)) THEN
2411 -- Best Price Evaluation
2412 IF (p_processing_flag = QP_PREQ_GRP.G_DISCOUNT_PROCESSING) THEN
2413 IF l_debug = FND_API.G_TRUE THEN
2414 QP_PREQ_GRP.engine_debug ('Best Price Evaluation');
2415 END IF;
2416 IF (p_list_price IS NOT NULL) THEN
2417 Best_Price_Evaluation(p_list_price,
2418 p_line_index,
2419 p_pricing_phase_id,
2420 i.INCOMPATABILITY_GRP_CODE,
2421 v_high_precedence, -- Added for bug#2661540
2422 p_manual_dis_flag,
2423 x_best_list_line_id,
2424 x_ret_status);
2425 IF l_debug = FND_API.G_TRUE THEN
2426 QP_PREQ_GRP.engine_debug('Successful Best Price Eval');
2427 END IF;
2428 IF x_ret_status in (QP_PREQ_GRP.G_STATUS_BEST_PRICE_EVAL_ERROR,FND_API.G_RET_STS_ERROR) THEN
2429 RAISE INVALID_BEST_PRICE;
2430 END IF;
2431 v_this_is_the_list_line_id := x_best_list_line_id;
2432 v_excl_list_line_id := x_best_list_line_id;
2433 v_others_flag := FALSE;
2434 END IF;
2435 END IF;
2436 ELSIF (v_ask_for_flag=QP_PREQ_GRP.G_NO and l_precedence_tbl(j).ASK_FOR_FLAG = QP_PREQ_GRP.G_YES) THEN
2437 v_this_is_the_list_line_id := l_precedence_tbl(j).CREATED_FROM_LIST_LINE_ID;
2438 v_excl_list_line_id := l_precedence_tbl(j).CREATED_FROM_LIST_LINE_ID;
2439 v_others_flag := FALSE;
2440 END IF;
2441 ELSE
2442 IF (v_ask_for_flag = QP_PREQ_GRP.G_NO and l_precedence_tbl(j).ASK_FOR_FLAG = QP_PREQ_GRP.G_YES) THEN
2443 v_this_is_the_list_line_id := l_precedence_tbl(j).CREATED_FROM_LIST_LINE_ID;
2444 v_excl_list_line_id := l_precedence_tbl(j).CREATED_FROM_LIST_LINE_ID;
2445 v_others_flag := FALSE;
2446 END IF;
2447 END IF;
2448 END IF;
2449 END IF;
2450 END IF;
2451 IF l_debug = FND_API.G_TRUE THEN
2452 QP_PREQ_GRP.engine_debug ('#5');
2453
2454 END IF;
2455 IF (v_others_flag = TRUE and v_excl_flag = FALSE) THEN
2456 IF l_debug = FND_API.G_TRUE THEN
2457 QP_PREQ_GRP.engine_debug('Others_Flag: TRUE');
2458 END IF;
2459 null;
2460 ELSE
2461 IF l_debug = FND_API.G_TRUE THEN
2462 QP_PREQ_GRP.engine_debug('Others_Flag: FALSE');
2463 END IF;
2464 null;
2465 END IF;
2466 IF l_debug = FND_API.G_TRUE THEN
2467 QP_PREQ_GRP.engine_debug ('#6');
2468 QP_PREQ_GRP.engine_debug('Count: ' || v_count);
2469
2470 END IF;
2471 IF (v_others_flag = TRUE) THEN
2472 -- If it is an asked for promo
2473 IF (v_count > 0) THEN -- Do not compare the first time for the first record
2474 IF l_debug = FND_API.G_TRUE THEN
2475 QP_PREQ_GRP.engine_debug ('Precedence1:' || v_high_precedence);
2476 QP_PREQ_GRP.engine_debug ('Precedence2:' || l_precedence_tbl(j).ORIGINAL_PRECEDENCE);
2477 QP_PREQ_GRP.engine_debug ('Ask_For_Flag1:' || v_ask_for_flag);
2478 QP_PREQ_GRP.engine_debug ('Ask_For_FLag2:' || l_precedence_tbl(j).ASK_FOR_FLAG);
2479 QP_PREQ_GRP.engine_debug ('Second List Line Id:' || l_precedence_tbl(j).CREATED_FROM_LIST_LINE_ID);
2480 QP_PREQ_GRP.engine_debug ('#7');
2481 END IF;
2482 IF (v_high_precedence = l_precedence_tbl(j).ORIGINAL_PRECEDENCE) THEN
2483 IF ((v_ask_for_flag = QP_PREQ_GRP.G_YES and l_precedence_tbl(j).ASK_FOR_FLAG = QP_PREQ_GRP.G_YES) OR
2484 (v_ask_for_flag = QP_PREQ_GRP.G_NO and l_precedence_tbl(j).ASK_FOR_FLAG = QP_PREQ_GRP.G_NO)) THEN
2485 -- Best Price Evaluation
2486 IF (p_processing_flag = QP_PREQ_GRP.G_DISCOUNT_PROCESSING) THEN
2487 IF l_debug = FND_API.G_TRUE THEN
2488 QP_PREQ_GRP.engine_debug ('Best Price Evaluation');
2489 END IF;
2490 IF (p_list_price IS NOT NULL) THEN
2491 Best_Price_Evaluation(p_list_price,
2492 p_line_index,
2493 p_pricing_phase_id,
2494 i.INCOMPATABILITY_GRP_CODE,
2495 v_high_precedence, -- Added for bug#2661540
2496 p_manual_dis_flag,
2497 x_best_list_line_id,
2498 x_ret_status);
2499 IF l_debug = FND_API.G_TRUE THEN
2500 QP_PREQ_GRP.engine_debug('Successful Best Price Eval1');
2501 END IF;
2502 IF x_ret_status in (QP_PREQ_GRP.G_STATUS_BEST_PRICE_EVAL_ERROR,FND_API.G_RET_STS_ERROR) THEN
2503 RAISE INVALID_BEST_PRICE;
2504 END IF;
2505 v_this_is_the_list_line_id := x_best_list_line_id;
2506 v_others_flag := FALSE;
2507 END IF;
2508 ELSE -- PRICE_LIST
2509 RAISE INVALID_INCOMPATIBILITY;
2510 END IF;
2511 ELSIF (v_ask_for_flag=QP_PREQ_GRP.G_NO and l_precedence_tbl(j).ASK_FOR_FLAG = QP_PREQ_GRP.G_YES) THEN
2512 v_this_is_the_list_line_id := l_precedence_tbl(j).CREATED_FROM_LIST_LINE_ID;
2513 v_others_flag := FALSE;
2514 END IF;
2515 ELSE
2516 IF (v_ask_for_flag = QP_PREQ_GRP.G_NO and l_precedence_tbl(j).ASK_FOR_FLAG = QP_PREQ_GRP.G_YES) THEN
2517 v_this_is_the_list_line_id := l_precedence_tbl(j).CREATED_FROM_LIST_LINE_ID;
2518 v_others_flag := FALSE;
2519 END IF;
2520 END IF;
2521 END IF;
2522 END IF;
2523 IF l_debug = FND_API.G_TRUE THEN
2524 QP_PREQ_GRP.engine_debug ('#8');
2525 END IF;
2526 v_count := v_count + 1;
2527 END LOOP;
2528 END IF; -- l_precedence_tbl.COUNT > 0
2529
2530 v_count := 0; -- Reinit to 0 for an incomp grp id
2531 v_others_flag := TRUE;
2532 IF (v_this_is_the_list_line_id IS NOT NULL) THEN
2533 v_first_list_line_id := v_this_is_the_list_line_id;
2534 IF l_debug = FND_API.G_TRUE THEN
2535 QP_PREQ_GRP.engine_debug('The List Line Id : ' || v_first_list_line_id);
2536 END IF;
2537 END IF;
2538 v_this_is_the_list_line_id := null; -- Reset
2539
2540 IF l_debug = FND_API.G_TRUE THEN
2541 QP_PREQ_GRP.engine_debug('Before Update ......');
2542 QP_PREQ_GRP.engine_debug('Incomp Grp Code:' || i.INCOMPATABILITY_GRP_CODE);
2543 QP_PREQ_GRP.engine_debug('List Line Id:' || v_first_list_line_id);
2544 QP_PREQ_GRP.engine_debug('Pricing Phase Id:' || p_pricing_phase_id);
2545 QP_PREQ_GRP.engine_debug ('#9');
2546
2547 END IF;
2548 -- Update all the other list lines to status 'I' for each incomp grp
2549 IF (v_excl_flag = FALSE) THEN
2550 Delete_Incompatible_Lines(p_pricing_phase_id,
2551 p_line_index,
2552 i.INCOMPATABILITY_GRP_CODE,
2553 v_first_list_line_id,
2554 v_excl_flag,
2555 p_manual_dis_flag,
2556 x_ret_status);
2557 END IF;
2558 IF l_debug = FND_API.G_TRUE THEN
2559 QP_PREQ_GRP.engine_debug ('#10');
2560 END IF;
2561 END LOOP;
2562 IF (v_excl_flag = TRUE) THEN
2563 Delete_Incompatible_Lines(p_pricing_phase_id,
2564 p_line_index,
2565 NULL, -- incomp_grp_id
2566 v_excl_list_line_id,
2567 v_excl_flag,
2568 p_manual_dis_flag,
2569 x_ret_status);
2570 END IF;
2571 x_return_status := v_return_status; -- SUCCESS
2572 EXCEPTION
2573 WHEN INVALID_INCOMPATIBILITY THEN
2574 IF l_debug = FND_API.G_TRUE THEN
2575 QP_PREQ_GRP.engine_debug(v_routine_name || ' Multiple Price Lists cannot have same precedence
2576 and cannot be asked for');
2577 END IF;
2578 x_return_status_txt := v_routine_name || ' Multiple Price Lists cannot have same precedence
2579 and cannot be asked for';
2580 v_return_status := QP_PREQ_GRP.G_STATUS_INVALID_INCOMP;
2581 x_return_status := v_return_status;
2582 WHEN INVALID_BEST_PRICE THEN
2583 IF l_debug = FND_API.G_TRUE THEN
2584 QP_PREQ_GRP.engine_debug(v_routine_name || 'Best Price Evaluation Has Error');
2585 END IF;
2586 x_return_status_txt := v_routine_name || 'Best Price Evaluation Has Error';
2587 v_return_status := QP_PREQ_GRP.G_STATUS_BEST_PRICE_EVAL_ERROR;
2588 x_return_status := v_return_status;
2589 WHEN OTHERS THEN
2590 IF l_debug = FND_API.G_TRUE THEN
2591 QP_PREQ_GRP.engine_debug(v_routine_name || ' ' || SQLERRM);
2592 END IF;
2593 x_return_status_txt := v_routine_name || ' ' || SQLERRM;
2594 v_return_status := FND_API.G_RET_STS_ERROR;
2595 x_return_status := v_return_status;
2596 END Resolve_Incompatability;
2597
2598 END QP_Resolve_Incompatability_PVT ;