1 PACKAGE BODY QP_Resolve_Incompatability_PVT AS
2 /* $Header: QPXVINCB.pls 120.14.12010000.4 2008/11/07 06:23:13 hmohamme 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 IF l_debug = FND_API.G_TRUE THEN
624 QP_PREQ_GRP.engine_debug('Constract start/end dates '||
625 l_date_passed||
626 'passed in ==> qp_time_uom_conversion = '||
627 l_qp_time_uom_conversion);
628 END IF;
629
630 IF l_debug = FND_API.G_TRUE THEN
631 QP_PREQ_GRP.engine_debug( 'Determine_Pricing_UOM1');
632 QP_PREQ_GRP.engine_debug( I.INCOMPATABILITY_GRP_CODE);
633 QP_PREQ_GRP.engine_debug( 'Line Index:'|| i.line_index);
634
635 END IF;
636 Precedence_For_Price_List_Line(i.line_index,i.line_uom_code,NULL,l_precedence_tbl,l_status,l_status_text);
637
638 IF l_debug = FND_API.G_TRUE THEN
639 QP_PREQ_GRP.engine_debug( ' Debug Point #0');
640
641 QP_PREQ_GRP.engine_debug('Count : ' || l_precedence_tbl.count);
642
643 END IF;
644 -- Sort the table(not needed as it would have only the price list lines with least precedence)
645 /* IF (l_precedence_tbl.COUNT > 0 ) THEN
646 --sort_on_precedence(l_precedence_tbl, l_precedence_tbl.FIRST, l_precedence_tbl.LAST);
647 sort_on_precedence(l_precedence_tbl);
648 END IF; */
649
650 IF (l_precedence_tbl.COUNT > 0 ) THEN
651 v_total_count := l_precedence_tbl.COUNT;
652 v_count := 0;
653 v_list_line_count1 := NULL;
654 IF l_debug = FND_API.G_TRUE THEN
655 QP_PREQ_GRP.engine_debug( 'Precedence Table Count Line : '|| i.line_index ||' Cnt:'|| l_precedence_tbl.count);
656 END IF;
657 FOR j IN l_precedence_tbl.FIRST .. l_precedence_tbl.LAST
658 LOOP
659 IF l_debug = FND_API.G_TRUE THEN
660 QP_PREQ_GRP.engine_debug( 'Determine_Pricing_UOM2');
661 END IF;
662 IF (v_count = 0) THEN
663 v_list_line_id := l_precedence_tbl(j).created_from_list_line_id;
664 v_list_precedence := l_precedence_tbl(j).product_precedence;
665 END IF;
666
667 IF (v_count > 0 ) THEN
668
669 IF l_debug = FND_API.G_TRUE THEN
670 QP_PREQ_GRP.engine_debug( 'Precedence 1 : '|| v_list_precedence);
671 QP_PREQ_GRP.engine_debug( 'Precedence 2 : '|| l_precedence_tbl(j).product_precedence);
672
673 END IF;
674 -- If precedence matches match pricing attributes count
675 IF (v_list_precedence = l_precedence_tbl(j).product_precedence) THEN
676
677 --Reset
678 v_list_line_count2 := NULL;
679
680 IF (v_list_line_count1 IS NULL) THEN
681 OPEN get_attribute_count_cur(i.line_index,v_list_line_id); -- For First Line
682 FETCH get_attribute_count_cur INTO v_list_line_count1;
683 CLOSE get_attribute_count_cur;
684 END IF;
685
686 IF l_debug = FND_API.G_TRUE THEN
687 QP_PREQ_GRP.engine_debug( 'Precedence Matched . Attribute Count1 : ' || v_list_line_id || ' ' || v_list_line_count1);
688
689 END IF;
690 OPEN get_attribute_count_cur(i.line_index,l_precedence_tbl(j).created_from_list_line_id); -- For Second Line
691 FETCH get_attribute_count_cur INTO v_list_line_count2;
692 CLOSE get_attribute_count_cur;
693
694 IF l_debug = FND_API.G_TRUE THEN
695 QP_PREQ_GRP.engine_debug( 'Precedence Matched . Attribute Count2 : ' || l_precedence_tbl(j).created_from_list_line_id || ' ' || v_list_line_count2);
696
697 END IF;
698 -- Update the status to duplicate list lines , only after comparing the attribute counts for all list lines
699 -- That is why the extra condition v_total_cout = v_count+1
700 IF (nvl(v_list_line_count1,0) = nvl(v_list_line_count2,0) and v_total_count = v_count + 1) THEN
701 v_dup_list_line_id := l_precedence_tbl(j).created_from_list_line_id;
702
703 --begin fix bug 2746019
704 --l_status_text := v_list_line_id || ',' || v_dup_list_line_id; --fix bug 2746019
705 select name into v_price_list from qp_list_headers_vl where
706 list_header_id = (select list_header_id from qp_list_lines
707 where list_line_id = v_list_line_id);
708
709 select name into v_dup_price_list from qp_list_headers_vl where
710 list_header_id = (select list_header_id from qp_list_lines
711 where list_line_id = v_dup_list_line_id);
712
713 FND_MESSAGE.SET_NAME('QP','QP_DUPLICATE_PRICE_LIST');
714 FND_MESSAGE.SET_TOKEN('LIST_LINE_ID', v_price_list);
715 FND_MESSAGE.SET_TOKEN('DUP_LIST_LINE_ID', v_dup_price_list);
716 l_status_text:= FND_MESSAGE.GET;
717 -- end fix bug 2746019
718
719 Update_Invalid_List_Lines(i.INCOMPATABILITY_GRP_CODE,i.line_index,p_pricing_phase_id,
720 QP_PREQ_GRP.G_STATUS_DUP_PRICE_LIST,l_status_text, v_return_status,
721 v_return_status_text);
722 GOTO NEXT_LINE;
723
724 --RAISE DUPLICATE_PRICE_LIST;
725 ELSE
726 IF (nvl(v_list_line_count1,0) < nvl(v_list_line_count2,0)) THEN
727 v_list_line_id := l_precedence_tbl(j).created_from_list_line_id; -- Second Line should be given
728 v_list_line_count1 := v_list_line_count2;
729 END IF;
730 END IF;
731 END IF;
732 END IF;
733 v_count := v_count + 1;
734 END LOOP;
735 END IF;
736
737 IF l_debug = FND_API.G_TRUE THEN
738 QP_PREQ_GRP.engine_debug('List Line Id:' || v_list_line_id);
739
740 END IF;
741 IF (v_list_line_id IS NOT NULL) THEN -- Successful in finding pll in order uom
742 -- Update all the other list lines to status 'U'
743 /*
744 INDX,QP_Resolve_Incompatability_PVTRUN.determine_pricing_uom_and_qty.upd1,qp_npreq_ldets_tmp_N2,PRICING_PHASE_ID,1
745 INDX,QP_Resolve_Incompatability_PVTRUN.determine_pricing_uom_and_qty.upd1,qp_npreq_ldets_tmp_N2,PRICING_STATUS_CODE,2
746 INDX,QP_Resolve_Incompatability_PVTRUN.determine_pricing_uom_and_qty.upd1,qp_npreq_lines_tmp_N2,LINE_INDEX,3
747 */
748 UPDATE qp_npreq_ldets_tmp -- upd1
749 SET PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_UOM_FAILURE
750 WHERE INCOMPATABILITY_GRP_CODE = i.INCOMPATABILITY_GRP_CODE
751 AND LINE_INDEX = i.line_index
752 AND PRICING_PHASE_ID = p_pricing_phase_id
753 AND CREATED_FROM_LIST_LINE_ID <> v_list_line_id
754 AND PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_NEW;
755
756 /* UPDATE qp_npreq_line_attrs_tmp a
757 SET a.PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_UOM_FAILURE
758 WHERE a.LIST_LINE_ID
759 IN (SELECT b.CREATED_FROM_LIST_LINE_ID
760 FROM qp_npreq_ldets_tmp b
761 WHERE b.PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_UOM_FAILURE
762 AND b.PRICING_PHASE_ID = p_pricing_phase_id
763 AND b.INCOMPATABILITY_GRP_CODE = i.INCOMPATABILITY_GRP_CODE
764 AND b.CREATED_FROM_LIST_LINE_ID <> v_list_line_id
765 AND b.LINE_INDEX = i.line_index)
766 AND a.LINE_INDEX = i.line_index; */
767
768 -- begin shu, fix bug 2453250, no price_list_header_id after big search
769 /* Commented for bug#2882115
770 UPDATE qp_npreq_lines_tmp a
771 SET a.price_list_header_id = (SELECT list_header_id from qp_list_lines where list_line_id = v_list_line_id )
772 WHERE ( a.price_list_header_id < 0 OR a.price_list_header_id IS NULL)
773 AND a.line_index = i.line_index;
774 */
775 -- end shu fix bug 2453250
776
777 -- begin shulin bug 1829731
778 -- use OKS API to calculate pricing_qty based on order_uom if profile set to 'ORACLE_CONTRACTS'
779 IF l_debug = FND_API.G_TRUE THEN
780 QP_PREQ_GRP.engine_debug('no uom conversion ...');
781 END IF;
782 IF l_qp_time_uom_conversion = 'ORACLE_CONTRACTS' THEN
783
784 IF l_debug = FND_API.G_TRUE THEN
785 QP_PREQ_GRP.engine_debug( 'contract_start_date :' || i.contract_start_date);
786 QP_PREQ_GRP.engine_debug( 'contract_end_date :' || i.contract_end_date);
787 QP_PREQ_GRP.engine_debug( 'line_uom_code/order uom :' || i.line_uom_code); -- order_uom
788 END IF;
789
790 --IF i.contract_start_date IS NOT NULL AND i.contract_end_date IS NOT NULL THEN
791 -- OKS_TIME_MEASURES_PUB replaced with OKS_OMINT_PUB in R12
792 /* [julin/4285975/4662388] removing dynamic SQL, unnecessary and causes error
793 * when env language has ',' delimiter
794 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';
795 IF l_debug = FND_API.G_TRUE THEN
796 QP_PREQ_GRP.engine_debug('l_sql_stmt:' || l_sql_stmt);
797 END IF; -- end debug
798 execute immediate l_sql_stmt INTO l_oks_qty;
799 */
800 --END IF;
801 --bug 4900095
802 IF l_duration_passed = 'N' THEN --call OKS API for OKS calls where uom_quantity is passed as null
803 -- 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);
804 --bug 4900095
805 l_oks_qty := nvl(round(OKS_OMINT_PUB.get_target_duration( p_start_date => i.contract_start_date,
806 p_end_date => i.contract_end_date,
807 p_source_uom => i.line_uom_code,
808 p_source_duration => i.uom_quantity,
809 p_target_uom => i.line_uom_code,/*Default Month*/
810 p_org_id => QP_PREQ_GRP.G_CURRENT_USER_OP_UNIT), l_max_decimal_digits), -999999);
811 ELSE
812 l_oks_qty := null;
813 END IF;--l_duration_passed = 'N'
814
815 IF l_debug = FND_API.G_TRUE THEN
816 QP_PREQ_GRP.engine_debug('l_oks_qty:' || l_oks_qty);
817 END IF; -- end debug
818 -- when contract_start_date or contract_end_date is null, or uom is 'MO' instead of 'MTH', l_oks_qty = 0
819 -- when uom is not time_related or invalid to oks API, i.e. 'EA', 'MI', l_oks_qty = NULL
820
821 IF (l_oks_qty IS NOT NULL AND l_oks_qty <> -999999)
822 --bug 4900095
823 and l_duration_passed = 'N' THEN -- oks succeed
824 v_pricing_qty := round(l_oks_qty , l_max_decimal_digits);
825 l_order_qty := v_pricing_qty; -- shu_latest, this is to correct if user enter order_qty not matching the start_date end_date
826 l_uom_quantity :=1;
827 IF l_debug = FND_API.G_TRUE THEN
828 QP_PREQ_GRP.engine_debug('Pric_Qty OKS_API Conv based on Order_UOM :' || v_pricing_qty);
829 END IF; --end debug
830
831 ELSE -- oks fail, make v_pricing_qty as line_quantity just like STANDARD conversion
832 v_pricing_qty := i.line_quantity; -- STANDARD
833 --l_uom_quantity :=1;
834 l_uom_quantity := nvl(i.uom_quantity, 1); -- to back support OM, SL BUG FOUND
835 -- no need to update l_order_qty, since it has been initialized to i.line_quantity
836 IF l_debug = FND_API.G_TRUE THEN
837 QP_PREQ_GRP.engine_debug('pric_qty same as order_qty :' || v_pricing_qty); --shu 12/26/2001
838 QP_PREQ_GRP.engine_debug('uom_qty passed :' || l_uom_quantity); --shu 12/26/2001
839 END IF; -- end debug
840
841 END IF; -- END IF (l_oks_qty IS NOT NULL AND l_oks_qty <> 0)
842 ELSE -- l_qp_time_uom_conversion = 'STANDARD' THEN
843 v_pricing_qty := i.line_quantity; -- STANDARD
844 -- no need to update l_order_qty, since it has been initialized to i.line_quantity
845 l_uom_quantity := nvl(i.uom_quantity, 1); -- to back support OM, for case user order 2 of 6 MTH service
846 IF l_debug = FND_API.G_TRUE THEN
847 QP_PREQ_GRP.engine_debug('pric_qty same as order_qty :' || v_pricing_qty);
848 END IF;
849 END IF;
850 -- end shulin bug 1829731
851
852 -- The followings are used to bulk update at the end of the procedure for no uom conversion cases
853 l_line_quantity_tbl(m) := l_order_qty; -- shu_latest
854 l_line_index_tbl(m) := i.line_index;
855 l_line_uom_code_tbl(m) := i.line_uom_code;
856 l_priced_quantity_tbl(m) := v_pricing_qty; --shu_latest
857 l_uom_quantity_tbl(m) := l_uom_quantity; --shu_latest
858 m := m+1;
859
860 /* no need if bulk update later
861 UPDATE qp_npreq_lines_tmp
862 SET PRICED_UOM_CODE = i.line_uom_code,
863 PRICED_QUANTITY = v_pricing_qty, -- shulin bug 1829731
864 LINE_UOM_CODE = i.line_uom_code, -- order_uom
865 LINE_QUANTITY = l_order_qty, -- shu_latest
866 UOM_QUANTITY =1
867 WHERE LINE_INDEX = i.line_index;
868 */
869
870 x_list_line_id := v_list_line_id;
871 ELSE -- uom conversion cases
872
873 Precedence_For_Price_List_Line(i.line_index,NULL,'Y',l_precedence_tbl,l_status,l_status_text);
874
875 -- Sort the table(not needed as it would have only the price list lines with least precedence)
876 /* IF (l_precedence_tbl.COUNT > 0) THEN
877 --sort_on_precedence(l_precedence_tbl, l_precedence_tbl.FIRST, l_precedence_tbl.LAST);
878 sort_on_precedence(l_precedence_tbl);
879 END IF; */
880
881 /* IF (l_precedence_tbl.COUNT > 0) THEN
882 FOR j IN l_precedence_tbl.FIRST .. l_precedence_tbl.LAST
883 LOOP
884 IF l_debug = FND_API.G_TRUE THEN
885 QP_PREQ_GRP.engine_debug('List Line Id : ' || l_precedence_tbl(j).created_from_list_line_id);
886 QP_PREQ_GRP.engine_debug('Precedence : ' || l_precedence_tbl(j).product_precedence);
887 QP_PREQ_GRP.engine_debug('Inventory Item Id: ' || l_precedence_tbl(j).inventory_item_id);
888 QP_PREQ_GRP.engine_debug('Product Uom : ' || l_precedence_tbl(j).product_uom_code);
889 END IF;
890 END LOOP;
891 END IF; */
892
893 IF (l_precedence_tbl.COUNT > 0) THEN
894 v_total_count := l_precedence_tbl.COUNT;
895 v_count := 0;
896 v_list_line_count1 := NULL;
897 FOR j IN l_precedence_tbl.FIRST .. l_precedence_tbl.LAST
898 LOOP
899 IF l_debug = FND_API.G_TRUE THEN
900 QP_PREQ_GRP.engine_debug('pri flag');
901 END IF;
902 IF (v_count = 0) THEN
903 v_list_line_id := l_precedence_tbl(j).created_from_list_line_id;
904 v_list_precedence := l_precedence_tbl(j).product_precedence;
905 v_primary_uom_code := l_precedence_tbl(j).product_uom_code;
906 v_inventory_item_id := to_number(l_precedence_tbl(j).inventory_item_id);
907 END IF;
908
909 IF (v_count > 0 ) THEN
910 IF (v_list_precedence = l_precedence_tbl(j).product_precedence) THEN
911
912 --Reset
913 v_list_line_count2 := NULL;
914
915 IF (v_list_line_count1 IS NULL) THEN
916 OPEN get_attribute_count_cur(i.line_index,v_list_line_id); -- For First Line
917 FETCH get_attribute_count_cur INTO v_list_line_count1;
918 CLOSE get_attribute_count_cur;
919 END IF;
920
921 IF l_debug = FND_API.G_TRUE THEN
922 QP_PREQ_GRP.engine_debug( 'Precedence Matched . Attribute Count Pri1 : ' || v_list_line_id || ' ' || v_list_line_count1);
923
924 END IF;
925 OPEN get_attribute_count_cur(i.line_index,l_precedence_tbl(j).created_from_list_line_id); -- For Second Line
926 FETCH get_attribute_count_cur INTO v_list_line_count2;
927 CLOSE get_attribute_count_cur;
928
929 IF l_debug = FND_API.G_TRUE THEN
930 QP_PREQ_GRP.engine_debug( 'Precedence Matched . Attribute Count Pri2 : ' || l_precedence_tbl(j).created_from_list_line_id || ' ' || v_list_line_count2);
931
932 END IF;
933 IF (nvl(v_list_line_count1,0) = nvl(v_list_line_count2,0) and v_total_count = v_count + 1) THEN
934
935 v_dup_list_line_id := l_precedence_tbl(j).created_from_list_line_id;
936
937 --begin fix bug 2746019
938 --l_status_text := v_list_line_id || ',' || v_dup_list_line_id; --fix bug 2746019
939 select name into v_price_list from qp_list_headers_vl where
940 list_header_id = (select list_header_id from qp_list_lines
941 where list_line_id = v_list_line_id);
942
943 select name into v_dup_price_list from qp_list_headers_vl where
944 list_header_id = (select list_header_id from qp_list_lines
945 where list_line_id = v_dup_list_line_id);
946
947 FND_MESSAGE.SET_NAME('QP','QP_DUPLICATE_PRICE_LIST');
948 FND_MESSAGE.SET_TOKEN('LIST_LINE_ID', v_price_list);
949 FND_MESSAGE.SET_TOKEN('DUP_LIST_LINE_ID', v_dup_price_list);
950 l_status_text:= FND_MESSAGE.GET;
951 -- end fix bug 2746019
952
953 Update_Invalid_List_Lines(i.INCOMPATABILITY_GRP_CODE,i.line_index,p_pricing_phase_id,
954 QP_PREQ_GRP.G_STATUS_DUP_PRICE_LIST,l_status_text, v_return_status,
955 v_return_status_text);
956 GOTO NEXT_LINE;
957 --RAISE DUPLICATE_PRICE_LIST;
958 ELSE
959 IF (nvl(v_list_line_count1,0) < nvl(v_list_line_count2,0)) THEN
960 v_list_line_id := l_precedence_tbl(j).created_from_list_line_id; -- Second Line should be given
961 v_list_line_count1 := v_list_line_count2;
962 END IF;
963 END IF;
964 END IF;
965 END IF;
966 v_count := v_count + 1;
967 END LOOP;
968 END IF; -- v_list_line_id IS NOT NULL
969
970 IF l_debug = FND_API.G_TRUE THEN
971 QP_PREQ_GRP.engine_debug('Pri Flag List Line Id:' || v_list_line_id);
972
973 END IF;
974 IF (v_list_line_id IS NOT NULL) THEN
975 /*
976 INDX,QP_Resolve_Incompatability_PVTRUN.determine_pricing_uom_and_qty.upd2,qp_npreq_ldets_tmp_N2,PRICING_PHASE_ID,1
977 INDX,QP_Resolve_Incompatability_PVTRUN.determine_pricing_uom_and_qty.upd2,qp_npreq_ldets_tmp_N2,PRICING_STATUS_CODE,2
978 INDX,QP_Resolve_Incompatability_PVTRUN.determine_pricing_uom_and_qty.upd2,qp_npreq_lines_tmp_N2,LINE_INDEX,3
979 */
980 -- Update all the other list lines to status 'P'
981 UPDATE qp_npreq_ldets_tmp -- upd2
982 SET PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_PRIMARY_UOM_FLAG
983 WHERE INCOMPATABILITY_GRP_CODE = i.INCOMPATABILITY_GRP_CODE
984 AND LINE_INDEX = i.line_index
985 AND PRICING_PHASE_ID = p_pricing_phase_id
986 AND CREATED_FROM_LIST_LINE_ID <> v_list_line_id
987 AND PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_NEW;
988
989
990 /* UPDATE qp_npreq_line_attrs_tmp a
991 SET a.PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_PRIMARY_UOM_FLAG
992 WHERE a.LIST_LINE_ID IN (SELECT b.CREATED_FROM_LIST_LINE_ID
993 FROM qp_npreq_ldets_tmp b
994 WHERE b.PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_PRIMARY_UOM_FLAG
995 AND b.CREATED_FROM_LIST_LINE_ID <> v_list_line_id
996 AND b.LINE_INDEX = i.line_index)
997 AND a.LINE_INDEX = i.line_index; */
998
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
1002 IN (SELECT b.CREATED_FROM_LIST_LINE_ID
1003 FROM qp_npreq_ldets_tmp b
1004 WHERE b.PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_PRIMARY_UOM_FLAG
1005 AND b.PRICING_PHASE_ID = p_pricing_phase_id
1006 AND b.INCOMPATABILITY_GRP_CODE = i.INCOMPATABILITY_GRP_CODE
1007 AND b.CREATED_FROM_LIST_LINE_ID <> v_list_line_id
1008 AND b.LINE_INDEX = i.line_index)
1009 AND a.LINE_INDEX = i.line_index; */
1010
1011 -- begin shu, fix bug 2453250, no price_list_header_id after big search
1012 /* Commented for bug#2882115
1013 UPDATE qp_npreq_lines_tmp a
1014 SET a.price_list_header_id = (SELECT list_header_id from qp_list_lines where list_line_id = v_list_line_id )
1015 WHERE ( a.price_list_header_id < 0 OR a.price_list_header_id IS NULL)
1016 AND a.line_index = i.line_index;
1017 */
1018 -- end shu fix bug 2453250
1019
1020 IF l_debug = FND_API.G_TRUE THEN
1021 QP_PREQ_GRP.engine_debug('Data Updated');
1022 QP_PREQ_GRP.engine_debug('Order Uom:' || i.line_uom_code);
1023 QP_PREQ_GRP.engine_debug('Prim UOM:' || v_primary_uom_code);
1024 QP_PREQ_GRP.engine_debug('Inventory Id:' || v_inventory_item_id);
1025 QP_PREQ_GRP.engine_debug('v_pricing_qty:' || v_pricing_qty);
1026 END IF;
1027
1028 -- begin Bug 1829731 fix, shulin
1029 IF l_debug = FND_API.G_TRUE THEN
1030 QP_PREQ_GRP.engine_debug('uom conversion...');
1031 END IF;
1032 l_uom_quantity := i.uom_quantity; --shu_latest, to back support OM, either from usr input or null
1033 -- shulin, do OKS conversion if profile set to 'ORCALE_CONTRACTS'
1034 IF (l_qp_time_uom_conversion = 'ORACLE_CONTRACTS') THEN -- do oks conversion
1035
1036 IF l_debug = FND_API.G_TRUE THEN
1037 QP_PREQ_GRP.engine_debug( 'contract_start_date :' || i.contract_start_date);
1038 QP_PREQ_GRP.engine_debug( 'contract_end_date :' || i.contract_end_date);
1039 QP_PREQ_GRP.engine_debug( 'primary_uom_code :' || v_primary_uom_code);
1040 QP_PREQ_GRP.engine_debug('v_pricing_qty:' || v_pricing_qty);
1041 END IF;
1042 -- when contract_start_date or contract_end_date is null, or uom is 'MO' instead of 'MTH', l_oks_qty = 0
1043 -- when uom is not time_related or invalid to oks API, i.e. 'EA', 'MI', l_oks_qty = NULL
1044
1045 --IF i.contract_start_date IS NOT NULL AND i.contract_end_date IS NOT NULL THEN
1046 -- OKS_TIME_MEASURES_PUB replaced with OKS_OMINT_PUB in R12
1047 /* [julin/4285975/4662388] removing dynamic SQL, unnecessary and causes error
1048 * when env language has ',' delimiter
1049 l_sql_stmt := 'select ' || ROUND (OKS_OMINT_PUB.get_quantity (i.contract_start_date,
1050 i.contract_end_date, v_primary_uom_code, QP_PREQ_GRP.G_CURRENT_USER_OP_UNIT), l_max_decimal_digits) ||' from dual';
1051 execute immediate l_sql_stmt INTO l_oks_qty; -- shulin
1052 */
1053 --END IF;
1054 -- 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);
1055 --bug 4900095
1056 l_oks_qty := nvl(round(OKS_OMINT_PUB.get_target_duration( p_start_date => i.contract_start_date,
1057 p_end_date => i.contract_end_date,
1058 p_source_uom => i.line_uom_code,
1059 p_source_duration => i.uom_quantity,
1060 p_target_uom => v_primary_uom_code,/*Default Month*/
1061 p_org_id => QP_PREQ_GRP.G_CURRENT_USER_OP_UNIT), l_max_decimal_digits), -999999);
1062
1063 IF l_debug = FND_API.G_TRUE THEN
1064 QP_PREQ_GRP.engine_debug('l_oks_qty1:' || l_oks_qty);
1065 END IF; -- end debug
1066
1067 IF (l_oks_qty IS NOT NULL OR l_oks_qty <> 0)
1068 --bug 4900095
1069 and l_duration_passed = 'N' THEN -- oks succeed
1070
1071 -- order_qty is based on odr_uom
1072 /* [julin/4285975/4662388] removing dynamic SQL, unnecessary and causes error
1073 * when env language has ',' delimiter
1074 l_sql_stmt := 'select ' || ROUND (OKS_OMINT_PUB.get_quantity (i.contract_start_date,
1075 i.contract_end_date, i.line_uom_code, QP_PREQ_GRP.G_CURRENT_USER_OP_UNIT), l_max_decimal_digits) ||' from dual';
1076 execute immediate l_sql_stmt INTO l_order_qty; -- shu_latest
1077 */
1078 -- 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);
1079 --bug 4900095
1080 l_order_qty := nvl(round(OKS_OMINT_PUB.get_target_duration( p_start_date => i.contract_start_date,
1081 p_end_date => i.contract_end_date,
1082 p_source_uom => i.line_uom_code,
1083 p_source_duration => i.uom_quantity,
1084 p_target_uom => i.line_uom_code,/*Default Month*/
1085 p_org_id => QP_PREQ_GRP.G_CURRENT_USER_OP_UNIT), l_max_decimal_digits), -999999);
1086 IF l_debug = FND_API.G_TRUE THEN
1087 QP_PREQ_GRP.engine_debug('l_oks_qty2:' || l_oks_qty);
1088 END IF; -- end debug
1089
1090 v_pricing_qty := round (l_oks_qty , l_max_decimal_digits);
1091
1092 l_uom_quantity := 1; --shulin
1093 IF l_debug = FND_API.G_TRUE THEN
1094 QP_PREQ_GRP.engine_debug('OKS_API conversion...');
1095 QP_PREQ_GRP.engine_debug('pricing_qty:' || v_pricing_qty);
1096 QP_PREQ_GRP.engine_debug('pricing_uom:' || v_primary_uom_code);
1097 QP_PREQ_GRP.engine_debug('order_qty:' || l_order_qty);
1098 QP_PREQ_GRP.engine_debug('order_uom:' || l_order_uom_code);
1099 QP_PREQ_GRP.engine_debug('uom_quantity:' || l_uom_quantity);
1100 END IF;
1101
1102 ELSIF (l_oks_qty <> -999999 AND l_oks_qty <> 0) -- OM/ASO/IBE call for service line duration/uom_quantity is not null
1103 --bug 4900095
1104 and l_duration_passed = 'Y' THEN
1105 l_uom_quantity := l_oks_qty;
1106 v_pricing_qty := ROUND( i.line_quantity * l_oks_qty, l_max_decimal_digits) ; -- nvl is case we only have line_quantity
1107 --changed for service pricing
1108 --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
1109 --l_uom_quantity := ROUND( i.uom_quantity * v_uom_rate, l_max_decimal_digits); -- do not nvl uom_quantity
1110 l_uom_quantity :=1; -- reset to 1, so the unit price by pricing uom does not change
1111 l_order_qty := i.line_quantity;
1112 IF l_debug = FND_API.G_TRUE THEN
1113 QP_PREQ_GRP.engine_debug('OKS_API conversion for OM...');
1114 QP_PREQ_GRP.engine_debug('pricing_qty:' || v_pricing_qty);
1115 QP_PREQ_GRP.engine_debug('pricing_uom:' || v_primary_uom_code);
1116 QP_PREQ_GRP.engine_debug('order_qty:' || l_order_qty);
1117 QP_PREQ_GRP.engine_debug('order_uom:' || l_order_uom_code);
1118 QP_PREQ_GRP.engine_debug('uom_quantity:' || l_uom_quantity);
1119 END IF;
1120 END IF; --oks succeed
1121 END IF; -- end profile is ORACLE_CONTRACTS
1122
1123 -- not 'ORACLE_CONTACTS' or OKS conversion failed, use standard inventory uom conversion
1124 IF (l_qp_time_uom_conversion = 'STANDARD') OR (l_oks_qty = -999999 OR l_oks_qty = 0) THEN
1125
1126 IF (l_qp_time_uom_conversion = 'ORACLE_CONTRACTS') then
1127 IF l_debug = FND_API.G_TRUE THEN
1128 QP_PREQ_GRP.engine_debug('oks conversion had failed...');
1129 END IF;
1130 END IF; -- for debug, to distinglish if it is oks failed case or if profile set to standard case
1131
1132 -- Get the conversion rate based on prclist's primary_uom
1133 Inv_convert.inv_um_conversion(i.line_uom_code,
1134 v_primary_uom_code,
1135 v_inventory_item_id,
1136 v_uom_rate);
1137 IF (v_uom_rate = -99999) THEN
1138 l_status_text := 'invalid conversion rate from ' || l_order_uom_code || ' to ' || v_primary_uom_code;
1139 Update_Invalid_List_Lines(i.INCOMPATABILITY_GRP_CODE,i.line_index,p_pricing_phase_id,
1140 QP_PREQ_GRP.G_STATUS_INVALID_UOM_CONV,l_status_text, v_return_status,
1141 v_return_status_text);
1142 -- [julin/4330147/4335995]
1143 l_uom_conv_success := 'N';
1144 --RAISE INVALID_UOM_CONVERSION;
1145 ELSE
1146 IF (i.PROCESSING_ORDER <> 2 or i.PROCESSING_ORDER IS NULL ) THEN -- It is not a service line
1147
1148 v_pricing_qty := ROUND( i.line_quantity * v_uom_rate, l_max_decimal_digits);
1149 l_uom_quantity := 1; --shu_latest
1150 l_order_qty := i.line_quantity;
1151 IF l_debug = FND_API.G_TRUE THEN
1152 QP_PREQ_GRP.engine_debug('Standard uom conversion, non-service line...');
1153 QP_PREQ_GRP.engine_debug('pricing_qty:' || v_pricing_qty);
1154 QP_PREQ_GRP.engine_debug('pricing_uom:' || v_primary_uom_code);
1155 QP_PREQ_GRP.engine_debug('order_qty:' || l_order_qty);
1156 QP_PREQ_GRP.engine_debug('order_uom:' || l_order_uom_code);
1157 QP_PREQ_GRP.engine_debug('uom_quantity:' || l_uom_quantity);
1158 END IF;
1159
1160 ELSE -- service line, l_uom_quantity matters
1161
1162 IF (l_qp_time_uom_conversion = 'ORACLE_CONTRACTS') THEN -- from oks failed case
1163 v_pricing_qty := ROUND( i.line_quantity * v_uom_rate, l_max_decimal_digits);
1164 l_uom_quantity := 1;
1165 l_order_qty := i.line_quantity;
1166 IF l_debug = FND_API.G_TRUE THEN
1167 QP_PREQ_GRP.engine_debug('Standard uom conversion (oks failed), service line...');
1168 QP_PREQ_GRP.engine_debug('pricing_qty:' || v_pricing_qty);
1169 QP_PREQ_GRP.engine_debug('pricing_uom:' || v_primary_uom_code);
1170 QP_PREQ_GRP.engine_debug('order_qty:' || l_order_qty);
1171 QP_PREQ_GRP.engine_debug('order_uom:' || l_order_uom_code);
1172 QP_PREQ_GRP.engine_debug('uom_quantity:' || l_uom_quantity);
1173 END IF;
1174
1175 ELSE -- from profile being standard case, l_uom_quantity matters for OM
1176 -- assuming OM pass l_uom_quantity is converted to order uom like the following
1177 -- 1 of 2 YR services, order_uom=YR, l_uom_quantity = 2 (YR)
1178 IF l_debug = FND_API.G_TRUE THEN
1179 QP_PREQ_GRP.engine_debug('uom_quantity from calling application:' || i.uom_quantity);
1180 END IF;
1181 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
1182 --l_uom_quantity := ROUND( i.uom_quantity * v_uom_rate, l_max_decimal_digits); -- do not nvl uom_quantity
1183 l_uom_quantity :=1; -- reset to 1, so the unit price by pricing uom does not change
1184 l_order_qty := i.line_quantity;
1185
1186 IF l_debug = FND_API.G_TRUE THEN
1187 QP_PREQ_GRP.engine_debug('Standard uom conversion, service line...');
1188 QP_PREQ_GRP.engine_debug('pricing_qty:' || v_pricing_qty);
1189 QP_PREQ_GRP.engine_debug('pricing_uom:' || v_primary_uom_code);
1190 QP_PREQ_GRP.engine_debug('order_qty:' || l_order_qty);
1191 QP_PREQ_GRP.engine_debug('order_uom:' || l_order_uom_code);
1192 END IF;
1193
1194 END IF;
1195
1196 END IF; -- end if service or non-service line
1197
1198 END IF; -- end if v_uom_rate
1199
1200 END IF; -- end profile is 'STANDARD'
1201
1202
1203 /*
1204 INDX,QP_Resolve_Incompatability_PVTRUN.determine_pricing_uom_and_qty.upd1,qp_npreq_lines_tmp_N1,LINE_INDEX,1
1205 */
1206 -- do not nvl UOM_QUANTITY when updating UOM_QUANTITY , for a case if uom_quantity is null for a regular line , we could
1207 -- potentially update it to value by nvl'ing it , when uom_quantity is supposed to be null.
1208 -- Ex: 1Ton = 1000Kg , UOM_QUANTITY passed is null . in this case if we nvl(UOM_QUANTITY,1) then the new uom_quantity after the
1209 -- update will be nvl(uom_quantity,1) * 1000(v_uom_rate) = 1000 which is wrong .. bug# 2028618
1210
1211 UPDATE qp_npreq_lines_tmp -- upd1
1212 SET PRICED_UOM_CODE = v_primary_uom_code,
1213 PRICED_QUANTITY = v_pricing_qty, -- shulin bug 1829731
1214 LINE_UOM_CODE = l_order_uom_code, -- order_uom, i.line_uom_code
1215 LINE_QUANTITY = l_order_qty, -- shu_latest
1216 UOM_QUANTITY = decode(l_duration_passed,
1217 'Y', l_uom_quantity,
1218 'N', uom_quantity,
1219 uom_quantity)
1220 WHERE LINE_INDEX = i.line_index;
1221 x_list_line_id := v_list_line_id;
1222
1223 -- [julin/4330147/4335995] only update line_attrs when uom conversion successful
1224 IF (l_uom_conv_success = 'Y') THEN
1225 -- 3773652
1226 -- used for bulk update for UOM conversion cases
1227 l_upd_line_index_tbl(n) := i.line_index;
1228 l_upd_priced_qty_tbl(n) := v_pricing_qty;
1229 n := n+1;
1230 END IF;
1231 ELSE -- No record found in primary uom and also in order uom, else IF (v_list_line_id IS NOT NULL)
1232 l_status_text := 'Could not find a price list in Ordered UOM or Primary UOM';
1233 IF l_debug = FND_API.G_TRUE THEN
1234 QP_PREQ_GRP.engine_debug(l_status_text);
1235 END IF;
1236 Update_Invalid_List_Lines(i.INCOMPATABILITY_GRP_CODE,i.line_index,p_pricing_phase_id,
1237 QP_PREQ_GRP.G_STATUS_INVALID_UOM,l_status_text, v_return_status,
1238 v_return_status_text);
1239 GOTO NEXT_LINE;
1240 -- RAISE INVALID_UOM;
1241 END IF;
1242 END IF;
1243
1244 <<NEXT_LINE>>
1245 null;
1246 END LOOP;
1247
1248
1249 /*
1250 INDX,QP_Resolve_Incompatability_PVTRUN.determine_pricing_uom_and_qty.upd2,qp_npreq_lines_tmp_N1,LINE_INDEX,1
1251 */
1252
1253 -- Bulk Update, from no uom conversion cases
1254 FORALL i in 1 .. l_line_index_tbl.COUNT --upd2
1255 UPDATE qp_npreq_lines_tmp
1256 SET PRICED_UOM_CODE = l_line_uom_code_tbl(i), --priced uom is the same as order uom
1257 PRICED_QUANTITY = l_priced_quantity_tbl(i), -- shu_latest
1258 LINE_UOM_CODE = l_line_uom_code_tbl(i), -- order uom
1259 LINE_QUANTITY = l_line_quantity_tbl(i), -- shu_latest
1260 UOM_QUANTITY = l_uom_quantity_tbl(i) -- shu_latest
1261 WHERE LINE_INDEX = l_line_index_tbl(i);
1262
1263 l_line_uom_code_tbl := l_line_uom_code_tbl_m;
1264 l_line_quantity_tbl := l_line_quantity_tbl_m;
1265 l_line_index_tbl := l_line_index_tbl_m;
1266 l_priced_quantity_tbl := l_priced_quantity_tbl_m; --shu_latest
1267 l_uom_quantity_tbl := l_uom_quantity_tbl_m; --shu_latest
1268
1269 -- 3773652
1270 -- bulk update, from uom conversion cases
1271 FORALL i in 1..l_upd_line_index_tbl.COUNT
1272 UPDATE qp_npreq_line_attrs_tmp
1273 SET VALUE_FROM = qp_number.number_to_canonical(l_upd_priced_qty_tbl(i))
1274 WHERE LINE_INDEX = l_upd_line_index_tbl(i)
1275 AND CONTEXT = QP_PREQ_GRP.G_PRIC_VOLUME_CONTEXT
1276 AND ATTRIBUTE = QP_PREQ_GRP.G_QUANTITY_ATTRIBUTE
1277 AND ATTRIBUTE_TYPE = QP_PREQ_GRP.G_PRICING_TYPE
1278 AND PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_UNCHANGED;
1279 l_upd_line_index_tbl := l_line_index_tbl_m;
1280 l_upd_priced_qty_tbl := l_priced_quantity_tbl_m;
1281
1282 IF l_debug = FND_API.G_TRUE THEN
1283 QP_PREQ_GRP.engine_debug('Incomp Return Status : ' || v_return_status);
1284 END IF;
1285 v_return_status := x_return_status;
1286 EXCEPTION
1287 WHEN INVALID_UOM_CONVERSION THEN
1288 IF l_debug = FND_API.G_TRUE THEN
1289 QP_PREQ_GRP.engine_debug(v_routine_name ||' Invalid Unit of Measure Conversion'|| l_order_uom_code || ','
1290 || v_primary_uom_code);
1291 END IF;
1292 x_return_status_txt := l_order_uom_code || ',' || v_primary_uom_code;
1293 v_return_status := QP_PREQ_GRP.G_STATUS_INVALID_UOM_CONV;
1294 x_return_status := v_return_status;
1295 x_list_line_id := NULL;
1296 WHEN DUPLICATE_PRICE_LIST THEN
1297 IF l_debug = FND_API.G_TRUE THEN
1298 QP_PREQ_GRP.engine_debug(v_routine_name || ' Duplicate Price List '|| v_list_line_id || ',' || v_dup_list_line_id);
1299 END IF;
1300 v_return_msg := v_list_line_id || ',' || v_dup_list_line_id ;
1301 IF l_debug = FND_API.G_TRUE THEN
1302 QP_PREQ_GRP.engine_debug(v_return_msg);
1303 END IF;
1304 x_return_status_txt := v_return_msg;
1305 v_return_status := QP_PREQ_GRP.G_STATUS_DUP_PRICE_LIST;
1306 x_return_status := v_return_status;
1307 x_list_line_id := NULL;
1308 WHEN INVALID_UOM THEN
1309 IF l_debug = FND_API.G_TRUE THEN
1310 QP_PREQ_GRP.engine_debug(v_routine_name || ' Could not find a price list in Ordered UOM or Primary UOM');
1311 END IF;
1312 x_return_status_txt := 'Could not find a price list in Ordered UOM or Primary UOM';
1313 v_return_status := QP_PREQ_GRP.G_STATUS_INVALID_UOM;
1314 x_return_status := v_return_status;
1315 x_list_line_id := NULL;
1316 WHEN OTHERS THEN
1317 IF l_debug = FND_API.G_TRUE THEN
1318 QP_PREQ_GRP.engine_debug(v_routine_name || 'Unexpected Error');
1319 QP_PREQ_GRP.engine_debug(v_routine_name || ' ' || SQLERRM);
1320 END IF;
1321 v_return_status := FND_API.G_RET_STS_ERROR;
1322 x_return_status := v_return_status;
1323 x_return_status_txt := v_routine_name || ' ' || SQLERRM;
1324 x_list_line_id := NULL;
1325 END Determine_Pricing_UOM_And_Qty;
1326
1327 PROCEDURE Best_Price_Evaluation(p_list_price NUMBER,
1328 p_line_index NUMBER,
1329 p_pricing_phase_id NUMBER,
1330 p_incomp_grp_id VARCHAR2,
1331 p_precedence NUMBER, -- Added for bug#2661540
1332 p_manual_dis_flag VARCHAR2,
1333 x_list_line_id OUT NOCOPY NUMBER,
1334 x_return_status OUT NOCOPY VARCHAR2) AS
1335
1336
1337 v_index NUMBER := 1;
1338 v_list_price NUMBER;
1339 v_benefit_price NUMBER;
1340 v_benefit_percent NUMBER;
1341 v_list_line_id NUMBER;
1342 v_request_qty NUMBER;
1343 v_return_status VARCHAR2(30) := FND_API.G_RET_STS_SUCCESS;
1344 x_benefit_amount NUMBER;
1345 l_return_status VARCHAR2(30);
1346 l_return_status_text VARCHAR2(240);
1347 l_sign NUMBER;
1348 l_request_qty NUMBER;
1349 l_line_id NUMBER; --3244060
1350
1351 v_routine_name CONSTANT VARCHAR2(240) := 'Routine:QP_Resolve_Incompatability_PVTRUN.Best_Price_Evaluation';
1352
1353 /*
1354 INDX,QP_Resolve_Incompatability_PVTRUN.best_price_evaluation.get_list_lines_cur,qp_npreq_ldets_tmp_N1,LINE_INDEX,1
1355 INDX,QP_Resolve_Incompatability_PVTRUN.best_price_evaluation.get_list_lines_cur,qp_npreq_ldets_tmp_N1,PRICING_STATUS_CODE,2
1356 INDX,QP_Resolve_Incompatability_PVTRUN.best_price_evaluation.get_list_lines_cur,qp_npreq_ldets_tmp_N1,PRICING_PHASE_ID,3
1357 INDX,QP_Resolve_Incompatability_PVTRUN.best_price_evaluation.get_list_lines_cur,qp_npreq_ldets_tmp_N1,CREATED_FROM_LIST_HEADER_ID,4
1358
1359 INDX,QP_Resolve_Incompatability_PVTRUN.best_price_evaluation.get_list_lines_cur,qp_npreq_ldets_tmp_N1,CREATED_FROM_LIST_LINE_ID,5
1360 INDX,QP_Resolve_Incompatability_PVTRUN.best_price_evaluation.get_list_lines_cur,QP_LIST_LINES_PK,LIST_LINE_ID,1
1361 */
1362 -- For bug#2661540
1363 CURSOR get_list_lines_cur IS
1364 SELECT b.CREATED_FROM_LIST_HEADER_ID, b.CREATED_FROM_LIST_LINE_ID,b.line_detail_index, --3244060
1365 b.CREATED_FROM_LIST_LINE_TYPE, b.OPERAND_CALCULATION_CODE, b.OPERAND_VALUE,a.ESTIM_GL_VALUE ,
1366 a.BENEFIT_PRICE_LIST_LINE_ID,a.PRICE_BREAK_TYPE_CODE,b.LINE_QUANTITY,b.GROUP_QUANTITY,b.GROUP_AMOUNT, --[julin/4240067/4307242]
1367 b.modifier_level_code
1368 FROM QP_LIST_LINES a, qp_npreq_ldets_tmp b, qp_npreq_line_attrs_tmp c
1369 WHERE a.LIST_HEADER_ID = b.CREATED_FROM_LIST_HEADER_ID
1370 AND a.LIST_LINE_ID = b.CREATED_FROM_LIST_LINE_ID
1371 AND b.CREATED_FROM_LIST_TYPE_CODE not in (QP_PREQ_GRP.G_PRICE_LIST_HEADER,QP_PREQ_GRP.G_AGR_LIST_HEADER)
1372 AND b.PRICING_PHASE_ID = p_pricing_phase_id
1373 AND b.INCOMPATABILITY_GRP_CODE = p_incomp_grp_id
1374 AND b.LINE_INDEX = p_line_index
1375 AND b.PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_NEW
1376 AND ((b.AUTOMATIC_FLAG = QP_PREQ_GRP.G_YES AND p_manual_dis_flag = QP_PREQ_GRP.G_YES)
1377 OR p_manual_dis_flag = QP_PREQ_GRP.G_NO)
1378 AND c.LIST_LINE_ID(+) = a.LIST_LINE_ID
1379 AND c.LIST_HEADER_ID(+) = a.LIST_HEADER_ID
1380 AND c.ATTRIBUTE_TYPE(+) = 'QUALIFIER'
1381 AND c.INCOMPATABILITY_GRP_CODE(+) = p_incomp_grp_id
1382 AND c.PRICING_PHASE_ID(+) = p_pricing_phase_id
1383 AND c.PRICING_STATUS_CODE(+) = 'N'
1384 AND c.LINE_INDEX(+) = p_line_index
1385 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)));
1386
1387 /* Commented for bug 2661540
1388 CURSOR get_list_lines_cur IS
1389 SELECT b.CREATED_FROM_LIST_HEADER_ID, b.CREATED_FROM_LIST_LINE_ID,
1390 b.CREATED_FROM_LIST_LINE_TYPE, b.OPERAND_CALCULATION_CODE, b.OPERAND_VALUE,a.ESTIM_GL_VALUE ,
1391 a.BENEFIT_PRICE_LIST_LINE_ID,a.PRICE_BREAK_TYPE_CODE,b.GROUP_QUANTITY,b.GROUP_AMOUNT
1392 FROM QP_LIST_LINES a, qp_npreq_ldets_tmp b
1393 WHERE a.LIST_HEADER_ID = b.CREATED_FROM_LIST_HEADER_ID
1394 AND a.LIST_LINE_ID = b.CREATED_FROM_LIST_LINE_ID
1395 AND b.CREATED_FROM_LIST_TYPE_CODE not in (QP_PREQ_GRP.G_PRICE_LIST_HEADER,QP_PREQ_GRP.G_AGR_LIST_HEADER)
1396 AND b.PRICING_PHASE_ID = p_pricing_phase_id
1397 AND b.INCOMPATABILITY_GRP_CODE = p_incomp_grp_id
1398 AND b.LINE_INDEX = p_line_index
1399 AND b.PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_NEW
1400 AND ((b.AUTOMATIC_FLAG = QP_PREQ_GRP.G_YES AND p_manual_dis_flag = QP_PREQ_GRP.G_YES) OR
1401 p_manual_dis_flag = QP_PREQ_GRP.G_NO);
1402 */
1403 /*
1404 INDX,QP_Resolve_Incompatability_PVTRUN.best_price_evaluation.get_request_qty_cur,qp_npreq_lines_tmp_N1,LINE_INDEX,1*/
1405
1406 CURSOR get_request_qty_cur IS
1407 SELECT nvl(PRICED_QUANTITY,LINE_QUANTITY)
1408 FROM qp_npreq_lines_tmp
1409 WHERE LINE_INDEX = p_line_index;
1410
1411 /*
1412 INDX,QP_Resolve_Incompatability_PVTRUN.best_price_evaluation.get_list_price_cur,QP_LIST_LINES_PK,LIST_LINE_ID,1
1413 */
1414
1415 CURSOR get_list_price_cur(p_list_line_id NUMBER) IS
1416 SELECT OPERAND
1417 FROM QP_LIST_LINES
1418 WHERE LIST_LINE_ID = p_list_line_id
1419 AND ARITHMETIC_OPERATOR = QP_PREQ_GRP.G_UNIT_PRICE;
1420
1421 /*
1422 INDX,QP_Resolve_Incompatability_PVTRUN.best_price_evaluation.get_list_lines_in_order,qp_npreq_ldets_tmp_N1,LINE_INDEX,1
1423 INDX,QP_Resolve_Incompatability_PVTRUN.best_price_evaluation.get_list_lines_in_order,qp_npreq_ldets_tmp_N1,PRICING_STATUS_CODE,2
1424 INDX,QP_Resolve_Incompatability_PVTRUN.best_price_evaluation.get_list_lines_in_order,qp_npreq_ldets_tmp_N1,PRICING_PHASE_ID,3
1425 */
1426
1427 -- For bug 2661540
1428 CURSOR get_list_lines_in_order IS
1429 SELECT a.CREATED_FROM_LIST_LINE_ID
1430 FROM qp_npreq_ldets_tmp a, qp_npreq_line_attrs_tmp b
1431 WHERE a.CREATED_FROM_LIST_TYPE_CODE not in (QP_PREQ_GRP.G_PRICE_LIST_HEADER,QP_PREQ_GRP.G_AGR_LIST_HEADER)
1432 AND a.PRICING_PHASE_ID = p_pricing_phase_id
1433 AND a.INCOMPATABILITY_GRP_CODE = p_incomp_grp_id
1434 AND a.LINE_INDEX = p_line_index
1435 AND a.PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_NEW
1436 AND ((a.AUTOMATIC_FLAG = QP_PREQ_GRP.G_YES AND p_manual_dis_flag = QP_PREQ_GRP.G_YES) OR
1437 p_manual_dis_flag = QP_PREQ_GRP.G_NO)
1438 AND b.LIST_LINE_ID(+) = a.CREATED_FROM_LIST_LINE_ID
1439 AND b.LIST_HEADER_ID(+) = a.CREATED_FROM_LIST_HEADER_ID
1440 AND b.ATTRIBUTE_TYPE(+) = 'QUALIFIER'
1441 AND b.INCOMPATABILITY_GRP_CODE(+) = p_incomp_grp_id
1442 AND b.PRICING_PHASE_ID(+) = p_pricing_phase_id
1443 AND b.PRICING_STATUS_CODE(+) = 'N'
1444 AND b.LINE_INDEX(+) = p_line_index
1445 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)))
1446 ORDER BY BEST_PERCENT DESC;
1447
1448 /* Commented for Bug 2661540
1449 CURSOR get_list_lines_in_order IS
1450 SELECT CREATED_FROM_LIST_LINE_ID
1451 FROM qp_npreq_ldets_tmp
1452 WHERE CREATED_FROM_LIST_TYPE_CODE not in (QP_PREQ_GRP.G_PRICE_LIST_HEADER,QP_PREQ_GRP.G_AGR_LIST_HEADER)
1453 AND PRICING_PHASE_ID = p_pricing_phase_id
1454 AND INCOMPATABILITY_GRP_CODE = p_incomp_grp_id
1455 AND LINE_INDEX = p_line_index
1456 AND PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_NEW
1457 AND ((AUTOMATIC_FLAG = QP_PREQ_GRP.G_YES AND p_manual_dis_flag = QP_PREQ_GRP.G_YES) OR
1458 p_manual_dis_flag = QP_PREQ_GRP.G_NO)
1459 ORDER BY BEST_PERCENT DESC;
1460 */
1461
1462 --[julin/5456188]
1463 l_req_value_per_unit NUMBER;
1464 l_total_value NUMBER;
1465 l_volume_attribute VARCHAR2(240);
1466 l_calc_quantity NUMBER;
1467
1468 BEGIN
1469 l_debug := QP_PREQ_GRP.G_DEBUG_ENGINE;
1470 FOR i IN get_list_lines_cur
1471 LOOP
1472 /*IF (i.CREATED_FROM_LIST_LINE_TYPE = QP_PREQ_GRP.G_OTHER_ITEM_DISCOUNT) THEN
1473 IF l_debug = FND_API.G_TRUE THEN
1474 QP_PREQ_GRP.engine_debug('Benefit Price List Line Id is Very important: ' || i.BENEFIT_PRICE_LIST_LINE_ID);
1475 END IF;
1476 OPEN get_list_price_cur(i.BENEFIT_PRICE_LIST_LINE_ID);
1477 FETCH get_list_price_cur INTO v_list_price;
1478 CLOSE get_list_price_cur;
1479 IF (i.OPERAND_CALCULATION_CODE = QP_PREQ_GRP.G_PERCENT_DISCOUNT) THEN
1480 v_benefit_price := (v_list_price) * (i.OPERAND_VALUE / 100);
1481 ELSIF (i.OPERAND_CALCULATION_CODE = QP_PREQ_GRP.G_AMOUNT_DISCOUNT) THEN
1482 v_benefit_price := (v_list_price - i.OPERAND_VALUE);
1483 ELSIF (i.OPERAND_CALCULATION_CODE IS NULL) THEN
1484 v_benefit_price := v_list_price;
1485 END IF; */
1486 IF (i.CREATED_FROM_LIST_LINE_TYPE IN (QP_PREQ_GRP.G_ITEM_UPGRADE,QP_PREQ_GRP.G_TERMS_SUBSTITUTION,
1487 QP_PREQ_GRP.G_COUPON_ISSUE,QP_PREQ_GRP.G_OTHER_ITEM_DISCOUNT,
1488 QP_PREQ_GRP.G_PROMO_GOODS_DISCOUNT)) THEN
1489 v_benefit_price := nvl(i.ESTIM_GL_VALUE,0);
1490 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
1491
1492 IF (i.CREATED_FROM_LIST_LINE_TYPE = QP_PREQ_GRP.G_DISCOUNT) THEN
1493 l_sign := 1;
1494 ELSE
1495 l_sign := -1;
1496 END IF;
1497
1498 IF l_debug = FND_API.G_TRUE THEN
1499 QP_PREQ_GRP.engine_debug('List Price For Best Price Eval: ' || p_list_price);
1500
1501 END IF;
1502
1503 IF(i.modifier_level_code <> 'ORDER') THEN -- bug 4234043
1504 IF (i.OPERAND_CALCULATION_CODE = QP_PREQ_GRP.G_PERCENT_DISCOUNT) THEN
1505 v_benefit_price := l_sign * p_list_price * (i.OPERAND_VALUE / 100);
1506 ELSIF (i.OPERAND_CALCULATION_CODE = QP_PREQ_GRP.G_AMOUNT_DISCOUNT) THEN
1507 v_benefit_price := l_sign * i.OPERAND_VALUE;
1508 ELSIF (i.OPERAND_CALCULATION_CODE = QP_PREQ_GRP.G_NEWPRICE_DISCOUNT) THEN
1509 l_sign := 1; -- For NEWPRICE l_sign will always be 1 irrespective of whether it is a discount or surcharge
1510 v_benefit_price := l_sign * (p_list_price - i.OPERAND_VALUE);
1511 ELSIF (i.OPERAND_CALCULATION_CODE = QP_PREQ_GRP.G_LUMPSUM_DISCOUNT) THEN
1512 OPEN get_request_qty_cur;
1513 FETCH get_request_qty_cur INTO v_request_qty;
1514 CLOSE get_request_qty_cur;
1515 IF (i.modifier_level_code = QP_PREQ_GRP.G_LINE_GROUP) THEN
1516 l_calc_quantity := nvl(nvl(i.group_quantity, i.group_amount), v_request_qty);
1517 ELSE
1518 l_calc_quantity := v_request_qty;
1519 END IF;
1520 v_benefit_price := l_sign * i.OPERAND_VALUE/l_calc_quantity;
1521 END IF;
1522 ELSE ---- modifier_level_code='ORDER'
1523 IF (i.OPERAND_CALCULATION_CODE IN (QP_PREQ_GRP.G_PERCENT_DISCOUNT)) THEN
1524 v_benefit_price := l_sign * i.OPERAND_VALUE;
1525 END IF;
1526 END IF;
1527
1528 ELSIF (i.CREATED_FROM_LIST_LINE_TYPE = QP_PREQ_GRP.G_PRICE_BREAK_TYPE) THEN
1529
1530 IF l_debug = FND_API.G_TRUE THEN
1531 QP_PREQ_GRP.engine_debug('Best Price Eval For Price Break Line Quantity : ' || i.line_quantity); --[julin/4240067/4307242]
1532 QP_PREQ_GRP.engine_debug('Best Price Eval For Price Break Group Quantity : ' || i.group_quantity);
1533 QP_PREQ_GRP.engine_debug('Best Price Eval For Price Break Group Amount : ' || i.group_amount);
1534
1535 END IF;
1536 --[julin/4240067/4307242] using i.line_quantity
1537 l_request_qty := nvl(nvl(i.group_quantity,i.group_amount),i.line_quantity);
1538
1539 IF l_debug = FND_API.G_TRUE THEN
1540 QP_PREQ_GRP.engine_debug('Best Price Eval For Price Break Qualifier Value : ' || l_request_qty);
1541
1542 END IF;
1543
1544 /* Added for 3244060 */
1545 IF QP_PREQ_GRP.G_PUBLIC_API_CALL_FLAG = 'Y' THEN
1546 l_line_id :=i.line_detail_index;
1547 ELSE
1548 l_line_id :=i.created_from_list_line_id;
1549 END IF;
1550
1551 --[julin/5456188] using same price_break_calculation as PPREB, but with no bucket/netamt support
1552 OPEN get_request_qty_cur;
1553 FETCH get_request_qty_cur INTO v_request_qty;
1554 CLOSE get_request_qty_cur;
1555
1556 BEGIN
1557 select pricing_attribute
1558 into l_volume_attribute
1559 from qp_pricing_attributes
1560 where list_line_id = i.created_from_list_line_id
1561 and pricing_attribute_context = QP_PREQ_GRP.G_PRIC_VOLUME_CONTEXT
1562 and excluder_flag='N'; --3607956
1563 EXCEPTION
1564 When OTHERS Then
1565 l_volume_attribute := null;
1566 END;
1567
1568 IF (i.modifier_level_code IN (QP_PREQ_PUB.G_LINE_LEVEL, QP_PREQ_PUB.G_ORDER_LEVEL)) THEN
1569 IF l_volume_attribute = QP_PREQ_PUB.G_QUANTITY_ATTRIBUTE THEN
1570 l_total_value := 0;
1571 l_req_value_per_unit := v_request_qty;
1572 ELSE
1573 l_total_value := i.line_quantity;
1574 l_req_value_per_unit := v_request_qty;
1575 END IF;
1576 ELSE -- linegroup
1577 IF l_volume_attribute = QP_PREQ_PUB.G_QUANTITY_ATTRIBUTE THEN
1578 l_total_value := 0;
1579 l_req_value_per_unit := i.group_quantity;
1580 ELSE
1581 l_total_value := i.line_quantity;
1582 l_req_value_per_unit := i.group_amount;
1583 END IF;
1584 END IF;
1585
1586 QP_Calculate_Price_PUB.Price_Break_Calculation(l_line_id, --3244060
1587 i.price_break_type_code,
1588 p_line_index,
1589 l_req_value_per_unit,--p_req_value_per_unit
1590 0,--p_applied_req_value_per_unit, no net amt support here
1591 l_total_value,--p_total_value
1592 p_list_price,
1593 0,--p_line_quantity, not used
1594 0,--p_bucketed_adjustment, no bucket support here
1595 'N',--p_bucketed_flag, no bucket support here
1596 'N',--p_automatic_flag, don't want deletion
1597 x_benefit_amount,
1598 l_return_status,
1599 l_return_status_text);
1600
1601 IF (l_return_status = FND_API.G_RET_STS_ERROR) THEN
1602 NULL;
1603 END IF;
1604
1605 v_benefit_price := x_benefit_amount;
1606 END IF;
1607
1608 IF l_debug = FND_API.G_TRUE THEN
1609 QP_PREQ_GRP.engine_debug('Benefit Price For Best Price Eval: ' || v_benefit_price);
1610
1611 END IF;
1612 IF (i.modifier_level_code <> 'ORDER') THEN --bug 4234043
1613 IF (p_list_price > 0) THEN
1614 v_benefit_percent := (nvl(v_benefit_price,0) / p_list_price) * 100;
1615 ELSE
1616 v_benefit_percent := 0;
1617 END IF;
1618 ELSE -- bug 4234043
1619 v_benefit_percent :=v_benefit_price;
1620 END IF;
1621
1622 IF l_debug = FND_API.G_TRUE THEN
1623 QP_PREQ_GRP.engine_debug('Benefit Percent For Best Price Eval: ' || v_benefit_percent);
1624
1625 END IF;
1626 /*
1627 INDX,QP_Resolve_Incompatability_PVTRUN.best_price_evaluation.upd1,qp_npreq_ldets_tmp_N1,LINE_INDEX,1
1628 INDX,QP_Resolve_Incompatability_PVTRUN.best_price_evaluation.upd1,qp_npreq_ldets_tmp_N1,PRICING_STATUS_CODE,2
1629 INDX,QP_Resolve_Incompatability_PVTRUN.best_price_evaluation.upd1,qp_npreq_ldets_tmp_N1,PRICING_PHASE_ID,3
1630 INDX,QP_Resolve_Incompatability_PVTRUN.best_price_evaluation.upd1,qp_npreq_ldets_tmp_N1,CREATED_FROM_LIST_HEADER_ID,4
1631 INDX,QP_Resolve_Incompatability_PVTRUN.best_price_evaluation.upd1,qp_npreq_ldets_tmp_N1,CREATED_FROM_LIST_LINE_ID,5
1632 */
1633 UPDATE qp_npreq_ldets_tmp -- upd1
1634 SET BEST_PERCENT = v_benefit_percent
1635 WHERE CREATED_FROM_LIST_HEADER_ID = i.CREATED_FROM_LIST_HEADER_ID
1636 AND CREATED_FROM_LIST_LINE_ID = i.CREATED_FROM_LIST_LINE_ID
1637 AND PRICING_PHASE_ID = p_pricing_phase_id
1638 AND INCOMPATABILITY_GRP_CODE = p_incomp_grp_id
1639 AND PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_NEW
1640 AND LINE_INDEX = p_line_index;
1641
1642 END LOOP;
1643
1644 OPEN get_list_lines_in_order;
1645 FETCH get_list_lines_in_order into v_list_line_id;
1646 CLOSE get_list_lines_in_order;
1647
1648 /*
1649 INDX,QP_Resolve_Incompatability_PVTRUN.best_price_evaluation.upd2,qp_npreq_ldets_tmp_N1,LINE_INDEX,1
1650 INDX,QP_Resolve_Incompatability_PVTRUN.best_price_evaluation.upd2,qp_npreq_ldets_tmp_N1,PRICING_STATUS_CODE,2
1651 INDX,QP_Resolve_Incompatability_PVTRUN.best_price_evaluation.upd2,qp_npreq_ldets_tmp_N1,PRICING_PHASE_ID,3
1652 */
1653
1654 UPDATE qp_npreq_ldets_tmp -- upd2
1655 SET PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_BEST_PRICE_EVAL
1656 WHERE CREATED_FROM_LIST_LINE_ID <> v_list_line_id
1657 AND CREATED_FROM_LIST_TYPE_CODE not in (QP_PREQ_GRP.G_PRICE_LIST_HEADER,QP_PREQ_GRP.G_AGR_LIST_HEADER)
1658 AND PRICING_PHASE_ID = p_pricing_phase_id
1659 AND INCOMPATABILITY_GRP_CODE = p_incomp_grp_id
1660 AND LINE_INDEX = p_line_index
1661 AND PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_NEW;
1662
1663 /* UPDATE qp_npreq_line_attrs_tmp a
1664 SET a.PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_BEST_PRICE_EVAL
1665 WHERE a.LIST_LINE_ID IN (SELECT b.CREATED_FROM_LIST_LINE_ID
1666 FROM qp_npreq_ldets_tmp b
1667 WHERE b.PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_BEST_PRICE_EVAL
1668 AND b.CREATED_FROM_LIST_LINE_ID <> v_list_line_id
1669 AND b.LINE_INDEX = p_line_index)
1670 AND a.LINE_INDEX = p_line_index; */
1671
1672 /* UPDATE qp_npreq_line_attrs_tmp a
1673 SET a.PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_BEST_PRICE_EVAL
1674 WHERE a.LIST_LINE_ID
1675 IN (SELECT b.CREATED_FROM_LIST_LINE_ID
1676 FROM qp_npreq_ldets_tmp b
1677 WHERE b.PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_BEST_PRICE_EVAL
1678 AND b.PRICING_PHASE_ID = p_pricing_phase_id
1679 AND b.INCOMPATABILITY_GRP_CODE = p_incomp_grp_id
1680 AND b.CREATED_FROM_LIST_LINE_ID <> v_list_line_id
1681 AND b.LINE_INDEX = p_line_index)
1682 AND a.LINE_INDEX = p_line_index; */
1683
1684 x_list_line_id := v_list_line_id;
1685 IF l_debug = FND_API.G_TRUE THEN
1686 QP_PREQ_GRP.engine_debug('Best List line Id: ' || v_list_line_id);
1687
1688 END IF;
1689 x_return_status := v_return_status; -- SUCCESS
1690
1691 EXCEPTION
1692 WHEN OTHERS THEN
1693 IF l_debug = FND_API.G_TRUE THEN
1694 QP_PREQ_GRP.engine_debug(v_routine_name || 'Unexpected Error');
1695 QP_PREQ_GRP.engine_debug(v_routine_name || ' ' || SQLERRM);
1696 END IF;
1697 v_return_status := FND_API.G_RET_STS_ERROR;
1698 x_return_status := v_return_status;
1699 END Best_Price_Evaluation;
1700
1701 PROCEDURE Delete_Lines_Complete (p_line_index_tbl IN QP_PREQ_GRP.NUMBER_TYPE,
1702 p_pricing_status_text IN VARCHAR2,
1703 x_return_status OUT NOCOPY VARCHAR2,
1704 x_return_status_txt OUT NOCOPY VARCHAR2) AS
1705 BEGIN
1706 l_debug := QP_PREQ_GRP.G_DEBUG_ENGINE;
1707 IF l_debug = FND_API.G_TRUE THEN
1708 QP_PREQ_GRP.engine_debug('deleting lines/ldets/attrs/rltd:'||p_pricing_status_text);
1709 END IF;
1710
1711 FORALL i IN p_line_index_tbl.FIRST..p_line_index_tbl.LAST
1712 UPDATE qp_npreq_lines_tmp
1713 SET pricing_status_code = QP_PREQ_PUB.G_NOT_VALID, process_status = QP_PREQ_PUB.G_NOT_VALID
1714 WHERE line_index = p_line_index_tbl(i)
1715 and line_id is null; --bug 7539796
1716 FORALL i IN p_line_index_tbl.FIRST..p_line_index_tbl.LAST
1717 UPDATE qp_npreq_ldets_tmp
1718 SET PRICING_STATUS_CODE = QP_PREQ_PUB.G_STATUS_DELETED,
1719 PRICING_STATUS_TEXT = substr(p_pricing_status_text,1,2000)
1720 WHERE LINE_INDEX = p_line_index_tbl(i);
1721 FORALL i IN p_line_index_tbl.FIRST..p_line_index_tbl.LAST
1722 UPDATE qp_npreq_line_attrs_tmp
1723 SET PRICING_STATUS_CODE = QP_PREQ_PUB.G_STATUS_DELETED,
1724 PRICING_STATUS_TEXT = substr(p_pricing_status_text,1,240)
1725 WHERE LINE_INDEX = p_line_index_tbl(i);
1726 FORALL i IN p_line_index_tbl.FIRST..p_line_index_tbl.LAST
1727 UPDATE qp_npreq_rltd_lines_tmp
1728 SET PRICING_STATUS_CODE = QP_PREQ_PUB.G_STATUS_DELETED,
1729 PRICING_STATUS_TEXT = substr(p_pricing_status_text,1,240)
1730 WHERE RELATED_LINE_INDEX = p_line_index_tbl(i);
1731 EXCEPTION
1732 WHEN OTHERS THEN
1733 x_return_status := FND_API.G_RET_STS_ERROR;
1734 x_return_status_txt := 'Unexpected error in QP_Resolve_Incompatability_PVT.Delete_Lines_Complete: ' || SQLERRM;
1735 END Delete_Lines_Complete;
1736
1737 PROCEDURE Delete_Ldets_Complete (p_line_detail_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 ldets/rltd:'||p_pricing_status_text);
1745 END IF;
1746
1747 FORALL i IN p_line_detail_index_tbl.FIRST..p_line_detail_index_tbl.LAST
1748 UPDATE qp_npreq_ldets_tmp a
1749 SET PRICING_STATUS_CODE = QP_PREQ_PUB.G_STATUS_DELETED,
1750 PRICING_STATUS_TEXT = substr(p_pricing_status_text,1,2000)
1751 WHERE LINE_DETAIL_INDEX = p_line_detail_index_tbl(i) OR
1752 EXISTS (SELECT 1 --[julin/4671446] also deleting children ldets
1753 FROM qp_npreq_rltd_lines_tmp
1754 WHERE LINE_DETAIL_INDEX = p_line_detail_index_tbl(i)
1755 AND RELATED_LINE_DETAIL_INDEX = a.LINE_DETAIL_INDEX);
1756 FORALL i IN p_line_detail_index_tbl.FIRST..p_line_detail_index_tbl.LAST
1757 UPDATE qp_npreq_rltd_lines_tmp
1758 SET PRICING_STATUS_CODE = QP_PREQ_PUB.G_STATUS_DELETED,
1759 PRICING_STATUS_TEXT = substr(p_pricing_status_text,1,240)
1760 WHERE (LINE_DETAIL_INDEX = p_line_detail_index_tbl(i) OR
1761 RELATED_LINE_DETAIL_INDEX = p_line_detail_index_tbl(i)); --[julin/4671446] also deleting children ldets
1762 EXCEPTION
1763 WHEN OTHERS THEN
1764 x_return_status := FND_API.G_RET_STS_ERROR;
1765 x_return_status_txt := 'Unexpected error in QP_Resolve_Incompatability_PVT.Delete_Ldets_Complete: ' || SQLERRM;
1766 END Delete_Ldets_Complete;
1767
1768
1769 PROCEDURE Delete_Incompatible_Lines(p_pricing_phase_id NUMBER,
1770 p_line_index NUMBER,
1771 p_incomp_grp_id VARCHAR2 := NULL,
1772 p_list_line_id NUMBER,
1773 p_excl_discount BOOLEAN,
1774 p_manual_dis_flag VARCHAR2,
1775 x_return_status OUT NOCOPY VARCHAR2) AS
1776
1777
1778 -- [prarasto/4141235] find loser prg line indexes to be deleted, incompatibility group
1779 --frontported fix done in 4134088
1780 CURSOR l_del_prg_lines_grp_cur IS
1781 SELECT rltd.RELATED_LINE_INDEX
1782 FROM qp_npreq_ldets_tmp ldets, qp_npreq_rltd_lines_tmp rltd
1783 WHERE ldets.INCOMPATABILITY_GRP_CODE = p_incomp_grp_id
1784 AND ldets.LINE_INDEX = p_line_index
1785 AND ldets.PRICING_PHASE_ID = p_pricing_phase_id
1786 AND ldets.CREATED_FROM_LIST_LINE_ID <> p_list_line_id
1787 AND ldets.LINE_DETAIL_TYPE_CODE <> QP_PREQ_GRP.G_CHILD_DETAIL_TYPE
1788 AND ldets.CREATED_FROM_LIST_LINE_TYPE IN (QP_PREQ_GRP.G_PROMO_GOODS_DISCOUNT)
1789 AND ldets.CREATED_FROM_LIST_LINE_ID = rltd.LIST_LINE_ID
1790 AND rltd.LINE_INDEX = p_line_index;
1791
1792 -- [prarasto/4141235] find loser prg line indexes to be deleted, incompatibility group
1793 --frontported fix done in 4134088
1794 CURSOR l_del_oid_ldets_grp_cur IS
1795 SELECT rltd.RELATED_LINE_DETAIL_INDEX
1796 FROM qp_npreq_ldets_tmp ldets, qp_npreq_rltd_lines_tmp rltd
1797 WHERE ldets.INCOMPATABILITY_GRP_CODE = p_incomp_grp_id
1798 AND ldets.LINE_INDEX = p_line_index
1799 AND ldets.PRICING_PHASE_ID = p_pricing_phase_id
1800 AND ldets.CREATED_FROM_LIST_LINE_ID <> p_list_line_id
1801 AND ldets.LINE_DETAIL_TYPE_CODE <> QP_PREQ_GRP.G_CHILD_DETAIL_TYPE
1802 AND ldets.CREATED_FROM_LIST_LINE_TYPE IN (QP_PREQ_GRP.G_OTHER_ITEM_DISCOUNT)
1803 AND ldets.CREATED_FROM_LIST_LINE_ID = rltd.LIST_LINE_ID
1804 AND rltd.LINE_INDEX = p_line_index;
1805
1806 -- [prarasto/4141235] find loser prg line indexes to be deleted, incompatibility group
1807 --frontported fix done in 4134088
1808 CURSOR l_del_prg_lines_excl_cur IS
1809 SELECT rltd.RELATED_LINE_INDEX
1810 FROM qp_npreq_ldets_tmp ldets, qp_npreq_rltd_lines_tmp rltd
1811 WHERE ldets.LINE_INDEX = p_line_index
1812 AND ldets.PRICING_PHASE_ID = p_pricing_phase_id
1813 AND ldets.CREATED_FROM_LIST_LINE_ID <> p_list_line_id
1814 AND ldets.LINE_DETAIL_TYPE_CODE <> QP_PREQ_GRP.G_CHILD_DETAIL_TYPE
1815 AND ldets.CREATED_FROM_LIST_LINE_TYPE IN (QP_PREQ_GRP.G_PROMO_GOODS_DISCOUNT)
1816 AND ldets.CREATED_FROM_LIST_LINE_ID = rltd.LIST_LINE_ID
1817 AND rltd.LINE_INDEX = p_line_index;
1818
1819 -- [prarasto/4141235] find loser prg line indexes to be deleted, incompatibility group
1820 --frontported fix done in 4134088
1821 CURSOR l_del_oid_ldets_excl_cur IS
1822 SELECT rltd.RELATED_LINE_DETAIL_INDEX
1823 FROM qp_npreq_ldets_tmp ldets, qp_npreq_rltd_lines_tmp rltd
1824 WHERE ldets.LINE_INDEX = p_line_index
1825 AND ldets.PRICING_PHASE_ID = p_pricing_phase_id
1826 AND ldets.CREATED_FROM_LIST_LINE_ID <> p_list_line_id
1827 AND ldets.LINE_DETAIL_TYPE_CODE <> QP_PREQ_GRP.G_CHILD_DETAIL_TYPE
1828 AND ldets.CREATED_FROM_LIST_LINE_TYPE IN (QP_PREQ_GRP.G_OTHER_ITEM_DISCOUNT)
1829 AND ldets.CREATED_FROM_LIST_LINE_ID = rltd.LIST_LINE_ID
1830 AND rltd.LINE_INDEX = p_line_index;
1831
1832 l_del_index_tbl QP_PREQ_GRP.NUMBER_TYPE;
1833
1834 l_status_code VARCHAR2(30);
1835 l_status_text VARCHAR2(240);
1836
1837 v_return_status VARCHAR2(30) := FND_API.G_RET_STS_SUCCESS;
1838 v_routine_name CONSTANT VARCHAR2(240):='Routine:QP_Resolve_Incompatability_PVTRUN.Delete_Incompatible_Lines';
1839
1840 BEGIN
1841 l_debug := QP_PREQ_GRP.G_DEBUG_ENGINE;
1842
1843 IF l_debug = FND_API.G_TRUE THEN
1844 QP_PREQ_GRP.engine_debug('Enter Delete_Incompatible_Lines:'||p_line_index||':'||p_incomp_grp_id||':'||p_list_line_id||':'||p_manual_dis_flag);
1845 END IF;
1846
1847 IF (p_manual_dis_flag = QP_PREQ_GRP.G_YES) THEN
1848 IF (p_excl_discount = FALSE) THEN
1849
1850 /*
1851 INDX,QP_Resolve_Incompatability_PVTRUN.delete_incompatible_lines.upd1,qp_npreq_ldets_tmp_N1,LINE_INDEX,1
1852 INDX,QP_Resolve_Incompatability_PVTRUN.delete_incompatible_lines.upd1,qp_npreq_ldets_tmp_N1,PRICING_STATUS_CODE,2
1853 INDX,QP_Resolve_Incompatability_PVTRUN.delete_incompatible_lines.upd1,qp_npreq_ldets_tmp_N1,PRICING_PHASE_ID,3
1854 */
1855
1856 UPDATE qp_npreq_ldets_tmp --upd1
1857 SET PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_INCOMP_LOGIC
1858 WHERE INCOMPATABILITY_GRP_CODE = p_incomp_grp_id
1859 AND LINE_INDEX = p_line_index
1860 AND PRICING_PHASE_ID = p_pricing_phase_id
1861 AND CREATED_FROM_LIST_LINE_ID <> p_list_line_id
1862 AND CREATED_FROM_LIST_LINE_TYPE NOT IN (QP_PREQ_GRP.G_DISCOUNT,QP_PREQ_GRP.G_SURCHARGE)
1863 AND LINE_DETAIL_TYPE_CODE <> QP_PREQ_GRP.G_CHILD_DETAIL_TYPE -- Don't delete PBH Children any time
1864 AND PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_NEW;
1865
1866 /*
1867 INDX,QP_Resolve_Incompatability_PVTRUN.delete_incompatible_lines.upd2,qp_npreq_ldets_tmp_N3,LINE_INDEX,1
1868 INDX,QP_Resolve_Incompatability_PVTRUN.delete_incompatible_lines.upd2,qp_npreq_ldets_tmp_N3,PRICING_PHASE_ID,2
1869 INDX,QP_Resolve_Incompatability_PVTRUN.delete_incompatible_lines.upd2,qp_npreq_ldets_tmp_N3,ASK_FOR_FLAG,3
1870 INDX,QP_Resolve_Incompatability_PVTRUN.delete_incompatible_lines.upd2,qp_npreq_ldets_tmp_N3,CREATED_FROM_LIST_LINE_TYPE,4
1871 INDX,QP_Resolve_Incompatability_PVTRUN.delete_incompatible_lines.upd2,qp_npreq_ldets_tmp_N3,PRICING_STATUS_CODE,5
1872 */
1873
1874 UPDATE qp_npreq_ldets_tmp --upd2
1875 SET PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_NEW,
1876 AUTOMATIC_FLAG = QP_PREQ_GRP.G_NO,
1877 APPLIED_FLAG = QP_PREQ_GRP.G_NO
1878 WHERE INCOMPATABILITY_GRP_CODE = p_incomp_grp_id
1879 AND LINE_INDEX = p_line_index
1880 AND PRICING_PHASE_ID = p_pricing_phase_id
1881 AND CREATED_FROM_LIST_LINE_ID <> p_list_line_id
1882 AND ASK_FOR_FLAG = QP_PREQ_GRP.G_NO
1883 AND CREATED_FROM_LIST_LINE_TYPE IN (QP_PREQ_GRP.G_DISCOUNT,QP_PREQ_GRP.G_SURCHARGE)
1884 AND LINE_DETAIL_TYPE_CODE <> QP_PREQ_GRP.G_CHILD_DETAIL_TYPE -- Don't delete PBH Children any time
1885 AND PRICING_STATUS_CODE IN (QP_PREQ_GRP.G_STATUS_NEW,QP_PREQ_GRP.G_STATUS_BEST_PRICE_EVAL);
1886
1887 /* UPDATE qp_npreq_line_attrs_tmp a
1888 SET a.PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_NEW
1889 WHERE a.LIST_LINE_ID
1890 IN (SELECT b.CREATED_FROM_LIST_LINE_ID
1891 FROM qp_npreq_ldets_tmp b
1892 WHERE b.PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_NEW
1893 AND b.PRICING_PHASE_ID = p_pricing_phase_id
1894 AND b.INCOMPATABILITY_GRP_CODE = p_incomp_grp_id
1895 AND b.CREATED_FROM_LIST_LINE_ID <> p_list_line_id
1896 AND ASK_FOR_FLAG = QP_PREQ_GRP.G_NO
1897 AND b.CREATED_FROM_LIST_LINE_TYPE IN (QP_PREQ_GRP.G_DISCOUNT,QP_PREQ_GRP.G_SURCHARGE)
1898 AND b.LINE_INDEX = p_line_index)
1899 AND a.LINE_INDEX = p_line_index; */
1900
1901 ELSE
1902 /*
1903 INDX,QP_Resolve_Incompatability_PVTRUN.delete_incompatible_lines.upd3,qp_npreq_ldets_tmp_N1,LINE_INDEX,1
1904 INDX,QP_Resolve_Incompatability_PVTRUN.delete_incompatible_lines.upd3,qp_npreq_ldets_tmp_N1,PRICING_STATUS_CODE,2
1905 INDX,QP_Resolve_Incompatability_PVTRUN.delete_incompatible_lines.upd3,qp_npreq_ldets_tmp_N1,PRICING_PHASE_ID,3
1906 */
1907
1908 UPDATE qp_npreq_ldets_tmp --upd3
1909 SET PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_INCOMP_LOGIC
1910 WHERE LINE_INDEX = p_line_index
1911 AND PRICING_PHASE_ID = p_pricing_phase_id
1912 AND CREATED_FROM_LIST_LINE_ID <> p_list_line_id
1913 AND CREATED_FROM_LIST_LINE_TYPE NOT IN (QP_PREQ_GRP.G_DISCOUNT,QP_PREQ_GRP.G_SURCHARGE)
1914 AND LINE_DETAIL_TYPE_CODE <> QP_PREQ_GRP.G_CHILD_DETAIL_TYPE -- Don't delete PBH Children any time
1915 AND PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_NEW;
1916
1917 /*
1918 INDX,QP_Resolve_Incompatability_PVTRUN.delete_incompatible_lines.upd4,qp_npreq_ldets_tmp_N3,LINE_INDEX,1
1919 INDX,QP_Resolve_Incompatability_PVTRUN.delete_incompatible_lines.upd4,qp_npreq_ldets_tmp_N3,PRICING_PHASE_ID,2
1920 INDX,QP_Resolve_Incompatability_PVTRUN.delete_incompatible_lines.upd4,qp_npreq_ldets_tmp_N3,ASK_FOR_FLAG,3
1921 INDX,QP_Resolve_Incompatability_PVTRUN.delete_incompatible_lines.upd4,qp_npreq_ldets_tmp_N3,CREATED_FROM_LIST_LINE_TYPE,4
1922 INDX,QP_Resolve_Incompatability_PVTRUN.delete_incompatible_lines.upd4,qp_npreq_ldets_tmp_N3,PRICING_STATUS_CODE,5
1923 */
1924
1925
1926 UPDATE qp_npreq_ldets_tmp --upd4
1927 SET PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_NEW,
1928 AUTOMATIC_FLAG = QP_PREQ_GRP.G_NO,
1929 APPLIED_FLAG = QP_PREQ_GRP.G_NO
1930 WHERE LINE_INDEX = p_line_index
1931 AND PRICING_PHASE_ID = p_pricing_phase_id
1932 AND CREATED_FROM_LIST_LINE_ID <> p_list_line_id
1933 AND ASK_FOR_FLAG = QP_PREQ_GRP.G_NO
1934 AND CREATED_FROM_LIST_LINE_TYPE IN (QP_PREQ_GRP.G_DISCOUNT,QP_PREQ_GRP.G_SURCHARGE)
1935 AND LINE_DETAIL_TYPE_CODE <> QP_PREQ_GRP.G_CHILD_DETAIL_TYPE -- Don't delete PBH Children any time
1936 AND PRICING_STATUS_CODE IN (QP_PREQ_GRP.G_STATUS_NEW,QP_PREQ_GRP.G_STATUS_BEST_PRICE_EVAL);
1937
1938 /* UPDATE qp_npreq_line_attrs_tmp a
1939 SET a.PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_NEW
1940 WHERE a.LIST_LINE_ID
1941 IN (SELECT b.CREATED_FROM_LIST_LINE_ID
1942 FROM qp_npreq_ldets_tmp b
1943 WHERE b.PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_NEW
1944 AND b.PRICING_PHASE_ID = p_pricing_phase_id
1945 AND b.INCOMPATABILITY_GRP_CODE = p_incomp_grp_id
1946 AND b.CREATED_FROM_LIST_LINE_ID <> p_list_line_id
1947 AND ASK_FOR_FLAG = QP_PREQ_GRP.G_NO
1948 AND b.CREATED_FROM_LIST_LINE_TYPE IN (QP_PREQ_GRP.G_DISCOUNT,QP_PREQ_GRP.G_SURCHARGE)
1949 AND b.LINE_INDEX = p_line_index)
1950 AND a.LINE_INDEX = p_line_index; */
1951
1952 END IF; --p_exclusive_discount = TRUE
1953 ELSE -- Automatic discounts
1954 IF (p_excl_discount = FALSE) THEN
1955
1956 /*
1957 INDX,QP_Resolve_Incompatability_PVTRUN.delete_incompatible_lines.upd5,qp_npreq_ldets_tmp_N1,LINE_INDEX,1
1958 INDX,QP_Resolve_Incompatability_PVTRUN.delete_incompatible_lines.upd5,qp_npreq_ldets_tmp_N1,PRICING_STATUS_CODE,2
1959 INDX,QP_Resolve_Incompatability_PVTRUN.delete_incompatible_lines.upd5,qp_npreq_ldets_tmp_N1,PRICING_PHASE_ID,3
1960 */
1961
1962 UPDATE qp_npreq_ldets_tmp --upd5
1963 SET PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_INCOMP_LOGIC
1964 WHERE INCOMPATABILITY_GRP_CODE = p_incomp_grp_id
1965 AND LINE_INDEX = p_line_index
1966 AND PRICING_PHASE_ID = p_pricing_phase_id
1967 AND CREATED_FROM_LIST_LINE_ID <> p_list_line_id
1968 AND LINE_DETAIL_TYPE_CODE <> QP_PREQ_GRP.G_CHILD_DETAIL_TYPE -- Don't delete PBH Children any time
1969 AND PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_NEW;
1970 ELSE
1971 UPDATE qp_npreq_ldets_tmp
1972 SET PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_INCOMP_LOGIC
1973 WHERE LINE_INDEX = p_line_index
1974 AND PRICING_PHASE_ID = p_pricing_phase_id
1975 AND CREATED_FROM_LIST_LINE_ID <> p_list_line_id
1976 AND LINE_DETAIL_TYPE_CODE <> QP_PREQ_GRP.G_CHILD_DETAIL_TYPE -- Don't delete PBH Children any time
1977 AND PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_NEW;
1978 END IF; -- p_exclusive_discount = FALSE
1979 END IF;
1980
1981 IF (p_excl_discount = FALSE) THEN
1982
1983 IF l_debug = FND_API.G_TRUE THEN
1984 QP_PREQ_GRP.engine_debug('Checking for PRG/OID losers in incompatibility group '||p_incomp_grp_id);
1985 END IF;
1986
1987 -- [prarasto/4141235] delete loser prg/oid lines/ldets/attrs/rltd
1988 --frontported fix done in 41340888
1989 OPEN l_del_prg_lines_grp_cur;
1990 FETCH l_del_prg_lines_grp_cur
1991 BULK COLLECT INTO l_del_index_tbl;
1992 CLOSE l_del_prg_lines_grp_cur;
1993
1994 IF (l_del_index_tbl.count > 0) THEN
1995 Delete_Lines_Complete(l_del_index_tbl, 'PRG DELETED BY INCOMPATIBILITY LOGIC', l_status_code, l_status_text);
1996 END IF;
1997
1998 -- [prarasto/4141235] delete loser oid ldets/rltd
1999 --frontported fix done in 41340888
2000 OPEN l_del_oid_ldets_grp_cur;
2001 FETCH l_del_oid_ldets_grp_cur
2002 BULK COLLECT INTO l_del_index_tbl;
2003 CLOSE l_del_oid_ldets_grp_cur;
2004
2005 IF (l_del_index_tbl.count > 0) THEN
2006 Delete_Ldets_Complete(l_del_index_tbl, 'OID DELETED BY INCOMPATIBILITY LOGIC', l_status_code, l_status_text);
2007 END IF;
2008
2009 ELSE
2010
2011 IF l_debug = FND_API.G_TRUE THEN
2012 QP_PREQ_GRP.engine_debug('Checking for PRG/OID losers to exclusive group line' );
2013 END IF;
2014
2015 -- [prarasto/4141235] delete loser prg/oid lines/ldets/attrs/rltd, exclusive winner
2016 --frontported fix done in 41340888
2017 OPEN l_del_prg_lines_excl_cur;
2018 FETCH l_del_prg_lines_excl_cur
2019 BULK COLLECT INTO l_del_index_tbl;
2020 CLOSE l_del_prg_lines_excl_cur;
2021
2022 IF (l_del_index_tbl.count > 0) THEN
2023 Delete_Lines_Complete(l_del_index_tbl, 'PRG DELETED BY INCOMPATIBILITY LOGIC', l_status_code, l_status_text);
2024 END IF;
2025
2026 -- [prarasto/4141235] delete loser oid ldets/rltd, exclusive winner
2027 --frontported fix done in 41340888
2028 OPEN l_del_oid_ldets_excl_cur;
2029 FETCH l_del_oid_ldets_excl_cur
2030 BULK COLLECT INTO l_del_index_tbl;
2031 CLOSE l_del_oid_ldets_excl_cur;
2032
2033 IF (l_del_index_tbl.count > 0) THEN
2034 Delete_Ldets_Complete(l_del_index_tbl, 'OID DELETED BY INCOMPATIBILITY LOGIC', l_status_code, l_status_text);
2035 END IF;
2036
2037 END IF;
2038
2039 x_return_status := v_return_status;
2040 EXCEPTION
2041 WHEN OTHERS THEN
2042 IF l_debug = FND_API.G_TRUE THEN
2043 QP_PREQ_GRP.engine_debug(v_routine_name || ' ' || SQLERRM);
2044 END IF;
2045 v_return_status := FND_API.G_RET_STS_ERROR;
2046 x_return_status := v_return_status;
2047 END Delete_Incompatible_Lines;
2048
2049 PROCEDURE Best_Price_For_Phase(p_list_price NUMBER,
2050 p_line_index NUMBER,
2051 p_pricing_phase_id NUMBER,
2052 x_return_status OUT NOCOPY VARCHAR2,
2053 x_return_status_txt OUT NOCOPY VARCHAR2) AS
2054 -- Index Certificate
2055
2056 /*
2057 INDX,QP_Resolve_Incompatability_PVTRUN.best_price_for_phase.incomp_cur,qp_npreq_ldets_tmp_N1,LINE_INDEX,1
2058 INDX,QP_Resolve_Incompatability_PVTRUN.best_price_for_phase.incomp_cur,qp_npreq_ldets_tmp_N1,PRICING_STATUS_CODE,2
2059 INDX,QP_Resolve_Incompatability_PVTRUN.best_price_for_phase.incomp_cur,qp_npreq_ldets_tmp_N1,PRICING_PHASE_ID,3
2060 */
2061
2062 CURSOR incomp_cur(p_manual_dis_flag VARCHAR2) IS
2063 SELECT DISTINCT INCOMPATABILITY_GRP_CODE
2064 FROM qp_npreq_ldets_tmp
2065 WHERE PRICING_PHASE_ID = p_pricing_phase_id
2066 AND INCOMPATABILITY_GRP_CODE IS NOT NULL
2067 AND LINE_INDEX = p_line_index
2068 AND ((AUTOMATIC_FLAG = QP_PREQ_GRP.G_YES AND p_manual_dis_flag = QP_PREQ_GRP.G_YES) OR
2069 p_manual_dis_flag = QP_PREQ_GRP.G_NO)
2070 AND PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_NEW;
2071
2072
2073 x_list_line_id NUMBER;
2074 v_return_status VARCHAR2(30) := FND_API.G_RET_STS_SUCCESS;
2075 x_ret_status VARCHAR2(30);
2076 v_excl_flag BOOLEAN := FALSE;
2077 v_manual_dis_flag VARCHAR2(1) := nvl(QP_PREQ_GRP.G_MANUAL_DISCOUNT_FLAG,'Y');
2078
2079 INVALID_BEST_PRICE EXCEPTION;
2080
2081 v_routine_name CONSTANT VARCHAR2(240) := 'Routine:QP_Resolve_Incompatability_PVTRUN.Best_Price_For_Phase';
2082
2083 BEGIN
2084 l_debug := QP_PREQ_GRP.G_DEBUG_ENGINE;
2085
2086 --[julin/4116856] moved deletion of un-asked-for promotions to QP_PREQ_GRP
2087
2088 /* UPDATE qp_npreq_line_attrs_tmp a
2089 SET a.PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_BEST_PRICE_EVAL
2090 WHERE a.LIST_LINE_ID IN (SELECT b.CREATED_FROM_LIST_LINE_ID
2091 FROM qp_npreq_ldets_tmp b
2092 WHERE b.PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_BEST_PRICE_EVAL
2093 AND b.PRICING_PHASE_ID = p_pricing_phase_id
2094 AND b.ASK_FOR_FLAG = QP_PREQ_GRP.G_YES
2095 AND b.LINE_INDEX = p_line_index)
2096 AND a.LINE_INDEX = p_line_index; */
2097
2098 FOR i IN incomp_cur(v_manual_dis_flag)
2099 LOOP
2100 IF (v_excl_flag = FALSE) THEN
2101 -- Best Price Evaluation
2102 IF l_debug = FND_API.G_TRUE THEN
2103 QP_PREQ_GRP.engine_debug('Best Price For Phase .....');
2104 END IF;
2105 Best_Price_Evaluation(p_list_price,
2106 p_line_index,
2107 p_pricing_phase_id,
2108 i.INCOMPATABILITY_GRP_CODE,
2109 NULL, -- Added for bug#2661540
2110 v_manual_dis_flag,
2111 x_list_line_id,
2112 x_ret_status);
2113 IF (x_ret_status = FND_API.G_RET_STS_ERROR) THEN
2114 RAISE INVALID_BEST_PRICE;
2115 END IF;
2116 END IF;
2117 -- Incomp_grp_id ='EXCL' has the highest priority(exclusivity)
2118 IF (i.INCOMPATABILITY_GRP_CODE = QP_PREQ_GRP.G_INCOMP_EXCLUSIVE) THEN
2119 v_excl_flag := TRUE;
2120 END IF;
2121 IF (v_excl_flag = FALSE) THEN
2122 Delete_Incompatible_Lines(p_pricing_phase_id,
2123 p_line_index,
2124 i.INCOMPATABILITY_GRP_CODE,
2125 x_list_line_id,
2126 v_excl_flag,
2127 v_manual_dis_flag,
2128 x_ret_status);
2129
2130 END IF;
2131 END LOOP;
2132 IF(v_excl_flag = TRUE) THEN
2133 Delete_Incompatible_Lines(p_pricing_phase_id,
2134 p_line_index,
2135 NULL, -- incomp_grp_id
2136 x_list_line_id,
2137 v_excl_flag,
2138 v_manual_dis_flag,
2139 x_ret_status);
2140
2141 END IF;
2142 EXCEPTION
2143 WHEN INVALID_BEST_PRICE THEN
2144 IF l_debug = FND_API.G_TRUE THEN
2145 QP_PREQ_GRP.engine_debug(v_routine_name || ' ' || SQLERRM);
2146 END IF;
2147 x_return_status_txt := v_routine_name || ' ' || SQLERRM;
2148 v_return_status := QP_PREQ_GRP.G_STATUS_BEST_PRICE_EVAL_ERROR;
2149 x_return_status := v_return_status;
2150 WHEN OTHERS THEN
2151 IF l_debug = FND_API.G_TRUE THEN
2152 QP_PREQ_GRP.engine_debug(v_routine_name || 'Unexpected Error');
2153 QP_PREQ_GRP.engine_debug(v_routine_name || ' ' || SQLERRM);
2154 END IF;
2155 v_return_status := FND_API.G_RET_STS_ERROR;
2156 x_return_status := v_return_status;
2157 END Best_Price_For_Phase;
2158
2159 PROCEDURE Resolve_Incompatability(p_pricing_phase_id NUMBER,
2160 p_processing_flag VARCHAR2,
2161 p_list_price NUMBER,
2162 p_line_index NUMBER,
2163 x_return_status OUT NOCOPY VARCHAR2,
2164 x_return_status_txt OUT NOCOPY VARCHAR2) AS
2165
2166 -- Index Certificate
2167
2168 /*
2169 INDX,QP_Resolve_Incompatability_PVTRUN.resolve_incompatability.incomp_cur,qp_npreq_ldets_tmp_N1,LINE_INDEX,1
2170 INDX,QP_Resolve_Incompatability_PVTRUN.resolve_incompatability.incomp_cur,qp_npreq_ldets_tmp_N1,PRICING_STATUS_CODE,2
2171 INDX,QP_Resolve_Incompatability_PVTRUN.resolve_incompatability.incomp_cur,qp_npreq_ldets_tmp_N1,PRICING_PHASE_ID,3
2172 */
2173
2174 CURSOR incomp_cur(l_manual_dis_flag VARCHAR2) IS
2175 SELECT DISTINCT INCOMPATABILITY_GRP_CODE , PRICING_STATUS_CODE
2176 FROM qp_npreq_ldets_tmp
2177 WHERE PRICING_PHASE_ID = p_pricing_phase_id
2178 AND INCOMPATABILITY_GRP_CODE IS NOT NULL
2179 AND PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_NEW
2180 AND ((AUTOMATIC_FLAG = QP_PREQ_GRP.G_YES AND l_manual_dis_flag = QP_PREQ_GRP.G_YES) OR
2181 l_manual_dis_flag = QP_PREQ_GRP.G_NO)
2182 AND LINE_INDEX = p_line_index;
2183
2184 /*
2185 INDX,QP_Resolve_Incompatability_PVTRUN.resolve_incompatability.each_incomp_cur,qp_npreq_ldets_tmp_N3,LINE_INDEX,1
2186 INDX,QP_Resolve_Incompatability_PVTRUN.resolve_incompatability.each_incomp_cur,qp_npreq_ldets_tmp_N3,PRICING_PHASE_ID,2
2187 INDX,QP_Resolve_Incompatability_PVTRUN.resolve_incompatability.each_incomp_cur,qp_npreq_ldets_tmp_N3,ASK_FOR_FLAG,3
2188
2189 INDX,QP_Resolve_Incompatability_PVTRUN.resolve_incompatability.each_incomp_cur,qp_npreq_line_attrs_tmp_N2,PRICING_STATUS_CODE,1
2190 INDX,QP_Resolve_Incompatability_PVTRUN.resolve_incompatability.each_incomp_cur,qp_npreq_line_attrs_tmp_N2,ATTRIBUTE_TYPE,2
2191 INDX,QP_Resolve_Incompatability_PVTRUN.resolve_incompatability.each_incomp_cur,qp_npreq_line_attrs_tmp_N2,CONTEXT,3
2192 INDX,QP_Resolve_Incompatability_PVTRUN.resolve_incompatability.each_incomp_cur,qp_npreq_line_attrs_tmp_N2,ATTRIBUTE,4
2193 INDX,QP_Resolve_Incompatability_PVTRUN.resolve_incompatability.each_incomp_cur,qp_npreq_line_attrs_tmp_N2,LINE_INDEX,5
2194 INDX,QP_Resolve_Incompatability_PVTRUN.resolve_incompatability.each_incomp_cur,qp_npreq_line_attrs_tmp_N2,VALUE_FROM,6
2195 */
2196
2197 --UNION
2198
2199 /*
2200 INDX,QP_Resolve_Incompatability_PVTRUN.resolve_incompatability.each_incomp_cur,qp_npreq_ldets_tmp_N3,LINE_INDEX,1
2201 INDX,QP_Resolve_Incompatability_PVTRUN.resolve_incompatability.each_incomp_cur,qp_npreq_ldets_tmp_N3,PRICING_PHASE_ID,2
2202 INDX,QP_Resolve_Incompatability_PVTRUN.resolve_incompatability.each_incomp_cur,qp_npreq_ldets_tmp_N3,ASK_FOR_FLAG,3
2203 */
2204
2205 CURSOR each_incomp_cur(p_incomp_grp_id VARCHAR2,l_manual_dis_flag VARCHAR2) IS
2206 SELECT a.CREATED_FROM_LIST_HEADER_ID,a.CREATED_FROM_LIST_LINE_ID,a.INCOMPATABILITY_GRP_CODE,a.ASK_FOR_FLAG
2207 FROM qp_npreq_ldets_tmp a
2208 WHERE EXISTS (SELECT 'X'
2209 FROM qp_npreq_line_attrs_tmp b
2210 WHERE a.LINE_INDEX = b.LINE_INDEX
2211 AND b.ATTRIBUTE_TYPE = QP_PREQ_GRP.G_QUALIFIER_TYPE
2212 AND b.PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_UNCHANGED
2213 AND b.ATTRIBUTE IN (QP_PREQ_GRP.G_QUAL_ATTRIBUTE1,
2214 QP_PREQ_GRP.G_QUAL_ATTRIBUTE2,
2215 QP_PREQ_GRP.G_QUAL_ATTRIBUTE6)
2216 AND b.CONTEXT = QP_PREQ_GRP.G_LIST_HEADER_CONTEXT
2217 AND b.VALUE_FROM = decode(b.ATTRIBUTE,
2218 QP_PREQ_GRP.G_QUAL_ATTRIBUTE1,to_char(a.CREATED_FROM_LIST_HEADER_ID),
2219 QP_PREQ_GRP.G_QUAL_ATTRIBUTE2,to_char(a.CREATED_FROM_LIST_LINE_ID),
2220 QP_PREQ_GRP.G_QUAL_ATTRIBUTE6,to_char(a.CREATED_FROM_LIST_HEADER_ID)))
2221 AND a.ASK_FOR_FLAG = QP_PREQ_GRP.G_YES
2222 AND a.INCOMPATABILITY_GRP_CODE = p_incomp_grp_id
2223 AND a.PRICING_PHASE_ID = p_pricing_phase_id
2224 AND a.LINE_INDEX = p_line_index
2225 AND a.LINE_DETAIL_TYPE_CODE <> QP_PREQ_GRP.G_CHILD_DETAIL_TYPE
2226 AND a.PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_NEW
2227 AND ((a.AUTOMATIC_FLAG = QP_PREQ_GRP.G_YES AND l_manual_dis_flag = QP_PREQ_GRP.G_YES) OR
2228 l_manual_dis_flag = QP_PREQ_GRP.G_NO)
2229 UNION
2230 SELECT a.CREATED_FROM_LIST_HEADER_ID,a.CREATED_FROM_LIST_LINE_ID,a.INCOMPATABILITY_GRP_CODE,'N' ASK_FOR_FLAG
2231 FROM qp_npreq_ldets_tmp a
2232 WHERE a.ASK_FOR_FLAG = QP_PREQ_GRP.G_NO -- Removed NVL , expect some issues
2233 AND a.INCOMPATABILITY_GRP_CODE = p_incomp_grp_id
2234 AND a.PRICING_PHASE_ID = p_pricing_phase_id
2235 AND a.LINE_INDEX = p_line_index
2236 AND a.LINE_DETAIL_TYPE_CODE <> QP_PREQ_GRP.G_CHILD_DETAIL_TYPE
2237 AND a.PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_NEW
2238 AND ((a.AUTOMATIC_FLAG = QP_PREQ_GRP.G_YES AND l_manual_dis_flag = QP_PREQ_GRP.G_YES) OR
2239 l_manual_dis_flag = QP_PREQ_GRP.G_NO)
2240 ORDER BY 4 desc;
2241
2242 v_this_is_the_list_line_id NUMBER;
2243 v_first_list_line_id NUMBER;
2244 v_count NUMBER:= 0;
2245 v_others_flag BOOLEAN:= TRUE;
2246 v_high_precedence NUMBER;
2247 v_ask_for_flag VARCHAR2(1);
2248 v_excl_flag BOOLEAN := FALSE;
2249 v_excl_list_line_id NUMBER;
2250 x_best_list_line_id NUMBER;
2251 x_ret_status VARCHAR2(30);
2252 v_return_status VARCHAR2(30) := FND_API.G_RET_STS_SUCCESS;
2253 v_routine_name CONSTANT VARCHAR2(240):='Routine:QP_Resolve_Incompatability_PVTRUN.Resolve_Incompatability';
2254 p_manual_dis_flag VARCHAR2(1) := nvl(QP_PREQ_GRP.G_MANUAL_DISCOUNT_FLAG,'Y');
2255 v_ask_for_constant CONSTANT NUMBER := -100000;
2256
2257
2258 l_precedence_tbl precedence_tbl_type;
2259
2260 v_precedence NUMBER;
2261 v_counter NUMBER := 0;
2262
2263 INVALID_INCOMPATIBILITY EXCEPTION;
2264 INVALID_BEST_PRICE EXCEPTION;
2265
2266 BEGIN
2267 l_debug := QP_PREQ_GRP.G_DEBUG_ENGINE;
2268 IF l_debug = FND_API.G_TRUE THEN
2269 QP_PREQ_GRP.engine_debug ('S1');
2270
2271 END IF;
2272
2273 -- [julin/4116856] moved deletion of un-asked-for promotions to QP_PREQ_GRP
2274
2275
2276 /* UPDATE qp_npreq_line_attrs_tmp a
2277 SET a.PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_INCOMP_LOGIC
2278 WHERE a.LIST_LINE_ID IN (SELECT b.CREATED_FROM_LIST_LINE_ID
2279 FROM qp_npreq_ldets_tmp b
2280 WHERE b.PRICING_STATUS_CODE = QP_PREQ_GRP.G_STATUS_INCOMP_LOGIC
2281 AND b.PRICING_PHASE_ID = p_pricing_phase_id
2282 AND b.ASK_FOR_FLAG = QP_PREQ_GRP.G_YES
2283 AND b.LINE_INDEX = p_line_index)
2284 AND a.LINE_INDEX = p_line_index; */
2285
2286
2287 FOR i IN incomp_cur(p_manual_dis_flag)
2288 LOOP
2289 IF l_debug = FND_API.G_TRUE THEN
2290 QP_PREQ_GRP.engine_debug ('#2');
2291
2292 END IF;
2293 l_precedence_tbl.delete;
2294 v_counter := 0;
2295
2296 FOR j IN each_incomp_cur(i.INCOMPATABILITY_GRP_CODE,p_manual_dis_flag)
2297 LOOP
2298 v_precedence := Precedence_For_List_Line(j.CREATED_FROM_LIST_HEADER_ID,j.CREATED_FROM_LIST_LINE_ID,
2299 i.incompatability_grp_code, p_line_index,p_pricing_phase_id);
2300 v_counter := v_counter + 1;
2301 l_precedence_tbl(v_counter).created_from_list_line_id := j.created_from_list_line_id;
2302 l_precedence_tbl(v_counter).incompatability_grp_code := j.incompatability_grp_code;
2303 l_precedence_tbl(v_counter).ask_for_flag := j.ask_for_flag;
2304 l_precedence_tbl(v_counter).original_precedence := v_precedence;
2305 IF (j.ask_for_flag = QP_PREQ_GRP.G_YES) THEN
2306 v_precedence := v_precedence + v_ask_for_constant;
2307 END IF;
2308 l_precedence_tbl(v_counter).product_precedence := v_precedence;
2309 END LOOP;
2310
2311 -- Sort the table
2312 IF (l_precedence_tbl.COUNT > 0 ) THEN
2313 --sort_on_precedence(l_precedence_tbl, l_precedence_tbl.FIRST, l_precedence_tbl.LAST);
2314 sort_on_precedence(l_precedence_tbl);
2315 END IF;
2316
2317 IF (l_precedence_tbl.COUNT > 0) THEN
2318 FOR j IN l_precedence_tbl.FIRST .. l_precedence_tbl.LAST
2319 LOOP
2320 IF l_debug = FND_API.G_TRUE THEN
2321 QP_PREQ_GRP.engine_debug ('#3');
2322
2323 END IF;
2324 -- Store the first list_line_id
2325 IF (v_count = 0) THEN
2326 v_first_list_line_id := l_precedence_tbl(j).CREATED_FROM_LIST_LINE_ID;
2327 IF l_debug = FND_API.G_TRUE THEN
2328 QP_PREQ_GRP.engine_debug('The First List Line Id : ' || v_first_list_line_id);
2329 QP_PREQ_GRP.engine_debug('Pricing Status Code: ' || i.pricing_status_code);
2330 END IF;
2331 v_high_precedence := l_precedence_tbl(j).ORIGINAL_PRECEDENCE;
2332 v_ask_for_flag := l_precedence_tbl(j).ASK_FOR_FLAG;
2333 END IF;
2334 IF l_debug = FND_API.G_TRUE THEN
2335 QP_PREQ_GRP.engine_debug ('#4');
2336
2337 END IF;
2338 -- Incomp_grp_id ='EXCL' has the highest priority(exclusivity)
2339 IF (i.INCOMPATABILITY_GRP_CODE = QP_PREQ_GRP.G_INCOMP_EXCLUSIVE) THEN
2340 IF(v_count = 0) THEN
2341 v_this_is_the_list_line_id := l_precedence_tbl(j).CREATED_FROM_LIST_LINE_ID;
2342 v_excl_list_line_id := l_precedence_tbl(j).CREATED_FROM_LIST_LINE_ID;
2343 --v_others_flag := FALSE;
2344 v_excl_flag := TRUE;
2345 ELSE -- If there are multiple list lines in EXCL incomp
2346 IF (v_others_flag = TRUE) THEN
2347 IF (v_high_precedence = l_precedence_tbl(j).ORIGINAL_PRECEDENCE) THEN
2348 IF ((v_ask_for_flag = QP_PREQ_GRP.G_YES and l_precedence_tbl(j).ASK_FOR_FLAG = QP_PREQ_GRP.G_YES) OR
2349 (v_ask_for_flag = QP_PREQ_GRP.G_NO and l_precedence_tbl(j).ASK_FOR_FLAG = QP_PREQ_GRP.G_NO)) THEN
2350 -- Best Price Evaluation
2351 IF (p_processing_flag = QP_PREQ_GRP.G_DISCOUNT_PROCESSING) THEN
2352 IF l_debug = FND_API.G_TRUE THEN
2353 QP_PREQ_GRP.engine_debug ('Best Price Evaluation');
2354 END IF;
2355 IF (p_list_price IS NOT NULL) THEN
2356 Best_Price_Evaluation(p_list_price,
2357 p_line_index,
2358 p_pricing_phase_id,
2359 i.INCOMPATABILITY_GRP_CODE,
2360 v_high_precedence, -- Added for bug#2661540
2361 p_manual_dis_flag,
2362 x_best_list_line_id,
2363 x_ret_status);
2364 IF l_debug = FND_API.G_TRUE THEN
2365 QP_PREQ_GRP.engine_debug('Successful Best Price Eval');
2366 END IF;
2367 IF x_ret_status in (QP_PREQ_GRP.G_STATUS_BEST_PRICE_EVAL_ERROR,FND_API.G_RET_STS_ERROR) THEN
2368 RAISE INVALID_BEST_PRICE;
2369 END IF;
2370 v_this_is_the_list_line_id := x_best_list_line_id;
2371 v_excl_list_line_id := x_best_list_line_id;
2372 v_others_flag := FALSE;
2373 END IF;
2374 END IF;
2375 ELSIF (v_ask_for_flag=QP_PREQ_GRP.G_NO and l_precedence_tbl(j).ASK_FOR_FLAG = QP_PREQ_GRP.G_YES) THEN
2376 v_this_is_the_list_line_id := l_precedence_tbl(j).CREATED_FROM_LIST_LINE_ID;
2377 v_excl_list_line_id := l_precedence_tbl(j).CREATED_FROM_LIST_LINE_ID;
2378 v_others_flag := FALSE;
2379 END IF;
2380 ELSE
2381 IF (v_ask_for_flag = QP_PREQ_GRP.G_NO and l_precedence_tbl(j).ASK_FOR_FLAG = QP_PREQ_GRP.G_YES) THEN
2382 v_this_is_the_list_line_id := l_precedence_tbl(j).CREATED_FROM_LIST_LINE_ID;
2383 v_excl_list_line_id := l_precedence_tbl(j).CREATED_FROM_LIST_LINE_ID;
2384 v_others_flag := FALSE;
2385 END IF;
2386 END IF;
2387 END IF;
2388 END IF;
2389 END IF;
2390 IF l_debug = FND_API.G_TRUE THEN
2391 QP_PREQ_GRP.engine_debug ('#5');
2392
2393 END IF;
2394 IF (v_others_flag = TRUE and v_excl_flag = FALSE) THEN
2395 IF l_debug = FND_API.G_TRUE THEN
2396 QP_PREQ_GRP.engine_debug('Others_Flag: TRUE');
2397 END IF;
2398 null;
2399 ELSE
2400 IF l_debug = FND_API.G_TRUE THEN
2401 QP_PREQ_GRP.engine_debug('Others_Flag: FALSE');
2402 END IF;
2403 null;
2404 END IF;
2405 IF l_debug = FND_API.G_TRUE THEN
2406 QP_PREQ_GRP.engine_debug ('#6');
2407 QP_PREQ_GRP.engine_debug('Count: ' || v_count);
2408
2409 END IF;
2410 IF (v_others_flag = TRUE) THEN
2411 -- If it is an asked for promo
2412 IF (v_count > 0) THEN -- Do not compare the first time for the first record
2413 IF l_debug = FND_API.G_TRUE THEN
2414 QP_PREQ_GRP.engine_debug ('Precedence1:' || v_high_precedence);
2415 QP_PREQ_GRP.engine_debug ('Precedence2:' || l_precedence_tbl(j).ORIGINAL_PRECEDENCE);
2416 QP_PREQ_GRP.engine_debug ('Ask_For_Flag1:' || v_ask_for_flag);
2417 QP_PREQ_GRP.engine_debug ('Ask_For_FLag2:' || l_precedence_tbl(j).ASK_FOR_FLAG);
2418 QP_PREQ_GRP.engine_debug ('Second List Line Id:' || l_precedence_tbl(j).CREATED_FROM_LIST_LINE_ID);
2419 QP_PREQ_GRP.engine_debug ('#7');
2420 END IF;
2421 IF (v_high_precedence = l_precedence_tbl(j).ORIGINAL_PRECEDENCE) THEN
2422 IF ((v_ask_for_flag = QP_PREQ_GRP.G_YES and l_precedence_tbl(j).ASK_FOR_FLAG = QP_PREQ_GRP.G_YES) OR
2423 (v_ask_for_flag = QP_PREQ_GRP.G_NO and l_precedence_tbl(j).ASK_FOR_FLAG = QP_PREQ_GRP.G_NO)) THEN
2424 -- Best Price Evaluation
2425 IF (p_processing_flag = QP_PREQ_GRP.G_DISCOUNT_PROCESSING) THEN
2426 IF l_debug = FND_API.G_TRUE THEN
2427 QP_PREQ_GRP.engine_debug ('Best Price Evaluation');
2428 END IF;
2429 IF (p_list_price IS NOT NULL) THEN
2430 Best_Price_Evaluation(p_list_price,
2431 p_line_index,
2432 p_pricing_phase_id,
2433 i.INCOMPATABILITY_GRP_CODE,
2434 v_high_precedence, -- Added for bug#2661540
2435 p_manual_dis_flag,
2436 x_best_list_line_id,
2437 x_ret_status);
2438 IF l_debug = FND_API.G_TRUE THEN
2439 QP_PREQ_GRP.engine_debug('Successful Best Price Eval1');
2440 END IF;
2441 IF x_ret_status in (QP_PREQ_GRP.G_STATUS_BEST_PRICE_EVAL_ERROR,FND_API.G_RET_STS_ERROR) THEN
2442 RAISE INVALID_BEST_PRICE;
2443 END IF;
2444 v_this_is_the_list_line_id := x_best_list_line_id;
2445 v_others_flag := FALSE;
2446 END IF;
2447 ELSE -- PRICE_LIST
2448 RAISE INVALID_INCOMPATIBILITY;
2449 END IF;
2450 ELSIF (v_ask_for_flag=QP_PREQ_GRP.G_NO and l_precedence_tbl(j).ASK_FOR_FLAG = QP_PREQ_GRP.G_YES) THEN
2451 v_this_is_the_list_line_id := l_precedence_tbl(j).CREATED_FROM_LIST_LINE_ID;
2452 v_others_flag := FALSE;
2453 END IF;
2454 ELSE
2455 IF (v_ask_for_flag = QP_PREQ_GRP.G_NO and l_precedence_tbl(j).ASK_FOR_FLAG = QP_PREQ_GRP.G_YES) THEN
2456 v_this_is_the_list_line_id := l_precedence_tbl(j).CREATED_FROM_LIST_LINE_ID;
2457 v_others_flag := FALSE;
2458 END IF;
2459 END IF;
2460 END IF;
2461 END IF;
2462 IF l_debug = FND_API.G_TRUE THEN
2463 QP_PREQ_GRP.engine_debug ('#8');
2464 END IF;
2465 v_count := v_count + 1;
2466 END LOOP;
2467 END IF; -- l_precedence_tbl.COUNT > 0
2468
2469 v_count := 0; -- Reinit to 0 for an incomp grp id
2470 v_others_flag := TRUE;
2471 IF (v_this_is_the_list_line_id IS NOT NULL) THEN
2472 v_first_list_line_id := v_this_is_the_list_line_id;
2473 IF l_debug = FND_API.G_TRUE THEN
2474 QP_PREQ_GRP.engine_debug('The List Line Id : ' || v_first_list_line_id);
2475 END IF;
2476 END IF;
2477 v_this_is_the_list_line_id := null; -- Reset
2478
2479 IF l_debug = FND_API.G_TRUE THEN
2480 QP_PREQ_GRP.engine_debug('Before Update ......');
2481 QP_PREQ_GRP.engine_debug('Incomp Grp Code:' || i.INCOMPATABILITY_GRP_CODE);
2482 QP_PREQ_GRP.engine_debug('List Line Id:' || v_first_list_line_id);
2483 QP_PREQ_GRP.engine_debug('Pricing Phase Id:' || p_pricing_phase_id);
2484 QP_PREQ_GRP.engine_debug ('#9');
2485
2486 END IF;
2487 -- Update all the other list lines to status 'I' for each incomp grp
2488 IF (v_excl_flag = FALSE) THEN
2489 Delete_Incompatible_Lines(p_pricing_phase_id,
2490 p_line_index,
2491 i.INCOMPATABILITY_GRP_CODE,
2492 v_first_list_line_id,
2493 v_excl_flag,
2494 p_manual_dis_flag,
2495 x_ret_status);
2496 END IF;
2497 IF l_debug = FND_API.G_TRUE THEN
2498 QP_PREQ_GRP.engine_debug ('#10');
2499 END IF;
2500 END LOOP;
2501 IF (v_excl_flag = TRUE) THEN
2502 Delete_Incompatible_Lines(p_pricing_phase_id,
2503 p_line_index,
2504 NULL, -- incomp_grp_id
2505 v_excl_list_line_id,
2506 v_excl_flag,
2507 p_manual_dis_flag,
2508 x_ret_status);
2509 END IF;
2510 x_return_status := v_return_status; -- SUCCESS
2511 EXCEPTION
2512 WHEN INVALID_INCOMPATIBILITY THEN
2513 IF l_debug = FND_API.G_TRUE THEN
2514 QP_PREQ_GRP.engine_debug(v_routine_name || ' Multiple Price Lists cannot have same precedence
2515 and cannot be asked for');
2516 END IF;
2517 x_return_status_txt := v_routine_name || ' Multiple Price Lists cannot have same precedence
2518 and cannot be asked for';
2519 v_return_status := QP_PREQ_GRP.G_STATUS_INVALID_INCOMP;
2520 x_return_status := v_return_status;
2521 WHEN INVALID_BEST_PRICE THEN
2522 IF l_debug = FND_API.G_TRUE THEN
2523 QP_PREQ_GRP.engine_debug(v_routine_name || 'Best Price Evaluation Has Error');
2524 END IF;
2525 x_return_status_txt := v_routine_name || 'Best Price Evaluation Has Error';
2526 v_return_status := QP_PREQ_GRP.G_STATUS_BEST_PRICE_EVAL_ERROR;
2527 x_return_status := v_return_status;
2528 WHEN OTHERS THEN
2529 IF l_debug = FND_API.G_TRUE THEN
2530 QP_PREQ_GRP.engine_debug(v_routine_name || ' ' || SQLERRM);
2531 END IF;
2532 x_return_status_txt := v_routine_name || ' ' || SQLERRM;
2533 v_return_status := FND_API.G_RET_STS_ERROR;
2534 x_return_status := v_return_status;
2535 END Resolve_Incompatability;
2536
2537 END QP_Resolve_Incompatability_PVT ;