29: l_operator_name VARCHAR2(80);
30: BEGIN
31: l_debug := QP_PREQ_GRP.G_DEBUG_ENGINE;
32:
33: IF l_debug = FND_API.G_TRUE THEN
34: QP_PREQ_GRP.engine_debug('*** Entering Build_Message_Text ****');
35: QP_PREQ_GRP.engine_debug('Limit Level '||p_limit_level);
36: END IF;
37:
40: select name into l_modifier_name from qp_list_headers_vl
41: where list_header_id = p_List_Header_Id;
42: EXCEPTION
43: when no_data_found then
44: IF l_debug = FND_API.G_TRUE THEN
45: QP_PREQ_GRP.engine_debug('*** list header not found for id ***' || p_List_Header_Id);
46: END IF;
47: END;
48: END IF;
52: select list_line_no into l_list_line_no from qp_list_lines
53: where list_line_id = p_List_Line_Id;
54: EXCEPTION
55: when no_data_found then
56: IF l_debug = FND_API.G_TRUE THEN
57: QP_PREQ_GRP.engine_debug('*** list line not found for id ***' || p_List_Line_Id);
58: END IF;
59: END;
60: END IF;
63: select limit_number into l_limit_number from qp_limits
64: where limit_id = p_Limit_Id;
65: EXCEPTION
66: when no_data_found then
67: IF l_debug = FND_API.G_TRUE THEN
68: QP_PREQ_GRP.engine_debug('*** limit not found for id ***'||p_Limit_Id);
69: END IF;
70: END;
71:
73: select meaning into l_operator_name from qp_lookups
74: where LOOKUP_TYPE = 'ARITHMETIC_OPERATOR' and lookup_code = p_operand_calculation_code;
75: EXCEPTION
76: when no_data_found then
77: IF l_debug = FND_API.G_TRUE THEN
78: QP_PREQ_GRP.engine_debug('*** lookup code found ***');
79: END IF;
80: END;
81:
78: QP_PREQ_GRP.engine_debug('*** lookup code found ***');
79: END IF;
80: END;
81:
82: IF l_debug = FND_API.G_TRUE THEN
83: QP_PREQ_GRP.engine_debug('######INSIDE BUILD_MESSAGE_TEXT######- ARITHMETIC_OPERATOR ' || p_operand_calculation_code);
84:
85: QP_PREQ_GRP.engine_debug('######INSIDE BUILD_MESSAGE_TEXT######- ARITHMETIC_OPERATOR ' || l_operator_name);
86:
125: END IF;
126:
127: p_message_text := l_message_text;
128:
129: IF l_debug = FND_API.G_TRUE THEN
130: QP_PREQ_GRP.engine_debug('*** Leaving Build_Message_Text ****');
131: END IF;
132:
133: END Build_Message_Text;
144: l_return_status VARCHAR2(1);
145:
146: BEGIN
147: l_debug := QP_PREQ_GRP.G_DEBUG_ENGINE;
148: IF l_debug = FND_API.G_TRUE THEN
149: QP_PREQ_GRP.engine_debug('------------------------');
150: QP_PREQ_GRP.engine_debug('***Begin Update_Balance***');
151:
152: END IF;
154:
155: --Get the minimum available_percent across all limitbalances for a given line
156: FOR i IN g_limit_balance_line.FIRST..g_limit_balance_line.LAST
157: LOOP
158: IF l_debug = FND_API.G_TRUE THEN
159: QP_PREQ_GRP.engine_debug('Processing g_limit_balance_line ' || i);
160:
161: END IF;
162: IF g_limit_balance_line(i).hard_limit_exceeded THEN
159: QP_PREQ_GRP.engine_debug('Processing g_limit_balance_line ' || i);
160:
161: END IF;
162: IF g_limit_balance_line(i).hard_limit_exceeded THEN
163: IF l_debug = FND_API.G_TRUE THEN
164: QP_PREQ_GRP.engine_debug('Hard Limit with 0 balance encountered. ' ||
165: 'Deleting all Balance lines for current list_line_id. ');
166: END IF;
167: g_limit_balance_line.DELETE; -- No need to process balances further
164: QP_PREQ_GRP.engine_debug('Hard Limit with 0 balance encountered. ' ||
165: 'Deleting all Balance lines for current list_line_id. ');
166: END IF;
167: g_limit_balance_line.DELETE; -- No need to process balances further
168: l_return_status := FND_API.G_RET_STS_SUCCESS;
169: RETURN l_return_status;
170: --without updating any of the limits for current list_line_id
171: END IF;
172:
170: --without updating any of the limits for current list_line_id
171: END IF;
172:
173: l_percent := least(l_percent, g_limit_balance_line(i).available_percent);
174: IF l_debug = FND_API.G_TRUE THEN
175: QP_PREQ_GRP.engine_debug('least percent so far' || l_percent);
176: END IF;
177: END LOOP;
178:
178:
179: --Perform Update or Insert into qp_limit_balances as required.
180: FOR i IN g_limit_balance_line.FIRST..g_limit_balance_line.LAST
181: LOOP
182: IF l_debug = FND_API.G_TRUE THEN
183: QP_PREQ_GRP.engine_debug('Processing limit '||g_limit_balance_line(i).limit_id);
184:
185: QP_PREQ_GRP.engine_debug('Limit Level Code '||
186: g_limit_balance_line(i).limit_level_code);
214:
215: l_given_amount := round((l_percent/100) * g_limit_balance_line(i).wanted_amount,2);
216:
217: IF g_limit_balance_line(i).process_action = g_update THEN
218: IF l_debug = FND_API.G_TRUE THEN
219: QP_PREQ_GRP.engine_debug('Update Required');
220:
221: END IF;
222: IF g_limit_balance_line(i).limit_level_code = 'ACROSS_TRANSACTION' THEN
282: END IF; --If limit_level_code = 'ACROSS_TRANSACTION'
283:
284: --Calculated Limit Balance no longer available. Raise error.
285: IF SQL%ROWCOUNT = 0 THEN
286: IF l_debug = FND_API.G_TRUE THEN
287: QP_PREQ_GRP.engine_debug('Balance no longer available ');
288: END IF;
289: RAISE E_BALANCE_NOT_AVAILABLE;
290: END IF;
289: RAISE E_BALANCE_NOT_AVAILABLE;
290: END IF;
291:
292: ELSIF g_limit_balance_line(i).process_action = g_insert THEN
293: IF l_debug = FND_API.G_TRUE THEN
294: QP_PREQ_GRP.engine_debug('Insert Required');
295:
296: QP_PREQ_GRP.engine_debug('given_amount '|| l_given_amount);
297: QP_PREQ_GRP.engine_debug('transaction_amount '||
352: );
353:
354: END IF;
355:
356: IF l_debug = FND_API.G_TRUE THEN
357: QP_PREQ_GRP.engine_debug('amount given'||l_given_amount);
358: END IF;
359: g_limit_balance_line(i).given_amount := l_given_amount;
360: g_limit_balance_line(i).least_percent := l_percent;
391: END IF; --g_limit_balance_line.COUNT > 0
392:
393: COMMIT;
394:
395: IF l_debug = FND_API.G_TRUE THEN
396: QP_PREQ_GRP.engine_debug('***End Update_Balance***');
397: QP_PREQ_GRP.engine_debug('------------------------');
398:
399: END IF;
396: QP_PREQ_GRP.engine_debug('***End Update_Balance***');
397: QP_PREQ_GRP.engine_debug('------------------------');
398:
399: END IF;
400: l_return_status := FND_API.G_RET_STS_SUCCESS;
401: x_return_text := 'Success';
402:
403: RETURN l_return_status;
404:
403: RETURN l_return_status;
404:
405: EXCEPTION
406: WHEN DUP_VAL_ON_INDEX THEN
407: IF l_debug = FND_API.G_TRUE THEN
408: QP_PREQ_GRP.engine_debug('Insert Failed with Duplicate Value on Index');
409: END IF;
410: l_return_status := FND_API.G_RET_STS_ERROR;
411: x_return_text := 'Insert Failed with Duplicate Value on Index error ' ||
406: WHEN DUP_VAL_ON_INDEX THEN
407: IF l_debug = FND_API.G_TRUE THEN
408: QP_PREQ_GRP.engine_debug('Insert Failed with Duplicate Value on Index');
409: END IF;
410: l_return_status := FND_API.G_RET_STS_ERROR;
411: x_return_text := 'Insert Failed with Duplicate Value on Index error ' ||
412: 'in procedure Update_Balance';
413: ROLLBACK;
414: RETURN l_return_status;
413: ROLLBACK;
414: RETURN l_return_status;
415:
416: WHEN E_BALANCE_NOT_AVAILABLE THEN
417: IF l_debug = FND_API.G_TRUE THEN
418: QP_PREQ_GRP.engine_debug('Limit Balance no longer available.Update Failed.');
419: END IF;
420: l_return_status := FND_API.G_RET_STS_ERROR;
421: x_return_text := 'Update Failed in procedure Update_Balance because ' ||
416: WHEN E_BALANCE_NOT_AVAILABLE THEN
417: IF l_debug = FND_API.G_TRUE THEN
418: QP_PREQ_GRP.engine_debug('Limit Balance no longer available.Update Failed.');
419: END IF;
420: l_return_status := FND_API.G_RET_STS_ERROR;
421: x_return_text := 'Update Failed in procedure Update_Balance because ' ||
422: 'Limit Balance no longer available';
423: ROLLBACK;
424: RETURN l_return_status;
423: ROLLBACK;
424: RETURN l_return_status;
425:
426: WHEN OTHERS THEN
427: IF l_debug = FND_API.G_TRUE THEN
428: QP_PREQ_GRP.engine_debug('Other Exception in Update_Balance');
429: QP_PREQ_GRP.engine_debug(substr(sqlerrm, 1, 240));
430: END IF;
431: l_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
427: IF l_debug = FND_API.G_TRUE THEN
428: QP_PREQ_GRP.engine_debug('Other Exception in Update_Balance');
429: QP_PREQ_GRP.engine_debug(substr(sqlerrm, 1, 240));
430: END IF;
431: l_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
432: x_return_text := substr(sqlerrm, 1, 2000);
433: ROLLBACK;
434: RETURN l_return_status;
435:
452: l_debug := QP_PREQ_GRP.G_DEBUG_ENGINE;
453: --Increment the recheck loop count everytime the Function is entered.
454: G_LOOP_COUNT := G_LOOP_COUNT + 1;
455:
456: IF l_debug = FND_API.G_TRUE THEN
457: QP_PREQ_GRP.engine_debug('***Begin Recheck_Balance***');
458:
459: END IF;
460: IF g_limit_balance_line.COUNT > 0 THEN
461:
462: FOR i IN g_limit_balance_line.FIRST..g_limit_balance_line.LAST
463: LOOP
464: IF g_limit_balance_line(i).each_attr_exists = 'N' THEN
465: IF l_debug = FND_API.G_TRUE THEN
466: QP_PREQ_GRP.engine_debug('Each attr does not exist');
467: END IF;
468: BEGIN
469:
497: l_full_available_amount := g_limit_balance_line(i).limit_amount;
498: g_limit_balance_line(i).process_action := g_insert;
499:
500: WHEN TOO_MANY_ROWS THEN
501: IF l_debug = FND_API.G_TRUE THEN
502: QP_PREQ_GRP.engine_debug(substr(sqlerrm, 1, 240));
503:
504: END IF;
505: IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_ERROR)
530: WHERE line_index = g_limit_balance_line(i).line_index
531: AND created_from_list_line_id =
532: g_limit_balance_line(i).list_line_id;
533:
534: IF l_debug = FND_API.G_TRUE THEN
535: QP_PREQ_GRP.engine_debug(l_message);
536:
537: END IF;
538: END IF;
542: g_limit_balance_line(i).hard_limit_exceeded := TRUE;
543: RAISE;
544:
545: WHEN OTHERS THEN
546: IF l_debug = FND_API.G_TRUE THEN
547: QP_PREQ_GRP.engine_debug(substr(sqlerrm, 1, 240));
548:
549: END IF;
550: IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_ERROR)
574: WHERE line_index = g_limit_balance_line(i).line_index
575: AND created_from_list_line_id =
576: g_limit_balance_line(i).list_line_id;
577:
578: IF l_debug = FND_API.G_TRUE THEN
579: QP_PREQ_GRP.engine_debug(l_message);
580:
581: END IF;
582: END IF;
588:
589: END;--End of Block around Select Stmt when limit does not have each attrs
590:
591: ELSIF g_limit_balance_line(i).each_attr_exists = 'Y' THEN
592: IF l_debug = FND_API.G_TRUE THEN
593: QP_PREQ_GRP.engine_debug('Each attr exists');
594: END IF;
595: BEGIN
596:
624: l_full_available_amount := g_limit_balance_line(i).limit_amount;
625: g_limit_balance_line(i).process_action := g_insert;
626:
627: WHEN TOO_MANY_ROWS THEN
628: IF l_debug = FND_API.G_TRUE THEN
629: QP_PREQ_GRP.engine_debug(substr(sqlerrm, 1, 240));
630:
631: END IF;
632: IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_ERROR)
657: WHERE line_index = g_limit_balance_line(i).line_index
658: AND created_from_list_line_id =
659: g_limit_balance_line(i).list_line_id;
660:
661: IF l_debug = FND_API.G_TRUE THEN
662: QP_PREQ_GRP.engine_debug(l_message);
663:
664: END IF;
665: END IF;
669: g_limit_balance_line(i).hard_limit_exceeded := TRUE;
670: RAISE;
671:
672: WHEN OTHERS THEN
673: IF l_debug = FND_API.G_TRUE THEN
674: QP_PREQ_GRP.engine_debug(substr(sqlerrm, 1, 240));
675:
676: END IF;
677: IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_ERROR)
701: WHERE line_index = g_limit_balance_line(i).line_index
702: AND created_from_list_line_id =
703: g_limit_balance_line(i).list_line_id;
704:
705: IF l_debug = FND_API.G_TRUE THEN
706: QP_PREQ_GRP.engine_debug(l_message);
707:
708: END IF;
709: END IF;
716: END;--End of Block around Select Stmt when limit has each attrs
717:
718: END IF; --If each_attr_exists
719:
720: IF l_debug = FND_API.G_TRUE THEN
721: QP_PREQ_GRP.engine_debug('Action to take '||g_limit_balance_line(i).process_action);
722:
723: END IF;
724: --Check the Limit Transaction Table to see if the same request has a
813: END LOOP; --over the g_limit_balance_lines
814:
815: END IF; --g_limit_balance_line.COUNT > 0
816:
817: IF l_debug = FND_API.G_TRUE THEN
818: QP_PREQ_GRP.engine_debug('***End Recheck_Balance***');
819:
820: END IF;
821: EXCEPTION
819:
820: END IF;
821: EXCEPTION
822: WHEN OTHERS THEN
823: IF l_debug = FND_API.G_TRUE THEN
824: QP_PREQ_GRP.engine_debug(substr(sqlerrm, 1, 240));
825: END IF;
826: RETURN FALSE;
827: END Recheck_Balance;
880:
881: BEGIN
882:
883: l_debug := QP_PREQ_GRP.G_DEBUG_ENGINE;
884: IF l_debug = FND_API.G_TRUE THEN
885: QP_PREQ_GRP.engine_debug('***Begin Check_Balance***');
886: END IF;
887: IF g_Limit_balance_line.COUNT = 0 THEN
888: i:=1;
890: i := g_limit_balance_line.LAST + 1;
891: END IF;
892: x_skip_limit := FALSE;
893:
894: IF l_debug = FND_API.G_TRUE THEN
895: QP_PREQ_GRP.engine_debug('populating limit_balance_line '||i);
896: QP_PREQ_GRP.engine_debug('limit_id '||p_limit_rec.limit_id);
897:
898: END IF;
898: END IF;
899: IF p_limit_rec.each_attr_exists = 'N' THEN
900: --If limit has no each (pure non-each) or no attributes
901: --(For such cases a balance record will always exist since setup creates one)
902: IF l_debug = FND_API.G_TRUE THEN
903: QP_PREQ_GRP.engine_debug('No Each-type attributes defined for this limit');
904:
905: END IF;
906: g_limit_balance_line(i).limit_id := p_limit_rec.limit_id;
932: ELSIF p_limit_rec.limit_level_code = 'TRANSACTION' THEN
933: g_limit_balance_line(i).bal_price_request_code :=
934: QP_PREQ_GRP.G_ORDER_PRICE_REQUEST_CODE;
935: END IF; --If limit_level_code = 'ACROSS_TRANSACTION'
936: IF l_debug = FND_API.G_TRUE THEN
937: QP_PREQ_GRP.engine_debug('bal_price_request_code '||
938: g_limit_balance_line(i).bal_price_request_code);
939: END IF;
940: --Populate price_request_code from limits_cur for limit_transns table
980: END IF; --If limit_level_code is 'ACROSS_TRANSACTION'
981:
982: g_limit_balance_line(i).process_action := g_update;
983:
984: IF l_debug = FND_API.G_TRUE THEN
985: QP_PREQ_GRP.engine_debug('Available Balance '|| l_full_available_amount);
986:
987: END IF;
988: EXCEPTION
990: select qp_limit_balances_s.nextval
991: into g_limit_balance_line(i).limit_balance_id from dual;
992: l_full_available_amount := p_limit_rec.amount;
993: g_limit_balance_line(i).process_action := g_insert;
994: IF l_debug = FND_API.G_TRUE THEN
995: QP_PREQ_GRP.engine_debug('Balance Record Missing');
996:
997: END IF;
998: WHEN E_ORDER_PRICE_REQ_CODE_NULL THEN
1024: WHERE line_index = g_limit_balance_line(i).line_index
1025: AND created_from_list_line_id =
1026: g_limit_balance_line(i).list_line_id;
1027:
1028: IF l_debug = FND_API.G_TRUE THEN
1029: QP_PREQ_GRP.engine_debug(l_message);
1030:
1031: END IF;
1032: END IF;
1031: END IF;
1032: END IF;
1033:
1034: WHEN TOO_MANY_ROWS THEN
1035: IF l_debug = FND_API.G_TRUE THEN
1036: QP_PREQ_GRP.engine_debug(substr(sqlerrm, 1, 240));
1037:
1038: END IF;
1039: IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_ERROR)
1064: WHERE line_index = g_limit_balance_line(i).line_index
1065: AND created_from_list_line_id =
1066: g_limit_balance_line(i).list_line_id;
1067:
1068: IF l_debug = FND_API.G_TRUE THEN
1069: QP_PREQ_GRP.engine_debug(l_message);
1070:
1071: END IF;
1072: END IF;
1076: g_limit_balance_line(i).hard_limit_exceeded := TRUE;
1077: RAISE;
1078:
1079: WHEN OTHERS THEN
1080: IF l_debug = FND_API.G_TRUE THEN
1081: QP_PREQ_GRP.engine_debug(substr(sqlerrm, 1, 240));
1082:
1083: END IF;
1084: IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_ERROR)
1108: WHERE line_index = g_limit_balance_line(i).line_index
1109: AND created_from_list_line_id =
1110: g_limit_balance_line(i).list_line_id;
1111:
1112: IF l_debug = FND_API.G_TRUE THEN
1113: QP_PREQ_GRP.engine_debug(l_message);
1114:
1115: END IF;
1116: END IF;
1199: END IF;--If line_category is 'RETURN'
1200:
1201: END IF; --If limit_exceed_action_code = 'HARD'
1202:
1203: IF l_debug = FND_API.G_TRUE THEN
1204: QP_PREQ_GRP.engine_debug('p_wanted_amount '||p_wanted_amount);
1205: QP_PREQ_GRP.engine_debug('available_amount '||
1206: g_limit_balance_line(i).available_amount);
1207:
1212: ELSE
1213: g_limit_balance_line(i).available_percent := 100;
1214: END IF;
1215:
1216: IF l_debug = FND_API.G_TRUE THEN
1217: QP_PREQ_GRP.engine_debug('available_percent '||
1218: g_limit_balance_line(i).available_percent);
1219: END IF;
1220:
1218: g_limit_balance_line(i).available_percent);
1219: END IF;
1220:
1221: g_limit_balance_line(i).hard_limit_exceeded := FALSE;
1222: IF l_debug = FND_API.G_TRUE THEN
1223: QP_PREQ_GRP.engine_debug('***End Check_Balance***');
1224: END IF;
1225: RETURN TRUE;
1226:
1226:
1227: ELSIF p_limit_rec.each_attr_exists = 'Y' THEN
1228: --Mixed case where both Each and Non-Each Attributes exist for the limit
1229: --and pure Each case
1230: IF l_debug = FND_API.G_TRUE THEN
1231: QP_PREQ_GRP.engine_debug('Each-type attributes defined for this limit');
1232: END IF;
1233:
1234: --Fetch all the org, customer and item type context,attribute and value
1262: l_item_table(i3).value := l_item_rec.value_from;
1263: i3 := i3+1;
1264: END LOOP;
1265:
1266: IF l_debug = FND_API.G_TRUE THEN
1267: QP_PREQ_GRP.engine_debug('Organization Attr Count '|| l_org_table.count);
1268: QP_PREQ_GRP.engine_debug('Attribute1 Count '|| l_cust_table.count);
1269: QP_PREQ_GRP.engine_debug('Attribute2 Count '|| l_item_table.count);
1270:
1278: l_cust_table.COUNT = 0
1279: OR p_limit_rec.multival_attr2_context <> 'NA' AND
1280: l_item_table.COUNT = 0
1281: THEN
1282: IF l_debug = FND_API.G_TRUE THEN
1283: QP_PREQ_GRP.engine_debug('Skipping Limit '|| p_limit_rec.limit_id);
1284: END IF;
1285: x_skip_limit := TRUE;
1286: RETURN TRUE;
1351: ELSIF p_limit_rec.limit_level_code = 'TRANSACTION' THEN
1352: g_limit_balance_line(i).bal_price_request_code :=
1353: QP_PREQ_GRP.G_ORDER_PRICE_REQUEST_CODE;
1354: END IF;--If limit_level_code = 'ACROSS_TRANSACTION'
1355: IF l_debug = FND_API.G_TRUE THEN
1356: QP_PREQ_GRP.engine_debug('bal_price_request_code '||
1357: g_limit_balance_line(i).bal_price_request_code);
1358: END IF;
1359: --Populate price_request_code for limit_transactions table
1483: END IF;--If limit_level_code = 'ACROSS_TRANSACTION'
1484:
1485: g_limit_balance_line(i).process_action := g_update;
1486:
1487: IF l_debug = FND_API.G_TRUE THEN
1488: QP_PREQ_GRP.engine_debug('Available Balance '|| l_full_available_amount);
1489: END IF;
1490: EXCEPTION
1491: WHEN NO_DATA_FOUND THEN
1554: WHERE line_index = g_limit_balance_line(i).line_index
1555: AND created_from_list_line_id =
1556: g_limit_balance_line(i).list_line_id;
1557:
1558: IF l_debug = FND_API.G_TRUE THEN
1559: QP_PREQ_GRP.engine_debug(l_message);
1560:
1561: END IF;
1562: END IF;
1561: END IF;
1562: END IF;
1563:
1564: WHEN TOO_MANY_ROWS THEN
1565: IF l_debug = FND_API.G_TRUE THEN
1566: QP_PREQ_GRP.engine_debug(substr(sqlerrm, 1, 240));
1567:
1568: END IF;
1569: IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_ERROR)
1595: WHERE line_index = g_limit_balance_line(i).line_index
1596: AND created_from_list_line_id =
1597: g_limit_balance_line(i).list_line_id;
1598:
1599: IF l_debug = FND_API.G_TRUE THEN
1600: QP_PREQ_GRP.engine_debug(l_message);
1601:
1602: END IF;
1603: END IF;
1607: g_limit_balance_line(i).hard_limit_exceeded := TRUE;
1608: RAISE;
1609:
1610: WHEN OTHERS THEN
1611: IF l_debug = FND_API.G_TRUE THEN
1612: QP_PREQ_GRP.engine_debug(substr(sqlerrm, 1, 240));
1613:
1614: END IF;
1615: IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_ERROR)
1641: WHERE line_index = g_limit_balance_line(i).line_index
1642: AND created_from_list_line_id =
1643: g_limit_balance_line(i).list_line_id;
1644:
1645: IF l_debug = FND_API.G_TRUE THEN
1646: QP_PREQ_GRP.engine_debug(l_message);
1647:
1648: END IF;
1649: END IF;
1729: END IF; --If line_category is 'RETURN'
1730:
1731: END IF; --If limit_exceed_action_code is 'HARD'
1732:
1733: IF l_debug = FND_API.G_TRUE THEN
1734: QP_PREQ_GRP.engine_debug('p_wanted_amount '||p_wanted_amount);
1735: QP_PREQ_GRP.engine_debug('available_amount '||
1736: g_limit_balance_line(i).available_amount);
1737:
1742: ELSE
1743: g_limit_balance_line(i).available_percent := 100;
1744: END IF;
1745:
1746: IF l_debug = FND_API.G_TRUE THEN
1747: QP_PREQ_GRP.engine_debug('available_percent '||
1748: g_limit_balance_line(i).available_percent);
1749:
1750: END IF;
1755: END LOOP; --over l_item_table
1756: END LOOP; --over l_cust_table
1757: END LOOP; --over l_org_table
1758:
1759: IF l_debug = FND_API.G_TRUE THEN
1760: QP_PREQ_GRP.engine_debug('***End Check_balance***');
1761: END IF;
1762: RETURN TRUE;
1763:
1764: END IF; --If Each Attributes Exist for the Limit
1765:
1766: EXCEPTION
1767: WHEN OTHERS THEN
1768: IF l_debug = FND_API.G_TRUE THEN
1769: QP_PREQ_GRP.engine_debug(substr(sqlerrm, 1, 240));
1770: END IF;
1771: RETURN FALSE;
1772: END Check_Balance;
1799: AND pricing_attribute_context = 'VOLUME'
1800: AND pricing_attribute = 'PRICING_ATTRIBUTE12';
1801: EXCEPTION
1802: WHEN OTHERS THEN
1803: IF l_debug = FND_API.G_TRUE THEN
1804: QP_PREQ_GRP.engine_debug('results not found' || SQLERRM);
1805: END IF;
1806: l_amt_exist_flag := 'N';
1807: END;
1869: RETURN l_limit_available;
1870:
1871: EXCEPTION
1872: WHEN OTHERS THEN
1873: IF l_debug = FND_API.G_TRUE THEN
1874: QP_PREQ_GRP.engine_debug(substr(sqlerrm, 1, 240));
1875: END IF;
1876: RETURN FALSE;
1877: END Check_Balance_Wrapper;
2156:
2157: BEGIN
2158:
2159: l_debug := QP_PREQ_GRP.G_DEBUG_ENGINE;
2160: IF l_debug = FND_API.G_TRUE THEN
2161: QP_PREQ_GRP.engine_debug('***Begin Process_Limits***');
2162:
2163: END IF;
2164: --Initialize x_return_status
2161: QP_PREQ_GRP.engine_debug('***Begin Process_Limits***');
2162:
2163: END IF;
2164: --Initialize x_return_status
2165: x_return_status := FND_API.G_RET_STS_SUCCESS;
2166: x_return_text := 'Success';
2167:
2168: --Reset global plsql table storing limit balances
2169: g_limit_balance_line.DELETE;
2175:
2176: FOR l_limit_rec IN limits_cur
2177: LOOP
2178:
2179: IF l_debug = FND_API.G_TRUE THEN
2180: QP_PREQ_GRP.engine_debug('========================');
2181: QP_PREQ_GRP.engine_debug('In limits_cur loop');
2182:
2183: QP_PREQ_GRP.engine_debug('list header id of previous limit ' || l_old_limit_rec.created_from_list_header_id);
2198: l_old_limit_rec.created_from_list_line_id AND
2199: l_limit_rec.line_index =
2200: l_old_limit_rec.line_index
2201: THEN
2202: IF l_debug = FND_API.G_TRUE THEN
2203: QP_PREQ_GRP.engine_debug('skipping limit '|| l_limit_rec.limit_id ||
2204: 'for line '||l_limit_rec.created_from_list_line_id);
2205:
2206: END IF;
2215: l_old_limit_rec.created_from_list_header_id AND
2216: l_limit_rec.line_index =
2217: l_old_limit_rec.line_index
2218: THEN
2219: IF l_debug = FND_API.G_TRUE THEN
2220: QP_PREQ_GRP.engine_debug('skipping limit '|| l_limit_rec.limit_id ||
2221: 'for header '||l_limit_rec.created_from_list_header_id);
2222:
2223: END IF;
2243: --Bug 4457725] Added to check for Group of Lines modifier such that a limit
2244: --is applied only once for a group
2245: select MODIFIER_LEVEL_CODE into l_modifier_level_code
2246: from qp_list_lines where list_line_id = l_old_limit_rec.created_from_list_line_id;
2247: IF l_debug = FND_API.G_TRUE THEN
2248: QP_PREQ_GRP.engine_debug('Modifier Level '||l_modifier_level_code);
2249: END IF;
2250:
2251: IF l_modifier_level_code = 'LINEGROUP' AND l_processed_limits_tbl.COUNT > 0 AND l_limit_rec.basis = 'USAGE' --9645844
2261: END IF;
2262:
2263: IF l_modifier_level_code = 'LINEGROUP' AND l_processed AND l_limit_rec.basis = 'USAGE' --9645844
2264: THEN
2265: IF l_debug = FND_API.G_TRUE THEN
2266: QP_PREQ_GRP.engine_debug('Line Group Modifier with limit id '||l_old_limit_rec.limit_id||' already processed');
2267: END IF;
2268: --Clear the global plsql table storing limits info.
2269: g_limit_balance_line.DELETE;
2274:
2275: G_LOOP_COUNT := 0; --Initialize whenever line_index or list_line_id
2276: --changes, i.e., before each loop
2277: LOOP
2278: IF l_debug = FND_API.G_TRUE THEN
2279: QP_PREQ_GRP.engine_debug('Change in list_line_id or line_index. ' ||
2280: 'Update limit balance. Loop through ' ||
2281: 'Recheck_balance and Update_Balance, if ' ||
2282: 'necessary ');
2288: l_processed_limits_tbl(l_processed_limit_count) := l_old_limit_rec.limit_id;
2289: l_processed_limit_count := l_processed_limit_count+1;
2290: END IF;
2291:
2292: IF l_return_status = FND_API.G_RET_STS_ERROR THEN
2293:
2294: IF G_LOOP_COUNT <= G_MAX_LOOP_COUNT THEN
2295: l_retcode := Recheck_Balance;
2296: ELSE
2293:
2294: IF G_LOOP_COUNT <= G_MAX_LOOP_COUNT THEN
2295: l_retcode := Recheck_Balance;
2296: ELSE
2297: RAISE FND_API.G_EXC_ERROR;
2298: END IF;
2299:
2300: ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
2301: RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2296: ELSE
2297: RAISE FND_API.G_EXC_ERROR;
2298: END IF;
2299:
2300: ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
2301: RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2302:
2303: ELSE --If Update_Balance successful
2304: IF g_limit_balance_line.COUNT > 0 THEN
2297: RAISE FND_API.G_EXC_ERROR;
2298: END IF;
2299:
2300: ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
2301: RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2302:
2303: ELSE --If Update_Balance successful
2304: IF g_limit_balance_line.COUNT > 0 THEN
2305:
2344: ,p_least_percent => g_limit_balance_line(j).least_percent
2345: ,p_message_text => l_limit_text
2346: );
2347:
2348: IF l_debug = FND_API.G_TRUE THEN
2349: QP_PREQ_GRP.engine_debug('################# ' || l_limit_text);
2350:
2351: END IF;
2352: END IF;
2366: THEN
2367: l_hold_code := QP_PREQ_GRP.G_STATUS_LIMIT_ADJUSTED;
2368: END IF;
2369:
2370: IF l_debug = FND_API.G_TRUE THEN
2371: QP_PREQ_GRP.engine_debug('Hold Flag is ' || g_limit_balance_line(j).limit_hold_flag );
2372: QP_PREQ_GRP.engine_debug('Hold Code is ' || l_hold_code);
2373:
2374: END IF;
2435: g_limit_balance_line(j).line_detail_index);
2436:
2437: END IF;--If created_from_list_line_type = 'PBH'
2438:
2439: IF l_debug = FND_API.G_TRUE THEN
2440: QP_PREQ_GRP.engine_debug('line_index '||
2441: g_limit_balance_line(j).line_index);
2442: QP_PREQ_GRP.engine_debug('limit_code '||
2443: g_limit_balance_line(j).limit_code);
2457: UPDATE qp_npreq_lines_tmp
2458: SET hold_code = DECODE(hold_code, QP_PREQ_GRP.G_STATUS_LIMIT_HOLD, QP_PREQ_GRP.G_STATUS_LIMIT_HOLD, l_hold_code)
2459: WHERE line_index = g_limit_balance_line(j).line_index;
2460:
2461: IF l_debug = FND_API.G_TRUE THEN
2462: QP_PREQ_GRP.engine_debug('Hold Flag is Y');
2463: QP_PREQ_GRP.engine_debug('Hold Code is '||QP_PREQ_GRP.G_STATUS_LIMIT_HOLD);
2464:
2465: END IF;
2520: END LOOP; --through limit balance lines
2521:
2522: END IF; --g_limit_balance_line.COUNT > 0
2523:
2524: IF l_debug = FND_API.G_TRUE THEN
2525: QP_PREQ_GRP.engine_debug('Done Updating Balances when line changed');
2526:
2527: END IF;
2528: --Clear the global plsql table storing limits info.
2540: x_skip_limit => l_skip_limit);
2541:
2542: IF NOT l_limit_available THEN
2543:
2544: IF l_debug = FND_API.G_TRUE THEN
2545: QP_PREQ_GRP.engine_debug('Limit not available - hard limit with 0 balance');
2546:
2547: END IF;
2548: --If Header-level limit, then skip all limits and go to the next
2547: END IF;
2548: --If Header-level limit, then skip all limits and go to the next
2549: --list_header limit. Elseif line_level go to the next line_level limit.
2550: IF l_limit_rec.limit_level = 'H' THEN
2551: IF l_debug = FND_API.G_TRUE THEN
2552: QP_PREQ_GRP.engine_debug('Header Level Limit '||
2553: l_limit_rec.limit_id ||' not available');
2554: END IF;
2555: /*
2567:
2568: l_skip_header := TRUE;
2569:
2570: ELSIF l_limit_rec.limit_level = 'L' THEN
2571: IF l_debug = FND_API.G_TRUE THEN
2572: QP_PREQ_GRP.engine_debug('Line Level Limit '||
2573: l_limit_rec.limit_id ||' not available');
2574: END IF;
2575: /*
2590: END IF;
2591:
2592: ELSIF l_limit_available AND l_skip_limit THEN
2593:
2594: IF l_debug = FND_API.G_TRUE THEN
2595: QP_PREQ_GRP.engine_debug('limit ' || l_limit_rec.limit_id ||
2596: ' available but' || 'skipped - does not qualify');
2597: END IF;
2598: l_skip_limit := FALSE;
2601: END IF; --If NOT l_limit_available
2602:
2603: l_old_limit_rec := l_limit_rec;
2604:
2605: IF l_debug = FND_API.G_TRUE THEN
2606: QP_PREQ_GRP.engine_debug('Repeat limits_cur loop for next limit - if any');
2607: END IF;
2608: <
2609: null;
2618:
2619: G_LOOP_COUNT := 0; --Initialize before boundary condition loop
2620:
2621: LOOP
2622: IF l_debug = FND_API.G_TRUE THEN
2623: QP_PREQ_GRP.engine_debug('***Start Boundary condition processing***');
2624: END IF;
2625:
2626: select MODIFIER_LEVEL_CODE into l_modifier_level_code
2624: END IF;
2625:
2626: select MODIFIER_LEVEL_CODE into l_modifier_level_code
2627: from qp_list_lines where list_line_id = l_old_limit_rec.created_from_list_line_id;
2628: IF l_debug = FND_API.G_TRUE THEN
2629: QP_PREQ_GRP.engine_debug('Modifier Level '||l_modifier_level_code);
2630: END IF;
2631:
2632: IF l_modifier_level_code = 'LINEGROUP' AND l_processed_limits_tbl.COUNT > 0 AND l_old_limit_rec.basis = 'USAGE' --9645844
2642: END IF;
2643:
2644: IF l_modifier_level_code = 'LINEGROUP' AND l_processed AND l_old_limit_rec.basis = 'USAGE' --9645844
2645: THEN
2646: IF l_debug = FND_API.G_TRUE THEN
2647: QP_PREQ_GRP.engine_debug('***Boundary condition GroupOfLines Limit already processed***');
2648: END IF;
2649: EXIT;
2650: END IF;
2655: l_processed_limits_tbl(l_processed_limit_count) := l_old_limit_rec.limit_id;
2656: l_processed_limit_count := l_processed_limit_count+1;
2657: END IF;
2658:
2659: IF l_debug = FND_API.G_TRUE THEN
2660: QP_PREQ_GRP.engine_debug('Update_Balance l_return_status ' ||l_return_status);
2661: END IF;
2662:
2663: IF l_return_status = FND_API.G_RET_STS_ERROR THEN
2659: IF l_debug = FND_API.G_TRUE THEN
2660: QP_PREQ_GRP.engine_debug('Update_Balance l_return_status ' ||l_return_status);
2661: END IF;
2662:
2663: IF l_return_status = FND_API.G_RET_STS_ERROR THEN
2664:
2665: IF G_LOOP_COUNT <= G_MAX_LOOP_COUNT THEN
2666: l_retcode := Recheck_Balance;
2667: ELSE
2664:
2665: IF G_LOOP_COUNT <= G_MAX_LOOP_COUNT THEN
2666: l_retcode := Recheck_Balance;
2667: ELSE
2668: RAISE FND_API.G_EXC_ERROR;
2669: END IF;
2670:
2671: ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
2672: RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2667: ELSE
2668: RAISE FND_API.G_EXC_ERROR;
2669: END IF;
2670:
2671: ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
2672: RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2673:
2674: ELSE --If Update_Balance successful
2675:
2668: RAISE FND_API.G_EXC_ERROR;
2669: END IF;
2670:
2671: ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
2672: RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2673:
2674: ELSE --If Update_Balance successful
2675:
2676: IF g_limit_balance_line.COUNT > 0 THEN
2695: THEN
2696:
2697: l_limit_code := g_limit_balance_line(j).limit_code;
2698:
2699: IF l_debug = FND_API.G_TRUE THEN
2700: QP_PREQ_GRP.engine_debug('Before Buid_Message_Text');
2701: END IF;
2702:
2703: Build_Message_Text(
2713: ,p_least_percent => g_limit_balance_line(j).least_percent
2714: ,p_message_text => l_limit_text
2715: );
2716:
2717: IF l_debug = FND_API.G_TRUE THEN
2718: QP_PREQ_GRP.engine_debug('################# ' || l_limit_text);
2719:
2720: END IF;
2721: END IF;
2724: g_limit_balance_line(j).limit_code IN
2725: (QP_PREQ_GRP.G_STATUS_LIMIT_ADJUSTED,
2726: QP_PREQ_GRP.G_STATUS_LIMIT_EXCEEDED)
2727: THEN
2728: IF l_debug = FND_API.G_TRUE THEN
2729: QP_PREQ_GRP.engine_debug('label 1');
2730: END IF;
2731: l_hold_code := QP_PREQ_GRP.G_STATUS_LIMIT_HOLD;
2732: END IF;
2735: g_limit_balance_line(j).limit_code IN
2736: (QP_PREQ_GRP.G_STATUS_LIMIT_ADJUSTED,
2737: QP_PREQ_GRP.G_STATUS_LIMIT_EXCEEDED)
2738: THEN
2739: IF l_debug = FND_API.G_TRUE THEN
2740: QP_PREQ_GRP.engine_debug('label 2');
2741: END IF;
2742: l_hold_code := QP_PREQ_GRP.G_STATUS_LIMIT_ADJUSTED;
2743: END IF;
2741: END IF;
2742: l_hold_code := QP_PREQ_GRP.G_STATUS_LIMIT_ADJUSTED;
2743: END IF;
2744:
2745: IF l_debug = FND_API.G_TRUE THEN
2746: QP_PREQ_GRP.engine_debug('Hold Flag is ' || g_limit_balance_line(j).limit_hold_flag );
2747: QP_PREQ_GRP.engine_debug('Hold Code is ' || l_hold_code);
2748:
2749: END IF;
2763: AND created_from_list_line_id =
2764: g_limit_balance_line(j).list_line_id
2765: AND pricing_status_code = QP_PREQ_GRP.G_STATUS_NEW;
2766:
2767: IF l_debug = FND_API.G_TRUE THEN
2768: QP_PREQ_GRP.engine_debug('label 3');
2769: END IF;
2770:
2771: --Update the Child Break Lines for 'PBH' lines
2811: AND b.relationship_type_code = 'PRICE_BREAK'
2812: AND b.line_detail_index =
2813: g_limit_balance_line(j).line_detail_index);
2814:
2815: IF l_debug = FND_API.G_TRUE THEN
2816: QP_PREQ_GRP.engine_debug('label 4');
2817: END IF;
2818: --bug#12916970
2819: QP_PREQ_GRP.engine_debug('operand_calculation_code-DK-'||g_limit_balance_line(j).operand_calculation_code);
2825: AND a.pricing_status_code = QP_PREQ_GRP.G_STATUS_NEW
2826: AND a.line_detail_index =
2827: g_limit_balance_line(j).line_detail_index;
2828:
2829: IF l_debug = FND_API.G_TRUE THEN
2830: QP_PREQ_GRP.engine_debug('label 123-rows updated-'||sql%rowcount);
2831: END IF;
2832: --bug#12916970
2833: END IF;--If created_from_list_line_type = 'PBH'
2831: END IF;
2832: --bug#12916970
2833: END IF;--If created_from_list_line_type = 'PBH'
2834:
2835: IF l_debug = FND_API.G_TRUE THEN
2836: QP_PREQ_GRP.engine_debug('line_index '||
2837: g_limit_balance_line(j).line_index);
2838: QP_PREQ_GRP.engine_debug('limit_code '||
2839: g_limit_balance_line(j).limit_code);
2855: WHERE line_index = g_limit_balance_line(j).line_index;
2856:
2857: IF g_limit_balance_line(j).transaction_amount is null THEN
2858:
2859: IF l_debug = FND_API.G_TRUE THEN
2860: QP_PREQ_GRP.engine_debug('transaction amount is null');
2861: END IF;
2862:
2863: IF l_debug = FND_API.G_TRUE THEN
2859: IF l_debug = FND_API.G_TRUE THEN
2860: QP_PREQ_GRP.engine_debug('transaction amount is null');
2861: END IF;
2862:
2863: IF l_debug = FND_API.G_TRUE THEN
2864: QP_PREQ_GRP.engine_debug('Inserting Into qp_limit_transactions');
2865: END IF;
2866:
2867: INSERT INTO qp_limit_transactions
2897:
2898: ELSIF g_limit_balance_line(j).transaction_amount <>
2899: g_limit_balance_line(j).given_amount THEN
2900:
2901: IF l_debug = FND_API.G_TRUE THEN
2902: QP_PREQ_GRP.engine_debug('Updating qp_limit_transactions');
2903:
2904: END IF;
2905: /*
2926: END IF; --g_limit_balance_line.COUNT > 0
2927:
2928: --Clear the global plsql table storing limits info.
2929: g_limit_balance_line.DELETE;
2930: IF l_debug = FND_API.G_TRUE THEN
2931: QP_PREQ_GRP.engine_debug('***End Boundary condition processing***');
2932: END IF;
2933: EXIT;
2934: END IF; --If Update_Balance returns Error
2935: END LOOP; --Boundary condition loop
2936:
2937: END IF; --IF l_old_limit_rec.created_from_list_line_id >= 0
2938:
2939: IF l_debug = FND_API.G_TRUE THEN
2940: QP_PREQ_GRP.engine_debug('***End Process_Limits***');
2941:
2942: END IF;
2943: EXCEPTION
2940: QP_PREQ_GRP.engine_debug('***End Process_Limits***');
2941:
2942: END IF;
2943: EXCEPTION
2944: WHEN FND_API.G_EXC_ERROR THEN
2945:
2946: x_return_status := FND_API.G_RET_STS_ERROR;
2947: --x_return_text is already set by Update_Balance
2948:
2942: END IF;
2943: EXCEPTION
2944: WHEN FND_API.G_EXC_ERROR THEN
2945:
2946: x_return_status := FND_API.G_RET_STS_ERROR;
2947: --x_return_text is already set by Update_Balance
2948:
2949: IF l_debug = FND_API.G_TRUE THEN
2950: QP_PREQ_GRP.engine_debug('Expected Error in Process_Limits');
2945:
2946: x_return_status := FND_API.G_RET_STS_ERROR;
2947: --x_return_text is already set by Update_Balance
2948:
2949: IF l_debug = FND_API.G_TRUE THEN
2950: QP_PREQ_GRP.engine_debug('Expected Error in Process_Limits');
2951: QP_PREQ_GRP.engine_debug(substr(sqlerrm, 1, 240));
2952:
2953: END IF;
2950: QP_PREQ_GRP.engine_debug('Expected Error in Process_Limits');
2951: QP_PREQ_GRP.engine_debug(substr(sqlerrm, 1, 240));
2952:
2953: END IF;
2954: WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2955:
2956: x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2957: x_return_text := substr(sqlerrm, 1, 2000);
2958:
2952:
2953: END IF;
2954: WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2955:
2956: x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2957: x_return_text := substr(sqlerrm, 1, 2000);
2958:
2959: IF l_debug = FND_API.G_TRUE THEN
2960: QP_PREQ_GRP.engine_debug('Unexpected Error in Process_Limits');
2955:
2956: x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2957: x_return_text := substr(sqlerrm, 1, 2000);
2958:
2959: IF l_debug = FND_API.G_TRUE THEN
2960: QP_PREQ_GRP.engine_debug('Unexpected Error in Process_Limits');
2961: QP_PREQ_GRP.engine_debug(substr(sqlerrm, 1, 240));
2962:
2963: END IF;
2962:
2963: END IF;
2964: WHEN OTHERS THEN
2965:
2966: x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2967: x_return_text := substr(sqlerrm, 1, 2000);
2968:
2969: IF l_debug = FND_API.G_TRUE THEN
2970: QP_PREQ_GRP.engine_debug('Other Error in Process_Limits');
2965:
2966: x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2967: x_return_text := substr(sqlerrm, 1, 2000);
2968:
2969: IF l_debug = FND_API.G_TRUE THEN
2970: QP_PREQ_GRP.engine_debug('Other Error in Process_Limits');
2971: QP_PREQ_GRP.engine_debug(substr(sqlerrm, 1, 240));
2972:
2973: END IF;