[Home] [Help]
PACKAGE BODY: APPS.OZF_OFFER_PVT
Source
1 Package BODY OZF_Offer_Pvt AS
2 /* $Header: ozfvofrb.pls 120.103.12010000.6 2008/12/08 05:25:54 nirprasa ship $ */
3 -------------------------------
4 -- PACKAGE
5 -- OZF_Offer_PVT
6 --
7 -- PURPOSE
8 -- Use QP_Modifiers_PUB package to create offers.
9 --
10 -- PROCEDURES
11 -- PUBLIC -- Process_modifiers
12 -- PRIVATE -- Process_offers
13 -- HISTORY
14 -- 20-MAY-2000 Satish Karumuri Created.
15 -- 10-SEP-2001 julou modified
16 -- makd changes to process_trade_deal procedure including:
17 -- off_invoice and billback operands are not mandantory.
18 -- input is broken into 4 small tbls to be processed seperately.
19 -- added check conditions for operands and limits.
20 -- 19-OCT-2001 julou
21 -- added formula_id
22 -- made customer editable for lumpsum and trade deal offer
23 -- added validation for start and end date
24 -- 26-OCT-2001 julou
25 -- added budget id for trade deal detail screen(update mode)
26 -- added profile option values for advanced options
27 -- 30-OCT-2001 julou
28 -- added validation for max_amount_per_rule and max_qty_per_rule
29 -- 03-DEC-2001 julou
30 -- changed default incompatibility group to null for trade deal
31 -- 14-DEC-2001 julou
32 -- added check for default profile values
33 -- populate list_header_id for order value discount
34 -- 15-MAY-2002 added break_type for promotional goods offer
35 -- 18-Jun-2002 rssharma
36 -- Added new Qualifier for trade Deal Offers
37 -- To accomodate this added new ELSIF condition in offer_qualifiers procedure.
38 -- THis conditon corresponds to CUSTOMER_BILL_TO qualifier_type
39 -- 19-Aug-2002 RSSHARMA Added Functions for getting Budget Related Columns in Overview
40 -- 20-Aug-2002 RSSHARMA Added validation to not create duplicate budget requests and
41 -- Duplicate Offer Usage.Added two private functions get_campaign_count
42 -- and get_budget_source_count for this
43 -- 29-Aug-2002 RSSHARMA Added Conditional passing of offer amount limit to QP.
44 -- Pass limit only if the Profile for Recalculated Committed is Off
45 -- OR the profile is on and the Flag for passing limit is on.
46 -- ALso Corrected Bug due to which the limit for Offer Amount will
47 -- never be deleted ..
48 -- 24-Sep-2002 RSSHARMA Fixed bug in VOlume Offers where the accrual flag is not
49 -- updated from if the INcentive is changed from Accrual to Off INvoice
50 -- FOr Off INvoice offer Explicitly setting accrual flag to N.
51 -- 23-Oct-2002 RSSHARMA Made Committed=Max independent of RECAL profile
52 -- 24-OCT-2002 julou added recalculate committed related changes to activate_offer,
53 -- activate_offer_over, validate_offer API
54 -- 28-Oct-2002 RSSHARMA CHanged Grouping No from 10 to -1 for Customer and Dates
55 -- when a qualifier is created
56 -- 28-Oct-2002 RSSHARMA Changed code to handle Territory as Qualifier Type
57 -- 28-OCT-2002 julou modified process_ozf_offers so that IEB is not update when offer
58 -- is in PENDING_ACTIVE. Changed the order of updating and posting
59 -- LUMPSUM/SCAN_DATA
60 -- 01-NOV-2002 julou pass list_header_id to qualifiers tbl to fix copy API not copying
61 -- order_value_from and order_value_to.
62 -- 15-Nov-2002 RSSHARNA Added Flex Fields to QP_List_headers
63 -- 26-Nov-2002 RSSHARMA Added Flex Field to qp_list_lines
64 -- 12-DEC-2002 julou 1. parent as budget source update issue and creating budget request
65 -- 2. activation issue with LUMPSUM and SCAN_DATA offers
66 -- moved update after posting offers
67 -- 26-DEC-2002 julou enhancement 2465253: added profile value for override flag.
68 -- 06-Jan-2003 rssharma Fixed issue where status code is set to null
69 -- if the user status id is missing
70 -- 09-JAN-2003 julou fixed accrual_flag for multi-tier Accrual offers
71 -- 30-JAN-2003 julou changed process_qp_list_headers. if offer is updated from
72 -- PROGRAM(offer_operation is null) populated active_flag as whatever parsed in.
73 -- 03-Feb-2003 RSSHARMA Added Function discount_lines_exist to check if active discount rules exist for an offer
74 -- this function is required by budgets team
75 -- 06-Feb-2003 RSSHARMA Fixed Bug # 2783888 .Added code for receiving Volume Offer Lines
76 -- with Offer type = 'VOLUME_OFFER' instead of the Volume Offer Type.
77 -- If the Offer type is 'VOLUME_OFFER' then hit another query to get the
78 -- Volume Offer type and then call process_regular_discounts with this
79 -- volume Offer type as Offer Type.
80 -- This won't affect any of the existing Offer Calls as we already are
81 -- retrieving this Volume Offer Type and Passing it in the API call
82 -- 19-FEB-2003 julou bug 2806139 - correct process_qp_list_header.
83 -- only make offer active in qp when all approval/validation passed.
84 -- 26-FEB-2003 julou bug 2821174 - make IEB updatable to lower value
85 -- 13-MAR-2003 julou bug 2844095 - update ozf_offers.qualifier_deleted='Y' if qualifier is deleted
86 -- 01-Apr-2003 RSSHARMA fixed bug # 2778138. Added Customer SHip To to Offer Qualifiers
87 -- 15-Apr-2003 RSSHARMA Added Flex Field Code
88 -- 22-APR-2003 julou bug 2916480 - for custom setup 101 and 108, l_budget_required is null.
89 -- added check for l_budget_required and treat it as 'N' if NULL, in process_modifiers
90 -- 30-APR-2003 RSSHARMA Added Qualifiers Flex Fields
91 -- 04-JUN-2003 julou bug 2986459 - modified process_ozf_offer.
92 -- populate IEB from cue card if offer is ACTIVE and IEB is null
93 -- Tue Jun 17 2003:2/47 PM RSSHARMA Changed procedure offer_dates. Create the Order and Ship
94 -- Dates with different Group Numbers
95 -- Tue Jul 15 2003:3/35 PM RSSHARMA Added AMOUNT as new Discount Type for Order Value Offers
96 -- Wed Nov 26 2003:3/0 PM rssharma Made process_qp_list_lines public and added an out variable
97 -- Mon Dec 01 2003:7/33 PM RSSHARMA Changed process_regular_discounts to allow creating inactive discount rules.
98 -- Tue Dec 02 2003:1/51 PM RSSHARMA Added Creating inactive discount rules for regular, Order Value , Promotional Goods Offers
99 -- And Skip Validation for minimum 1 discount line for an offer to become active for Soft Fund
100 -- with Custom Setup Id = 110
101 -- 15-JAN-2004 julou Bug 3376179 - Added cusor to retrieve offer_id in activate_offer_over.
102 -- Budget validation does not parse in offer_id, only qp_list_header_id
103 -- Thu Jan 15 2004:7/25 PM RSSHARMA to fix bug 3352620 , added function get_qualifier_name
104 -- Thu Feb 12 2004:6/17 PM RSSHARMA Fixed bug # 3429719. Make Start Date Required for Net Accrual offers
105 -- Fri Feb 20 2004:4/45 PM RSSHARMA Dont create or update qualifiers for Net Accrual Lumpsum and Scan Data Offers
106 -- when qualifier is entered in header
107 -- Wed Mar 10 2004:11/23 AM RSSHARMA Raise business event on Offer activation
108 -- Thu Apr 08 2004:5/27 PM RSSHARMA Fixed bug #.3560980. Start date and end Date were saved with a timestamp
109 -- if the start date and end date fell in April to November (daylight savings period). Pricing engine
110 -- does not pick up offers if time stamp is specified so these offers did not get applied in OM
111 -- SO truncate the start date and end date of the offer so that it is picked up by Pricing engine.
112 -- Tue May 25 2004 RIMEHROT bug fix 3629490. Check if qualifier exists before deleting.
113 -- Wed Jun 30 2004:3/23 PM RSSHARMA Fixed bug # 3735380.Correct TotalForecastAmount Calculation for ScanData Offer
114 -- Tue Aug 31 2004:10/48 AM RSSHARMA Fixed bug # 3851487. Modifier Level Code for terms Upgrade Discount Type in Order Value
115 -- Offers was hard coded to LINE and the Pricing Phase Id was hardcoded to LIST LINE ADJUSMENT. Changed code to remove
116 -- hardcoding and accept the Values entered in the UI
117 -- DEC-03-2004 julou bug 3999358: get error inactivating discount line.
118 -- Occurs if offer start date and inactivating date is the same day.
119 -- Solution: If start_date is not null take the greater of start_date and sysdate
120 -- as discount line end date. If end_date is not null take the smaller of
121 -- end_date and sysdate. Otherwise use sysdate.
122 --Tue May 03 2005:2/38 PM RSSHARMA Support creation of Sales method QUalifier from Create Offer Screen.
123 -- Fixed bug # 4354567. CHanged signature of process_header_tiers. Added additional out parameter
124 -- to pass back modifier lines created in the transaction.
125 -- Tue Jun 14 2005:7/34 PM RSSHARMA Added functions get_offer_discount_line_id and get_formula_name
126 -- Fri Jun 24 2005:7/46 PM RSSHARMA Added method vo_qualifier. If offer_type is Volume Offer use VO_Qualifier
127 -- to create and update Qualifiers from process_modifiers procedure
128 -- Thu Jul 07 2005:7/18 PM RSSHARMA Volume Offer Activation Changes. Added procedures push_discount_rules_to_qp,
129 -- relate_qp_ozf_for_vo , push_data_to_qp_and_relate.
130 -- Added new procedure process_offer_activation. this procedure will be one common procedure called during offer activation.
131 -- Currently this procedure pushes ozf data to qp during offer activation
132 -- Thu Aug 19 1999:6/50 AM RSSHARMA Added process to relate ozf and qp discounts and products. Also changed signature of create_offer_tiers
133 -- Tue Sep 27 2005:7/30 PM RSSHARMA Pass end date properly for end dating Discount lines using adjustments.
134 -- issues with trade deal remain. Only one line is end dated
135 -- Wed Sep 28 2005:12/18 PM RSSHARMA Push Accum attribute47 to qp during volume Offer activation.
136 -- DOnt push discount rules to qp if qp_list_lines already exist.
137 -- Wed Sep 28 2005:6/2 PM RSSHARMA During Volume Offer Activation push formula into proper column(price_by_formula_id) in qp_list_lines
138 -- Thu Sep 29 2005:1/46 PM RSSHARMA Corrected Accum Attribute to PRICING_ATTRIBUTE19 from PRICING_ATTRIBUTE47
139 -- Sat Oct 01 2005:5/40 PM RSSHARMA Corrected Qualifier Attribute used for creating sales method Qualifier
140 -- Wed Oct 12 2005:11/47 AM RSSHARMA Added new method debug_message to add debug messages to fnd only if the profile FND: Message Level Threshold level is high.
141 -- Create a pbh line, with same tier but "0" discounts for volume offer products with apply_discount flag set to "NO"
142 -- in push_discount_rules_to_qp procedure
143 -- Thu Oct 13 2005:7/21 PM RSSHARMA cleaned up MOAC code
144 -- Thu Oct 20 2005:4/14 PM RSSHARMA Added Following validations.
145 -- If The Security profile is off, in which case local(operating unit specific offers cannot be created), clear the org_id and set the global_flag to Y, for the data sent to QP
146 -- while the org_id is sent to ozf_offers
147 -- If the Offer is Lumpsum or scandata then , raise an exception if the org_id is not passed in since scandata and lumpsum offers always are org specific
148 -- Fri Oct 21 2005:6/45 PM RSSHARMA r12 changes to function discount_lines_exist
149 -- Changed function to query ozf_offer_discount_lines and ozf_offer_discount_products
150 -- if offer type is VOLUME_OFFER
151 -- Mon Oct 31 2005:3/1 PM RSSHARMA Fixed bug # 4706367. Raise Error for Lumpsum and scandata only if it is null or g_miss in create mode
152 -- and null indicated by (g_miss) in update mode
153 -- Mon Nov 14 2005:4/45 PM Fixed bug # 4625922. Due to issues in process_regular_discounts, the user was not able to perform any database operations
154 -- in the Offer Line Details page. the error occured due to debug mesages, printing data which did not exist
155 -- Thu Mar 30 2006:3/12 PM RSSHAMA new Adjustment changes to process_regular_discounts and process_trade_deal
156 -- Mon Apr 03 2006:1/57 PM RSSHARMA Pass start date active and end date active to MUlti-tier PBH lines.
157 -- Mon Apr 03 2006:3/8 PM RSSHARMA Fix passing start date and end date while updating multi-tier lines.
158 -- Wed Apr 05 2006:2/18 PM RSSHARMA Fixed bug # 5142859.If the passed in currency is null create budget request with default currency.
159 -- Wed Apr 05 2006:2/52 PM RSSHARMA Fixed bug # 5142859. Added currency required for Lumpsum and scandata offers validation
160 -- Mon May 22 2006:2/30 PM RSSHARMA Fixed bug # 5227285. During update check against the frozen date_qualifier_profile_value to store dates in Qualifiers
161 -- or to store the dates in Header.
162 -- Tue May 23 2006:4/55 PM RSSHARMA Fixed bug # 5212053. Do not allow a Volume Offer to go active if one of the discount tables is empty.
163 -- Tue May 23 2006:6/3 PM RSSHARMA Added condition to above that there must be atleast one non-excluded item in each discount table to make it active
164 -- Thu Jul 06 2006:11/23 AM RSSHARMA Fixed bug # 5332406. Changed process_header_tiers and push_discount_rules_to_qp_and_Relate for QP fix on continuous tiers
165 -- Fri Jul 06 2006:5/19 PM RSSHARMA Fixed update issues on multi-tier lines from the UI
166 -- Fri Apr 13 2007: nirprasa fix for bug 5969719
167 -- Mon Jul 09 2007: gdeepika fix for bug 5675554.Removed hardcoding in getPricingPhase(),pricing_group_sequence,product_precedence.
168 -- Thu Nov 29 2007: nirprasa fix for bug 6416762
169 -- Mon Dec 24 2007: nirprasa R12.1 SD Enhancement
170 -- Wed Feb 13 2008: kdass fixed bug 6816780 - For SD Offer, defaulted ask_for_flag = N, removed start_date
171 -- for customers, truncated start and end dates for products
172 -- Wed Feb 13 2008: nirprasa fixed bug 6813556
173 -- Tue Fev 19 2008: nirprasa Added SDR validations: do not create offer header if there are no vendor approved lines.
174 -- Do not create offer if OZF_SD_DEFAULT_BUDGET profile is not set.
175 -- Tue Apr 01 2008: nirprasa Added amount null check before calling qp_limits_pub.process_limits
176 -- Tue Apr 15 2008: nirprasa fixed bug 6968932
177 -- Wed Apr 16 2008: nirprasa fixed bug 6974091
178 -- Wed Apr 30 2008: nirprasa fixed bug 7004273
179 -- Tue Aug 12 2008: nirprasa fixed bug 7321745
180 -- Tue Aug 12 2008: nirprasa fixed bug 7321732
181 -- Tue Aug 22 2008: nirprasa fixed bug 7340864
182 -- Tue Aug 22 2008: nirprasa fixed bug 7584161 and 7580884
183 -------------------------------------------------------------------------------------
184 g_pkg_name CONSTANT VARCHAR2(30):= 'OZF_Offer_Pvt';
185 g_file_name CONSTANT VARCHAR2(15) := 'ozfvofrb.pls';
186 g_sd_offer VARCHAR2(15) := 'N';
187
188 OZF_DEBUG_HIGH_ON boolean := FND_MSG_PUB.CHECK_MSG_LEVEL(FND_MSG_PUB.G_MSG_LVL_DEBUG_HIGH);
189 OZF_DEBUG_LOW_ON boolean := FND_MSG_PUB.CHECK_MSG_LEVEL(FND_MSG_PUB.G_MSG_LVL_DEBUG_LOW);
190 OZF_DEBUG_MEDIUM_ON boolean := FND_MSG_PUB.CHECK_MSG_LEVEL(FND_MSG_PUB.G_MSG_LVL_DEBUG_MEDIUM);
191
192
193 PROCEDURE debug_message(p_message IN VARCHAR2)
194 IS
195 BEGIN
196
197 IF (OZF_DEBUG_HIGH_ON) THEN
198 ozf_utility_pvt.debug_message(p_message);
199
200 END IF;
201 END debug_message;
202
203 /*
204 Common procedure called during offer activation
205 */
206
207 PROCEDURE process_offer_activation
208 (
209 p_api_version_number IN NUMBER
210 , p_init_msg_list IN VARCHAR2
211 , p_commit IN VARCHAR2
212 , p_validation_level IN VARCHAR2 := FND_API.G_VALID_LEVEL_FULL
213 , x_return_status OUT NOCOPY VARCHAR2
214 , x_msg_count OUT NOCOPY NUMBER
215 , x_msg_data OUT NOCOPY VARCHAR2
216 , p_offer_rec IN Modifier_LIST_Rec_Type
217 )
218 IS
219 l_api_name CONSTANT VARCHAR2(30) := 'process_offer_activation';
220 l_errorLocation NUMBER;
221 BEGIN
222 x_return_status := FND_API.G_RET_STS_SUCCESS;
223 IF p_offer_rec.offer_type = 'VOLUME_OFFER' THEN
224 push_discount_rules_to_qp
225 (
226 p_init_msg_list => FND_API.G_FALSE
227 ,p_api_version => 1.0
228 ,p_commit => FND_API.G_FALSE
229 , x_return_status => x_return_status
230 , x_msg_count => x_msg_count
231 , x_msg_data => x_msg_data
232 , p_qp_list_header_id => p_offer_rec.qp_list_header_id
233 , x_error_location => l_errorLocation
234 );
235 /* push_data_to_qp_and_relate
236 (
237 p_api_version_number => p_api_version_number
238 , p_init_msg_list => p_init_msg_list
239 , p_commit => p_commit
240 , p_validation_level => p_validation_level
241
242 , x_return_status => x_return_status
243 , x_msg_count => x_msg_count
244 , x_msg_data => x_msg_data
245 , p_qp_list_header_id => p_offer_rec.qp_list_header_id
246 );
247 */
248 IF x_return_status = FND_API.G_RET_STS_ERROR THEN
249 RAISE FND_API.G_EXC_ERROR;
250 ELSIF x_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
251 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
252 END IF;
253
254 END IF;
255
256 debug_message('Private API: '|| l_api_name || ' End');
257
258
259 END process_offer_activation;
260
261 FUNCTION get_offer_discount_id(p_offer_id IN NUMBER) RETURN VARCHAR2
262 IS
263 l_offer_discount_line_id NUMBER := -1;
264 BEGIN
265
266 SELECT min(offer_discount_line_id) INTO l_offer_discount_line_id
267 FROM ozf_offer_discount_lines
268 WHERE offer_id = p_offer_id AND tier_type ='PBH';
269
270 IF(l_offer_discount_line_id IS NULL) THEN
271 RETURN -1;
272 ELSE
273 RETURN l_offer_discount_line_id ;
274 END IF;
275
276 END ;
277
278
279 FUNCTION get_formula_name(p_formula_id IN NUMBER) RETURN VARCHAR2
280 IS
281 l_formula_name QP_PRICE_FORMULAS_TL.NAME%TYPE;
282 BEGIN
283 SELECT name INTO l_formula_name FROM qp_price_formulas_tl WHERE price_formula_id = p_formula_id AND language = userenv('lang');
284 return l_formula_name;
285 END get_formula_name;
286
287 --FUNCTION get_vo_tier_id(p_offer_id)
288
289 FUNCTION get_qualifier_name(p_qualifier_type IN VARCHAR2 , p_qualifier_id IN NUMBER) RETURN VARCHAR2
290 IS
291 cursor c_qual_name(p_qualifier_ctx VARCHAR2,p_qualifier_attr VARCHAR2,p_qualifier_id NUMBER)
292 IS
293 SELECT QP_QP_Form_Pricing_Attr.Get_Attribute_Value('QP_ATTR_DEFNS_QUALIFIER',p_qualifier_ctx, p_qualifier_attr, p_qualifier_id)
294 from dual;
295 l_cust_name varchar2(240);
296 l_qualifier_ctx VARCHAR2 (240);
297 l_qualifier_attr VARCHAR2(240);
298 BEGIN
299 IF p_qualifier_type = 'CUSTOMER' THEN
300 l_qualifier_ctx := 'CUSTOMER';
301 l_qualifier_attr := 'QUALIFIER_ATTRIBUTE2';
302 ELSIF p_qualifier_type = 'LIST' THEN
303 l_qualifier_ctx := 'CUSTOMER_GROUP';
304 l_qualifier_attr := 'QUALIFIER_ATTRIBUTE1';
305 ELSIF p_qualifier_type = 'SEGMENT' THEN
306 l_qualifier_ctx := 'CUSTOMER_GROUP';
307 l_qualifier_attr := 'QUALIFIER_ATTRIBUTE2';
308 ELSIF p_qualifier_type = 'BUYER' THEN
309 l_qualifier_ctx := 'CUSTOMER_GROUP';
310 l_qualifier_attr := 'QUALIFIER_ATTRIBUTE3';
311 ELSIF p_qualifier_type = 'TERRITORY' THEN
312 l_qualifier_ctx := 'TERRITORY';
313 l_qualifier_attr := 'QUALIFIER_ATTRIBUTE1';
314 ELSIF p_qualifier_type = 'CUSTOMER_BILL_TO' THEN
315 l_qualifier_ctx := 'CUSTOMER';
316 l_qualifier_attr := 'QUALIFIER_ATTRIBUTE14';
317 ELSIF p_qualifier_type = 'SHIP_TO' THEN
318 l_qualifier_ctx := 'CUSTOMER';
319 l_qualifier_attr := 'QUALIFIER_ATTRIBUTE11';
320 END IF;
321
322 open c_qual_name(l_qualifier_ctx,l_qualifier_attr,p_qualifier_id);
323 fetch c_qual_name into l_cust_name;
324 close c_qual_name;
325 RETURN l_cust_name;
326 END;
327
328
329 FUNCTION get_commited_amount(p_list_header_id IN NUMBER)
330 RETURN NUMBER
331 IS
332 p_committed_amount NUMBER := 0;
333
334 CURSOR curr_committed_amount(list_header_id NUMBER) IS
335 SELECT SUM(DECODE(recal_flag, 'N',committed_amt)) committed_amount
336 FROM ozf_object_checkbook_v
337 WHERE object_id = list_header_id
338 AND object_type = 'OFFR';
339
340 BEGIN
341 OPEN curr_committed_amount( p_list_header_id ) ;
342 FETCH curr_committed_amount INTO p_committed_amount ;
343 CLOSE curr_committed_amount ;
344 RETURN p_committed_amount ;
345
346 EXCEPTION
347 WHEN OTHERS THEN
348 RETURN 0;
349 END;
350
351
352 FUNCTION get_recal_commited_amount(p_list_header_id IN NUMBER)
353 RETURN NUMBER
354 IS
355 p_committed_amount NUMBER := 0;
356
357 CURSOR curr_committed_amount(list_header_id NUMBER) IS
358 SELECT SUM(committed_amt) recal_committed_amount
359 FROM ozf_object_checkbook_v
360 WHERE object_id = list_header_id
361 AND object_type = 'OFFR';
362
363 BEGIN
364 OPEN curr_committed_amount( p_list_header_id ) ;
365 FETCH curr_committed_amount INTO p_committed_amount ;
366 CLOSE curr_committed_amount ;
367 RETURN p_committed_amount ;
368
369 EXCEPTION
370 WHEN OTHERS THEN
371 RETURN 0;
372 END;
373
374 FUNCTION get_earned_amount(p_list_header_id IN NUMBER)
375 RETURN NUMBER
376 IS
377 p_earned_amount NUMBER := 0;
378
379 CURSOR curr_earned_amount(list_header_id NUMBER) IS
380 SELECT NVL(SUM(NVL(utilized_amt,0)),0) utlized_amount
381 FROM ozf_object_checkbook_v
382 WHERE object_id = list_header_id
383 AND object_type = 'OFFR';
384
385 BEGIN
386 OPEN curr_earned_amount( p_list_header_id ) ;
387 FETCH curr_earned_amount INTO p_earned_amount ;
388 CLOSE curr_earned_amount ;
389 RETURN p_earned_amount ;
390
391 EXCEPTION
392 WHEN OTHERS THEN
393 RETURN 0;
394 END;
395
396 FUNCTION get_paid_amount(p_list_header_id IN NUMBER)
397 RETURN NUMBER
398 IS
399 p_paid_amount NUMBER := 0;
400
401 CURSOR curr_paid_amount(list_header_id NUMBER) IS
402 SELECT NVL(SUM(NVL(paid_amt,0)),0) paid_amount FROM ozf_object_checkbook_v
403 WHERE object_id = list_header_id
404 AND object_type = 'OFFR';
405
406 BEGIN
407 OPEN curr_paid_amount( p_list_header_id ) ;
408 FETCH curr_paid_amount INTO p_paid_amount ;
409 CLOSE curr_paid_amount ;
410 RETURN p_paid_amount ;
411
412 EXCEPTION
413 WHEN OTHERS THEN
414 RETURN 0;
415 END;
416
417
418 FUNCTION get_list_line_no RETURN NUMBER IS
419 x number;
420 CURSOR cur_get_list_line_no IS
421 SELECT ams_qp_list_line_no_s.nextval from dual;
422 BEGIN
423 OPEN cur_get_list_line_no;
424 FETCH cur_get_list_line_no INTO x;
425 CLOSE cur_get_list_line_no;
426 RETURN x;
427
428 EXCEPTION
429 WHEN OTHERS THEN
430 RETURN 1;
431 END;
432
433
434 FUNCTION get_budget_source_count(p_list_header_id IN NUMBER)
435 RETURN NUMBER IS
436 p_count NUMBER := 0;
437
438 CURSOR cur_budget_source_count(list_header_id NUMBER) IS
439 SELECT count(1)
440 FROM ozf_act_budgets
441 where act_budget_used_by_id = list_header_id
442 and arc_act_budget_used_by = 'OFFR'
443 AND transfer_type = 'REQUEST';
444
445
446 BEGIN
447 OPEN cur_budget_source_count( p_list_header_id ) ;
448 FETCH cur_budget_source_count INTO p_count ;
449 CLOSE cur_budget_source_count ;
450 return p_count ;
451
452 EXCEPTION
453 WHEN OTHERS THEN
454 RETURN 0;
455 END;
456
457 PROCEDURE add_message ( p_msg_count IN NUMBER)
458 IS
459 l_msg_data VARCHAR2(2000);
460 BEGIN
461 FOR i IN 1 .. p_msg_count LOOP
462 l_msg_data := Oe_Msg_Pub.get( p_msg_index => i,
463 p_encoded => 'F' );
464 Fnd_Message.SET_NAME('OZF','OZF_QP_ERROR');
465 Fnd_Message.SET_TOKEN('ERROR_MSG',l_msg_data);
466 Fnd_Msg_Pub.ADD;
467 END LOOP;
468 END add_message;
469
470 FUNCTION find_territories( aso_party_id IN NUMBER,oe_sold_to_org IN NUMBER)
471 RETURN Qp_Attr_Mapping_Pub.t_multirecord
472 IS
473
474 l_multirecord Qp_Attr_Mapping_Pub.t_multirecord;
475
476 BEGIN
477
478 oe_debug_pub.add('Before Calling OZF_QP_QUAL_PVT.Find_SA_Territories: ');
479 oe_debug_pub.add('aso_party_id: ' || aso_party_id);
480 oe_debug_pub.add('oe_sold_to_org: ' || oe_sold_to_org);
481 l_multirecord := OZF_QP_QUAL_PVT.Find_SA_Territories(p_party_id => aso_party_id
482 ,p_sold_to_org => oe_sold_to_org);
483 oe_debug_pub.add('After Calling OZF_QP_QUAL_PVT.Find_SA_Territories: Count ' || l_multirecord.COUNT);
484
485 RETURN l_multirecord;
486
487 END find_territories;
488
489
490 FUNCTION find_sections( aso_inventory_item_id IN NUMBER, oe_inventory_item_id IN NUMBER)
491 RETURN Qp_Attr_Mapping_Pub.t_multirecord
492 IS
493 p_inventory_item_id NUMBER;
494
495 CURSOR cur_item_sections IS
496 SELECT jsi.section_id
497 FROM ibe_dsp_section_items jsi
498 WHERE jsi.inventory_item_id = p_inventory_item_id;
499
500 l_multirecord Qp_Attr_Mapping_Pub.t_multirecord;
501 l_count NUMBER := 1;
502
503 BEGIN
504 IF aso_inventory_item_id = Fnd_Api.g_miss_num THEN
505 p_inventory_item_id := oe_inventory_item_id;
506 ELSE
507 p_inventory_item_id := aso_inventory_item_id;
508 END IF;
509 FOR sections_rec IN cur_item_sections LOOP
510 l_multirecord(l_count) := sections_rec.section_id;
511 l_count := l_count + 1;
512 END LOOP;
513
514 RETURN(l_multirecord);
515
516 END;
517
518
519 PROCEDURE process_adv_options
520 (
521 p_init_msg_list IN VARCHAR2
522 ,p_api_version IN NUMBER
523 ,p_commit IN VARCHAR2
524 ,x_return_status OUT NOCOPY VARCHAR2
525 ,x_msg_count OUT NOCOPY NUMBER
526 ,x_msg_data OUT NOCOPY VARCHAR2
527 ,p_advanced_options_rec IN ADVANCED_OPTION_REC_TYPE
528 )
529 IS
530 CURSOR cur_get_lines IS
531 SELECT list_line_id,modifier_level_code,price_break_type_code
532 FROM qp_list_lines
533 WHERE list_header_id = p_advanced_options_rec.list_header_id;
534
535 -- bug 3435528 populate cust_account_id to beneficiary_account_id
536 CURSOR c_cust_account_id(p_site_use_id NUMBER, p_site_use_code VARCHAR2) IS
537 SELECT a.cust_account_id
538 FROM hz_cust_acct_sites_all a, hz_cust_site_uses_all b
539 WHERE a.cust_acct_site_id = b.cust_acct_site_id
540 AND b.site_use_code = p_site_use_code
541 AND b.site_use_id = p_site_use_id;
542 -- end comment
543
544 l_modifiers_tbl Qp_Modifiers_Pub.modifiers_tbl_type;
545
546 l_api_version CONSTANT NUMBER := 1.0;
547 l_api_name CONSTANT VARCHAR2(30) := 'process_adv_options';
548 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
549 l_object_version_number NUMBER;
550
551 i NUMBER := 1;
552
553 v_modifier_list_rec qp_modifiers_pub.modifier_list_rec_type;
554 v_modifier_list_val_rec qp_modifiers_pub.modifier_list_val_rec_type;
555 v_modifiers_tbl qp_modifiers_pub.modifiers_tbl_type;
556 v_modifiers_val_tbl qp_modifiers_pub.modifiers_val_tbl_type;
557 v_qualifiers_tbl qp_qualifier_rules_pub.qualifiers_tbl_type;
558 v_qualifiers_val_tbl qp_qualifier_rules_pub.qualifiers_val_tbl_type;
559 v_pricing_attr_tbl qp_modifiers_pub.pricing_attr_tbl_type;
560 v_pricing_attr_val_tbl qp_modifiers_pub.pricing_attr_val_tbl_type;
561 l_promotional_offers_rec ozf_promotional_offers_pvt.offers_rec_type;
562
563 BEGIN
564
565 SAVEPOINT process_adv_options;
566
567 IF Fnd_Api.to_boolean(p_init_msg_list) THEN
568 Fnd_Msg_Pub.initialize;
569 END IF;
570
571 IF NOT Fnd_Api.compatible_api_call
572 (
573 l_api_version,
574 p_api_version,
575 l_api_name,
576 g_pkg_name
577 )
578 THEN
579 RAISE Fnd_Api.g_exc_unexpected_error;
580 END IF;
581
582 x_return_status := Fnd_Api.g_ret_sts_success;
583
584 FOR line_rec IN cur_get_lines LOOP
585 l_modifiers_tbl(i).pricing_phase_id := p_advanced_options_rec.pricing_phase_id;
586 l_modifiers_tbl(i).modifier_level_code := p_advanced_options_rec.modifier_level_code;
587 l_modifiers_tbl(i).incompatibility_grp_code := p_advanced_options_rec.incompatibility_grp_code;
588 l_modifiers_tbl(i).product_precedence := p_advanced_options_rec.product_precedence;
589 IF line_rec.modifier_level_code <> 'ORDER' THEN
590 l_modifiers_tbl(i).pricing_group_sequence := p_advanced_options_rec.pricing_group_sequence;
591 END IF;
592 l_modifiers_tbl(i).print_on_invoice_flag := p_advanced_options_rec.print_on_invoice_flag;
593 l_modifiers_tbl(i).price_break_type_code := line_rec.price_break_type_code;
594 l_modifiers_tbl(i).list_line_id := line_rec.list_line_id;
595 l_modifiers_tbl(i).operation := Qp_Globals.G_OPR_UPDATE;
596 i:= i+1;
597 END LOOP;
598
599 Qp_Modifiers_Pub.process_modifiers(
600 p_api_version_number => 1.0,
601 p_init_msg_list => p_init_msg_list,
602 p_return_values => Fnd_Api.G_FALSE,
603 x_return_status => x_return_status,
604 x_msg_count => x_msg_count,
605 x_msg_data => x_msg_data,
606 p_modifiers_tbl => l_modifiers_tbl,
607 x_modifier_list_rec => v_modifier_list_rec,
608 x_modifier_list_val_rec => v_modifier_list_val_rec,
609 x_modifiers_tbl => v_modifiers_tbl,
610 x_modifiers_val_tbl => v_modifiers_val_tbl,
611 x_qualifiers_tbl => v_qualifiers_tbl,
612 x_qualifiers_val_tbl => v_qualifiers_val_tbl,
613 x_pricing_attr_tbl => v_pricing_attr_tbl,
614 x_pricing_attr_val_tbl => v_pricing_attr_val_tbl
615 );
616
617 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
618 add_message(x_msg_count);
619 RAISE Fnd_Api.g_exc_error;
620 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
621 add_message(x_msg_count);
622 RAISE Fnd_Api.g_exc_unexpected_error;
623 END IF;
624
625 l_promotional_offers_rec.qp_list_header_id := p_advanced_options_rec.list_header_id;
626 l_promotional_offers_rec.autopay_flag := p_advanced_options_rec.autopay_flag;
627 l_promotional_offers_rec.autopay_days := p_advanced_options_rec.autopay_days;
628 l_promotional_offers_rec.autopay_method := p_advanced_options_rec.autopay_method;
629 /*
630 IF p_advanced_options_rec.autopay_days IS NOT NULL THEN
631 l_promotional_offers_rec.autopay_days := p_advanced_options_rec.autopay_days;
632 ELSE
633 l_promotional_offers_rec.autopay_days := FND_PROFILE.VALUE('OZF_DEFAULT_AUTOPAY_DAYS');
634 END IF;
635
636 IF p_advanced_options_rec.autopay_method IS NOT NULL THEN
637 l_promotional_offers_rec.autopay_method := p_advanced_options_rec.autopay_method;
638 ELSE
639 l_promotional_offers_rec.autopay_method := FND_PROFILE.VALUE('OZF_DEFAULT_AUTOPAY_METHOD');
640 END IF;
641 */
642 l_promotional_offers_rec.autopay_party_attr := p_advanced_options_rec.autopay_party_attr;
643 l_promotional_offers_rec.autopay_party_id := p_advanced_options_rec.autopay_party_id;
644
645 -- bug 3435528
646 IF p_advanced_options_rec.autopay_party_attr IS NULL OR p_advanced_options_rec.autopay_party_id IS NULL THEN
647 l_promotional_offers_rec.beneficiary_account_id := NULL;
648 l_promotional_offers_rec.autopay_party_attr := NULL;
649 l_promotional_offers_rec.autopay_party_id := NULL;
650 ELSIF p_advanced_options_rec.autopay_party_attr = 'CUSTOMER' THEN
651 l_promotional_offers_rec.beneficiary_account_id := p_advanced_options_rec.autopay_party_id;
652 ElSIF p_advanced_options_rec.autopay_party_attr = 'CUSTOMER_BILL_TO' THEN
653 OPEN c_cust_account_id(p_advanced_options_rec.autopay_party_id, 'BILL_TO');
654 FETCH c_cust_account_id INTO l_promotional_offers_rec.beneficiary_account_id;
655 CLOSE c_cust_account_id;
656 ElSIF p_advanced_options_rec.autopay_party_attr = 'SHIP_TO' THEN
657 OPEN c_cust_account_id(p_advanced_options_rec.autopay_party_id, 'SHIP_TO');
658 FETCH c_cust_account_id INTO l_promotional_offers_rec.beneficiary_account_id;
659 CLOSE c_cust_account_id;
660 END IF;
661 -- end comment
662
663 OZF_Promotional_Offers_Pvt.UPDATE_OFFERS(
664 p_api_version_number => 1.0,
665 x_return_status => x_return_status,
666 x_msg_count => x_msg_count,
667 x_msg_data => x_msg_data,
668 p_offers_rec => l_promotional_offers_rec,
669 x_object_version_number => l_object_version_number
670 );
671
672 Fnd_Msg_Pub.Count_AND_Get
673 ( p_count => x_msg_count,
674 p_data => x_msg_data,
675 p_encoded => Fnd_Api.G_FALSE
676 );
677 IF p_commit = Fnd_Api.g_true THEN
678 COMMIT WORK;
679 END IF;
680
681 EXCEPTION
682 WHEN Fnd_Api.G_EXC_ERROR THEN
683 x_return_status := Fnd_Api.g_ret_sts_error ;
684 ROLLBACK TO process_adv_options;
685 Fnd_Msg_Pub.Count_AND_Get
686 ( p_count => x_msg_count,
687 p_data => x_msg_data,
688 p_encoded => Fnd_Api.G_FALSE
689 );
690 WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
691 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
692 ROLLBACK TO process_adv_options;
693 Fnd_Msg_Pub.Count_AND_Get
694 ( p_count => x_msg_count,
695 p_data => x_msg_data,
696 p_encoded => Fnd_Api.G_FALSE
697 );
698 WHEN OTHERS THEN
699 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
700 ROLLBACK TO process_adv_options;
701 IF Fnd_Msg_Pub.Check_Msg_Level ( Fnd_Msg_Pub.G_MSG_LVL_UNEXP_ERROR ) THEN
702 Fnd_Msg_Pub.Add_Exc_Msg( G_PKG_NAME,l_api_name);
703 END IF;
704 Fnd_Msg_Pub.Count_AND_Get
705 ( p_count => x_msg_count,
706 p_data => x_msg_data,
707 p_encoded => Fnd_Api.G_FALSE
708 );
709 END;
710
711
712 PROCEDURE create_offer_tiers
713 (
714 p_init_msg_list IN VARCHAR2
715 ,p_api_version IN NUMBER
716 ,p_commit IN VARCHAR2
717 ,x_return_status OUT NOCOPY VARCHAR2
718 ,x_msg_count OUT NOCOPY NUMBER
719 ,x_msg_data OUT NOCOPY VARCHAR2
720 ,p_modifier_line_tbl IN MODIFIER_LINE_TBL_TYPE
721 ,x_error_location OUT NOCOPY NUMBER
722 -- ,x_modifiers_tbl OUT NOCOPY qp_modifiers_pub.modifiers_tbl_type
723 -- ,x_pricing_attr_tbl OUT NOCOPY qp_modifiers_pub.pricing_attr_tbl_type
724 )
725 IS
726 l_api_version CONSTANT NUMBER := 1.0;
727 l_api_name CONSTANT VARCHAR2(30) := 'create_offer_tiers';
728 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
729
730 l_modifiers_tbl qp_modifiers_pub.modifiers_tbl_type;
731 l_pricing_attr_tbl Qp_Modifiers_Pub.pricing_attr_tbl_type;
732 v_modifier_list_rec qp_modifiers_pub.modifier_list_rec_type;
733 v_modifier_list_val_rec qp_modifiers_pub.modifier_list_val_rec_type;
734 v_modifiers_tbl qp_modifiers_pub.modifiers_tbl_type;
735 v_modifiers_val_tbl qp_modifiers_pub.modifiers_val_tbl_type;
736 v_qualifiers_tbl qp_qualifier_rules_pub.qualifiers_tbl_type;
737 v_qualifiers_val_tbl qp_qualifier_rules_pub.qualifiers_val_tbl_type;
738 v_pricing_attr_tbl qp_modifiers_pub.pricing_attr_tbl_type;
739 v_pricing_attr_val_tbl qp_modifiers_pub.pricing_attr_val_tbl_type;
740
741 CURSOR cur_get_adv_options(parent_list_line_id NUMBER) IS
742 SELECT proration_type_code ,
743 product_precedence ,
744 pricing_group_sequence,
745 print_on_invoice_flag ,
746 pricing_phase_id ,
747 modifier_level_code ,
748 automatic_flag
749 FROM qp_list_lines
750 WHERE list_line_id = parent_list_line_id;
751
752 CURSOR cur_get_prod_info( parent_list_line_id NUMBER) IS
753 SELECT product_attribute_context,
754 product_attribute ,
755 product_attr_value,
756 product_uom_code ,
757 pricing_attribute_context
758 FROM qp_pricing_attributes
759 WHERE list_line_id = parent_list_line_id;
760
761 -- fix for accrual_flag for multi-tier lines
762 CURSOR c_offer_type(p_list_header_id NUMBER) IS
763 SELECT DECODE(offer_type, 'VOLUME_OFFER', volume_offer_type, offer_type)
764 FROM ozf_offers
765 WHERE qp_list_header_id = p_list_header_id;
766 l_offer_type VARCHAR2(30);
767
768 CURSOR c_pbh_pricing_attr_id(l_id NUMBER) IS
769 SELECT c.pricing_attribute_id,
770 c.list_line_id
771 FROM qp_rltd_modifiers a, qp_pricing_attributes b, qp_pricing_attributes c
772 WHERE c.list_line_id = a.from_rltd_modifier_id
773 AND a.to_rltd_modifier_id = b.list_line_id
774 AND b.pricing_attribute_id = l_id;
775
776 l_pricing_attribute_id NUMBER;
777 l_line_index NUMBER;
778 l_list_line_id NUMBER;
779 BEGIN
780
781 SAVEPOINT create_offer_tiers;
782
783 IF Fnd_Api.to_boolean(p_init_msg_list) THEN
784 Fnd_Msg_Pub.initialize;
785 END IF;
786
787 IF NOT Fnd_Api.compatible_api_call
788 (
789 l_api_version,
790 p_api_version,
791 l_api_name,
792 g_pkg_name
793 )
794 THEN
795 RAISE Fnd_Api.g_exc_unexpected_error;
796 END IF;
797
798 x_return_status := Fnd_Api.g_ret_sts_success;
799 x_error_location := 0;
800
801
802
803 IF p_modifier_line_tbl.count > 0 THEN
804 FOR i in p_modifier_line_tbl.first..p_modifier_line_tbl.last LOOP
805 IF p_modifier_line_tbl.exists(i) THEN
806 IF p_modifier_line_tbl(i).operation <> fnd_api.g_miss_char THEN
807 IF p_modifier_line_tbl(i).operation = 'CREATE' THEN
808 debug_message('Operation Create');
809 OPEN cur_get_adv_options(p_modifier_line_tbl(i).list_line_id);
810 FETCH cur_get_adv_options INTO l_modifiers_tbl(i).proration_type_code,
811 l_modifiers_tbl(i).product_precedence ,
812 l_modifiers_tbl(i).pricing_group_sequence,
813 l_modifiers_tbl(i).print_on_invoice_flag,
814 l_modifiers_tbl(i).pricing_phase_id ,
815 l_modifiers_tbl(i).modifier_level_code,
816 l_modifiers_tbl(i).automatic_flag ;
817 CLOSE cur_get_adv_options;
818
819 OPEN cur_get_prod_info(p_modifier_line_tbl(i).list_line_id);
820 FETCH cur_get_prod_info INTO l_pricing_attr_tbl(i).product_attribute_context ,
821 l_pricing_attr_tbl(i).product_attribute ,
822 l_pricing_attr_tbl(i).product_attr_value ,
823 l_pricing_attr_tbl(i).product_uom_code ,
824 l_pricing_attr_tbl(i).pricing_attribute_context ;
825
826 CLOSE cur_get_prod_info;
827
828 l_modifiers_tbl(i).from_rltd_modifier_id := p_modifier_line_tbl(i).list_line_id;
829 l_modifiers_tbl(i).list_line_type_code := 'DIS';
830 l_modifiers_tbl(i).rltd_modifier_grp_type := 'PRICE BREAK';
831 l_modifiers_tbl(i).rltd_modifier_grp_no := 1;
832 l_modifiers_tbl(i).list_header_id := p_modifier_line_tbl(i).list_header_id;
833 l_pricing_attr_tbl(i).modifiers_index := i;
834 ELSE
835 l_modifiers_tbl(i).list_line_id := p_modifier_line_tbl(i).list_line_id;
836 END IF;
837
838 l_modifiers_tbl(i).operation := p_modifier_line_tbl(i).operation ;
839 l_modifiers_tbl(i).arithmetic_operator := p_modifier_line_tbl(i).arithmetic_operator;
840 l_modifiers_tbl(i).operand := p_modifier_line_tbl(i).operand;
841 l_modifiers_tbl(i).price_break_type_code := p_modifier_line_tbl(i).price_break_type_code;
842 debug_message('Adding accr flag');
843 OPEN c_offer_type (l_modifiers_tbl(i).list_header_id);
844 FETCH c_offer_type INTO l_offer_type;
845 CLOSE c_offer_type;
846 IF l_offer_type = 'ACCRUAL' THEN
847 l_modifiers_tbl(i).accrual_flag := 'Y';
848 ELSIF l_offer_type = 'OFF_INVOICE' THEN
849 l_modifiers_tbl(i).accrual_flag := 'N';
850 END IF;
851 l_modifiers_tbl(i).start_date_active := p_modifier_line_tbl(i).start_date_active;
852 debug_message('Done start date');
853 l_pricing_attr_tbl(i).pricing_attribute := p_modifier_line_tbl(i).pricing_attr;
854 l_pricing_attr_tbl(i).pricing_attribute_id := p_modifier_line_tbl(i).pricing_attribute_id;
855 l_pricing_attr_tbl(i).pricing_attr_value_from := p_modifier_line_tbl(i).pricing_attr_value_from;
856 l_pricing_attr_tbl(i).pricing_attr_value_to := p_modifier_line_tbl(i).pricing_attr_value_to;
857 l_pricing_attr_tbl(i).comparison_operator_code := 'BETWEEN';
858 l_pricing_attr_tbl(i).operation := p_modifier_line_tbl(i).operation;
859 END IF;
860 END IF;
861 END LOOP;
862
863 OPEN c_pbh_pricing_attr_id(p_modifier_line_tbl(p_modifier_line_tbl.first).pricing_attribute_id);
864 FETCH c_pbh_pricing_attr_id INTO l_pricing_attribute_id, l_list_line_id;
865 CLOSE c_pbh_pricing_attr_id;
866
867 l_line_index := l_pricing_attr_tbl.last + 1;
868
869 l_pricing_attr_tbl(l_line_index).pricing_attribute_id := l_pricing_attribute_id;
870 l_pricing_attr_tbl(l_line_index).operation := 'UPDATE';
871 l_pricing_attr_tbl(l_line_index).pricing_attribute := p_modifier_line_tbl(p_modifier_line_tbl.first).pricing_attr;
872
873 -- nirprasa, fix for bug 7340864
874 IF(p_modifier_line_tbl(p_modifier_line_tbl.first).operation <> 'CREATE') THEN
875 l_modifiers_tbl(l_line_index).price_break_type_code := p_modifier_line_tbl(p_modifier_line_tbl.first).price_break_type_code;
876 l_modifiers_tbl(l_line_index).operation := 'UPDATE';
877 l_modifiers_tbl(l_line_index).list_line_id := l_list_line_id;
878 END IF;
879
880 END IF;
881 debug_message('Calling Pub Process in tiers');
882 Qp_Modifiers_Pub.process_modifiers(
883 p_api_version_number => 1.0,
884 p_init_msg_list => p_init_msg_list,
885 p_return_values => Fnd_Api.G_FALSE,
886 x_return_status => x_return_status,
887 x_msg_count => x_msg_count,
888 x_msg_data => x_msg_data,
889 p_modifiers_tbl => l_modifiers_tbl,
890 p_pricing_attr_tbl => l_pricing_attr_tbl,
891 x_modifier_list_rec => v_modifier_list_rec,
892 x_modifier_list_val_rec => v_modifier_list_val_rec,
893 x_modifiers_tbl => v_modifiers_tbl,
894 x_modifiers_val_tbl => v_modifiers_val_tbl,
895 x_qualifiers_tbl => v_qualifiers_tbl,
896 x_qualifiers_val_tbl => v_qualifiers_val_tbl,
897 x_pricing_attr_tbl => v_pricing_attr_tbl,
898 x_pricing_attr_val_tbl => v_pricing_attr_val_tbl
899 );
900
901 IF x_return_status <> Fnd_Api.g_ret_sts_success THEN
902 IF v_modifiers_tbl.COUNT > 0 THEN
903 FOR i IN v_modifiers_tbl.first..v_modifiers_tbl.last LOOP
904 IF v_modifiers_tbl.EXISTS(i) THEN
905 IF v_modifiers_tbl(i).return_status <> Fnd_Api.g_ret_sts_success THEN
906 x_error_location := i;
907 EXIT;
908 END IF;
909 END IF;
910 END LOOP;
911 END IF;
912 END IF;
913
914 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
915 add_message(x_msg_count);
916 RAISE Fnd_Api.g_exc_error;
917 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
918 add_message(x_msg_count);
919 RAISE Fnd_Api.g_exc_unexpected_error;
920 END IF;
921
922
923 -- x_modifiers_tbl := v_modifiers_tbl;
924 -- x_pricing_attr_tbl := v_pricing_attr_tbl;
925
926 Fnd_Msg_Pub.Count_AND_Get
927 ( p_count => x_msg_count,
928 p_data => x_msg_data,
929 p_encoded => Fnd_Api.G_FALSE
930 );
931 IF p_commit = Fnd_Api.g_true THEN
932 COMMIT WORK;
933 END IF;
934 debug_message('End Create Tiers');
935 EXCEPTION
936 WHEN Fnd_Api.G_EXC_ERROR THEN
937 x_return_status := Fnd_Api.g_ret_sts_error ;
938 ROLLBACK TO create_offer_tiers;
939 Fnd_Msg_Pub.Count_AND_Get
940 ( p_count => x_msg_count,
941 p_data => x_msg_data,
942 p_encoded => Fnd_Api.G_FALSE
943 );
944 WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
945 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
946 ROLLBACK TO create_offer_tiers;
947 Fnd_Msg_Pub.Count_AND_Get
948 ( p_count => x_msg_count,
949 p_data => x_msg_data,
950 p_encoded => Fnd_Api.G_FALSE
951 );
952 WHEN OTHERS THEN
953 x_return_status := Fnd_Api.g_ret_sts_unexp_erroR ;
954 ROLLBACK TO create_offer_tiers;
955 IF Fnd_Msg_Pub.Check_Msg_Level ( Fnd_Msg_Pub.G_MSG_LVL_UNEXP_ERROR ) THEN
956 Fnd_Msg_Pub.Add_Exc_Msg( G_PKG_NAME,l_api_name);
957 END IF;
958 Fnd_Msg_Pub.Count_AND_Get
959 ( p_count => x_msg_count,
960 p_data => x_msg_data,
961 p_encoded => Fnd_Api.G_FALSE
962 );
963 END;
964
965
966 PROCEDURE populateRltdExclusions
967 (
968 x_return_status OUT NOCOPY VARCHAR2
969 ,x_msg_count OUT NOCOPY NUMBER
970 ,x_msg_data OUT NOCOPY VARCHAR2
971 ,p_pricing_attr_tbl IN PRICING_ATTR_TBL_TYPE
972 ,px_pricing_attr_tbl OUT NOCOPY PRICING_ATTR_TBL_TYPE
973 )
974 IS
975 CURSOR c_rltdListLine(cp_listLineId NUMBER) IS
976 SELECT nvl(related_modifier_id,-1) related_modifier_id
977 FROM ozf_related_deal_lines a
978 WHERE a.modifier_id = cp_listLineId;
979
980 CURSOR c_pricingAttrId (cp_listLineId NUMBER, cp_productAttr VARCHAR2, cp_productAttrValue VARCHAR2) IS
981 SELECT pricing_attribute_id
982 FROM qp_pricing_attributes
983 WHERE list_line_id = cp_listLineId
984 AND product_attribute = cp_productAttr
985 AND product_attr_value = cp_productAttrValue
986 AND excluder_flag = 'Y';
987
988 i NUMBER:= 0;
989 BEGIN
990 x_return_status := FND_API.G_RET_STS_SUCCESS;
991 i := 1;
992 IF nvl(p_pricing_attr_tbl.count, 0) > 0 THEN
993 FOR j in p_pricing_attr_tbl.first .. p_pricing_attr_tbl.last LOOP
994 IF p_pricing_attr_tbl.exists(j) THEN
995 FOR l_rltdListLine IN c_rltdListLine(cp_listLineId => p_pricing_attr_tbl(j).list_line_id) LOOP
996 IF l_rltdListLine.related_modifier_id = -1 THEN
997 null;
998 ELSE
999 px_pricing_attr_tbl(i) := p_pricing_attr_tbl(j);
1000 px_pricing_attr_tbl(i).list_line_id := l_rltdListLine.related_modifier_id;
1001 IF p_pricing_attr_tbl(j).operation <> 'CREATE' THEN
1002 OPEN c_pricingAttrId(cp_listLineId => px_pricing_attr_tbl(i).list_line_id
1003 , cp_productAttr => p_pricing_attr_tbl(j).product_attribute
1004 , cp_productAttrValue => p_pricing_attr_tbl(j).product_attr_value
1005 );
1006 FETCH c_pricingAttrId INTO px_pricing_attr_tbl(i).pricing_attribute_id;
1007 IF c_pricingAttrId%NOTFOUND THEN
1008 px_pricing_attr_tbl(i).operation := null;
1009 END IF;
1010 CLOSE c_pricingAttrId;
1011 END IF;
1012 END IF;
1013 END LOOP;
1014 END IF;
1015 END LOOP;
1016 END IF;
1017
1018 END populateRltdExclusions;
1019
1020 PROCEDURE processRegExclusions
1021 (
1022 p_init_msg_list IN VARCHAR2
1023 ,p_api_version IN NUMBER
1024 ,p_commit IN VARCHAR2
1025 ,x_return_status OUT NOCOPY VARCHAR2
1026 ,x_msg_count OUT NOCOPY NUMBER
1027 ,x_msg_data OUT NOCOPY VARCHAR2
1028 ,p_pricing_attr_tbl IN PRICING_ATTR_TBL_TYPE
1029 ,x_error_location OUT NOCOPY NUMBER
1030 )
1031 IS
1032 l_api_version CONSTANT NUMBER := 1.0;
1033 l_api_name CONSTANT VARCHAR2(30) := 'processRegExclusions';
1034 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
1035 l_pricing_attr_tbl Qp_Modifiers_Pub.pricing_attr_tbl_type;
1036 v_modifier_list_rec qp_modifiers_pub.modifier_list_rec_type;
1037 v_modifier_list_val_rec qp_modifiers_pub.modifier_list_val_rec_type;
1038 v_modifiers_tbl qp_modifiers_pub.modifiers_tbl_type;
1039 v_modifiers_val_tbl qp_modifiers_pub.modifiers_val_tbl_type;
1040 v_qualifiers_tbl qp_qualifier_rules_pub.qualifiers_tbl_type;
1041 v_qualifiers_val_tbl qp_qualifier_rules_pub.qualifiers_val_tbl_type;
1042 v_pricing_attr_tbl qp_modifiers_pub.pricing_attr_tbl_type;
1043 v_pricing_attr_val_tbl qp_modifiers_pub.pricing_attr_val_tbl_type;
1044
1045 BEGIN
1046 SAVEPOINT process_exlusions;
1047
1048 IF Fnd_Api.to_boolean(p_init_msg_list) THEN
1049 Fnd_Msg_Pub.initialize;
1050 END IF;
1051
1052 IF NOT Fnd_Api.compatible_api_call
1053 (
1054 l_api_version,
1055 p_api_version,
1056 l_api_name,
1057 g_pkg_name
1058 )
1059 THEN
1060 RAISE Fnd_Api.g_exc_unexpected_error;
1061 END IF;
1062
1063 x_return_status := Fnd_Api.g_ret_sts_success;
1064 x_error_location := 0;
1065 IF p_pricing_attr_tbl.COUNT > 0 THEN
1066 FOR i IN p_pricing_attr_tbl.first..p_pricing_attr_tbl.last LOOP
1067 IF p_pricing_attr_tbl.EXISTS(i) THEN
1068 --dbms_output.put_line('start:'||i);
1069 l_pricing_attr_tbl(i).list_line_id := p_pricing_attr_tbl(i).list_line_id;
1070
1071 l_pricing_attr_tbl(i).product_attribute := p_pricing_attr_tbl(i).product_attribute;
1072 l_pricing_attr_tbl(i).product_attribute_context := 'ITEM';
1073 l_pricing_attr_tbl(i).product_attr_value := p_pricing_attr_tbl(i).product_attr_value;
1074
1075 IF p_pricing_attr_tbl(i).operation <> 'CREATE' THEN
1076 l_pricing_attr_tbl(i).pricing_attribute_id := p_pricing_attr_tbl(i).pricing_attribute_id;
1077 END IF;
1078 l_pricing_attr_tbl(i).excluder_flag := 'Y';
1079 l_pricing_attr_tbl(i).operation := p_pricing_attr_tbl(i).operation;
1080 --dbms_output.put_line('end:'||i);
1081 END IF;
1082 END LOOP;
1083 END IF;
1084
1085 Qp_Modifiers_Pub.process_modifiers(
1086 p_api_version_number => 1.0,
1087 p_init_msg_list => p_init_msg_list,
1088 p_return_values => Fnd_Api.G_FALSE,
1089 x_return_status => x_return_status,
1090 x_msg_count => x_msg_count,
1091 x_msg_data => x_msg_data,
1092 p_pricing_attr_tbl => l_pricing_attr_tbl,
1093 x_modifier_list_rec => v_modifier_list_rec,
1094 x_modifier_list_val_rec => v_modifier_list_val_rec,
1095 x_modifiers_tbl => v_modifiers_tbl,
1096 x_modifiers_val_tbl => v_modifiers_val_tbl,
1097 x_qualifiers_tbl => v_qualifiers_tbl,
1098 x_qualifiers_val_tbl => v_qualifiers_val_tbl,
1099 x_pricing_attr_tbl => v_pricing_attr_tbl,
1100 x_pricing_attr_val_tbl => v_pricing_attr_val_tbl
1101 );
1102 --dbms_output.put_line('done qp api:'||x_return_status);
1103
1104 IF x_return_status <> Fnd_Api.g_ret_sts_success THEN
1105 IF v_pricing_attr_tbl.COUNT > 0 THEN
1106 FOR i IN v_pricing_attr_tbl.first..v_pricing_attr_tbl.last LOOP
1107 IF v_pricing_attr_tbl.EXISTS(i) THEN
1108 IF v_pricing_attr_tbl(i).return_status <> Fnd_Api.g_ret_sts_success THEN
1109 x_error_location := i;
1110 EXIT;
1111 END IF;
1112 END IF;
1113 END LOOP;
1114 END IF;
1115 END IF;
1116
1117 --dbms_output.put_line('done qp api:'||x_return_status);
1118
1119 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
1120 add_message(x_msg_count);
1121 RAISE Fnd_Api.g_exc_error;
1122 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
1123 add_message(x_msg_count);
1124 RAISE Fnd_Api.g_exc_unexpected_error;
1125 END IF;
1126
1127 IF p_commit = Fnd_Api.g_true THEN
1128 COMMIT WORK;
1129 END IF;
1130 --dbms_output.put_line('done qp api:'||x_return_status);
1131 --dbms_output.put_line('done :');
1132 EXCEPTION
1133 WHEN Fnd_Api.G_EXC_ERROR THEN
1134 x_return_status := Fnd_Api.g_ret_sts_error ;
1135 ROLLBACK TO process_exlusions;
1136 Fnd_Msg_Pub.Count_AND_Get
1137 ( p_count => x_msg_count,
1138 p_data => x_msg_data,
1139 p_encoded => Fnd_Api.G_FALSE
1140 );
1141 WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
1142 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
1143 ROLLBACK TO process_exlusions;
1144 Fnd_Msg_Pub.Count_AND_Get
1145 ( p_count => x_msg_count,
1146 p_data => x_msg_data,
1147 p_encoded => Fnd_Api.G_FALSE
1148 );
1149 WHEN OTHERS THEN
1150 x_return_status := Fnd_Api.g_ret_sts_unexp_erroR ;
1151 ROLLBACK TO process_exlusions;
1152 IF Fnd_Msg_Pub.Check_Msg_Level ( Fnd_Msg_Pub.G_MSG_LVL_UNEXP_ERROR ) THEN
1153 Fnd_Msg_Pub.Add_Exc_Msg( G_PKG_NAME,l_api_name);
1154 END IF;
1155 Fnd_Msg_Pub.Count_AND_Get
1156 ( p_count => x_msg_count,
1157 p_data => x_msg_data,
1158 p_encoded => Fnd_Api.G_FALSE
1159 );
1160 END processRegExclusions;
1161
1162 /**
1163 One scenario left out for now is , if a Product is excluded from a TD Line comprising of only 1 discount.
1164 On creating second discount, the exclusion is not copied over.
1165 Same is true for Line level qualifiers
1166 Another issue is the process_trade_deal does not process the qd discount record at all if the qd discount is set to null
1167 */
1168 PROCEDURE process_exclusions
1169 (
1170 p_init_msg_list IN VARCHAR2
1171 ,p_api_version IN NUMBER
1172 ,p_commit IN VARCHAR2
1173 ,x_return_status OUT NOCOPY VARCHAR2
1174 ,x_msg_count OUT NOCOPY NUMBER
1175 ,x_msg_data OUT NOCOPY VARCHAR2
1176 ,p_pricing_attr_tbl IN PRICING_ATTR_TBL_TYPE
1177 ,x_error_location OUT NOCOPY NUMBER
1178 )
1179 IS
1180 l_pricing_attr_tbl PRICING_ATTR_TBL_TYPE;
1181 BEGIN
1182 -- initialize
1183 -- process reqular exclusions
1184 -- populate related exclusions data
1185 -- process related exclusions
1186 x_return_status := FND_API.G_RET_STS_SUCCESS;
1187 processRegExclusions
1188 (
1189 p_init_msg_list => FND_API.G_FALSE
1190 ,p_api_version => 1.0
1191 ,p_commit => FND_API.G_FALSE
1192 ,x_return_status => x_return_status
1193 ,x_msg_count => x_msg_count
1194 ,x_msg_data => x_msg_data
1195 ,p_pricing_attr_tbl => p_pricing_attr_tbl
1196 ,x_error_location => x_error_location
1197 );
1198 IF x_return_status = FND_API.G_RET_STS_ERROR THEN
1199 RAISE FND_API.G_EXC_ERROR;
1200 ELSIF x_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
1201 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1202 END IF;
1203
1204 populateRltdExclusions
1205 (
1206 x_return_status => x_return_status
1207 ,x_msg_count => x_msg_count
1208 ,x_msg_data => x_msg_data
1209 ,p_pricing_attr_tbl => p_pricing_attr_tbl
1210 ,px_pricing_attr_tbl => l_pricing_attr_tbl
1211 );
1212 IF x_return_status = FND_API.G_RET_STS_ERROR THEN
1213 RAISE FND_API.G_EXC_ERROR;
1214 ELSIF x_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
1215 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1216 END IF;
1217 --dbms_output.put_line('Rltd Pricing attr count is :'||nvl(l_pricing_attr_tbl.count,0));
1218 IF nvl(l_pricing_attr_tbl.count,0) > 0 THEN
1219 --dbms_output.put_line('Rltd Pricing attr count is :'||nvl(l_pricing_attr_tbl.count,0));
1220 processRegExclusions
1221 (
1222 p_init_msg_list => FND_API.G_FALSE
1223 ,p_api_version => 1.0
1224 ,p_commit => FND_API.G_FALSE
1225 ,x_return_status => x_return_status
1226 ,x_msg_count => x_msg_count
1227 ,x_msg_data => x_msg_data
1228 ,p_pricing_attr_tbl => l_pricing_attr_tbl
1229 ,x_error_location => x_error_location
1230 );
1231 IF x_return_status = FND_API.G_RET_STS_ERROR THEN
1232 RAISE FND_API.G_EXC_ERROR;
1233 ELSIF x_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
1234 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1235 END IF;
1236 END IF;
1237 EXCEPTION
1238 WHEN Fnd_Api.G_EXC_ERROR THEN
1239 x_return_status := Fnd_Api.g_ret_sts_error ;
1240 Fnd_Msg_Pub.Count_AND_Get
1241 ( p_count => x_msg_count,
1242 p_data => x_msg_data,
1243 p_encoded => Fnd_Api.G_FALSE
1244 );
1245 WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
1246 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
1247 Fnd_Msg_Pub.Count_AND_Get
1248 ( p_count => x_msg_count,
1249 p_data => x_msg_data,
1250 p_encoded => Fnd_Api.G_FALSE
1251 );
1252 WHEN OTHERS THEN
1253 x_return_status := Fnd_Api.g_ret_sts_unexp_erroR ;
1254 IF Fnd_Msg_Pub.Check_Msg_Level ( Fnd_Msg_Pub.G_MSG_LVL_UNEXP_ERROR ) THEN
1255 Fnd_Msg_Pub.Add_Exc_Msg( G_PKG_NAME,'process_exclusions');
1256 END IF;
1257 Fnd_Msg_Pub.Count_AND_Get
1258 ( p_count => x_msg_count,
1259 p_data => x_msg_data,
1260 p_encoded => Fnd_Api.G_FALSE
1261 );
1262 END process_exclusions;
1263
1264
1265 PROCEDURE process_rltd_modifier_qual
1266 (
1267 p_init_msg_list IN VARCHAR2
1268 ,p_commit IN VARCHAR2
1269 ,p_list_line_id IN NUMBER
1270 ,x_return_status OUT NOCOPY VARCHAR2
1271 ,x_msg_count OUT NOCOPY NUMBER
1272 ,x_msg_data OUT NOCOPY VARCHAR2)
1273 IS
1274 CURSOR c_modifier_qualifier IS
1275 SELECT qpq.qualifier_context
1276 ,qpq.qualifier_attribute
1277 ,qpq.qualifier_attr_value
1278 ,qpq.qualifier_attr_value_to
1279 ,qpq.comparison_operator_code
1280 ,qpq.qualifier_grouping_no
1281 ,qpq.start_date_active
1282 ,qpq.end_date_active
1283 ,qpq.active_flag
1284 ,qpq.context
1285 ,qpq.attribute1
1286 ,qpq.attribute2
1287 ,qpq.attribute3
1288 ,qpq.attribute4
1289 ,qpq.attribute5
1290 ,qpq.attribute6
1291 ,qpq.attribute7
1292 ,qpq.attribute8
1293 ,qpq.attribute9
1294 ,qpq.attribute10
1295 ,qpq.attribute11
1296 ,qpq.attribute12
1297 ,qpq.attribute13
1298 ,qpq.attribute14
1299 ,qpq.attribute15
1300 ,qpq.list_line_id
1301 ,qpq.list_header_id
1302 FROM qp_qualifiers qpq
1303 WHERE qpq.list_line_id = p_list_line_id;
1304
1305 CURSOR c_rltd_modifier_id(p_qp_list_header_id NUMBER, p_modifier_id NUMBER) IS
1306 SELECT related_modifier_id
1307 FROM ozf_related_deal_lines
1308 WHERE modifier_id = p_modifier_id
1309 AND qp_list_header_id = p_qp_list_header_id;
1310
1311 l_api_version CONSTANT NUMBER := 1.0;
1312 l_api_name CONSTANT VARCHAR2(30) := 'process_rltd_modifier_qual';
1313 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
1314 l_qualifiers_tbl Qp_Qualifier_Rules_Pub.qualifiers_tbl_type;
1315 v_modifier_list_rec qp_modifiers_pub.modifier_list_rec_type;
1316 v_modifier_list_val_rec qp_modifiers_pub.modifier_list_val_rec_type;
1317 v_modifiers_tbl qp_modifiers_pub.modifiers_tbl_type;
1318 v_modifiers_val_tbl qp_modifiers_pub.modifiers_val_tbl_type;
1319 v_qualifiers_tbl qp_qualifier_rules_pub.qualifiers_tbl_type;
1320 v_qualifiers_val_tbl qp_qualifier_rules_pub.qualifiers_val_tbl_type;
1321 v_pricing_attr_tbl qp_modifiers_pub.pricing_attr_tbl_type;
1322 v_pricing_attr_val_tbl qp_modifiers_pub.pricing_attr_val_tbl_type;
1323 l_qualifiers_tbl_out qp_qualifier_rules_pub.qualifiers_tbl_type;
1324
1325 l_rltd_modifier_id NUMBER;
1326 l_index NUMBER := 0;
1327
1328 BEGIN
1329 SAVEPOINT process_rltd_modifier_qual;
1330
1331 IF Fnd_Api.to_boolean(p_init_msg_list) THEN
1332 Fnd_Msg_Pub.initialize;
1333 END IF;
1334
1335 x_return_status := Fnd_Api.g_ret_sts_success;
1336
1337 FOR l_modifier_qualifier IN c_modifier_qualifier LOOP
1338 OPEN c_rltd_modifier_id(l_modifier_qualifier.list_header_id, p_list_line_id);
1339 FETCH c_rltd_modifier_id INTO l_rltd_modifier_id;
1340 CLOSE c_rltd_modifier_id;
1341 debug_message('jl rltd modifier id: ' || l_rltd_modifier_id);
1342 IF l_rltd_modifier_id IS NOT NULL AND l_rltd_modifier_id <> fnd_api.g_miss_num THEN
1343 DELETE FROM qp_qualifiers
1344 WHERE list_header_id = l_modifier_qualifier.list_header_id
1345 AND list_line_id = l_rltd_modifier_id;
1346
1347 l_index := l_index + 1;
1348 l_qualifiers_tbl(l_index).list_header_id := l_modifier_qualifier.list_header_id;
1349 l_qualifiers_tbl(l_index).list_line_id := l_rltd_modifier_id;
1350 l_qualifiers_tbl(l_index).operation := 'CREATE';
1351 l_qualifiers_tbl(l_index).qualifier_context := l_modifier_qualifier.qualifier_context;
1352 l_qualifiers_tbl(l_index).qualifier_attribute := l_modifier_qualifier.qualifier_attribute;
1353 l_qualifiers_tbl(l_index).qualifier_attr_value := l_modifier_qualifier.qualifier_attr_value;
1354 l_qualifiers_tbl(l_index).qualifier_attr_value_to := l_modifier_qualifier.qualifier_attr_value_to;
1355 l_qualifiers_tbl(l_index).comparison_operator_code := l_modifier_qualifier.comparison_operator_code;
1356 l_qualifiers_tbl(l_index).qualifier_grouping_no := l_modifier_qualifier.qualifier_grouping_no;
1357 l_qualifiers_tbl(l_index).start_date_active := l_modifier_qualifier.start_date_active;
1358 l_qualifiers_tbl(l_index).end_date_active := l_modifier_qualifier.end_date_active;
1359 l_qualifiers_tbl(l_index).active_flag := l_modifier_qualifier.active_flag;
1360 l_qualifiers_tbl(l_index).context := l_modifier_qualifier.context;
1361 l_qualifiers_tbl(l_index).attribute1 := l_modifier_qualifier.attribute1;
1362 l_qualifiers_tbl(l_index).attribute2 := l_modifier_qualifier.attribute2;
1363 l_qualifiers_tbl(l_index).attribute3 := l_modifier_qualifier.attribute3;
1364 l_qualifiers_tbl(l_index).attribute4 := l_modifier_qualifier.attribute4;
1365 l_qualifiers_tbl(l_index).attribute5 := l_modifier_qualifier.attribute5;
1366 l_qualifiers_tbl(l_index).attribute6 := l_modifier_qualifier.attribute6;
1367 l_qualifiers_tbl(l_index).attribute7 := l_modifier_qualifier.attribute7;
1368 l_qualifiers_tbl(l_index).attribute8 := l_modifier_qualifier.attribute8;
1369 l_qualifiers_tbl(l_index).attribute9 := l_modifier_qualifier.attribute9;
1370 l_qualifiers_tbl(l_index).attribute10 := l_modifier_qualifier.attribute10;
1371 l_qualifiers_tbl(l_index).attribute11 := l_modifier_qualifier.attribute11;
1372 l_qualifiers_tbl(l_index).attribute12 := l_modifier_qualifier.attribute12;
1373 l_qualifiers_tbl(l_index).attribute13 := l_modifier_qualifier.attribute13;
1374 l_qualifiers_tbl(l_index).attribute14 := l_modifier_qualifier.attribute14;
1375 l_qualifiers_tbl(l_index).attribute15 := l_modifier_qualifier.attribute15;
1376 END IF;
1377 END LOOP;
1378 debug_message('jl qualifier tbl count: ' || l_qualifiers_tbl.count);
1379 --raise Fnd_Api.g_exc_error;
1380 Qp_Modifiers_Pub.process_modifiers(
1381 p_api_version_number => 1.0,
1382 p_init_msg_list => p_init_msg_list,
1383 p_return_values => Fnd_Api.G_FALSE,
1384 x_return_status => x_return_status,
1385 x_msg_count => x_msg_count,
1386 x_msg_data => x_msg_data,
1387 p_qualifiers_tbl => l_qualifiers_tbl,
1388 x_modifier_list_rec => v_modifier_list_rec,
1389 x_modifier_list_val_rec => v_modifier_list_val_rec,
1390 x_modifiers_tbl => v_modifiers_tbl,
1391 x_modifiers_val_tbl => v_modifiers_val_tbl,
1392 x_qualifiers_tbl => l_qualifiers_tbl_out,
1393 x_qualifiers_val_tbl => v_qualifiers_val_tbl,
1394 x_pricing_attr_tbl => v_pricing_attr_tbl,
1395 x_pricing_attr_val_tbl => v_pricing_attr_val_tbl
1396 );
1397
1398 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
1399 add_message(x_msg_count);
1400 RAISE Fnd_Api.g_exc_error;
1401 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
1402 add_message(x_msg_count);
1403 RAISE Fnd_Api.g_exc_unexpected_error;
1404 END IF;
1405
1406 EXCEPTION
1407 WHEN Fnd_Api.G_EXC_ERROR THEN
1408 x_return_status := Fnd_Api.g_ret_sts_error ;
1409 ROLLBACK TO process_rltd_modifier_qual;
1410 Fnd_Msg_Pub.Count_AND_Get
1411 ( p_count => x_msg_count,
1412 p_data => x_msg_data,
1413 p_encoded => Fnd_Api.G_FALSE
1414 );
1415 WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
1416 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
1417 ROLLBACK TO process_rltd_modifier_qual;
1418 Fnd_Msg_Pub.Count_AND_Get
1419 ( p_count => x_msg_count,
1420 p_data => x_msg_data,
1421 p_encoded => Fnd_Api.G_FALSE
1422 );
1423 WHEN OTHERS THEN
1424 x_return_status := Fnd_Api.g_ret_sts_unexp_erroR ;
1425 ROLLBACK TO process_rltd_modifier_qual;
1426 IF Fnd_Msg_Pub.Check_Msg_Level ( Fnd_Msg_Pub.G_MSG_LVL_UNEXP_ERROR ) THEN
1427 Fnd_Msg_Pub.Add_Exc_Msg( G_PKG_NAME,l_api_name);
1428 END IF;
1429 Fnd_Msg_Pub.Count_AND_Get
1430 ( p_count => x_msg_count,
1431 p_data => x_msg_data,
1432 p_encoded => Fnd_Api.G_FALSE
1433 );
1434 END process_rltd_modifier_qual;
1435
1436 PROCEDURE process_market_qualifiers
1437 (
1438 p_init_msg_list IN VARCHAR2
1439 ,p_api_version IN NUMBER
1440 ,p_commit IN VARCHAR2
1441 ,x_return_status OUT NOCOPY VARCHAR2
1442 ,x_msg_count OUT NOCOPY NUMBER
1443 ,x_msg_data OUT NOCOPY VARCHAR2
1444 ,p_qualifiers_tbl IN QUALIFIERS_TBL_TYPE
1445 ,x_error_location OUT NOCOPY NUMBER
1446 ,x_qualifiers_tbl OUT NOCOPY qp_qualifier_rules_pub.qualifiers_tbl_type
1447 )
1448 IS
1449 l_api_version CONSTANT NUMBER := 1.0;
1450 l_api_name CONSTANT VARCHAR2(30) := 'process_market_qualifiers';
1451 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
1452 l_qualifiers_tbl Qp_Qualifier_Rules_Pub.qualifiers_tbl_type;
1453 v_modifier_list_rec qp_modifiers_pub.modifier_list_rec_type;
1454 v_modifier_list_val_rec qp_modifiers_pub.modifier_list_val_rec_type;
1455 v_modifiers_tbl qp_modifiers_pub.modifiers_tbl_type;
1456 v_modifiers_val_tbl qp_modifiers_pub.modifiers_val_tbl_type;
1457 v_qualifiers_tbl qp_qualifier_rules_pub.qualifiers_tbl_type;
1458 v_qualifiers_val_tbl qp_qualifier_rules_pub.qualifiers_val_tbl_type;
1459 v_pricing_attr_tbl qp_modifiers_pub.pricing_attr_tbl_type;
1460 v_pricing_attr_val_tbl qp_modifiers_pub.pricing_attr_val_tbl_type;
1461 l_qualifier_deleted VARCHAR2(1) := 'N';
1462 l_qp_list_header_id NUMBER;
1463 l_offer_type VARCHAR2(30);
1464
1465 CURSOR c_offer_type(l_list_header_id NUMBER) IS
1466 SELECT offer_type
1467 FROM ozf_offers
1468 WHERE qp_list_header_id = l_list_header_id;
1469
1470 BEGIN
1471 SAVEPOINT process_market_qualifiers;
1472
1473 IF Fnd_Api.to_boolean(p_init_msg_list) THEN
1474 Fnd_Msg_Pub.initialize;
1475 END IF;
1476
1477 IF NOT Fnd_Api.compatible_api_call
1478 (
1479 l_api_version,
1480 p_api_version,
1481 l_api_name,
1482 g_pkg_name
1483 )
1484 THEN
1485 RAISE Fnd_Api.g_exc_unexpected_error;
1486 END IF;
1487
1488 x_return_status := Fnd_Api.g_ret_sts_success;
1489 x_error_location := 0;
1490 IF p_qualifiers_tbl.COUNT > 0 THEN
1491 FOR i IN p_qualifiers_tbl.first..p_qualifiers_tbl.last LOOP
1492 IF p_qualifiers_tbl.EXISTS(i) THEN
1493 IF p_qualifiers_tbl(i).operation <> 'CREATE' THEN
1494 l_qualifiers_tbl(i).qualifier_id := p_qualifiers_tbl(i).qualifier_id;
1495 END IF;
1496 l_qualifiers_tbl(i).list_header_id := p_qualifiers_tbl(i).list_header_id;
1497
1498 IF p_qualifiers_tbl(i).list_line_id IS NOT NULL
1499 AND p_qualifiers_tbl(i).list_line_id <> FND_API.G_MISS_NUM
1500 THEN
1501 l_qualifiers_tbl(i).list_line_id := p_qualifiers_tbl(i).list_line_id;
1502 ELSE
1503 l_qualifiers_tbl(i).list_line_id := -1;
1504 END IF;
1505
1506 l_qualifiers_tbl(i).qualifier_context := p_qualifiers_tbl(i).qualifier_context;
1507 l_qualifiers_tbl(i).qualifier_attribute := p_qualifiers_tbl(i).qualifier_attribute;
1508 l_qualifiers_tbl(i).qualifier_attr_value := p_qualifiers_tbl(i).qualifier_attr_value;
1509 l_qualifiers_tbl(i).qualifier_attr_value_to := p_qualifiers_tbl(i).qualifier_attr_value_to;
1510 l_qualifiers_tbl(i).comparison_operator_code := p_qualifiers_tbl(i).comparison_operator_code;
1511 l_qualifiers_tbl(i).qualifier_grouping_no := p_qualifiers_tbl(i).qualifier_grouping_no;
1512 l_qualifiers_tbl(i).start_date_active := p_qualifiers_tbl(i).start_date_active;
1513 l_qualifiers_tbl(i).end_date_active := p_qualifiers_tbl(i).end_date_active;
1514 l_qualifiers_tbl(i).operation := p_qualifiers_tbl(i).operation;
1515 l_qualifiers_tbl(i).context := p_qualifiers_tbl(i).context;
1516 l_qualifiers_tbl(i).attribute1 := p_qualifiers_tbl(i).attribute1;
1517 l_qualifiers_tbl(i).attribute2 := p_qualifiers_tbl(i).attribute2;
1518 l_qualifiers_tbl(i).attribute3 := p_qualifiers_tbl(i).attribute3;
1519 l_qualifiers_tbl(i).attribute4 := p_qualifiers_tbl(i).attribute4;
1520 l_qualifiers_tbl(i).attribute5 := p_qualifiers_tbl(i).attribute5;
1521 l_qualifiers_tbl(i).attribute6 := p_qualifiers_tbl(i).attribute6;
1522 l_qualifiers_tbl(i).attribute7 := p_qualifiers_tbl(i).attribute7;
1523 l_qualifiers_tbl(i).attribute8 := p_qualifiers_tbl(i).attribute8;
1524 l_qualifiers_tbl(i).attribute9 := p_qualifiers_tbl(i).attribute9;
1525 l_qualifiers_tbl(i).attribute10 := p_qualifiers_tbl(i).attribute10;
1526 l_qualifiers_tbl(i).attribute11 := p_qualifiers_tbl(i).attribute11;
1527 l_qualifiers_tbl(i).attribute12 := p_qualifiers_tbl(i).attribute12;
1528 l_qualifiers_tbl(i).attribute13 := p_qualifiers_tbl(i).attribute13;
1529 l_qualifiers_tbl(i).attribute14 := p_qualifiers_tbl(i).attribute14;
1530 l_qualifiers_tbl(i).attribute15 := p_qualifiers_tbl(i).attribute15;
1531 IF p_qualifiers_tbl(i).operation = 'DELETE' THEN
1532 l_qualifier_deleted := 'Y';
1533 l_qp_list_header_id := p_qualifiers_tbl(i).list_header_id;
1534 END IF;
1535 END IF;
1536 END LOOP;
1537 END IF;
1538
1539 Qp_Modifiers_Pub.process_modifiers(
1540 p_api_version_number => 1.0,
1541 p_init_msg_list => p_init_msg_list,
1542 p_return_values => Fnd_Api.G_FALSE,
1543 x_return_status => x_return_status,
1544 x_msg_count => x_msg_count,
1545 x_msg_data => x_msg_data,
1546 p_qualifiers_tbl => l_qualifiers_tbl,
1547 x_modifier_list_rec => v_modifier_list_rec,
1548 x_modifier_list_val_rec => v_modifier_list_val_rec,
1549 x_modifiers_tbl => v_modifiers_tbl,
1550 x_modifiers_val_tbl => v_modifiers_val_tbl,
1551 x_qualifiers_tbl => x_qualifiers_tbl,
1552 x_qualifiers_val_tbl => v_qualifiers_val_tbl,
1553 x_pricing_attr_tbl => v_pricing_attr_tbl,
1554 x_pricing_attr_val_tbl => v_pricing_attr_val_tbl
1555 );
1556
1557 IF x_return_status <> Fnd_Api.g_ret_sts_success THEN
1558 IF v_qualifiers_tbl.COUNT > 0 THEN
1559 FOR i IN v_qualifiers_tbl.first..v_qualifiers_tbl.last LOOP
1560 IF v_qualifiers_tbl.EXISTS(i) THEN
1561 IF v_qualifiers_tbl(i).return_status <> Fnd_Api.g_ret_sts_success THEN
1562 x_error_location := i;
1563 EXIT;
1564 END IF;
1565 END IF;
1566 END LOOP;
1567 END IF;
1568 END IF;
1569
1570 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
1571 add_message(x_msg_count);
1572 RAISE Fnd_Api.g_exc_error;
1573 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
1574 add_message(x_msg_count);
1575 RAISE Fnd_Api.g_exc_unexpected_error;
1576 END IF;
1577
1578 FOR i IN NVL(p_qualifiers_tbl.FIRST, 1)..NVL(p_qualifiers_tbl.LAST, 0) LOOP
1579 OPEN c_offer_type(p_qualifiers_tbl(i).list_header_id);
1580 FETCH c_offer_type INTO l_offer_type;
1581 CLOSE c_offer_type;
1582
1583 debug_message('jl offer type: ' || l_offer_type);
1584 debug_message('jl list line id: ' || p_qualifiers_tbl(i).list_line_id);
1585
1586 IF l_offer_type = 'DEAL' AND p_qualifiers_tbl(i).list_line_id IS NOT NULL AND p_qualifiers_tbl(i).list_line_id <> fnd_api.g_miss_num AND p_qualifiers_tbl(i).list_line_id <> -1 THEN
1587 process_rltd_modifier_qual(
1588 p_init_msg_list => p_init_msg_list,
1589 p_commit => fnd_api.g_false,
1590 p_list_line_id => p_qualifiers_tbl(i).list_line_id,
1591 x_return_status => x_return_status,
1592 x_msg_count => x_msg_count,
1593 x_msg_data => x_msg_data);
1594 END IF;
1595 END LOOP;
1596 --raise Fnd_Api.G_EXC_ERROR;
1597 IF l_qualifier_deleted = 'Y' THEN
1598 UPDATE ozf_offers
1599 SET qualifier_deleted = 'Y'
1600 WHERE qp_list_header_id = l_qp_list_header_id;
1601 END IF;
1602
1603 Fnd_Msg_Pub.Count_AND_Get
1604 ( p_count => x_msg_count,
1605 p_data => x_msg_data,
1606 p_encoded => Fnd_Api.G_FALSE
1607 );
1608 IF p_commit = Fnd_Api.g_true THEN
1609 COMMIT WORK;
1610 END IF;
1611
1612
1613 EXCEPTION
1614 WHEN Fnd_Api.G_EXC_ERROR THEN
1615 x_return_status := Fnd_Api.g_ret_sts_error ;
1616 ROLLBACK TO process_market_qualifiers;
1617 Fnd_Msg_Pub.Count_AND_Get
1618 ( p_count => x_msg_count,
1619 p_data => x_msg_data,
1620 p_encoded => Fnd_Api.G_FALSE
1621 );
1622 WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
1623 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
1624 ROLLBACK TO process_market_qualifiers;
1625 Fnd_Msg_Pub.Count_AND_Get
1626 ( p_count => x_msg_count,
1627 p_data => x_msg_data,
1628 p_encoded => Fnd_Api.G_FALSE
1629 );
1630 WHEN OTHERS THEN
1631 x_return_status := Fnd_Api.g_ret_sts_unexp_erroR ;
1632 ROLLBACK TO process_market_qualifiers;
1633 IF Fnd_Msg_Pub.Check_Msg_Level ( Fnd_Msg_Pub.G_MSG_LVL_UNEXP_ERROR ) THEN
1634 Fnd_Msg_Pub.Add_Exc_Msg( G_PKG_NAME,l_api_name);
1635 END IF;
1636 Fnd_Msg_Pub.Count_AND_Get
1637 ( p_count => x_msg_count,
1638 p_data => x_msg_data,
1639 p_encoded => Fnd_Api.G_FALSE
1640 );
1641 END;
1642
1643 PROCEDURE process_market_qualifiers
1644 (
1645 p_init_msg_list IN VARCHAR2
1646 ,p_api_version IN NUMBER
1647 ,p_commit IN VARCHAR2
1648 ,x_return_status OUT NOCOPY VARCHAR2
1649 ,x_msg_count OUT NOCOPY NUMBER
1650 ,x_msg_data OUT NOCOPY VARCHAR2
1651 ,p_qualifiers_tbl IN QUALIFIERS_TBL_TYPE
1652 ,x_error_location OUT NOCOPY NUMBER
1653 )
1654 IS
1655 l_api_version CONSTANT NUMBER := 1.0;
1656 l_api_name CONSTANT VARCHAR2(30) := 'process_market_qualifiers';
1657 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
1658 l_qualifiers_tbl Qp_Qualifier_Rules_Pub.qualifiers_tbl_type;
1659 v_modifier_list_rec qp_modifiers_pub.modifier_list_rec_type;
1660 v_modifier_list_val_rec qp_modifiers_pub.modifier_list_val_rec_type;
1661 v_modifiers_tbl qp_modifiers_pub.modifiers_tbl_type;
1662 v_modifiers_val_tbl qp_modifiers_pub.modifiers_val_tbl_type;
1663 v_qualifiers_tbl qp_qualifier_rules_pub.qualifiers_tbl_type;
1664 v_qualifiers_val_tbl qp_qualifier_rules_pub.qualifiers_val_tbl_type;
1665 v_pricing_attr_tbl qp_modifiers_pub.pricing_attr_tbl_type;
1666 v_pricing_attr_val_tbl qp_modifiers_pub.pricing_attr_val_tbl_type;
1667 l_qualifier_deleted VARCHAR2(1) := 'N';
1668 l_qp_list_header_id NUMBER;
1669
1670 BEGIN
1671 SAVEPOINT process_market_qualifiers;
1672
1673 IF Fnd_Api.to_boolean(p_init_msg_list) THEN
1674 Fnd_Msg_Pub.initialize;
1675 END IF;
1676
1677 IF NOT Fnd_Api.compatible_api_call
1678 (
1679 l_api_version,
1680 p_api_version,
1681 l_api_name,
1682 g_pkg_name
1683 )
1684 THEN
1685 RAISE Fnd_Api.g_exc_unexpected_error;
1686 END IF;
1687
1688 x_return_status := Fnd_Api.g_ret_sts_success;
1689 x_error_location := 0;
1690 IF p_qualifiers_tbl.COUNT > 0 THEN
1691 FOR i IN p_qualifiers_tbl.first..p_qualifiers_tbl.last LOOP
1692 IF p_qualifiers_tbl.EXISTS(i) THEN
1693 IF p_qualifiers_tbl(i).operation <> 'CREATE' THEN
1694 l_qualifiers_tbl(i).qualifier_id := p_qualifiers_tbl(i).qualifier_id;
1695 END IF;
1696 l_qualifiers_tbl(i).list_header_id := p_qualifiers_tbl(i).list_header_id;
1697
1698 IF p_qualifiers_tbl(i).list_line_id IS NOT NULL
1699 AND p_qualifiers_tbl(i).list_line_id <> FND_API.G_MISS_NUM
1700 THEN
1701 l_qualifiers_tbl(i).list_line_id := p_qualifiers_tbl(i).list_line_id;
1702 ELSE
1703 l_qualifiers_tbl(i).list_line_id := -1;
1704 END IF;
1705
1706 l_qualifiers_tbl(i).qualifier_context := p_qualifiers_tbl(i).qualifier_context;
1707 l_qualifiers_tbl(i).qualifier_attribute := p_qualifiers_tbl(i).qualifier_attribute;
1708 l_qualifiers_tbl(i).qualifier_attr_value := p_qualifiers_tbl(i).qualifier_attr_value;
1709 l_qualifiers_tbl(i).qualifier_attr_value_to := p_qualifiers_tbl(i).qualifier_attr_value_to;
1710 l_qualifiers_tbl(i).comparison_operator_code := p_qualifiers_tbl(i).comparison_operator_code;
1711 l_qualifiers_tbl(i).qualifier_grouping_no := p_qualifiers_tbl(i).qualifier_grouping_no;
1712 l_qualifiers_tbl(i).start_date_active := p_qualifiers_tbl(i).start_date_active;
1713 l_qualifiers_tbl(i).end_date_active := p_qualifiers_tbl(i).end_date_active;
1714 l_qualifiers_tbl(i).operation := p_qualifiers_tbl(i).operation;
1715 l_qualifiers_tbl(i).context := p_qualifiers_tbl(i).context;
1716 l_qualifiers_tbl(i).attribute1 := p_qualifiers_tbl(i).attribute1;
1717 l_qualifiers_tbl(i).attribute2 := p_qualifiers_tbl(i).attribute2;
1718 l_qualifiers_tbl(i).attribute3 := p_qualifiers_tbl(i).attribute3;
1719 l_qualifiers_tbl(i).attribute4 := p_qualifiers_tbl(i).attribute4;
1720 l_qualifiers_tbl(i).attribute5 := p_qualifiers_tbl(i).attribute5;
1721 l_qualifiers_tbl(i).attribute6 := p_qualifiers_tbl(i).attribute6;
1722 l_qualifiers_tbl(i).attribute7 := p_qualifiers_tbl(i).attribute7;
1723 l_qualifiers_tbl(i).attribute8 := p_qualifiers_tbl(i).attribute8;
1724 l_qualifiers_tbl(i).attribute9 := p_qualifiers_tbl(i).attribute9;
1725 l_qualifiers_tbl(i).attribute10 := p_qualifiers_tbl(i).attribute10;
1726 l_qualifiers_tbl(i).attribute11 := p_qualifiers_tbl(i).attribute11;
1727 l_qualifiers_tbl(i).attribute12 := p_qualifiers_tbl(i).attribute12;
1728 l_qualifiers_tbl(i).attribute13 := p_qualifiers_tbl(i).attribute13;
1729 l_qualifiers_tbl(i).attribute14 := p_qualifiers_tbl(i).attribute14;
1730 l_qualifiers_tbl(i).attribute15 := p_qualifiers_tbl(i).attribute15;
1731 IF p_qualifiers_tbl(i).operation = 'DELETE' THEN
1732 l_qualifier_deleted := 'Y';
1733 l_qp_list_header_id := p_qualifiers_tbl(i).list_header_id;
1734 END IF;
1735 END IF;
1736 END LOOP;
1737 END IF;
1738
1739 Qp_Modifiers_Pub.process_modifiers(
1740 p_api_version_number => 1.0,
1741 p_init_msg_list => p_init_msg_list,
1742 p_return_values => Fnd_Api.G_FALSE,
1743 x_return_status => x_return_status,
1744 x_msg_count => x_msg_count,
1745 x_msg_data => x_msg_data,
1746 p_qualifiers_tbl => l_qualifiers_tbl,
1747 x_modifier_list_rec => v_modifier_list_rec,
1748 x_modifier_list_val_rec => v_modifier_list_val_rec,
1749 x_modifiers_tbl => v_modifiers_tbl,
1750 x_modifiers_val_tbl => v_modifiers_val_tbl,
1751 x_qualifiers_tbl => v_qualifiers_tbl,
1752 x_qualifiers_val_tbl => v_qualifiers_val_tbl,
1753 x_pricing_attr_tbl => v_pricing_attr_tbl,
1754 x_pricing_attr_val_tbl => v_pricing_attr_val_tbl
1755 );
1756
1757 IF x_return_status <> Fnd_Api.g_ret_sts_success THEN
1758 IF v_qualifiers_tbl.COUNT > 0 THEN
1759 FOR i IN v_qualifiers_tbl.first..v_qualifiers_tbl.last LOOP
1760 IF v_qualifiers_tbl.EXISTS(i) THEN
1761 IF v_qualifiers_tbl(i).return_status <> Fnd_Api.g_ret_sts_success THEN
1762 x_error_location := i;
1763 EXIT;
1764 END IF;
1765 END IF;
1766 END LOOP;
1767 END IF;
1768 END IF;
1769
1770 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
1771 add_message(x_msg_count);
1772 RAISE Fnd_Api.g_exc_error;
1773 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
1774 add_message(x_msg_count);
1775 RAISE Fnd_Api.g_exc_unexpected_error;
1776 END IF;
1777
1778 IF l_qualifier_deleted = 'Y' THEN
1779 UPDATE ozf_offers
1780 SET qualifier_deleted = 'Y'
1781 WHERE qp_list_header_id = l_qp_list_header_id;
1782 END IF;
1783
1784 Fnd_Msg_Pub.Count_AND_Get
1785 ( p_count => x_msg_count,
1786 p_data => x_msg_data,
1787 p_encoded => Fnd_Api.G_FALSE
1788 );
1789 IF p_commit = Fnd_Api.g_true THEN
1790 COMMIT WORK;
1791 END IF;
1792
1793 EXCEPTION
1794 WHEN Fnd_Api.G_EXC_ERROR THEN
1795 x_return_status := Fnd_Api.g_ret_sts_error ;
1796 ROLLBACK TO process_market_qualifiers;
1797 Fnd_Msg_Pub.Count_AND_Get
1798 ( p_count => x_msg_count,
1799 p_data => x_msg_data,
1800 p_encoded => Fnd_Api.G_FALSE
1801 );
1802 WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
1803 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
1804 ROLLBACK TO process_market_qualifiers;
1805 Fnd_Msg_Pub.Count_AND_Get
1806 ( p_count => x_msg_count,
1807 p_data => x_msg_data,
1808 p_encoded => Fnd_Api.G_FALSE
1809 );
1810 WHEN OTHERS THEN
1811 x_return_status := Fnd_Api.g_ret_sts_unexp_erroR ;
1812 ROLLBACK TO process_market_qualifiers;
1813 IF Fnd_Msg_Pub.Check_Msg_Level ( Fnd_Msg_Pub.G_MSG_LVL_UNEXP_ERROR ) THEN
1814 Fnd_Msg_Pub.Add_Exc_Msg( G_PKG_NAME,l_api_name);
1815 END IF;
1816 Fnd_Msg_Pub.Count_AND_Get
1817 ( p_count => x_msg_count,
1818 p_data => x_msg_data,
1819 p_encoded => Fnd_Api.G_FALSE
1820 );
1821 END;
1822
1823 PROCEDURE offer_budget(
1824 p_modifier_list_rec IN modifier_list_rec_type
1825 ,x_return_status OUT NOCOPY VARCHAR2
1826 ,x_msg_count OUT NOCOPY NUMBER
1827 ,x_msg_data OUT NOCOPY VARCHAR2
1828 ,p_operation IN VARCHAR2
1829 ) IS
1830
1831 l_api_version CONSTANT NUMBER := 1.0;
1832 l_api_name CONSTANT VARCHAR2(30) := 'offer_budget';
1833 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
1834
1835 l_act_budgets_rec OZF_Actbudgets_Pvt.act_budgets_rec_type;
1836
1837 CURSOR cur_get_offer_budget IS
1838 SELECT activity_budget_id,object_version_number
1839 FROM ozf_act_budgets
1840 WHERE act_budget_used_by_id = p_modifier_list_rec.qp_list_header_id
1841 AND arc_act_budget_used_by = 'OFFR';
1842
1843 l_activity_budget_id NUMBER;
1844 l_object_version_number NUMBER;
1845
1846 BEGIN
1847
1848 ----------- initialize -------------
1849 SAVEPOINT offer_budget;
1850
1851 x_return_status := Fnd_Api.g_ret_sts_success;
1852
1853 l_act_budgets_rec.act_budget_used_by_id := p_modifier_list_rec.qp_list_header_id;
1854 l_act_budgets_rec.budget_source_id := p_modifier_list_rec.budget_source_id;
1855 l_act_budgets_rec.budget_source_type := p_modifier_list_rec.budget_source_type;--'FUND';
1856 l_act_budgets_rec.transfer_type := 'REQUEST';
1857 l_act_budgets_rec.arc_act_budget_used_by := 'OFFR';
1858 l_act_budgets_rec.request_currency := nvl(p_modifier_list_rec.transaction_currency_code,FND_PROFILE.VALUE('JTF_PROFILE_DEFAULT_CURRENCY'));
1859 l_act_budgets_rec.approved_in_currency := nvl(p_modifier_list_rec.transaction_currency_code,FND_PROFILE.VALUE('JTF_PROFILE_DEFAULT_CURRENCY'));
1860 IF p_modifier_list_rec.offer_type = 'SCAN_DATA' THEN
1861 IF p_modifier_list_rec.offer_amount = fnd_api.g_miss_num THEN -- calling from offer detail
1862 l_act_budgets_rec.request_amount := p_modifier_list_rec.budget_amount_tc;
1863 END IF;
1864 ELSE
1865 l_act_budgets_rec.request_amount := p_modifier_list_rec.offer_amount;
1866 END IF;
1867
1868 IF get_budget_source_count(p_modifier_list_rec.qp_list_header_id) = 0 AND l_act_budgets_rec.request_amount >= 0 THEN
1869 OZF_Actbudgets_Pvt.create_act_budgets(
1870 p_api_version => l_api_version
1871 ,p_init_msg_list => Fnd_Api.g_false
1872 ,p_commit => Fnd_Api.g_false
1873 ,p_validation_level => Fnd_Api.g_valid_level_full
1874 ,x_return_status => x_return_status
1875 ,x_msg_count => x_msg_count
1876 ,x_msg_data => x_msg_data
1877 ,p_act_budgets_rec => l_act_budgets_rec
1878 ,x_act_budget_id => l_activity_budget_id
1879 );
1880
1881 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
1882 RAISE Fnd_Api.g_exc_error;
1883 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
1884 RAISE Fnd_Api.g_exc_unexpected_error;
1885 END IF;
1886 ELSE
1887 IF p_operation = 'UPDATE' AND p_modifier_list_rec.offer_type = 'SCAN_DATA' AND get_budget_source_count(p_modifier_list_rec.qp_list_header_id) =1 THEN
1888 OPEN cur_get_offer_budget;
1889 FETCH cur_get_offer_budget INTO l_act_budgets_rec.activity_budget_id, l_act_budgets_rec.object_version_number;
1890 CLOSE cur_get_offer_budget;
1891 ozf_utility_pvt.debug_message('GR: l_act_budgets_rec.budget_source_type: ' || l_act_budgets_rec.budget_source_type);
1892 ozf_utility_pvt.debug_message('GR: l_act_budgets_rec.budget_source_id: ' || l_act_budgets_rec.budget_source_id);
1893
1894 OZF_Actbudgets_Pvt.update_act_budgets(
1895 p_api_version => l_api_version
1896 ,p_init_msg_list => Fnd_Api.g_false
1897 ,p_commit => Fnd_Api.g_false
1898 ,p_validation_level => Fnd_Api.g_valid_level_full
1899 ,x_return_status => x_return_status
1900 ,x_msg_count => x_msg_count
1901 ,x_msg_data => x_msg_data
1902 ,p_act_budgets_rec => l_act_budgets_rec
1903 );
1904 END IF;
1905
1906 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
1907 RAISE Fnd_Api.g_exc_error;
1908 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
1909 RAISE Fnd_Api.g_exc_unexpected_error;
1910 END IF;
1911 END IF;
1912
1913 Fnd_Msg_Pub.Count_AND_Get
1914 ( p_count => x_msg_count,
1915 p_data => x_msg_data,
1916 p_encoded => Fnd_Api.G_FALSE
1917 );
1918
1919 EXCEPTION
1920 WHEN Fnd_Api.G_EXC_ERROR THEN
1921 x_return_status := Fnd_Api.g_ret_sts_error ;
1922 ROLLBACK TO offer_budget;
1923 Fnd_Msg_Pub.Count_AND_Get
1924 ( p_count => x_msg_count,
1925 p_data => x_msg_data,
1926 p_encoded => Fnd_Api.G_FALSE
1927 );
1928 WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
1929 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
1930 ROLLBACK TO offer_budget;
1931 Fnd_Msg_Pub.Count_AND_Get
1932 ( p_count => x_msg_count,
1933 p_data => x_msg_data,
1934 p_encoded => Fnd_Api.G_FALSE
1935 );
1936 WHEN OTHERS THEN
1937 x_return_status := Fnd_Api.g_ret_sts_unexp_erroR ;
1938 ROLLBACK TO offer_budget;
1939 IF Fnd_Msg_Pub.Check_Msg_Level ( Fnd_Msg_Pub.G_MSG_LVL_UNEXP_ERROR ) THEN
1940 Fnd_Msg_Pub.Add_Exc_Msg( G_PKG_NAME,l_api_name);
1941 END IF;
1942 Fnd_Msg_Pub.Count_AND_Get
1943 ( p_count => x_msg_count,
1944 p_data => x_msg_data,
1945 p_encoded => Fnd_Api.G_FALSE
1946 );
1947
1948 END offer_budget;
1949
1950
1951 PROCEDURE offer_object_usage(
1952 p_modifier_list_rec IN modifier_list_rec_type
1953 ,x_return_status OUT NOCOPY VARCHAR2
1954 ,x_msg_count OUT NOCOPY NUMBER
1955 ,x_msg_data OUT NOCOPY VARCHAR2
1956 )
1957 IS
1958
1959 l_api_version CONSTANT NUMBER := 1.0;
1960 l_api_name CONSTANT VARCHAR2(30) := 'offer_object_usage';
1961 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
1962
1963 l_act_offer_rec OZF_Act_Offers_Pvt.act_offer_rec_type;
1964 l_activity_offer_id NUMBER := Fnd_Api.g_miss_num;
1965
1966 BEGIN
1967
1968 ---------- initialize -------------
1969 SAVEPOINT offer_object_usage;
1970
1971 x_return_status := Fnd_Api.g_ret_sts_success;
1972
1973 l_act_offer_rec.act_offer_used_by_id := p_modifier_list_rec.offer_used_by_id;
1974 l_act_offer_rec.arc_act_offer_used_by := 'CAMP';
1975 l_act_offer_rec.qp_list_header_id := p_modifier_list_rec.qp_list_header_id;
1976 l_act_offer_rec.primary_offer_flag := 'N';
1977
1978 OZF_Act_Offers_Pvt.Create_Act_Offer
1979 (
1980 p_api_version => 1.0,
1981 p_init_msg_list => FND_API.g_false,
1982 p_commit => Fnd_Api.g_false,
1983 p_validation_level => Fnd_Api.g_valid_level_full,
1984 x_return_status => x_return_status ,
1985 x_msg_count => x_msg_count,
1986 x_msg_data => x_msg_data,
1987 p_act_offer_rec => l_act_offer_rec,
1988 x_act_offer_id => l_activity_offer_id
1989 );
1990
1991 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
1992 RAISE Fnd_Api.g_exc_error;
1993 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
1994 RAISE Fnd_Api.g_exc_unexpected_error;
1995 END IF;
1996
1997 Fnd_Msg_Pub.Count_AND_Get
1998 ( p_count => x_msg_count,
1999 p_data => x_msg_data,
2000 p_encoded => Fnd_Api.G_FALSE
2001 );
2002
2003 EXCEPTION
2004 WHEN Fnd_Api.G_EXC_ERROR THEN
2005 x_return_status := Fnd_Api.g_ret_sts_error ;
2006 ROLLBACK TO offer_object_usage;
2007 Fnd_Msg_Pub.Count_AND_Get
2008 ( p_count => x_msg_count,
2009 p_data => x_msg_data,
2010 p_encoded => Fnd_Api.G_FALSE
2011 );
2012 WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
2013 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
2014 ROLLBACK TO offer_object_usage;
2015 Fnd_Msg_Pub.Count_AND_Get
2016 ( p_count => x_msg_count,
2017 p_data => x_msg_data,
2018 p_encoded => Fnd_Api.G_FALSE
2019 );
2020 WHEN OTHERS THEN
2021 x_return_status := Fnd_Api.g_ret_sts_unexp_erroR ;
2022 ROLLBACK TO offer_object_usage;
2023 IF Fnd_Msg_Pub.Check_Msg_Level ( Fnd_Msg_Pub.G_MSG_LVL_UNEXP_ERROR ) THEN
2024 Fnd_Msg_Pub.Add_Exc_Msg( G_PKG_NAME,l_api_name);
2025 END IF;
2026 Fnd_Msg_Pub.Count_AND_Get
2027 ( p_count => x_msg_count,
2028 p_data => x_msg_data,
2029 p_encoded => Fnd_Api.G_FALSE
2030 );
2031 END offer_object_usage;
2032
2033
2034 PROCEDURE process_sales_method
2035 (
2036 p_init_msg_list IN VARCHAR2
2037 , p_api_version IN NUMBER
2038 , p_commit IN VARCHAR2
2039 , p_modifier_list_rec IN modifier_list_rec_type
2040 , x_return_status OUT NOCOPY VARCHAR2
2041 , x_msg_count OUT NOCOPY NUMBER
2042 , x_msg_data OUT NOCOPY VARCHAR2
2043 )
2044 IS
2045 CURSOR c_qualifier_id(l_list_header_id NUMBER) IS
2046 SELECT qualifier_id
2047 FROM qp_qualifiers
2048 WHERE list_header_id = l_list_header_id
2049 AND qualifier_context = 'SOLD_BY'
2050 ORDER BY qualifier_id;
2051
2052 l_qualifier_id NUMBER;
2053
2054 l_operation VARCHAR2(30);
2055 l_qualifier_rec OZF_OFFER_PVT.qualifiers_Rec_Type;
2056
2057 BEGIN
2058 x_return_status := FND_API.G_RET_STS_SUCCESS;
2059 debug_message('Sales method flag = : '||p_modifier_list_rec.sales_method_flag);
2060 IF p_modifier_list_rec.sales_method_flag = 'I' OR p_modifier_list_rec.sales_method_flag = 'D' THEN
2061 -- l_qualifier_rec.operation := 'CREATE';
2062 l_qualifier_rec.qualifier_id := FND_API.g_miss_num;
2063 l_qualifier_rec.qualifier_context := 'SOLD_BY';
2064 l_qualifier_rec.qualifier_attribute := 'QUALIFIER_ATTRIBUTE1';
2065 l_qualifier_rec.qualifier_attr_value := p_modifier_list_rec.sales_method_flag;
2066 l_qualifier_rec.comparison_operator_code := '=';
2067 l_qualifier_rec.qualifier_grouping_no := 20;
2068 l_qualifier_rec.list_header_id := p_modifier_list_rec.qp_list_header_id;
2069
2070 OPEN c_qualifier_id(p_modifier_list_rec.qp_list_header_id);
2071 FETCH c_qualifier_id INTO l_qualifier_id;
2072 IF (c_qualifier_id%NOTFOUND) THEN
2073 l_operation := 'CREATE';
2074 ELSE
2075 l_operation := 'UPDATE';
2076 l_qualifier_rec.qualifier_id := l_qualifier_id;
2077 END IF;
2078 debug_message('"Operation is : '||l_operation);
2079 IF l_operation ='UPDATE' THEN -- in case there are multiple only the first created will be updated
2080 OZF_Volume_Offer_Qual_PVT.update_vo_qualifier
2081 (
2082 p_api_version_number => p_api_version
2083 , p_init_msg_list => p_init_msg_list
2084 , p_commit => p_commit
2085 , p_validation_level => FND_API.G_VALID_LEVEL_FULL
2086
2087 , x_return_status => x_return_status
2088 , x_msg_count => x_msg_count
2089 , x_msg_data => x_msg_data
2090
2091 , p_qualifiers_rec => l_qualifier_rec -- IN OZF_OFFER_PVT.qualifiers_Rec_Type
2092 );
2093 ELSIF l_operation ='CREATE' THEN
2094
2095 OZF_Volume_Offer_Qual_PVT.create_vo_qualifier
2096 (
2097 p_api_version_number => p_api_version
2098 , p_init_msg_list => p_init_msg_list
2099 , p_commit => p_commit
2100 , p_validation_level => FND_API.G_VALID_LEVEL_FULL
2101
2102 , x_return_status => x_return_status
2103 , x_msg_count => x_msg_count
2104 , x_msg_data => x_msg_data
2105
2106 , p_qualifiers_rec => l_qualifier_rec -- IN OZF_OFFER_PVT.qualifiers_Rec_Type
2107 );
2108 END IF;
2109 END IF;
2110
2111 END process_sales_method;
2112
2113 -------------------------------------------------------
2114 -- Start of Comments
2115 --
2116 -- NAME
2117 -- Offer_qualifier
2118 --
2119 -- PURPOSE
2120 -- This Procedure create Offer QUalifiers from Create or Details screen for Quick Offers.
2121 --
2122 -- IN
2123 -- p_modifier_list_rec IN modifier_list_rec_type,
2124 --
2125 -- OUT
2126 -- x_return_status OUT VARCHAR2,
2127 -- x_msg_count OUT NUMBER,
2128 -- x_msg_data OUT VARCHAR2,
2129 --
2130 -- NOTES
2131 --
2132 -- HISTORY
2133 -- Tue May 03 2005:2/37 PM RSSHARMA Modified.
2134 -- Support creation of Sales method QUalifier from Create Offer Screen.
2135 -- End of Comments
2136 ---------------------------------------------------------
2137
2138 PROCEDURE offer_qualifier(
2139 p_modifier_list_rec IN modifier_list_rec_type
2140 ,x_return_status OUT NOCOPY VARCHAR2
2141 ,x_msg_count OUT NOCOPY NUMBER
2142 ,x_msg_data OUT NOCOPY VARCHAR2
2143 )IS
2144
2145 l_api_version CONSTANT NUMBER := 1.0;
2146 l_api_name CONSTANT VARCHAR2(30) := 'offer_qualifier';
2147 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
2148
2149 l_qualifier_tbl qualifiers_tbl_type;
2150 l_error_location NUMBER := 0;
2151 l_qualifier_id NUMBER;
2152
2153 CURSOR c_qualifier_id(l_list_header_id NUMBER) IS
2154 SELECT qualifier_id
2155 FROM qp_qualifiers
2156 WHERE list_header_id = l_list_header_id
2157 AND list_line_id = -1
2158 AND qualifier_context IN ('CUSTOMER', 'CUSTOMER_GROUP','TERRITORY')
2159 and rownum < 2;
2160
2161 CURSOR c_sm_qualifier_id(l_list_header_id NUMBER) IS
2162 SELECT qualifier_id
2163 FROM qp_qualifiers
2164 WHERE list_header_id = l_list_header_id
2165 AND list_line_id = -1
2166 AND qualifier_context IN ('SOLD_BY');
2167
2168 i NUMBER := 0;
2169 x_qualifiers_tbl qp_qualifier_rules_pub.qualifiers_tbl_type;
2170 BEGIN
2171
2172 ----------- initialize -------------
2173 SAVEPOINT offer_qualifier;
2174
2175 x_return_status := Fnd_Api.g_ret_sts_success;
2176
2177 IF p_modifier_list_rec.modifier_operation ='UPDATE' THEN
2178 OPEN c_qualifier_id(p_modifier_list_rec.qp_list_header_id);
2179 FETCH c_qualifier_id INTO l_qualifier_id;
2180 CLOSE c_qualifier_id;
2181
2182 IF (l_qualifier_id IS NOT NULL AND l_qualifier_id <> FND_API.g_miss_num) THEN
2183 i := i + 1;
2184 l_qualifier_tbl(i).operation := 'DELETE';
2185 l_qualifier_tbl(i).list_header_id := p_modifier_list_rec.qp_list_header_id;
2186 l_qualifier_tbl(i).qualifier_id := l_qualifier_id;
2187 END IF;
2188
2189 l_qualifier_id := NULL;
2190
2191 OPEN c_sm_qualifier_id(p_modifier_list_rec.qp_list_header_id);
2192 FETCH c_sm_qualifier_id INTO l_qualifier_id;
2193 CLOSE c_sm_qualifier_id;
2194
2195 IF (l_qualifier_id IS NOT NULL AND l_qualifier_id <> FND_API.g_miss_num) THEN
2196 i := i + 1;
2197 l_qualifier_tbl(i).operation := 'DELETE';
2198 l_qualifier_tbl(i).list_header_id := p_modifier_list_rec.qp_list_header_id;
2199 l_qualifier_tbl(i).qualifier_id := l_qualifier_id;
2200 END IF;
2201
2202 IF l_qualifier_tbl.COUNT > 0 THEN
2203 process_market_qualifiers
2204 (p_api_version => 1.0,
2205 p_init_msg_list => Fnd_Api.g_false,
2206 p_commit => Fnd_Api.g_false,
2207 x_return_status => x_return_status ,
2208 x_msg_count => x_msg_count,
2209 x_msg_data => x_msg_data,
2210 p_qualifiers_tbl => l_qualifier_tbl,
2211 x_error_location => l_error_location,
2212 x_qualifiers_tbl => x_qualifiers_tbl);
2213
2214 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
2215 RAISE Fnd_Api.g_exc_error;
2216 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
2217 RAISE Fnd_Api.g_exc_unexpected_error;
2218 END IF;
2219 END IF; -- FOR l_qualifier_tbl(1).qualifier_id IS NOT NULL, bug fix 3629490
2220 END IF; -- end UPDATE mode
2221
2222 i := 0;
2223 l_qualifier_tbl.DELETE;
2224
2225 IF (p_modifier_list_rec.ql_qualifier_id <> Fnd_Api.g_miss_num AND p_modifier_list_rec.ql_qualifier_id IS NOT NULL) THEN
2226 i := i+1;
2227 l_qualifier_tbl(i).operation := p_modifier_list_rec.modifier_operation ;
2228 l_qualifier_tbl(i).list_header_id := p_modifier_list_rec.qp_list_header_id;
2229
2230 IF p_modifier_list_rec.ql_qualifier_type = 'CUSTOMER' THEN
2231 l_qualifier_tbl(i).qualifier_context := 'CUSTOMER';
2232 l_qualifier_tbl(i).qualifier_attribute := 'QUALIFIER_ATTRIBUTE2';
2233 ELSIF p_modifier_list_rec.ql_qualifier_type = 'CUSTOMER_BILL_TO' THEN
2234 l_qualifier_tbl(i).qualifier_context := 'CUSTOMER';
2235 l_qualifier_tbl(i).qualifier_attribute := 'QUALIFIER_ATTRIBUTE14';
2236 ELSIF p_modifier_list_rec.ql_qualifier_type = 'BUYER' THEN
2237 l_qualifier_tbl(i).qualifier_context := 'CUSTOMER_GROUP';
2238 l_qualifier_tbl(i).qualifier_attribute := 'QUALIFIER_ATTRIBUTE3';
2239 ELSIF p_modifier_list_rec.ql_qualifier_type = 'LIST' THEN
2240 l_qualifier_tbl(i).qualifier_context := 'CUSTOMER_GROUP';
2241 l_qualifier_tbl(i).qualifier_attribute := 'QUALIFIER_ATTRIBUTE1';
2242 ELSIF p_modifier_list_rec.ql_qualifier_type = 'SEGMENT' THEN
2243 l_qualifier_tbl(i).qualifier_context := 'CUSTOMER_GROUP';
2244 l_qualifier_tbl(i).qualifier_attribute := 'QUALIFIER_ATTRIBUTE2';
2245 ELSIF p_modifier_list_rec.ql_qualifier_type = 'TERRITORY' THEN
2246 l_qualifier_tbl(i).qualifier_context := 'TERRITORY';
2247 l_qualifier_tbl(i).qualifier_attribute := 'QUALIFIER_ATTRIBUTE1';
2248 ELSIF p_modifier_list_rec.ql_qualifier_type = 'SHIP_TO' THEN
2249 l_qualifier_tbl(i).qualifier_context := 'CUSTOMER';
2250 l_qualifier_tbl(i).qualifier_attribute := 'QUALIFIER_ATTRIBUTE11';
2251 END IF;
2252 -- rssharma Added Code for using Territories as Qualifeir Type
2253
2254
2255 l_qualifier_tbl(i).qualifier_attr_value := p_modifier_list_rec.ql_qualifier_id;
2256 l_qualifier_tbl(i).comparison_operator_code := '=';
2257 l_qualifier_tbl(i).qualifier_grouping_no := 10;
2258 -- rssharma 28-Oct-2002 changed grouping number to -1 from 10
2259
2260 l_qualifier_tbl(i).operation := 'CREATE';
2261 l_qualifier_tbl(i).qualifier_id := FND_API.g_miss_num;
2262 END IF;
2263
2264 IF p_modifier_list_rec.sales_method_flag IS NOT NULL AND p_modifier_list_rec.sales_method_flag <> FND_API.g_miss_char THEN
2265 i := i+1;
2266
2267 IF p_modifier_list_rec.sales_method_flag = 'I' OR p_modifier_list_rec.sales_method_flag = 'D' THEN
2268 l_qualifier_tbl(i).operation := 'CREATE';
2269 l_qualifier_tbl(i).qualifier_id := FND_API.g_miss_num;
2270 l_qualifier_tbl(i).qualifier_context := 'SOLD_BY';
2271 l_qualifier_tbl(i).qualifier_attribute := 'QUALIFIER_ATTRIBUTE1';
2272 l_qualifier_tbl(i).qualifier_attr_value := p_modifier_list_rec.sales_method_flag;
2273 l_qualifier_tbl(i).comparison_operator_code := '=';
2274 l_qualifier_tbl(i).qualifier_grouping_no := 20;
2275 l_qualifier_tbl(i).list_header_id := p_modifier_list_rec.qp_list_header_id;
2276 END IF;
2277 END IF;
2278
2279 --raise Fnd_Api.g_exc_error;
2280 IF l_qualifier_tbl.COUNT > 0 THEN
2281 process_market_qualifiers
2282 (p_api_version => 1.0,
2283 p_init_msg_list => Fnd_Api.g_false,
2284 p_commit => Fnd_Api.g_false,
2285 x_return_status => x_return_status ,
2286 x_msg_count => x_msg_count,
2287 x_msg_data => x_msg_data,
2288 p_qualifiers_tbl => l_qualifier_tbl,
2289 x_error_location => l_error_location,
2290 x_qualifiers_tbl => x_qualifiers_tbl);
2291
2292 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
2293 RAISE Fnd_Api.g_exc_error;
2294 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
2295 RAISE Fnd_Api.g_exc_unexpected_error;
2296 END IF;
2297 END IF;
2298
2299 Fnd_Msg_Pub.Count_AND_Get
2300 ( p_count => x_msg_count,
2301 p_data => x_msg_data,
2302 p_encoded => Fnd_Api.G_FALSE
2303 );
2304
2305 EXCEPTION
2306 WHEN Fnd_Api.G_EXC_ERROR THEN
2307 x_return_status := Fnd_Api.g_ret_sts_error ;
2308 ROLLBACK TO offer_qualifier;
2309 Fnd_Msg_Pub.Count_AND_Get
2310 ( p_count => x_msg_count,
2311 p_data => x_msg_data,
2312 p_encoded => Fnd_Api.G_FALSE
2313 );
2314 WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
2315 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
2316 ROLLBACK TO offer_qualifier;
2317 Fnd_Msg_Pub.Count_AND_Get
2318 ( p_count => x_msg_count,
2319 p_data => x_msg_data,
2320 p_encoded => Fnd_Api.G_FALSE
2321 );
2322 WHEN OTHERS THEN
2323 x_return_status := Fnd_Api.g_ret_sts_unexp_erroR ;
2324 ROLLBACK TO offer_qualifier;
2325 IF Fnd_Msg_Pub.Check_Msg_Level ( Fnd_Msg_Pub.G_MSG_LVL_UNEXP_ERROR ) THEN
2326 Fnd_Msg_Pub.Add_Exc_Msg( G_PKG_NAME,l_api_name);
2327 END IF;
2328 Fnd_Msg_Pub.Count_AND_Get
2329 ( p_count => x_msg_count,
2330 p_data => x_msg_data,
2331 p_encoded => Fnd_Api.G_FALSE
2332 );
2333 END offer_qualifier;
2334
2335
2336 PROCEDURE vo_qualifier
2337 (
2338 p_init_msg_list IN VARCHAR2
2339 ,p_api_version IN NUMBER
2340 ,p_commit IN VARCHAR2
2341 ,x_return_status OUT NOCOPY VARCHAR2
2342 ,x_msg_count OUT NOCOPY NUMBER
2343 ,x_msg_data OUT NOCOPY VARCHAR2
2344 ,p_modifier_list_rec IN modifier_list_rec_type
2345 )
2346 IS
2347 l_api_version CONSTANT NUMBER := 1.0;
2348 l_api_name CONSTANT VARCHAR2(30) := 'VO_qualifier';
2349 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
2350
2351 l_qualifier_tbl qualifiers_tbl_type;
2352 l_error_location NUMBER := 0;
2353
2354 CURSOR c_qualifier_id(l_list_header_id NUMBER) IS
2355 SELECT qualifier_id
2356 FROM qp_qualifiers
2357 WHERE list_header_id = l_list_header_id
2358 AND qualifier_context IN ('CUSTOMER', 'CUSTOMER_GROUP','TERRITORY')
2359 ORDER BY qualifier_id;
2360 l_qualifier_id NUMBER;
2361
2362 l_operation VARCHAR2(30);
2363
2364 i NUMBER := 0;
2365 x_qualifiers_tbl qp_qualifier_rules_pub.qualifiers_tbl_type;
2366 l_qualifiers_rec OZF_OFFER_PVT.qualifiers_Rec_Type;
2367 BEGIN
2368
2369 ----------- initialize -------------
2370 SAVEPOINT vo_qualifier_pvt;
2371
2372 x_return_status := Fnd_Api.g_ret_sts_success;
2373 IF
2374 (p_modifier_list_rec.ql_qualifier_id <> Fnd_Api.g_miss_num
2375 AND p_modifier_list_rec.ql_qualifier_id IS NOT NULL)
2376 THEN
2377 -- i := i+1;
2378 -- l_qualifiers_rec.operation := p_modifier_list_rec.modifier_operation ;
2379 l_qualifiers_rec.list_header_id := p_modifier_list_rec.qp_list_header_id;
2380
2381 IF p_modifier_list_rec.ql_qualifier_type = 'CUSTOMER' THEN
2382 l_qualifiers_rec.qualifier_context := 'CUSTOMER';
2383 l_qualifiers_rec.qualifier_attribute := 'QUALIFIER_ATTRIBUTE2';
2384 ELSIF p_modifier_list_rec.ql_qualifier_type = 'CUSTOMER_BILL_TO' THEN
2385 l_qualifiers_rec.qualifier_context := 'CUSTOMER';
2386 l_qualifiers_rec.qualifier_attribute := 'QUALIFIER_ATTRIBUTE14';
2387 ELSIF p_modifier_list_rec.ql_qualifier_type = 'BUYER' THEN
2388 l_qualifiers_rec.qualifier_context := 'CUSTOMER_GROUP';
2389 l_qualifiers_rec.qualifier_attribute := 'QUALIFIER_ATTRIBUTE3';
2390 ELSIF p_modifier_list_rec.ql_qualifier_type = 'LIST' THEN
2391 l_qualifiers_rec.qualifier_context := 'CUSTOMER_GROUP';
2392 l_qualifiers_rec.qualifier_attribute := 'QUALIFIER_ATTRIBUTE1';
2393 ELSIF p_modifier_list_rec.ql_qualifier_type = 'SEGMENT' THEN
2394 l_qualifiers_rec.qualifier_context := 'CUSTOMER_GROUP';
2395 l_qualifiers_rec.qualifier_attribute := 'QUALIFIER_ATTRIBUTE2';
2396 ELSIF p_modifier_list_rec.ql_qualifier_type = 'TERRITORY' THEN
2397 l_qualifiers_rec.qualifier_context := 'TERRITORY';
2398 l_qualifiers_rec.qualifier_attribute := 'QUALIFIER_ATTRIBUTE1';
2399 ELSIF p_modifier_list_rec.ql_qualifier_type = 'SHIP_TO' THEN
2400 l_qualifiers_rec.qualifier_context := 'CUSTOMER';
2401 l_qualifiers_rec.qualifier_attribute := 'QUALIFIER_ATTRIBUTE11';
2402 -- QUALIFIER_ATTRIBUTE11
2403 END IF;
2404 -- rssharma Added Code for using Territories as Qualifeir Type
2405
2406
2407 l_qualifiers_rec.qualifier_attr_value := p_modifier_list_rec.ql_qualifier_id;
2408 l_qualifiers_rec.comparison_operator_code := '=';
2409 l_qualifiers_rec.qualifier_grouping_no := 10;
2410
2411 OPEN c_qualifier_id(p_modifier_list_rec.qp_list_header_id);
2412 FETCH c_qualifier_id INTO l_qualifier_id;
2413 IF (c_qualifier_id%NOTFOUND) THEN
2414 l_operation := 'CREATE';
2415 ELSE
2416 l_operation := 'UPDATE';
2417 l_qualifiers_rec.qualifier_id := l_qualifier_id;
2418 END IF;
2419 IF l_operation ='UPDATE' THEN -- in case there are multiple only the first created will be updated
2420 OZF_Volume_Offer_Qual_PVT.update_vo_qualifier
2421 (
2422 p_api_version_number => p_api_version
2423 , p_init_msg_list => p_init_msg_list
2424 , p_commit => p_commit
2425 , p_validation_level => FND_API.G_VALID_LEVEL_FULL
2426
2427 , x_return_status => x_return_status
2428 , x_msg_count => x_msg_count
2429 , x_msg_data => x_msg_data
2430
2431 , p_qualifiers_rec => l_qualifiers_rec -- IN OZF_OFFER_PVT.qualifiers_Rec_Type
2432 );
2433 ELSIF l_operation ='CREATE' THEN
2434
2435 OZF_Volume_Offer_Qual_PVT.create_vo_qualifier
2436 (
2437 p_api_version_number => p_api_version
2438 , p_init_msg_list => p_init_msg_list
2439 , p_commit => p_commit
2440 , p_validation_level => FND_API.G_VALID_LEVEL_FULL
2441
2442 , x_return_status => x_return_status
2443 , x_msg_count => x_msg_count
2444 , x_msg_data => x_msg_data
2445
2446 , p_qualifiers_rec => l_qualifiers_rec -- IN OZF_OFFER_PVT.qualifiers_Rec_Type
2447 );
2448 END IF;
2449
2450 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
2451 RAISE Fnd_Api.g_exc_error;
2452 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
2453 RAISE Fnd_Api.g_exc_unexpected_error;
2454 END IF;
2455
2456 debug_message('"Calling process sales method');
2457 process_sales_method
2458 (
2459 p_init_msg_list => p_init_msg_list
2460 , p_api_version => p_api_version
2461 , p_commit => p_commit
2462 , p_modifier_list_rec => p_modifier_list_rec
2463 , x_return_status => x_return_status
2464 , x_msg_count => x_msg_count
2465 , x_msg_data => x_msg_data
2466 );
2467
2468 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
2469 RAISE Fnd_Api.g_exc_error;
2470 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
2471 RAISE Fnd_Api.g_exc_unexpected_error;
2472 END IF;
2473
2474
2475 Fnd_Msg_Pub.Count_AND_Get
2476 ( p_count => x_msg_count,
2477 p_data => x_msg_data,
2478 p_encoded => Fnd_Api.G_FALSE
2479 );
2480 END IF;
2481 EXCEPTION
2482 WHEN Fnd_Api.G_EXC_ERROR THEN
2483 x_return_status := Fnd_Api.g_ret_sts_error ;
2484 ROLLBACK TO vo_qualifier_pvt;
2485 Fnd_Msg_Pub.Count_AND_Get
2486 ( p_count => x_msg_count,
2487 p_data => x_msg_data,
2488 p_encoded => Fnd_Api.G_FALSE
2489 );
2490 WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
2491 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
2492 ROLLBACK TO vo_qualifier_pvt;
2493 Fnd_Msg_Pub.Count_AND_Get
2494 ( p_count => x_msg_count,
2495 p_data => x_msg_data,
2496 p_encoded => Fnd_Api.G_FALSE
2497 );
2498 WHEN OTHERS THEN
2499 x_return_status := Fnd_Api.g_ret_sts_unexp_erroR ;
2500 ROLLBACK TO vo_qualifier_pvt;
2501 IF Fnd_Msg_Pub.Check_Msg_Level ( Fnd_Msg_Pub.G_MSG_LVL_UNEXP_ERROR ) THEN
2502 Fnd_Msg_Pub.Add_Exc_Msg( G_PKG_NAME,l_api_name);
2503 END IF;
2504 Fnd_Msg_Pub.Count_AND_Get
2505 ( p_count => x_msg_count,
2506 p_data => x_msg_data,
2507 p_encoded => Fnd_Api.G_FALSE
2508 );
2509 END vo_qualifier;
2510
2511
2512 --nirprasa
2513 PROCEDURE populate_limits_rec(
2514 p_limit_type IN VARCHAR2,
2515 x_limits_rec OUT NOCOPY QP_Limits_PUB.Limits_Rec_Type,
2516 p_limit_exceed_action_code IN VARCHAR2 DEFAULT NULL) IS
2517 BEGIN
2518
2519 IF p_limit_exceed_action_code IS NOT NULL AND p_limit_exceed_action_code <> FND_API.G_MISS_CHAR THEN
2520 x_limits_rec.limit_exceed_action_code := p_limit_exceed_action_code;
2521 END IF;
2522
2523 x_limits_rec.limit_hold_flag := 'Y';
2524 x_limits_rec.organization_flag := 'N';
2525 x_limits_rec.operation := 'CREATE';
2526
2527 IF p_limit_type = 'MAX_QTY_PER_ORDER' THEN
2528 x_limits_rec.limit_level_code := 'TRANSACTION';
2529 ELSE
2530 x_limits_rec.limit_level_code := 'ACROSS_TRANSACTION';
2531 END IF;
2532
2533 IF p_limit_type = 'MAX_ORDERS_PER_CUSTOMER' THEN
2534 x_limits_rec.basis := 'USAGE';
2535 ELSIF p_limit_type = 'MAX_AMOUNT_PER_RULE' THEN
2536 x_limits_rec.basis := 'COST';
2537 ELSIF p_limit_type IN ('MAX_QTY_PER_ORDER','MAX_QTY_PER_CUSTOMER','MAX_QTY_PER_RULE') THEN
2538 x_limits_rec.basis := 'QUANTITY';
2539 END IF;
2540
2541 IF p_limit_type IN ('MAX_QTY_PER_CUSTOMER','MAX_ORDERS_PER_CUSTOMER') THEN
2542 x_limits_rec.multival_attr1_type := 'QUALIFIER';
2543 x_limits_rec.multival_attr1_context := 'CUSTOMER';
2544 x_limits_rec.multival_attribute1 := 'QUALIFIER_ATTRIBUTE2';
2545 END IF;
2546
2547 IF p_limit_type = 'MAX_QTY_PER_ORDER' THEN
2548 x_limits_rec.limit_number := 1;
2549 ELSIF p_limit_type = 'MAX_QTY_PER_CUSTOMER' THEN
2550 x_limits_rec.limit_number := 2;
2551 ELSIF p_limit_type = 'MAX_QTY_PER_RULE' THEN
2552 x_limits_rec.limit_number := 3;
2553 ELSIF p_limit_type = 'MAX_ORDERS_PER_CUSTOMER' THEN
2554 x_limits_rec.limit_number := 4;
2555 ELSIF p_limit_type = 'MAX_AMOUNT_PER_RULE' THEN
2556 x_limits_rec.limit_number := 5;
2557 END IF;
2558 END populate_limits_rec;
2559
2560 -- This procedure will only handle limits at the line level. Header Level
2561 -- Limits are processed in process_qp_list_header itself.
2562
2563 PROCEDURE process_limits(
2564 x_return_status OUT NOCOPY VARCHAR2
2565 ,x_msg_count OUT NOCOPY NUMBER
2566 ,x_msg_data OUT NOCOPY VARCHAR2
2567 ,p_limit_type IN VARCHAR2
2568 ,p_limit_amount IN NUMBER DEFAULT fnd_api.g_miss_num
2569 ,p_list_line_id IN NUMBER DEFAULT fnd_api.g_miss_num
2570 ,p_list_header_id IN NUMBER
2571 ,p_limit_id IN NUMBER DEFAULT fnd_api.g_miss_num
2572 ,p_limit_exceed_action_code IN VARCHAR2 DEFAULT NULL
2573 )
2574 IS
2575
2576 l_api_version CONSTANT NUMBER := 1.0;
2577 l_api_name CONSTANT VARCHAR2(30) := 'process_limits';
2578 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
2579
2580 CURSOR cur_does_limit_exist(p_limit_number NUMBER) IS
2581 SELECT count(limit_id)
2582 FROM qp_limits
2583 WHERE list_line_id = p_list_line_id
2584 AND limit_number = p_limit_number;
2585
2586 l_limit_exists NUMBER;
2587 l_limit_number NUMBER;
2588
2589 l_limits_rec QP_Limits_PUB.Limits_Rec_Type;
2590 v_limits_rec QP_Limits_PUB.Limits_Rec_Type;
2591 v_limits_val_rec QP_Limits_PUB.Limits_Val_Rec_Type;
2592 v_limit_attrs_tbl QP_Limits_PUB.Limit_Attrs_Tbl_Type;
2593 v_limit_attrs_val_tbl QP_Limits_PUB.Limit_Attrs_Val_Tbl_Type;
2594 v_limit_balances_tbl QP_Limits_PUB.Limit_Balances_Tbl_Type;
2595 v_limit_balances_val_tbl QP_Limits_PUB.Limit_Balances_Val_Tbl_Type;
2596
2597 BEGIN
2598 x_return_status := fnd_api.g_ret_sts_success;
2599
2600 IF p_limit_id = fnd_api.g_miss_num
2601 AND ( p_limit_amount = fnd_api.g_miss_num or p_limit_amount IS NULL) THEN
2602 RETURN;
2603 END IF;
2604
2605 IF p_limit_type = 'MAX_QTY_PER_ORDER' THEN
2606 l_limit_number := 1;
2607 ELSIF p_limit_type = 'MAX_QTY_PER_CUSTOMER' THEN
2608 l_limit_number := 2;
2609 ELSIF p_limit_type = 'MAX_QTY_PER_RULE' THEN
2610 l_limit_number := 3;
2611 ELSIF p_limit_type = 'MAX_ORDERS_PER_CUSTOMER' THEN
2612 l_limit_number := 4;
2613 ELSIF p_limit_type = 'MAX_AMOUNT_PER_RULE' THEN
2614 l_limit_number := 5;
2615 END IF;
2616
2617 OPEN cur_does_limit_exist(l_limit_number);
2618 FETCH cur_does_limit_exist INTO l_limit_exists;
2619 CLOSE cur_does_limit_exist;
2620
2621 IF l_limit_exists > 0 THEN
2622 IF p_limit_amount IS NULL THEN
2623 l_limits_rec.operation := 'DELETE';
2624 l_limits_rec.limit_id := p_limit_id;
2625 ELSIF p_limit_amount <> fnd_api.g_miss_num THEN
2626 l_limits_rec.operation := 'UPDATE';
2627 l_limits_rec.limit_id := p_limit_id;
2628 l_limits_rec.amount := p_limit_amount;
2629 END IF;
2630 ELSE
2631 --nirprasa
2632 IF p_limit_exceed_action_code IS NOT NULL AND p_limit_exceed_action_code <> FND_API.G_MISS_CHAR THEN
2633 populate_limits_rec(p_limit_type,l_limits_rec,p_limit_exceed_action_code);
2634 ELSE
2635 populate_limits_rec(p_limit_type,l_limits_rec);
2636 END IF;
2637
2638 l_limits_rec.list_line_id := p_list_line_id;
2639 l_limits_rec.list_header_id := p_list_header_id;
2640 l_limits_rec.amount := p_limit_amount;
2641 END IF;
2642
2643 -- as per suggetsion from Renuka and Karan for error message
2644 -- ORA-01400: cannot insert NULL into ("QP"."QP_LIMITS"."AMOUNT") in Package QP_Limits_Util Procedure
2645
2646 IF l_limits_rec.amount IS NOT NULL AND
2647 l_limits_rec.amount <> FND_API.G_MISS_NUM THEN
2648
2649 QP_Limits_PUB.Process_Limits
2650 ( p_init_msg_list => FND_API.g_true,
2651 p_api_version_number => 1.0,
2652 p_commit => FND_API.g_false,
2653 x_return_status => x_return_status,
2654 x_msg_count => x_msg_count,
2655 x_msg_data => x_msg_data,
2656 p_LIMITS_rec => l_limits_rec,
2657 x_LIMITS_rec => v_LIMITS_rec,
2658 x_LIMITS_val_rec => v_LIMITS_val_rec,
2659 x_LIMIT_ATTRS_tbl => v_LIMIT_ATTRS_tbl,
2660 x_LIMIT_ATTRS_val_tbl => v_LIMIT_ATTRS_val_tbl,
2661 x_LIMIT_BALANCES_tbl => v_LIMIT_BALANCES_tbl,
2662 x_LIMIT_BALANCES_val_tbl => v_LIMIT_BALANCES_val_tbl
2663 );
2664
2665 END IF;
2666
2667 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
2668 add_message(x_msg_count);
2669 RAISE Fnd_Api.g_exc_error;
2670 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
2671 add_message(x_msg_count);
2672 RAISE Fnd_Api.g_exc_unexpected_error;
2673 END IF;
2674 Fnd_Msg_Pub.Count_AND_Get
2675 ( p_count => x_msg_count,
2676 p_data => x_msg_data,
2677 p_encoded => Fnd_Api.G_FALSE
2678 );
2679
2680 EXCEPTION
2681 WHEN Fnd_Api.G_EXC_ERROR THEN
2682 x_return_status := Fnd_Api.g_ret_sts_error ;
2683 Fnd_Msg_Pub.Count_AND_Get
2684 ( p_count => x_msg_count,
2685 p_data => x_msg_data,
2686 p_encoded => Fnd_Api.G_FALSE
2687 );
2688 WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
2689 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
2690 Fnd_Msg_Pub.Count_AND_Get
2691 ( p_count => x_msg_count,
2692 p_data => x_msg_data,
2693 p_encoded => Fnd_Api.G_FALSE
2694 );
2695 WHEN OTHERS THEN
2696 x_return_status := Fnd_Api.g_ret_sts_unexp_erroR ;
2697 IF Fnd_Msg_Pub.Check_Msg_Level ( Fnd_Msg_Pub.G_MSG_LVL_UNEXP_ERROR ) THEN
2698 Fnd_Msg_Pub.Add_Exc_Msg( G_PKG_NAME,l_api_name);
2699 END IF;
2700 Fnd_Msg_Pub.Count_AND_Get
2701 ( p_count => x_msg_count,
2702 p_data => x_msg_data,
2703 p_encoded => Fnd_Api.G_FALSE
2704 );
2705 END process_limits;
2706
2707
2708 -------------------------------------------------------
2709 -- Start of Comments
2710 --
2711 -- NAME
2712 -- Post_Lumpsum_Offer
2713 --
2714 -- PURPOSE
2715 -- This Procedure posts a lumpsum type offer.
2716 --
2717 -- IN
2718 -- p_init_msg_list IN VARCHAR2,
2719 -- p_api_version IN NUMBER,
2720 -- p_commit IN VARCHAR2,
2721 -- p_offer_rec IN offers_rec_type
2722 --
2723 -- OUT
2724 -- x_return_status OUT VARCHAR2,
2725 -- x_msg_count OUT NUMBER,
2726 -- x_msg_data OUT VARCHAR2,
2727 --
2728 -- NOTES
2729 --
2730 -- HISTORY
2731 -- 15-MAY-2001 julou created
2732 -- End of Comments
2733 ---------------------------------------------------------
2734 PROCEDURE Post_Lumpsum_Offer(
2735 p_init_msg_list IN VARCHAR2,
2736 p_api_version IN NUMBER,
2737 p_commit IN VARCHAR2,
2738 x_return_status OUT NOCOPY VARCHAR2,
2739 x_msg_count OUT NOCOPY NUMBER,
2740 x_msg_data OUT NOCOPY VARCHAR2,
2741 p_offer_rec IN modifier_list_rec_type
2742 )
2743 IS
2744
2745 l_api_name CONSTANT VARCHAR2(30) := 'Post_Lumpsum_Offer';
2746 l_api_version CONSTANT NUMBER := 1.0;
2747 l_msg_data VARCHAR2(2000);
2748 l_msg_count NUMBER;
2749 l_old_status_id NUMBER;
2750 l_approval_type VARCHAR2(30);
2751 l_offer_rec modifier_list_rec_type := p_offer_rec;
2752
2753 CURSOR c_old_user_status_id IS
2754 SELECT user_status_id
2755 FROM ozf_offers
2756 WHERE qp_list_header_id = l_offer_rec.qp_list_header_id;
2757
2758 BEGIN
2759 SAVEPOINT post_lumpsum_offer;
2760
2761 -- Standard call to check for call compatibility.
2762 IF NOT FND_API.Compatible_API_Call ( l_api_version,
2763 p_api_version,
2764 l_api_name,
2765 G_PKG_NAME)
2766 THEN
2767 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2768 END IF;
2769
2770 IF FND_API.to_Boolean( p_init_msg_list ) THEN
2771 FND_MSG_PUB.initialize;
2772 END IF;
2773
2774 x_return_status := FND_API.G_RET_STS_SUCCESS;
2775
2776 OPEN c_old_user_status_id;
2777 FETCH c_old_user_status_id INTO l_old_status_id;
2778 CLOSE c_old_user_status_id;
2779
2780 OZF_Utility_PVT.check_new_status_change
2781 (
2782 p_object_type => 'OFFR',
2783 p_object_id => l_offer_rec.qp_list_header_id,
2784 p_old_status_id => l_old_status_id,
2785 p_new_status_id => l_offer_rec.user_status_id,
2786 p_custom_setup_id => l_offer_rec.custom_setup_id,
2787 x_approval_type => l_approval_type,
2788 x_return_status => x_return_status
2789 );
2790
2791 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
2792 RAISE Fnd_Api.g_exc_error;
2793 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
2794 RAISE Fnd_Api.g_exc_unexpected_error;
2795 END IF;
2796
2797 OZF_Fund_Adjustment_PVT.post_utilized_budget(
2798 p_offer_id => p_offer_rec.qp_list_header_id
2799 ,p_offer_type => 'LUMPSUM'
2800 ,p_api_version => p_api_version
2801 ,p_init_msg_list => p_init_msg_list
2802 ,p_commit => FND_API.G_FALSE
2803 ,x_msg_count => x_msg_count
2804 ,x_msg_data => x_msg_data
2805 ,x_return_status => x_return_status);
2806
2807 IF x_return_status = FND_API.G_RET_STS_ERROR THEN
2808 RAISE FND_API.G_EXC_ERROR;
2809 ELSIF x_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
2810 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2811 END IF;
2812
2813 FND_MSG_PUB.Count_And_Get
2814 (
2815 p_count => x_msg_count,
2816 p_data => x_msg_data,
2817 p_encoded => FND_API.G_FALSE
2818 );
2819
2820 EXCEPTION
2821 WHEN FND_API.G_EXC_ERROR THEN
2822 x_return_status := FND_API.g_ret_sts_error ;
2823 ROLLBACK TO post_lumpsum_offer;
2824 FND_MSG_PUB.Count_AND_Get
2825 ( p_count => l_msg_count,
2826 p_data => l_msg_data,
2827 p_encoded => FND_API.G_FALSE
2828 );
2829 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2830 x_return_status := FND_API.g_ret_sts_unexp_error ;
2831 ROLLBACK TO post_lumpsum_offer;
2832 FND_MSG_PUB.Count_AND_Get
2833 ( p_count => l_msg_count,
2834 p_data => l_msg_data,
2835 p_encoded => FND_API.G_FALSE
2836 );
2837 WHEN OTHERS THEN
2838 x_return_status := FND_API.g_ret_sts_unexp_error ;
2839 ROLLBACK TO post_lumpsum_offer;
2840 IF FND_MSG_PUB.Check_Msg_Level ( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
2841 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME,l_api_name);
2842 END IF;
2843 FND_MSG_PUB.Count_AND_Get
2844 ( p_count => l_msg_count,
2845 p_data => l_msg_data,
2846 p_encoded => FND_API.G_FALSE
2847 );
2848
2849 END Post_Lumpsum_Offer ;
2850
2851
2852 -------------------------------------------------------
2853 -- Start of Comments
2854 --
2855 -- NAME
2856 -- Post_Scan_Data_Offer
2857 --
2858 -- PURPOSE
2859 -- This Procedure posts a Scan Data type offer.
2860 --
2861 -- IN
2862 -- p_init_msg_list IN VARCHAR2,
2863 -- p_api_version IN NUMBER,
2864 -- p_commit IN VARCHAR2,
2865 -- p_offer_rec IN offers_rec_type
2866 --
2867 -- OUT
2868 -- x_return_status OUT VARCHAR2,
2869 -- x_msg_count OUT NUMBER,
2870 -- x_msg_data OUT VARCHAR2,
2871 --
2872 -- NOTES
2873 --
2874 -- HISTORY
2875 -- 02-OCT-2002 julou created
2876 -- End of Comments
2877 ---------------------------------------------------------
2878 PROCEDURE Post_Scan_Data_Offer(
2879 p_init_msg_list IN VARCHAR2,
2880 p_api_version IN NUMBER,
2881 p_commit IN VARCHAR2,
2882 x_return_status OUT NOCOPY VARCHAR2,
2883 x_msg_count OUT NOCOPY NUMBER,
2884 x_msg_data OUT NOCOPY VARCHAR2,
2885 p_offer_rec IN modifier_list_rec_type
2886 )
2887 IS
2888
2889 l_api_name CONSTANT VARCHAR2(30) := 'Post_Scan_Data_Offer';
2890 l_api_version CONSTANT NUMBER := 1.0;
2891 l_msg_data VARCHAR2(2000);
2892 l_msg_count NUMBER;
2893 l_old_status_id NUMBER;
2894 l_approval_type VARCHAR2(30);
2895 l_offer_rec modifier_list_rec_type := p_offer_rec;
2896
2897 CURSOR c_old_user_status_id IS
2898 SELECT user_status_id
2899 FROM ozf_offers
2900 WHERE qp_list_header_id = l_offer_rec.qp_list_header_id;
2901
2902 BEGIN
2903 SAVEPOINT post_scan_data_offer;
2904
2905 -- Standard call to check for call compatibility.
2906 IF NOT FND_API.Compatible_API_Call ( l_api_version,
2907 p_api_version,
2908 l_api_name,
2909 G_PKG_NAME)
2910 THEN
2911 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2912 END IF;
2913
2914 IF FND_API.to_Boolean( p_init_msg_list ) THEN
2915 FND_MSG_PUB.initialize;
2916 END IF;
2917
2918 x_return_status := FND_API.G_RET_STS_SUCCESS;
2919
2920 OPEN c_old_user_status_id;
2921 FETCH c_old_user_status_id INTO l_old_status_id;
2922 CLOSE c_old_user_status_id;
2923
2924 OZF_Utility_PVT.check_new_status_change
2925 (
2926 p_object_type => 'OFFR',
2927 p_object_id => l_offer_rec.qp_list_header_id,
2928 p_old_status_id => l_old_status_id,
2929 p_new_status_id => l_offer_rec.user_status_id,
2930 p_custom_setup_id => l_offer_rec.custom_setup_id,
2931 x_approval_type => l_approval_type,
2932 x_return_status => x_return_status
2933 );
2934
2935 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
2936 RAISE Fnd_Api.g_exc_error;
2937 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
2938 RAISE Fnd_Api.g_exc_unexpected_error;
2939 END IF;
2940
2941 OZF_Fund_Adjustment_PVT.post_utilized_budget(
2942 p_offer_id => p_offer_rec.qp_list_header_id
2943 ,p_offer_type => 'SCAN_DATA'
2944 ,p_api_version => p_api_version
2945 ,p_init_msg_list => p_init_msg_list
2946 ,p_commit => p_commit
2947 ,x_msg_count => x_msg_count
2948 ,x_msg_data => x_msg_data
2949 ,x_return_status => x_return_status);
2950
2951 IF x_return_status = FND_API.G_RET_STS_ERROR THEN
2952 RAISE FND_API.G_EXC_ERROR;
2953 ELSIF x_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
2954 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2955 END IF;
2956
2957 FND_MSG_PUB.Count_And_Get
2958 (
2959 p_count => x_msg_count,
2960 p_data => x_msg_data,
2961 p_encoded => FND_API.G_FALSE
2962 );
2963
2964 EXCEPTION
2965 WHEN FND_API.G_EXC_ERROR THEN
2966 x_return_status := FND_API.g_ret_sts_error ;
2967 ROLLBACK TO post_scan_data_offer;
2968 FND_MSG_PUB.Count_AND_Get
2969 ( p_count => l_msg_count,
2970 p_data => l_msg_data,
2971 p_encoded => FND_API.G_FALSE
2972 );
2973 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2974 x_return_status := FND_API.g_ret_sts_unexp_error ;
2975 ROLLBACK TO post_scan_data_offer;
2976 FND_MSG_PUB.Count_AND_Get
2977 ( p_count => l_msg_count,
2978 p_data => l_msg_data,
2979 p_encoded => FND_API.G_FALSE
2980 );
2981 WHEN OTHERS THEN
2982 x_return_status := FND_API.g_ret_sts_unexp_error ;
2983 ROLLBACK TO post_scan_data_offer;
2984 IF FND_MSG_PUB.Check_Msg_Level ( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
2985 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME,l_api_name);
2986 END IF;
2987 FND_MSG_PUB.Count_AND_Get
2988 ( p_count => l_msg_count,
2989 p_data => l_msg_data,
2990 p_encoded => FND_API.G_FALSE
2991 );
2992
2993 END Post_Scan_Data_Offer ;
2994
2995
2996 --------------------------------------------------
2997 -- Start of Comments
2998 --
2999 -- NAME
3000 -- validate_offer_dates
3001 --
3002 -- PURPOSE
3003 -- This Procedure validates the dates in offer rec.
3004 --
3005 -- IN
3006 -- p_init_msg_list IN VARCHAR2,
3007 -- p_api_version IN NUMBER,
3008 -- p_offer_rec IN offers_rec_type
3009 --
3010 -- OUT
3011 -- x_return_status OUT VARCHAR2,
3012 -- x_msg_count OUT NUMBER,
3013 -- x_msg_data OUT VARCHAR2,
3014 --
3015 -- NOTES
3016 --
3017 -- HISTORY
3018 -- 17-OCT-2001 julou created
3019 -- End of Comments
3020 -------------------------------------------------
3021 PROCEDURE validate_offer_dates
3022 (
3023 p_init_msg_list IN VARCHAR2,
3024 p_api_version IN NUMBER,
3025 x_return_status OUT NOCOPY VARCHAR2,
3026 x_msg_count OUT NOCOPY NUMBER,
3027 x_msg_data OUT NOCOPY VARCHAR2,
3028 p_offer_rec IN modifier_list_rec_type
3029 )
3030 IS
3031
3032 CURSOR c_creation_date(l_list_header_id NUMBER) IS
3033 SELECT TRUNC(creation_date)
3034 FROM qp_list_headers
3035 WHERE list_header_id = l_list_header_id;
3036
3037 l_api_name CONSTANT VARCHAR2(30) := 'Validate_Offer_Dates';
3038 l_api_version CONSTANT NUMBER := 1.0;
3039 l_msg_data VARCHAR2(2000);
3040 l_msg_count NUMBER;
3041 l_creation_date DATE;
3042
3043 BEGIN
3044 IF NOT FND_API.Compatible_API_Call ( l_api_version,
3045 p_api_version,
3046 l_api_name,
3047 G_PKG_NAME)
3048 THEN
3049 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3050 END IF;
3051
3052 IF FND_API.to_Boolean( p_init_msg_list ) THEN
3053 FND_MSG_PUB.initialize;
3054 END IF;
3055
3056 x_return_status := FND_API.G_RET_STS_SUCCESS;
3057 /*
3058 IF p_offer_rec.start_date_active IS NOT NULL
3059 AND p_offer_rec.start_date_active <> FND_API.G_MISS_DATE THEN
3060 IF p_offer_rec.offer_operation = 'CREATE' THEN
3061 IF p_offer_rec.start_date_active < TRUNC(SYSDATE) THEN
3062 IF p_offer_rec.offer_type <> 'NET_ACCRUAL' AND p_offer_rec.custom_setup_id <> 117 THEN
3063 Fnd_Message.SET_NAME('OZF','OZF_OFFR_STARTDATE_LT_SYSDATE');
3064 Fnd_Msg_Pub.ADD;
3065 RAISE FND_API.G_EXC_ERROR;
3066 END IF;
3067 END IF;
3068 ELSIF p_offer_rec.offer_operation = 'UPDATE' THEN
3069 OPEN c_creation_date(p_offer_rec.qp_list_header_id);
3070 FETCH c_creation_date INTO l_creation_date;
3071 CLOSE c_creation_date;
3072 IF p_offer_rec.start_date_active < l_creation_date THEN
3073 IF p_offer_rec.offer_type <> 'NET_ACCRUAL' AND p_offer_rec.custom_setup_id <> 117 THEN
3074 Fnd_Message.SET_NAME('OZF','OZF_OFFR_STARTDATE_LT_CREDATE');
3075 Fnd_Msg_Pub.ADD;
3076 RAISE FND_API.G_EXC_ERROR;
3077 END IF;
3078 END IF;
3079 END IF;
3080 END IF;
3081 */
3082 IF p_offer_rec.end_date_active IS NOT NULL
3083 AND p_offer_rec.end_date_active <> FND_API.G_MISS_DATE THEN
3084 IF p_offer_rec.offer_operation = 'CREATE' THEN
3085 IF p_offer_rec.end_date_active < TRUNC(SYSDATE) THEN
3086 IF p_offer_rec.offer_type <> 'NET_ACCRUAL' AND p_offer_rec.custom_setup_id <> 117 THEN
3087 Fnd_Message.SET_NAME('OZF','OZF_OFFR_ENDDATE_LT_SYSDATE');
3088 Fnd_Msg_Pub.ADD;
3089 RAISE FND_API.G_EXC_ERROR;
3090 END IF;
3091 END IF;
3092 ELSIF p_offer_rec.offer_operation = 'UPDATE' THEN
3093 OPEN c_creation_date(p_offer_rec.qp_list_header_id);
3094 FETCH c_creation_date INTO l_creation_date;
3095 CLOSE c_creation_date;
3096 IF p_offer_rec.end_date_active < l_creation_date THEN
3097 IF p_offer_rec.offer_type <> 'NET_ACCRUAL' AND p_offer_rec.custom_setup_id <> 117 THEN
3098 Fnd_Message.SET_NAME('OZF','OZF_OFFR_ENDDATE_LT_CREDATE');
3099 Fnd_Msg_Pub.ADD;
3100 RAISE FND_API.G_EXC_ERROR;
3101 END IF;
3102 END IF;
3103 END IF;
3104 END IF;
3105
3106 IF p_offer_rec.offer_type IN ('SCAN_DATA', 'NET_ACCRUAL')
3107 OR (p_offer_rec.offer_type = 'LUMPSUM' AND p_offer_rec.custom_setup_id <> 110) -- not applicable to soft fund
3108 THEN
3109 IF p_offer_rec.start_date_active IS NULL THEN
3110 ozf_utility_pvt.error_message('OZF_OFFR_NO_START_DATE');
3111 RAISE FND_API.G_EXC_ERROR;
3112 END IF;
3113 END IF;
3114
3115 EXCEPTION
3116 WHEN FND_API.G_EXC_ERROR THEN
3117 x_return_status := FND_API.g_ret_sts_error ;
3118 FND_MSG_PUB.Count_AND_Get
3119 ( p_count => l_msg_count,
3120 p_data => l_msg_data,
3121 p_encoded => FND_API.G_FALSE
3122 );
3123 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
3124 x_return_status := FND_API.g_ret_sts_unexp_error ;
3125 FND_MSG_PUB.Count_AND_Get
3126 ( p_count => l_msg_count,
3127 p_data => l_msg_data,
3128 p_encoded => FND_API.G_FALSE
3129 );
3130 WHEN OTHERS THEN
3131 x_return_status := FND_API.g_ret_sts_unexp_error ;
3132 IF FND_MSG_PUB.Check_Msg_Level ( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
3133 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME,l_api_name);
3134 END IF;
3135 FND_MSG_PUB.Count_AND_Get
3136 ( p_count => l_msg_count,
3137 p_data => l_msg_data,
3138 p_encoded => FND_API.G_FALSE
3139 );
3140 END validate_offer_dates;
3141
3142 -------------------------------------------------
3143 -- Start of Comments
3144 --
3145 -- NAME
3146 -- validate_offer
3147 --
3148 -- PURPOSE
3149 -- This Procedure validates the offer
3150 --
3151 -- IN
3152 -- p_init_msg_list IN VARCHAR2,
3153 -- p_api_version IN NUMBER,
3154 -- p_offer_rec IN offers_rec_type
3155 --
3156 -- OUT
3157 -- x_return_status OUT VARCHAR2,
3158 -- x_msg_count OUT NUMBER,
3159 -- x_msg_data OUT VARCHAR2,
3160 --
3161 -- NOTES
3162 --
3163 -- HISTORY
3164 -- 15-MAY-2001 julou created
3165 -- 29-MAY-2001 julou modified
3166 -- no validatation for approved amount and offer amount
3167 -- if budget approval is not required
3168 -- End of Comments
3169 -------------------------------------------------
3170 PROCEDURE Validate_Offer(
3171 p_init_msg_list IN VARCHAR2,
3172 p_api_version IN NUMBER,
3173 x_return_status OUT NOCOPY VARCHAR2,
3174 x_msg_count OUT NOCOPY NUMBER,
3175 x_msg_data OUT NOCOPY VARCHAR2,
3176 p_offer_rec IN modifier_list_rec_type
3177 )
3178 IS
3179
3180 CURSOR c_approved_amount(l_id NUMBER) IS
3181 SELECT nvl(sum(approved_amount),0)
3182 FROM ozf_act_budgets
3183 WHERE arc_act_budget_used_by = 'OFFR'
3184 AND act_budget_used_by_id = l_id;
3185
3186 l_api_name CONSTANT VARCHAR2(30) := 'Validate_Offer';
3187 l_api_version CONSTANT NUMBER := 1.0;
3188 l_msg_data VARCHAR2(2000);
3189 l_msg_count NUMBER;
3190 l_approved_amount NUMBER;
3191
3192 l_estimated_amount NUMBER;
3193 l_bapl_count NUMBER;
3194 l_offers_rec modifier_list_rec_type := p_offer_rec;
3195
3196 CURSOR cur_attr_avail_flag IS
3197 SELECT attr_available_flag
3198 FROM ams_custom_setup_attr
3199 WHERE custom_setup_id = p_offer_rec.custom_setup_id
3200 AND object_attribute = 'BREQ';
3201
3202 CURSOR c_committed_amount IS
3203 SELECT NVL(SUM(scan_value * scan_unit_forecast/quantity), 0)
3204 FROM ams_act_products
3205 WHERE arc_act_product_used_by = 'OFFR'
3206 AND act_product_used_by_id = p_offer_rec.qp_list_header_id;
3207
3208 l_attr_avail_flag VARCHAR2(1);
3209 l_recal VARCHAR2(1);
3210 l_committed_amount NUMBER := 0;
3211
3212 BEGIN
3213 -- Standard call to check for call compatibility.
3214 IF NOT FND_API.Compatible_API_Call ( l_api_version,
3215 p_api_version,
3216 l_api_name,
3217 G_PKG_NAME)
3218 THEN
3219 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3220 END IF;
3221
3222 -- Initialize message list if p_init_msg_list is set to TRUE.
3223 IF FND_API.to_Boolean( p_init_msg_list ) THEN
3224 FND_MSG_PUB.initialize;
3225 END IF;
3226
3227 -- Initialize API return status to SUCCESS
3228 x_return_status := FND_API.G_RET_STS_SUCCESS;
3229
3230 OPEN cur_attr_avail_flag;
3231 FETCH cur_attr_avail_flag INTO l_attr_avail_flag;
3232 CLOSE cur_attr_avail_flag;
3233
3234 IF l_attr_avail_flag = 'Y' THEN
3235
3236 --IF l_offers_rec.offer_type NOT IN ('OID','TERMS') THEN -- Header Level Limits not enforced for Promotional Goods
3237
3238
3239 OPEN c_approved_amount(l_offers_rec.qp_list_header_id);
3240 FETCH c_approved_amount INTO l_approved_amount;
3241 CLOSE c_approved_amount;
3242
3243 l_recal := NVL(FND_PROFILE.VALUE('OZF_BUDGET_ADJ_ALLOW_RECAL'), 'Y');
3244 --julou checking approved amount vs committed amount for recal=N and lumpsum, scan_data
3245 IF l_recal = 'N' OR (l_recal = 'Y' AND p_offer_rec.offer_type IN ('LUMPSUM', 'SCAN_DATA')) THEN
3246 -- populate committed amount
3247 IF p_offer_rec.offer_type = 'SCAN_DATA' THEN
3248 OPEN c_committed_amount;
3249 FETCH c_committed_amount INTO l_committed_amount;
3250 CLOSE c_committed_amount;
3251 ELSIF p_offer_rec.offer_type = 'LUMPSUM' THEN
3252 IF p_offer_rec.lumpsum_amount IS NULL
3253 OR p_offer_rec.lumpsum_amount = FND_API.G_MISS_NUM THEN
3254 l_committed_amount := 0;
3255 ELSE
3256 l_committed_amount := p_offer_rec.lumpsum_amount;
3257 END IF;
3258 ELSE -- other offer types
3259 IF p_offer_rec.offer_amount IS NULL
3260 OR p_offer_rec.offer_amount = FND_API.G_MISS_NUM THEN
3261 l_committed_amount := 0;
3262 ELSE
3263 l_committed_amount := p_offer_rec.offer_amount;
3264 END IF;
3265 END IF;
3266
3267 IF l_committed_amount > l_approved_amount THEN
3268 OZF_Utility_PVT.Error_Message(p_message_name => 'OZF_OFFER_AMNT_GT_APPR_AMNT');
3269 RAISE FND_API.G_EXC_ERROR;
3270 END IF;
3271 ELSIF l_recal = 'Y' AND p_offer_rec.offer_type NOT IN ('LUMPSUM', 'SCAN_DATA') THEN
3272 IF l_approved_amount < 0 THEN
3273 OZF_Utility_PVT.Error_Message(p_message_name => 'OZF_NO_APPROVED_AMOUNT');
3274 RAISE FND_API.G_EXC_ERROR;
3275 END IF;
3276 END IF;
3277 END IF;
3278
3279 FND_MSG_PUB.Count_And_Get
3280 (
3281 p_count => x_msg_count,
3282 p_data => x_msg_data,
3283 p_encoded => FND_API.G_FALSE
3284 );
3285
3286 EXCEPTION
3287 WHEN FND_API.G_EXC_ERROR THEN
3288 x_return_status := FND_API.g_ret_sts_error ;
3289 FND_MSG_PUB.Count_AND_Get
3290 ( p_count => l_msg_count,
3291 p_data => l_msg_data,
3292 p_encoded => FND_API.G_FALSE
3293 );
3294 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
3295 x_return_status := FND_API.g_ret_sts_unexp_error ;
3296 FND_MSG_PUB.Count_AND_Get
3297 ( p_count => l_msg_count,
3298 p_data => l_msg_data,
3299 p_encoded => FND_API.G_FALSE
3300 );
3301 WHEN OTHERS THEN
3302 x_return_status := FND_API.g_ret_sts_unexp_error ;
3303 IF FND_MSG_PUB.Check_Msg_Level ( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
3304 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME,l_api_name);
3305 END IF;
3306 FND_MSG_PUB.Count_AND_Get
3307 ( p_count => l_msg_count,
3308 p_data => l_msg_data,
3309 p_encoded => FND_API.G_FALSE
3310 );
3311
3312 END validate_offer;
3313
3314 PROCEDURE validate_scandata_budget(
3315 p_init_msg_list IN VARCHAR2
3316 ,p_api_version IN NUMBER
3317 ,x_return_status OUT NOCOPY VARCHAR2
3318 ,x_msg_count OUT NOCOPY NUMBER
3319 ,x_msg_data OUT NOCOPY VARCHAR2
3320 ,p_qp_list_header_id IN NUMBER)
3321 IS
3322 CURSOR c_request_amount IS
3323 SELECT NVL(SUM(request_amount), 0)
3324 FROM ozf_act_budgets
3325 WHERE arc_act_budget_used_by = 'OFFR'
3326 AND act_budget_used_by_id = p_qp_list_header_id;
3327
3328 CURSOR c_committed_amount IS
3329 SELECT NVL(SUM(scan_value * scan_unit_forecast/quantity), 0)
3330 FROM ams_act_products
3331 WHERE arc_act_product_used_by = 'OFFR'
3332 AND act_product_used_by_id = p_qp_list_header_id;
3333
3334 l_api_name CONSTANT VARCHAR2(30) := 'validate_scandata_budget';
3335 l_api_version CONSTANT NUMBER := 1.0;
3336 l_msg_data VARCHAR2(2000);
3337 l_msg_count NUMBER;
3338
3339 l_request_amount NUMBER;
3340 l_committed_amount NUMBER;
3341
3342 BEGIN
3343 -- Standard call to check for call compatibility.
3344 IF NOT FND_API.Compatible_API_Call ( l_api_version,
3345 p_api_version,
3346 l_api_name,
3347 G_PKG_NAME)
3348 THEN
3349 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3350 END IF;
3351
3352 -- Initialize message list if p_init_msg_list is set to TRUE.
3353 IF FND_API.to_Boolean( p_init_msg_list ) THEN
3354 FND_MSG_PUB.initialize;
3355 END IF;
3356
3357 -- Initialize API return status to SUCCESS
3358 x_return_status := FND_API.G_RET_STS_SUCCESS;
3359
3360 OPEN c_request_amount;
3361 FETCH c_request_amount INTO l_request_amount;
3362 IF c_request_amount%NOTFOUND THEN
3363 CLOSE c_request_amount;
3364 OZF_Utility_PVT.Error_Message('OZF_OFFR_NO_BUDGET_REQUEST');
3365 RAISE FND_API.G_EXC_ERROR;
3366 END IF;
3367 CLOSE c_request_amount;
3368
3369 OPEN c_committed_amount;
3370 FETCH c_committed_amount INTO l_committed_amount;
3371 CLOSE c_committed_amount;
3372
3373 IF l_committed_amount > l_request_amount THEN
3374 OZF_Utility_PVT.Error_Message('OZF_OFFR_REQAMT_LT_OFFAMT');
3375 RAISE FND_API.G_EXC_ERROR;
3376 END IF;
3377
3378 FND_MSG_PUB.Count_And_Get
3379 (p_count => x_msg_count,
3380 p_data => x_msg_data,
3381 p_encoded => FND_API.G_FALSE);
3382
3383 EXCEPTION
3384 WHEN FND_API.G_EXC_ERROR THEN
3385 x_return_status := FND_API.g_ret_sts_error ;
3386 FND_MSG_PUB.Count_AND_Get
3387 ( p_count => l_msg_count,
3388 p_data => l_msg_data,
3389 p_encoded => FND_API.G_FALSE
3390 );
3391 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
3392 x_return_status := FND_API.g_ret_sts_unexp_error ;
3393 FND_MSG_PUB.Count_AND_Get
3394 ( p_count => l_msg_count,
3395 p_data => l_msg_data,
3396 p_encoded => FND_API.G_FALSE
3397 );
3398 WHEN OTHERS THEN
3399 x_return_status := FND_API.g_ret_sts_unexp_error ;
3400 IF FND_MSG_PUB.Check_Msg_Level ( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
3401 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME,l_api_name);
3402 END IF;
3403 FND_MSG_PUB.Count_AND_Get
3404 ( p_count => l_msg_count,
3405 p_data => l_msg_data,
3406 p_encoded => FND_API.G_FALSE
3407 );
3408
3409 END validate_scandata_budget;
3410
3411 -------------------------------------------------
3412 -- Start of Comments
3413 --
3414 -- NAME
3415 -- Push_Target_group
3416 --
3417 -- PURPOSE
3418 -- This Procedure pushes target group info for each schedule into QP
3419 --
3420 -- IN
3421 -- p_init_msg_list IN VARCHAR2,
3422 -- p_api_version IN NUMBER,
3423 -- p_commit IN VARCHAR2,
3424 -- p_offer_rec IN offers_rec_type
3425 --
3426 -- OUT
3427 -- x_return_status OUT VARCHAR2,
3428 -- x_msg_count OUT NUMBER,
3429 -- x_msg_data OUT VARCHAR2,
3430 --
3431 -- NOTES
3432 --
3433 -- HISTORY
3434 -- 15-MAY-2001 julou created
3435 -- End of Comments
3436 -------------------------------------------------
3437 PROCEDURE Push_Target_group(
3438 p_init_msg_list IN VARCHAR2,
3439 p_api_version IN NUMBER,
3440 p_commit IN VARCHAR2,
3441 x_return_status OUT NOCOPY VARCHAR2,
3442 x_msg_count OUT NOCOPY NUMBER,
3443 x_msg_data OUT NOCOPY VARCHAR2,
3444 p_offer_rec IN modifier_list_rec_type
3445 )
3446 IS
3447
3448 CURSOR c_act_offer(l_qp_id NUMBER) IS
3449 SELECT act_offer_used_by_id
3450 FROM ozf_act_offers
3451 WHERE arc_act_offer_used_by = 'CSCH'
3452 AND qp_list_header_id = l_qp_id;
3453 l_act_offer_rec c_act_offer%ROWTYPE;
3454
3455 CURSOR c_list_header_id(l_sch_id NUMBER) IS
3456 SELECT list_header_id
3457 FROM ams_act_lists
3458 WHERE list_act_type = 'TARGET'
3459 AND list_used_by = 'CSCH'
3460 AND list_used_by_id = l_sch_id;
3461
3462 CURSOR c_schedule_dates(l_sch_id NUMBER) IS
3463 SELECT start_date_time, end_date_time
3464 FROM ams_campaign_schedules_vl
3465 WHERE schedule_id = l_sch_id
3466 AND status_code = 'ACTIVE';
3467 l_schedule_dates c_schedule_dates%ROWTYPE;
3468
3469 l_api_name CONSTANT VARCHAR2(30) := 'Push_Target_group';
3470 l_api_version CONSTANT NUMBER := 1.0;
3471 l_msg_data VARCHAR2(2000);
3472 l_msg_count NUMBER;
3473 l_list_header_id NUMBER;
3474 l_qualifiers_tbl qualifiers_tbl_type;
3475 l_error_location NUMBER;
3476
3477 l_index NUMBER ;
3478 x_qualifiers_tbl qp_qualifier_rules_pub.qualifiers_tbl_type;
3479 BEGIN
3480 SAVEPOINT Push_Target_group;
3481
3482 -- Standard call to check for call compatibility.
3483 IF NOT FND_API.Compatible_API_Call ( l_api_version,
3484 p_api_version,
3485 l_api_name,
3486 G_PKG_NAME)
3487 THEN
3488 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3489 END IF;
3490
3491 -- Initialize message list if p_init_msg_list is set to TRUE.
3492 IF FND_API.to_Boolean( p_init_msg_list )
3493 THEN
3494 FND_MSG_PUB.initialize;
3495 END IF;
3496
3497 -- Initialize API return status to SUCCESS
3498 x_return_status := FND_API.G_RET_STS_SUCCESS;
3499
3500 l_index := 1;
3501
3502 FOR l_act_offer_rec IN c_act_offer(p_offer_rec.qp_list_header_id)
3503 LOOP
3504
3505 OPEN c_list_header_id(l_act_offer_rec.act_offer_used_by_id);
3506 FETCH c_list_header_id INTO l_list_header_id;
3507 CLOSE c_list_header_id;
3508
3509 OPEN c_schedule_dates(l_act_offer_rec.act_offer_used_by_id);
3510 FETCH c_schedule_dates INTO l_schedule_dates;
3511
3512 IF c_schedule_dates%FOUND THEN
3513
3514 l_qualifiers_tbl(l_index).qualifier_context := 'CUSTOMER_GROUP';
3515 l_qualifiers_tbl(l_index).qualifier_attribute := 'QUALIFIER_ATTRIBUTE1';
3516 l_qualifiers_tbl(l_index).qualifier_attr_value := l_list_header_id;
3517 l_qualifiers_tbl(l_index).comparison_operator_code := '=';
3518 l_qualifiers_tbl(l_index).list_header_id := p_offer_rec.qp_list_header_id;
3519 l_qualifiers_tbl(l_index).start_date_active := l_schedule_dates.start_date_time;
3520 l_qualifiers_tbl(l_index).end_date_active := l_schedule_dates.end_date_time;
3521 l_qualifiers_tbl(l_index).operation := 'CREATE';
3522
3523 l_index := l_index + 1;
3524
3525 END IF;
3526
3527 CLOSE c_schedule_dates;
3528
3529 END LOOP;
3530
3531 IF l_qualifiers_tbl.count > 0 THEN
3532 process_market_qualifiers
3533 (
3534 p_init_msg_list => p_init_msg_list
3535 ,p_api_version => p_api_version
3536 ,p_commit => FND_API.g_false
3537 ,x_return_status => x_return_status
3538 ,x_msg_count => x_msg_count
3539 ,x_msg_data => x_msg_data
3540 ,p_qualifiers_tbl => l_qualifiers_tbl
3541 ,x_error_location => l_error_location
3542 ,x_qualifiers_tbl => x_qualifiers_tbl
3543 );
3544
3545
3546 IF x_return_status = FND_API.G_RET_STS_ERROR THEN
3547 RAISE FND_API.G_EXC_ERROR;
3548 ELSIF x_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
3549 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3550 END IF;
3551
3552 END IF;
3553
3554 FND_MSG_PUB.Count_And_Get
3555 ( p_count => x_msg_count,
3556 p_data => x_msg_data,
3557 p_encoded => FND_API.G_FALSE
3558 );
3559
3560 EXCEPTION
3561 WHEN FND_API.G_EXC_ERROR THEN
3562 x_return_status := FND_API.g_ret_sts_error ;
3563 ROLLBACK TO Push_Target_group;
3564 FND_MSG_PUB.Count_AND_Get
3565 ( p_count => l_msg_count,
3566 p_data => l_msg_data,
3567 p_encoded => FND_API.G_FALSE
3568 );
3569 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
3570 x_return_status := FND_API.g_ret_sts_unexp_error ;
3571 ROLLBACK TO Push_Target_group;
3572 FND_MSG_PUB.Count_AND_Get
3573 ( p_count => l_msg_count,
3574 p_data => l_msg_data,
3575 p_encoded => FND_API.G_FALSE
3576 );
3577 WHEN OTHERS THEN
3578 x_return_status := FND_API.g_ret_sts_unexp_error ;
3579 ROLLBACK TO Push_Target_group;
3580 IF FND_MSG_PUB.Check_Msg_Level ( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR )
3581 THEN
3582 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME,l_api_name);
3583 END IF;
3584 FND_MSG_PUB.Count_AND_Get
3585 ( p_count => l_msg_count,
3586 p_data => l_msg_data,
3587 p_encoded => FND_API.G_FALSE
3588 );
3589
3590 END Push_Target_group;
3591
3592
3593 PROCEDURE update_request_status (
3594 x_return_status OUT NOCOPY VARCHAR2,
3595 x_msg_count OUT NOCOPY NUMBER,
3596 x_msg_data OUT NOCOPY VARCHAR2,
3597 p_qp_list_header_id IN NUMBER
3598 )
3599 IS
3600 CURSOR c_req_header_rec(p_offer_id IN NUMBER) IS
3601 SELECT req.request_header_id,req.object_version_number,req.status_code
3602 FROM ozf_request_headers_all_b req,ozf_offers off
3603 WHERE req.request_number = off.offer_code
3604 AND off.qp_list_header_id = p_offer_id;
3605
3606 l_req_header_id NUMBER;
3607 l_obj_ver_num NUMBER;
3608 l_status_code VARCHAR2 (30);
3609 l_return_status VARCHAR2 (10) := fnd_api.g_ret_sts_success;
3610 l_api_name VARCHAR2 (60) := 'update_request_status';
3611 l_full_name VARCHAR2 (100) := g_pkg_name||'.'||l_api_name;
3612 l_api_version NUMBER := 1;
3613 BEGIN
3614 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_debug_high) THEN
3615 debug_message(l_full_name||' : '||'begin');
3616 END IF;
3617
3618 OPEN c_req_header_rec(p_qp_list_header_id);
3619 FETCH c_req_header_rec INTO l_req_header_id, l_obj_ver_num, l_status_code;
3620 CLOSE c_req_header_rec;
3621
3622 IF l_status_code <> 'APPROVED' THEN
3623 UPDATE ozf_request_headers_all_b
3624 SET status_code ='APPROVED',
3625 object_version_number = l_obj_ver_num + 1
3626 WHERE request_header_id = l_req_header_id;
3627 END IF;
3628
3629 fnd_msg_pub.count_and_get (p_count=> x_msg_count,
3630 p_data=> x_msg_data,
3631 p_encoded=> fnd_api.g_false);
3632
3633 EXCEPTION
3634 WHEN fnd_api.g_exc_error THEN
3635 x_return_status := fnd_api.g_ret_sts_error;
3636 fnd_msg_pub.count_and_get (p_count=> x_msg_count,
3637 p_data=> x_msg_data,
3638 p_encoded=> fnd_api.g_false);
3639 WHEN fnd_api.g_exc_unexpected_error THEN
3640 x_return_status := fnd_api.g_ret_sts_unexp_error;
3641 fnd_msg_pub.count_and_get (p_count=> x_msg_count,
3642 p_data=> x_msg_data,
3643 p_encoded=> fnd_api.g_false);
3644 WHEN OTHERS THEN
3645 x_return_status := fnd_api.g_ret_sts_unexp_error;
3646
3647 IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_unexp_error) THEN
3648 fnd_msg_pub.add_exc_msg (g_pkg_name, l_api_name);
3649 END IF;
3650
3651 fnd_msg_pub.count_and_get (p_count=> x_msg_count,
3652 p_data=> x_msg_data,
3653 p_encoded=> fnd_api.g_false);
3654 END update_request_status;
3655
3656
3657 -------------------------------------------------
3658 -- Start of Comments
3659 --
3660 -- NAME
3661 -- Activate_Offer_Over
3662 --
3663 -- PURPOSE
3664 -- This Procedure actives the offer if certain conditions are met.
3665 --
3666 -- IN
3667 -- p_init_msg_list IN VARCHAR2,
3668 -- p_api_version IN NUMBER,
3669 -- p_commit IN VARCHAR2,
3670 -- p_offer_rec IN offers_rec_type
3671 --
3672 -- OUT
3673 -- x_return_status OUT VARCHAR2,
3674 -- x_msg_count OUT NUMBER,
3675 -- x_msg_data OUT VARCHAR2,
3676 --
3677 -- NOTES
3678 --
3679 -- HISTORY
3680 -- 15-MAY-2001 julou created
3681 -- End of Comments
3682 -------------------------------------------------
3683 PROCEDURE Activate_Offer_Over(
3684 p_init_msg_list IN VARCHAR2,
3685 p_api_version IN NUMBER,
3686 p_commit IN VARCHAR2,
3687 x_return_status OUT NOCOPY VARCHAR2,
3688 x_msg_count OUT NOCOPY NUMBER,
3689 x_msg_data OUT NOCOPY VARCHAR2,
3690 p_called_from IN VARCHAR2, -- possible values 'B' Budget,'R' -Regular
3691 p_offer_rec IN modifier_list_rec_type,
3692 x_amount_error OUT NOCOPY VARCHAR2
3693 )
3694 IS
3695
3696 CURSOR c_offer_id(p_qp_list_header_id NUMBER) IS
3697 SELECT offer_id
3698 FROM ozf_offers
3699 WHERE qp_list_header_id = p_qp_list_header_id;
3700
3701 CURSOR c_offer_start_date(p_list_header_id NUMBER) IS
3702 SELECT q.start_date_active, o.start_date
3703 FROM qp_list_headers_b q, ozf_offers o
3704 WHERE o.qp_list_header_id = q.list_header_id
3705 AND q.list_header_id = p_list_header_id;
3706
3707 -- fix for bug 7004273 and 7201785
3708 CURSOR c_sd_req_header_rec(p_offer_id IN NUMBER) IS
3709 SELECT sdr.object_version_number, sdr.request_header_id
3710 FROM ozf_sd_request_headers_all_b sdr, ozf_offers off
3711 --WHERE nvl(sdr.authorization_number,sdr.request_number) = off.offer_code
3712 WHERE sdr.request_number = off.offer_code
3713 AND off.qp_list_header_id = p_offer_id
3714 AND sdr.user_status_id = OZF_Utility_PVT.get_default_user_status('OZF_SD_REQUEST_STATUS', 'PENDING_OFFER_APPROVAL');
3715
3716
3717 l_api_name CONSTANT VARCHAR2(30) := 'Activate_Offer_Over';
3718 l_api_version CONSTANT NUMBER := 1.0;
3719 l_msg_data VARCHAR2(2000);
3720 l_msg_count NUMBER;
3721 --l_offer_rec modifier_list_rec_type := p_offer_rec;
3722 l_recal VARCHAR2(1);
3723 l_pass_validation_flag VARCHAR2(1);
3724 l_offer_id NUMBER;
3725 x_qualifiers_tbl qp_qualifier_rules_pub.qualifiers_tbl_type;
3726 l_start_date_q DATE;
3727 l_start_date_o DATE;
3728 l_start_date DATE;
3729 l_obj_ver_num NUMBER;
3730 l_sdr_req_header_id NUMBER;
3731 BEGIN
3732 SAVEPOINT activate_offer_over;
3733 -- Standard call to check for call compatibility.
3734 IF NOT FND_API.Compatible_API_Call ( l_api_version,
3735 p_api_version,
3736 l_api_name,
3737 G_PKG_NAME)
3738 THEN
3739 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3740 END IF;
3741
3742 -- Initialize message list if p_init_msg_list is set to TRUE.
3743 IF FND_API.to_Boolean( p_init_msg_list )
3744 THEN
3745 FND_MSG_PUB.initialize;
3746 END IF;
3747
3748 -- Initialize API return status to SUCCESS
3749 x_return_status := FND_API.G_RET_STS_SUCCESS;
3750 x_amount_error := 'N';
3751
3752 IF p_offer_rec.custom_setup_id = 105 THEN
3753 OPEN c_offer_id(p_offer_rec.qp_list_header_id);
3754 FETCH c_offer_id INTO l_offer_id;
3755 CLOSE c_offer_id;
3756
3757 IF p_offer_rec.status_code = 'DRAFT' THEN
3758 l_pass_validation_flag := 'N';
3759 ELSE
3760 l_pass_validation_flag := 'Y';
3761 END IF;
3762
3763 pv_referral_comp_pub.Update_Referral_Status (p_api_version => p_api_version,
3764 p_init_msg_list => p_init_msg_list,
3765 p_commit => p_commit,
3766 p_validation_level => FND_API.g_valid_level_full,
3767 p_offer_id => l_offer_id,
3768 p_pass_validation_flag => l_pass_validation_flag,
3769 x_return_status => x_return_status,
3770 x_msg_count => x_msg_count,
3771 x_msg_data => x_msg_data);
3772 END IF;
3773
3774 IF p_offer_rec.status_code = 'DRAFT' THEN
3775 -- CP validation fails. update offer to DRAFT
3776 UPDATE ozf_offers
3777 SET status_code = 'DRAFT'
3778 ,user_status_id = OZF_Utility_PVT.get_default_user_status ('OZF_OFFER_STATUS', 'DRAFT')
3779 ,status_date = SYSDATE
3780 ,object_version_number = object_version_number + 1
3781 WHERE qp_list_header_id = p_offer_rec.qp_list_header_id;
3782 ELSE
3783 -- validate approved amount vs committed amout and update offer status depending on recal
3784 -- moved from end
3785 validate_offer(
3786 p_init_msg_list => FND_API.G_FALSE,
3787 p_api_version => 1.0,
3788 x_return_status => x_return_status,
3789 x_msg_count => x_msg_count,
3790 x_msg_data => x_msg_data,
3791 p_offer_rec => p_offer_rec
3792 );
3793 l_recal := FND_PROFILE.VALUE('OZF_BUDGET_ADJ_ALLOW_RECAL');
3794 IF x_return_status = FND_API.G_RET_STS_ERROR THEN
3795 --julou amount validation failed, update status depending on recal
3796 IF p_called_from = 'R' THEN
3797 IF p_offer_rec.offer_type IN ('LUMPSUM', 'SCAN_DATA') THEN
3798 UPDATE ozf_offers
3799 SET status_code = 'PENDING_ACTIVE',
3800 status_date = SYSDATE,
3801 object_version_number = object_version_number + 1,
3802 user_status_id = OZF_Utility_PVT.get_default_user_status('OZF_OFFER_STATUS', 'PENDING_ACTIVE')
3803 WHERE qp_list_header_id = p_offer_rec.qp_list_header_id;
3804 ELSE
3805 UPDATE ozf_offers
3806 SET status_code = DECODE(l_recal, 'N', 'PENDING_ACTIVE', 'Y', 'DRAFT'),
3807 status_date = SYSDATE,
3808 object_version_number = object_version_number + 1,
3809 user_status_id = OZF_Utility_PVT.get_default_user_status('OZF_OFFER_STATUS', DECODE(l_recal, 'N', 'PENDING_ACTIVE', 'Y', 'DRAFT'))
3810 WHERE qp_list_header_id = p_offer_rec.qp_list_header_id;
3811 END IF;
3812 ELSE -- called from B/ set amount error and the caller takes care of status
3813 x_amount_error := 'Y';
3814 END IF; -- end called from 'R'
3815
3816 IF p_offer_rec.custom_setup_id = 110 THEN
3817 UPDATE ozf_approval_access
3818 SET action_code = NULL
3819 , action_date = NULL
3820 , action_performed_by = NULL
3821 , workflow_itemkey = NULL
3822 , approval_access_flag = 'Y'
3823 , object_version_number = object_version_number + 1
3824 , last_update_date = sysdate
3825 , last_updated_by = FND_GLOBAL.user_id
3826 WHERE approval_access_id IN
3827 (SELECT apr.approval_access_id
3828 FROM ozf_approval_access apr
3829 , ozf_request_headers_all_b req
3830 , jtf_rs_resource_extns jre
3831 WHERE req.request_header_id = apr.object_id
3832 AND apr.object_id = req.request_header_id
3833 AND req.offer_id = p_offer_rec.qp_list_header_id
3834 AND req.request_class = 'SOFT_FUND' -- or 'SPECIAL_PRICE'
3835 AND req.approved_by = jre.resource_id
3836 AND apr.action_performed_by = jre.user_id);
3837 END IF;
3838
3839 x_return_status := FND_API.G_RET_STS_SUCCESS;
3840 RETURN;-- validation fails, update to DRAFT or PENDING_ACTIVE and return(no posting)
3841
3842 ELSIF x_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
3843 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3844 ELSIF x_return_status = FND_API.G_RET_STS_SUCCESS THEN
3845 --julou validation passed, update offer to active and posting
3846
3847 -- Invoke Post_Lumpsum_Offer/Post_Scan_Data_Offer
3848 -- budget CP does not post lumpsum and scan data. Posting is done here for both R and B
3849 IF p_offer_rec.offer_type = 'LUMPSUM' THEN
3850 Post_Lumpsum_Offer(
3851 p_api_version => 1.0,
3852 p_init_msg_list => FND_API.G_FALSE,
3853 p_commit => FND_API.G_FALSE,
3854 p_offer_rec => p_offer_rec,
3855 x_return_status => x_return_status,
3856 x_msg_count => x_msg_count,
3857 x_msg_data => x_msg_data);
3858
3859 IF x_return_status = FND_API.G_RET_STS_ERROR THEN
3860 RAISE FND_API.G_EXC_ERROR;
3861 ELSIF x_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
3862 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3863 END IF;
3864 ELSIF p_offer_rec.offer_type = 'SCAN_DATA' THEN
3865 Post_Scan_Data_Offer(
3866 p_api_version => 1.0,
3867 p_init_msg_list => FND_API.G_FALSE,
3868 p_commit => FND_API.G_FALSE,
3869 p_offer_rec => p_offer_rec,
3870 x_return_status => x_return_status,
3871 x_msg_count => x_msg_count,
3872 x_msg_data => x_msg_data);
3873 IF x_return_status = FND_API.G_RET_STS_ERROR THEN
3874 RAISE FND_API.G_EXC_ERROR;
3875 ELSIF x_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
3876 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3877 END IF;
3878 END IF;
3879
3880 OPEN c_offer_start_date(p_offer_rec.qp_list_header_id);
3881 FETCH c_offer_start_date INTO l_start_date_q, l_start_date_o;
3882 CLOSE c_offer_start_date;
3883
3884 IF l_start_date_o IS NULL THEN
3885 l_start_date := GREATEST(NVL(l_start_date_q, SYSDATE), SYSDATE);
3886 ELSE
3887 l_start_date := l_start_date_o;
3888 END IF;
3889
3890 UPDATE ozf_offers
3891 SET status_code = 'ACTIVE',
3892 status_date = SYSDATE,
3893 object_version_number = object_version_number + 1,
3894 start_date = l_start_date,
3895 user_status_id = OZF_Utility_PVT.get_default_user_status('OZF_OFFER_STATUS', 'ACTIVE')
3896 WHERE qp_list_header_id = p_offer_rec.qp_list_header_id;
3897
3898 IF p_offer_rec.custom_setup_id = 110 THEN -- soft fund offers
3899 -- update ozf_request_headers_all_b update activating
3900 update_request_status (x_return_status => x_return_status,
3901 x_msg_count => x_msg_count,
3902 x_msg_data => x_msg_data,
3903 p_qp_list_header_id => p_offer_rec.qp_list_header_id);
3904 END IF;
3905
3906 ozf_utility_pvt.write_conc_log('p_offer_rec.custom_setup_id '||p_offer_rec.custom_setup_id);
3907 ozf_utility_pvt.write_conc_log('p_offer_rec.qp_list_header_id '||p_offer_rec.qp_list_header_id);
3908
3909
3910 IF p_offer_rec.custom_setup_id = 118 THEN -- SD offers
3911 -- update ozf_sd_request_headers_all_b update activating
3912 OPEN c_sd_req_header_rec(p_offer_rec.qp_list_header_id);
3913 FETCH c_sd_req_header_rec INTO l_obj_ver_num , l_sdr_req_header_id;
3914 CLOSE c_sd_req_header_rec;
3915
3916 ozf_utility_pvt.write_conc_log('l_obj_ver_num '||l_obj_ver_num);
3917 ozf_utility_pvt.write_conc_log('l_sdr_req_header_id '|| l_sdr_req_header_id);
3918
3919 --fix for bug 7004273
3920
3921 UPDATE ozf_sd_request_headers_all_b
3922 SET user_status_id = OZF_Utility_PVT.get_default_user_status('OZF_SD_REQUEST_STATUS', 'ACTIVE') ,
3923 object_version_number = l_obj_ver_num + 1
3924 WHERE request_header_id = l_sdr_req_header_id;
3925 END IF;
3926
3927 IF p_offer_rec.offer_type NOT IN('LUMPSUM', 'SCAN_DATA', 'NET_ACCRUAL') THEN
3928 UPDATE qp_list_headers_b
3929 SET active_flag = 'Y'
3930 WHERE list_header_id = p_offer_rec.qp_list_header_id;
3931
3932 UPDATE qp_qualifiers
3933 SET active_flag='Y'
3934 WHERE list_header_id = p_offer_rec.qp_list_header_id;
3935 /*
3936 IF p_offer_rec.offer_type = 'DEAL' THEN
3937 process_rltd_modifier_qual(
3938 p_init_msg_list => p_init_msg_list,
3939 p_commit => p_commit,
3940 p_list_header_id => p_offer_rec.qp_list_header_id,
3941 x_return_status => x_return_status,
3942 x_msg_count => x_msg_count,
3943 x_msg_data => x_msg_data);
3944 END IF;*/
3945 END IF;
3946
3947 -- Invoke Push_Target_Group if the offer is re-useable
3948 -- For Non-Reusable Offers Schedule activation should push the target group.
3949 IF p_offer_rec.reusable = 'Y' THEN
3950 Push_Target_group(
3951 p_api_version => 1.0,
3952 p_init_msg_list => FND_API.G_FALSE,
3953 p_commit => FND_API.g_false,
3954 p_offer_rec => p_offer_rec,
3955 x_return_status => x_return_status,
3956 x_msg_count => x_msg_count,
3957 x_msg_data => x_msg_data);
3958
3959 IF x_return_status = FND_API.G_RET_STS_ERROR THEN
3960 RAISE FND_API.G_EXC_ERROR;
3961 ELSIF x_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
3962 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3963 END IF;
3964 END IF;
3965 END IF;
3966 END IF;
3967
3968 debug_message('Calling Process Offer Activation');
3969 process_offer_activation
3970 (
3971 p_api_version_number => p_api_version
3972 , p_init_msg_list => p_init_msg_list
3973 , p_commit => p_commit
3974 , p_validation_level => FND_API.G_VALID_LEVEL_FULL
3975 , x_return_status => x_return_status
3976 , x_msg_count => x_msg_count
3977 , x_msg_data => x_msg_data
3978 , p_offer_rec => p_offer_rec
3979 );
3980
3981 -- RAISE FND_API.G_EXC_ERROR;
3982 IF x_return_status = FND_API.G_RET_STS_ERROR THEN
3983 RAISE FND_API.G_EXC_ERROR;
3984 ELSIF x_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
3985 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3986 END IF;
3987
3988
3989 FND_MSG_PUB.Count_And_Get
3990 (p_count => x_msg_count,
3991 p_data => x_msg_data,
3992 p_encoded => FND_API.G_FALSE
3993 );
3994
3995 EXCEPTION
3996 WHEN FND_API.G_EXC_ERROR THEN
3997 x_return_status := FND_API.g_ret_sts_error ;
3998 ROLLBACK TO activate_offer_over;
3999 FND_MSG_PUB.Count_AND_Get
4000 ( p_count => l_msg_count,
4001 p_data => l_msg_data,
4002 p_encoded => FND_API.G_FALSE
4003 );
4004 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
4005 x_return_status := FND_API.g_ret_sts_unexp_error ;
4006 ROLLBACK TO activate_offer_over;
4007 FND_MSG_PUB.Count_AND_Get
4008 ( p_count => l_msg_count,
4009 p_data => l_msg_data,
4010 p_encoded => FND_API.G_FALSE
4011 );
4012 WHEN OTHERS THEN
4013 x_return_status := FND_API.g_ret_sts_unexp_error ;
4014 ROLLBACK TO activate_offer_over;
4015 IF FND_MSG_PUB.Check_Msg_Level ( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
4016 FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME,l_api_name);
4017 END IF;
4018 FND_MSG_PUB.Count_AND_Get
4019 ( p_count => l_msg_count,
4020 p_data => l_msg_data,
4021 p_encoded => FND_API.G_FALSE
4022 );
4023 END Activate_Offer_Over;
4024
4025
4026 PROCEDURE offer_dates(
4027 p_modifier_list_rec IN modifier_list_rec_type
4028 ,x_return_status OUT NOCOPY VARCHAR2
4029 ,x_msg_count OUT NOCOPY NUMBER
4030 ,x_msg_data OUT NOCOPY VARCHAR2
4031 )IS
4032
4033 l_api_version CONSTANT NUMBER := 1.0;
4034 l_api_name CONSTANT VARCHAR2(30) := 'offer_dates';
4035 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
4036
4037 l_qualifier_tbl qualifiers_tbl_type;
4038 l_error_location NUMBER := 0;
4039 i NUMBER := 1;
4040 l_ord_id NUMBER := 0;
4041 l_ship_id NUMBER := 0;
4042
4043 CURSOR c_qualifier_id(l_list_header_id NUMBER) IS
4044 SELECT qualifier_id , qualifier_context , qualifier_attribute
4045 FROM qp_qualifiers
4046 WHERE list_header_id = l_list_header_id
4047 AND qualifier_context = 'ORDER'
4048 AND qualifier_attribute in ('QUALIFIER_ATTRIBUTE1','QUALIFIER_ATTRIBUTE8');
4049
4050 x_qualifiers_tbl qp_qualifier_rules_pub.qualifiers_tbl_type;
4051
4052 BEGIN
4053
4054 ----------- initialize -------------
4055 SAVEPOINT offer_dates;
4056
4057 x_return_status := Fnd_Api.g_ret_sts_success;
4058
4059 FOR c1_rec IN c_qualifier_id(p_modifier_list_rec.qp_list_header_id) LOOP
4060 IF c1_rec.qualifier_attribute = 'QUALIFIER_ATTRIBUTE1'
4061 THEN l_ord_id := c1_rec.qualifier_id ;
4062 ELSIF c1_rec.qualifier_attribute = 'QUALIFIER_ATTRIBUTE8'
4063 THEN l_ship_id := c1_rec.qualifier_id ;
4064 END IF;
4065 END LOOP;
4066
4067 /*
4068 The logic of the operator is as
4069 if both start date and end date are entered then the operator is 'BETWEEN' else the operator is '='
4070 */
4071 -- Order Date
4072 IF (NOT
4073 (l_ord_id = 0 AND
4074 (p_modifier_list_rec.start_date_active_first IS NULL OR p_modifier_list_rec.start_date_active_first = Fnd_Api.g_miss_date
4075 )
4076 AND
4077 (p_modifier_list_rec.end_date_active_first IS NULL OR p_modifier_list_rec.end_date_active_first = Fnd_Api.g_miss_date
4078 )
4079 )
4080 )
4081 THEN
4082 IF p_modifier_list_rec.start_date_active_first <> fnd_api.g_miss_date THEN
4083 l_qualifier_tbl(i).qualifier_context :='ORDER';
4084 l_qualifier_tbl(i).qualifier_attribute := 'QUALIFIER_ATTRIBUTE1';
4085 l_qualifier_tbl(i).qualifier_attr_value := to_char(p_modifier_list_rec.start_date_active_first,'YYYY/MM/DD HH:MI:SS');
4086 l_qualifier_tbl(i).qualifier_attr_value_to := to_char(p_modifier_list_rec.end_date_active_first,'YYYY/MM/DD HH:MI:SS');
4087 l_qualifier_tbl(i).comparison_operator_code := '=';
4088 IF(p_modifier_list_rec.start_date_active_first IS NOT NULL AND p_modifier_list_rec.end_date_active_first IS NOT NULL ) THEN
4089 l_qualifier_tbl(i).comparison_operator_code := 'BETWEEN';
4090 END IF;
4091
4092 l_qualifier_tbl(i).qualifier_grouping_no := -100;
4093 -- rssharma Changed Grouping Number from 10 to -1
4094
4095 IF l_ord_id <> 0 AND (p_modifier_list_rec.start_date_active_first IS NULL AND p_modifier_list_rec.end_date_active_first IS NULL )
4096 THEN
4097 l_qualifier_tbl(i).operation :='DELETE';
4098 l_qualifier_tbl(i).qualifier_id := l_ord_id;
4099 ELSIF l_ord_id <> 0 THEN
4100 l_qualifier_tbl(i).operation :='UPDATE';
4101 l_qualifier_tbl(i).qualifier_id := l_ord_id;
4102 ELSE
4103 l_qualifier_tbl(i).operation :='CREATE';
4104 END IF;
4105 l_qualifier_tbl(i).list_header_id := p_modifier_list_rec.qp_list_header_id;
4106 i := i+1;
4107 END IF;
4108 -- End Order Date
4109 -- Ship Date
4110 END IF;
4111
4112 /*
4113 The logic of the operator is as
4114 if both start date and end date are entered then the operator is 'BETWEEN' else the operator is '='
4115 */
4116 IF (
4117 NOT(
4118 l_ship_id = 0
4119 AND
4120 (p_modifier_list_rec.start_date_active_second IS NULL OR p_modifier_list_rec.start_date_active_second = Fnd_Api.g_miss_date )
4121 AND
4122 (p_modifier_list_rec.end_date_active_second IS NULL OR p_modifier_list_rec.end_date_active_second = Fnd_Api.g_miss_date )
4123 )
4124 ) THEN
4125 IF p_modifier_list_rec.start_date_active_second <> fnd_api.g_miss_date THEN
4126 l_qualifier_tbl(i).qualifier_context :='ORDER';
4127 l_qualifier_tbl(i).qualifier_attribute := 'QUALIFIER_ATTRIBUTE8';
4128 l_qualifier_tbl(i).qualifier_attr_value := to_char(p_modifier_list_rec.start_date_active_second,'YYYY/MM/DD HH:MI:SS');
4129 l_qualifier_tbl(i).qualifier_attr_value_to := to_char(p_modifier_list_rec.end_date_active_second,'YYYY/MM/DD HH:MI:SS');
4130 l_qualifier_tbl(i).comparison_operator_code := '=';
4131 IF(p_modifier_list_rec.start_date_active_second IS NOT NULL AND p_modifier_list_rec.end_date_active_second IS NOT NULL ) THEN
4132 l_qualifier_tbl(i).comparison_operator_code := 'BETWEEN';
4133 END IF;
4134 l_qualifier_tbl(i).qualifier_grouping_no := -200;
4135 -- rssharma Changed grouping Number to -1 from 10
4136
4137 IF l_ship_id <> 0 AND (p_modifier_list_rec.start_date_active_second IS NULL AND p_modifier_list_rec.end_date_active_second is NULL)
4138 THEN
4139 l_qualifier_tbl(i).operation :='DELETE';
4140 l_qualifier_tbl(i).qualifier_id := l_ship_id;
4141 ELSIF l_ship_id <> 0 THEN
4142 l_qualifier_tbl(i).operation :='UPDATE';
4143 l_qualifier_tbl(i).qualifier_id := l_ship_id;
4144 ELSE
4145 l_qualifier_tbl(i).operation :='CREATE';
4146 END IF;
4147
4148 l_qualifier_tbl(i).list_header_id := p_modifier_list_rec.qp_list_header_id;
4149 i := i+1;
4150 END IF;
4151
4152 END IF;
4153 -- End Ship date
4154
4155 process_market_qualifiers
4156 (
4157 p_api_version => 1.0,
4158 p_init_msg_list => Fnd_Api.g_false,
4159 p_commit => Fnd_Api.g_false,
4160 x_return_status => x_return_status ,
4161 x_msg_count => x_msg_count,
4162 x_msg_data => x_msg_data,
4163 p_qualifiers_tbl => l_qualifier_tbl,
4164 x_error_location => l_error_location,
4165 x_qualifiers_tbl => x_qualifiers_tbl
4166 );
4167 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
4168 RAISE Fnd_Api.g_exc_error;
4169 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
4170 RAISE Fnd_Api.g_exc_unexpected_error;
4171 END IF;
4172
4173 Fnd_Msg_Pub.Count_AND_Get
4174 ( p_count => x_msg_count,
4175 p_data => x_msg_data,
4176 p_encoded => Fnd_Api.G_FALSE
4177 );
4178
4179 EXCEPTION
4180 WHEN Fnd_Api.G_EXC_ERROR THEN
4181 x_return_status := Fnd_Api.g_ret_sts_error ;
4182 ROLLBACK TO offer_dates;
4183 Fnd_Msg_Pub.Count_AND_Get
4184 ( p_count => x_msg_count,
4185 p_data => x_msg_data,
4186 p_encoded => Fnd_Api.G_FALSE
4187 );
4188 WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
4189 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
4190 ROLLBACK TO offer_dates;
4191 Fnd_Msg_Pub.Count_AND_Get
4192 ( p_count => x_msg_count,
4193 p_data => x_msg_data,
4194 p_encoded => Fnd_Api.G_FALSE
4195 );
4196 WHEN OTHERS THEN
4197 x_return_status := Fnd_Api.g_ret_sts_unexp_erroR ;
4198 ROLLBACK TO offer_dates;
4199 IF Fnd_Msg_Pub.Check_Msg_Level ( Fnd_Msg_Pub.G_MSG_LVL_UNEXP_ERROR )
4200 THEN
4201 Fnd_Msg_Pub.Add_Exc_Msg( G_PKG_NAME,l_api_name);
4202 END IF;
4203 Fnd_Msg_Pub.Count_AND_Get
4204 ( p_count => x_msg_count,
4205 p_data => x_msg_data,
4206 p_encoded => Fnd_Api.G_FALSE
4207 );
4208 END offer_dates;
4209
4210
4211
4212 PROCEDURE process_qp_list_header(
4213 p_init_msg_list IN VARCHAR2
4214 ,p_api_version IN NUMBER
4215 ,x_return_status OUT NOCOPY VARCHAR2
4216 ,x_msg_count OUT NOCOPY NUMBER
4217 ,x_msg_data OUT NOCOPY VARCHAR2
4218 ,p_modifier_list_rec IN modifier_list_rec_type
4219 ,x_modifier_list_rec OUT NOCOPY modifier_list_rec_type
4220 ,p_old_status_id IN NUMBER
4221 ,p_approval_type IN VARCHAR2
4222 ,p_new_status_code IN VARCHAR2
4223 ) IS
4224 l_api_version CONSTANT NUMBER := 1.0;
4225 l_api_name CONSTANT VARCHAR2(30) := 'process_qp_list_header';
4226 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
4227
4228 l_modifier_list_rec Qp_Modifiers_Pub.modifier_list_rec_type;
4229 v_modifier_list_rec qp_modifiers_pub.modifier_list_rec_type;
4230
4231 v_modifier_list_val_rec qp_modifiers_pub.modifier_list_val_rec_type;
4232 v_modifiers_tbl qp_modifiers_pub.modifiers_tbl_type;
4233 v_modifiers_val_tbl qp_modifiers_pub.modifiers_val_tbl_type;
4234 v_qualifiers_tbl qp_qualifier_rules_pub.qualifiers_tbl_type;
4235 v_qualifiers_val_tbl qp_qualifier_rules_pub.qualifiers_val_tbl_type;
4236 v_pricing_attr_tbl qp_modifiers_pub.pricing_attr_tbl_type;
4237 v_pricing_attr_val_tbl qp_modifiers_pub.pricing_attr_val_tbl_type;
4238
4239 l_limits_rec QP_Limits_PUB.Limits_Rec_Type;
4240 temp_limits_rec QP_Limits_PUB.Limits_Rec_Type;
4241 v_limits_rec QP_Limits_PUB.Limits_Rec_Type;
4242 v_limits_val_rec QP_Limits_PUB.Limits_Val_Rec_Type;
4243 v_limit_attrs_tbl QP_Limits_PUB.Limit_Attrs_Tbl_Type;
4244 v_limit_attrs_val_tbl QP_Limits_PUB.Limit_Attrs_Val_Tbl_Type;
4245 v_limit_balances_tbl QP_Limits_PUB.Limit_Balances_Tbl_Type;
4246 v_limit_balances_val_tbl QP_Limits_PUB.Limit_Balances_Val_Tbl_Type;
4247
4248 l_uk_flag VARCHAR2(1);
4249
4250
4251 BEGIN
4252 SAVEPOINT process_qp_list_header;
4253 --dbms_output.put_line('calling qp procedure');
4254
4255 x_return_status := Fnd_Api.g_ret_sts_success;
4256
4257
4258 l_modifier_list_rec.operation := p_modifier_list_rec.modifier_operation;
4259 l_modifier_list_rec.list_header_id := p_modifier_list_rec.qp_list_header_id ;
4260 l_modifier_list_rec.list_type_code := 'PRO';
4261 l_modifier_list_rec.source_system_code := FND_PROFILE.VALUE('QP_SOURCE_SYSTEM_CODE');
4262 l_modifier_list_rec.description := p_modifier_list_rec.description;
4263 l_modifier_list_rec.comments := p_modifier_list_rec.comments;
4264 l_modifier_list_rec.currency_code := p_modifier_list_rec.currency_code;
4265 l_modifier_list_rec.start_date_active := trunc(p_modifier_list_rec.start_date_active);
4266 l_modifier_list_rec.end_date_active := trunc(p_modifier_list_rec.end_date_active);
4267 l_modifier_list_rec.automatic_flag := 'Y';
4268 -- 15-Nov-2002 rssharma added FlexFields
4269 l_modifier_list_rec.ask_for_flag := p_modifier_list_rec.ask_for_flag;
4270 l_modifier_list_rec.attribute1 := p_modifier_list_rec.attribute1;
4271 l_modifier_list_rec.attribute2 := p_modifier_list_rec.attribute2;
4272 l_modifier_list_rec.attribute3 := p_modifier_list_rec.attribute3;
4273 l_modifier_list_rec.attribute4 := p_modifier_list_rec.attribute4;
4274 l_modifier_list_rec.attribute5 := p_modifier_list_rec.attribute5;
4275 l_modifier_list_rec.attribute6 := p_modifier_list_rec.attribute6;
4276 l_modifier_list_rec.attribute7 := p_modifier_list_rec.attribute7;
4277 l_modifier_list_rec.attribute8 := p_modifier_list_rec.attribute8;
4278 l_modifier_list_rec.attribute9 := p_modifier_list_rec.attribute9;
4279 l_modifier_list_rec.attribute10 := p_modifier_list_rec.attribute10;
4280 l_modifier_list_rec.attribute11 := p_modifier_list_rec.attribute11;
4281 l_modifier_list_rec.attribute12 := p_modifier_list_rec.attribute12;
4282 l_modifier_list_rec.attribute13 := p_modifier_list_rec.attribute13;
4283 l_modifier_list_rec.attribute14 := p_modifier_list_rec.attribute14;
4284 l_modifier_list_rec.attribute15 := p_modifier_list_rec.attribute15;
4285 l_modifier_list_rec.context := p_modifier_list_rec.context;
4286 l_modifier_list_rec.global_flag := p_modifier_list_rec.global_flag;
4287 l_modifier_list_rec.org_id := p_modifier_list_rec.orig_org_id;
4288
4289 -- end change 15-Nov-2002
4290 IF p_modifier_list_rec.offer_code <> Fnd_Api.g_miss_char THEN
4291 l_modifier_list_rec.name := p_modifier_list_rec.offer_code;
4292 END IF;
4293
4294 IF p_modifier_list_rec.offer_operation IS NOT NULL AND p_modifier_list_rec.offer_operation <> FND_API.G_MISS_CHAR THEN
4295 IF p_modifier_list_rec.modifier_operation = 'CREATE' THEN
4296 l_modifier_list_rec.active_flag := 'N';
4297 ELSIF p_modifier_list_rec.modifier_operation = 'UPDATE' THEN
4298 IF (p_modifier_list_rec.user_status_id <> FND_API.g_miss_num)
4299 AND (p_modifier_list_rec.user_status_id <> p_old_status_id) THEN
4300 IF p_new_status_code = 'ACTIVE' THEN
4301 IF p_approval_type is NULL AND p_modifier_list_rec.offer_type NOT IN ('LUMPSUM', 'SCAN_DATA') THEN
4302 l_modifier_list_rec.active_flag := 'Y';
4303 debug_message('Calling activate');
4304 process_offer_activation
4305 (
4306 p_api_version_number => p_api_version
4307 , p_init_msg_list => p_init_msg_list
4308 , p_commit => FND_API.g_false
4309 , p_validation_level => FND_API.G_VALID_LEVEL_FULL
4310 , x_return_status => x_return_status
4311 , x_msg_count => x_msg_count
4312 , x_msg_data => x_msg_data
4313 , p_offer_rec => p_modifier_list_rec
4314 );
4315 IF x_return_status = FND_API.G_RET_STS_ERROR THEN
4316 RAISE FND_API.G_EXC_ERROR;
4317 ELSIF x_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
4318 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4319 END IF;
4320
4321 END IF;
4322 ELSE
4323 l_modifier_list_rec.active_flag := 'N';
4324 END IF;
4325 END IF;
4326 END IF;
4327 ELSE
4328 IF p_modifier_list_rec.active_flag = FND_API.G_MISS_CHAR OR p_modifier_list_rec.active_flag IS NULL THEN
4329 l_modifier_list_rec.active_flag := 'N';
4330 ELSE
4331 l_modifier_list_rec.active_flag := p_modifier_list_rec.active_flag;
4332 END IF;
4333 END IF;
4334
4335 IF p_modifier_list_rec.start_date_active_first <> Fnd_Api.g_miss_date OR p_modifier_list_rec.end_date_active_first <> Fnd_Api.g_miss_date THEN
4336 l_modifier_list_rec.active_date_first_type := 'ORD';
4337 END IF;
4338
4339 IF p_modifier_list_rec.start_date_active_second <> Fnd_Api.g_miss_date OR p_modifier_list_rec.end_date_active_second <> Fnd_Api.g_miss_date THEN
4340 l_modifier_list_rec.active_date_second_type := 'SHIP';
4341 END IF;
4342
4343 IF p_modifier_list_rec.start_date_active_second IS NULL AND p_modifier_list_rec.end_date_active_second IS NULL THEN
4344 l_modifier_list_rec.active_date_second_type := NULL;
4345 END IF;
4346
4347 IF p_modifier_list_rec.start_date_active_first IS NULL AND p_modifier_list_rec.end_date_active_first IS NULL THEN
4348 l_modifier_list_rec.active_date_first_type := NULL;
4349 END IF;
4350
4351 l_modifier_list_rec.start_date_active_first := p_modifier_list_rec.start_date_active_first;
4352 l_modifier_list_rec.end_date_active_first := p_modifier_list_rec.end_date_active_first;
4353
4354 l_modifier_list_rec.start_date_active_second := p_modifier_list_rec.start_date_active_second;
4355 l_modifier_list_rec.end_date_active_second := p_modifier_list_rec.end_date_active_second;
4356
4357 IF p_modifier_list_rec.modifier_operation = 'CREATE' THEN
4358 IF p_modifier_list_rec.offer_code = Fnd_Api.g_miss_char or p_modifier_list_rec.offer_code IS NULL THEN
4359 l_modifier_list_rec.name := Ams_Sourcecode_Pvt.get_new_source_code (
4360 p_object_type => 'OFFR',
4361 p_custsetup_id => p_modifier_list_rec.custom_setup_id,
4362 p_global_flag => Fnd_Api.g_false
4363 );
4364 ELSE
4365 l_modifier_list_rec.name := p_modifier_list_rec.offer_code;
4366
4367 l_uk_flag := OZF_Utility_PVT.check_uniqueness('AMS_SOURCE_CODES','source_code = ''' || p_modifier_list_rec.offer_code || '''');
4368
4369 IF l_uk_flag = Fnd_Api.g_false THEN
4370 IF Fnd_Msg_Pub.check_msg_level(Fnd_Msg_Pub.g_msg_lvl_error) THEN
4371 Fnd_Message.set_name('OZF', 'OZF_ACT_OFFER_DUP_OFFER_CODE');
4372 Fnd_Msg_Pub.ADD;
4373 END IF;
4374 END IF;
4375 END IF;
4376 END IF;
4377
4378 /**
4379 In case of lumpsum and scandata Offers the OrgID field appears in the UI, irrespective of the security profile since
4380 they are always local. The org_id is actually stored in ozf_offers, in this case.
4381 This code only makes sure that if the profile is OFF then the global flag is Y., to get rid of qp_list_header creation errors
4382 */
4383 IF NVL(fnd_profile.value('QP_SECURITY_CONTROL'), 'OFF') = 'OFF' THEN
4384 l_modifier_list_rec.global_flag := 'Y';
4385 l_modifier_list_rec.org_id := NULL;
4386 END IF;
4387
4388 --dbms_output.put_line('calling qp procedure');
4389 Qp_Modifiers_Pub.process_modifiers(
4390 p_api_version_number => 1.0,
4391 p_init_msg_list => FND_API.G_FALSE,
4392 p_return_values => Fnd_Api.G_FALSE,
4393 x_return_status => x_return_status,
4394 x_msg_count => x_msg_count,
4395 x_msg_data => x_msg_data,
4396 p_modifier_list_rec => l_modifier_list_rec,
4397 x_modifier_list_rec => v_modifier_list_rec,
4398 x_modifier_list_val_rec => v_modifier_list_val_rec,
4399 x_modifiers_tbl => v_modifiers_tbl,
4400 x_modifiers_val_tbl => v_modifiers_val_tbl,
4401 x_qualifiers_tbl => v_qualifiers_tbl,
4402 x_qualifiers_val_tbl => v_qualifiers_val_tbl,
4403 x_pricing_attr_tbl => v_pricing_attr_tbl,
4404 x_pricing_attr_val_tbl => v_pricing_attr_val_tbl
4405 );
4406
4407 --dbms_output.put_line('Return status1 is :'||x_return_status);
4408 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
4409 add_message(x_msg_count);
4410 RAISE Fnd_Api.g_exc_error;
4411 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
4412 add_message(x_msg_count);
4413 RAISE Fnd_Api.g_exc_unexpected_error;
4414 END IF;
4415 x_modifier_list_rec.qp_list_header_id := v_modifier_list_rec.list_header_id;
4416 x_modifier_list_rec.name := v_modifier_list_rec.name;
4417
4418
4419
4420 -- Start of Offers Limit functionality. Need to set INSERT, UPDATE and DELETE for limits
4421 -- if profile OZF_BUDGET_ADJ_ALLOW_RECAL is 'Y' AND CommittedAmountEqMax flag is Y OR profile OZF_BUDGET_ADJ_ALLOW_RECAL is 'N'
4422 /*
4423 IF (p_modifier_list_rec.offer_amount <> fnd_api.g_miss_num
4424 AND p_modifier_list_rec.offer_amount is not null
4425 )
4426 OR (--p_modifier_list_rec.amount_limit_id = fnd_api.g_miss_num
4427 AND p_modifier_list_rec.offer_amount <> fnd_api.g_miss_num
4428 AND p_modifier_list_rec.offer_amount is not null
4429 )
4430 THEN
4431 */
4432 --RSSHARMA Commented out the above if as if clashes with the if for delete operation ..
4433 --this introduced a bug due to which the limit will neve be deleted as this if clashed with the if for delete
4434 IF p_modifier_list_rec.modifier_operation IN ('UPDATE','DELETE') THEN
4435 l_limits_rec.list_header_id := p_modifier_list_rec.qp_list_header_id;
4436 ELSIF p_modifier_list_rec.modifier_operation = 'CREATE' THEN
4437 l_limits_rec.list_header_id := v_modifier_list_rec.list_header_id;
4438 END IF;
4439
4440 IF p_modifier_list_rec.amount_limit_id = fnd_api.g_miss_num
4441 AND p_modifier_list_rec.offer_amount <> fnd_api.g_miss_num
4442 AND p_modifier_list_rec.offer_amount is not null THEN
4443 IF ( p_modifier_list_rec.committed_amount_eq_max = 'Y')-- deal in limits only if the recal profile is off or the profile is on and the flag is Yes
4444 THEN
4445 l_limits_rec.operation := 'CREATE';
4446 l_limits_rec.basis := 'COST' ;
4447 --- When OM starts supporting HARD Need to change it to HARD.
4448 --l_limits_rec.limit_exceed_action_code := 'SOFT' ;
4449 l_limits_rec.limit_hold_flag := 'Y' ;
4450 l_limits_rec.limit_id := fnd_api.g_miss_num;
4451 l_limits_rec.limit_level_code :='ACROSS_TRANSACTION';
4452 l_limits_rec.limit_number := 1;
4453 l_limits_rec.organization_flag := 'N' ;
4454 l_limits_rec.amount := p_modifier_list_rec.offer_amount;
4455 END IF;
4456 ELSIF (p_modifier_list_rec.amount_limit_id <> fnd_api.g_miss_num AND p_modifier_list_rec.amount_limit_id IS NOT NULL) THEN
4457 IF p_modifier_list_rec.offer_amount IS NULL OR -- if committed=max is no or Committed Amount is null delete the limit
4458 (p_modifier_list_rec.committed_amount_eq_max = 'N')
4459 THEN
4460 l_limits_rec.operation := 'DELETE';
4461 l_limits_rec.limit_id := p_modifier_list_rec.amount_limit_id;
4462 ELSIF p_modifier_list_rec.offer_amount IS NOT NULL THEN
4463 IF (p_modifier_list_rec.committed_amount_eq_max = 'Y' )
4464 THEN
4465 l_limits_rec.operation := 'UPDATE';
4466 l_limits_rec.limit_id := p_modifier_list_rec.amount_limit_id;
4467 l_limits_rec.amount := p_modifier_list_rec.offer_amount;
4468 END IF;
4469 END IF;
4470 END IF;
4471
4472
4473 QP_Limits_PUB.Process_Limits
4474 ( p_init_msg_list => FND_API.g_true,
4475 p_api_version_number => 1.0,
4476 p_commit => FND_API.g_false,
4477 x_return_status => x_return_status,
4478 x_msg_count => x_msg_count,
4479 x_msg_data => x_msg_data,
4480 p_LIMITS_rec => l_limits_rec,
4481 x_LIMITS_rec => v_LIMITS_rec,
4482 x_LIMITS_val_rec => v_LIMITS_val_rec,
4483 x_LIMIT_ATTRS_tbl => v_LIMIT_ATTRS_tbl,
4484 x_LIMIT_ATTRS_val_tbl => v_LIMIT_ATTRS_val_tbl,
4485 x_LIMIT_BALANCES_tbl => v_LIMIT_BALANCES_tbl,
4486 x_LIMIT_BALANCES_val_tbl => v_LIMIT_BALANCES_val_tbl
4487 );
4488
4489
4490 -- RAISE Fnd_Api.g_exc_error;
4491 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
4492 add_message(x_msg_count);
4493 RAISE Fnd_Api.g_exc_error;
4494 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
4495 add_message(x_msg_count);
4496 RAISE Fnd_Api.g_exc_unexpected_error;
4497 END IF;
4498
4499 --END IF;
4500 --END IF; -- END OZF_BUDGET_ADJ_ALLOW_RECAL profile if
4501 l_limits_rec := temp_limits_rec;
4502
4503 IF (p_modifier_list_rec.max_no_of_uses <> fnd_api.g_miss_num
4504 AND p_modifier_list_rec.max_no_of_uses is not null
4505 )
4506 OR (p_modifier_list_rec.uses_limit_id = fnd_api.g_miss_num
4507 AND p_modifier_list_rec.max_no_of_uses <> fnd_api.g_miss_num
4508 AND p_modifier_list_rec.max_no_of_uses is not null
4509 )
4510 THEN
4511
4512 IF p_modifier_list_rec.modifier_operation IN ('UPDATE','DELETE') THEN
4513 l_limits_rec.list_header_id := p_modifier_list_rec.qp_list_header_id;
4514 ELSIF p_modifier_list_rec.modifier_operation = 'CREATE' THEN
4515 l_limits_rec.list_header_id := v_modifier_list_rec.list_header_id;
4516 END IF;
4517
4518 IF p_modifier_list_rec.uses_limit_id = fnd_api.g_miss_num
4519 AND p_modifier_list_rec.max_no_of_uses <> fnd_api.g_miss_num
4520 AND p_modifier_list_rec.max_no_of_uses is not null THEN
4521 l_limits_rec.operation := 'CREATE';
4522 l_limits_rec.basis := 'USAGE' ;
4523 --- When OM starts supporting HARD Need to change it to HARD.
4524 --l_limits_rec.limit_exceed_action_code := 'SOFT' ;
4525 l_limits_rec.limit_hold_flag := 'Y' ;
4526 l_limits_rec.limit_id := fnd_api.g_miss_num;
4527 l_limits_rec.limit_level_code :='ACROSS_TRANSACTION';
4528 l_limits_rec.limit_number := 1;
4529 l_limits_rec.organization_flag := 'N' ;
4530 l_limits_rec.amount := p_modifier_list_rec.max_no_of_uses;
4531 l_limits_rec.multival_attr1_type := 'QUALIFIER';
4532 l_limits_rec.multival_attr1_context := 'CUSTOMER';
4533 l_limits_rec.multival_attribute1 := 'QUALIFIER_ATTRIBUTE2';
4534
4535 ELSIF (p_modifier_list_rec.uses_limit_id <> fnd_api.g_miss_num AND p_modifier_list_rec.uses_limit_id IS NOT NULL) THEN
4536 IF p_modifier_list_rec.max_no_of_uses IS NULL THEN
4537 l_limits_rec.operation := 'DELETE';
4538 l_limits_rec.limit_id := p_modifier_list_rec.uses_limit_id;
4539 ELSIF p_modifier_list_rec.max_no_of_uses IS NOT NULL THEN
4540 l_limits_rec.operation := 'UPDATE';
4541 l_limits_rec.limit_id := p_modifier_list_rec.uses_limit_id;
4542 l_limits_rec.amount := p_modifier_list_rec.max_no_of_uses;
4543 END IF;
4544 END IF;
4545
4546 QP_Limits_PUB.Process_Limits
4547 ( p_init_msg_list => FND_API.g_true,
4548 p_api_version_number => 1.0,
4549 p_commit => FND_API.g_false,
4550 x_return_status => x_return_status,
4551 x_msg_count => x_msg_count,
4552 x_msg_data => x_msg_data,
4553 p_LIMITS_rec => l_limits_rec,
4554 x_LIMITS_rec => v_LIMITS_rec,
4555 x_LIMITS_val_rec => v_LIMITS_val_rec,
4556 x_LIMIT_ATTRS_tbl => v_LIMIT_ATTRS_tbl,
4557 x_LIMIT_ATTRS_val_tbl => v_LIMIT_ATTRS_val_tbl,
4558 x_LIMIT_BALANCES_tbl => v_LIMIT_BALANCES_tbl,
4559 x_LIMIT_BALANCES_val_tbl => v_LIMIT_BALANCES_val_tbl
4560 );
4561
4562
4563 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
4564 add_message(x_msg_count);
4565 RAISE Fnd_Api.g_exc_error;
4566 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
4567 add_message(x_msg_count);
4568 RAISE Fnd_Api.g_exc_unexpected_error;
4569 END IF;
4570
4571 END IF;
4572
4573 Fnd_Msg_Pub.Count_AND_Get
4574 ( p_count => x_msg_count,
4575 p_data => x_msg_data,
4576 p_encoded => Fnd_Api.G_FALSE
4577 );
4578 EXCEPTION
4579 WHEN Fnd_Api.G_EXC_ERROR THEN
4580 x_return_status := Fnd_Api.g_ret_sts_error ;
4581 ROLLBACK TO process_qp_list_header;
4582 Fnd_Msg_Pub.Count_AND_Get
4583 ( p_count => x_msg_count,
4584 p_data => x_msg_data,
4585 p_encoded => Fnd_Api.G_FALSE
4586 );
4587 WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
4588 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
4589 ROLLBACK TO process_qp_list_header;
4590 Fnd_Msg_Pub.Count_AND_Get
4591 ( p_count => x_msg_count,
4592 p_data => x_msg_data,
4593 p_encoded => Fnd_Api.G_FALSE
4594 );
4595 WHEN OTHERS THEN
4596 x_return_status := Fnd_Api.g_ret_sts_unexp_erroR ;
4597 ROLLBACK TO process_qp_list_header;
4598 IF Fnd_Msg_Pub.Check_Msg_Level ( Fnd_Msg_Pub.G_MSG_LVL_UNEXP_ERROR )
4599 THEN
4600 Fnd_Msg_Pub.Add_Exc_Msg( G_PKG_NAME,l_api_name);
4601 END IF;
4602 Fnd_Msg_Pub.Count_AND_Get
4603 ( p_count => x_msg_count,
4604 p_data => x_msg_data,
4605 p_encoded => Fnd_Api.G_FALSE
4606 );
4607 END;
4608
4609 PROCEDURE validateOzfOffer
4610 (
4611 x_return_status OUT NOCOPY VARCHAR2
4612 ,x_msg_count OUT NOCOPY NUMBER
4613 ,x_msg_data OUT NOCOPY VARCHAR2
4614 ,p_modifier_list_rec IN modifier_list_rec_type
4615 )
4616 IS
4617 BEGIN
4618 x_return_status := FND_API.G_RET_STS_SUCCESS;
4619 IF (p_modifier_list_rec.offer_type = 'LUMPSUM' OR p_modifier_list_rec.offer_type = 'SCAN_DATA' ) THEN
4620 IF p_modifier_list_rec.offer_operation = 'CREATE' THEN
4621 IF (p_modifier_list_rec.currency_code IS NULL OR p_modifier_list_rec.currency_code = FND_API.G_MISS_CHAR) THEN
4622 OZF_Utility_PVT.error_message('OZF_OFFR_LS_SD_CURR_REQD');
4623 x_return_status := Fnd_Api.g_ret_sts_error;
4624 RETURN;
4625 END IF;
4626 ELSIF p_modifier_list_rec.offer_operation = 'UPDATE' THEN
4627 IF (p_modifier_list_rec.currency_code IS NULL) THEN
4628 OZF_Utility_PVT.error_message('OZF_OFFR_LS_SD_CURR_REQD');
4629 x_return_status := Fnd_Api.g_ret_sts_error;
4630 RETURN;
4631 END IF;
4632 END IF;
4633 END IF;
4634 END validateOzfOffer;
4635
4636 PROCEDURE process_ozf_offer(
4637 p_init_msg_list IN VARCHAR2
4638 ,p_api_version IN NUMBER
4639 ,x_return_status OUT NOCOPY VARCHAR2
4640 ,x_msg_count OUT NOCOPY NUMBER
4641 ,x_msg_data OUT NOCOPY VARCHAR2
4642 ,p_modifier_list_rec IN modifier_list_rec_type
4643 ,x_offer_id OUT NOCOPY NUMBER
4644 )
4645 IS
4646 CURSOR c_scan_value IS
4647 SELECT NVL(SUM(scan_value * scan_unit_forecast/quantity),0)
4648 FROM ams_act_products
4649 WHERE arc_act_product_used_by = 'OFFR'
4650 AND act_product_used_by_id = p_modifier_list_rec.qp_list_header_id;
4651
4652 CURSOR c_old_status IS
4653 SELECT status_code
4654 FROM ozf_offers
4655 WHERE qp_list_header_id = p_modifier_list_rec.qp_list_header_id;
4656
4657 l_promotional_offers_rec OZF_Promotional_Offers_Pvt.offers_rec_Type;
4658 l_object_version_number NUMBER;
4659 l_api_version CONSTANT NUMBER := 1.0;
4660 l_api_name CONSTANT VARCHAR2(30) := 'process_ozf_offer';
4661 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
4662 l_offer_id NUMBER;
4663 l_scan_value NUMBER;
4664 -- l_status_code VARCHAR2(30);
4665 l_old_status VARCHAR2(30);
4666
4667 BEGIN
4668 SAVEPOINT process_ozf_offer;
4669
4670 x_return_status := Fnd_Api.g_ret_sts_success;
4671
4672 validateOzfOffer
4673 (
4674 x_return_status => x_return_status
4675 ,x_msg_count => x_msg_count
4676 ,x_msg_data => x_msg_data
4677 ,p_modifier_list_rec => p_modifier_list_rec
4678 );
4679 IF x_return_status = FND_API.G_RET_STS_ERROR THEN
4680 RAISE FND_API.G_EXC_ERROR;
4681 ELSIF x_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
4682 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4683 END IF;
4684 OPEN c_scan_value;
4685 FETCH c_scan_value INTO l_scan_value;
4686 CLOSE c_scan_value;
4687
4688 OPEN c_old_status;
4689 FETCH c_old_status INTO l_old_status;
4690 CLOSE c_old_status;
4691 -- if DRAFT sync IEB and committed amount
4692 IF l_old_status = 'DRAFT' THEN
4693 IF p_modifier_list_rec.offer_type = 'SCAN_DATA' THEN
4694 IF p_modifier_list_rec.offer_amount IS NOT NULL
4695 AND p_modifier_list_rec.offer_amount <> FND_API.G_MISS_NUM THEN -- called by budget cue card
4696 IF p_modifier_list_rec.budget_amount_tc IS NOT NULL
4697 AND p_modifier_list_rec.budget_amount_tc <> FND_API.G_MISS_NUM THEN
4698 IF p_modifier_list_rec.budget_amount_tc >= l_scan_value THEN
4699 l_promotional_offers_rec.budget_amount_tc := p_modifier_list_rec.budget_amount_tc;
4700 ELSE
4701 FND_MESSAGE.SET_NAME('OZF','OZF_OFFR_IEB_LT_SCANVALUE');
4702 Fnd_Msg_Pub.ADD;
4703 RAISE FND_API.G_EXC_ERROR;
4704 END IF;
4705 END IF;
4706 ELSE -- called by offer detail
4707 --IF p_modifier_list_rec.budget_amount_tc IS NOT NULL
4708 --AND p_modifier_list_rec.budget_amount_tc <> FND_API.G_MISS_NUM THEN
4709 l_promotional_offers_rec.budget_amount_tc := p_modifier_list_rec.budget_amount_tc;
4710 --ELSE
4711 -- l_promotional_offers_rec.budget_amount_tc := 0;
4712 --END IF;
4713 END IF;
4714 l_promotional_offers_rec.offer_amount := NULL;
4715 ELSE
4716 IF p_modifier_list_rec.offer_amount IS NOT NULL
4717 AND p_modifier_list_rec.offer_amount <> FND_API.G_MISS_NUM
4718 THEN -- from detail, sync ieb with committed amount
4719 l_promotional_offers_rec.budget_amount_tc := p_modifier_list_rec.offer_amount;
4720 l_promotional_offers_rec.offer_amount := p_modifier_list_rec.offer_amount;
4721 ELSIF p_modifier_list_rec.budget_amount_tc IS NOT NULL
4722 AND p_modifier_list_rec.budget_amount_tc <> FND_API.G_MISS_NUM
4723 THEN -- from budget cue card, sync committed with ieb
4724 l_promotional_offers_rec.offer_amount := p_modifier_list_rec.budget_amount_tc;
4725 l_promotional_offers_rec.budget_amount_tc := p_modifier_list_rec.budget_amount_tc;
4726 END IF; -- both are no value, do nothing
4727 END IF;
4728 ELSE -- active, pending active etc, do not sync
4729 l_promotional_offers_rec.offer_amount := p_modifier_list_rec.offer_amount;
4730 l_promotional_offers_rec.budget_amount_tc := p_modifier_list_rec.budget_amount_tc;
4731 END IF;
4732
4733 IF l_promotional_offers_rec.budget_amount_tc < 0 THEN
4734 FND_MESSAGE.SET_NAME('OZF','OZF_OFFR_IEB_NEG');
4735 Fnd_Msg_Pub.ADD;
4736 RAISE FND_API.G_EXC_ERROR;
4737 END IF;
4738
4739 l_promotional_offers_rec.qp_list_header_id := p_modifier_list_rec.qp_list_header_id;
4740 l_promotional_offers_rec.custom_setup_id := p_modifier_list_rec.custom_setup_id;
4741 l_promotional_offers_rec.retroactive := p_modifier_list_rec.retroactive;
4742 l_promotional_offers_rec.volume_offer_type := p_modifier_list_rec.volume_offer_type;
4743 l_promotional_offers_rec.confidential_flag := p_modifier_list_rec.confidential_flag;
4744 l_promotional_offers_rec.budget_source_type := p_modifier_list_rec.budget_source_type;
4745 l_promotional_offers_rec.budget_source_id := p_modifier_list_rec.budget_source_id;
4746 l_promotional_offers_rec.source_from_parent := p_modifier_list_rec.source_from_parent;
4747 IF l_promotional_offers_rec.source_from_parent = 'Y' THEN
4748 l_promotional_offers_rec.budget_source_id := p_modifier_list_rec.offer_used_by_id;
4749 l_promotional_offers_rec.budget_source_type := 'CAMP';
4750 END IF;
4751 -- Right now Budget only support sourcing from the Parent Campaign
4752 -- IF l_promotional_offers_rec.budget_source_type = 'CAMP' THEN
4753 -- l_promotional_offers_rec.source_from_parent := 'Y';
4754 -- END IF;
4755 l_promotional_offers_rec.buyer_name := p_modifier_list_rec.buyer_name;
4756 IF p_modifier_list_rec.offer_operation = 'CREATE' THEN
4757 l_promotional_offers_rec.qp_list_header_id := p_modifier_list_rec.qp_list_header_id;
4758 l_promotional_offers_rec.offer_code := p_modifier_list_rec.offer_code;
4759 l_promotional_offers_rec.custom_setup_id := p_modifier_list_rec.custom_setup_id;
4760 l_promotional_offers_rec.order_value_discount_type := p_modifier_list_rec.order_value_discount_type;
4761 l_promotional_offers_rec.budget_offer_yn := p_modifier_list_rec.budget_offer_yn;
4762
4763 END IF;
4764
4765 IF p_modifier_list_rec.budget_source_id <> Fnd_Api.g_miss_num
4766 AND p_modifier_list_rec.budget_source_id IS NOT NULL THEN
4767 IF p_modifier_list_rec.offer_type <> 'SCAN_DATA' THEN
4768 l_promotional_offers_rec.budget_amount_tc := p_modifier_list_rec.offer_amount;
4769 END IF;
4770 END IF;
4771
4772 l_promotional_offers_rec.qualifier_type := p_modifier_list_rec.ql_qualifier_type;
4773 l_promotional_offers_rec.qualifier_id := p_modifier_list_rec.ql_qualifier_id;
4774 l_promotional_offers_rec.activity_media_id := p_modifier_list_rec.activity_media_id;
4775 l_promotional_offers_rec.user_status_id := p_modifier_list_rec.user_status_id;
4776 -- if the user_status_id is missing then make status_code code also missing
4777 IF l_promotional_offers_rec.user_status_id = FND_API.g_miss_num THEN
4778 l_promotional_offers_rec.status_code := FND_API.g_miss_char;
4779 ELSIF l_promotional_offers_rec.user_status_id IS NULL THEN
4780 l_promotional_offers_rec.status_code := NULL;
4781 ELSE
4782 l_promotional_offers_rec.status_code := OZF_Utility_PVT.get_system_status_code(p_modifier_list_rec.user_status_id);
4783 END IF;
4784
4785 l_promotional_offers_rec.reusable := nvl(p_modifier_list_rec.reusable,'N');
4786 l_promotional_offers_rec.owner_id := p_modifier_list_rec.owner_id;
4787 l_promotional_offers_rec.wf_item_key := p_modifier_list_rec.wf_item_key;
4788 l_promotional_offers_rec.object_version_number := p_modifier_list_rec.object_version_number;
4789 l_promotional_offers_rec.offer_id := p_modifier_list_rec.offer_id;
4790 l_promotional_offers_rec.offer_type := p_modifier_list_rec.offer_type;
4791 l_promotional_offers_rec.perf_date_from := p_modifier_list_rec.perf_date_from;
4792 l_promotional_offers_rec.perf_date_to := p_modifier_list_rec.perf_date_to;
4793 l_promotional_offers_rec.modifier_level_code := p_modifier_list_rec.modifier_level_code;
4794 l_promotional_offers_rec.lumpsum_amount := p_modifier_list_rec.lumpsum_amount;
4795 l_promotional_offers_rec.lumpsum_payment_type := p_modifier_list_rec.lumpsum_payment_type;
4796 l_promotional_offers_rec.customer_reference := p_modifier_list_rec.customer_reference;
4797 l_promotional_offers_rec.buying_group_contact_id := p_modifier_list_rec.buying_group_contact_id;
4798
4799 IF p_modifier_list_rec.lumpsum_amount is not null AND
4800 p_modifier_list_rec.lumpsum_amount <> FND_API.g_miss_num THEN
4801 l_promotional_offers_rec.offer_amount := p_modifier_list_rec.lumpsum_amount;
4802 END IF;
4803
4804 l_promotional_offers_rec.budget_amount_fc := p_modifier_list_rec.budget_amount_fc;
4805 l_promotional_offers_rec.transaction_currency_code := p_modifier_list_rec.currency_code;
4806 l_promotional_offers_rec.functional_currency_code := p_modifier_list_rec.functional_currency_code;
4807 l_promotional_offers_rec.distribution_type := p_modifier_list_rec.distribution_type;
4808 l_promotional_offers_rec.break_type := p_modifier_list_rec.break_type;
4809 l_promotional_offers_rec.tier_level := p_modifier_list_rec.tier_level;
4810 l_promotional_offers_rec.na_rule_header_id := p_modifier_list_rec.na_rule_header_id;
4811 l_promotional_offers_rec.sales_method_flag := p_modifier_list_rec.sales_method_flag;
4812 l_promotional_offers_rec.org_id := p_modifier_list_rec.orig_org_id;
4813 -- l_promotional_offers_rec.na_qual_context := p_modifier_list_rec.na_qual_context;
4814 -- l_promotional_offers_rec.na_qual_attr := p_modifier_list_rec.na_qual_attr;
4815 -- l_promotional_offers_rec.na_qual_attr_value := p_modifier_list_rec.na_qual_attr_value;
4816
4817
4818 IF p_modifier_list_rec.offer_operation = 'CREATE' THEN
4819 OZF_Promotional_Offers_Pvt.CREATE_OFFERS
4820 (
4821 p_api_version_number => 1.0,
4822 x_return_status => x_return_status,
4823 x_msg_count => x_msg_count,
4824 x_msg_data => x_msg_data,
4825 p_offers_rec => l_promotional_offers_rec,
4826 x_offer_id => x_offer_id
4827 );
4828 ELSIF p_modifier_list_rec.offer_operation = 'UPDATE' THEN
4829
4830 OZF_Promotional_Offers_Pvt.UPDATE_OFFERS
4831 (
4832 p_api_version_number => 1.0,
4833 x_return_status => x_return_status,
4834 x_msg_count => x_msg_count,
4835 x_msg_data => x_msg_data,
4836 p_offers_rec => l_promotional_offers_rec,
4837 x_object_version_number => l_object_version_number
4838 );
4839 x_offer_id := l_promotional_offers_rec.offer_id;
4840 ELSIF p_modifier_list_rec.offer_operation = 'DELETE' THEN
4841 OZF_Promotional_Offers_Pvt.DELETE_OFFERS
4842 (
4843 p_api_version_number => 1.0,
4844 x_return_status => x_return_status,
4845 x_msg_count => x_msg_count,
4846 x_msg_data => x_msg_data,
4847 p_offer_id => l_promotional_offers_rec.offer_id,
4848 p_object_version_number => l_promotional_offers_rec.object_version_number
4849 );
4850 END IF;
4851
4852 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
4853 RAISE Fnd_Api.g_exc_error;
4854 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
4855 RAISE Fnd_Api.g_exc_unexpected_error;
4856 END IF;
4857
4858 Fnd_Msg_Pub.Count_AND_Get
4859 ( p_count => x_msg_count,
4860 p_data => x_msg_data,
4861 p_encoded => Fnd_Api.G_FALSE
4862 );
4863 EXCEPTION
4864 WHEN Fnd_Api.G_EXC_ERROR THEN
4865 x_return_status := Fnd_Api.g_ret_sts_error ;
4866 ROLLBACK TO process_ozf_offer;
4867 Fnd_Msg_Pub.Count_AND_Get
4868 ( p_count => x_msg_count,
4869 p_data => x_msg_data,
4870 p_encoded => Fnd_Api.G_FALSE
4871 );
4872 WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
4873 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
4874 ROLLBACK TO process_ozf_offer;
4875 Fnd_Msg_Pub.Count_AND_Get
4876 ( p_count => x_msg_count,
4877 p_data => x_msg_data,
4878 p_encoded => Fnd_Api.G_FALSE
4879 );
4880 WHEN OTHERS THEN
4881 x_return_status := Fnd_Api.g_ret_sts_unexp_erroR ;
4882 ROLLBACK TO process_ozf_offer;
4883 IF Fnd_Msg_Pub.Check_Msg_Level ( Fnd_Msg_Pub.G_MSG_LVL_UNEXP_ERROR )
4884 THEN
4885 Fnd_Msg_Pub.Add_Exc_Msg( G_PKG_NAME,l_api_name);
4886 END IF;
4887 Fnd_Msg_Pub.Count_AND_Get
4888 ( p_count => x_msg_count,
4889 p_data => x_msg_data,
4890 p_encoded => Fnd_Api.G_FALSE
4891 );
4892 END;
4893
4894 --=============================PBH Creation procedures===============================================
4895 FUNCTION getOfferType
4896 (
4897 p_listHeaderId NUMBER
4898 )
4899 RETURN VARCHAR2 IS
4900 CURSOR c_offerType(cp_listHeaderId NUMBER) IS
4901 SELECT offer_type
4902 FROM ozf_offers
4903 WHERE qp_list_header_id = cp_listHeaderId;
4904 l_offerType OZF_OFFERS.offer_type%TYPE;
4905 BEGIN
4906 OPEN c_offerType(cp_listHeaderId => p_listHeaderId);
4907 FETCH c_offerType INTO l_offerType;
4908 IF c_offerType%NOTFOUND THEN
4909 l_offerType := NULL;
4910 END IF;
4911 CLOSE c_offerType;
4912 RETURN l_offerType;
4913 END getOfferType;
4914
4915 FUNCTION getDiscountLevel
4916 (
4917 p_listHeaderId IN NUMBER
4918 )
4919 RETURN VARCHAR2 IS
4920 CURSOR c_discountLevel(cp_listHeaderId IN NUMBER) IS
4921 SELECT MODIFIER_LEVEL_CODE
4922 FROM ozf_offers
4923 WHERE qp_list_header_id = cp_listHeaderId;
4924 l_discountlevel OZF_OFFERS.MODIFIER_LEVEL_CODE%TYPE;
4925 BEGIN
4926 OPEN c_discountLevel(cp_listHeaderId => p_listHeaderId);
4927 FETCH c_discountLevel INTO l_discountLevel;
4928 IF c_discountLevel%NOTFOUND THEN
4929 l_discountLevel := 'LINEGROUP';
4930 END IF;
4931 CLOSE c_discountLevel;
4932 RETURN l_discountLevel;
4933 END getDiscountLevel;
4934
4935 /*gdeepika - defaulted the princing phase using profiles -bug 5675554*/
4936 FUNCTION getPricingPhase
4937 (
4938 p_listHeaderId IN NUMBER
4939 )
4940 RETURN VARCHAR2 IS
4941 l_pricingPhase NUMBER;
4942 BEGIN
4943 CASE getDiscountLevel(p_listHeaderId => p_listHeaderId)
4944 WHEN 'LINEGROUP' THEN
4945 l_pricingPhase := FND_PROFILE.value('OZF_PRICING_PHASE_LINEGROUP');
4946 WHEN 'LINE' THEN
4947 l_pricingPhase := FND_PROFILE.value('OZF_PRICING_PHASE_LINE');
4948 WHEN 'ORDER' THEN
4949 l_pricingPhase := FND_PROFILE.value('OZF_PRICING_PHASE_ORDER');
4950 ELSE
4951 l_pricingPhase := FND_PROFILE.value('OZF_PRICING_PHASE_LINEGROUP');
4952 END CASE;
4953 RETURN l_pricingPhase;
4954 END getPricingPhase;
4955
4956 PROCEDURE populateZeroDiscount
4957 (
4958 x_return_status OUT NOCOPY VARCHAR2
4959 ,x_msg_count OUT NOCOPY NUMBER
4960 ,x_msg_data OUT NOCOPY VARCHAR2
4961 ,p_modifierLineRec IN MODIFIER_LINE_REC_TYPE
4962 , x_modifiersTbl IN OUT NOCOPY Qp_Modifiers_Pub.modifiers_tbl_type
4963 )
4964 IS
4965 l_index NUMBER;
4966 BEGIN
4967 x_return_status := FND_API.G_RET_STS_SUCCESS;
4968 l_index := x_modifiersTbl.count + 1;
4969 x_modifiersTbl(l_index).operation := 'CREATE' ;
4970 x_modifiersTbl(l_index).list_line_type_code := 'DIS' ;
4971 x_modifiersTbl(l_index).list_header_id := p_modifierLineRec.list_header_id;
4972 x_modifiersTbl(l_index).arithmetic_operator := NVL(p_modifierLineRec.arithmetic_operator, '%');
4973 x_modifiersTbl(l_index).operand := 0;
4974 x_modifiersTbl(l_index).proration_type_code := 'N';
4975 x_modifiersTbl(l_index).product_precedence := FND_PROFILE.value('OZF_PRODUCT_PRECEDENCE');
4976
4977 IF getDiscountLevel(p_listHeaderId => p_modifierLineRec.list_header_id) <> 'ORDER' THEN
4978 x_modifiersTbl(l_index).pricing_group_sequence := FND_PROFILE.value('OZF_PRICING_GROUP_SEQUENCE');
4979 END IF;
4980 x_modifiersTbl(l_index).print_on_invoice_flag := 'Y';
4981 x_modifiersTbl(l_index).pricing_phase_id := getPricingPhase(p_listHeaderId => p_modifierLineRec.list_header_id);
4982 x_modifiersTbl(l_index).modifier_level_code := getDiscountLevel(p_listHeaderId => p_modifierLineRec.list_header_id);
4983 x_modifiersTbl(l_index).modifier_parent_index := 1;
4984 x_modifiersTbl(l_index).price_break_type_code := 'POINT';
4985 x_modifiersTbl(l_index).automatic_flag := 'Y';
4986
4987 x_modifiersTbl(l_index).rltd_modifier_grp_type := 'PRICE BREAK';
4988 x_modifiersTbl(l_index).rltd_modifier_grp_no := 1;
4989 x_modifiersTbl(l_index).modifier_parent_index := 1;
4990 END populateZeroDiscount;
4991
4992 PROCEDURE populateRegularDiscount
4993 (
4994 x_return_status OUT NOCOPY VARCHAR2
4995 ,x_msg_count OUT NOCOPY NUMBER
4996 ,x_msg_data OUT NOCOPY VARCHAR2
4997 ,p_modifierLineRec IN MODIFIER_LINE_REC_TYPE
4998 , x_modifiersTbl IN OUT NOCOPY Qp_Modifiers_Pub.modifiers_tbl_type
4999 )
5000 IS
5001 l_index NUMBER;
5002 BEGIN
5003 x_return_status := FND_API.G_RET_STS_SUCCESS;
5004 l_index := x_modifiersTbl.count + 1;
5005 x_modifiersTbl(l_index).operation := 'CREATE' ;
5006 x_modifiersTbl(l_index).list_line_type_code := 'DIS' ;
5007 x_modifiersTbl(l_index).list_header_id := p_modifierLineRec.list_header_id;
5008 x_modifiersTbl(l_index).arithmetic_operator := NVL(p_modifierLineRec.arithmetic_operator, '%');
5009 x_modifiersTbl(l_index).operand := NVL(p_modifierLineRec.operand, 0);
5010 x_modifiersTbl(l_index).proration_type_code := 'N';
5011 x_modifiersTbl(l_index).product_precedence := FND_PROFILE.value('OZF_PRODUCT_PRECEDENCE');
5012 IF getDiscountLevel(p_listHeaderId => p_modifierLineRec.list_header_id) <> 'ORDER' THEN
5013 x_modifiersTbl(l_index).pricing_group_sequence := FND_PROFILE.value('OZF_PRICING_GROUP_SEQUENCE');
5014 END IF;
5015 x_modifiersTbl(l_index).print_on_invoice_flag := 'Y';
5016 x_modifiersTbl(l_index).pricing_phase_id := getPricingPhase(p_listHeaderId => p_modifierLineRec.list_header_id);
5017 x_modifiersTbl(l_index).modifier_level_code := getDiscountLevel(p_listHeaderId => p_modifierLineRec.list_header_id);
5018 x_modifiersTbl(l_index).modifier_parent_index := 1;
5019 x_modifiersTbl(l_index).price_break_type_code := 'POINT';
5020 x_modifiersTbl(l_index).automatic_flag := 'Y';
5021 x_modifiersTbl(l_index).rltd_modifier_grp_type := 'PRICE BREAK';
5022 x_modifiersTbl(l_index).rltd_modifier_grp_no := 1;
5023 x_modifiersTbl(l_index).modifier_parent_index := 1;
5024 END populateRegularDiscount;
5025
5026 PROCEDURE populateDISModifierData
5027 (
5028 x_return_status OUT NOCOPY VARCHAR2
5029 ,x_msg_count OUT NOCOPY NUMBER
5030 ,x_msg_data OUT NOCOPY VARCHAR2
5031 ,p_modifierLineRec IN MODIFIER_LINE_REC_TYPE
5032 , x_modifiersTbl IN OUT NOCOPY Qp_Modifiers_Pub.modifiers_tbl_type
5033 )
5034 IS
5035 l_index NUMBER;
5036 l_modifierLineRec MODIFIER_LINE_REC_TYPE;
5037 BEGIN
5038 x_return_status := FND_API.G_RET_STS_SUCCESS;
5039 l_index := nvl(x_modifiersTbl.count,0) + 1;
5040 ozf_utility_pvt.debug_message('After setting index:'||p_modifierLineRec.pricing_attr_value_from);
5041 l_modifierLineRec := p_modifierLineRec;
5042 IF p_modifierLineRec.pricing_attr_value_from IS NOT NULL AND p_modifierLineRec.pricing_attr_value_from <> FND_API.G_MISS_CHAR THEN
5043 l_modifierLineRec.pricing_attr_value_from := 0;
5044 END IF;
5045 IF NVL(to_number(l_modifierLineRec.pricing_attr_value_from), 0) > 0 THEN
5046 ozf_utility_pvt.debug_message('Calling Populate zero discount');
5047 populateZeroDiscount
5048 (
5049 x_return_status => x_return_status
5050 ,x_msg_count => x_msg_count
5051 ,x_msg_data => x_msg_data
5052 ,p_modifierLineRec => l_modifierLineRec
5053 , x_modifiersTbl => x_modifiersTbl
5054 );
5055 l_index := l_index + 1;
5056 END IF;
5057
5058 ozf_utility_pvt.debug_message('Calling Populate Regular discount');
5059 populateRegularDiscount
5060 (
5061 x_return_status => x_return_status
5062 ,x_msg_count => x_msg_count
5063 ,x_msg_data => x_msg_data
5064 ,p_modifierLineRec => p_modifierLineRec
5065 , x_modifiersTbl => x_modifiersTbl
5066 );
5067 -- END IF;
5068 END populateDISModifierData;
5069
5070 PROCEDURE populateZeroPricingAttr(
5071 x_return_status OUT NOCOPY VARCHAR2
5072 ,x_msg_count OUT NOCOPY NUMBER
5073 ,x_msg_data OUT NOCOPY VARCHAR2
5074 ,p_modifierLineRec IN MODIFIER_LINE_REC_TYPE
5075 , x_pricingAttrTbl IN OUT NOCOPY Qp_Modifiers_Pub.pricing_attr_tbl_type
5076 )
5077 IS
5078 l_index NUMBER;
5079 BEGIN
5080 x_return_status := FND_API.G_RET_STS_SUCCESS;
5081 l_index := nvl(x_pricingAttrTbl.count,0) + 1;
5082 x_pricingAttrTbl(l_index).product_attribute_context := 'ITEM';
5083 x_pricingAttrTbl(l_index).product_attribute := p_modifierLineRec.product_attr;
5084 x_pricingAttrTbl(l_index).product_attr_value := p_modifierLineRec.product_attr_val;
5085 x_pricingAttrTbl(l_index).product_uom_code := p_modifierLineRec.product_uom_code;
5086 x_pricingAttrTbl(l_index).pricing_attribute_context := 'VOLUME';
5087 x_pricingAttrTbl(l_index).pricing_attribute := NVL(p_modifierLineRec.pricing_attr,'PRICING_ATTRIBUTE10');
5088 x_pricingAttrTbl(l_index).pricing_attr_value_from := 0;--NVL(p_modifier_line_tbl(i).pricing_attr_value_from, 0);
5089 x_pricingAttrTbl(l_index).pricing_attr_value_to := NVL(p_modifierLineRec.pricing_attr_value_from, 0);
5090 x_pricingAttrTbl(l_index).comparison_operator_code := 'BETWEEN';
5091 x_pricingAttrTbl(l_index).modifiers_index := l_index; -- here there is a 1-1 correspondence between modifies and pricing attr, so can use the same index
5092 x_pricingAttrTbl(l_index).operation := 'CREATE';
5093 END populateZeroPricingAttr;
5094
5095
5096 PROCEDURE populateRegularPricingAttr(
5097 x_return_status OUT NOCOPY VARCHAR2
5098 ,x_msg_count OUT NOCOPY NUMBER
5099 ,x_msg_data OUT NOCOPY VARCHAR2
5100 ,p_modifierLineRec IN MODIFIER_LINE_REC_TYPE
5101 , x_pricingAttrTbl IN OUT NOCOPY Qp_Modifiers_Pub.pricing_attr_tbl_type
5102 )
5103 IS
5104 l_index NUMBER;
5105 BEGIN
5106 x_return_status := FND_API.G_RET_STS_SUCCESS;
5107 l_index := nvl(x_pricingAttrTbl.count,0) + 1;
5108 x_pricingAttrTbl(l_index).product_attribute_context := 'ITEM';
5109 x_pricingAttrTbl(l_index).product_attribute := p_modifierLineRec.product_attr;
5110 x_pricingAttrTbl(l_index).product_attr_value := p_modifierLineRec.product_attr_val;
5111 x_pricingAttrTbl(l_index).product_uom_code := p_modifierLineRec.product_uom_code;
5112 x_pricingAttrTbl(l_index).pricing_attribute_context := 'VOLUME';
5113 --x_pricingAttrTbl(l_index).pricing_attribute := 'PRICING_ATTRIBUTE10';
5114 -- fir for bug 7340864
5115 x_pricingAttrTbl(l_index).pricing_attribute := NVL(p_modifierLineRec.pricing_attr, 'PRICING_ATTRIBUTE10');
5116 x_pricingAttrTbl(l_index).pricing_attr_value_from := NVL(p_modifierLineRec.pricing_attr_value_from, 0);
5117 x_pricingAttrTbl(l_index).pricing_attr_value_to := 9999999999;
5118 x_pricingAttrTbl(l_index).comparison_operator_code := 'BETWEEN';
5119 x_pricingAttrTbl(l_index).modifiers_index := l_index; -- here there is a 1-1 correspondence between modifies and pricing attr, so can use the same index
5120 x_pricingAttrTbl(l_index).operation := 'CREATE';
5121 END populateRegularPricingAttr;
5122
5123 PROCEDURE populateUpdatePricingAttr(
5124 x_return_status OUT NOCOPY VARCHAR2
5125 ,x_msg_count OUT NOCOPY NUMBER
5126 ,x_msg_data OUT NOCOPY VARCHAR2
5127 ,p_modifierLineRec IN MODIFIER_LINE_REC_TYPE
5128 , x_pricingAttrTbl IN OUT NOCOPY Qp_Modifiers_Pub.pricing_attr_tbl_type
5129 )
5130 IS
5131 CURSOR c_pricingAttr(cp_listLineId NUMBER) IS
5132 SELECT pricing_attribute_id FROM qp_pricing_attributes
5133 WHERE list_line_id = cp_listLineId
5134 OR list_line_id IN (select to_rltd_modifier_id FROM qp_rltd_modifiers WHERE from_rltd_modifier_id = cp_listLineId AND rltd_modifier_grp_type = 'PRICE BREAK');
5135 i NUMBER;
5136 BEGIN
5137 x_return_status := FND_API.G_RET_STS_SUCCESS;
5138 i := 1;
5139 FOR l_pricingAttr IN c_pricingAttr(cp_listLineId => p_modifierLineRec.list_line_id) LOOP
5140 x_pricingAttrTbl(i).pricing_attribute_id := l_pricingAttr.pricing_attribute_id;
5141 x_pricingAttrTbl(i).product_attribute_context := 'ITEM';
5142 x_pricingAttrTbl(i).product_attribute := p_modifierLineRec.product_attr;
5143 x_pricingAttrTbl(i).product_attr_value := p_modifierLineRec.product_attr_val;
5144 x_pricingAttrTbl(i).product_uom_code := p_modifierLineRec.product_uom_code;
5145 x_pricingAttrTbl(i).pricing_attribute_context := p_modifierLineRec.pricing_attribute_context;
5146 x_pricingAttrTbl(i).pricing_attribute := p_modifierLineRec.pricing_attr;
5147 x_pricingAttrTbl(i).pricing_attr_value_from := p_modifierLineRec.pricing_attr_value_from;
5148 x_pricingAttrTbl(i).pricing_attr_value_to := p_modifierLineRec.pricing_attr_value_to;
5149 -- x_pricingAttrTbl(i).comparison_operator_code := 'BETWEEN';
5150 x_pricingAttrTbl(i).operation := p_modifierLineRec.operation;
5151 i := i + 1;
5152 END LOOP;
5153 END populateUpdatePricingAttr;
5154
5155
5156 /**
5157 Populates CHild DIS Pricing Attributes into QP Record Structures given a single Price Break Header Record
5158 */
5159 PROCEDURE populateDISPricingAttrData
5160 (
5161 x_return_status OUT NOCOPY VARCHAR2
5162 ,x_msg_count OUT NOCOPY NUMBER
5163 ,x_msg_data OUT NOCOPY VARCHAR2
5164 ,p_modifierLineRec IN MODIFIER_LINE_REC_TYPE
5165 , x_pricingAttrTbl IN OUT NOCOPY Qp_Modifiers_Pub.pricing_attr_tbl_type
5166 )
5167 IS
5168 l_index NUMBER;
5169 l_modifierLineRec MODIFIER_LINE_REC_TYPE;
5170 BEGIN
5171 x_return_status := FND_API.G_RET_STS_SUCCESS;
5172 l_index := x_pricingAttrTbl.count + 1;
5173 l_modifierLineRec := p_modifierLineRec;
5174 IF p_modifierLineRec.operation = 'CREATE' THEN
5175 IF p_modifierLineRec.pricing_attr_value_from IS NOT NULL AND p_modifierLineRec.pricing_attr_value_from <> FND_API.G_MISS_CHAR THEN
5176 l_modifierLineRec.pricing_attr_value_from := 0;
5177 END IF;
5178 IF NVL(to_number(l_modifierLineRec.pricing_attr_value_from), 0) > 0 THEN
5179 populateZeroPricingAttr
5180 (
5181 x_return_status => x_return_status
5182 ,x_msg_count => x_msg_count
5183 ,x_msg_data => x_msg_data
5184 ,p_modifierLineRec => l_modifierLineRec
5185 , x_pricingAttrTbl => x_pricingAttrTbl
5186 );
5187 l_index := l_index + 1;
5188 END IF;
5189 populateRegularPricingAttr
5190 (
5191 x_return_status => x_return_status
5192 ,x_msg_count => x_msg_count
5193 ,x_msg_data => x_msg_data
5194 ,p_modifierLineRec => l_modifierLineRec
5195 , x_pricingAttrTbl => x_pricingAttrTbl
5196 );
5197 -- END IF;
5198 ELSE
5199 populateUpdatePricingAttr
5200 (
5201 x_return_status => x_return_status
5202 ,x_msg_count => x_msg_count
5203 ,x_msg_data => x_msg_data
5204 ,p_modifierLineRec => l_modifierLineRec
5205 , x_pricingAttrTbl => x_pricingAttrTbl
5206 );
5207 END IF;
5208
5209 END populateDISPricingAttrData;
5210
5211 /**
5212 Populates CHild DIS data into QP Record Structures given a single Price Break Header Record
5213 */
5214 PROCEDURE populateDisData
5215 (
5216 x_return_status OUT NOCOPY VARCHAR2
5217 ,x_msg_count OUT NOCOPY NUMBER
5218 ,x_msg_data OUT NOCOPY VARCHAR2
5219 ,p_modifierLineRec IN MODIFIER_LINE_REC_TYPE
5220 , x_modifiersTbl IN OUT NOCOPY Qp_Modifiers_Pub.modifiers_tbl_type
5221 , x_pricingAttrTbl IN OUT NOCOPY Qp_Modifiers_Pub.pricing_attr_tbl_type
5222 )
5223 IS
5224 BEGIN
5225 x_return_status := FND_API.G_RET_STS_SUCCESS;
5226 ozf_utility_pvt.debug_message('Calling populate DIS Modifier Data');
5227 IF p_modifierLineRec.operation = 'CREATE' THEN
5228 populateDISModifierData
5229 (
5230 x_return_status => x_return_status
5231 ,x_msg_count => x_msg_count
5232 ,x_msg_data => x_msg_data
5233 ,p_modifierLineRec => p_modifierLineRec
5234 , x_modifiersTbl => x_modifiersTbl
5235 );
5236 IF x_return_status = FND_API.G_RET_STS_ERROR THEN
5237 RAISE FND_API.G_EXC_ERROR;
5238 ELSIF x_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
5239 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5240 END IF;
5241 END IF;
5242 ozf_utility_pvt.debug_message('Calling populate DIS Pricing Attr Data');
5243 populateDISPricingAttrData
5244 (
5245 x_return_status => x_return_status
5246 ,x_msg_count => x_msg_count
5247 ,x_msg_data => x_msg_data
5248 ,p_modifierLineRec => p_modifierLineRec
5249 ,x_pricingAttrTbl => x_pricingAttrTbl
5250 );
5251 IF x_return_status = FND_API.G_RET_STS_ERROR THEN
5252 RAISE FND_API.G_EXC_ERROR;
5253 ELSIF x_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
5254 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5255 END IF;
5256
5257 END populateDisData;
5258
5259
5260 /**
5261 Populates Modifier Information into QP Modifiers Structures given a single Price Break Header Record
5262 */
5263 PROCEDURE populatePBHModifierData
5264 (
5265 x_return_status OUT NOCOPY VARCHAR2
5266 ,x_msg_count OUT NOCOPY NUMBER
5267 ,x_msg_data OUT NOCOPY VARCHAR2
5268 ,p_modifierLineRec IN MODIFIER_LINE_REC_TYPE
5269 , x_modifiersTbl OUT NOCOPY Qp_Modifiers_Pub.modifiers_tbl_type
5270 )
5271 IS
5272 BEGIN
5273 x_return_status := FND_API.G_RET_STS_SUCCESS;
5274 x_modifiersTbl(1).operation := p_modifierLineRec.operation;
5275 x_modifiersTbl(1).list_header_id := p_modifierLineRec.list_header_id;
5276 x_modifiersTbl(1).list_line_id := p_modifierLineRec.list_line_id;
5277 x_modifiersTbl(1).start_date_active := p_modifierLineRec.start_date_active;
5278 x_modifiersTbl(1).end_date_active := p_modifierLineRec.end_date_active;
5279 x_modifiersTbl(1).accrual_flag := 'N';
5280 IF p_modifierLineRec.operation = 'CREATE' THEN
5281 -- l_child_index := l_child_index + 1;
5282 x_modifiersTbl(1).list_line_type_code := 'PBH' ;
5283 x_modifiersTbl(1).proration_type_code := 'N';
5284 x_modifiersTbl(1).product_precedence := FND_PROFILE.value('OZF_PRODUCT_PRECEDENCE');
5285 x_modifiersTbl(1).print_on_invoice_flag := 'Y';
5286 x_modifiersTbl(1).pricing_phase_id := getPricingPhase(p_listHeaderId => p_modifierLineRec.list_header_id);
5287 x_modifiersTbl(1).modifier_level_code := getDiscountLevel(p_listHeaderId => p_modifierLineRec.list_header_id);
5288 x_modifiersTbl(1).price_break_type_code := 'POINT';
5289 x_modifiersTbl(1).automatic_flag := 'Y';
5290 IF getDiscountLevel(p_listHeaderId => p_modifierLineRec.list_header_id) <> 'ORDER' THEN
5291 x_modifiersTbl(1).pricing_group_sequence := FND_PROFILE.value('OZF_PRICING_GROUP_SEQUENCE');
5292 END IF;
5293 end if;
5294 IF getOfferType(p_listHeaderId => p_modifierLineRec.list_header_id) = 'ACCRUAL' THEN
5295 x_modifiersTbl(1).accrual_flag := 'Y';
5296 END IF;
5297
5298
5299 END populatePBHModifierData;
5300
5301 /**
5302 Populates Pricing Attributes into QP Pricing Attribute Structures given a single Price Break Header Record
5303 */
5304 PROCEDURE populatePBHPricingAttrData
5305 (
5306 x_return_status OUT NOCOPY VARCHAR2
5307 ,x_msg_count OUT NOCOPY NUMBER
5308 ,x_msg_data OUT NOCOPY VARCHAR2
5309 ,p_modifierLineRec IN MODIFIER_LINE_REC_TYPE
5310 , x_pricingAttrTbl OUT NOCOPY Qp_Modifiers_Pub.pricing_attr_tbl_type
5311 )
5312 IS
5313 BEGIN
5314 x_return_status := FND_API.G_RET_STS_SUCCESS;
5315 x_pricingAttrTbl(1).product_attribute_context := 'ITEM';
5316 x_pricingAttrTbl(1).product_attribute := p_modifierLineRec.product_attr;
5317 x_pricingAttrTbl(1).product_attr_value := p_modifierLineRec.product_attr_val;
5318 x_pricingAttrTbl(1).product_uom_code := p_modifierLineRec.product_uom_code;
5319 x_pricingAttrTbl(1).pricing_attribute_context := 'VOLUME';
5320 x_pricingAttrTbl(1).pricing_attribute := NVL(p_modifierLineRec.pricing_attr, 'PRICING_ATTRIBUTE10');
5321 x_pricingAttrTbl(1).comparison_operator_code := 'BETWEEN';
5322 x_pricingAttrTbl(1).modifiers_index := 1;
5323 x_pricingAttrTbl(1).operation := p_modifierLineRec.operation;
5324 x_pricingAttrTbl(1).pricing_attribute_id := p_modifierLineRec.pricing_attribute_id;
5325 END populatePBHPricingAttrData;
5326
5327 /**
5328 Populates Price Break Header Data Into QP Record structures given a single Price Break Header Record
5329 */
5330 PROCEDURE populatePbhData
5331 (
5332 x_return_status OUT NOCOPY VARCHAR2
5333 ,x_msg_count OUT NOCOPY NUMBER
5334 ,x_msg_data OUT NOCOPY VARCHAR2
5335 ,p_modifierLineRec IN MODIFIER_LINE_REC_TYPE
5336 , x_modifiersTbl OUT NOCOPY Qp_Modifiers_Pub.modifiers_tbl_type
5337 , x_pricingAttrTbl OUT NOCOPY Qp_Modifiers_Pub.pricing_attr_tbl_type
5338 )
5339 IS
5340 BEGIN
5341 -- initialize
5342 -- populate modifers data
5343 -- populate pricing attribute data
5344 x_return_status := FND_API.G_RET_STS_SUCCESS;
5345 populatePBHModifierData
5346 (
5347 x_return_status => x_return_status
5348 ,x_msg_count => x_msg_count
5349 ,x_msg_data => x_msg_data
5350 ,p_modifierLineRec => p_modifierLineRec
5351 , x_modifiersTbl => x_modifiersTbl
5352 );
5353 IF x_return_status = FND_API.G_RET_STS_ERROR THEN
5354 RAISE FND_API.G_EXC_ERROR;
5355 ELSIF x_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
5356 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5357 END IF;
5358 populatePBHPricingAttrData
5359 (
5360 x_return_status => x_return_status
5361 ,x_msg_count => x_msg_count
5362 ,x_msg_data => x_msg_data
5363 ,p_modifierLineRec => p_modifierLineRec
5364 ,x_pricingAttrTbl => x_pricingAttrTbl
5365 );
5366 IF x_return_status = FND_API.G_RET_STS_ERROR THEN
5367 RAISE FND_API.G_EXC_ERROR;
5368 ELSIF x_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
5369 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5370 END IF;
5371 END populatePbhData;
5372
5373 /**
5374 Creates a PBH line in QP tables given a single PBH line
5375 */
5376 PROCEDURE processPbhLine
5377 (
5378 x_return_status OUT NOCOPY VARCHAR2
5379 ,x_msg_count OUT NOCOPY NUMBER
5380 ,x_msg_data OUT NOCOPY VARCHAR2
5381 ,p_offerType IN VARCHAR2
5382 ,p_modifierLineRec IN MODIFIER_LINE_REC_TYPE
5383 ,x_modifiersTbl OUT NOCOPY QP_MODIFIERS_PUB.modifiers_tbl_type
5384 -- ,x_error_location OUT NOCOPY NUMBER
5385 )
5386 IS
5387 l_modifiersTbl Qp_Modifiers_Pub.modifiers_tbl_type;
5388 l_pricingAttrTbl Qp_Modifiers_Pub.pricing_attr_tbl_type;
5389 v_modifier_list_rec qp_modifiers_pub.modifier_list_rec_type;
5390 v_modifier_list_val_rec qp_modifiers_pub.modifier_list_val_rec_type;
5391 v_modifiers_tbl qp_modifiers_pub.modifiers_tbl_type;
5392 v_modifiers_val_tbl qp_modifiers_pub.modifiers_val_tbl_type;
5393 v_qualifiers_tbl qp_qualifier_rules_pub.qualifiers_tbl_type;
5394 v_qualifiers_val_tbl qp_qualifier_rules_pub.qualifiers_val_tbl_type;
5395 v_pricing_attr_tbl qp_modifiers_pub.pricing_attr_tbl_type;
5396 v_pricing_attr_val_tbl qp_modifiers_pub.pricing_attr_val_tbl_type;
5397 l_control_rec qp_globals.control_rec_type;
5398 BEGIN
5399 -- initialize
5400 -- populate pbh data
5401 -- populate dis data
5402 -- process db txn
5403 -- process errors
5404 x_return_status := FND_API.G_RET_STS_SUCCESS;
5405 l_modifiersTbl.delete;
5406 l_pricingAttrTbl.delete;
5407 populatePbhData
5408 (
5409 x_return_status => x_return_status
5410 ,x_msg_count => x_msg_count
5411 ,x_msg_data => x_msg_data
5412 ,p_modifierLineRec => p_modifierLineRec
5413 , x_modifiersTbl => l_modifiersTbl
5414 , x_pricingAttrTbl => l_pricingAttrTbl
5415 );
5416 IF x_return_status = FND_API.G_RET_STS_ERROR THEN
5417 RAISE FND_API.G_EXC_ERROR;
5418 ELSIF x_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
5419 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5420 END IF;
5421 populateDisData
5422 (
5423 x_return_status => x_return_status
5424 ,x_msg_count => x_msg_count
5425 ,x_msg_data => x_msg_data
5426 ,p_modifierLineRec => p_modifierLineRec
5427 , x_modifiersTbl => l_modifiersTbl
5428 , x_pricingAttrTbl => l_pricingAttrTbl
5429 );
5430 IF x_return_status = FND_API.G_RET_STS_ERROR THEN
5431 RAISE FND_API.G_EXC_ERROR;
5432 ELSIF x_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
5433 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5434 END IF;
5435
5436 QP_Modifiers_PUB.process_modifiers(
5437 p_api_version_number => 1.0,
5438 p_init_msg_list => FND_API.G_FALSE,
5439 p_return_values => FND_API.G_FALSE,
5440 x_return_status => x_return_status,
5441 x_msg_count => x_msg_count,
5442 x_msg_data => x_msg_data,
5443 p_modifiers_tbl => l_modifiersTbl,
5444 p_pricing_attr_tbl => l_pricingAttrTbl,
5445 x_modifier_list_rec => v_modifier_list_rec,
5446 x_modifier_list_val_rec => v_modifier_list_val_rec,
5447 x_modifiers_tbl => v_modifiers_tbl,
5448 x_modifiers_val_tbl => v_modifiers_val_tbl,
5449 x_qualifiers_tbl => v_qualifiers_tbl,
5450 x_qualifiers_val_tbl => v_qualifiers_val_tbl,
5451 x_pricing_attr_tbl => v_pricing_attr_tbl,
5452 x_pricing_attr_val_tbl => v_pricing_attr_val_tbl
5453 );
5454 x_modifiersTbl := v_modifiers_tbl;
5455 IF x_return_status <> Fnd_Api.g_ret_sts_success THEN
5456 return;
5457 END IF;
5458 END processPbhLine;
5459
5460 --=============================END PBH Creation procedures============================================
5461
5462 /*
5463 This API will only deal with PBH records. The tiers fragment will not call this
5464 API. It will call another API */
5465 --=================================================================================
5466 -- Fixed bug # 4354567. Accept additional OUT NOCOPY parameter to pass back the modifier lines created
5467 --====================================================================================
5468
5469 PROCEDURE process_header_tiers
5470 ( x_return_status OUT NOCOPY VARCHAR2
5471 ,x_msg_count OUT NOCOPY NUMBER
5472 ,x_msg_data OUT NOCOPY VARCHAR2
5473 ,p_offer_type IN VARCHAR2
5474 ,p_modifier_line_tbl IN MODIFIER_LINE_TBL_TYPE
5475 ,x_modifiers_tbl OUT NOCOPY QP_MODIFIERS_PUB.modifiers_tbl_type
5476 ,x_error_location OUT NOCOPY NUMBER
5477 ) IS
5478
5479 l_api_version CONSTANT NUMBER := 1.0;
5480 l_api_name CONSTANT VARCHAR2(30) := 'process_header_tiers';
5481 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
5482
5483 v_modifiers_tbl qp_modifiers_pub.modifiers_tbl_type;
5484
5485 BEGIN
5486 -- initialize
5487 -- loop thru lines
5488 -- for each pbh create the line in the database
5489 -- handle exception
5490 x_return_status := Fnd_Api.g_ret_sts_success;
5491 IF nvl(p_modifier_line_tbl.count,0) > 0 THEN
5492 FOR i in p_modifier_line_tbl.first..p_modifier_line_tbl.last LOOP
5493 IF p_modifier_line_tbl.exists(i) THEN
5494 processPbhLine
5495 (
5496 x_return_status => x_return_status
5497 ,x_msg_count => x_msg_count
5498 ,x_msg_data => x_msg_data
5499 ,p_offerType => p_offer_type
5500 ,p_modifierLineRec => p_modifier_line_tbl(i)
5501 ,x_modifiersTbl => v_modifiers_tbl
5502 -- ,x_error_location OUT NOCOPY NUMBER
5503 );
5504 IF x_return_status = FND_API.G_RET_STS_ERROR THEN
5505 x_error_location := i;
5506 RAISE FND_API.G_EXC_ERROR;
5507 ELSIF x_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
5508 x_error_location := i;
5509 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5510 END IF;
5511 END IF;
5512 IF nvl(v_modifiers_tbl.count,0) > 0 THEN
5513 FOR i in v_modifiers_tbl.first .. v_modifiers_tbl.last LOOP
5514 IF v_modifiers_tbl.exists(i) THEN
5515 -- dbms_output.put_line('Adding to :'||nvl(v_modifiers_tbl.count,0) + i);
5516 x_modifiers_tbl(nvl(x_modifiers_tbl.count,0) + i) := v_modifiers_tbl(i);
5517 END IF;
5518 END LOOP;
5519 END IF;
5520
5521 END LOOP;
5522 END IF;
5523
5524 EXCEPTION
5525 WHEN Fnd_Api.G_EXC_ERROR THEN
5526 x_return_status := Fnd_Api.g_ret_sts_error ;
5527 Fnd_Msg_Pub.Count_AND_Get
5528 ( p_count => x_msg_count,
5529 p_data => x_msg_data,
5530 p_encoded => Fnd_Api.G_FALSE
5531 );
5532 WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
5533 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
5534 Fnd_Msg_Pub.Count_AND_Get
5535 ( p_count => x_msg_count,
5536 p_data => x_msg_data,
5537 p_encoded => Fnd_Api.G_FALSE
5538 );
5539 WHEN OTHERS THEN
5540 x_return_status := Fnd_Api.g_ret_sts_unexp_erroR ;
5541 IF Fnd_Msg_Pub.Check_Msg_Level ( Fnd_Msg_Pub.G_MSG_LVL_UNEXP_ERROR )
5542 THEN
5543 Fnd_Msg_Pub.Add_Exc_Msg( G_PKG_NAME,l_api_name);
5544 END IF;
5545 Fnd_Msg_Pub.Count_AND_Get
5546 ( p_count => x_msg_count,
5547 p_data => x_msg_data,
5548 p_encoded => Fnd_Api.G_FALSE
5549 );
5550
5551 END;
5552
5553 -- Use this procedure to create off invoice, Acruals, Terms Substitution
5554 PROCEDURE process_regular_discounts
5555 (
5556 x_return_status OUT NOCOPY VARCHAR2
5557 ,x_msg_count OUT NOCOPY NUMBER
5558 ,x_msg_data OUT NOCOPY VARCHAR2
5559 ,p_parent_offer_type IN VARCHAR2
5560 ,p_offer_type IN VARCHAR2
5561 ,p_modifier_line_tbl IN MODIFIER_LINE_TBL_TYPE
5562 ,x_modifiers_tbl OUT NOCOPY QP_MODIFIERS_PUB.modifiers_tbl_type
5563 ,x_error_location OUT NOCOPY NUMBER
5564 ) IS
5565
5566 l_api_version CONSTANT NUMBER := 1.0;
5567 l_api_name CONSTANT VARCHAR2(30) := 'process_regular_discounts';
5568 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
5569
5570 tiers_modifier_line_tbl MODIFIER_LINE_TBL_TYPE;
5571
5572 l_modifiers_tbl Qp_Modifiers_Pub.modifiers_tbl_type;
5573 l_pricing_attr_tbl Qp_Modifiers_Pub.pricing_attr_tbl_type;
5574 l_qualifiers_tbl qp_qualifier_rules_pub.qualifiers_tbl_type;
5575 v_modifier_list_rec qp_modifiers_pub.modifier_list_rec_type;
5576 v_modifier_list_val_rec qp_modifiers_pub.modifier_list_val_rec_type;
5577 v_modifiers_tbl qp_modifiers_pub.modifiers_tbl_type;
5578 v_modifiers_val_tbl qp_modifiers_pub.modifiers_val_tbl_type;
5579 v_qualifiers_tbl qp_qualifier_rules_pub.qualifiers_tbl_type;
5580 v_qualifiers_val_tbl qp_qualifier_rules_pub.qualifiers_val_tbl_type;
5581 v_pricing_attr_tbl qp_modifiers_pub.pricing_attr_tbl_type;
5582 v_pricing_attr_val_tbl qp_modifiers_pub.pricing_attr_val_tbl_type;
5583 p_list_line_id NUMBER;
5584
5585 i number := 0;
5586 l_tier_count number := 0;
5587 l_list_header_id NUMBER;
5588 l_override_flag VARCHAR2(1);
5589
5590 TYPE map_record IS RECORD
5591 (
5592 orig_row number,
5593 new_row number,
5594 tier_row number
5595 );
5596
5597 TYPE map_table IS TABLE OF map_record
5598 INDEX BY BINARY_INTEGER;
5599
5600 l_map_table map_table;
5601
5602 CURSOR cur_get_discount_level(p_list_header_id NUMBER) IS
5603 SELECT modifier_level_code
5604 FROM ozf_offers
5605 WHERE qp_list_header_id = p_list_header_id;
5606
5607 l_discount_level VARCHAR2(30):= 'NONE';
5608 l_pricing_phase_id NUMBER;
5609
5610
5611 CURSOR cur_get_offer_enddate(p_list_header_id NUMBER) IS
5612 SELECT start_date_active, end_date_active
5613 FROM qp_list_headers_b
5614 WHERE list_header_id = p_list_header_id;
5615
5616 l_end_date date;
5617 l_start_date DATE;
5618
5619 CURSOR c_adv_options_exist(l_list_header_id NUMBER) IS
5620 SELECT 1
5621 FROM DUAL
5622 WHERE EXISTS (SELECT 1
5623 FROM qp_list_lines
5624 WHERE list_header_id = l_list_header_id);
5625
5626 CURSOR c_adv_options(l_list_header_id NUMBER) IS
5627 SELECT pricing_phase_id,print_on_invoice_flag,incompatibility_grp_code,pricing_group_sequence,product_precedence
5628 FROM qp_list_lines
5629 WHERE list_header_id = l_list_header_id;
5630
5631 l_adv_options_exist NUMBER;
5632
5633 BEGIN
5634 x_return_status := Fnd_Api.g_ret_sts_success;
5635 l_override_flag := FND_PROFILE.value('OZF_OFFR_OVERRIDE_FLAG');
5636 l_list_header_id := p_modifier_line_tbl(p_modifier_line_tbl.last).list_header_id;
5637
5638 OPEN cur_get_discount_level(l_list_header_id);
5639 FETCH cur_get_discount_level into l_discount_level;
5640 CLOSE cur_get_discount_level;
5641 OPEN cur_get_offer_enddate(l_list_header_id);
5642 FETCH cur_get_offer_enddate into l_start_date, l_end_date;
5643 CLOSE cur_get_offer_enddate;
5644
5645 IF l_discount_level = 'LINEGROUP' THEN
5646 NULL;
5647 ELSIF l_discount_level = 'LINE' THEN
5648 NULL;
5649 ELSIF l_discount_level = 'ORDER' THEN
5650 NULL;
5651 ELSE
5652 l_discount_level := 'LINEGROUP';
5653 END IF;
5654
5655 FOR j in p_modifier_line_tbl.first..p_modifier_line_tbl.last LOOP
5656 IF p_modifier_line_tbl.exists(j) THEN
5657 debug_message('ListLineTypeCode is :'||p_modifier_line_tbl(j).list_line_type_code);
5658 -- RAISE Fnd_Api.g_exc_error;
5659 -- all tiers will be passed as PBH even though some of them are actually Tiers
5660 IF p_modifier_line_tbl(j).list_line_type_code <> 'PBH' THEN
5661 i := i+1;
5662
5663 l_map_table(j).orig_row := j;
5664 l_map_table(j).new_row := i;
5665
5666 l_modifiers_tbl(i).operation := p_modifier_line_tbl(j).operation;
5667 --l_modifiers_tbl(i).list_header_id := p_modifier_line_tbl(j).list_header_id;
5668 l_modifiers_tbl(i).list_header_id := l_list_header_id;
5669 l_modifiers_tbl(i).list_line_id := p_modifier_line_tbl(j).list_line_id;
5670 l_modifiers_tbl(i).list_line_no := p_modifier_line_tbl(j).list_line_no;
5671 l_modifiers_tbl(i).price_by_formula_id := p_modifier_line_tbl(j).price_by_formula_id;
5672
5673 -- rssharma added flex field on 26-Nov-2002
5674 l_modifiers_tbl(i).attribute1 := p_modifier_line_tbl(j).attribute1;
5675 l_modifiers_tbl(i).attribute2 := p_modifier_line_tbl(j).attribute2;
5676 l_modifiers_tbl(i).attribute3 := p_modifier_line_tbl(j).attribute3;
5677 l_modifiers_tbl(i).attribute4 := p_modifier_line_tbl(j).attribute4;
5678 l_modifiers_tbl(i).attribute5 := p_modifier_line_tbl(j).attribute5;
5679 l_modifiers_tbl(i).attribute6 := p_modifier_line_tbl(j).attribute6;
5680 l_modifiers_tbl(i).attribute7 := p_modifier_line_tbl(j).attribute7;
5681 l_modifiers_tbl(i).attribute8 := p_modifier_line_tbl(j).attribute8;
5682 l_modifiers_tbl(i).attribute9 := p_modifier_line_tbl(j).attribute9;
5683 l_modifiers_tbl(i).attribute10 := p_modifier_line_tbl(j).attribute10;
5684 l_modifiers_tbl(i).attribute11 := p_modifier_line_tbl(j).attribute11;
5685 l_modifiers_tbl(i).attribute12 := p_modifier_line_tbl(j).attribute12;
5686 l_modifiers_tbl(i).attribute13 := p_modifier_line_tbl(j).attribute13;
5687 l_modifiers_tbl(i).attribute14 := p_modifier_line_tbl(j).attribute14;
5688 l_modifiers_tbl(i).attribute15 := p_modifier_line_tbl(j).attribute15;
5689 l_modifiers_tbl(i).context := p_modifier_line_tbl(j).context;
5690 -- gramanat added start_date_active
5691 l_modifiers_tbl(i).start_date_active := p_modifier_line_tbl(j).start_date_active;
5692 l_modifiers_tbl(i).end_date_active := p_modifier_line_tbl(j).end_date_active;
5693 -- end change on 26-Nov-2002
5694
5695 IF p_modifier_line_tbl(j).operation = 'CREATE' THEN
5696 l_modifiers_tbl(i).proration_type_code := 'N';
5697 l_modifiers_tbl(i).modifier_level_code := l_discount_level;
5698 l_modifiers_tbl(i).automatic_flag := 'Y';
5699 -- get advanced options
5700 OPEN c_adv_options_exist(p_modifier_line_tbl(1).list_header_id);
5701 FETCH c_adv_options_exist INTO l_adv_options_exist;
5702 CLOSE c_adv_options_exist;
5703
5704 IF l_adv_options_exist IS NULL THEN
5705 IF l_discount_level = 'LINEGROUP' THEN
5706 l_modifiers_tbl(i).pricing_phase_id := FND_PROFILE.value('OZF_PRICING_PHASE_LINEGROUP');
5707 -- IF l_modifiers_tbl(i).pricing_phase_id <> 3 THEN
5708 -- l_modifiers_tbl(i).pricing_phase_id := 3;
5709 -- END IF;
5710 ELSIF l_discount_level = 'LINE' THEN
5711 l_modifiers_tbl(i).pricing_phase_id := FND_PROFILE.value('OZF_PRICING_PHASE_LINE');
5712 -- IF l_modifiers_tbl(i).pricing_phase_id <> 2 THEN
5713 -- l_modifiers_tbl(i).pricing_phase_id := 2;
5714 -- END IF;
5715 ELSIF l_discount_level = 'ORDER' THEN
5716 l_modifiers_tbl(i).pricing_phase_id := FND_PROFILE.value('OZF_PRICING_PHASE_ORDER');
5717 -- IF l_modifiers_tbl(i).pricing_phase_id <> 4 THEN
5718 -- l_modifiers_tbl(i).pricing_phase_id := 4;
5719 -- END IF;
5720 ELSE
5721 l_modifiers_tbl(i).pricing_phase_id := FND_PROFILE.value('OZF_PRICING_PHASE_LINEGROUP');
5722 -- IF l_modifiers_tbl(i).pricing_phase_id <> 3 THEN
5723 -- l_modifiers_tbl(i).pricing_phase_id := 3;
5724 -- END IF;
5725 END IF;
5726
5727 l_modifiers_tbl(i).print_on_invoice_flag := FND_PROFILE.value('OZF_PRINT_ON_INVOICE');
5728
5729 IF p_parent_offer_type = 'DEAL' THEN
5730 l_modifiers_tbl(i).incompatibility_grp_code := NULL;
5731 ELSE
5732 l_modifiers_tbl(i).incompatibility_grp_code := FND_PROFILE.value('OZF_INCOMPATIBILITY_GROUP');
5733 END IF;
5734
5735 IF l_discount_level <> 'ORDER' THEN
5736 l_modifiers_tbl(i).pricing_group_sequence := FND_PROFILE.value('OZF_PRICING_GROUP_SEQUENCE');
5737 -- IF l_modifiers_tbl(i).pricing_group_sequence <> 1 THEN
5738 -- l_modifiers_tbl(i).pricing_group_sequence := 1;
5739 -- END IF;
5740 END IF;
5741
5742 l_modifiers_tbl(i).product_precedence := FND_PROFILE.value('OZF_PRODUCT_PRECEDENCE');
5743
5744 ELSE
5745 OPEN c_adv_options(p_modifier_line_tbl(1).list_header_id);
5746 FETCH c_adv_options INTO l_modifiers_tbl(i).pricing_phase_id,l_modifiers_tbl(i).print_on_invoice_flag,l_modifiers_tbl(i).incompatibility_grp_code,l_modifiers_tbl(i).pricing_group_sequence,l_modifiers_tbl(i).product_precedence;
5747 CLOSE c_adv_options;
5748
5749 END IF; -- end advanced options
5750 END IF; -- end operation
5751
5752 -- common code irrespective of operation so moved it outside
5753 /* IF p_modifier_line_tbl(j).inactive_flag = 'N' THEN
5754 IF l_start_date IS NOT NULL THEN
5755 l_modifiers_tbl(i).end_date_active := l_start_date;
5756 ELSIF l_end_date IS NOT NULL THEN
5757 l_modifiers_tbl(i).end_date_active := LEAST(l_end_date, SYSDATE);
5758 ELSE
5759 l_modifiers_tbl(i).end_date_active := SYSDATE;
5760 END IF;
5761 --l_modifiers_tbl(i).end_date_active := least(nvl(l_end_date,sysdate-1),sysdate);
5762 ELSE
5763 null;
5764 -- l_modifiers_tbl(i).end_date_active := NULL;
5765 END IF;
5766 */
5767 IF p_offer_type = 'OFF_INVOICE' OR p_offer_type = 'VOLUME_OFFER' THEN
5768 l_modifiers_tbl(i).arithmetic_operator := p_modifier_line_tbl(j).arithmetic_operator;
5769 l_modifiers_tbl(i).operand := p_modifier_line_tbl(j).operand;
5770 l_modifiers_tbl(i).list_line_type_code := 'DIS';
5771 l_modifiers_tbl(i).override_flag := l_override_flag;
5772 l_modifiers_tbl(i).accrual_flag := 'N';
5773 ELSIF p_offer_type = 'ACCRUAL' THEN
5774 l_modifiers_tbl(i).list_line_type_code := 'DIS';
5775 l_modifiers_tbl(i).override_flag := l_override_flag;
5776
5777 IF p_modifier_line_tbl(j).arithmetic_operator not in ('%','AMT','LUMPSUM','NEWPRICE') THEN
5778 l_modifiers_tbl(i).benefit_qty := p_modifier_line_tbl(j).operand;
5779 l_modifiers_tbl(i).benefit_uom_code := p_modifier_line_tbl(j).benefit_uom_code;
5780 l_modifiers_tbl(i).operand := p_modifier_line_tbl(j).operand;
5781 l_modifiers_tbl(i).arithmetic_operator := 'AMT';
5782 l_modifiers_tbl(i).estim_accrual_rate := 1;
5783 l_modifiers_tbl(i).accrual_conversion_rate := 1;
5784 ELSE
5785 l_modifiers_tbl(i).benefit_qty := null;
5786 l_modifiers_tbl(i).benefit_uom_code := null;
5787 l_modifiers_tbl(i).operand := p_modifier_line_tbl(j).operand;
5788 l_modifiers_tbl(i).arithmetic_operator := p_modifier_line_tbl(j).arithmetic_operator;
5789 END IF;
5790 l_modifiers_tbl(i).accrual_flag := 'Y';
5791
5792 ELSIF p_offer_type = 'TERMS' THEN
5793 l_modifiers_tbl(i).list_line_type_code := 'TSN';
5794 l_modifiers_tbl(i).override_flag := 'N'; -- overriding is not supported
5795 l_modifiers_tbl(i).substitution_context := 'TERMS';
5796 l_modifiers_tbl(i).pricing_phase_id := 2;
5797 l_modifiers_tbl(i).modifier_level_code := 'LINE';
5798 l_modifiers_tbl(i).substitution_attribute := p_modifier_line_tbl(j).substitution_attr;
5799 l_modifiers_tbl(i).substitution_value := p_modifier_line_tbl(j).substitution_val;
5800 l_modifiers_tbl(i).estim_gl_value := p_modifier_line_tbl(j).estim_gl_value;
5801 END IF; -- end offer_type
5802
5803 l_pricing_attr_tbl(i).pricing_attribute_id := p_modifier_line_tbl(j).pricing_attribute_id;
5804 l_pricing_attr_tbl(i).product_attribute_context := 'ITEM';
5805 l_pricing_attr_tbl(i).product_attribute := p_modifier_line_tbl(j).product_attr;
5806 l_pricing_attr_tbl(i).product_attr_value := p_modifier_line_tbl(j).product_attr_val;
5807
5808 IF p_modifier_line_tbl(j).pricing_attr = 'PRICING_ATTRIBUTE10' THEN--if volume_type is qty
5809 IF p_modifier_line_tbl(j).product_uom_code is not null and p_modifier_line_tbl(j).product_uom_code <> FND_API.g_miss_char THEN
5810 l_pricing_attr_tbl(i).product_uom_code := p_modifier_line_tbl(j).product_uom_code;
5811 l_modifiers_tbl(i).price_break_type_code := 'POINT';
5812 l_pricing_attr_tbl(i).pricing_attribute_context := 'VOLUME';
5813 l_pricing_attr_tbl(i).pricing_attribute := p_modifier_line_tbl(j).pricing_attr;
5814 l_pricing_attr_tbl(i).pricing_attr_value_from := p_modifier_line_tbl(j).pricing_attr_value_from;
5815 IF p_modifier_line_tbl(j).operation <> 'CREATE' THEN
5816 l_pricing_attr_tbl(i).pricing_attr_value_to := p_modifier_line_tbl(j).pricing_attr_value_to;
5817 END IF;
5818 l_pricing_attr_tbl(i).comparison_operator_code := 'BETWEEN';
5819 ELSIF (p_parent_offer_type<>'DEAL') AND (p_modifier_line_tbl(j).product_uom_code is null --fix for bug 5969719
5820 OR p_modifier_line_tbl(j).product_uom_code = FND_API.g_miss_char
5821 ) AND
5822 ((p_modifier_line_tbl(j).pricing_attr_value_from is not null
5823 AND p_modifier_line_tbl(j).pricing_attr_value_from <> FND_API.g_miss_num) OR
5824 (p_modifier_line_tbl(j).pricing_attr is not null
5825 AND p_modifier_line_tbl(j).pricing_attr <> FND_API.g_miss_char))
5826 THEN
5827 FND_MESSAGE.SET_NAME('OZF','OZF_UOM_QTY_REQD');
5828
5829 Fnd_Msg_Pub.ADD;
5830 RAISE FND_API.G_EXC_ERROR;
5831 END IF;
5832 ELSE -- volume type is amount
5833 l_pricing_attr_tbl(i).product_uom_code := p_modifier_line_tbl(j).product_uom_code;
5834 l_modifiers_tbl(i).price_break_type_code := 'POINT';
5835 l_pricing_attr_tbl(i).pricing_attribute_context := 'VOLUME';
5836 l_pricing_attr_tbl(i).pricing_attribute := p_modifier_line_tbl(j).pricing_attr;
5837 l_pricing_attr_tbl(i).pricing_attr_value_from := p_modifier_line_tbl(j).pricing_attr_value_from;
5838 IF p_modifier_line_tbl(j).operation <> 'CREATE' THEN
5839 l_pricing_attr_tbl(i).pricing_attr_value_to := p_modifier_line_tbl(j).pricing_attr_value_to;
5840 END IF;
5841 l_pricing_attr_tbl(i).comparison_operator_code := 'BETWEEN';
5842 END IF;
5843
5844
5845 l_pricing_attr_tbl(i).modifiers_index := i;
5846 l_pricing_attr_tbl(i).list_line_id := p_modifier_line_tbl(j).list_line_id;
5847 l_pricing_attr_tbl(i).operation := p_modifier_line_tbl(j).operation;
5848
5849
5850 IF p_modifier_line_tbl(j).order_value_from <> fnd_api.g_miss_char and
5851 p_modifier_line_tbl(j).order_value_from is not null THEN
5852
5853 -- This fragment only appears in the detail detail page. Assuming list line id is available.
5854 IF p_modifier_line_tbl(j).qualifier_id = fnd_api.g_miss_num THEN
5855 l_qualifiers_tbl(i).operation := 'CREATE';
5856 l_qualifiers_tbl(i).qualifier_id := fnd_api.g_miss_num;
5857 ELSIF p_modifier_line_tbl(j).order_value_from is not null or p_modifier_line_tbl(j).order_value_to is not null THEN
5858 l_qualifiers_tbl(i).qualifier_id := p_modifier_line_tbl(j).qualifier_id;
5859 l_qualifiers_tbl(i).operation := 'UPDATE';
5860 ELSIF p_modifier_line_tbl(j).order_value_from is null and p_modifier_line_tbl(j).order_value_to is null THEN
5861 l_qualifiers_tbl(i).qualifier_id := p_modifier_line_tbl(j).qualifier_id;
5862 l_qualifiers_tbl(i).operation := 'DELETE';
5863 END IF;
5864
5865 -- julou list_header_id is passed to qualifier otherwise copy API will not copy
5866 -- order_value_from and order_value_to
5867 l_qualifiers_tbl(i).list_header_id := p_modifier_line_tbl(j).list_header_id;
5868 l_qualifiers_tbl(i).list_line_id := p_modifier_line_tbl(j).list_line_id;
5869 l_qualifiers_tbl(i).qualifier_context := 'VOLUME';
5870 l_qualifiers_tbl(i).qualifier_attribute := 'QUALIFIER_ATTRIBUTE10';
5871 l_qualifiers_tbl(i).qualifier_attr_value := p_modifier_line_tbl(j).order_value_from;
5872 IF p_modifier_line_tbl(j).order_value_to is not null and p_modifier_line_tbl(j).order_value_to <> FND_API.g_miss_char THEN
5873 l_qualifiers_tbl(i).qualifier_attr_value_to := p_modifier_line_tbl(j).order_value_to;
5874 ELSE
5875 l_qualifiers_tbl(i).qualifier_attr_value_to := FND_API.g_miss_char;
5876 END IF;
5877 l_qualifiers_tbl(i).comparison_operator_code := 'BETWEEN';
5878 l_qualifiers_tbl(i).qualifier_grouping_no := 1;
5879
5880 END IF;
5881
5882 ELSE
5883 l_tier_count := l_tier_count + 1;
5884
5885 l_map_table(j).orig_row := j;
5886 l_map_table(j).tier_row := l_tier_count;
5887
5888 tiers_modifier_line_tbl(l_tier_count) := p_modifier_line_tbl(j);
5889 END IF;
5890
5891 END IF;
5892 debug_message('ListLineTypeCode is :'||p_modifier_line_tbl(j).list_line_type_code);
5893 END LOOP;
5894 -- RAISE Fnd_Api.g_exc_error;
5895
5896 IF l_modifiers_tbl.count > 0 THEN -- bug 3711957. when processing PBH, l_modifiers_tbl is empty
5897 QP_Modifiers_PUB.process_modifiers(
5898 p_api_version_number => 1.0,
5899 p_init_msg_list => FND_API.G_FALSE,
5900 p_return_values => FND_API.G_FALSE,
5901 x_return_status => x_return_status,
5902 x_msg_count => x_msg_count,
5903 x_msg_data => x_msg_data,
5904 p_modifiers_tbl => l_modifiers_tbl,
5905 p_pricing_attr_tbl => l_pricing_attr_tbl,
5906 p_qualifiers_tbl => l_qualifiers_tbl,
5907 x_modifier_list_rec => v_modifier_list_rec,
5908 x_modifier_list_val_rec => v_modifier_list_val_rec,
5909 x_modifiers_tbl => v_modifiers_tbl,
5910 x_modifiers_val_tbl => v_modifiers_val_tbl,
5911 x_qualifiers_tbl => v_qualifiers_tbl,
5912 x_qualifiers_val_tbl => v_qualifiers_val_tbl,
5913 x_pricing_attr_tbl => v_pricing_attr_tbl,
5914 x_pricing_attr_val_tbl => v_pricing_attr_val_tbl
5915 );
5916
5917 IF x_return_status <> Fnd_Api.g_ret_sts_success THEN
5918 IF v_modifiers_tbl.COUNT > 0 THEN
5919 FOR k IN v_modifiers_tbl.first..v_modifiers_tbl.last LOOP
5920 IF v_modifiers_tbl.EXISTS(k) THEN
5921 IF v_modifiers_tbl(k).return_status <> Fnd_Api.g_ret_sts_success THEN
5922 FOR t in l_map_table.first..l_map_table.last LOOP
5923 IF l_map_table.exists(t) THEN
5924 IF l_map_table(t).new_row = k THEN
5925 x_error_location := l_map_table(t).orig_row;
5926 EXIT;
5927 END IF;
5928 END IF;
5929 END LOOP;
5930 END IF;
5931 END IF;
5932 END LOOP;
5933 END IF;
5934 END IF;
5935
5936 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
5937 add_message(x_msg_count);
5938 RAISE Fnd_Api.g_exc_error;
5939 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
5940 add_message(x_msg_count);
5941 RAISE Fnd_Api.g_exc_unexpected_error;
5942 END IF;
5943
5944 x_modifiers_tbl := v_modifiers_tbl;
5945 END IF; -- end bug 3711957
5946 ---Process Limits
5947 /*#############################################################################
5948 When processing Terms upgrade type of discounts limit information could come
5949 during creation. The list_line_id might have been created in the above call.
5950 So Have to check for creation and set list line id accordingly. There will be
5951 no 'PBH' type of records for Terms Substitution.
5952 ##############################################################################*/
5953
5954 IF p_offer_type = 'TERMS' THEN
5955
5956 FOR limit_index in p_modifier_line_tbl.first..p_modifier_line_tbl.last LOOP
5957 IF p_modifier_line_tbl.exists(limit_index) THEN
5958 IF p_modifier_line_tbl(limit_index).operation = 'CREATE' THEN
5959 p_list_line_id := v_modifiers_tbl(limit_index).list_line_id;
5960 ELSE
5961 p_list_line_id := p_modifier_line_tbl(limit_index).list_line_id;
5962 END IF;
5963 process_limits
5964 (
5965 x_return_status => x_return_status
5966 ,x_msg_count => x_msg_count
5967 ,x_msg_data => x_msg_data
5968 ,p_limit_type =>'MAX_ORDERS_PER_CUSTOMER'
5969 ,p_limit_amount => p_modifier_line_tbl(limit_index).max_orders_per_customer
5970 ,p_list_line_id => p_list_line_id
5971 ,p_list_header_id => p_modifier_line_tbl(limit_index).list_header_id
5972 ,p_limit_id => p_modifier_line_tbl(limit_index).max_orders_per_customer_id
5973 );
5974
5975 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
5976 x_error_location := limit_index;
5977 RAISE Fnd_Api.g_exc_error;
5978 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
5979 x_error_location := limit_index;
5980 RAISE Fnd_Api.g_exc_unexpected_error;
5981 END IF;
5982
5983 END IF;
5984 END LOOP;
5985
5986 END IF;
5987
5988
5989 IF tiers_modifier_line_tbl.count > 0 THEN
5990 process_header_tiers
5991 (
5992 x_return_status => x_return_status,
5993 x_msg_count => x_msg_count,
5994 x_msg_data => x_msg_data,
5995 p_offer_type => p_offer_type,
5996 p_modifier_line_tbl => tiers_modifier_line_tbl,
5997 x_modifiers_tbl => x_modifiers_tbl,
5998 x_error_location => x_error_location
5999 );
6000
6001 END IF;
6002
6003 IF x_return_status <> Fnd_Api.g_ret_sts_success THEN
6004 FOR t in l_map_table.first..l_map_table.last LOOP
6005 IF l_map_table.exists(t) THEN
6006 IF l_map_table(t).tier_row = x_error_location THEN
6007 x_error_location := l_map_table(t).orig_row;
6008 EXIT;
6009 END IF;
6010 END IF;
6011 END LOOP;
6012 END IF;
6013
6014 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
6015 RAISE Fnd_Api.g_exc_error;
6016 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
6017 RAISE Fnd_Api.g_exc_unexpected_error;
6018 END IF;
6019
6020 /*#############################################################################
6021 For Off Invoice and Accruals, Limit information comes only
6022 through a details page. i.e List_line_id will have a value as part of the record.
6023 When a trade deal is created, the same procedure will be called twice, Once for
6024 Off Invoice and Once for Accrual. If it is trade deal limits will not be processed
6025 through here.
6026 #############################################################################*/
6027
6028 IF p_parent_offer_type <> 'DEAL' THEN
6029
6030 IF p_offer_type IN ('OFF_INVOICE','ACCRUAL') THEN
6031
6032 --nirprasa
6033 FOR limit_index in p_modifier_line_tbl.first..p_modifier_line_tbl.last LOOP
6034 IF p_modifier_line_tbl.exists(limit_index) THEN
6035
6036 p_list_line_id := p_modifier_line_tbl(limit_index).list_line_id;
6037
6038 IF p_modifier_line_tbl(limit_index).operation = 'CREATE'
6039 AND v_modifiers_tbl.exists(limit_index) THEN
6040
6041 p_list_line_id := v_modifiers_tbl(limit_index).list_line_id;
6042
6043 ELSE
6044
6045 p_list_line_id := p_modifier_line_tbl(limit_index).list_line_id;
6046
6047 END IF;
6048
6049 -- IF p_modifier_line_tbl(limit_index).limit_exceed_action_code IS NOT NULL
6050 -- OR p_modifier_line_tbl(limit_index).limit_exceed_action_code <> FND_API.G_MISS_CHAR THEN
6051
6052 process_limits
6053 (
6054 x_return_status => x_return_status
6055 ,x_msg_count => x_msg_count
6056 ,x_msg_data => x_msg_data
6057 ,p_limit_type => 'MAX_QTY_PER_ORDER'
6058 ,p_limit_amount => p_modifier_line_tbl(limit_index).max_qty_per_order
6059 ,p_list_line_id => p_list_line_id
6060 ,p_list_header_id => p_modifier_line_tbl(limit_index).list_header_id
6061 ,p_limit_id => p_modifier_line_tbl(limit_index).max_qty_per_order_id
6062 );
6063
6064
6065 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
6066 x_error_location := limit_index;
6067 RAISE Fnd_Api.g_exc_error;
6068 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
6069 x_error_location := limit_index;
6070 RAISE Fnd_Api.g_exc_unexpected_error;
6071 END IF;
6072
6073 process_limits
6074 (
6075 x_return_status => x_return_status
6076 ,x_msg_count => x_msg_count
6077 ,x_msg_data => x_msg_data
6078 ,p_limit_type =>'MAX_QTY_PER_CUSTOMER'
6079 ,p_limit_amount => p_modifier_line_tbl(limit_index).max_qty_per_customer
6080 ,p_list_line_id => p_modifier_line_tbl(limit_index).list_line_id
6081 ,p_list_header_id => p_modifier_line_tbl(limit_index).list_header_id
6082 ,p_limit_id => p_modifier_line_tbl(limit_index).max_qty_per_customer_id
6083 );
6084
6085 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
6086 x_error_location := limit_index;
6087 RAISE Fnd_Api.g_exc_error;
6088 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
6089 x_error_location := limit_index;
6090 RAISE Fnd_Api.g_exc_unexpected_error;
6091 END IF;
6092
6093 IF g_sd_offer = 'Y' THEN
6094 process_limits
6095 (
6096 x_return_status => x_return_status
6097 ,x_msg_count => x_msg_count
6098 ,x_msg_data => x_msg_data
6099 ,p_limit_type => 'MAX_QTY_PER_RULE'
6100 ,p_limit_amount => p_modifier_line_tbl(limit_index).max_qty_per_rule
6101 ,p_list_line_id => p_list_line_id
6102 ,p_list_header_id => p_modifier_line_tbl(p_modifier_line_tbl.last).list_header_id
6103 ,p_limit_id => p_modifier_line_tbl(limit_index).max_qty_per_rule_id
6104 ,p_limit_exceed_action_code => p_modifier_line_tbl(limit_index).limit_exceed_action_code
6105 );
6106 ELSE
6107 process_limits
6108 (
6109 x_return_status => x_return_status
6110 ,x_msg_count => x_msg_count
6111 ,x_msg_data => x_msg_data
6112 ,p_limit_type =>'MAX_QTY_PER_RULE'
6113 ,p_limit_amount => p_modifier_line_tbl(limit_index).max_qty_per_rule
6114 ,p_list_line_id => p_modifier_line_tbl(limit_index).list_line_id
6115 ,p_list_header_id => p_modifier_line_tbl(limit_index).list_header_id
6116 ,p_limit_id => p_modifier_line_tbl(limit_index).max_qty_per_rule_id
6117 );
6118
6119 END IF;
6120
6121 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
6122 x_error_location := limit_index;
6123 RAISE Fnd_Api.g_exc_error;
6124 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
6125 x_error_location := limit_index;
6126 RAISE Fnd_Api.g_exc_unexpected_error;
6127 END IF;
6128
6129 process_limits
6130 (
6131 x_return_status => x_return_status
6132 ,x_msg_count => x_msg_count
6133 ,x_msg_data => x_msg_data
6134 ,p_limit_type =>'MAX_ORDERS_PER_CUSTOMER'
6135 ,p_limit_amount => p_modifier_line_tbl(limit_index).max_orders_per_customer
6136 ,p_list_line_id => p_modifier_line_tbl(limit_index).list_line_id
6137 ,p_list_header_id => p_modifier_line_tbl(limit_index).list_header_id
6138 ,p_limit_id => p_modifier_line_tbl(limit_index).max_orders_per_customer_id
6139 );
6140
6141 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
6142 x_error_location := limit_index;
6143 RAISE Fnd_Api.g_exc_error;
6144 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
6145 x_error_location := limit_index;
6146 RAISE Fnd_Api.g_exc_unexpected_error;
6147 END IF;
6148
6149 process_limits
6150 (
6151 x_return_status => x_return_status
6152 ,x_msg_count => x_msg_count
6153 ,x_msg_data => x_msg_data
6154 ,p_limit_type =>'MAX_AMOUNT_PER_RULE'
6155 ,p_limit_amount => p_modifier_line_tbl(limit_index).max_amount_per_rule
6156 ,p_list_line_id => p_modifier_line_tbl(limit_index).list_line_id
6157 ,p_list_header_id => p_modifier_line_tbl(limit_index).list_header_id
6158 ,p_limit_id => p_modifier_line_tbl(limit_index).max_amount_per_rule_id
6159 );
6160
6161 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
6162 x_error_location := limit_index;
6163 RAISE Fnd_Api.g_exc_error;
6164 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
6165 x_error_location := limit_index;
6166 RAISE Fnd_Api.g_exc_unexpected_error;
6167 END IF;
6168
6169 END IF;
6170 END LOOP;
6171
6172 END IF;
6173
6174 END IF;
6175
6176 Fnd_Msg_Pub.Count_AND_Get
6177 ( p_count => x_msg_count,
6178 p_data => x_msg_data,
6179 p_encoded => Fnd_Api.G_FALSE
6180 );
6181
6182 EXCEPTION
6183 WHEN Fnd_Api.G_EXC_ERROR THEN
6184 x_return_status := Fnd_Api.g_ret_sts_error ;
6185 Fnd_Msg_Pub.Count_AND_Get
6186 ( p_count => x_msg_count,
6187 p_data => x_msg_data,
6188 p_encoded => Fnd_Api.G_FALSE
6189 );
6190 WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
6191 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
6192 Fnd_Msg_Pub.Count_AND_Get
6193 ( p_count => x_msg_count,
6194 p_data => x_msg_data,
6195 p_encoded => Fnd_Api.G_FALSE
6196 );
6197 WHEN OTHERS THEN
6198 x_return_status := Fnd_Api.g_ret_sts_unexp_erroR ;
6199 IF Fnd_Msg_Pub.Check_Msg_Level ( Fnd_Msg_Pub.G_MSG_LVL_UNEXP_ERROR )
6200 THEN
6201 Fnd_Msg_Pub.Add_Exc_Msg( G_PKG_NAME,l_api_name);
6202 END IF;
6203 Fnd_Msg_Pub.Count_AND_Get
6204 ( p_count => x_msg_count,
6205 p_data => x_msg_data,
6206 p_encoded => Fnd_Api.G_FALSE
6207 );
6208 END;
6209
6210
6211 PROCEDURE activate_offer
6212 (
6213 x_return_status OUT NOCOPY VARCHAR2
6214 ,x_msg_count OUT NOCOPY NUMBER
6215 ,x_msg_data OUT NOCOPY VARCHAR2
6216 ,p_qp_list_header_id IN NUMBER
6217 ,p_new_status_id IN NUMBER
6218 )IS
6219
6220 l_api_version CONSTANT NUMBER := 1.0;
6221 l_api_name CONSTANT VARCHAR2(30) := 'activate_offer';
6222 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
6223
6224 l_offer_rec modifier_list_rec_type;
6225 l_amount_error VARCHAR2(1);
6226 l_offer_type VARCHAR2(30);
6227
6228 CURSOR cur_get_ozf_offers IS
6229 SELECT OFFER_ID
6230 , QP_LIST_HEADER_ID
6231 , OFFER_TYPE
6232 , OFFER_CODE
6233 , REUSABLE
6234 , CUSTOM_SETUP_ID
6235 , USER_STATUS_ID
6236 , OWNER_ID
6237 , OBJECT_VERSION_NUMBER
6238 , PERF_DATE_FROM
6239 , PERF_DATE_TO
6240 , STATUS_CODE
6241 , STATUS_DATE
6242 , ORDER_VALUE_DISCOUNT_TYPE
6243 , MODIFIER_LEVEL_CODE
6244 , OFFER_AMOUNT
6245 , LUMPSUM_AMOUNT
6246 , LUMPSUM_PAYMENT_TYPE
6247 , DISTRIBUTION_TYPE
6248 , BUDGET_AMOUNT_FC
6249 , BUDGET_AMOUNT_TC
6250 , TRANSACTION_CURRENCY_CODE
6251 , FUNCTIONAL_CURRENCY_CODE
6252 , ACTIVITY_MEDIA_ID
6253 , BREAK_TYPE
6254 FROM ozf_offers
6255 WHERE qp_list_header_id = p_qp_list_header_id;
6256
6257 CURSOR c_approved_amount(l_id NUMBER) IS
6258 SELECT nvl(sum(approved_amount),0)
6259 FROM ozf_act_budgets
6260 WHERE arc_act_budget_used_by = 'OFFR'
6261 AND act_budget_used_by_id = l_id;
6262
6263 l_status_code varchar2(30);
6264 l_approved_amount number;
6265 l_recal VARCHAR2(1);
6266 BEGIN
6267
6268 SAVEPOINT activate_offer_api;
6269
6270 x_return_status := FND_API.g_ret_sts_success;
6271
6272 l_status_code := OZF_Utility_PVT.get_system_status_code(p_new_status_id);
6273
6274 OPEN cur_get_ozf_offers;
6275 FETCH cur_get_ozf_offers
6276 INTO l_offer_rec.OFFER_ID
6277 ,l_offer_rec.QP_LIST_HEADER_ID
6278 ,l_offer_rec.OFFER_TYPE
6279 ,l_offer_rec.OFFER_CODE
6280 ,l_offer_rec.REUSABLE
6281 ,l_offer_rec.CUSTOM_SETUP_ID
6282 ,l_offer_rec.USER_STATUS_ID
6283 ,l_offer_rec.OWNER_ID
6284 ,l_offer_rec.OBJECT_VERSION_NUMBER
6285 ,l_offer_rec.PERF_DATE_FROM
6286 ,l_offer_rec.PERF_DATE_TO
6287 ,l_offer_rec.STATUS_CODE
6288 ,l_offer_rec.STATUS_DATE
6289 ,l_offer_rec.ORDER_VALUE_DISCOUNT_TYPE
6290 ,l_offer_rec.MODIFIER_LEVEL_CODE
6291 ,l_offer_rec.OFFER_AMOUNT
6292 ,l_offer_rec.LUMPSUM_AMOUNT
6293 ,l_offer_rec.LUMPSUM_PAYMENT_TYPE
6294 ,l_offer_rec.DISTRIBUTION_TYPE
6295 ,l_offer_rec.BUDGET_AMOUNT_FC
6296 ,l_offer_rec.BUDGET_AMOUNT_TC
6297 ,l_offer_rec.TRANSACTION_CURRENCY_CODE
6298 ,l_offer_rec.FUNCTIONAL_CURRENCY_CODE
6299 ,l_offer_rec.ACTIVITY_MEDIA_ID
6300 ,l_offer_rec.BREAK_TYPE;
6301 CLOSE cur_get_ozf_offers;
6302
6303 IF p_new_status_id = OZF_Utility_PVT.get_default_user_status('OZF_OFFER_STATUS','ACTIVE')
6304 AND l_offer_rec.CUSTOM_SETUP_ID = 118 THEN
6305
6306 update ozf_sd_request_headers_all_b set user_status_id= OZF_Utility_PVT.get_default_user_status('OZF_SD_REQUEST_STATUS','ACTIVE')
6307 where offer_id= l_offer_rec.qp_list_header_id;
6308
6309 END IF;
6310
6311 IF l_status_code <> 'ACTIVE' THEN
6312
6313 UPDATE ozf_offers
6314 SET status_code = l_status_code,
6315 status_date = SYSDATE,
6316 object_version_number = object_version_number + 1,
6317 user_status_id = p_new_status_id
6318 WHERE qp_list_header_id = p_qp_list_header_id;
6319
6320
6321
6322 IF l_offer_rec.CUSTOM_SETUP_ID = 118 THEN
6323 IF p_new_status_id = OZF_Utility_PVT.get_default_user_status('OZF_OFFER_STATUS','DENIED_TA')
6324 OR p_new_status_id = OZF_Utility_PVT.get_default_user_status('OZF_OFFER_STATUS','REJECTED') THEN
6325
6326 update ozf_sd_request_headers_all_b set user_status_id= OZF_Utility_PVT.get_default_user_status('OZF_SD_REQUEST_STATUS','OFFER_REJECTED')
6327 where offer_id= l_offer_rec.qp_list_header_id;
6328
6329 END IF;
6330
6331
6332 END IF;
6333
6334 IF SQL%NOTFOUND THEN
6335 RAISE Fnd_Api.g_exc_unexpected_error;
6336 END IF;
6337
6338 RETURN;
6339
6340 END IF;
6341
6342
6343
6344 activate_offer_over(
6345 p_init_msg_list => FND_API.g_false
6346 ,p_api_version => l_api_version
6347 ,p_commit => FND_API.G_FALSE
6348 ,x_return_status => x_return_status
6349 ,x_msg_count => x_msg_count
6350 ,x_msg_data => x_msg_data
6351 ,p_offer_rec => l_offer_rec
6352 ,p_called_from => 'B'
6353 ,x_amount_error => l_amount_error
6354 );
6355
6356 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
6357 RAISE Fnd_Api.g_exc_error;
6358 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
6359 RAISE Fnd_Api.g_exc_unexpected_error;
6360 END IF;
6361
6362 l_recal := FND_PROFILE.VALUE('OZF_BUDGET_ADJ_ALLOW_RECAL');
6363 -- update status according to recal flag
6364 UPDATE ozf_offers
6365 SET status_code = DECODE(l_amount_error, 'Y', DECODE(l_recal, 'N', 'PENDING_ACTIVE', 'Y', 'DRAFT'), 'N', 'ACTIVE'),
6366 status_date = SYSDATE,
6367 object_version_number = object_version_number + 1,
6368 user_status_id = decode(l_amount_error, 'Y', OZF_Utility_PVT.get_default_user_status('OZF_OFFER_STATUS', DECODE(l_recal, 'N', 'PENDING_ACTIVE', 'Y', 'DRAFT')),'N', p_new_status_id)
6369 WHERE qp_list_header_id = p_qp_list_header_id;
6370
6371 /*
6372 -- julou if recal = 'N' if approved>committed -> active otherwise pending_active
6373 IF l_recal = 'N' THEN
6374 UPDATE ozf_offers
6375 SET status_code = decode(l_amount_error,'Y','PENDING_ACTIVE','N','ACTIVE'),
6376 status_date = SYSDATE,
6377 object_version_number = object_version_number + 1,
6378 user_status_id = decode(l_amount_error,'Y',OZF_Utility_PVT.get_default_user_status('OZF_OFFER_STATUS','PENDING_ACTIVE'),'N',p_new_status_id)
6379 WHERE qp_list_header_id = p_qp_list_header_id;
6380 ELSIF FND_PROFILE.VALUE('OZF_BUDGET_ADJ_ALLOW_RECAL') = 'Y' THEN
6381 -- if recal='N' if approved>0 -> active(no status change) otherwise draft
6382 OPEN c_approved_amount(p_qp_list_header_id);
6383 FETCH c_approved_amount INTO l_approved_amount;
6384 CLOSE c_approved_amount;
6385
6386 IF l_approved_amount <= 0 THEN
6387 UPDATE ozf_offers
6388 SET status_code = 'DRAFT',
6389 status_date = SYSDATE,
6390 object_version_number = object_version_number + 1,
6391 user_status_id = OZF_Utility_PVT.get_default_user_status('OZF_OFFER_STATUS','DRAFT')
6392 WHERE qp_list_header_id = p_qp_list_header_id;
6393 END IF;
6394 END IF;
6395 */
6396 IF l_amount_error = 'N' THEN -- update qp to active only when validation passes
6397 IF l_offer_rec.offer_type NOT IN('LUMPSUM', 'SCAN_DATA', 'NET_ACCRUAL') THEN
6398 UPDATE qp_list_headers_b
6399 SET active_flag = 'Y'
6400 WHERE list_header_id = p_qp_list_header_id;
6401
6402 UPDATE qp_qualifiers
6403 SET active_flag='Y'
6404 WHERE list_header_id = p_qp_list_header_id;
6405 END IF;
6406 END IF;
6407 EXCEPTION
6408 WHEN Fnd_Api.G_EXC_ERROR THEN
6409 x_return_status := Fnd_Api.g_ret_sts_error ;
6410 ROLLBACK TO activate_offer_api;
6411 Fnd_Msg_Pub.Count_AND_Get
6412 ( p_count => x_msg_count,
6413 p_data => x_msg_data,
6414 p_encoded => Fnd_Api.G_FALSE
6415 );
6416 WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
6417 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
6418 ROLLBACK TO activate_offer_api;
6419 Fnd_Msg_Pub.Count_AND_Get
6420 ( p_count => x_msg_count,
6421 p_data => x_msg_data,
6422 p_encoded => Fnd_Api.G_FALSE
6423 );
6424 WHEN OTHERS THEN
6425 x_return_status := Fnd_Api.g_ret_sts_unexp_erroR ;
6426 ROLLBACK TO activate_offer_api;
6427 IF Fnd_Msg_Pub.Check_Msg_Level ( Fnd_Msg_Pub.G_MSG_LVL_UNEXP_ERROR )
6428 THEN
6429 Fnd_Msg_Pub.Add_Exc_Msg( G_PKG_NAME,l_api_name);
6430 END IF;
6431 Fnd_Msg_Pub.Count_AND_Get
6432 ( p_count => x_msg_count,
6433 p_data => x_msg_data,
6434 p_encoded => Fnd_Api.G_FALSE
6435 );
6436 END;
6437
6438
6439 PROCEDURE process_order_value
6440 (
6441 x_return_status OUT NOCOPY VARCHAR2
6442 ,x_msg_count OUT NOCOPY NUMBER
6443 ,x_msg_data OUT NOCOPY VARCHAR2
6444 ,p_modifier_line_tbl IN MODIFIER_LINE_TBL_TYPE
6445 , x_modifiers_tbl OUT NOCOPY qp_modifiers_pub.modifiers_tbl_type
6446 ,x_error_location OUT NOCOPY NUMBER
6447 ) IS
6448
6449 l_api_version CONSTANT NUMBER := 1.0;
6450 l_api_name CONSTANT VARCHAR2(30) := 'process_order_value';
6451 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
6452
6453 l_modifiers_tbl Qp_Modifiers_Pub.modifiers_tbl_type;
6454 l_qualifiers_tbl qp_qualifier_rules_pub.qualifiers_tbl_type;
6455 v_modifier_list_rec qp_modifiers_pub.modifier_list_rec_type;
6456 v_modifier_list_val_rec qp_modifiers_pub.modifier_list_val_rec_type;
6457 v_modifiers_tbl qp_modifiers_pub.modifiers_tbl_type;
6458 v_modifiers_val_tbl qp_modifiers_pub.modifiers_val_tbl_type;
6459 v_qualifiers_tbl qp_qualifier_rules_pub.qualifiers_tbl_type;
6460 v_qualifiers_val_tbl qp_qualifier_rules_pub.qualifiers_val_tbl_type;
6461 v_pricing_attr_tbl qp_modifiers_pub.pricing_attr_tbl_type;
6462 v_pricing_attr_val_tbl qp_modifiers_pub.pricing_attr_val_tbl_type;
6463
6464 p_list_line_id NUMBER;
6465 CURSOR cur_get_discount_level(p_list_header_id NUMBER) IS
6466 SELECT modifier_level_code
6467 FROM ozf_offers
6468 WHERE qp_list_header_id = p_list_header_id;
6469
6470 CURSOR cur_get_ov_discount_type(p_list_header_id NUMBER) IS
6471 SELECT order_value_discount_type
6472 FROM ozf_offers
6473 WHERE qp_list_header_id = p_list_header_id;
6474
6475
6476 CURSOR cur_get_offer_enddate(p_list_header_id NUMBER) IS
6477 SELECT start_date_active, end_date_active
6478 FROM qp_list_headers_b
6479 WHERE list_header_id = p_list_header_id;
6480
6481 l_discount_level VARCHAR2(30);
6482 l_order_value_discount_type VARCHAR2(30);
6483 l_pricing_phase_id NUMBER;
6484 l_list_header_id NUMBER;
6485
6486 CURSOR c_adv_options_exist(l_list_header_id NUMBER) IS
6487 SELECT 1
6488 FROM DUAL
6489 WHERE EXISTS (SELECT 1
6490 FROM qp_list_lines
6491 WHERE list_header_id = l_list_header_id);
6492
6493 CURSOR c_adv_options(l_list_header_id NUMBER) IS
6494 SELECT pricing_phase_id,print_on_invoice_flag,incompatibility_grp_code,pricing_group_sequence,product_precedence
6495 FROM qp_list_lines
6496 WHERE list_header_id = l_list_header_id;
6497
6498 l_adv_options_exist NUMBER;
6499 l_override_flag VARCHAR2(1);
6500 l_end_date DATE;
6501 l_start_date DATE;
6502 BEGIN
6503 x_return_status := Fnd_Api.g_ret_sts_success;
6504 l_override_flag := FND_PROFILE.value('OZF_OFFR_OVERRIDE_FLAG');
6505 l_list_header_id := p_modifier_line_tbl(p_modifier_line_tbl.last).list_header_id;
6506
6507 OPEN cur_get_discount_level(l_list_header_id);
6508 FETCH cur_get_discount_level into l_discount_level;
6509 CLOSE cur_get_discount_level;
6510
6511 OPEN cur_get_offer_enddate(l_list_header_id);
6512 FETCH cur_get_offer_enddate into l_start_date, l_end_date;
6513 CLOSE cur_get_offer_enddate;
6514
6515 IF l_discount_level = 'LINEGROUP' THEN
6516 NULL;
6517 ELSIF l_discount_level = 'LINE' THEN
6518 NULL;
6519 ELSIF l_discount_level = 'ORDER' THEN
6520 NULL;
6521 ELSE
6522 l_discount_level := 'LINEGROUP';
6523 END IF;
6524
6525
6526 FOR i in p_modifier_line_tbl.first..p_modifier_line_tbl.last LOOP
6527 IF p_modifier_line_tbl.exists(i) THEN
6528
6529 l_modifiers_tbl(i).operation := p_modifier_line_tbl(i).operation;
6530 l_modifiers_tbl(i).list_header_id := p_modifier_line_tbl(i).list_header_id;
6531 l_modifiers_tbl(i).list_line_id := p_modifier_line_tbl(i).list_line_id;
6532
6533 OPEN cur_get_ov_discount_type(l_list_header_id);
6534 FETCH cur_get_ov_discount_type into l_order_value_discount_type;
6535 CLOSE cur_get_ov_discount_type;
6536
6537 IF p_modifier_line_tbl(i).operation = 'CREATE' THEN
6538
6539 l_modifiers_tbl(i).proration_type_code := 'N';
6540 l_modifiers_tbl(i).print_on_invoice_flag := 'Y';
6541 l_modifiers_tbl(i).modifier_level_code := l_discount_level;
6542 l_modifiers_tbl(i).price_break_type_code := 'POINT';
6543 l_modifiers_tbl(i).automatic_flag := 'Y';
6544 IF l_order_value_discount_type = 'AMT' OR l_order_value_discount_type = 'DIS' THEN
6545 l_modifiers_tbl(i).list_line_type_code := 'DIS';
6546 ELSE
6547 l_modifiers_tbl(i).list_line_type_code := l_order_value_discount_type;
6548 END IF;
6549 l_modifiers_tbl(i).override_flag := l_override_flag;
6550
6551 -- get advanced options
6552 OPEN c_adv_options_exist(p_modifier_line_tbl(1).list_header_id);
6553 FETCH c_adv_options_exist INTO l_adv_options_exist;
6554 CLOSE c_adv_options_exist;
6555
6556 IF l_adv_options_exist IS NULL THEN
6557 IF l_discount_level = 'LINEGROUP' THEN
6558 l_modifiers_tbl(i).pricing_phase_id := FND_PROFILE.value('OZF_PRICING_PHASE_LINEGROUP');
6559 -- IF l_modifiers_tbl(i).pricing_phase_id <> 3 THEN
6560 -- l_modifiers_tbl(i).pricing_phase_id := 3;
6561 -- END IF;
6562 ELSIF l_discount_level = 'LINE' THEN
6563 l_modifiers_tbl(i).pricing_phase_id := FND_PROFILE.value('OZF_PRICING_PHASE_LINE');
6564 -- IF l_modifiers_tbl(i).pricing_phase_id <> 2 THEN
6565 -- l_modifiers_tbl(i).pricing_phase_id := 2;
6566 -- END IF;
6567 ELSIF l_discount_level = 'ORDER' THEN
6568 l_modifiers_tbl(i).pricing_phase_id := FND_PROFILE.value('OZF_PRICING_PHASE_ORDER');
6569 -- IF l_modifiers_tbl(i).pricing_phase_id <> 4 THEN
6570 -- l_modifiers_tbl(i).pricing_phase_id := 4;
6571 -- END IF;
6572 ELSE
6573 l_modifiers_tbl(i).pricing_phase_id := FND_PROFILE.value('OZF_PRICING_PHASE_LINEGROUP');
6574 -- IF l_modifiers_tbl(i).pricing_phase_id <> 3 THEN
6575 -- l_modifiers_tbl(i).pricing_phase_id := 3;
6576 -- END IF;
6577 END IF;
6578
6579 l_modifiers_tbl(i).print_on_invoice_flag := FND_PROFILE.value('OZF_PRINT_ON_INVOICE');
6580 l_modifiers_tbl(i).incompatibility_grp_code := FND_PROFILE.value('OZF_INCOMPATIBILITY_GROUP');
6581
6582 IF l_discount_level <> 'ORDER' THEN
6583 l_modifiers_tbl(i).pricing_group_sequence := FND_PROFILE.value('OZF_PRICING_GROUP_SEQUENCE');
6584 -- IF l_modifiers_tbl(i).pricing_group_sequence <>1 THEN
6585 -- l_modifiers_tbl(i).pricing_group_sequence := 1;
6586 -- END IF;
6587 END IF;
6588
6589 l_modifiers_tbl(i).product_precedence := FND_PROFILE.value('OZF_PRODUCT_PRECEDENCE');
6590
6591 ELSE
6592 OPEN c_adv_options(p_modifier_line_tbl(1).list_header_id);
6593 FETCH c_adv_options INTO l_modifiers_tbl(i).pricing_phase_id,l_modifiers_tbl(i).print_on_invoice_flag,l_modifiers_tbl(i).incompatibility_grp_code,l_modifiers_tbl(i).pricing_group_sequence,l_modifiers_tbl(i).product_precedence;
6594 CLOSE c_adv_options;
6595 END IF;
6596 -- end advanced options
6597
6598 END IF;
6599
6600 IF l_order_value_discount_type = 'DIS' THEN
6601 l_modifiers_tbl(i).override_flag := l_override_flag;
6602 l_modifiers_tbl(i).arithmetic_operator := '%';
6603 l_modifiers_tbl(i).operand := p_modifier_line_tbl(i).operand;
6604 ELSIF l_order_value_discount_type = 'AMT' THEN
6605 l_modifiers_tbl(i).override_flag := l_override_flag;
6606 l_modifiers_tbl(i).arithmetic_operator := 'AMT';
6607 l_modifiers_tbl(i).operand := p_modifier_line_tbl(i).operand;
6608 END IF;
6609
6610 IF p_modifier_line_tbl(i).list_line_type_code = 'TSN' THEN
6611 l_modifiers_tbl(i).override_flag := l_override_flag;
6612 l_modifiers_tbl(i).substitution_context := 'TERMS';
6613 l_modifiers_tbl(i).modifier_level_code := l_discount_level;
6614 -- l_modifiers_tbl(i).pricing_phase_id := 2;
6615 l_modifiers_tbl(i).substitution_attribute := p_modifier_line_tbl(i).substitution_attr;
6616 l_modifiers_tbl(i).substitution_value := p_modifier_line_tbl(i).substitution_val;
6617 l_modifiers_tbl(i).estim_gl_value := p_modifier_line_tbl(i).estim_gl_value;
6618 END IF;
6619
6620 l_modifiers_tbl(i).start_date_active := p_modifier_line_tbl(i).start_date_active;
6621 l_modifiers_tbl(i).end_date_active := p_modifier_line_tbl(i).end_date_active;
6622
6623 IF p_modifier_line_tbl(i).inactive_flag = 'N' THEN
6624 IF l_start_date IS NOT NULL THEN
6625 l_modifiers_tbl(i).end_date_active := GREATEST(l_start_date, SYSDATE);
6626 ELSIF l_end_date IS NOT NULL THEN
6627 l_modifiers_tbl(i).end_date_active := LEAST(l_end_date, SYSDATE);
6628 ELSE
6629 l_modifiers_tbl(i).end_date_active := SYSDATE;
6630 END IF;
6631 --l_modifiers_tbl(i).end_date_active := least(nvl(l_end_date,sysdate-1),sysdate);
6632 ELSE
6633 l_modifiers_tbl(i).end_date_active := p_modifier_line_tbl(i).end_date_active;
6634 END IF;
6635
6636 END IF;
6637 -- rssharma added flex field on 15-Apr-2003
6638 l_modifiers_tbl(i).attribute1 := p_modifier_line_tbl(i).attribute1;
6639 l_modifiers_tbl(i).attribute2 := p_modifier_line_tbl(i).attribute2;
6640 l_modifiers_tbl(i).attribute3 := p_modifier_line_tbl(i).attribute3;
6641 l_modifiers_tbl(i).attribute4 := p_modifier_line_tbl(i).attribute4;
6642 l_modifiers_tbl(i).attribute5 := p_modifier_line_tbl(i).attribute5;
6643 l_modifiers_tbl(i).attribute6 := p_modifier_line_tbl(i).attribute6;
6644 l_modifiers_tbl(i).attribute7 := p_modifier_line_tbl(i).attribute7;
6645 l_modifiers_tbl(i).attribute8 := p_modifier_line_tbl(i).attribute8;
6646 l_modifiers_tbl(i).attribute9 := p_modifier_line_tbl(i).attribute9;
6647 l_modifiers_tbl(i).attribute10 := p_modifier_line_tbl(i).attribute10;
6648 l_modifiers_tbl(i).attribute11 := p_modifier_line_tbl(i).attribute11;
6649 l_modifiers_tbl(i).attribute12 := p_modifier_line_tbl(i).attribute12;
6650 l_modifiers_tbl(i).attribute13 := p_modifier_line_tbl(i).attribute13;
6651 l_modifiers_tbl(i).attribute14 := p_modifier_line_tbl(i).attribute14;
6652 l_modifiers_tbl(i).attribute15 := p_modifier_line_tbl(i).attribute15;
6653 l_modifiers_tbl(i).context := p_modifier_line_tbl(i).context;
6654 -- end change on 15-Apr-2003
6655 debug_message('ENdDateActive is :'||l_modifiers_tbl(i).end_date_active);
6656 END LOOP;
6657
6658 QP_Modifiers_PUB.process_modifiers(
6659 p_api_version_number => 1.0,
6660 p_init_msg_list => FND_API.G_FALSE,
6661 p_return_values => FND_API.G_FALSE,
6662 x_return_status => x_return_status,
6663 x_msg_count => x_msg_count,
6664 x_msg_data => x_msg_data,
6665 p_modifiers_tbl => l_modifiers_tbl,
6666 x_modifier_list_rec => v_modifier_list_rec,
6667 x_modifier_list_val_rec => v_modifier_list_val_rec,
6668 x_modifiers_tbl => v_modifiers_tbl,
6669 x_modifiers_val_tbl => v_modifiers_val_tbl,
6670 x_qualifiers_tbl => v_qualifiers_tbl,
6671 x_qualifiers_val_tbl => v_qualifiers_val_tbl,
6672 x_pricing_attr_tbl => v_pricing_attr_tbl,
6673 x_pricing_attr_val_tbl => v_pricing_attr_val_tbl
6674 );
6675 x_modifiers_tbl := v_modifiers_tbl;
6676
6677 IF x_return_status <> Fnd_Api.g_ret_sts_success THEN
6678 IF v_modifiers_tbl.COUNT > 0 THEN
6679 FOR k IN v_modifiers_tbl.first..v_modifiers_tbl.last LOOP
6680 IF v_modifiers_tbl.EXISTS(k) THEN
6681 IF v_modifiers_tbl(k).return_status <> Fnd_Api.g_ret_sts_success THEN
6682 x_error_location := k;
6683 EXIT;
6684 END IF;
6685 END IF;
6686 END LOOP;
6687 END IF;
6688 END IF;
6689
6690 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
6691 add_message(x_msg_count);
6692 RAISE Fnd_Api.g_exc_error;
6693 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
6694 add_message(x_msg_count);
6695 RAISE Fnd_Api.g_exc_unexpected_error;
6696 END IF;
6697 FOR i in p_modifier_line_tbl.first..p_modifier_line_tbl.last LOOP
6698 IF p_modifier_line_tbl.exists(i) THEN
6699
6700
6701 l_qualifiers_tbl(i).qualifier_id := p_modifier_line_tbl(i).qualifier_id;
6702 l_qualifiers_tbl(i).list_header_id := p_modifier_line_tbl(i).list_header_id; -- list_header_id for order value discount
6703 l_qualifiers_tbl(i).list_line_id := v_modifiers_tbl(i).list_line_id;
6704 l_qualifiers_tbl(i).qualifier_context := 'VOLUME';
6705 l_qualifiers_tbl(i).qualifier_attribute := 'QUALIFIER_ATTRIBUTE10';
6706 l_qualifiers_tbl(i).qualifier_attr_value := p_modifier_line_tbl(i).order_value_from;
6707 IF p_modifier_line_tbl(i).order_value_to IS NOT NULL AND
6708 p_modifier_line_tbl(i).order_value_to <> FND_API.g_miss_char THEN
6709 l_qualifiers_tbl(i).qualifier_attr_value_to := p_modifier_line_tbl(i).order_value_to;
6710 ELSE
6711 l_qualifiers_tbl(i).qualifier_attr_value_to := FND_API.g_miss_char;
6712 END IF;
6713 l_qualifiers_tbl(i).comparison_operator_code := 'BETWEEN';
6714 l_qualifiers_tbl(i).qualifier_grouping_no := 1;
6715 l_qualifiers_tbl(i).operation := p_modifier_line_tbl(i).operation;
6716
6717 END IF;
6718
6719 END LOOP;
6720
6721
6722 QP_Modifiers_PUB.process_modifiers(
6723 p_api_version_number => 1.0,
6724 p_init_msg_list => FND_API.G_FALSE,
6725 p_return_values => FND_API.G_FALSE,
6726 x_return_status => x_return_status,
6727 x_msg_count => x_msg_count,
6728 x_msg_data => x_msg_data,
6729 p_qualifiers_tbl => l_qualifiers_tbl,
6730 x_modifier_list_rec => v_modifier_list_rec,
6731 x_modifier_list_val_rec => v_modifier_list_val_rec,
6732 x_modifiers_tbl => v_modifiers_tbl,
6733 x_modifiers_val_tbl => v_modifiers_val_tbl,
6734 x_qualifiers_tbl => v_qualifiers_tbl,
6735 x_qualifiers_val_tbl => v_qualifiers_val_tbl,
6736 x_pricing_attr_tbl => v_pricing_attr_tbl,
6737 x_pricing_attr_val_tbl => v_pricing_attr_val_tbl
6738 );
6739
6740 IF x_return_status <> Fnd_Api.g_ret_sts_success THEN
6741 IF v_qualifiers_tbl.COUNT > 0 THEN
6742 FOR k IN v_qualifiers_tbl.first..v_qualifiers_tbl.last LOOP
6743 IF v_qualifiers_tbl.EXISTS(k) THEN
6744 IF v_qualifiers_tbl(k).return_status <> Fnd_Api.g_ret_sts_success THEN
6745 x_error_location := k;
6746 EXIT;
6747 END IF;
6748 END IF;
6749 END LOOP;
6750 END IF;
6751 END IF;
6752
6753 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
6754 add_message(x_msg_count);
6755 RAISE Fnd_Api.g_exc_error;
6756 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
6757 add_message(x_msg_count);
6758 RAISE Fnd_Api.g_exc_unexpected_error;
6759 END IF;
6760
6761 -- The following code is commented for now. If we decide that we need limits
6762 -- for order value type of discounts, we will open this code up.
6763
6764 /* FOR limit_index in p_modifier_line_tbl.first..p_modifier_line_tbl.last LOOP
6765
6766 IF p_modifier_line_tbl.exists(limit_index) THEN
6767
6768 IF p_modifier_line_tbl(limit_index).operation = 'CREATE' THEN
6769 p_list_line_id := v_modifiers_tbl(limit_index).list_line_id;
6770 ELSE
6771 p_list_line_id := p_modifier_line_tbl(limit_index).list_line_id;
6772 END IF;
6773
6774 IF p_modifier_line_tbl(limit_index).list_line_type_code = 'TSN' THEN
6775 process_limits
6776 (
6777 x_return_status => x_return_status
6778 ,x_msg_count => x_msg_count
6779 ,x_msg_data => x_msg_data
6780 ,p_limit_type =>'MAX_ORDERS_PER_CUSTOMER'
6781 ,p_limit_amount => p_modifier_line_tbl(limit_index).max_orders_per_customer
6782 ,p_list_line_id => p_list_line_id
6783 ,p_list_header_id => p_modifier_line_tbl(limit_index).list_header_id
6784 ,p_limit_id => p_modifier_line_tbl(limit_index).max_orders_per_customer_id
6785 );
6786 ELSIF p_modifier_line_tbl(limit_index).list_line_type_code = 'DIS' THEN
6787 process_limits
6788 (
6789 x_return_status => x_return_status
6790 ,x_msg_count => x_msg_count
6791 ,x_msg_data => x_msg_data
6792 ,p_limit_type =>'MAX_AMOUNT_PER_RULE'
6793 ,p_limit_amount => p_modifier_line_tbl(limit_index).max_amount_per_rule
6794 ,p_list_line_id => p_list_line_id
6795 ,p_list_header_id => p_modifier_line_tbl(limit_index).list_header_id
6796 ,p_limit_id => p_modifier_line_tbl(limit_index).max_amount_per_rule_id
6797 );
6798 END IF;
6799
6800 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
6801 x_error_location := limit_index;
6802 RAISE Fnd_Api.g_exc_error;
6803 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
6804 x_error_location := limit_index;
6805 RAISE Fnd_Api.g_exc_unexpected_error;
6806 END IF;
6807
6808 END IF;
6809 END LOOP; */
6810
6811 Fnd_Msg_Pub.Count_AND_Get
6812 ( p_count => x_msg_count,
6813 p_data => x_msg_data,
6814 p_encoded => Fnd_Api.G_FALSE
6815 );
6816
6817 EXCEPTION
6818 WHEN Fnd_Api.G_EXC_ERROR THEN
6819 x_return_status := Fnd_Api.g_ret_sts_error ;
6820 Fnd_Msg_Pub.Count_AND_Get
6821 ( p_count => x_msg_count,
6822 p_data => x_msg_data,
6823 p_encoded => Fnd_Api.G_FALSE
6824 );
6825 WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
6826 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
6827 Fnd_Msg_Pub.Count_AND_Get
6828 ( p_count => x_msg_count,
6829 p_data => x_msg_data,
6830 p_encoded => Fnd_Api.G_FALSE
6831 );
6832 WHEN OTHERS THEN
6833 x_return_status := Fnd_Api.g_ret_sts_unexp_erroR ;
6834 IF Fnd_Msg_Pub.Check_Msg_Level ( Fnd_Msg_Pub.G_MSG_LVL_UNEXP_ERROR )
6835 THEN
6836 Fnd_Msg_Pub.Add_Exc_Msg( G_PKG_NAME,l_api_name);
6837 END IF;
6838 Fnd_Msg_Pub.Count_AND_Get
6839 ( p_count => x_msg_count,
6840 p_data => x_msg_data,
6841 p_encoded => Fnd_Api.G_FALSE
6842 );
6843 END;
6844
6845
6846 PROCEDURE validate_lumpsum_offer
6847 (
6848 p_init_msg_list IN VARCHAR2
6849 ,x_return_status OUT NOCOPY VARCHAR2
6850 ,x_msg_count OUT NOCOPY NUMBER
6851 ,x_msg_data OUT NOCOPY VARCHAR2
6852 ,p_qp_list_header_id IN NUMBER
6853 )IS
6854
6855 l_api_version CONSTANT NUMBER := 1.0;
6856 l_api_name CONSTANT VARCHAR2(30) := 'validate_lumpsum_offer';
6857 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
6858
6859 CURSOR cur_get_lumpsum_details IS
6860 SELECT status_code,lumpsum_amount,object_version_number,distribution_type,qp_list_header_id,offer_id
6861 FROM ozf_offers
6862 WHERE qp_list_header_id = p_qp_list_header_id;
6863
6864 l_lumpsum_offer cur_get_lumpsum_details%rowtype;
6865
6866 CURSOR cur_get_lumpsum_line_details IS
6867 SELECT nvl(sum(line_lumpsum_qty),0)
6868 FROM ams_act_products
6869 WHERE ARC_ACT_PRODUCT_USED_BY = 'OFFR'
6870 AND ACT_PRODUCT_USED_BY_ID = p_qp_list_header_id;
6871
6872 l_total_distribution NUMBER;
6873
6874 BEGIN
6875 x_return_status := Fnd_Api.g_ret_sts_success;
6876
6877 OPEN cur_get_lumpsum_details;
6878 FETCH cur_get_lumpsum_details INTO l_lumpsum_offer;
6879 CLOSE cur_get_lumpsum_details;
6880
6881 OPEN cur_get_lumpsum_line_details;
6882 FETCH cur_get_lumpsum_line_details INTO l_total_distribution;
6883 CLOSE cur_get_lumpsum_line_details;
6884
6885 IF l_lumpsum_offer.distribution_type = 'AMT' THEN
6886 IF l_lumpsum_offer.STATUS_CODE = 'PENDING' OR l_lumpsum_offer.STATUS_CODE = 'ACTIVE' THEN
6887
6888 IF l_total_distribution <> l_lumpsum_offer.lumpsum_amount THEN
6889 FND_MESSAGE.SET_NAME('OZF','OZF_INVALID_DISTR_ACTIVE');
6890 Fnd_Msg_Pub.ADD;
6891 RAISE FND_API.G_EXC_ERROR;
6892 END IF;
6893
6894 ELSE
6895
6896 IF l_total_distribution > l_lumpsum_offer.lumpsum_amount THEN
6897 FND_MESSAGE.SET_NAME('OZF','OZF_INVALID_DISTRIBUTION');
6898 Fnd_Msg_Pub.ADD;
6899 RAISE FND_API.G_EXC_ERROR;
6900 END IF;
6901
6902 END IF;
6903
6904 ELSIF l_lumpsum_offer.distribution_type = '%' THEN
6905
6906 IF l_lumpsum_offer.STATUS_CODE = 'PENDING' OR l_lumpsum_offer.STATUS_CODE = 'ACTIVE' THEN
6907
6908 IF l_total_distribution <> 100 THEN
6909 FND_MESSAGE.SET_NAME('OZF','OZF_INVALID_DISTR_ACTIVE');
6910 Fnd_Msg_Pub.ADD;
6911 RAISE FND_API.G_EXC_ERROR;
6912 END IF;
6913
6914
6915 ELSE
6916
6917 IF l_total_distribution > 100 THEN
6918 FND_MESSAGE.SET_NAME('OZF','OZF_INVALID_DISTRIBUTION');
6919 Fnd_Msg_Pub.ADD;
6920 RAISE FND_API.G_EXC_ERROR;
6921 END IF;
6922
6923 END IF;
6924
6925 END IF;
6926
6927 Fnd_Msg_Pub.Count_AND_Get
6928 ( p_count => x_msg_count,
6929 p_data => x_msg_data,
6930 p_encoded => Fnd_Api.G_FALSE
6931 );
6932
6933 EXCEPTION
6934 WHEN Fnd_Api.G_EXC_ERROR THEN
6935 x_return_status := Fnd_Api.g_ret_sts_error ;
6936 Fnd_Msg_Pub.Count_AND_Get
6937 ( p_count => x_msg_count,
6938 p_data => x_msg_data,
6939 p_encoded => Fnd_Api.G_FALSE
6940 );
6941 WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
6942 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
6943 Fnd_Msg_Pub.Count_AND_Get
6944 ( p_count => x_msg_count,
6945 p_data => x_msg_data,
6946 p_encoded => Fnd_Api.G_FALSE
6947 );
6948 WHEN OTHERS THEN
6949 x_return_status := Fnd_Api.g_ret_sts_unexp_erroR ;
6950 IF Fnd_Msg_Pub.Check_Msg_Level ( Fnd_Msg_Pub.G_MSG_LVL_UNEXP_ERROR )
6951 THEN
6952 Fnd_Msg_Pub.Add_Exc_Msg( G_PKG_NAME,l_api_name);
6953 END IF;
6954 Fnd_Msg_Pub.Count_AND_Get
6955 ( p_count => x_msg_count,
6956 p_data => x_msg_data,
6957 p_encoded => Fnd_Api.G_FALSE
6958 );
6959
6960 END;
6961
6962
6963 -------------------------------------------------
6964 -- Start of Comments
6965 --
6966 -- NAME
6967 -- check_pg_reqd_items
6968 --
6969 -- PURPOSE
6970 -- Checks the required items for Promotional goods offers
6971 --
6972 -- IN
6973 -- p_modifier_line_tbl IN MODIFIER_LINE_TBL_TYPE
6974 --
6975 -- OUT
6976 -- x_return_status OUT VARCHAR2,
6977 -- x_msg_count OUT NUMBER,
6978 -- x_msg_data OUT VARCHAR2,
6979 -- x_error_location OUT NUMBER
6980 --
6981 -- NOTES
6982 --
6983 -- HISTORY
6984 -- Mon Aug 09 2004:5/30 PM RSSHARMA Created
6985 -- End of Comments
6986 -------------------------------------------------
6987
6988 PROCEDURE check_pg_reqd_items(
6989 x_return_status OUT NOCOPY VARCHAR2
6990 ,x_msg_count OUT NOCOPY NUMBER
6991 ,x_msg_data OUT NOCOPY VARCHAR2
6992 ,p_modifier_line_tbl IN MODIFIER_LINE_TBL_TYPE
6993 ,x_error_location OUT NOCOPY NUMBER
6994 )
6995 IS
6996 BEGIN
6997 FOR i IN p_modifier_line_tbl.first..p_modifier_line_tbl.last LOOP
6998 IF (p_modifier_line_tbl(i).PRODUCT_ATTR_VAL IS NULL OR p_modifier_line_tbl(i).PRODUCT_ATTR_VAL = FND_API.g_miss_char)
6999 OR
7000 ( p_modifier_line_tbl(i).PRODUCT_ATTR IS NULL OR p_modifier_line_tbl(i).PRODUCT_ATTR = FND_API.g_miss_char )
7001 THEN
7002 OZF_Utility_PVT.error_message('OZF_OFFR_ITEM_REQD');
7003 x_return_status := Fnd_Api.g_ret_sts_error;
7004 END IF;
7005 END LOOP;
7006 END check_pg_reqd_items;
7007
7008
7009 PROCEDURE process_promotional_goods
7010 (
7011 x_return_status OUT NOCOPY VARCHAR2
7012 ,x_msg_count OUT NOCOPY NUMBER
7013 ,x_msg_data OUT NOCOPY VARCHAR2
7014 ,p_modifier_line_tbl IN MODIFIER_LINE_TBL_TYPE
7015 ,x_modifiers_tbl OUT NOCOPY qp_modifiers_pub.modifiers_tbl_type
7016 ,x_error_location OUT NOCOPY NUMBER
7017 ) IS
7018
7019 l_api_version CONSTANT NUMBER := 1.0;
7020 l_api_name CONSTANT VARCHAR2(30) := 'process_promotional_goods';
7021 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
7022
7023 tiers_modifier_line_tbl MODIFIER_LINE_TBL_TYPE;
7024 p_list_line_id NUMBER;
7025 l_modifiers_tbl Qp_Modifiers_Pub.modifiers_tbl_type;
7026 l_pricing_attr_tbl Qp_Modifiers_Pub.pricing_attr_tbl_type;
7027 v_modifier_list_rec qp_modifiers_pub.modifier_list_rec_type;
7028 v_modifier_list_val_rec qp_modifiers_pub.modifier_list_val_rec_type;
7029 v_modifiers_tbl qp_modifiers_pub.modifiers_tbl_type;
7030 v_modifiers_val_tbl qp_modifiers_pub.modifiers_val_tbl_type;
7031 v_qualifiers_tbl qp_qualifier_rules_pub.qualifiers_tbl_type;
7032 v_qualifiers_val_tbl qp_qualifier_rules_pub.qualifiers_val_tbl_type;
7033 v_pricing_attr_tbl qp_modifiers_pub.pricing_attr_tbl_type;
7034 v_pricing_attr_val_tbl qp_modifiers_pub.pricing_attr_val_tbl_type;
7035 l_control_rec qp_globals.control_rec_type;
7036
7037 l_modifier_parent_index NUMBER := 0;
7038 l_list_header_id NUMBER;
7039 l_related_modifier_id NUMBER := 0;
7040
7041 CURSOR cur_get_PRG_line_id(p_list_header_id NUMBER) IS
7042 SELECT list_line_id
7043 FROM qp_list_lines
7044 WHERE list_header_id = p_list_header_id
7045 AND list_line_type_code = 'PRG';
7046
7047 l_use_modifier_index boolean;
7048
7049 CURSOR cur_get_discount_level(p_list_header_id NUMBER) IS
7050 SELECT modifier_level_code
7051 FROM ozf_offers
7052 WHERE qp_list_header_id = p_list_header_id;
7053
7054 l_discount_level VARCHAR2(30);
7055 l_pricing_phase_id NUMBER;
7056
7057 CURSOR c_adv_options_exist(l_list_header_id NUMBER) IS
7058 SELECT 1
7059 FROM DUAL
7060 WHERE EXISTS (SELECT 1
7061 FROM qp_list_lines
7062 WHERE list_header_id = l_list_header_id);
7063
7064 CURSOR c_adv_options(l_list_header_id NUMBER) IS
7065 SELECT pricing_phase_id,print_on_invoice_flag,incompatibility_grp_code,pricing_group_sequence,product_precedence
7066 FROM qp_list_lines
7067 WHERE list_header_id = l_list_header_id;
7068
7069 l_adv_options_exist NUMBER;
7070
7071 CURSOR c_get_break_type(l_list_header_id NUMBER) IS
7072 SELECT break_type
7073 FROM ozf_offers
7074 WHERE qp_list_header_id = l_list_header_id;
7075
7076 CURSOR cur_get_offer_enddate(p_list_header_id NUMBER) IS
7077 SELECT start_date_active, end_date_active
7078 FROM qp_list_headers_b
7079 WHERE list_header_id = p_list_header_id;
7080
7081 l_break_type VARCHAR2(30);
7082 l_end_date DATE;
7083 l_start_date DATE;
7084 BEGIN
7085 x_return_status := Fnd_Api.g_ret_sts_success;
7086
7087 l_list_header_id := p_modifier_line_tbl(p_modifier_line_tbl.first).list_header_id;
7088
7089 OPEN cur_get_PRG_line_id(l_list_header_id);
7090 FETCH cur_get_prg_line_id INTO l_related_modifier_id;
7091 CLOSE cur_get_PRG_line_id;
7092
7093
7094 OPEN cur_get_offer_enddate(l_list_header_id);
7095 FETCH cur_get_offer_enddate into l_start_date, l_end_date;
7096 CLOSE cur_get_offer_enddate;
7097
7098 IF nvl(l_related_modifier_id,0) = 0 THEN
7099 l_use_modifier_index := TRUE;
7100 ELSE
7101 l_use_modifier_index := FALSE;
7102 END IF;
7103
7104 OPEN cur_get_discount_level(l_list_header_id);
7105 FETCH cur_get_discount_level into l_discount_level;
7106 CLOSE cur_get_discount_level;
7107
7108 IF l_discount_level = 'LINEGROUP' THEN
7109 NULL;
7110 ELSIF l_discount_level = 'LINE' THEN
7111 NULL;
7112 ELSIF l_discount_level = 'ORDER' THEN
7113 NULL;
7114 ELSE
7115 l_discount_level := 'LINEGROUP';
7116 END IF;
7117
7118 OPEN c_get_break_type(l_list_header_id);
7119 FETCH c_get_break_type INTO l_break_type;
7120 CLOSE c_get_break_type;
7121
7122 FOR i IN p_modifier_line_tbl.first..p_modifier_line_tbl.last LOOP
7123
7124 IF p_modifier_line_tbl.exists(i) THEN
7125
7126 l_modifiers_tbl(i).operation := p_modifier_line_tbl(i).operation;
7127 l_modifiers_tbl(i).list_header_id := p_modifier_line_tbl(i).list_header_id;
7128 l_modifiers_tbl(i).list_line_id := p_modifier_line_tbl(i).list_line_id;
7129 l_modifiers_tbl(i).override_flag := 'N'; -- overriding is not supported
7130
7131 IF p_modifier_line_tbl(i).operation = 'CREATE' THEN
7132 check_pg_reqd_items(
7133 x_return_status => x_return_status
7134 ,x_msg_count => x_msg_count
7135 ,x_msg_data => x_msg_data
7136 ,p_modifier_line_tbl => p_modifier_line_tbl
7137 ,x_error_location => x_error_location
7138 );
7139 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
7140 RAISE Fnd_Api.g_exc_error;
7141 END IF;
7142
7143 IF i = p_modifier_line_tbl.first and l_use_modifier_index = TRUE and p_modifier_line_tbl(i).list_line_type_code = 'RLTD' THEN
7144 l_modifier_parent_index := i;
7145 l_modifiers_tbl(i).list_line_type_code := 'PRG' ;
7146 l_modifiers_tbl(i).override_flag := 'N'; -- overriding is not supported
7147 -- l_modifiers_tbl(i).rltd_modifier_grp_type := 'QUALIFIER';
7148 l_modifiers_tbl(i).rltd_modifier_grp_no := 1;
7149 l_modifiers_tbl(i).price_break_type_code := l_break_type;
7150 l_control_rec.process := FALSE;
7151 ELSIF p_modifier_line_tbl(i).list_line_type_code = 'RLTD' THEN
7152 l_control_rec.process := FALSE;
7153 l_modifiers_tbl(i).list_line_type_code := p_modifier_line_tbl(i).list_line_type_code;
7154 l_modifiers_tbl(i).override_flag := 'N'; -- overriding is not supported
7155 IF l_use_modifier_index = TRUE THEN
7156 l_modifiers_tbl(i).modifier_parent_index := l_modifier_parent_index;
7157 ELSE
7158 l_modifiers_tbl(i).from_rltd_modifier_id := l_related_modifier_id;
7159 END IF;
7160 l_modifiers_tbl(i).rltd_modifier_grp_type := 'QUALIFIER';
7161 l_modifiers_tbl(i).rltd_modifier_grp_no := 1;
7162 l_modifiers_tbl(i).price_break_type_code := l_break_type;
7163 ELSIF p_modifier_line_tbl(i).list_line_type_code = 'DIS' THEN
7164 l_control_rec.process := TRUE;
7165 l_modifiers_tbl(i).list_line_type_code := p_modifier_line_tbl(i).list_line_type_code;
7166 l_modifiers_tbl(i).override_flag := 'N'; -- overriding is not supported
7167 l_modifiers_tbl(i).from_rltd_modifier_id := l_related_modifier_id;
7168 l_modifiers_tbl(i).rltd_modifier_grp_type := 'BENEFIT';
7169 l_modifiers_tbl(i).rltd_modifier_grp_no := 1;
7170 END IF;
7171 l_modifiers_tbl(i).proration_type_code := 'N';
7172 l_modifiers_tbl(i).modifier_level_code := l_discount_level;
7173 l_modifiers_tbl(i).automatic_flag := 'Y';
7174
7175 -- get advanced options
7176 OPEN c_adv_options_exist(p_modifier_line_tbl(1).list_header_id);
7177 FETCH c_adv_options_exist INTO l_adv_options_exist;
7178 CLOSE c_adv_options_exist;
7179
7180 IF l_adv_options_exist IS NULL THEN
7181 IF l_discount_level = 'LINEGROUP' THEN
7182 l_modifiers_tbl(i).pricing_phase_id := FND_PROFILE.value('OZF_PRICING_PHASE_LINEGROUP');
7183 -- IF l_modifiers_tbl(i).pricing_phase_id <> 3 THEN
7184 -- l_modifiers_tbl(i).pricing_phase_id := 3;
7185 -- END IF;
7186 ELSIF l_discount_level = 'LINE' THEN
7187 l_modifiers_tbl(i).pricing_phase_id := FND_PROFILE.value('OZF_PRICING_PHASE_LINE');
7188 -- IF l_modifiers_tbl(i).pricing_phase_id <> 2 THEN
7189 -- l_modifiers_tbl(i).pricing_phase_id := 2;
7190 -- END IF;
7191 ELSIF l_discount_level = 'ORDER' THEN
7192 l_modifiers_tbl(i).pricing_phase_id := FND_PROFILE.value('OZF_PRICING_PHASE_ORDER');
7193 -- IF l_modifiers_tbl(i).pricing_phase_id <> 4 THEN
7194 -- l_modifiers_tbl(i).pricing_phase_id := 4;
7195 -- END IF;
7196 ELSE
7197 l_modifiers_tbl(i).pricing_phase_id := FND_PROFILE.value('OZF_PRICING_PHASE_LINEGROUP');
7198 -- IF l_modifiers_tbl(i).pricing_phase_id <> 3 THEN
7199 -- l_modifiers_tbl(i).pricing_phase_id := 3;
7200 -- END IF;
7201 END IF;
7202
7203 l_modifiers_tbl(i).print_on_invoice_flag := FND_PROFILE.value('OZF_PRINT_ON_INVOICE');
7204 l_modifiers_tbl(i).incompatibility_grp_code := FND_PROFILE.value('OZF_INCOMPATIBILITY_GROUP');
7205
7206 IF l_discount_level <> 'ORDER' THEN
7207 l_modifiers_tbl(i).pricing_group_sequence := FND_PROFILE.value('OZF_PRICING_GROUP_SEQUENCE');
7208 -- IF l_modifiers_tbl(i).pricing_group_sequence <> 1 THEN
7209 -- l_modifiers_tbl(i).pricing_group_sequence := 1;
7210 -- END IF;
7211 END IF;
7212
7213 l_modifiers_tbl(i).product_precedence := FND_PROFILE.value('OZF_PRODUCT_PRECEDENCE');
7214
7215 ELSE
7216 OPEN c_adv_options(p_modifier_line_tbl(1).list_header_id);
7217 FETCH c_adv_options INTO l_modifiers_tbl(i).pricing_phase_id,l_modifiers_tbl(i).print_on_invoice_flag,l_modifiers_tbl(i).incompatibility_grp_code,l_modifiers_tbl(i).pricing_group_sequence,l_modifiers_tbl(i).product_precedence;
7218 CLOSE c_adv_options;
7219 END IF;
7220 -- end advanced options
7221
7222 END IF;
7223
7224 l_modifiers_tbl(i).start_date_active := p_modifier_line_tbl(i).start_date_active;
7225 l_modifiers_tbl(i).end_date_active := p_modifier_line_tbl(i).end_date_active;
7226 l_modifiers_tbl(i).arithmetic_operator := p_modifier_line_tbl(i).arithmetic_operator;
7227 l_modifiers_tbl(i).operand := p_modifier_line_tbl(i).operand;
7228 l_modifiers_tbl(i).benefit_limit := p_modifier_line_tbl(i).benefit_limit;
7229 l_modifiers_tbl(i).benefit_price_list_line_id := p_modifier_line_tbl(i).benefit_price_list_line_id;
7230 l_modifiers_tbl(i).benefit_qty := p_modifier_line_tbl(i).benefit_qty;
7231 l_modifiers_tbl(i).benefit_uom_code := p_modifier_line_tbl(i).benefit_uom_code;
7232 l_pricing_attr_tbl(i).pricing_attribute_id := p_modifier_line_tbl(i).pricing_attribute_id;
7233 l_pricing_attr_tbl(i).product_attribute_context := 'ITEM';
7234 l_pricing_attr_tbl(i).product_attribute := p_modifier_line_tbl(i).product_attr;
7235 l_pricing_attr_tbl(i).product_attr_value := p_modifier_line_tbl(i).product_attr_val;
7236
7237 /*IF p_modifier_line_tbl(i).list_line_type_code <> 'DIS' THEN
7238 IF p_modifier_line_tbl(i).product_uom_code is not null and p_modifier_line_tbl(i).product_uom_code <> FND_API.g_miss_char THEN
7239 l_pricing_attr_tbl(i).product_uom_code := p_modifier_line_tbl(i).product_uom_code;
7240 l_pricing_attr_tbl(i).pricing_attribute_context := 'VOLUME';
7241 l_pricing_attr_tbl(i).pricing_attribute := p_modifier_line_tbl(i).pricing_attr;
7242 l_pricing_attr_tbl(i).pricing_attr_value_from := p_modifier_line_tbl(i).pricing_attr_value_from;
7243 IF p_modifier_line_tbl(i).operation <> 'CREATE' THEN
7244 l_pricing_attr_tbl(i).pricing_attr_value_to := p_modifier_line_tbl(i).pricing_attr_value_to;
7245 END IF;
7246 l_pricing_attr_tbl(i).comparison_operator_code := 'BETWEEN';
7247 END IF;
7248 END IF;*/
7249
7250 -- fix for bug 7321732.
7251 IF p_modifier_line_tbl(i).list_line_type_code <> 'DIS' THEN
7252 IF p_modifier_line_tbl(i).pricing_attr = 'PRICING_ATTRIBUTE10' THEN--if volume_type is qty
7253 IF p_modifier_line_tbl(i).product_uom_code is not null and p_modifier_line_tbl(i).product_uom_code <> FND_API.g_miss_char THEN
7254 l_pricing_attr_tbl(i).product_uom_code := p_modifier_line_tbl(i).product_uom_code;
7255 l_pricing_attr_tbl(i).pricing_attribute_context := 'VOLUME';
7256 l_pricing_attr_tbl(i).pricing_attribute := p_modifier_line_tbl(i).pricing_attr;
7257 l_pricing_attr_tbl(i).pricing_attr_value_from := p_modifier_line_tbl(i).pricing_attr_value_from;
7258 IF p_modifier_line_tbl(i).operation <> 'CREATE' THEN
7259 l_pricing_attr_tbl(i).pricing_attr_value_to := p_modifier_line_tbl(i).pricing_attr_value_to;
7260 END IF;
7261 l_pricing_attr_tbl(i).comparison_operator_code := 'BETWEEN';
7262
7263 ELSIF (p_modifier_line_tbl(i).product_uom_code is null
7264 OR p_modifier_line_tbl(i).product_uom_code = FND_API.g_miss_char
7265 ) AND
7266 ((p_modifier_line_tbl(i).pricing_attr_value_from is not null
7267 AND p_modifier_line_tbl(i).pricing_attr_value_from <> FND_API.g_miss_num) OR
7268 (p_modifier_line_tbl(i).pricing_attr is not null
7269 AND p_modifier_line_tbl(i).pricing_attr <> FND_API.g_miss_char))
7270 THEN
7271 FND_MESSAGE.SET_NAME('OZF','OZF_UOM_QTY_REQD');
7272
7273 Fnd_Msg_Pub.ADD;
7274 RAISE FND_API.G_EXC_ERROR;
7275 END IF;
7276 ELSE -- volume type is amount
7277 l_pricing_attr_tbl(i).product_uom_code := p_modifier_line_tbl(i).product_uom_code;
7278 l_pricing_attr_tbl(i).pricing_attribute_context := 'VOLUME';
7279 l_pricing_attr_tbl(i).pricing_attribute := p_modifier_line_tbl(i).pricing_attr;
7280 l_pricing_attr_tbl(i).pricing_attr_value_from := p_modifier_line_tbl(i).pricing_attr_value_from;
7281 IF p_modifier_line_tbl(i).operation <> 'CREATE' THEN
7282 l_pricing_attr_tbl(i).pricing_attr_value_to := p_modifier_line_tbl(i).pricing_attr_value_to;
7283 END IF;
7284 l_pricing_attr_tbl(i).comparison_operator_code := 'BETWEEN';
7285 END IF;
7286 END IF;
7287
7288 l_pricing_attr_tbl(i).modifiers_index := i;
7289 l_pricing_attr_tbl(i).list_line_id := p_modifier_line_tbl(i).list_line_id;
7290 l_pricing_attr_tbl(i).operation := p_modifier_line_tbl(i).operation;
7291
7292 IF p_modifier_line_tbl(i).inactive_flag = 'N' THEN
7293 IF l_start_date IS NOT NULL THEN
7294 l_modifiers_tbl(i).end_date_active := GREATEST(l_start_date, SYSDATE);
7295 ELSIF l_end_date IS NOT NULL THEN
7296 l_modifiers_tbl(i).end_date_active := LEAST(l_end_date, SYSDATE);
7297 ELSE
7298 l_modifiers_tbl(i).end_date_active := SYSDATE;
7299 END IF;
7300 --l_modifiers_tbl(i).end_date_active := least(nvl(l_end_date,sysdate-1),sysdate);
7301 ELSE
7302 l_modifiers_tbl(i).end_date_active := p_modifier_line_tbl(i).end_date_active;
7303 END IF;
7304
7305 END IF;
7306
7307 -- rssharma added flex field on 15-Apr-2003
7308 l_modifiers_tbl(i).attribute1 := p_modifier_line_tbl(i).attribute1;
7309 l_modifiers_tbl(i).attribute2 := p_modifier_line_tbl(i).attribute2;
7310 l_modifiers_tbl(i).attribute3 := p_modifier_line_tbl(i).attribute3;
7311 l_modifiers_tbl(i).attribute4 := p_modifier_line_tbl(i).attribute4;
7312 l_modifiers_tbl(i).attribute5 := p_modifier_line_tbl(i).attribute5;
7313 l_modifiers_tbl(i).attribute6 := p_modifier_line_tbl(i).attribute6;
7314 l_modifiers_tbl(i).attribute7 := p_modifier_line_tbl(i).attribute7;
7315 l_modifiers_tbl(i).attribute8 := p_modifier_line_tbl(i).attribute8;
7316 l_modifiers_tbl(i).attribute9 := p_modifier_line_tbl(i).attribute9;
7317 l_modifiers_tbl(i).attribute10 := p_modifier_line_tbl(i).attribute10;
7318 l_modifiers_tbl(i).attribute11 := p_modifier_line_tbl(i).attribute11;
7319 l_modifiers_tbl(i).attribute12 := p_modifier_line_tbl(i).attribute12;
7320 l_modifiers_tbl(i).attribute13 := p_modifier_line_tbl(i).attribute13;
7321 l_modifiers_tbl(i).attribute14 := p_modifier_line_tbl(i).attribute14;
7322 l_modifiers_tbl(i).attribute15 := p_modifier_line_tbl(i).attribute15;
7323 l_modifiers_tbl(i).context := p_modifier_line_tbl(i).context;
7324 -- end change on 15-Apr-2003
7325
7326 END LOOP;
7327
7328 QP_Modifiers_GRP.process_modifiers(
7329 p_api_version_number => 1.0,
7330 p_init_msg_list => FND_API.G_FALSE,
7331 p_return_values => FND_API.G_FALSE,
7332 p_commit => FND_API.G_FALSE,
7333 x_return_status => x_return_status,
7334 x_msg_count => x_msg_count,
7335 x_msg_data => x_msg_data,
7336 p_control_rec => l_control_rec,
7337 p_modifiers_tbl => l_modifiers_tbl,
7338 p_pricing_attr_tbl => l_pricing_attr_tbl,
7339 x_modifier_list_rec => v_modifier_list_rec,
7340 x_modifier_list_val_rec => v_modifier_list_val_rec,
7341 x_modifiers_tbl => v_modifiers_tbl,
7342 x_modifiers_val_tbl => v_modifiers_val_tbl,
7343 x_qualifiers_tbl => v_qualifiers_tbl,
7344 x_qualifiers_val_tbl => v_qualifiers_val_tbl,
7345 x_pricing_attr_tbl => v_pricing_attr_tbl,
7346 x_pricing_attr_val_tbl => v_pricing_attr_val_tbl
7347 );
7348 x_modifiers_tbl := v_modifiers_tbl;
7349 IF x_return_status <> Fnd_Api.g_ret_sts_success THEN
7350 IF v_modifiers_tbl.COUNT > 0 THEN
7351 FOR k IN v_modifiers_tbl.first..v_modifiers_tbl.last LOOP
7352 IF v_modifiers_tbl.EXISTS(k) THEN
7353 IF v_modifiers_tbl(k).return_status <> Fnd_Api.g_ret_sts_success THEN
7354 x_error_location := k;
7355 EXIT;
7356 END IF;
7357 END IF;
7358 END LOOP;
7359 END IF;
7360 END IF;
7361
7362 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
7363 add_message(x_msg_count);
7364 RAISE Fnd_Api.g_exc_error;
7365 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
7366 add_message(x_msg_count);
7367 RAISE Fnd_Api.g_exc_unexpected_error;
7368 END IF;
7369
7370 FOR limit_index in p_modifier_line_tbl.first..p_modifier_line_tbl.last LOOP
7371
7372 IF p_modifier_line_tbl.exists(limit_index) THEN
7373
7374 IF p_modifier_line_tbl(limit_index).operation = 'CREATE' THEN
7375 p_list_line_id := v_modifiers_tbl(limit_index).list_line_id;
7376 ELSE
7377 p_list_line_id := p_modifier_line_tbl(limit_index).list_line_id;
7378 END IF;
7379
7380 IF p_modifier_line_tbl(limit_index).list_line_type_code = 'DIS' THEN
7381 process_limits
7382 (
7383 x_return_status => x_return_status
7384 ,x_msg_count => x_msg_count
7385 ,x_msg_data => x_msg_data
7386 ,p_limit_type =>'MAX_QTY_PER_ORDER'
7387 ,p_limit_amount => p_modifier_line_tbl(limit_index).max_qty_per_order
7388 ,p_list_line_id => p_list_line_id
7389 ,p_list_header_id => p_modifier_line_tbl(limit_index).list_header_id
7390 ,p_limit_id => p_modifier_line_tbl(limit_index).max_qty_per_order_id
7391 );
7392
7393 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
7394 x_error_location := limit_index;
7395 RAISE Fnd_Api.g_exc_error;
7396 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
7397 x_error_location := limit_index;
7398 RAISE Fnd_Api.g_exc_unexpected_error;
7399 END IF;
7400
7401
7402 process_limits
7403 (
7404 x_return_status => x_return_status
7405 ,x_msg_count => x_msg_count
7406 ,x_msg_data => x_msg_data
7407 ,p_limit_type =>'MAX_QTY_PER_CUSTOMER'
7408 ,p_limit_amount => p_modifier_line_tbl(limit_index).max_qty_per_customer
7409 ,p_list_line_id => p_list_line_id
7410 ,p_list_header_id => p_modifier_line_tbl(limit_index).list_header_id
7411 ,p_limit_id => p_modifier_line_tbl(limit_index).max_qty_per_customer_id
7412 );
7413
7414 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
7415 x_error_location := limit_index;
7416 RAISE Fnd_Api.g_exc_error;
7417 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
7418 x_error_location := limit_index;
7419 RAISE Fnd_Api.g_exc_unexpected_error;
7420 END IF;
7421
7422 process_limits
7423 (
7424 x_return_status => x_return_status
7425 ,x_msg_count => x_msg_count
7426 ,x_msg_data => x_msg_data
7427 ,p_limit_type =>'MAX_QTY_PER_RULE'
7428 ,p_limit_amount => p_modifier_line_tbl(limit_index).max_qty_per_rule
7429 ,p_list_line_id => p_list_line_id
7430 ,p_list_header_id => p_modifier_line_tbl(limit_index).list_header_id
7431 ,p_limit_id => p_modifier_line_tbl(limit_index).max_qty_per_rule_id
7432 );
7433
7434 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
7435 x_error_location := limit_index;
7436 RAISE Fnd_Api.g_exc_error;
7437 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
7438 x_error_location := limit_index;
7439 RAISE Fnd_Api.g_exc_unexpected_error;
7440 END IF;
7441
7442
7443 END IF;
7444
7445
7446 END IF;
7447 END LOOP;
7448
7449 Fnd_Msg_Pub.Count_AND_Get
7450 ( p_count => x_msg_count,
7451 p_data => x_msg_data,
7452 p_encoded => Fnd_Api.G_FALSE
7453 );
7454
7455 EXCEPTION
7456 WHEN Fnd_Api.G_EXC_ERROR THEN
7457 x_return_status := Fnd_Api.g_ret_sts_error ;
7458 Fnd_Msg_Pub.Count_AND_Get
7459 ( p_count => x_msg_count,
7460 p_data => x_msg_data,
7461 p_encoded => Fnd_Api.G_FALSE
7462 );
7463 WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
7464 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
7465 Fnd_Msg_Pub.Count_AND_Get
7466 ( p_count => x_msg_count,
7467 p_data => x_msg_data,
7468 p_encoded => Fnd_Api.G_FALSE
7469 );
7470 WHEN OTHERS THEN
7471 x_return_status := Fnd_Api.g_ret_sts_unexp_erroR ;
7472 IF Fnd_Msg_Pub.Check_Msg_Level ( Fnd_Msg_Pub.G_MSG_LVL_UNEXP_ERROR )
7473 THEN
7474 Fnd_Msg_Pub.Add_Exc_Msg( G_PKG_NAME,l_api_name);
7475 END IF;
7476 Fnd_Msg_Pub.Count_AND_Get
7477 ( p_count => x_msg_count,
7478 p_data => x_msg_data,
7479 p_encoded => Fnd_Api.G_FALSE
7480 );
7481
7482 END;
7483
7484 PROCEDURE process_trade_deal
7485 (
7486 x_return_status OUT NOCOPY VARCHAR2
7487 ,x_msg_count OUT NOCOPY NUMBER
7488 ,x_msg_data OUT NOCOPY VARCHAR2
7489 ,p_modifier_line_tbl IN MODIFIER_LINE_TBL_TYPE
7490 ,p_list_header_id IN NUMBER
7491 , x_modifiers_tbl OUT NOCOPY qp_modifiers_pub.modifiers_tbl_type
7492 ,x_error_location OUT NOCOPY NUMBER
7493 ) IS
7494
7495 l_api_version CONSTANT NUMBER := 1.0;
7496 l_api_name CONSTANT VARCHAR2(30) := 'process_trade_deal';
7497 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
7498
7499 l_modifier_line_tbl MODIFIER_LINE_TBL_TYPE := p_modifier_line_tbl;
7500 v_off_modifiers_tbl qp_modifiers_pub.modifiers_tbl_type;
7501 v_accr_modifiers_tbl qp_modifiers_pub.modifiers_tbl_type;
7502 temp_modifier_line_tbl MODIFIER_LINE_TBL_TYPE := p_modifier_line_tbl;
7503
7504 l_modifier_line_all_off_tbl MODIFIER_LINE_TBL_TYPE; -- line has both off_invoice and accrual values, off_invoice
7505 l_modifier_line_all_acc_tbl MODIFIER_LINE_TBL_TYPE; -- line has both off_invoice and accrual values, accural
7506 l_modifier_line_off_tbl MODIFIER_LINE_TBL_TYPE; -- line has only off_invoice value
7507 l_modifier_line_acc_tbl MODIFIER_LINE_TBL_TYPE; -- line has only accrual value
7508 v_modifier_all_off_tbl qp_modifiers_pub.modifiers_tbl_type;
7509 v_modifier_all_acc_tbl qp_modifiers_pub.modifiers_tbl_type;
7510 v_modifier_off_tbl qp_modifiers_pub.modifiers_tbl_type;
7511 v_modifier_acc_tbl qp_modifiers_pub.modifiers_tbl_type;
7512 v_modifier_ret_tbl qp_modifiers_pub.modifiers_tbl_type;
7513 l_related_lines_rec ozf_related_lines_pvt.related_lines_rec_type;
7514 l_related_deal_lines_id NUMBER;
7515 l_all_index NUMBER := 0;
7516 l_off_index NUMBER := 0;
7517 l_acc_index NUMBER := 0;
7518 l_index NUMBER := 0;
7519 l_modifier_id NUMBER;
7520 l_related_modifier_id NUMBER;
7521
7522 CURSOR get_accr_pricing_attribute_id (p_list_line_id NUMBER) IS
7523 SELECT pricing_attribute_id
7524 FROM qp_pricing_attributes
7525 WHERE list_line_id = p_list_line_id
7526 AND excluder_flag = 'N';
7527
7528 l_object_version_number NUMBER;
7529
7530 l_accr_qty_limit_id NUMBER;
7531 l_accr_amount_limit_id NUMBER;
7532
7533 CURSOR cur_get_accrual_limit_id(p_limit_number NUMBER,p_list_line_id NUMBER) IS
7534 SELECT limit_id
7535 FROM qp_limits
7536 WHERE limit_number = p_limit_number
7537 AND list_line_id = p_list_line_id;
7538
7539 CURSOR c_modifier_id(l_id NUMBER) IS
7540 SELECT modifier_id, related_modifier_id
7541 FROM ozf_related_deal_lines
7542 WHERE related_deal_lines_id = l_id;
7543
7544 CURSOR c_creation(l_id NUMBER) IS
7545 SELECT creation_date, created_by
7546 FROM ozf_related_deal_lines
7547 WHERE related_deal_lines_id = l_id;
7548
7549 BEGIN
7550 x_return_status := Fnd_Api.g_ret_sts_success;
7551 IF p_modifier_line_tbl.count > 0 THEN
7552 FOR i IN p_modifier_line_tbl.first..p_modifier_line_tbl.last LOOP
7553 IF p_modifier_line_tbl.exists(i) THEN
7554 IF p_modifier_line_tbl(i).max_amount_per_rule IS NOT NULL
7555 AND p_modifier_line_tbl(i).max_amount_per_rule <> FND_API.G_MISS_NUM
7556 AND p_modifier_line_tbl(i).max_amount_per_rule <= 0 THEN
7557 IF Fnd_Msg_Pub.check_msg_level(Fnd_Msg_Pub.g_msg_lvl_error) THEN
7558 Fnd_Message.SET_NAME('OZF','OZF_TRD_DEAL_NEG_AMT');
7559 Fnd_Msg_Pub.ADD;
7560 END IF;
7561 RAISE Fnd_Api.g_exc_error;
7562 END IF;
7563
7564 IF p_modifier_line_tbl(i).max_qty_per_rule IS NOT NULL
7565 AND p_modifier_line_tbl(i).max_qty_per_rule <> FND_API.G_MISS_NUM
7566 AND p_modifier_line_tbl(i).max_qty_per_rule <= 0 THEN
7567 IF Fnd_Msg_Pub.check_msg_level(Fnd_Msg_Pub.g_msg_lvl_error) THEN
7568 Fnd_Message.SET_NAME('OZF','OZF_TRD_DEAL_NEG_QTY');
7569 Fnd_Msg_Pub.ADD;
7570 END IF;
7571 RAISE Fnd_Api.g_exc_error;
7572 END IF;
7573 END IF;
7574 END LOOP;
7575
7576 l_modifier_line_tbl.delete;
7577 FOR i IN p_modifier_line_tbl.first..p_modifier_line_tbl.last LOOP
7578 IF p_modifier_line_tbl.exists(i) THEN
7579 IF p_modifier_line_tbl(i).operation <> FND_API.g_miss_char THEN
7580
7581 IF ((p_modifier_line_tbl(i).operand IS NULL OR p_modifier_line_tbl(i).operand = FND_API.g_miss_num)
7582 OR (p_modifier_line_tbl(i).arithmetic_operator IS NULL OR p_modifier_line_tbl(i).arithmetic_operator = FND_API.g_miss_char))
7583 AND ((p_modifier_line_tbl(i).qd_operand IS NULL OR p_modifier_line_tbl(i).qd_operand = FND_API.g_miss_num)
7584 OR (p_modifier_line_tbl(i).qd_arithmetic_operator IS NULL OR p_modifier_line_tbl(i).qd_arithmetic_operator = FND_API.g_miss_char)) THEN
7585 IF Fnd_Msg_Pub.check_msg_level(Fnd_Msg_Pub.g_msg_lvl_error) THEN
7586 Fnd_Message.SET_NAME('OZF','OZF_TRD_DEAL_NO_OPERAND');
7587 Fnd_Msg_Pub.ADD;
7588 END IF;
7589 RAISE Fnd_Api.g_exc_error;
7590
7591 ELSIF ((p_modifier_line_tbl(i).operand IS NOT NULL AND p_modifier_line_tbl(i).operand <> FND_API.g_miss_num)
7592 AND (p_modifier_line_tbl(i).arithmetic_operator IS NOT NULL AND p_modifier_line_tbl(i).arithmetic_operator <> FND_API.g_miss_char))
7593 AND ((p_modifier_line_tbl(i).qd_operand IS NOT NULL AND p_modifier_line_tbl(i).qd_operand <> FND_API.g_miss_num)
7594 AND (p_modifier_line_tbl(i).qd_arithmetic_operator IS NOT NULL AND p_modifier_line_tbl(i).qd_arithmetic_operator <> FND_API.g_miss_char)) THEN
7595 l_all_index := l_all_index + 1;
7596 l_modifier_line_all_off_tbl(l_all_index) := p_modifier_line_tbl(i);
7597 l_modifier_line_all_acc_tbl(l_all_index) := p_modifier_line_tbl(i);
7598
7599 l_modifier_line_all_acc_tbl(l_all_index).list_line_id := p_modifier_line_tbl(i).qd_list_line_id;
7600 l_modifier_line_all_acc_tbl(l_all_index).operand := p_modifier_line_tbl(i).qd_operand;
7601 l_modifier_line_all_acc_tbl(l_all_index).arithmetic_operator := p_modifier_line_tbl(i).qd_arithmetic_operator;
7602
7603 IF p_modifier_line_tbl(i).list_line_id IS NULL OR p_modifier_line_tbl(i).list_line_id = FND_API.g_miss_num THEN
7604 l_modifier_line_all_off_tbl(l_all_index).operation := 'CREATE';
7605 l_modifier_line_all_off_tbl(l_all_index).list_line_id := FND_API.g_miss_num;
7606 l_modifier_line_all_off_tbl(l_all_index).pricing_attribute_id := FND_API.g_miss_num;
7607 END IF;
7608
7609 IF p_modifier_line_tbl(i).qd_list_line_id IS NULL OR p_modifier_line_tbl(i).qd_list_line_id = FND_API.g_miss_num THEN
7610 l_modifier_line_all_acc_tbl(l_all_index).operation := 'CREATE';
7611 l_modifier_line_all_acc_tbl(l_all_index).list_line_id := FND_API.g_miss_num;
7612 l_modifier_line_all_acc_tbl(l_all_index).pricing_attribute_id := FND_API.g_miss_num;
7613 END IF;
7614
7615 -- l_modifier_line_tbl(i) := p_modifier_line_tbl(i);
7616 l_index := l_index + 1;
7617
7618 IF l_modifier_line_all_acc_tbl(l_all_index).operation = 'UPDATE' THEN
7619 OPEN get_accr_pricing_attribute_id(l_modifier_line_all_acc_tbl(l_all_index).list_line_id);
7620 FETCH get_accr_pricing_attribute_id into l_modifier_line_all_acc_tbl(l_all_index).pricing_attribute_id;
7621 CLOSE get_accr_pricing_attribute_id;
7622 END IF;
7623
7624 ELSIF ((p_modifier_line_tbl(i).operand IS NOT NULL AND p_modifier_line_tbl(i).operand <> FND_API.g_miss_num)
7625 AND (p_modifier_line_tbl(i).arithmetic_operator IS NOT NULL AND p_modifier_line_tbl(i).arithmetic_operator <> FND_API.g_miss_char))
7626 AND ((p_modifier_line_tbl(i).qd_operand IS NULL OR p_modifier_line_tbl(i).qd_operand = FND_API.g_miss_num)
7627 OR (p_modifier_line_tbl(i).qd_arithmetic_operator IS NULL OR p_modifier_line_tbl(i).qd_arithmetic_operator = FND_API.g_miss_char)) THEN
7628 -- fix for bug 7321745
7629 OPEN c_modifier_id(p_modifier_line_tbl(i).qd_related_deal_lines_id);
7630 FETCH c_modifier_id INTO l_modifier_id,l_related_modifier_id;
7631 CLOSE c_modifier_id;
7632
7633 IF l_related_modifier_id IS NOT NULL THEN
7634 IF Fnd_Msg_Pub.check_msg_level(Fnd_Msg_Pub.g_msg_lvl_error) THEN
7635 Fnd_Message.SET_NAME('OZF','OZF_TRD_DEAL_NO_ACC_OPERAND');
7636 Fnd_Msg_Pub.ADD;
7637 x_error_location := i;
7638 END IF;
7639 RAISE Fnd_Api.g_exc_error;
7640 END IF;
7641
7642 l_off_index := l_off_index + 1;
7643 l_modifier_line_off_tbl(l_off_index) := p_modifier_line_tbl(i);
7644 l_index := l_index + 1;
7645 -- l_modifier_line_tbl(l_index) := p_modifier_line_tbl(i);
7646
7647 IF p_modifier_line_tbl(i).list_line_id IS NULL OR p_modifier_line_tbl(i).list_line_id = FND_API.g_miss_num THEN
7648 l_modifier_line_off_tbl(l_off_index).operation := 'CREATE';
7649 l_modifier_line_off_tbl(l_off_index).list_line_id := FND_API.g_miss_num;
7650 l_modifier_line_off_tbl(l_off_index).pricing_attribute_id := FND_API.g_miss_num;
7651 END IF;
7652
7653 ELSIF ((p_modifier_line_tbl(i).qd_operand IS NOT NULL AND p_modifier_line_tbl(i).qd_operand <> FND_API.g_miss_num)
7654 AND (p_modifier_line_tbl(i).qd_arithmetic_operator IS NOT NULL AND p_modifier_line_tbl(i).qd_arithmetic_operator <> FND_API.g_miss_char))
7655 AND ((p_modifier_line_tbl(i).operand IS NULL OR p_modifier_line_tbl(i).operand = FND_API.g_miss_num)
7656 OR (p_modifier_line_tbl(i).arithmetic_operator IS NULL OR p_modifier_line_tbl(i).arithmetic_operator = FND_API.g_miss_char)) THEN
7657
7658 -- fix for bug 7321745
7659
7660 OPEN c_modifier_id(p_modifier_line_tbl(i).qd_related_deal_lines_id);
7661 FETCH c_modifier_id INTO l_modifier_id,l_related_modifier_id;
7662 CLOSE c_modifier_id;
7663
7664 IF l_modifier_id IS NOT NULL AND l_related_modifier_id IS NOT NULL THEN
7665 IF Fnd_Msg_Pub.check_msg_level(Fnd_Msg_Pub.g_msg_lvl_error) THEN
7666 Fnd_Message.SET_NAME('OZF','OZF_TRD_DEAL_NO_OFF_OPERAND');
7667 Fnd_Msg_Pub.ADD;
7668 x_error_location := i;
7669 END IF;
7670 RAISE Fnd_Api.g_exc_error;
7671 END IF;
7672
7673 l_acc_index := l_acc_index + 1;
7674 l_modifier_line_acc_tbl(l_acc_index) := p_modifier_line_tbl(i);
7675
7676 l_modifier_line_acc_tbl(l_acc_index).list_line_id := p_modifier_line_tbl(i).qd_list_line_id;
7677 l_modifier_line_acc_tbl(l_acc_index).operand := p_modifier_line_tbl(i).qd_operand;
7678 l_modifier_line_acc_tbl(l_acc_index).arithmetic_operator := p_modifier_line_tbl(i).qd_arithmetic_operator;
7679
7680 l_index := l_index + 1;
7681 -- l_modifier_line_tbl(l_index) := p_modifier_line_tbl(i);
7682
7683 IF p_modifier_line_tbl(i).qd_list_line_id IS NULL OR p_modifier_line_tbl(i).qd_list_line_id = FND_API.g_miss_num THEN
7684 l_modifier_line_acc_tbl(l_acc_index).operation := 'CREATE';
7685 l_modifier_line_acc_tbl(l_acc_index).list_line_id := FND_API.g_miss_num;
7686 l_modifier_line_acc_tbl(l_acc_index).pricing_attribute_id := FND_API.g_miss_num;
7687 END IF;
7688
7689 IF l_modifier_line_acc_tbl(l_acc_index).operation = 'UPDATE' THEN
7690 OPEN get_accr_pricing_attribute_id(l_modifier_line_acc_tbl(l_acc_index).list_line_id);
7691 FETCH get_accr_pricing_attribute_id into l_modifier_line_acc_tbl(l_acc_index).pricing_attribute_id;
7692 CLOSE get_accr_pricing_attribute_id;
7693 END IF;
7694 END IF;
7695
7696 END IF;
7697 END IF;
7698 --dbms_output.put_line('table count is :'||l_modifier_line_tbl.count);
7699 -- rssharma added flex field on 15-Apr-2003
7700 /* l_modifier_line_all_off_tbl(i).attribute1 := p_modifier_line_tbl(i).attribute1;
7701 l_modifier_line_all_off_tbl(i).attribute2 := p_modifier_line_tbl(i).attribute2;
7702 l_modifier_line_all_off_tbl(i).attribute3 := p_modifier_line_tbl(i).attribute3;
7703 l_modifier_line_all_off_tbl(i).attribute4 := p_modifier_line_tbl(i).attribute4;
7704 l_modifier_line_all_off_tbl(i).attribute5 := p_modifier_line_tbl(i).attribute5;
7705 l_modifier_line_all_off_tbl(i).attribute6 := p_modifier_line_tbl(i).attribute6;
7706 l_modifier_line_all_off_tbl(i).attribute7 := p_modifier_line_tbl(i).attribute7;
7707 l_modifier_line_all_off_tbl(i).attribute8 := p_modifier_line_tbl(i).attribute8;
7708 l_modifier_line_all_off_tbl(i).attribute9 := p_modifier_line_tbl(i).attribute9;
7709 l_modifier_line_all_off_tbl(i).attribute10 := p_modifier_line_tbl(i).attribute10;
7710 l_modifier_line_all_off_tbl(i).attribute11 := p_modifier_line_tbl(i).attribute11;
7711 l_modifier_line_all_off_tbl(i).attribute12 := p_modifier_line_tbl(i).attribute12;
7712 l_modifier_line_all_off_tbl(i).attribute13 := p_modifier_line_tbl(i).attribute13;
7713 l_modifier_line_all_off_tbl(i).attribute14 := p_modifier_line_tbl(i).attribute14;
7714 l_modifier_line_all_off_tbl(i).attribute15 := p_modifier_line_tbl(i).attribute15;
7715 l_modifier_line_all_off_tbl(i).context := p_modifier_line_tbl(i).context;
7716
7717 l_modifier_line_acc_tbl(i).attribute1 := p_modifier_line_tbl(i).attribute1;
7718 l_modifier_line_acc_tbl(i).attribute2 := p_modifier_line_tbl(i).attribute2;
7719 l_modifier_line_acc_tbl(i).attribute3 := p_modifier_line_tbl(i).attribute3;
7720 l_modifier_line_acc_tbl(i).attribute4 := p_modifier_line_tbl(i).attribute4;
7721 l_modifier_line_acc_tbl(i).attribute5 := p_modifier_line_tbl(i).attribute5;
7722 l_modifier_line_acc_tbl(i).attribute6 := p_modifier_line_tbl(i).attribute6;
7723 l_modifier_line_acc_tbl(i).attribute7 := p_modifier_line_tbl(i).attribute7;
7724 l_modifier_line_acc_tbl(i).attribute8 := p_modifier_line_tbl(i).attribute8;
7725 l_modifier_line_acc_tbl(i).attribute9 := p_modifier_line_tbl(i).attribute9;
7726 l_modifier_line_acc_tbl(i).attribute10 := p_modifier_line_tbl(i).attribute10;
7727 l_modifier_line_acc_tbl(i).attribute11 := p_modifier_line_tbl(i).attribute11;
7728 l_modifier_line_acc_tbl(i).attribute12 := p_modifier_line_tbl(i).attribute12;
7729 l_modifier_line_acc_tbl(i).attribute13 := p_modifier_line_tbl(i).attribute13;
7730 l_modifier_line_acc_tbl(i).attribute14 := p_modifier_line_tbl(i).attribute14;
7731 l_modifier_line_acc_tbl(i).attribute15 := p_modifier_line_tbl(i).attribute15;
7732 l_modifier_line_acc_tbl(i).context := p_modifier_line_tbl(i).context;
7733 */
7734 -- end change on 15-Apr-2003
7735
7736 END LOOP;
7737
7738 IF l_modifier_line_all_off_tbl.count > 0 THEN
7739 process_regular_discounts
7740 (
7741 x_return_status => x_return_status,
7742 x_msg_count => x_msg_count,
7743 x_msg_data => x_msg_data,
7744 p_parent_offer_type => 'DEAL',
7745 p_offer_type => 'OFF_INVOICE',
7746 p_modifier_line_tbl => l_modifier_line_all_off_tbl,
7747 x_modifiers_tbl => v_modifier_all_off_tbl,
7748 x_error_location => x_error_location
7749 );
7750
7751 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
7752 RAISE Fnd_Api.g_exc_error;
7753 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
7754 RAISE Fnd_Api.g_exc_unexpected_error;
7755 END IF;
7756 END IF;
7757 IF l_modifier_line_off_tbl.count > 0 THEN
7758 process_regular_discounts
7759 (
7760 x_return_status => x_return_status,
7761 x_msg_count => x_msg_count,
7762 x_msg_data => x_msg_data,
7763 p_parent_offer_type => 'DEAL',
7764 p_offer_type => 'OFF_INVOICE',
7765 p_modifier_line_tbl => l_modifier_line_off_tbl,
7766 x_modifiers_tbl => v_modifier_off_tbl,
7767 x_error_location => x_error_location
7768 );
7769
7770 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
7771 RAISE Fnd_Api.g_exc_error;
7772 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
7773 RAISE Fnd_Api.g_exc_unexpected_error;
7774 END IF;
7775
7776 END IF;
7777
7778 IF l_modifier_line_all_acc_tbl.count > 0 THEN
7779 process_regular_discounts
7780 (
7781 x_return_status => x_return_status,
7782 x_msg_count => x_msg_count,
7783 x_msg_data => x_msg_data,
7784 p_parent_offer_type => 'DEAL',
7785 p_offer_type => 'ACCRUAL',
7786 p_modifier_line_tbl => l_modifier_line_all_acc_tbl,
7787 x_modifiers_tbl => v_modifier_all_acc_tbl,
7788 x_error_location => x_error_location
7789 );
7790
7791 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
7792 RAISE Fnd_Api.g_exc_error;
7793 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
7794 RAISE Fnd_Api.g_exc_unexpected_error;
7795 END IF;
7796 END IF;
7797
7798 IF l_modifier_line_acc_tbl.count > 0 THEN
7799 process_regular_discounts
7800 (
7801 x_return_status => x_return_status,
7802 x_msg_count => x_msg_count,
7803 x_msg_data => x_msg_data,
7804 p_parent_offer_type => 'DEAL',
7805 p_offer_type => 'ACCRUAL',
7806 p_modifier_line_tbl => l_modifier_line_acc_tbl,
7807 x_modifiers_tbl => v_modifier_acc_tbl,
7808 x_error_location => x_error_location
7809 );
7810
7811 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
7812 RAISE Fnd_Api.g_exc_error;
7813 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
7814 RAISE Fnd_Api.g_exc_unexpected_error;
7815 END IF;
7816 END IF;
7817
7818 /*
7819 v_modifier_all_off_tbl
7820 v_modifier_off_tbl
7821 v_modifier_all_acc_tbl
7822 v_modifier_acc_tbl
7823 */
7824 v_modifier_ret_tbl.delete;
7825 IF nvl(v_modifier_all_off_tbl.count,0) > 0 THEN
7826 FOR i in v_modifier_all_off_tbl.first .. v_modifier_all_off_tbl.last LOOP
7827 v_modifier_ret_tbl(nvl(v_modifier_ret_tbl.count,0)+1) := v_modifier_all_off_tbl(i);
7828 END LOOP;
7829 END IF;
7830 IF nvl(v_modifier_off_tbl.count,0) > 0 THEN
7831 FOR i in v_modifier_off_tbl.first .. v_modifier_off_tbl.last LOOP
7832 v_modifier_ret_tbl(nvl(v_modifier_ret_tbl.count,0)+1) := v_modifier_off_tbl(i);
7833 END LOOP;
7834 END IF;
7835 IF nvl(v_modifier_all_acc_tbl.count,0) > 0 THEN
7836 FOR i in v_modifier_all_acc_tbl.first .. v_modifier_all_acc_tbl.last LOOP
7837 v_modifier_ret_tbl(nvl(v_modifier_ret_tbl.count,0)+1) := v_modifier_all_acc_tbl(i);
7838 END LOOP;
7839 END IF;
7840 IF nvl(v_modifier_acc_tbl.count,0) > 0 THEN
7841 FOR i in v_modifier_acc_tbl.first .. v_modifier_acc_tbl.last LOOP
7842 v_modifier_ret_tbl(nvl(v_modifier_ret_tbl.count,0)+1) := v_modifier_acc_tbl(i);
7843 END LOOP;
7844 END IF;
7845
7846 l_all_index := 0;
7847 l_off_index := 0;
7848 l_acc_index := 0;
7849 /*
7850 Fixed issues in updating Trade Deal Discount lines
7851 */
7852 FOR i IN p_modifier_line_tbl.first..p_modifier_line_tbl.last LOOP
7853 IF p_modifier_line_tbl.exists(i) THEN
7854 l_modifier_line_tbl(i) := p_modifier_line_tbl(i);
7855 -- --dbms_output.put_line('i:'||i||' : Operation :'||p_modifier_line_tbl(i).operation);
7856 IF ((p_modifier_line_tbl(i).operand IS NOT NULL AND p_modifier_line_tbl(i).operand <> FND_API.g_miss_num)
7857 AND (p_modifier_line_tbl(i).arithmetic_operator IS NOT NULL AND p_modifier_line_tbl(i).arithmetic_operator <> FND_API.g_miss_char))
7858 AND ((p_modifier_line_tbl(i).qd_operand IS NOT NULL AND p_modifier_line_tbl(i).qd_operand <> FND_API.g_miss_num)
7859 AND (p_modifier_line_tbl(i).qd_arithmetic_operator IS NOT NULL AND p_modifier_line_tbl(i).qd_arithmetic_operator <> FND_API.g_miss_char)) THEN
7860 l_all_index := l_all_index + 1;
7861 l_modifier_line_tbl(i).list_line_id := v_modifier_all_off_tbl(l_all_index).list_line_id;
7862 l_modifier_line_tbl(i).qd_list_line_id := v_modifier_all_acc_tbl(l_all_index).list_line_id;
7863 -- --dbms_output.put_line('All :listlineId'||l_modifier_line_tbl(i).list_line_id || ' td id : '||l_modifier_line_tbl(i).qd_list_line_id);
7864 ELSIF ((p_modifier_line_tbl(i).operand IS NOT NULL AND p_modifier_line_tbl(i).operand <> FND_API.g_miss_num)
7865 AND (p_modifier_line_tbl(i).arithmetic_operator IS NOT NULL AND p_modifier_line_tbl(i).arithmetic_operator <> FND_API.g_miss_char))
7866 AND ((p_modifier_line_tbl(i).qd_operand IS NULL OR p_modifier_line_tbl(i).qd_operand = FND_API.g_miss_num)
7867 OR (p_modifier_line_tbl(i).qd_arithmetic_operator IS NULL OR p_modifier_line_tbl(i).qd_arithmetic_operator = FND_API.g_miss_char)) THEN
7868 l_off_index := l_off_index + 1;
7869 l_modifier_line_tbl(i).list_line_id := v_modifier_off_tbl(l_off_index).list_line_id;
7870 l_modifier_line_tbl(i).qd_list_line_id := null;
7871 -- --dbms_output.put_line('Off :listlineId'||l_modifier_line_tbl(i).list_line_id || ' td id : '||l_modifier_line_tbl(i).qd_list_line_id);
7872 ELSIF ((p_modifier_line_tbl(i).qd_operand IS NOT NULL AND p_modifier_line_tbl(i).qd_operand <> FND_API.g_miss_num)
7873 AND (p_modifier_line_tbl(i).qd_arithmetic_operator IS NOT NULL AND p_modifier_line_tbl(i).qd_arithmetic_operator <> FND_API.g_miss_char))
7874 AND ((p_modifier_line_tbl(i).operand IS NULL OR p_modifier_line_tbl(i).operand = FND_API.g_miss_num)
7875 OR (p_modifier_line_tbl(i).arithmetic_operator IS NULL OR p_modifier_line_tbl(i).arithmetic_operator = FND_API.g_miss_char)) THEN
7876 l_acc_index := l_acc_index + 1;
7877 l_modifier_line_tbl(i).qd_list_line_id := v_modifier_acc_tbl(l_acc_index).list_line_id;
7878 l_modifier_line_tbl(i).list_line_id := null;
7879 -- --dbms_output.put_line('Acc :listlineId'||l_modifier_line_tbl(i).list_line_id || ' td id : '||l_modifier_line_tbl(i).qd_list_line_id);
7880 END IF;
7881 END IF;
7882 END LOOP;
7883 -- Call Related Deal Lines and establish the relation ship.
7884 -- and push estimated_max if estimated is not equal to max.
7885 FOR i IN l_modifier_line_tbl.first..l_modifier_line_tbl.last LOOP
7886 IF l_modifier_line_tbl.exists(i) THEN
7887 IF l_modifier_line_tbl(i).operation <> FND_API.g_miss_char THEN
7888
7889 IF (l_modifier_line_tbl(i).max_qty_per_rule IS NULL OR l_modifier_line_tbl(i).max_qty_per_rule = FND_API.G_MISS_NUM)
7890 AND l_modifier_line_tbl(i).qd_estimated_qty_is_max = 'Y' THEN
7891 IF Fnd_Msg_Pub.check_msg_level(Fnd_Msg_Pub.g_msg_lvl_error) THEN
7892 Fnd_Message.SET_NAME('OZF','OZF_TRD_DEAL_NO_QTY');
7893 Fnd_Msg_Pub.ADD;
7894 END IF;
7895 RAISE Fnd_Api.g_exc_error;
7896 END IF;
7897
7898 IF (l_modifier_line_tbl(i).max_amount_per_rule IS NULL OR l_modifier_line_tbl(i).max_amount_per_rule = FND_API.G_MISS_NUM)
7899 AND l_modifier_line_tbl(i).qd_estimated_amount_is_max = 'Y' THEN
7900 IF Fnd_Msg_Pub.check_msg_level(Fnd_Msg_Pub.g_msg_lvl_error) THEN
7901 Fnd_Message.SET_NAME('OZF', 'OZF_TRD_DEAL_NO_AMT');
7902 Fnd_Msg_Pub.ADD;
7903 END IF;
7904 RAISE Fnd_Api.g_exc_error;
7905 END IF;
7906
7907 l_related_lines_rec := NULL;
7908 l_related_lines_rec.qp_list_header_id := l_modifier_line_tbl(i).list_header_id;
7909
7910 IF l_modifier_line_tbl(i).operation = 'CREATE' THEN
7911 IF l_modifier_line_tbl(i).list_line_id IS NOT NULL AND l_modifier_line_tbl(i).list_line_id <> FND_API.g_miss_num THEN
7912 l_related_lines_rec.modifier_id := l_modifier_line_tbl(i).list_line_id;
7913 IF l_modifier_line_tbl(i).qd_list_line_id IS NOT NULL AND l_modifier_line_tbl(i).qd_list_line_id <> FND_API.g_miss_num THEN
7914 l_related_lines_rec.related_modifier_id := l_modifier_line_tbl(i).qd_list_line_id;
7915 END IF;
7916 ELSE
7917 l_related_lines_rec.modifier_id := l_modifier_line_tbl(i).qd_list_line_id;
7918 END IF;
7919 ELSE
7920 l_related_lines_rec.related_deal_lines_id := l_modifier_line_tbl(i).qd_related_deal_lines_id;
7921 OPEN c_modifier_id(l_related_lines_rec.related_deal_lines_id);
7922 FETCH c_modifier_id INTO l_modifier_id,l_related_modifier_id;
7923 CLOSE c_modifier_id;
7924
7925 IF l_modifier_id = l_modifier_line_tbl(i).list_line_id THEN
7926 l_related_lines_rec.modifier_id := l_modifier_line_tbl(i).list_line_id;
7927 l_related_lines_rec.related_modifier_id := l_modifier_line_tbl(i).qd_list_line_id;
7928 ELSIF l_modifier_id = l_modifier_line_tbl(i).qd_list_line_id THEN
7929 l_related_lines_rec.modifier_id := l_modifier_line_tbl(i).qd_list_line_id;
7930 l_related_lines_rec.related_modifier_id := l_modifier_line_tbl(i).list_line_id;
7931 END IF;
7932
7933 l_related_lines_rec.object_version_number := l_modifier_line_tbl(i).qd_object_version_number;
7934 END IF;
7935
7936 l_related_lines_rec.estimated_qty_is_max := l_modifier_line_tbl(i).qd_estimated_qty_is_max;
7937 l_related_lines_rec.estimated_amount_is_max := l_modifier_line_tbl(i).qd_estimated_amount_is_max;
7938 l_related_lines_rec.estimated_qty := l_modifier_line_tbl(i).max_qty_per_rule;
7939 l_related_lines_rec.estimated_amount := l_modifier_line_tbl(i).max_amount_per_rule;
7940 l_related_lines_rec.estimate_qty_uom := l_modifier_line_tbl(i).estimate_qty_uom;
7941
7942 IF l_modifier_line_tbl(i).operation = 'CREATE' THEN
7943 OZF_Related_Lines_PVT.Create_related_lines
7944 (
7945 p_api_version_number => 1.0
7946 ,x_return_status => x_return_Status
7947 ,x_msg_count => x_msg_count
7948 ,x_msg_data => x_msg_data
7949 ,p_related_lines_rec => l_related_lines_rec
7950 ,x_related_deal_lines_id => l_related_deal_lines_id
7951 );
7952
7953 ELSIF l_modifier_line_tbl(i).operation = 'UPDATE' THEN
7954 OPEN c_creation(l_related_lines_rec.related_deal_lines_id);
7955 FETCH c_creation INTO l_related_lines_rec.creation_date,l_related_lines_rec.created_by;
7956 CLOSE c_creation;
7957 OZF_Related_Lines_PVT.update_related_lines
7958 (
7959 p_api_version_number => 1.0
7960 ,x_return_status => x_return_Status
7961 ,x_msg_count => x_msg_count
7962 ,x_msg_data => x_msg_data
7963 ,p_related_lines_rec => l_related_lines_rec
7964 ,x_object_version_number => l_object_version_number
7965 );
7966 END IF;
7967
7968 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
7969 RAISE Fnd_Api.g_exc_error;
7970 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
7971 RAISE Fnd_Api.g_exc_unexpected_error;
7972 END IF;
7973
7974 END IF;
7975 END IF;
7976 END LOOP;
7977
7978 END IF;
7979
7980 -- process limits
7981 FOR limit_index IN l_modifier_line_tbl.first..l_modifier_line_tbl.last LOOP
7982 IF l_modifier_line_tbl.exists(limit_index) THEN
7983 IF l_modifier_line_tbl(limit_index).operation <> FND_API.g_miss_char THEN
7984 IF l_modifier_line_tbl(limit_index).qd_estimated_qty_is_max = 'Y' THEN
7985 IF l_modifier_line_tbl(limit_index).list_line_id IS NOT NULL
7986 AND l_modifier_line_tbl(limit_index).list_line_id <> FND_API.G_MISS_NUM THEN
7987 process_limits
7988 (
7989 x_return_status => x_return_status
7990 ,x_msg_count => x_msg_count
7991 ,x_msg_data => x_msg_data
7992 ,p_limit_type =>'MAX_QTY_PER_RULE'
7993 ,p_limit_amount => l_modifier_line_tbl(limit_index).max_qty_per_rule
7994 ,p_list_line_id => l_modifier_line_tbl(limit_index).list_line_id
7995 ,p_list_header_id => l_modifier_line_tbl(limit_index).list_header_id
7996 ,p_limit_id => l_modifier_line_tbl(limit_index).max_qty_per_rule_id
7997 );
7998
7999 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
8000 x_error_location := limit_index;
8001 RAISE Fnd_Api.g_exc_error;
8002 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
8003 x_error_location := limit_index;
8004 RAISE Fnd_Api.g_exc_unexpected_error;
8005 END IF;
8006 END IF;
8007
8008 IF l_modifier_line_tbl(limit_index).qd_list_line_id IS NOT NULL
8009 AND l_modifier_line_tbl(limit_index).qd_list_line_id <> FND_API.G_MISS_NUM THEN
8010
8011 OPEN cur_get_accrual_limit_id(3,l_modifier_line_tbl(limit_index).qd_list_line_id);
8012 FETCH cur_get_accrual_limit_id into l_accr_qty_limit_id;
8013 CLOSE cur_get_accrual_limit_id;
8014
8015 process_limits
8016 (
8017 x_return_status => x_return_status
8018 ,x_msg_count => x_msg_count
8019 ,x_msg_data => x_msg_data
8020 ,p_limit_type =>'MAX_QTY_PER_RULE'
8021 ,p_limit_amount => l_modifier_line_tbl(limit_index).max_qty_per_rule
8022 ,p_list_line_id => l_modifier_line_tbl(limit_index).qd_list_line_id
8023 ,p_list_header_id => l_modifier_line_tbl(limit_index).list_header_id
8024 ,p_limit_id => l_accr_qty_limit_id
8025 );
8026
8027 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
8028 x_error_location := limit_index;
8029 RAISE Fnd_Api.g_exc_error;
8030 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
8031 x_error_location := limit_index;
8032 RAISE Fnd_Api.g_exc_unexpected_error;
8033 END IF;
8034 END IF;
8035 END IF;
8036
8037 IF l_modifier_line_tbl(limit_index).qd_estimated_amount_is_max = 'Y' THEN
8038 IF l_modifier_line_tbl(limit_index).list_line_id IS NOT NULL
8039 AND l_modifier_line_tbl(limit_index).list_line_id <> FND_API.G_MISS_NUM THEN
8040 process_limits
8041 (
8042 x_return_status => x_return_status
8043 ,x_msg_count => x_msg_count
8044 ,x_msg_data => x_msg_data
8045 ,p_limit_type =>'MAX_AMOUNT_PER_RULE'
8046 ,p_limit_amount => l_modifier_line_tbl(limit_index).max_amount_per_rule
8047 ,p_list_line_id => l_modifier_line_tbl(limit_index).list_line_id
8048 ,p_list_header_id => l_modifier_line_tbl(limit_index).list_header_id
8049 ,p_limit_id => l_modifier_line_tbl(limit_index).max_amount_per_rule_id
8050 );
8051
8052 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
8053 x_error_location := limit_index;
8054 RAISE Fnd_Api.g_exc_error;
8055 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
8056 x_error_location := limit_index;
8057 RAISE Fnd_Api.g_exc_unexpected_error;
8058 END IF;
8059 END IF;
8060
8061 IF l_modifier_line_tbl(limit_index).qd_list_line_id IS NOT NULL
8062 AND l_modifier_line_tbl(limit_index).qd_list_line_id <> FND_API.G_MISS_NUM THEN
8063
8064 OPEN cur_get_accrual_limit_id(5,l_modifier_line_tbl(limit_index).qd_list_line_id);
8065 FETCH cur_get_accrual_limit_id into l_accr_amount_limit_id;
8066 CLOSE cur_get_accrual_limit_id;
8067
8068 process_limits
8069 (
8070 x_return_status => x_return_status
8071 ,x_msg_count => x_msg_count
8072 ,x_msg_data => x_msg_data
8073 ,p_limit_type =>'MAX_AMOUNT_PER_RULE'
8074 ,p_limit_amount => l_modifier_line_tbl(limit_index).max_amount_per_rule
8075 ,p_list_line_id => l_modifier_line_tbl(limit_index).qd_list_line_id
8076 ,p_list_header_id => l_modifier_line_tbl(limit_index).list_header_id
8077 ,p_limit_id => l_accr_amount_limit_id
8078 );
8079
8080 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
8081 x_error_location := limit_index;
8082 RAISE Fnd_Api.g_exc_error;
8083 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
8084 x_error_location := limit_index;
8085 RAISE Fnd_Api.g_exc_unexpected_error;
8086 END IF;
8087 END IF;
8088 END IF;
8089 END IF;
8090 END IF;
8091 END LOOP;
8092
8093 x_modifiers_tbl := v_modifier_ret_tbl;
8094
8095 EXCEPTION
8096 WHEN Fnd_Api.G_EXC_ERROR THEN
8097 x_return_status := Fnd_Api.g_ret_sts_error ;
8098 Fnd_Msg_Pub.Count_AND_Get
8099 ( p_count => x_msg_count,
8100 p_data => x_msg_data,
8101 p_encoded => Fnd_Api.G_FALSE
8102 );
8103 WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
8104 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
8105 Fnd_Msg_Pub.Count_AND_Get
8106 ( p_count => x_msg_count,
8107 p_data => x_msg_data,
8108 p_encoded => Fnd_Api.G_FALSE
8109 );
8110 WHEN OTHERS THEN
8111 x_return_status := Fnd_Api.g_ret_sts_unexp_erroR ;
8112 IF Fnd_Msg_Pub.Check_Msg_Level ( Fnd_Msg_Pub.G_MSG_LVL_UNEXP_ERROR )
8113 THEN
8114 Fnd_Msg_Pub.Add_Exc_Msg( G_PKG_NAME,l_api_name);
8115 END IF;
8116 Fnd_Msg_Pub.Count_AND_Get
8117 ( p_count => x_msg_count,
8118 p_data => x_msg_data,
8119 p_encoded => Fnd_Api.G_FALSE
8120 );
8121 END;
8122
8123 PROCEDURE validateQpListLines
8124 (
8125 x_return_status OUT NOCOPY VARCHAR2
8126 ,x_msg_count OUT NOCOPY NUMBER
8127 ,x_msg_data OUT NOCOPY VARCHAR2
8128 ,p_modifier_line_tbl IN MODIFIER_LINE_TBL_TYPE
8129 ,p_listHeaderId IN NUMBER
8130 )
8131 IS
8132 CURSOR c_currency(cp_listHeaderId NUMBER)
8133 IS
8134 SELECT transaction_currency_code
8135 FROM ozf_offers
8136 WHERE qp_list_header_id = cp_listHeaderId;
8137 l_currency ozf_offers.transaction_currency_code%TYPE;
8138 BEGIN
8139 x_return_status := FND_API.G_RET_STS_SUCCESS;
8140 IF p_modifier_line_tbl.count > 0 THEN
8141 FOR i in p_modifier_line_tbl.first .. p_modifier_line_tbl.last LOOP
8142 IF p_modifier_line_tbl.exists(i) THEN
8143 OPEN c_currency(cp_listHeaderId => nvl(p_modifier_line_tbl(i).list_header_id,p_listHeaderId));
8144 FETCH c_currency INTO l_currency;
8145 CLOSE c_currency;
8146 IF l_currency IS NULL THEN
8147 IF (p_modifier_line_tbl(i).operand <> FND_API.G_MISS_NUM AND p_modifier_line_tbl(i).operand IS NOT NULL)
8148 AND
8149 (p_modifier_line_tbl(i).arithmetic_operator <> FND_API.G_MISS_CHAR AND p_modifier_line_tbl(i).arithmetic_operator IS NOT NULL)
8150 THEN
8151 IF
8152 (p_modifier_line_tbl(i).list_line_type_code = 'DIS' AND p_modifier_line_tbl(i).arithmetic_operator <> '%' )
8153 THEN
8154 OZF_Utility_PVT.error_message('OZF_OFFR_OPT_CURR_PCNT');
8155 x_return_status := FND_API.G_RET_STS_ERROR;
8156 RAISE FND_API.g_exc_error;
8157 END IF;
8158 END IF;
8159 IF (p_modifier_line_tbl(i).qd_operand <> FND_API.G_MISS_NUM AND p_modifier_line_tbl(i).qd_operand IS NOT NULL)
8160 AND
8161 (p_modifier_line_tbl(i).qd_arithmetic_operator <> FND_API.G_MISS_CHAR AND p_modifier_line_tbl(i).qd_arithmetic_operator IS NOT NULL)
8162 THEN
8163 IF
8164 (p_modifier_line_tbl(i).list_line_type_code = 'DIS' AND p_modifier_line_tbl(i).qd_arithmetic_operator <> '%' )
8165 THEN
8166 OZF_Utility_PVT.error_message('OZF_OFFR_OPT_CURR_PCNT');
8167 x_return_status := FND_API.G_RET_STS_ERROR;
8168 RAISE FND_API.g_exc_error;
8169 END IF;
8170 END IF;
8171 END IF;
8172 END IF;
8173 END LOOP;
8174 END IF;
8175 END validateQpListLines;
8176
8177 PROCEDURE process_qp_list_lines
8178 (
8179 x_return_status OUT NOCOPY VARCHAR2
8180 ,x_msg_count OUT NOCOPY NUMBER
8181 ,x_msg_data OUT NOCOPY VARCHAR2
8182 ,p_offer_type IN VARCHAR2
8183 ,p_modifier_line_tbl IN MODIFIER_LINE_TBL_TYPE
8184 ,p_list_header_id IN NUMBER
8185 ,x_modifier_line_tbl OUT NOCOPY qp_modifiers_pub.modifiers_tbl_type
8186 ,x_error_location OUT NOCOPY NUMBER
8187 )IS
8188 l_api_version CONSTANT NUMBER := 1.0;
8189 l_api_name CONSTANT VARCHAR2(30) := 'process_qp_list_lines';
8190 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
8191 l_modifier_line_tbl qp_modifiers_pub.modifiers_tbl_type;
8192 -- RSSHARMA changed on 06-Feb-2003
8193 CURSOR c_volume_offer_type IS
8194 SELECT volume_offer_type FROM ozf_offers
8195 where qp_list_header_id = p_list_header_id;
8196
8197 l_Volume_offer_type ozf_offers.volume_offer_type%type;
8198
8199 l_modifier_line_rec_tbl MODIFIER_LINE_TBL_TYPE := p_modifier_line_tbl;
8200
8201 BEGIN
8202
8203 SAVEPOINT process_qp_list_lines;
8204
8205 x_return_status := Fnd_Api.g_ret_sts_success;
8206 x_error_location := 0;
8207 validateQpListLines
8208 (
8209 x_return_status => x_return_status
8210 ,x_msg_count => x_msg_count
8211 ,x_msg_data => x_msg_data
8212 ,p_modifier_line_tbl => p_modifier_line_tbl
8213 ,p_listHeaderId => p_list_header_id
8214 );
8215 IF x_return_status = FND_API.G_RET_STS_ERROR THEN
8216 RAISE FND_API.G_EXC_ERROR;
8217 ELSIF x_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
8218 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8219 END IF;
8220
8221 IF p_list_header_id IS NOT NULL AND p_list_header_id<> FND_API.G_MISS_NUM THEN
8222 l_modifier_line_rec_tbl(p_modifier_line_tbl.last).list_header_id := p_list_header_id;
8223 END IF;
8224
8225 IF p_modifier_line_tbl.count > 0 THEN
8226
8227 IF p_offer_type IN ('OFF_INVOICE','TERMS','ACCRUAL') THEN
8228 process_regular_discounts
8229 (
8230 x_return_status => x_return_status,
8231 x_msg_count => x_msg_count,
8232 x_msg_data => x_msg_data,
8233 p_parent_offer_type => p_offer_type,
8234 p_offer_type => p_offer_type,
8235 p_modifier_line_tbl => l_modifier_line_rec_tbl, --Added by nirma
8236 x_modifiers_tbl => l_modifier_line_tbl,
8237 x_error_location => x_error_location
8238 );
8239 ELSIF p_offer_type IN ('OID') THEN
8240 process_promotional_goods
8241 (
8242 x_return_status => x_return_status,
8243 x_msg_count => x_msg_count,
8244 x_msg_data => x_msg_data,
8245 p_modifier_line_tbl => p_modifier_line_tbl,
8246 x_modifiers_tbl => l_modifier_line_tbl,
8247 x_error_location => x_error_location
8248 );
8249 ELSIF p_offer_type IN ('ORDER') THEN
8250 process_order_value
8251 (
8252 x_return_status => x_return_status,
8253 x_msg_count => x_msg_count,
8254 x_msg_data => x_msg_data,
8255 p_modifier_line_tbl => p_modifier_line_tbl,
8256 x_modifiers_tbl => l_modifier_line_tbl,
8257 x_error_location => x_error_location
8258 );
8259 ELSIF p_offer_type IN ('DEAL') THEN -- note trade deal does not return values properly so far
8260 process_trade_deal
8261 (
8262 x_return_status => x_return_status,
8263 x_msg_count => x_msg_count,
8264 x_msg_data => x_msg_data,
8265 p_modifier_line_tbl => p_modifier_line_tbl,
8266 p_list_header_id => p_list_header_id,
8267 x_modifiers_tbl => l_modifier_line_tbl,
8268 x_error_location => x_error_location
8269 );
8270 ELSIF p_offer_type IN ('VOLUME_OFFER') THEN
8271
8272 OPEN c_volume_offer_type ;
8273 fetch c_volume_offer_type INTO l_Volume_offer_type;
8274 CLOSE c_volume_offer_type ;
8275
8276 process_regular_discounts
8277 (
8278 x_return_status => x_return_status,
8279 x_msg_count => x_msg_count,
8280 x_msg_data => x_msg_data,
8281 p_parent_offer_type => p_offer_type,
8282 p_offer_type => l_volume_offer_type,
8283 p_modifier_line_tbl => p_modifier_line_tbl,
8284 x_modifiers_tbl => l_modifier_line_tbl,
8285 x_error_location => x_error_location
8286 );
8287 --rssharma end change on 06-Feb-2003
8288 END IF;
8289
8290 x_modifier_line_tbl := l_modifier_line_tbl;
8291
8292 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
8293 RAISE Fnd_Api.g_exc_error;
8294 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
8295 RAISE Fnd_Api.g_exc_unexpected_error;
8296 END IF;
8297 END IF;
8298 EXCEPTION
8299 WHEN Fnd_Api.G_EXC_ERROR THEN
8300 x_return_status := Fnd_Api.g_ret_sts_error ;
8301 ROLLBACK TO process_qp_list_lines;
8302 Fnd_Msg_Pub.Count_AND_Get
8303 ( p_count => x_msg_count,
8304 p_data => x_msg_data,
8305 p_encoded => Fnd_Api.G_FALSE
8306 );
8307 WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
8308 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
8309 ROLLBACK TO process_qp_list_lines;
8310 Fnd_Msg_Pub.Count_AND_Get
8311 ( p_count => x_msg_count,
8312 p_data => x_msg_data,
8313 p_encoded => Fnd_Api.G_FALSE
8314 );
8315 WHEN OTHERS THEN
8316 x_return_status := Fnd_Api.g_ret_sts_unexp_erroR ;
8317 ROLLBACK TO process_qp_list_lines;
8318 IF Fnd_Msg_Pub.Check_Msg_Level ( Fnd_Msg_Pub.G_MSG_LVL_UNEXP_ERROR )
8319 THEN
8320 Fnd_Msg_Pub.Add_Exc_Msg( G_PKG_NAME,l_api_name);
8321 END IF;
8322 Fnd_Msg_Pub.Count_AND_Get
8323 ( p_count => x_msg_count,
8324 p_data => x_msg_data,
8325 p_encoded => Fnd_Api.G_FALSE
8326 );
8327 END;
8328
8329
8330 PROCEDURE validate_offer_approval
8331 ( x_return_status OUT NOCOPY VARCHAR2
8332 ,x_msg_count OUT NOCOPY NUMBER
8333 ,x_msg_data OUT NOCOPY VARCHAR2
8334 ,p_init_msg_list IN VARCHAR2
8335 ,p_modifier_list_rec IN modifier_list_rec_type
8336 )IS
8337
8338 l_api_version CONSTANT NUMBER := 1.0;
8339 l_api_name CONSTANT VARCHAR2(30) := 'validate_offer_approval';
8340 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
8341 CURSOR c_budget_exist IS
8342 SELECT 1
8343 FROM DUAL
8344 WHERE EXISTS(
8345 SELECT 1
8346 FROM ozf_act_budgets
8347 WHERE arc_act_budget_used_by = 'OFFR'
8348 AND act_budget_used_by_id = p_modifier_list_rec.qp_list_header_id);
8349 l_budget_exist NUMBER;
8350
8351
8352 BEGIN
8353
8354 x_return_status := Fnd_Api.g_ret_sts_success;
8355
8356 OPEN c_budget_exist;
8357 FETCH c_budget_exist INTO l_budget_exist;
8358 CLOSE c_budget_exist;
8359
8360
8361 IF l_budget_exist IS NULL THEN
8362 OZF_Utility_PVT.error_message('OZF_EVE_NO_BGT_SRC');
8363 RAISE FND_API.g_exc_error;
8364 END IF;
8365
8366
8367 -- For Lumpsum Offers if distribution is complete
8368 IF p_modifier_list_rec.offer_type = 'LUMPSUM' AND p_modifier_list_rec.custom_setup_id <> 110 THEN
8369
8370 validate_lumpsum_offer
8371 (
8372 p_init_msg_list => p_init_msg_list
8373 ,x_return_status => x_return_status
8374 ,x_msg_count => x_msg_count
8375 ,x_msg_data => x_msg_data
8376 ,p_qp_list_header_id => p_modifier_list_rec.qp_list_header_id
8377 );
8378
8379 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
8380 RAISE Fnd_Api.g_exc_error;
8381 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
8382 RAISE Fnd_Api.g_exc_unexpected_error;
8383 END IF;
8384
8385 END IF;
8386
8387 Fnd_Msg_Pub.Count_AND_Get
8388 ( p_count => x_msg_count,
8389 p_data => x_msg_data,
8390 p_encoded => Fnd_Api.G_FALSE
8391 );
8392
8393 EXCEPTION
8394 WHEN Fnd_Api.G_EXC_ERROR THEN
8395 x_return_status := Fnd_Api.g_ret_sts_error ;
8396 Fnd_Msg_Pub.Count_AND_Get
8397 ( p_count => x_msg_count,
8398 p_data => x_msg_data,
8399 p_encoded => Fnd_Api.G_FALSE
8400 );
8401 WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
8402 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
8403 Fnd_Msg_Pub.Count_AND_Get
8404 ( p_count => x_msg_count,
8405 p_data => x_msg_data,
8406 p_encoded => Fnd_Api.G_FALSE
8407 );
8408 WHEN OTHERS THEN
8409 x_return_status := Fnd_Api.g_ret_sts_unexp_erroR ;
8410 IF Fnd_Msg_Pub.Check_Msg_Level ( Fnd_Msg_Pub.G_MSG_LVL_UNEXP_ERROR )
8411 THEN
8412 Fnd_Msg_Pub.Add_Exc_Msg( G_PKG_NAME,l_api_name);
8413 END IF;
8414 Fnd_Msg_Pub.Count_AND_Get
8415 ( p_count => x_msg_count,
8416 p_data => x_msg_data,
8417 p_encoded => Fnd_Api.G_FALSE
8418 );
8419 END;
8420
8421
8422 FUNCTION get_campaign_count(p_list_header_id IN NUMBER)
8423 RETURN NUMBER IS
8424 p_count NUMBER := 0;
8425
8426 CURSOR cur_budget_source_count(list_header_id NUMBER) IS
8427 SELECT count(1)
8428 FROM ozf_act_offers
8429 where qp_list_header_id = list_header_id;
8430
8431 BEGIN
8432 OPEN cur_budget_source_count( p_list_header_id ) ;
8433 FETCH cur_budget_source_count INTO p_count ;
8434 CLOSE cur_budget_source_count ;
8435 return p_count ;
8436
8437 EXCEPTION
8438 WHEN OTHERS THEN
8439 RETURN 0;
8440 END;
8441
8442
8443 /*
8444 This function checks id active discount rules exist for an offer.
8445 If active discount rules exist for the offer then the function returns 0
8446 else it returns -1
8447 r12 changes
8448 Changed function to query ozf_offer_discount_lines and ozf_offer_discount_products
8449 if offer type is VOLUME_OFFER
8450 */
8451 FUNCTION discount_lines_exist(p_list_header_id IN NUMBER) RETURN NUMBER
8452 IS
8453 l_lines_count NUMBER := 0;
8454 CURSOR c_list_line(l_list_header_id NUMBER) IS
8455 SELECT COUNT(*)
8456 FROM qp_list_lines
8457 WHERE list_header_id = l_list_header_id
8458 AND decode(greatest(end_date_active, sysdate), sysdate,'N','Y') = 'Y';
8459
8460 CURSOR c_offerType(cp_listHeaderId NUMBER) IS
8461 SELECT offer_type
8462 FROM ozf_offers
8463 WHERE qp_list_header_id = cp_listHeaderId;
8464
8465 CURSOR c_voCnt(cp_listHeaderId NUMBER) IS
8466 SELECT 1 FROM dual WHERE EXISTS(SELECT
8467 'X' FROM ozf_offer_discount_lines a, ozf_offer_discount_products b, ozf_offers c
8468 WHERE a.offer_discount_line_id = b.offer_discount_line_id
8469 AND a.offer_id = c.offer_id
8470 AND c.qp_list_header_id = cp_listHeaderId
8471 );
8472
8473 l_offerType OZF_OFFERS.offer_type%TYPE := null;
8474 l_return NUMBER := -1;
8475 BEGIN
8476 l_offerType := null;
8477 OPEN c_offerType(p_list_header_id);
8478 FETCH c_offerType into l_offerType;
8479 IF (c_offerType%NOTFOUND) THEN
8480 l_offerType := null;
8481 END IF;
8482 CLOSE c_offerType;
8483
8484 l_lines_count := 0;
8485
8486 IF (l_offerType = 'VOLUME_OFFER') THEN
8487 OPEN c_voCnt(p_list_header_id);
8488 FETCH c_voCnt INTO l_lines_count;
8489 IF c_voCnt%NOTFOUND THEN
8490 l_lines_count := 0;
8491 END IF;
8492 CLOSE c_voCnt;
8493 ELSIF (l_offerType = 'ACCRUAL') THEN
8494 OPEN c_list_line(p_list_header_id);
8495 FETCH c_list_line INTO l_lines_count;
8496 IF c_list_line%NOTFOUND THEN
8497 l_lines_count := 0;
8498 END IF;
8499 CLOSE c_list_line;
8500 ELSE
8501 l_lines_count := 0;
8502 END IF;
8503
8504 l_return := -1;
8505 IF l_lines_count <> 0 THEN
8506 l_RETURN := 0;
8507 ELSE
8508 l_RETURN := -1;
8509 END IF;
8510 RETURN l_return;
8511 EXCEPTION
8512 WHEN OTHERS THEN
8513 RETURN -1;
8514
8515 END discount_lines_exist ;
8516
8517
8518 PROCEDURE Update_Offer_Status
8519 (
8520 p_commit IN VARCHAR2
8521 ,x_return_status OUT NOCOPY VARCHAR2
8522 ,x_msg_count OUT NOCOPY NUMBER
8523 ,x_msg_data OUT NOCOPY VARCHAR2
8524 ,p_modifier_list_rec IN modifier_list_rec_type
8525 )
8526 IS
8527
8528 CURSOR c_offer_start_date(p_list_header_id NUMBER) IS
8529 SELECT q.start_date_active, o.start_date
8530 FROM qp_list_headers_b q, ozf_offers o
8531 WHERE o.qp_list_header_id = q.list_header_id
8532 AND q.list_header_id = p_list_header_id;
8533
8534 l_start_date_q DATE;
8535 l_start_date_o DATE;
8536 l_start_date DATE;
8537
8538 l_api_name CONSTANT VARCHAR2(30) := 'update_offer_status';
8539
8540 BEGIN
8541
8542 SAVEPOINT update_offer_status;
8543
8544 OPEN c_offer_start_date(p_modifier_list_rec.qp_list_header_id);
8545 FETCH c_offer_start_date INTO l_start_date_q, l_start_date_o;
8546 CLOSE c_offer_start_date;
8547
8548 IF p_modifier_list_rec.status_code = 'ACTIVE' THEN
8549 IF l_start_date_o IS NULL THEN
8550 l_start_date := GREATEST(NVL(l_start_date_q, SYSDATE), SYSDATE);
8551 ELSE
8552 l_start_date := l_start_date_o;
8553 END IF;
8554 ELSE
8555 l_start_date := l_start_date_o;
8556 END IF;
8557
8558 UPDATE ozf_offers
8559 SET user_status_id = p_modifier_list_rec.user_status_id,
8560 status_code = p_modifier_list_rec.status_code,
8561 status_date = SYSDATE,
8562 start_date = l_start_date,
8563 object_version_number = object_version_number + 1
8564 WHERE qp_list_header_id = p_modifier_list_rec.qp_list_header_id;
8565
8566 IF p_modifier_list_rec.status_code = 'ACTIVE'
8567 AND p_modifier_list_rec.offer_type NOT IN ('LUMPSUM', 'SCAN_DATA', 'NET_ACCRUAL') THEN
8568 UPDATE qp_list_headers_b
8569 SET active_flag = 'Y'
8570 WHERE list_header_id = p_modifier_list_rec.qp_list_header_id;
8571 -- Forward port bug 3143594. 11i.10 bug is 3614058
8572 UPDATE qp_qualifiers
8573 SET active_flag = 'Y'
8574 WHERE list_header_id = p_modifier_list_rec.qp_list_header_id;
8575
8576 END IF;
8577
8578 process_offer_activation
8579 (
8580 p_api_version_number => 1.0
8581 , p_init_msg_list => FND_API.g_false
8582 , p_commit => p_commit
8583 , p_validation_level => FND_API.G_VALID_LEVEL_FULL
8584 , x_return_status => x_return_status
8585 , x_msg_count => x_msg_count
8586 , x_msg_data => x_msg_data
8587 , p_offer_rec => p_modifier_list_rec
8588 );
8589
8590 IF x_return_status = FND_API.G_RET_STS_ERROR THEN
8591 RAISE FND_API.G_EXC_ERROR;
8592 ELSIF x_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
8593 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8594 END IF;
8595
8596
8597 IF p_commit = Fnd_Api.g_true THEN
8598 COMMIT;
8599 END IF;
8600
8601 EXCEPTION
8602 WHEN OTHERS THEN
8603 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
8604 ROLLBACK TO update_offer_status;
8605 IF Fnd_Msg_Pub.Check_Msg_Level ( Fnd_Msg_Pub.G_MSG_LVL_UNEXP_ERROR ) THEN
8606 Fnd_Msg_Pub.Add_Exc_Msg( G_PKG_NAME,l_api_name);
8607 END IF;
8608 Fnd_Msg_Pub.Count_AND_Get(p_count => x_msg_count,
8609 p_data => x_msg_data,
8610 p_encoded => Fnd_Api.G_FALSE);
8611 END update_offer_status;
8612
8613
8614 PROCEDURE raise_offer_event(p_offer_id IN NUMBER,
8615 p_adjustment_id IN NUMBER :=NULL)
8616 IS
8617 l_item_key varchar2(30);
8618 l_parameter_list wf_parameter_list_t;
8619 BEGIN
8620 l_item_key := p_offer_id ||'_'|| TO_CHAR(SYSDATE,'DDMMRRRRHH24MISS');
8621 l_parameter_list := WF_PARAMETER_LIST_T();
8622
8623 debug_message('Offer Id is :'||p_offer_id );
8624 wf_event.AddParameterToList(p_name => 'P_OFFER_ID',
8625 p_value => p_offer_id,
8626 p_parameterlist => l_parameter_list);
8627
8628 if p_adjustment_id IS NOT NULL then
8629 wf_event.AddParameterToList(p_name => 'P_ADJUSTMENT_ID',
8630 p_value => p_adjustment_id,
8631 p_parameterlist => l_parameter_list);
8632 end if;
8633
8634 debug_message('Item Key is :'||l_item_key);
8635 wf_event.raise( p_event_name => 'oracle.apps.ozf.offer.OfferApproval',
8636 p_event_key => l_item_key,
8637 p_parameters => l_parameter_list);
8638 EXCEPTION
8639 WHEN OTHERS THEN
8640 debug_message('Exception in raising business event');
8641 RAISE Fnd_Api.g_exc_error;
8642 END;
8643
8644 FUNCTION getDateQualifier(p_qpListHeaderId NUMBER)
8645 RETURN VARCHAR2
8646 IS
8647 CURSOR c_dateQualifier(cp_qpListHeaderId NUMBER) IS
8648 SELECT date_qualifier_profile_value
8649 FROM ozf_offers
8650 WHERE qp_list_header_id = cp_qpListHeaderId;
8651 l_dateQualifier VARCHAR2(1):= NULL;
8652 BEGIN
8653 OPEN c_dateQualifier(cp_qpListHeaderId => p_qpListHeaderId ) ;
8654 FETCH c_dateQualifier INTO l_dateQualifier;
8655 IF c_dateQualifier%NOTFOUND THEN
8656 l_dateQualifier := null;
8657 END IF;
8658 CLOSE c_dateQualifier;
8659 return l_dateQualifier;
8660 END getDateQualifier;
8661
8662 PROCEDURE process_modifiers
8663 (
8664 p_init_msg_list IN VARCHAR2
8665 ,p_api_version IN NUMBER
8666 ,p_commit IN VARCHAR2
8667 ,x_return_status OUT NOCOPY VARCHAR2
8668 ,x_msg_count OUT NOCOPY NUMBER
8669 ,x_msg_data OUT NOCOPY VARCHAR2
8670 ,p_offer_type IN VARCHAR2
8671 ,p_modifier_list_rec IN modifier_list_rec_type
8672 ,p_modifier_line_tbl IN MODIFIER_LINE_TBL_TYPE
8673 ,x_qp_list_header_id OUT NOCOPY NUMBER
8674 ,x_error_location OUT NOCOPY NUMBER
8675 )
8676 IS
8677
8678 v_modifier_list_rec modifier_list_rec_type;
8679 temp_modifier_list_rec modifier_list_rec_type := p_modifier_list_rec;
8680 date_temp_modifier_list_rec modifier_list_rec_type := p_modifier_list_rec;
8681 l_modifier_list_rec modifier_list_rec_type := p_modifier_list_rec;
8682 l_offer_id NUMBER;
8683 v_modifier_line_tbl qp_modifiers_pub.modifiers_tbl_type; --
8684 l_modifier_line_tbl MODIFIER_LINE_TBL_TYPE := p_modifier_line_tbl;
8685
8686 l_api_version CONSTANT NUMBER := 1.0;
8687 l_api_name CONSTANT VARCHAR2(30) := 'process_modifiers';
8688 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
8689 l_handle_status VARCHAR2(1);
8690
8691 l_old_status_id NUMBER;
8692 l_approval_type VARCHAR2(30);
8693 l_new_status_code VARCHAR2(30);
8694 l_old_status_code VARCHAR2(30);
8695 l_status_code VARCHAR2(30); -- status from budget API
8696
8697 l_owner_id NUMBER;
8698 l_amount_error VARCHAR2(1);
8699 l_budget_required VARCHAR2(1);
8700 l_approval_required VARCHAR2(1);
8701 l_lines_count NUMBER;
8702
8703 l_offers_rec modifier_list_rec_type := p_modifier_list_rec;
8704
8705 l_na_qual_context VARCHAR2(30);
8706 l_na_qual_attribute VARCHAR2(30);
8707
8708 l_old_offer_id NUMBER;
8709
8710 CURSOR cur_get_user_status IS
8711 SELECT user_status_id,owner_id,status_code,offer_id
8712 FROM ozf_offers
8713 WHERE qp_list_header_id = p_modifier_list_rec.qp_list_header_id;
8714
8715 CURSOR c_offer_budget IS
8716 SELECT budget_source_type, budget_source_id, budget_amount_tc
8717 FROM ozf_offers
8718 WHERE qp_list_header_id = p_modifier_list_rec.qp_list_header_id;
8719
8720 CURSOR c_budget_required IS
8721 SELECT attr_available_flag
8722 FROM ams_custom_setup_attr
8723 WHERE object_attribute = 'BREQ'
8724 AND custom_setup_id = p_modifier_list_rec.custom_setup_id;
8725
8726 CURSOR c_prod_line IS
8727 SELECT COUNT(*)
8728 FROM ams_act_products
8729 WHERE arc_act_product_used_by = 'OFFR'
8730 AND act_product_used_by_id = p_modifier_list_rec.qp_list_header_id;
8731
8732 CURSOR c_list_line IS
8733 SELECT COUNT(*)
8734 FROM qp_list_lines
8735 WHERE list_header_id = p_modifier_list_rec.qp_list_header_id;
8736
8737 CURSOR c_na_line IS
8738 SELECT COUNT(*)
8739 FROM ozf_offer_discount_lines
8740 WHERE offer_id =
8741 (SELECT offer_id FROM ozf_offers WHERE qp_list_header_id = p_modifier_list_rec.qp_list_header_id);
8742
8743 CURSOR c_prg_buy_count IS
8744 SELECT COUNT(*)
8745 FROM qp_list_lines
8746 WHERE list_header_id = p_modifier_list_rec.qp_list_header_id
8747 AND TRUNC(SYSDATE) <= TRUNC(NVL(end_date_active, SYSDATE))
8748 AND list_line_type_code = 'PRG';
8749
8750 CURSOR c_prg_get_count IS
8751 SELECT COUNT(*)
8752 FROM qp_list_lines
8753 WHERE list_header_id = p_modifier_list_rec.qp_list_header_id
8754 AND TRUNC(SYSDATE) <= TRUNC(NVL(end_date_active, SYSDATE))
8755 AND list_line_type_code = 'DIS';
8756
8757 l_prg_buy_count NUMBER;
8758 l_prg_get_count NUMBER;
8759
8760 -- bug 3412451 need to update budget line upon offer activation if no approval nor validation invoked
8761 CURSOR c_budget_request(p_qp_list_header_id NUMBER) IS
8762 SELECT activity_budget_id
8763 FROM ozf_act_budgets
8764 WHERE act_budget_used_by_id = p_qp_list_header_id
8765 AND arc_act_budget_used_by = 'OFFR';
8766 -- end comment
8767
8768 CURSOR c_vo_line (p_qp_list_header_id NUMBER)IS
8769 SELECT count(*) FROM ozf_offer_discount_products a, ozf_offer_discount_lines b
8770 WHERE a.offer_discount_line_id = b.offer_discount_line_id
8771 AND b.offer_id = (SELECT offer_id FROM ozf_offers WHERE qp_list_header_id = p_qp_list_header_id);
8772
8773 CURSOR c_emptyDiscStruct(cp_qpListheaderId NUMBER) IS
8774 SELECT 1 FROM
8775 ozf_offer_discount_lines a , ozf_offers b
8776 WHERE a.tier_type = 'PBH'
8777 AND a.offer_id = b.offer_id --8013
8778 AND
8779 ( NOT EXISTS(SELECT 'X' FROM ozf_offer_discount_products WHERE offer_discount_line_id = a.offer_discount_line_id AND excluder_flag = 'N')
8780 OR NOT EXISTS(SELECT 'X' FROM ozf_offer_discount_lines WHERE parent_discount_line_id = a.offer_discount_line_id)
8781 )
8782 AND b.qp_list_header_id = cp_qpListheaderId;
8783
8784 l_emptyDiscStruct VARCHAR2(1) := NULL;
8785
8786
8787
8788 CURSOR c_budget_req_count(p_list_header_id NUMBER) IS
8789 SELECT COUNT(*)
8790 FROM ozf_act_budgets
8791 WHERE arc_act_budget_used_by = 'OFFR'
8792 AND status_code = 'NEW'
8793 AND transfer_type = 'REQUEST'
8794 AND act_budget_used_by_id = p_list_header_id;
8795 l_budget_req_count NUMBER := 0;
8796 BEGIN
8797 SAVEPOINT process_modifiers;
8798 --dbms_output.put_line('calling qp procedure');
8799 IF Fnd_Api.to_boolean(p_init_msg_list) THEN
8800 Fnd_Msg_Pub.initialize;
8801 END IF;
8802
8803 IF NOT Fnd_Api.compatible_api_call
8804 (
8805 l_api_version,
8806 p_api_version,
8807 l_api_name,
8808 g_pkg_name
8809 )
8810 THEN
8811 RAISE Fnd_Api.g_exc_unexpected_error;
8812 END IF;
8813 x_return_status := Fnd_Api.g_ret_sts_success;
8814 x_error_location := 0;
8815
8816 -- added by julou 14-DEC-2001 check default profile values before going any further
8817 IF FND_PROFILE.value('OZF_PRICING_PHASE_LINEGROUP') IS NULL THEN
8818 FND_MESSAGE.set_name('OZF','OZF_NO_PRICING_PHASE_LINEGROUP');
8819 FND_MSG_PUB.add;
8820 RAISE FND_API.g_exc_unexpected_error;
8821 END IF;
8822
8823 IF FND_PROFILE.value('OZF_PRICING_PHASE_LINE') IS NULL THEN
8824 FND_MESSAGE.set_name('OZF','OZF_NO_PRICING_PHASE_LINE');
8825 FND_MSG_PUB.add;
8826 RAISE FND_API.g_exc_unexpected_error;
8827 END IF;
8828
8829 IF FND_PROFILE.value('OZF_PRICING_PHASE_ORDER') IS NULL THEN
8830 FND_MESSAGE.set_name('OZF','OZF_NO_PRICING_PHASE_ORDER');
8831 FND_MSG_PUB.add;
8832 RAISE FND_API.g_exc_unexpected_error;
8833 END IF;
8834
8835 IF FND_PROFILE.value('OZF_PRICING_GROUP_SEQUENCE') IS NULL THEN
8836 FND_MESSAGE.set_name('OZF','OZF_NO_PRICING_GROUP_SEQUENCE');
8837 FND_MSG_PUB.add;
8838 RAISE FND_API.g_exc_unexpected_error;
8839 END IF;
8840
8841 IF FND_PROFILE.value('OZF_PRINT_ON_INVOICE') IS NULL THEN
8842 FND_MESSAGE.set_name('OZF','OZF_NO_PRINT_ON_INVOICE');
8843 FND_MSG_PUB.add;
8844 RAISE FND_API.g_exc_unexpected_error;
8845 END IF;
8846 /* julou bug 3498759 - comment OUT NOCOPY as these profiles are not mandatory
8847 IF FND_PROFILE.value('OZF_INCOMPATIBILITY_GROUP') IS NULL THEN
8848 FND_MESSAGE.set_name('OZF','OZF_NO_INCOMPATIBILITY_GROUP');
8849 FND_MSG_PUB.add;
8850 RAISE FND_API.g_exc_unexpected_error;
8851 END IF;
8852 */
8853 IF FND_PROFILE.value('OZF_PRODUCT_PRECEDENCE') IS NULL THEN
8854 FND_MESSAGE.set_name('OZF','OZF_NO_PRODUCT_PRECEDENCE');
8855 FND_MSG_PUB.add;
8856 RAISE FND_API.g_exc_unexpected_error;
8857 END IF;
8858
8859 -- end of code added by julou
8860 validate_offer_dates(
8861 p_api_version => 1.0
8862 ,p_init_msg_list => p_init_msg_list
8863 ,x_return_status => x_return_status
8864 ,x_msg_count => x_msg_count
8865 ,x_msg_data => x_msg_data
8866 ,p_offer_rec => p_modifier_list_rec
8867 );
8868
8869 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
8870 RAISE Fnd_Api.g_exc_error;
8871 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
8872 RAISE Fnd_Api.g_exc_unexpected_error;
8873 END IF;
8874
8875 IF p_modifier_list_rec.modifier_operation <> FND_API.g_miss_char THEN
8876
8877 IF p_modifier_list_rec.modifier_operation = 'UPDATE' THEN
8878
8879 OPEN cur_get_user_status;
8880 FETCH cur_get_user_status INTO l_old_status_id,l_owner_id,l_old_status_code,l_old_offer_id;
8881 CLOSE cur_get_user_status;
8882
8883 IF l_old_status_code = 'ACTIVE' THEN
8884 --julou in active status, if recal='N', validated committed vs approved othterwise do nothing
8885 IF FND_PROFILE.VALUE('OZF_BUDGET_ADJ_ALLOW_RECAL') = 'N' THEN
8886 validate_offer
8887 (
8888 p_api_version => 1.0
8889 ,p_init_msg_list => p_init_msg_list
8890 ,x_return_status => x_return_status
8891 ,x_msg_count => x_msg_count
8892 ,x_msg_data => x_msg_data
8893 ,p_offer_rec => p_modifier_list_rec
8894 );
8895
8896 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
8897 RAISE Fnd_Api.g_exc_error;
8898 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
8899 RAISE Fnd_Api.g_exc_unexpected_error;
8900 END IF;
8901 END IF;
8902 END IF;
8903
8904 IF (p_modifier_list_rec.user_status_id <> FND_API.g_miss_num)
8905 AND (p_modifier_list_rec.user_status_id <> l_old_status_id) THEN
8906
8907 l_new_status_code := OZF_Utility_PVT.get_system_status_code(p_modifier_list_rec.user_status_id);
8908
8909 --IF l_new_status_code = 'ACTIVE' THEN
8910
8911 OZF_Utility_PVT.check_new_status_change
8912 (
8913 p_object_type => 'OFFR',
8914 p_object_id => p_modifier_list_rec.qp_list_header_id,
8915 p_old_status_id => l_old_status_id,
8916 p_new_status_id => p_modifier_list_rec.user_status_id,
8917 p_custom_setup_id => p_modifier_list_rec.custom_setup_id,
8918 x_approval_type => l_approval_type,
8919 x_return_status => x_return_status
8920 );
8921
8922 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
8923 RAISE Fnd_Api.g_exc_error;
8924 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
8925 RAISE Fnd_Api.g_exc_unexpected_error;
8926 END IF;
8927
8928 OPEN c_budget_required;
8929 FETCH c_budget_required INTO l_budget_required;
8930 CLOSE c_budget_required;
8931
8932 --END IF;
8933
8934 END IF;
8935
8936 END IF;
8937
8938 IF p_modifier_list_rec.offer_type = 'VOLUME_OFFER' THEN
8939 l_modifier_list_rec.offer_type := p_modifier_list_rec.volume_offer_type;
8940 END IF;
8941
8942 IF p_modifier_list_rec.modifier_operation = 'UPDATE' THEN
8943 IF getDateQualifier(p_qpListHeaderId => p_modifier_list_rec.qp_list_header_id) = 'A'
8944 THEN
8945 offer_dates(
8946 p_modifier_list_rec => p_modifier_list_rec
8947 ,x_return_status => x_return_status
8948 ,x_msg_count => x_msg_count
8949 ,x_msg_data => x_msg_data
8950 );
8951
8952 ELSIF getDateQualifier(p_qpListHeaderId => p_modifier_list_rec.qp_list_header_id) = 'Y'
8953 THEN
8954 offer_dates(
8955 p_modifier_list_rec => p_modifier_list_rec
8956 ,x_return_status => x_return_status
8957 ,x_msg_count => x_msg_count
8958 ,x_msg_data => x_msg_data
8959 );
8960
8961 l_modifier_list_rec.start_date_active_first := Fnd_Api.g_miss_date;
8962 l_modifier_list_rec.end_date_active_first := Fnd_Api.g_miss_date;
8963 l_modifier_list_rec.start_date_active_second := Fnd_Api.g_miss_date;
8964 l_modifier_list_rec.end_date_active_second := Fnd_Api.g_miss_date;
8965
8966 END IF;
8967
8968 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
8969 RAISE Fnd_Api.g_exc_error;
8970 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
8971 RAISE Fnd_Api.g_exc_unexpected_error;
8972 END IF;
8973 END IF;
8974
8975 IF l_approval_type IS NULL AND (l_budget_required = 'N' OR l_budget_required IS NULL) THEN
8976 l_approval_required := NULL;
8977 ELSE
8978 l_approval_required := 'Y';
8979 END IF;
8980
8981 l_modifier_list_rec.offer_type := p_offer_type;
8982
8983 IF p_modifier_list_rec.global_flag = 'Y' THEN
8984 IF p_modifier_list_rec.orig_org_id IS NOT NULL AND p_modifier_list_rec.orig_org_id <> fnd_api.g_miss_num THEN
8985 FND_MESSAGE.set_name('OZF', 'OZF_CLEAR_OU');
8986 FND_MSG_PUB.add;
8987 RAISE FND_API.g_exc_error;
8988 END IF;
8989 END IF;
8990
8991
8992 l_modifier_list_rec.global_flag := p_modifier_list_rec.global_flag;
8993 l_modifier_list_rec.orig_org_id := p_modifier_list_rec.orig_org_id;
8994
8995 -- if org id is sent from the ui pass it on
8996 -- of org id is not passed from the ui,
8997 -- and if global flag is set as no
8998 -- and if default org profile is not set then raise not default org is profile
8999
9000 -- if orgid is not sent from the ui and
9001
9002 /*
9003 Org Id is always required for ScanData and Lumpsum offers
9004 */
9005 IF (p_offer_type = 'LUMPSUM'OR p_offer_type = 'SCAN_DATA') THEN
9006 IF (
9007 (
9008 (p_modifier_list_rec.modifier_operation = 'CREATE' )
9009 AND
9010 (p_modifier_list_rec.orig_org_id IS NULL OR p_modifier_list_rec.orig_org_id = FND_API.G_MISS_NUM)
9011 )
9012 OR
9013 (
9014 (p_modifier_list_rec.modifier_operation = 'UPDATE' )
9015 AND
9016 (p_modifier_list_rec.orig_org_id IS NULL)
9017 )
9018 )
9019 THEN
9020 FND_MESSAGE.SET_NAME('QP','QP_ATTRIBUTE_REQUIRED');
9021 FND_MESSAGE.SET_TOKEN('ATTRIBUTE','ORG_ID');
9022 FND_MSG_PUB.add;
9023 RAISE FND_API.g_exc_error;
9024 END IF;
9025 END IF;
9026 --dbms_output.put_line('calling process qp_ list header');
9027 process_qp_list_header(
9028 p_api_version => 1.0,
9029 p_init_msg_list => p_init_msg_list,
9030 x_return_status => x_return_status,
9031 x_msg_count => x_msg_count,
9032 x_msg_data => x_msg_data,
9033 p_modifier_list_rec => l_modifier_list_rec,
9034 x_modifier_list_rec => v_modifier_list_rec,
9035 p_old_status_id => l_old_status_id,
9036 p_approval_type => l_approval_required,
9037 p_new_status_code => l_new_status_code
9038 );
9039 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
9040 RAISE Fnd_Api.g_exc_error;
9041 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
9042 RAISE Fnd_Api.g_exc_unexpected_error;
9043 END IF;
9044
9045 debug_message('Operation is is :'|| p_modifier_list_rec.modifier_operation);
9046
9047 IF p_modifier_list_rec.modifier_operation = 'CREATE' THEN
9048 temp_modifier_list_rec.qp_list_header_id := v_modifier_list_rec.qp_list_header_id;
9049 x_qp_list_header_id := v_modifier_list_rec.qp_list_header_id;
9050 temp_modifier_list_rec.offer_code := v_modifier_list_rec.name;
9051
9052 ELSIF p_modifier_list_rec.modifier_operation = 'UPDATE' THEN
9053 IF l_new_status_code = 'ACTIVE' AND p_modifier_list_rec.offer_type = 'VOLUME_OFFER' THEN
9054 ozf_check_dup_prod_pvt.check_dup_prod(
9055 x_return_status => x_return_status
9056 ,x_msg_count => x_msg_count
9057 ,x_msg_data => x_msg_data
9058 ,p_offer_id => l_old_offer_id);
9059
9060 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
9061 RAISE Fnd_Api.g_exc_error;
9062 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
9063 RAISE Fnd_Api.g_exc_unexpected_error;
9064 END IF;
9065 END IF;
9066
9067 IF l_approval_type = 'THEME' THEN
9068 temp_modifier_list_rec.user_status_id := OZF_Utility_PVT.get_default_user_status('OZF_OFFER_STATUS','SUBMITTED_TA');
9069 temp_modifier_list_rec.status_code := 'SUBMITTED_TA';
9070 ELSIF l_approval_type = 'BUDGET' THEN
9071 temp_modifier_list_rec.user_status_id := OZF_Utility_PVT.get_default_user_status('OZF_OFFER_STATUS','PENDING');
9072 temp_modifier_list_rec.status_code := 'PENDING';
9073 -- julou budget w/o approval scenario
9074 ELSIF l_budget_required = 'Y' THEN
9075 IF l_new_status_code = 'ACTIVE' THEN
9076 temp_modifier_list_rec.user_status_id := OZF_Utility_PVT.get_default_user_status('OZF_OFFER_STATUS','PENDING_VALIDATION');
9077 temp_modifier_list_rec.status_code := 'PENDING_VALIDATION';
9078 END IF;
9079 ELSE -- no validation or approval required
9080 IF l_new_status_code = 'ACTIVE' THEN
9081 OPEN c_budget_req_count(temp_modifier_list_rec.qp_list_header_id);
9082 FETCH c_budget_req_count INTO l_budget_req_count;
9083 CLOSE c_budget_req_count;
9084
9085 IF l_budget_req_count = 0 THEN
9086 temp_modifier_list_rec.user_status_id := OZF_Utility_PVT.get_default_user_status('OZF_OFFER_STATUS','ACTIVE');
9087 temp_modifier_list_rec.status_code := 'ACTIVE';
9088 ELSE
9089 OZF_budgetapproval_pvt.budget_request_approval(
9090 p_init_msg_list => FND_API.G_FALSE
9091 ,p_api_version => l_api_version
9092 ,p_commit => FND_API.G_FALSE
9093 ,x_return_status => x_return_status
9094 ,x_msg_count => x_msg_count
9095 ,x_msg_data => x_msg_data
9096 ,p_object_type => 'OFFR'
9097 ,p_object_id => temp_modifier_list_rec.qp_list_header_id
9098 ,x_status_code => l_status_code);
9099
9100 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
9101 RAISE Fnd_Api.g_exc_error;
9102 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
9103 RAISE Fnd_Api.g_exc_unexpected_error;
9104 END IF;
9105
9106 temp_modifier_list_rec.user_status_id := OZF_Utility_PVT.get_default_user_status('OZF_OFFER_STATUS',l_status_code);
9107 temp_modifier_list_rec.status_code := l_status_code;
9108 END IF;
9109 END IF;
9110 -- julou end
9111 END IF;
9112
9113 END IF;
9114
9115 IF p_modifier_list_rec.offer_operation <> FND_API.g_miss_char THEN
9116 process_ozf_offer(
9117 p_api_version => 1.0,
9118 p_init_msg_list => p_init_msg_list,
9119 x_return_status => x_return_status,
9120 x_msg_count => x_msg_count,
9121 x_msg_data => x_msg_data,
9122 p_modifier_list_rec => temp_modifier_list_rec,
9123 x_offer_id => l_offer_id
9124 );
9125
9126 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
9127 RAISE Fnd_Api.g_exc_error;
9128 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
9129 RAISE Fnd_Api.g_exc_unexpected_error;
9130 END IF;
9131 /*
9132 IF l_budget_req_count > 0 THEN
9133 OZF_budgetapproval_pvt.budget_request_approval(
9134 p_init_msg_list => FND_API.G_FALSE
9135 ,p_api_version => l_api_version
9136 ,p_commit => FND_API.G_FALSE
9137 ,x_return_status => x_return_status
9138 ,x_msg_count => x_msg_count
9139 ,x_msg_data => x_msg_data
9140 ,p_object_type => 'OFFR'
9141 ,p_object_id => temp_modifier_list_rec.qp_list_header_id
9142 ,x_status_code => l_status_code);
9143
9144 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
9145 RAISE Fnd_Api.g_exc_error;
9146 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
9147 RAISE Fnd_Api.g_exc_unexpected_error;
9148 END IF;
9149 END IF;
9150 */
9151 -- If Offer is activated then Raise business event
9152 IF (p_modifier_list_rec.modifier_operation = 'UPDATE') AND (p_modifier_list_rec.user_status_id <> FND_API.g_miss_num)
9153 AND (p_modifier_list_rec.user_status_id <> l_old_status_id)
9154 THEN
9155 raise_offer_event(p_offer_id => temp_modifier_list_rec.qp_list_header_id );
9156 END IF;
9157
9158 debug_message('after raise_offer_event:');
9159 -- julou create budget request for scan data offer if initial product line is created
9160 -- julou 12-10-2002 if source from campaign, use campaign id as budget source id
9161 -- and create budget request.
9162 IF temp_modifier_list_rec.source_from_parent = 'Y' THEN
9163 temp_modifier_list_rec.budget_source_id := temp_modifier_list_rec.offer_used_by_id;
9164 temp_modifier_list_rec.budget_source_type := 'CAMP';
9165 END IF;
9166
9167 IF p_offer_type = 'SCAN_DATA' THEN
9168 -- IF get_budget_source_count(p_modifier_list_rec.qp_list_header_id) = 0
9169 -- THEN
9170 -- uncommented by gramanat
9171 OPEN c_offer_budget;
9172 FETCH c_offer_budget INTO temp_modifier_list_rec.budget_source_type, temp_modifier_list_rec.budget_source_id, temp_modifier_list_rec.budget_amount_tc;
9173 CLOSE c_offer_budget;
9174 -- end uncommented by gramanat
9175 debug_message('GR: temp_modifier_list_rec.budget_source_type: ' || temp_modifier_list_rec.budget_source_type);
9176 debug_message('GR: temp_modifier_list_rec.budget_source_id: ' || temp_modifier_list_rec.budget_source_id);
9177
9178 IF temp_modifier_list_rec.budget_source_id IS NOT NULL THEN
9179 IF temp_modifier_list_rec.offer_amount = Fnd_Api.g_miss_num THEN
9180 offer_budget(
9181 p_modifier_list_rec => temp_modifier_list_rec
9182 ,x_return_status => x_return_status
9183 ,x_msg_count => x_msg_count
9184 ,x_msg_data => x_msg_data
9185 ,p_operation => p_modifier_list_rec.modifier_operation
9186 );
9187
9188 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
9189 RAISE Fnd_Api.g_exc_error;
9190 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
9191 RAISE Fnd_Api.g_exc_unexpected_error;
9192 END IF;
9193
9194 -- END IF;
9195 END IF;
9196 END IF;
9197 END IF;
9198 -- julou end
9199
9200 IF p_modifier_list_rec.modifier_operation = 'CREATE' THEN
9201 AMS_CampaignRules_PVT.push_source_code(
9202 temp_modifier_list_rec.offer_code,
9203 'OFFR',
9204 x_qp_list_header_id
9205 );
9206 END IF;
9207
9208 END IF;
9209
9210 IF p_modifier_list_rec.offer_operation = 'UPDATE'
9211 AND p_modifier_list_rec.modifier_operation = 'UPDATE' THEN
9212
9213 IF (p_modifier_list_rec.user_status_id <> FND_API.g_miss_num)
9214 AND (p_modifier_list_rec.user_status_id <> l_old_status_id) THEN
9215
9216
9217 IF l_new_status_code = 'ACTIVE' THEN
9218 -- julou bug 2122722 activating offer w/o discount lines
9219 IF p_modifier_list_rec.offer_type IN ('LUMPSUM','SCAN_DATA') THEN
9220 OPEN c_prod_line;
9221 FETCH c_prod_line INTO l_lines_count;
9222 CLOSE c_prod_line;
9223 ELSIF p_modifier_list_rec.offer_type = 'OID' THEN
9224 OPEN c_prg_buy_count;
9225 FETCH c_prg_buy_count INTO l_prg_buy_count;
9226 CLOSE c_prg_buy_count;
9227
9228 OPEN c_prg_get_count;
9229 FETCH c_prg_get_count INTO l_prg_get_count;
9230 CLOSE c_prg_get_count;
9231
9232 l_lines_count := LEAST(l_prg_buy_count, l_prg_get_count);
9233 ELSIF p_modifier_list_rec.offer_type = 'NET_ACCRUAL' THEN
9234 OPEN c_na_line;
9235 FETCH c_na_line INTO l_lines_count;
9236 CLOSE c_na_line;
9237 ELSIF p_modifier_list_rec.offer_type = 'VOLUME_OFFER' THEN
9238
9239 OPEN c_vo_line(p_modifier_list_rec.qp_list_header_id) ;
9240 FETCH c_vo_line INTO l_lines_count;
9241 CLOSE c_vo_line;
9242
9243 OPEN c_emptyDiscStruct(cp_qpListheaderId => p_modifier_list_rec.qp_list_header_id);
9244 FETCH c_emptyDiscStruct INTO l_emptyDiscStruct;
9245 IF c_emptyDiscStruct%NOTFOUND THEN
9246 l_emptyDiscStruct := NULL;
9247 END IF;
9248 CLOSE c_emptyDiscStruct;
9249 ELSE
9250 OPEN c_list_line;
9251 FETCH c_list_line INTO l_lines_count;
9252 CLOSE c_list_line;
9253 END IF;
9254 debug_message('l_lines_count :'||l_lines_count);
9255
9256 IF l_lines_count = 0 THEN
9257 IF p_modifier_list_rec.custom_setup_id <> 110 THEN
9258 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
9259 FND_MESSAGE.set_name('OZF', 'OZF_OFFR_NO_DISC_LINES');
9260 FND_MSG_PUB.add;
9261 END IF;
9262 RAISE FND_API.g_exc_error;
9263 END IF;
9264 END IF;
9265 -- julou end bug 2122722
9266 -- julou BREQ
9267 IF l_emptyDiscStruct = '1' THEN
9268 FND_MESSAGE.set_name('OZF', 'OZF_OFFR_EMPTY_DISC_STRUCT');
9269 FND_MSG_PUB.add;
9270 RAISE FND_API.g_exc_error;
9271 END IF;
9272
9273
9274 IF l_budget_required = 'Y' THEN
9275 IF get_budget_source_count(p_modifier_list_rec.qp_list_header_id) = 0 THEN
9276 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
9277 FND_MESSAGE.set_name('OZF', 'OZF_OFFR_NO_BUDGET_REQUEST');
9278 FND_MSG_PUB.add;
9279 END IF;
9280 RAISE FND_API.g_exc_error;
9281 END IF;
9282 END IF;
9283
9284 -- validate scan data offer budgets
9285 IF p_modifier_list_rec.offer_type = 'SCAN_DATA' THEN
9286 validate_scandata_budget(p_init_msg_list => FND_API.G_FALSE
9287 ,p_api_version => l_api_version
9288 ,x_return_status => x_return_status
9289 ,x_msg_count => x_msg_count
9290 ,x_msg_data => x_msg_data
9291 ,p_qp_list_header_id => p_modifier_list_rec.qp_list_header_id);
9292
9293 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
9294 RAISE Fnd_Api.g_exc_error;
9295 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
9296 RAISE Fnd_Api.g_exc_unexpected_error;
9297 END IF;
9298 END IF;
9299 END IF;
9300
9301
9302
9303 IF l_approval_type IS NULL THEN
9304 -- budget approval is not required, call budget_request_approval
9305 -- enhancement for budget w/o approval scenario
9306 IF l_budget_required = 'Y' AND l_new_status_code = 'ACTIVE' THEN
9307 IF l_old_status_code <> 'PENDING_ACTIVE' THEN
9308 OZF_budgetapproval_pvt.budget_request_approval(
9309 p_init_msg_list => FND_API.G_FALSE
9310 ,p_api_version => l_api_version
9311 ,p_commit => FND_API.G_FALSE
9312 ,x_return_status => x_return_status
9313 ,x_msg_count => x_msg_count
9314 ,x_msg_data => x_msg_data
9315 ,p_object_type => 'OFFR'
9316 ,p_object_id => p_modifier_list_rec.qp_list_header_id
9317 ,x_status_code => l_status_code);
9318
9319 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
9320 RAISE Fnd_Api.g_exc_error;
9321 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
9322 RAISE Fnd_Api.g_exc_unexpected_error;
9323 END IF;
9324
9325 temp_modifier_list_rec.user_status_id := OZF_Utility_PVT.get_default_user_status('OZF_OFFER_STATUS',l_status_code);
9326 temp_modifier_list_rec.status_code := l_status_code;
9327 END IF;
9328 --julou end BREQ
9329 -- julou handle status depending on recal(handled by activate_offer_over).
9330 -- if active(no product validation is required, 'ACTIVE' is returned directly),
9331 -- need to call activate_offer_over for posting, validation, and updating status.
9332 -- otherwise, budget API will call its CP and activate_offer_over is
9333 -- called inside itself. no further action required here.
9334 -- if from PENDING_ACTIVE to ACTIVE, no budget validation is called.
9335 IF l_old_status_code = 'PENDING_ACTIVE' OR l_status_code = 'ACTIVE' THEN
9336 Activate_Offer_over(
9337 p_init_msg_list => FND_API.G_FALSE
9338 ,p_api_version => l_api_version
9339 ,p_commit => FND_API.G_FALSE
9340 ,x_return_status => x_return_status
9341 ,x_msg_count => x_msg_count
9342 ,x_msg_data => x_msg_data
9343 ,p_called_from => 'R'
9344 ,p_offer_rec => temp_modifier_list_rec
9345 ,x_amount_error => l_amount_error
9346 );
9347 debug_message('Activate_Offer_over :'|| x_return_status);
9348 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
9349 RAISE Fnd_Api.g_exc_error;
9350 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
9351 RAISE Fnd_Api.g_exc_unexpected_error;
9352 END IF;
9353 ELSIF l_status_code = 'DRAFT' THEN
9354 -- CP validation fails. update offer to DRAFT
9355 UPDATE ozf_offers
9356 SET status_code = 'DRAFT'
9357 ,user_status_id = OZF_Utility_PVT.get_default_user_status ('OZF_OFFER_STATUS', 'DRAFT')
9358 ,status_date = SYSDATE
9359 ,object_version_number = object_version_number + 1
9360 WHERE qp_list_header_id = p_modifier_list_rec.qp_list_header_id;
9361 END IF;
9362 END IF;-- end l_budget_required='Y'
9363 ELSIF l_approval_type = 'BUDGET' THEN
9364 IF l_old_status_code <> 'PENDING_ACTIVE' THEN
9365 validate_offer_approval
9366 ( x_return_status => x_return_status
9367 ,x_msg_count => x_msg_count
9368 ,x_msg_data => x_msg_data
9369 ,p_init_msg_list => FND_API.G_FALSE
9370 ,p_modifier_list_rec => p_modifier_list_rec );
9371
9372 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
9373 RAISE Fnd_Api.g_exc_error;
9374 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
9375 RAISE Fnd_Api.g_exc_unexpected_error;
9376 END IF;
9377
9378 ams_approval_pvt.StartProcess(
9379 p_activity_type => 'OFFR',
9380 p_activity_id => p_modifier_list_rec.qp_list_header_id,
9381 p_approval_type => 'BUDGET',
9382 p_object_version_number => p_modifier_list_rec.object_version_number+1,
9383 p_orig_stat_id => l_old_status_id,
9384 p_new_stat_id => p_modifier_list_rec.user_status_id,
9385 p_reject_stat_id => OZF_Utility_PVT.get_default_user_status('OZF_OFFER_STATUS','REJECTED'),
9386 p_requester_userid => OZF_Utility_PVT.get_resource_id(NVL(FND_GLOBAL.user_id,-1)),
9387 p_workflowprocess => 'AMS_APPROVAL',
9388 p_item_type => 'AMSAPRV');
9389 ELSE
9390 Activate_Offer_over(
9391 p_init_msg_list => FND_API.G_FALSE
9392 ,p_api_version => l_api_version
9393 ,p_commit => FND_API.G_FALSE
9394 ,x_return_status => x_return_status
9395 ,x_msg_count => x_msg_count
9396 ,x_msg_data => x_msg_data
9397 ,p_called_from => 'R'
9398 ,p_offer_rec => temp_modifier_list_rec
9399 ,x_amount_error => l_amount_error
9400 );
9401
9402 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
9403 RAISE Fnd_Api.g_exc_error;
9404 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
9405 RAISE Fnd_Api.g_exc_unexpected_error;
9406 END IF;
9407 END IF;
9408 ELSIF l_approval_type = 'THEME' THEN
9409 ams_approval_pvt.StartProcess(
9410 p_activity_type => 'OFFR',
9411 p_activity_id => p_modifier_list_rec.qp_list_header_id,
9412 p_approval_type => 'CONCEPT',
9413 p_object_version_number => p_modifier_list_rec.object_version_number+1,
9414 p_orig_stat_id => l_old_status_id,
9415 p_new_stat_id => p_modifier_list_rec.user_status_id,
9416 p_reject_stat_id => OZF_Utility_PVT.get_default_user_status('OZF_OFFER_STATUS','DENIED_TA'),
9417 p_requester_userid => OZF_Utility_PVT.get_resource_id(NVL(FND_GLOBAL.user_id,-1)),
9418 p_workflowprocess => 'AMS_CONCEPT_APPROVAL',
9419 p_item_type => 'AMSAPRV');
9420 END IF;
9421 END IF;
9422 END IF;
9423
9424
9425 IF (p_modifier_list_rec.modifier_operation ='CREATE')
9426 OR
9427 (p_modifier_list_rec.modifier_operation ='UPDATE' AND get_campaign_count(p_modifier_list_rec.qp_list_header_id) < 1)
9428 THEN
9429 IF p_modifier_list_rec.offer_used_by_id <> Fnd_Api.g_miss_num
9430 AND p_modifier_list_rec.offer_used_by_id IS NOT NULL
9431 THEN
9432
9433 offer_object_usage(
9434 p_modifier_list_rec => temp_modifier_list_rec
9435 ,x_return_status => x_return_status
9436 ,x_msg_count => x_msg_count
9437 ,x_msg_data => x_msg_data
9438 );
9439
9440 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
9441 RAISE Fnd_Api.g_exc_error;
9442 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
9443 RAISE Fnd_Api.g_exc_unexpected_error;
9444 END IF;
9445 END IF;
9446 END IF;
9447
9448
9449
9450 -- RSSHARMA changed condition to attach a budget even in create page
9451 -- julou 12-10-2002 if source from campaign, use campaign id as budget source id
9452 -- and create budget request.
9453 IF p_modifier_list_rec.source_from_parent = 'Y' THEN
9454 temp_modifier_list_rec.budget_source_id := p_modifier_list_rec.offer_used_by_id;
9455 temp_modifier_list_rec.budget_source_type := 'CAMP';
9456 END IF;
9457
9458 IF (p_modifier_list_rec.modifier_operation ='CREATE')
9459 OR
9460 (p_modifier_list_rec.modifier_operation ='UPDATE' AND get_budget_source_count(p_modifier_list_rec.qp_list_header_id) < 1)
9461 THEN
9462 IF (temp_modifier_list_rec.budget_source_id <> Fnd_Api.g_miss_num
9463 AND temp_modifier_list_rec.budget_source_id IS NOT NULL )
9464 AND ( p_modifier_list_rec.offer_amount <> Fnd_Api.g_miss_num
9465 AND p_modifier_list_rec.offer_amount IS NOT NULL
9466 )
9467
9468 THEN
9469 offer_budget(
9470 p_modifier_list_rec => temp_modifier_list_rec
9471 ,x_return_status => x_return_status
9472 ,x_msg_count => x_msg_count
9473 ,x_msg_data => x_msg_data
9474 ,p_operation => p_modifier_list_rec.modifier_operation
9475 );
9476 END IF;
9477 END IF;
9478
9479
9480
9481 -- x_return_status := Fnd_Api.g_ret_sts_error;
9482 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
9483 RAISE Fnd_Api.g_exc_error;
9484 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
9485 RAISE Fnd_Api.g_exc_unexpected_error;
9486 END IF;
9487
9488 debug_message('Offer Type is : '|| p_offer_type);
9489 IF p_offer_type NOT IN ('LUMPSUM','SCAN_DATA', 'VOLUME_OFFER', 'NET_ACCRUAL') THEN
9490 IF p_modifier_list_rec.modifier_operation IN ('CREATE','UPDATE') THEN
9491 IF (p_modifier_list_rec.ql_qualifier_id <> Fnd_Api.g_miss_num
9492 AND p_modifier_list_rec.ql_qualifier_id IS NOT NULL)
9493 OR
9494 (
9495 p_modifier_list_rec.sales_method_flag IS NOT NULL
9496 AND
9497 p_modifier_list_rec.sales_method_flag <> Fnd_Api.g_miss_char
9498 )
9499 THEN
9500 offer_qualifier(
9501 p_modifier_list_rec => temp_modifier_list_rec
9502 ,x_return_status => x_return_status
9503 ,x_msg_count => x_msg_count
9504 ,x_msg_data => x_msg_data
9505 );
9506
9507 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
9508 RAISE Fnd_Api.g_exc_error;
9509 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
9510 RAISE Fnd_Api.g_exc_unexpected_error;
9511 END IF;
9512
9513 END IF; -- ql_qualifier_id is not null
9514
9515 END IF; -- operation
9516 ELSIF p_offer_type = 'NET_ACCRUAL' THEN
9517 IF p_modifier_list_rec.na_qualifier_type IS NOT NULL
9518 AND p_modifier_list_rec.na_qualifier_type <> fnd_api.g_miss_char
9519 AND p_modifier_list_rec.na_qualifier_id IS NOT NULL
9520 AND p_modifier_list_rec.na_qualifier_id <> fnd_api.g_miss_num
9521 THEN
9522 /*
9523 IF p_modifier_list_rec.na_qualifier_type = 'CUSTOMER' THEN
9524 l_na_qual_context := 'CUSTOMER';
9525 l_na_qual_attribute := 'QUALIFIER_ATTRIBUTE2';
9526 ELSIF p_modifier_list_rec.na_qualifier_type = 'CUSTOMER_BILL_TO' THEN
9527 l_na_qual_context := 'CUSTOMER';
9528 l_na_qual_attribute := 'QUALIFIER_ATTRIBUTE14';
9529 ELSIF p_modifier_list_rec.na_qualifier_type = 'BUYER' THEN
9530 l_na_qual_context := 'CUSTOMER_GROUP';
9531 l_na_qual_attribute := 'QUALIFIER_ATTRIBUTE3';
9532 ELSIF p_modifier_list_rec.na_qualifier_type = 'LIST' THEN
9533 l_na_qual_context := 'CUSTOMER_GROUP';
9534 l_na_qual_attribute := 'QUALIFIER_ATTRIBUTE1';
9535 ELSIF p_modifier_list_rec.na_qualifier_type = 'SEGMENT' THEN
9536 l_na_qual_context := 'CUSTOMER_GROUP';
9537 l_na_qual_attribute := 'QUALIFIER_ATTRIBUTE2';
9538 ELSIF p_modifier_list_rec.na_qualifier_type = 'TERRITORY' THEN
9539 l_na_qual_context := 'TERRITORY';
9540 l_na_qual_attribute := 'QUALIFIER_ATTRIBUTE1';
9541 ELSIF p_modifier_list_rec.na_qualifier_type = 'SHIP_TO' THEN
9542 l_na_qual_context := 'CUSTOMER';
9543 l_na_qual_attribute := 'QUALIFIER_ATTRIBUTE11';
9544 END IF;
9545 */
9546 INSERT INTO ozf_offer_qualifiers(
9547 qualifier_id
9548 ,creation_date
9549 ,created_by
9550 ,last_update_date
9551 ,last_updated_by
9552 ,last_update_login
9553 ,qualifier_grouping_no
9554 ,qualifier_context
9555 ,qualifier_attribute
9556 ,qualifier_attr_value
9557 ,start_date_active
9558 ,end_date_active
9559 ,offer_id
9560 ,active_flag
9561 ,object_version_number)
9562 VALUES(
9563 ozf_offer_qualifiers_s.NEXTVAL
9564 ,SYSDATE
9565 ,FND_GLOBAL.user_id
9566 ,SYSDATE
9567 ,FND_GLOBAL.user_id
9568 ,FND_GLOBAL.conc_login_id
9569 ,10
9570 ,NULL--l_na_qual_context
9571 ,p_modifier_list_rec.na_qualifier_type--l_na_qual_attribute
9572 ,TO_CHAR(p_modifier_list_rec.na_qualifier_id)
9573 ,p_modifier_list_rec.start_date_active
9574 ,p_modifier_list_rec.end_date_active
9575 ,l_offer_id
9576 ,'Y'
9577 ,1);
9578 END IF;
9579 ELSIF p_offer_type = 'VOLUME_OFFER' THEN
9580 -- v_modifier_list_rec
9581 l_modifier_list_rec := p_modifier_list_rec;
9582 l_modifier_list_rec.offer_id := l_offer_id;
9583 l_modifier_list_rec.qp_list_header_id := v_modifier_list_rec.qp_list_header_id;
9584 vo_qualifier
9585 (
9586 p_init_msg_list => p_init_msg_list
9587 ,p_api_version => p_api_version
9588 ,p_commit => p_commit
9589 ,x_return_status => x_return_status
9590 ,x_msg_count => x_msg_count
9591 ,x_msg_data => x_msg_data
9592 ,p_modifier_list_rec => l_modifier_list_rec
9593 );
9594
9595 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
9596 RAISE Fnd_Api.g_exc_error;
9597 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
9598 RAISE Fnd_Api.g_exc_unexpected_error;
9599 END IF;
9600
9601
9602 END IF; -- OFFER_TYPE
9603
9604 END IF;
9605 debug_message('p_modifier_line_tbl.COUNT :'|| p_modifier_line_tbl.COUNT);
9606 IF p_modifier_line_tbl.COUNT > 0 THEN
9607 process_qp_list_lines
9608 (
9609 x_return_status => x_return_status,
9610 x_msg_count => x_msg_count,
9611 x_msg_data => x_msg_data,
9612 p_offer_type => p_offer_type,
9613 p_modifier_line_tbl => l_modifier_line_tbl,
9614 p_list_header_id => temp_modifier_list_rec.qp_list_header_id,
9615 x_modifier_line_tbl => v_modifier_line_tbl,
9616 x_error_location => x_error_location
9617 );
9618 debug_message('process_qp_list_lines x_return_status '||x_return_status);
9619 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
9620 RAISE Fnd_Api.g_exc_error;
9621 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
9622 RAISE Fnd_Api.g_exc_unexpected_error;
9623 END IF;
9624
9625
9626 END IF;
9627
9628 IF p_modifier_list_rec.custom_setup_id = 118 THEN
9629 IF p_modifier_list_rec.user_status_id = OZF_Utility_PVT.get_default_user_status('OZF_OFFER_STATUS','DENIED_TA')
9630 OR p_modifier_list_rec.user_status_id = OZF_Utility_PVT.get_default_user_status('OZF_OFFER_STATUS','REJECTED') THEN --
9631
9632
9633 update ozf_sd_request_headers_all_b set user_status_id= OZF_Utility_PVT.get_default_user_status('OZF_SD_REQUEST_STATUS','OFFER_REJECTED')
9634 where offer_id=p_modifier_list_rec.qp_list_header_id;
9635
9636 ELSIF p_modifier_list_rec.user_status_id = OZF_Utility_PVT.get_default_user_status('OZF_OFFER_STATUS','ACTIVE') THEN
9637
9638 update ozf_sd_request_headers_all_b set user_status_id= OZF_Utility_PVT.get_default_user_status('OZF_SD_REQUEST_STATUS','ACTIVE')
9639 where offer_id= p_modifier_list_rec.qp_list_header_id;
9640
9641 END IF;
9642 END IF;
9643
9644 Fnd_Msg_Pub.Count_AND_Get
9645 ( p_count => x_msg_count,
9646 p_data => x_msg_data,
9647 p_encoded => Fnd_Api.G_FALSE
9648 );
9649 IF p_commit = Fnd_Api.g_true THEN
9650 COMMIT WORK;
9651 END IF;
9652 EXCEPTION
9653 WHEN Fnd_Api.G_EXC_ERROR THEN
9654 x_return_status := Fnd_Api.g_ret_sts_error ;
9655 ROLLBACK TO process_modifiers;
9656 Fnd_Msg_Pub.Count_AND_Get
9657 ( p_count => x_msg_count,
9658 p_data => x_msg_data,
9659 p_encoded => Fnd_Api.G_FALSE
9660 );
9661 WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
9662 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
9663 ROLLBACK TO process_modifiers;
9664 Fnd_Msg_Pub.Count_AND_Get
9665 ( p_count => x_msg_count,
9666 p_data => x_msg_data,
9667 p_encoded => Fnd_Api.G_FALSE
9668 );
9669 WHEN OTHERS THEN
9670 x_return_status := Fnd_Api.g_ret_sts_unexp_erroR ;
9671 ROLLBACK TO process_modifiers;
9672 IF Fnd_Msg_Pub.Check_Msg_Level ( Fnd_Msg_Pub.G_MSG_LVL_UNEXP_ERROR )
9673 THEN
9674 Fnd_Msg_Pub.Add_Exc_Msg( G_PKG_NAME,l_api_name);
9675 END IF;
9676 Fnd_Msg_Pub.Count_AND_Get
9677 ( p_count => x_msg_count,
9678 p_data => x_msg_data,
9679 p_encoded => Fnd_Api.G_FALSE
9680 );
9681 END;
9682
9683
9684 /*
9685 remaning character or string buffer too small in relate_qp_ozf_for_vo procedure
9686 */
9687
9688
9689
9690 /*
9691 LOgic for buliding relations
9692 1. Discounts
9693 relations for discounts(ozf_discount_lines and qp_list_lines) are stored only if the OZF Products that have apply discount = y.
9694
9695 If the OZF Product has apply discount = n (which may be a discount or an exclusion) and is not an exclusion
9696 then a single qp discount line with list line type code DIS and 0% discount is created.
9697 -- This line can be related to the ozf_product since the ozf product in this case has a one to one relation with qp pricing attribute.
9698 If the ozf product is an exclusion no qp_list_line is created for it. A qp pricing attribute is created for every PBH discount line created for the ozf discount line.
9699
9700 2. Products.
9701 Relations between ozf products and qp products ie ozf_discount_products and qp_pricing_attributes are stored for every product irrespective of the apply discount flag or the include volume flag
9702 */
9703
9704
9705 --===================================Push Discount Rules to QP===========================
9706 PROCEDURE populatePricingAttr
9707 (
9708 x_return_status OUT NOCOPY VARCHAR2
9709 ,x_msg_count OUT NOCOPY NUMBER
9710 ,x_msg_data OUT NOCOPY VARCHAR2
9711 , p_qp_list_header_id IN NUMBER
9712 , p_offDiscountProductId IN NUMBER
9713 , x_pricingAttrRec OUT NOCOPY Qp_Modifiers_Pub.pricing_attr_Rec_type
9714 )
9715 IS
9716 CURSOR c_products(cp_offDiscountProductId NUMBER)IS
9717 SELECT a.offer_discount_line_id
9718 , a.product_context
9719 , a.product_attribute
9720 , a.product_attr_value
9721 , a.apply_discount_flag
9722 , a.include_volume_flag
9723 , a.excluder_flag
9724 , b.volume_break_type
9725 , b.volume_type
9726 , b.discount_type
9727 , b.uom_code
9728 FROM ozf_offer_discount_products a, ozf_offer_discount_lines b
9729 WHERE a.offer_discount_line_id = b.offer_discount_line_id
9730 AND a.off_discount_product_id = cp_offDiscountProductId;
9731 BEGIN
9732 x_return_status := FND_API.G_RET_STS_SUCCESS;
9733 FOR l_products IN c_products(cp_offDiscountProductId => p_offDiscountProductId) LOOP
9734 x_pricingAttrRec.product_attribute_context := l_products.product_context;
9735 x_pricingAttrRec.product_attribute := l_products.product_attribute;
9736 x_pricingAttrRec.product_attr_value := l_products.product_attr_value;
9737 x_pricingAttrRec.product_uom_code := l_products.uom_code;
9738 x_pricingAttrRec.pricing_attribute_context := 'VOLUME';
9739 x_pricingAttrRec.pricing_attribute := l_products.volume_type;
9740 x_pricingAttrRec.comparison_operator_code := 'BETWEEN';
9741 -- x_pricingAttrRec.modifiers_index := i;
9742 x_pricingAttrRec.operation := Qp_Globals.G_OPR_CREATE;
9743 END LOOP;
9744 END populatePricingAttr;
9745
9746 FUNCTION getVOAccrualFlag
9747 (
9748 p_qpListHeaderId IN NUMBER
9749 ) RETURN VARCHAR2 IS
9750 CURSOR c_accrualFlag(cp_qpListHeaderId NUMBER) IS
9751 SELECT decode( VOLUME_OFFER_TYPE, 'ACCRUAL','Y','N')
9752 FROM ozf_offers
9753 WHERE qp_list_header_id = cp_qpListHeaderId;
9754 l_accrualFlag VARCHAR2(1);
9755 BEGIN
9756 OPEN c_accrualFlag(cp_qpListHeaderId => p_qpListHeaderId);
9757 FETCH c_accrualFlag INTO l_accrualFlag;
9758 IF c_accrualFlag%NOTFOUND THEN
9759 l_accrualFlag := 'Y';
9760 END IF;
9761 CLOSE c_accrualFlag;
9762 RETURN l_accrualFlag;
9763 END getVOAccrualFlag;
9764
9765 FUNCTION getDiscountLineId
9766 (
9767 p_offDiscountProductId IN NUMBER
9768 )
9769 RETURN NUMBER IS
9770 CURSOR c_discountLineId(cp_offDiscountProductId NUMBER) IS
9771 SELECT offer_discount_line_id
9772 FROM ozf_offer_discount_products
9773 WHERE off_discount_product_id = cp_offDiscountProductId ;
9774 l_discountLineId ozf_offer_discount_lines.offer_discount_line_id%TYPE;
9775 BEGIN
9776 OPEN c_discountLineId(cp_offDiscountProductId => p_offDiscountProductId);
9777 FETCH c_discountLineId INTO l_discountLineId;
9778 IF c_discountLineId%NOTFOUND THEN
9779 l_discountLineId := null;
9780 END IF;
9781 CLOSE c_discountLineId;
9782 return l_discountLineId;
9783 END getDiscountLineId;
9784
9785 PROCEDURE populatePBHRec
9786 (
9787 x_return_status OUT NOCOPY VARCHAR2
9788 ,x_msg_count OUT NOCOPY NUMBER
9789 ,x_msg_data OUT NOCOPY VARCHAR2
9790 ,x_modifiersRec OUT NOCOPY Qp_Modifiers_Pub.modifiers_rec_type
9791 ,p_offDiscountProductId IN NUMBER
9792 , p_qpListHeaderId IN NUMBER
9793 )
9794 IS
9795 BEGIN
9796 x_return_status := FND_API.G_RET_STS_SUCCESS;
9797 x_modifiersRec.operation := QP_GLOBALS.G_OPR_CREATE;
9798 x_modifiersRec.list_header_id := p_qpListHeaderId;
9799 x_modifiersRec.list_line_type_code := 'PBH';
9800 x_modifiersRec.proration_type_code := 'N';
9801 x_modifiersRec.product_precedence := FND_PROFILE.value('OZF_PRODUCT_PRECEDENCE');
9802 x_modifiersRec.incompatibility_grp_code := FND_PROFILE.value('OZF_INCOMPATIBILITY_GROUP');
9803 x_modifiersRec.print_on_invoice_flag := 'Y';
9804 x_modifiersRec.pricing_phase_id := getPricingPhase(p_listHeaderId => p_qpListHeaderId);
9805 x_modifiersRec.modifier_level_code := getDiscountLevel(p_listHeaderId => p_qpListHeaderId);
9806 x_modifiersRec.automatic_flag := 'Y';
9807 x_modifiersRec.price_break_type_code := 'RANGE';
9808 x_modifiersRec.accum_attribute := 'PRICING_ATTRIBUTE19';
9809 x_modifiersRec.accrual_flag := getVOAccrualFlag(p_qpListHeaderId => p_qpListHeaderId );
9810 IF getDiscountLevel(p_listHeaderId => p_qpListHeaderId) <> 'ORDER' THEN
9811 x_modifiersRec.pricing_group_sequence := FND_PROFILE.value('OZF_PRICING_GROUP_SEQUENCE');
9812 END IF;
9813 x_modifiersRec.attribute1 := getDiscountLineId(p_offDiscountProductId => p_offDiscountProductId);
9814 END populatePBHRec;
9815
9816
9817 PROCEDURE populateZeroDiscounts
9818 (
9819 x_return_status OUT NOCOPY VARCHAR2
9820 ,x_msg_count OUT NOCOPY NUMBER
9821 ,x_msg_data OUT NOCOPY VARCHAR2
9822 ,x_modifiersRec OUT NOCOPY Qp_Modifiers_Pub.modifiers_rec_type
9823 , p_qpListHeaderId IN NUMBER
9824 , p_offDiscountProductId IN NUMBER
9825 )
9826 IS
9827 CURSOR c_discounts( cp_offDiscountProductId NUMBER) IS
9828 SELECT a.volume_break_type
9829 , a.discount_type
9830 FROM ozf_offer_discount_lines a, ozf_offer_discount_products b
9831 WHERE a.offer_discount_line_id = b.offer_discount_line_id
9832 AND b.off_discount_product_id = cp_offDiscountProductId;
9833 BEGIN
9834 x_return_status := FND_API.G_RET_STS_SUCCESS;
9835 FOR l_discounts IN c_discounts(cp_offDiscountProductId => p_offDiscountProductId) LOOP
9836 x_modifiersRec.operation := QP_GLOBALS.G_OPR_CREATE;
9837 x_modifiersRec.list_header_id := p_qpListHeaderId;
9838 x_modifiersRec.accrual_flag := getVOAccrualFlag(p_qpListHeaderId => p_qpListHeaderId );
9839 x_modifiersRec.list_line_type_code := 'DIS';
9840 x_modifiersRec.proration_type_code := 'N';
9841 x_modifiersRec.product_precedence := FND_PROFILE.value('OZF_PRODUCT_PRECEDENCE');
9842 x_modifiersRec.print_on_invoice_flag := 'Y';
9843 x_modifiersRec.pricing_phase_id := getPricingPhase(p_listHeaderId => p_qpListHeaderId );
9844 x_modifiersRec.modifier_level_code := getDiscountLevel(p_listHeaderId => p_qpListHeaderId );
9845 x_modifiersRec.automatic_flag := 'Y';
9846 x_modifiersRec.price_break_type_code := l_discounts.volume_break_type;
9847 x_modifiersRec.arithmetic_operator := l_discounts.discount_type;
9848 x_modifiersRec.operand := 0;
9849 x_modifiersRec.price_by_formula_id := null;
9850 -- x_modifiersRec.modifiers_index := k;
9851 x_modifiersRec.rltd_modifier_grp_type := 'PRICE BREAK';
9852 x_modifiersRec.rltd_modifier_grp_no := 1;
9853 x_modifiersRec.modifier_parent_index := 1;
9854 IF getDiscountLevel(p_listHeaderId => p_qpListHeaderId ) <> 'ORDER' THEN
9855 x_modifiersRec.pricing_group_sequence := FND_PROFILE.value('OZF_PRICING_GROUP_SEQUENCE');
9856 END IF;
9857 x_modifiersRec.attribute1 := -1; -- for later identification
9858 END LOOP;
9859 END populateZeroDiscounts;
9860 PROCEDURE populateRegularDiscounts
9861 (
9862 x_return_status OUT NOCOPY VARCHAR2
9863 ,x_msg_count OUT NOCOPY NUMBER
9864 ,x_msg_data OUT NOCOPY VARCHAR2
9865 ,x_modifiersRec OUT NOCOPY Qp_Modifiers_Pub.modifiers_rec_type
9866 ,p_offerDiscountLineId IN NUMBER
9867 , p_qpListHeaderId IN NUMBER
9868 , p_offDiscountProductId IN NUMBER
9869 )
9870 IS
9871 CURSOR c_discounts(cp_offerDiscountLineId NUMBER , cp_offDiscountProductId NUMBER) IS
9872 SELECT decode(c.apply_discount_flag, 'N',0,a.discount) discount
9873 , decode(c.apply_discount_flag, 'N',null,a.formula_id) formula_id
9874 , b.volume_break_type
9875 , b.discount_type
9876 FROM ozf_offer_discount_lines a, ozf_offer_discount_lines b, ozf_offer_discount_products c
9877 WHERE a.parent_discount_line_id = b.offer_discount_line_id
9878 AND b.offer_discount_line_id = c.offer_discount_line_id
9879 AND c.excluder_flag = 'N'
9880 AND c.off_discount_product_id = cp_offDiscountProductId
9881 AND a.offer_discount_line_id = cp_offerDiscountLineId;
9882
9883 BEGIN
9884 x_return_status := FND_API.G_RET_STS_SUCCESS;
9885 FOR l_discounts IN c_discounts(cp_offerDiscountLineId => p_offerDiscountLineId , cp_offDiscountProductId => p_offDiscountProductId) LOOP
9886 x_modifiersRec.operation := QP_GLOBALS.G_OPR_CREATE;
9887 x_modifiersRec.list_header_id := p_qpListHeaderId;
9888 x_modifiersRec.accrual_flag := getVOAccrualFlag(p_qpListHeaderId => p_qpListHeaderId );
9889 x_modifiersRec.list_line_type_code := 'DIS';
9890 x_modifiersRec.proration_type_code := 'N';
9891 x_modifiersRec.product_precedence := FND_PROFILE.value('OZF_PRODUCT_PRECEDENCE');
9892 x_modifiersRec.print_on_invoice_flag := 'Y';
9893 x_modifiersRec.pricing_phase_id := getPricingPhase(p_listHeaderId => p_qpListHeaderId );
9894 x_modifiersRec.modifier_level_code := getDiscountLevel(p_listHeaderId => p_qpListHeaderId );
9895 x_modifiersRec.automatic_flag := 'Y';
9896 x_modifiersRec.price_break_type_code := l_discounts.volume_break_type;
9897 x_modifiersRec.arithmetic_operator := l_discounts.discount_type;
9898 x_modifiersRec.operand := l_discounts.discount;
9899 x_modifiersRec.price_by_formula_id := l_discounts.formula_id;
9900 -- x_modifiersRec.modifiers_index := k;
9901 x_modifiersRec.rltd_modifier_grp_type := 'PRICE BREAK';
9902 x_modifiersRec.rltd_modifier_grp_no := 1;
9903 x_modifiersRec.modifier_parent_index := 1;
9904 x_modifiersRec.attribute1 := p_offerDiscountLineId; -- for later identification
9905 IF getDiscountLevel(p_listHeaderId => p_qpListHeaderId ) <> 'ORDER' THEN
9906 x_modifiersRec.pricing_group_sequence := FND_PROFILE.value('OZF_PRICING_GROUP_SEQUENCE');
9907 END IF;
9908 END LOOP;
9909 END populateRegularDiscounts;
9910
9911 FUNCTION getMinVolume
9912 (
9913 p_offDiscountProductId NUMBER
9914 )
9915 RETURN NUMBER
9916 IS
9917 CURSOR c_minVolume(cp_offDiscountProductId NUMBER) IS
9918 SELECT min(volume_from)
9919 FROM ozf_offer_discount_lines a, ozf_offer_discount_products b
9920 WHERE a.parent_discount_line_id = b.offer_discount_line_id
9921 AND b.off_discount_product_id = cp_offDiscountProductId;
9922
9923 l_minVolume OZF_OFFER_DISCOUNT_LINES.volume_from%TYPE;
9924 BEGIN
9925 OPEN c_minVolume(cp_offDiscountProductId => p_offDiscountProductId);
9926 FETCH c_minVolume INTO l_minVolume;
9927 IF c_minVolume%NOTFOUND THEN
9928 l_minVolume := null;
9929 END IF;
9930 CLOSE c_minVolume;
9931 return l_minVolume;
9932 END getMinVolume;
9933
9934 PROCEDURE populateDISData
9935 (
9936 x_return_status OUT NOCOPY VARCHAR2
9937 ,x_msg_count OUT NOCOPY NUMBER
9938 ,x_msg_data OUT NOCOPY VARCHAR2
9939 , x_modifiersTbl OUT NOCOPY Qp_Modifiers_Pub.modifiers_tbl_type
9940 , p_offDiscountProductId IN NUMBER
9941 , p_qpListHeaderId IN NUMBER
9942 )
9943 IS
9944 CURSOR c_discounts(cp_offerDiscountProductId NUMBER) IS
9945 SELECT a.offer_discount_line_id
9946 FROM ozf_offer_discount_lines a, ozf_offer_discount_products b
9947 WHERE a.parent_discount_line_id = b.offer_discount_line_id
9948 AND b.off_discount_product_id = cp_offerDiscountProductId;
9949 i NUMBER;
9950 BEGIN
9951 -- initialize
9952 -- loop thru all discounts records
9953 -- populate regular discount data
9954 -- process for apply discount flag
9955 x_return_status := FND_API.G_RET_STS_SUCCESS;
9956 i := 1;
9957 IF getMinVolume(p_offDiscountProductId => p_offDiscountProductId) <> 0 THEN
9958 populateZeroDiscounts
9959 (
9960 x_return_status => x_return_status
9961 ,x_msg_count => x_msg_count
9962 ,x_msg_data => x_msg_data
9963 , x_modifiersRec => x_modifiersTbl(i)
9964 , p_qpListHeaderId => p_qpListHeaderId
9965 , p_offDiscountProductId => p_offDiscountProductId
9966 );
9967 i := i + 1;
9968 END IF;
9969
9970 FOR l_discounts in c_discounts(cp_offerDiscountProductId => p_offDiscountProductId) LOOP
9971 populateRegularDiscounts
9972 (
9973 x_return_status => x_return_status
9974 ,x_msg_count => x_msg_count
9975 ,x_msg_data => x_msg_data
9976 , x_modifiersRec => x_modifiersTbl(i)
9977 , p_offerDiscountLineId => l_discounts.offer_discount_line_id
9978 , p_qpListHeaderId => p_qpListHeaderId
9979 , p_offDiscountProductId => p_offDiscountProductId
9980 );
9981 i := i +1;
9982 END LOOP;
9983 END populateDISData;
9984
9985
9986 PROCEDURE populateModifiers
9987 (
9988 x_return_status OUT NOCOPY VARCHAR2
9989 ,x_msg_count OUT NOCOPY NUMBER
9990 ,x_msg_data OUT NOCOPY VARCHAR2
9991 , p_qp_list_header_id IN NUMBER
9992 , p_offDiscountProductId IN NUMBER
9993 , x_modifiersTbl OUT NOCOPY Qp_Modifiers_Pub.modifiers_tbl_type
9994 )
9995 IS
9996 l_modifiersRec Qp_Modifiers_Pub.modifiers_rec_type;
9997 l_modifiersTbl Qp_Modifiers_Pub.modifiers_tbl_type;
9998 v_modifiersTbl Qp_Modifiers_Pub.modifiers_tbl_type;
9999 i NUMBER;
10000 BEGIN
10001 -- initialize
10002 -- populate PBH data
10003 -- populate DIS data
10004 x_return_status := FND_API.G_RET_STS_SUCCESS;
10005 populatePBHRec
10006 (
10007 x_return_status => x_return_status
10008 ,x_msg_count => x_msg_count
10009 ,x_msg_data => x_msg_data
10010 , x_modifiersRec => l_modifiersRec
10011 , p_qpListHeaderId => p_qp_list_header_id
10012 , p_offDiscountProductId => p_offDiscountProductId
10013 );
10014 IF x_return_status = FND_API.G_RET_STS_ERROR THEN
10015 RAISE FND_API.G_EXC_ERROR;
10016 ELSIF x_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
10017 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10018 END IF;
10019 populateDISData
10020 (
10021 x_return_status => x_return_status
10022 ,x_msg_count => x_msg_count
10023 ,x_msg_data => x_msg_data
10024 , x_modifiersTbl => v_modifiersTbl
10025 , p_qpListHeaderId => p_qp_list_header_id
10026 , p_offDiscountProductId => p_offDiscountProductId
10027 );
10028 IF x_return_status = FND_API.G_RET_STS_ERROR THEN
10029 RAISE FND_API.G_EXC_ERROR;
10030 ELSIF x_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
10031 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10032 END IF;
10033
10034 x_modifiersTbl(1) := l_modifiersRec;
10035 i := 2;
10036 IF nvl(v_modifiersTbl.count,0) > 0 THEN
10037 FOR j in v_modifiersTbl.first .. v_modifiersTbl.last LOOP
10038 IF v_modifiersTbl.exists(j) THEN
10039 x_modifiersTbl(i) := v_modifiersTbl(j);
10040 i := i+1;
10041 END IF;
10042 END LOOP;
10043 END IF;
10044 END populateModifiers;
10045
10046 PROCEDURE processPricingAttr
10047 (
10048 x_return_status OUT NOCOPY VARCHAR2
10049 ,x_msg_count OUT NOCOPY NUMBER
10050 ,x_msg_data OUT NOCOPY VARCHAR2
10051 ,x_pricingAttrRec IN OUT NOCOPY Qp_Modifiers_Pub.pricing_attr_Rec_type
10052 ,p_offerDiscountLineId IN NUMBER
10053 ,p_offDiscountProductId IN NUMBER
10054 )
10055 IS
10056 CURSOR c_volume(cp_offerDiscountLineId NUMBER) IS
10057 SELECT volume_from, volume_to
10058 FROM ozf_offer_discount_lines
10059 WHERE offer_discount_line_id = cp_offerDiscountLineId ;
10060 BEGIN
10061 x_return_status := FND_API.G_RET_STS_SUCCESS;
10062 IF p_offerDiscountLineId = -1 THEN
10063 x_pricingAttrRec.pricing_attr_value_from := 0;
10064 x_pricingAttrRec.pricing_attr_value_to := getMinVolume(p_offDiscountProductId => p_offDiscountProductId);
10065 ELSE
10066 FOR l_volume IN c_volume(cp_offerDiscountLineId => to_number(p_offerDiscountLineId)) LOOP
10067 x_pricingAttrRec.pricing_attr_value_from := l_volume.volume_from;
10068 x_pricingAttrRec.pricing_attr_value_to := l_volume.volume_to;
10069 END LOOP;
10070 END IF;
10071 END processPricingAttr;
10072
10073 PROCEDURE processData
10074 (
10075 x_return_status OUT NOCOPY VARCHAR2
10076 ,x_msg_count OUT NOCOPY NUMBER
10077 ,x_msg_data OUT NOCOPY VARCHAR2
10078 , x_modifiersTbl IN Qp_Modifiers_Pub.modifiers_tbl_type
10079 , x_pricingAttrTbl IN OUT NOCOPY Qp_Modifiers_Pub.pricing_attr_tbl_type
10080 , x_pricingAttrRec IN Qp_Modifiers_Pub.pricing_attr_Rec_type
10081 , p_offDiscountProductId IN NUMBER
10082 )
10083 IS
10084 BEGIN
10085 -- initialise
10086 -- loop thru modifiers tbl
10087 --- for list_line_type_code = PBH simply assign the pricing attr rec
10088 -- for list_line_type_code = DIS populate the volume from and volume to in the pricing attr table
10089 x_return_status := FND_API.G_RET_STS_SUCCESS;
10090 IF nvl(x_modifiersTbl.count,0) > 0 THEN
10091 FOR i in x_modifiersTbl.first .. x_modifiersTbl.last LOOP
10092 IF x_modifiersTbl.exists(i) THEN
10093 x_pricingAttrTbl(i) := x_pricingAttrRec;
10094 x_pricingAttrTbl(i).modifiers_index := i;
10095 IF x_modifiersTbl(i).list_line_type_code = 'DIS' THEN
10096 processPricingAttr
10097 (
10098 x_return_status => x_return_status
10099 ,x_msg_count => x_msg_count
10100 ,x_msg_data => x_msg_data
10101 ,p_offerDiscountLineId => to_number(x_modifiersTbl(i).attribute1)
10102 , p_offDiscountProductId => p_offDiscountProductId
10103 ,x_pricingAttrRec => x_pricingAttrTbl(i)
10104 );
10105 IF x_return_status = FND_API.G_RET_STS_ERROR THEN
10106 RAISE FND_API.G_EXC_ERROR;
10107 ELSIF x_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
10108 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10109 END IF;
10110 END IF;
10111 END IF;
10112 END LOOP;
10113 END IF;
10114 END processData;
10115
10116 PROCEDURE populateExclusions
10117 (
10118 x_return_status OUT NOCOPY VARCHAR2
10119 ,x_msg_count OUT NOCOPY NUMBER
10120 ,x_msg_data OUT NOCOPY VARCHAR2
10121 , p_qpListHeaderId IN NUMBER
10122 , x_pricingAttrTbl IN OUT NOCOPY Qp_Modifiers_Pub.pricing_attr_tbl_type
10123 )
10124 IS
10125 CURSOR c_exclusions(cp_qpListHeaderId IN NUMBER) IS
10126 SELECT a.product_attribute, a.product_attr_value, a.excluder_flag
10127 FROM ozf_offer_discount_products a, ozf_offers b
10128 WHERE a.offer_id = b.offer_id
10129 AND a.excluder_flag = 'Y'
10130 AND b.qp_list_header_id = cp_qpListHeaderId;
10131 i NUMBER;
10132 BEGIN
10133 x_return_status := FND_API.G_RET_STS_SUCCESS;
10134 i := nvl(x_pricingAttrTbl.count,0) +1;
10135 FOR l_exclusions IN c_exclusions(cp_qpListHeaderId => p_qpListHeaderId) LOOP
10136 x_pricingAttrTbl(i).product_attribute_context := 'ITEM';
10137 x_pricingAttrTbl(i).product_attribute := l_exclusions.product_attribute;
10138 x_pricingAttrTbl(i).product_attr_value:= l_exclusions.product_attr_value;
10139 x_pricingAttrTbl(i).excluder_flag := l_exclusions.excluder_flag;
10140 x_pricingAttrTbl(i).modifiers_index := 1;
10141 x_pricingAttrTbl(i).operation := QP_GLOBALS.G_OPR_CREATE;
10142 i := i + 1;
10143 END LOOP;
10144 END populateExclusions;
10145
10146
10147 PROCEDURE relateOzfQpDiscounts
10148 (
10149 x_return_status OUT NOCOPY VARCHAR2
10150 ,x_msg_count OUT NOCOPY NUMBER
10151 ,x_msg_data OUT NOCOPY VARCHAR2
10152 ,p_modifiersTbl IN qp_modifiers_pub.modifiers_tbl_type
10153 )
10154 IS
10155 l_discRec OZF_QP_DISCOUNTS_PVT.qp_discount_rec_type;
10156 l_qpDiscountId NUMBER;
10157 BEGIN
10158 x_return_status := FND_API.G_RET_STS_SUCCESS;
10159 IF nvl(p_modifiersTbl.count,0) > 0 THEN
10160 FOR i in p_modifiersTbl.first .. p_modifiersTbl.last LOOP
10161 IF p_modifiersTbl.exists(i) THEN
10162 IF p_modifiersTbl(i).attribute1 <> '-1' THEN
10163 l_discRec.list_line_id := p_modifiersTbl(i).list_line_id;
10164 l_discRec.offer_discount_line_id := to_number(p_modifiersTbl(i).attribute1);
10165 OZF_QP_DISCOUNTS_PVT.Create_ozf_qp_discount
10166 (
10167 p_api_version_number => 1.0
10168 , p_init_msg_list => FND_API.G_FALSE
10169 , p_commit => FND_API.G_FALSE
10170 , p_validation_level => FND_API.G_VALID_LEVEL_FULL
10171 , x_return_status => x_return_status
10172 , x_msg_count => x_msg_count
10173 , x_msg_data => x_msg_data
10174 , p_qp_disc_rec => l_discRec
10175 , x_qp_discount_id => l_qpDiscountId
10176 );
10177 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
10178 return;
10179 END IF;
10180 END IF;
10181 END IF;
10182 END LOOP;
10183 END IF;
10184 END relateOzfQpDiscounts;
10185
10186 PROCEDURE relateOzfQpProducts
10187 (
10188 x_return_status OUT NOCOPY VARCHAR2
10189 ,x_msg_count OUT NOCOPY NUMBER
10190 ,x_msg_data OUT NOCOPY VARCHAR2
10191 ,p_pricingAttrTbl IN qp_modifiers_pub.pricing_attr_tbl_type
10192 ,p_offDiscountProductId IN NUMBER
10193 )
10194 IS
10195 l_prodRec OZF_QP_PRODUCTS_PVT.qp_product_rec_type;
10196 l_qpProductId NUMBER;
10197 BEGIN
10198 x_return_status := FND_API.G_RET_STS_SUCCESS;
10199 IF nvl(p_pricingAttrTbl.count,0) > 0 THEN
10200 FOR i in p_pricingAttrTbl.first .. p_pricingAttrTbl.last LOOP
10201 IF p_pricingAttrTbl.exists(i) THEN
10202 IF p_pricingAttrTbl(i).excluder_flag <> 'Y' THEN
10203 l_prodRec.pricing_attribute_id := p_pricingAttrTbl(i).pricing_attribute_id;
10204 l_prodRec.off_discount_product_id := p_offDiscountProductId;
10205 OZF_QP_PRODUCTS_PVT.Create_ozf_qp_product
10206 (
10207 p_api_version_number => 1.0
10208 , p_init_msg_list => FND_API.G_FALSE
10209 , p_commit => FND_API.G_FALSE
10210 , p_validation_level => FND_API.G_VALID_LEVEL_FULL
10211 , x_return_status => x_return_status
10212 , x_msg_count => x_msg_count
10213 , x_msg_data => x_msg_data
10214 , p_qp_product_rec => l_prodRec
10215 , x_qp_product_id => l_qpProductId
10216 );
10217 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
10218 return;
10219 END IF;
10220 END IF;
10221 END IF;
10222 END LOOP;
10223 END IF;
10224 END relateOzfQpProducts;
10225
10226 PROCEDURE relateOzfQp
10227 (
10228 x_return_status OUT NOCOPY VARCHAR2
10229 ,x_msg_count OUT NOCOPY NUMBER
10230 ,x_msg_data OUT NOCOPY VARCHAR2
10231 ,p_modifiersTbl IN qp_modifiers_pub.modifiers_tbl_type
10232 ,p_pricingAttrTbl IN qp_modifiers_pub.pricing_attr_tbl_type
10233 ,p_offDiscountProductId IN NUMBER
10234 )
10235 IS
10236 BEGIN
10237 -- initialize
10238 -- relate discounts
10239 -- relate products
10240 x_return_status := FND_API.G_RET_STS_SUCCESS;
10241 relateOzfQpDiscounts
10242 (
10243 x_return_status => x_return_status
10244 ,x_msg_count => x_msg_count
10245 ,x_msg_data => x_msg_data
10246 ,p_modifiersTbl => p_modifiersTbl
10247 );
10248 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
10249 RETURN;
10250 END IF;
10251 relateOzfQpProducts
10252 (
10253 x_return_status => x_return_status
10254 ,x_msg_count => x_msg_count
10255 ,x_msg_data => x_msg_data
10256 ,p_pricingAttrTbl => p_pricingAttrTbl
10257 ,p_offDiscountProductId => p_offDiscountProductId
10258 );
10259 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
10260 RETURN;
10261 END IF;
10262 END relateOzfQp;
10263
10264 PROCEDURE pushDiscountRuleToQp
10265 (
10266 x_return_status OUT NOCOPY VARCHAR2
10267 ,x_msg_count OUT NOCOPY NUMBER
10268 ,x_msg_data OUT NOCOPY VARCHAR2
10269 , p_qp_list_header_id IN NUMBER
10270 , p_offDiscountProductId IN NUMBER
10271 , x_error_location OUT NOCOPY NUMBER
10272 , x_modifiersTbl OUT NOCOPY Qp_Modifiers_Pub.modifiers_tbl_type
10273 , x_pricingAttrTbl OUT NOCOPY Qp_Modifiers_Pub.pricing_attr_tbl_type
10274 )
10275 IS
10276 l_pricingAttrTbl Qp_Modifiers_Pub.pricing_attr_tbl_type;
10277 l_pricingAttrRec Qp_Modifiers_Pub.pricing_attr_Rec_type;
10278 l_modifiersTbl Qp_Modifiers_Pub.modifiers_tbl_type;
10279
10280 v_modifier_list_rec qp_modifiers_pub.modifier_list_rec_type;
10281 v_modifier_list_val_rec qp_modifiers_pub.modifier_list_val_rec_type;
10282 v_modifiers_tbl qp_modifiers_pub.modifiers_tbl_type;
10283 v_modifiers_val_tbl qp_modifiers_pub.modifiers_val_tbl_type;
10284 v_qualifiers_tbl qp_qualifier_rules_pub.qualifiers_tbl_type;
10285 v_qualifiers_val_tbl qp_qualifier_rules_pub.qualifiers_val_tbl_type;
10286 v_pricing_attr_tbl qp_modifiers_pub.pricing_attr_tbl_type;
10287 v_pricing_attr_val_tbl qp_modifiers_pub.pricing_attr_val_tbl_type;
10288 l_control_rec qp_globals.control_rec_type;
10289 BEGIN
10290 -- initialize
10291 -- for the product populate pricing attribute
10292 -- populate discount structure
10293 -- assign modifier index to each pricing attribute rec
10294 -- push data to QP
10295 -- process errors
10296 x_return_status := FND_API.G_RET_STS_SUCCESS;
10297 populatePricingAttr
10298 (
10299 x_return_status => x_return_status
10300 ,x_msg_count => x_msg_count
10301 ,x_msg_data => x_msg_data
10302 ,p_qp_list_header_id => p_qp_list_header_id
10303 ,p_offDiscountProductId => p_offDiscountProductId
10304 ,x_pricingAttrRec => l_pricingAttrRec
10305 );
10306
10307 IF x_return_status = FND_API.G_RET_STS_ERROR THEN
10308 RAISE FND_API.G_EXC_ERROR;
10309 ELSIF x_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
10310 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10311 END IF;
10312 populateModifiers
10313 (
10314 x_return_status => x_return_status
10315 ,x_msg_count => x_msg_count
10316 ,x_msg_data => x_msg_data
10317 , p_qp_list_header_id => p_qp_list_header_id
10318 , p_offDiscountProductId => p_offDiscountProductId
10319 , x_modifiersTbl => l_modifiersTbl
10320 );
10321 IF x_return_status = FND_API.G_RET_STS_ERROR THEN
10322 RAISE FND_API.G_EXC_ERROR;
10323 ELSIF x_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
10324 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10325 END IF;
10326 processData
10327 (
10328 x_return_status => x_return_status
10329 , x_msg_count => x_msg_count
10330 , x_msg_data => x_msg_data
10331 , x_modifiersTbl => l_modifiersTbl
10332 , x_pricingAttrRec => l_pricingAttrRec
10333 , x_pricingAttrTbl => l_pricingAttrTbl
10334 , p_offDiscountProductId => p_offDiscountProductId
10335 );
10336 IF x_return_status = FND_API.G_RET_STS_ERROR THEN
10337 RAISE FND_API.G_EXC_ERROR;
10338 ELSIF x_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
10339 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10340 END IF;
10341 populateExclusions
10342 (
10343 x_return_status => x_return_status
10344 , x_msg_count => x_msg_count
10345 , x_msg_data => x_msg_data
10346 , p_qpListHeaderId => p_qp_list_header_id
10347 , x_pricingAttrTbl => l_pricingAttrTbl
10348
10349 );
10350 IF x_return_status = FND_API.G_RET_STS_ERROR THEN
10351 RAISE FND_API.G_EXC_ERROR;
10352 ELSIF x_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
10353 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10354 END IF;
10355
10356 QP_Modifiers_PUB.process_modifiers(
10357 p_api_version_number => 1.0,
10358 p_init_msg_list => FND_API.G_FALSE,
10359 p_return_values => FND_API.G_FALSE,
10360 x_return_status => x_return_status,
10361 x_msg_count => x_msg_count,
10362 x_msg_data => x_msg_data,
10363 p_modifiers_tbl => l_modifiersTbl,
10364 p_pricing_attr_tbl => l_pricingAttrTbl,
10365 x_modifier_list_rec => v_modifier_list_rec,
10366 x_modifier_list_val_rec => v_modifier_list_val_rec,
10367 x_modifiers_tbl => v_modifiers_tbl,
10368 x_modifiers_val_tbl => v_modifiers_val_tbl,
10369 x_qualifiers_tbl => v_qualifiers_tbl,
10370 x_qualifiers_val_tbl => v_qualifiers_val_tbl,
10371 x_pricing_attr_tbl => v_pricing_attr_tbl,
10372 x_pricing_attr_val_tbl => v_pricing_attr_val_tbl
10373 );
10374 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
10375 return;
10376 END IF;
10377 x_modifiersTbl := v_modifiers_tbl;
10378 x_pricingAttrTbl := v_pricing_attr_tbl;
10379 END pushDiscountRuleToQp;
10380
10381 PROCEDURE pushDiscountRuleToQpAndRelate
10382 (
10383 x_return_status OUT NOCOPY VARCHAR2
10384 ,x_msg_count OUT NOCOPY NUMBER
10385 ,x_msg_data OUT NOCOPY VARCHAR2
10386 , p_qp_list_header_id IN NUMBER
10387 , p_offDiscountProductId IN NUMBER
10388 , x_error_location OUT NOCOPY NUMBER
10389 , x_modifiersTbl OUT NOCOPY Qp_Modifiers_Pub.modifiers_tbl_type
10390 , x_pricingAttrTbl OUT NOCOPY Qp_Modifiers_Pub.pricing_attr_tbl_type
10391 )
10392 IS
10393 BEGIN
10394 x_return_status := FND_API.G_RET_STS_SUCCESS;
10395 pushDiscountRuleToQp
10396 (
10397 x_return_status => x_return_status
10398 , x_msg_count => x_msg_count
10399 , x_msg_data => x_msg_data
10400 , p_qp_list_header_id => p_qp_list_header_id
10401 , p_offDiscountProductId => p_offDiscountProductId
10402 , x_error_location => x_error_location
10403 , x_modifiersTbl => x_modifiersTbl
10404 , x_pricingAttrTbl => x_pricingAttrTbl
10405 );
10406 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
10407 return;
10408 END IF;
10409 relateOzfQp
10410 (
10411 x_return_status => x_return_status
10412 , x_msg_count => x_msg_count
10413 , x_msg_data => x_msg_data
10414 , p_modifiersTbl => x_modifiersTbl
10415 , p_pricingAttrTbl => x_pricingAttrTbl
10416 , p_offDiscountProductId => p_offDiscountProductId
10417 );
10418 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
10419 return;
10420 END IF;
10421 END pushDiscountRuleToQpAndRelate;
10422 /*
10423 This procedure pushes OZF data into qp for pricing execution
10424 There is no one to one mapping between ozf and qp data. the Mapping is slighly more complicated.
10425 The logic for mapping is as
10426 -- for regular product records and product records with include volume = 'N' and apply discount as 'Y'
10427 create the whole discount structure for each product
10428 -- for product records with include volume = Y and apply discount = N create a simple discount record with 0% discount
10429 -- for exclusions there is a separate processing
10430 -- for a product to be excluded from an ozf discount structure, it should be excluded from all the discount structures created in qp
10431 -- the logic used is
10432 -- parse thru the modifier table. For each record with list_line_type_code = 'PBH' create a pricing_attribute_record. relate the two
10433 -- using modifier_index of the modifier record in the modifier table. Add this pricing record to the pricing_attr_tbl
10434
10435 */
10436 PROCEDURE push_discount_rules_to_qp
10437 (
10438 p_init_msg_list IN VARCHAR2
10439 ,p_api_version IN NUMBER
10440 ,p_commit IN VARCHAR2
10441 ,x_return_status OUT NOCOPY VARCHAR2
10442 ,x_msg_count OUT NOCOPY NUMBER
10443 ,x_msg_data OUT NOCOPY VARCHAR2
10444 , p_qp_list_header_id IN NUMBER
10445 , x_error_location OUT NOCOPY NUMBER
10446 )
10447 IS
10448 l_api_name CONSTANT VARCHAR2(30) := 'push_discount_rules_to_qp';
10449 l_api_version_number CONSTANT NUMBER := 1.0;
10450
10451 CURSOR c_products(cp_qpListHeaderId NUMBER)IS
10452 SELECT a.off_discount_product_id
10453 FROM ozf_offer_discount_products a, ozf_offers b
10454 WHERE a.offer_id = b.offer_id
10455 AND a.excluder_flag = 'N'
10456 AND b.qp_list_header_id = cp_qpListHeaderId;
10457
10458 l_modifiersTbl Qp_Modifiers_Pub.modifiers_tbl_type;
10459 l_pricingAttrTbl Qp_Modifiers_Pub.pricing_attr_tbl_type;
10460 l_errorLocation NUMBER;
10461 BEGIN
10462 -- initialize
10463 SAVEPOINT push_disc_rules;
10464 x_return_status := Fnd_Api.g_ret_sts_success;
10465
10466 FOR l_products in c_products(cp_qpListHeaderId => p_qp_list_header_id) LOOP
10467 pushDiscountRuleToQpAndRelate
10468 (
10469 x_return_status => x_return_status
10470 ,x_msg_count => x_msg_count
10471 ,x_msg_data => x_msg_data
10472 , p_qp_list_header_id => p_qp_list_header_id
10473 , p_offDiscountProductId => l_products.off_discount_product_id
10474 , x_error_location => l_errorLocation
10475 , x_modifiersTbl => l_modifiersTbl
10476 , x_pricingAttrTbl => l_pricingAttrTbl
10477 );
10478 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
10479 add_message(x_msg_count);
10480 RAISE Fnd_Api.g_exc_error;
10481 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
10482 add_message(x_msg_count);
10483 RAISE Fnd_Api.g_exc_unexpected_error;
10484 END IF;
10485 END LOOP;
10486
10487
10488
10489 IF p_commit = Fnd_Api.g_true THEN
10490 COMMIT WORK;
10491 END IF;
10492 EXCEPTION
10493 WHEN Fnd_Api.G_EXC_ERROR THEN
10494 x_return_status := Fnd_Api.g_ret_sts_error ;
10495 ROLLBACK TO push_disc_rules;
10496 Fnd_Msg_Pub.Count_AND_Get
10497 ( p_count => x_msg_count,
10498 p_data => x_msg_data,
10499 p_encoded => Fnd_Api.G_FALSE
10500 );
10501 WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
10502 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
10503 ROLLBACK TO push_disc_rules;
10504 Fnd_Msg_Pub.Count_AND_Get
10505 ( p_count => x_msg_count,
10506 p_data => x_msg_data,
10507 p_encoded => Fnd_Api.G_FALSE
10508 );
10509 WHEN OTHERS THEN
10510 x_return_status := Fnd_Api.g_ret_sts_unexp_erroR ;
10511 ROLLBACK TO push_disc_rules;
10512 IF Fnd_Msg_Pub.Check_Msg_Level ( Fnd_Msg_Pub.G_MSG_LVL_UNEXP_ERROR )
10513 THEN
10514 Fnd_Msg_Pub.Add_Exc_Msg( G_PKG_NAME,l_api_name);
10515 END IF;
10516 Fnd_Msg_Pub.Count_AND_Get
10517 ( p_count => x_msg_count,
10518 p_data => x_msg_data,
10519 p_encoded => Fnd_Api.G_FALSE
10520 );
10521
10522 /*1. Get Discount Structures
10523 For each discount structure
10524 get the Discounts
10525 Get products
10526 populate discount and product records
10527 create data in qp
10528 get data created
10529 create relation ship*/
10530 END push_discount_rules_to_qp;
10531
10532 FUNCTION get_grace_days(p_sdr_header_id IN NUMBER)
10533 RETURN NUMBER
10534 IS
10535 p_grace_days NUMBER := 0;
10536 l_supplier_site_id NUMBER;
10537
10538
10539
10540 CURSOR c_get_supplier_site_id(l_sdr_header_id NUMBER) IS
10541 SELECT supplier_site_id
10542 FROM ozf_sd_request_headers_all_b
10543 WHERE request_header_id = l_sdr_header_id;
10544
10545
10546
10547 CURSOR c_get_grace_days(l_supplier_site_id NUMBER) IS
10548 SELECT nvl(grace_days,0)
10549 FROM ozf_supp_trd_prfls_all
10550 WHERE supplier_site_id = l_supplier_site_id;
10551
10552
10553 BEGIN
10554
10555 --dbms_output.put_line('N get_grace_days '||p_sdr_header_id);
10556
10557 OPEN c_get_supplier_site_id( p_sdr_header_id ) ;
10558 FETCH c_get_supplier_site_id INTO l_supplier_site_id ;
10559 CLOSE c_get_supplier_site_id ;
10560
10561
10562 --dbms_output.put_line('N supplier_site_id '||l_supplier_site_id);
10563
10564 OPEN c_get_grace_days( l_supplier_site_id ) ;
10565 FETCH c_get_grace_days INTO p_grace_days ;
10566 CLOSE c_get_grace_days ;
10567
10568
10569
10570 --dbms_output.put_line('N grace_days '||p_grace_days);
10571
10572 RETURN p_grace_days;
10573
10574 EXCEPTION
10575 WHEN OTHERS THEN
10576 RETURN 0;
10577 END;
10578
10579 /*
10580 This procedure creates SD offer header record.
10581 */
10582
10583 PROCEDURE populateSDHeaderRec(
10584 x_return_status OUT NOCOPY VARCHAR2
10585 ,x_msg_count OUT NOCOPY NUMBER
10586 ,x_msg_data OUT NOCOPY VARCHAR2
10587 ,p_operation IN VARCHAR2
10588 ,p_sdr_header_id IN NUMBER
10589 ,p_qp_list_header_id IN NUMBER
10590 ,x_modifier_list_rec OUT NOCOPY Modifier_LIST_Rec_Type
10591 )
10592 IS
10593
10594 CURSOR c_offer_info(l_qp_list_header_id NUMBER) IS
10595 SELECT offer_id, offer_type, custom_setup_id, offer_code, tier_level, object_version_number
10596 FROM ozf_offers
10597 WHERE qp_list_header_id = l_qp_list_header_id;
10598
10599
10600 CURSOR c_sdr_info(l_sdr_header_id NUMBER) IS
10601 SELECT sales_order_currency,
10602 request_currency_code,
10603 request_start_date,
10604 request_end_date,
10605 authorization_number,
10606 request_number,
10607 asignee_resource_id,
10608 request_basis,
10609 org_id
10610 FROM ozf_sd_request_headers_all_b
10611 WHERE request_header_id = l_sdr_header_id;
10612
10613
10614 l_modifier_list_rec Modifier_LIST_Rec_Type;
10615
10616 l_sales_order_currency VARCHAR2(30);
10617 l_request_currency_code VARCHAR2(30);
10618 l_start_date_active DATE;
10619 l_end_date_active DATE;
10620 l_authorization_number VARCHAR2(3000);
10621 l_request_number VARCHAR2(3000);
10622 l_asignee_resource_id NUMBER;
10623 l_request_basis VARCHAR2(1);
10624 l_org_id NUMBER;
10625
10626 BEGIN
10627
10628 SAVEPOINT populateSDHeaderRec;
10629
10630
10631 IF p_operation='UPDATE' THEN
10632 OPEN c_offer_info(p_qp_list_header_id);
10633 FETCH c_offer_info INTO x_modifier_list_rec.offer_id,
10634 x_modifier_list_rec.offer_type,
10635 x_modifier_list_rec.custom_setup_id,
10636 x_modifier_list_rec.offer_code,
10637 x_modifier_list_rec.tier_level,
10638 x_modifier_list_rec.object_version_number;
10639 CLOSE c_offer_info;
10640
10641
10642 x_modifier_list_rec.STATUS_CODE := 'ACTIVE';
10643 --l_modifier_list_rec.USER_STATUS_ID := p_modifier_list_rec.USER_STATUS_ID;
10644 x_modifier_list_rec.ACTIVE_FLAG := 'Y';
10645
10646 END IF;
10647
10648 IF p_operation='CREATE' THEN
10649 x_modifier_list_rec.OFFER_TYPE := 'ACCRUAL';
10650 x_modifier_list_rec.CUSTOM_SETUP_ID := 118;
10651 x_modifier_list_rec.OBJECT_VERSION_NUMBER := 1;
10652 x_modifier_list_rec.STATUS_CODE := 'DRAFT';
10653 x_modifier_list_rec.STATUS_DATE := sysdate;
10654 x_modifier_list_rec.ACTIVE_FLAG := 'N';
10655
10656 END IF;
10657
10658 x_modifier_list_rec.MODIFIER_LEVEL_CODE := 'LINE';
10659 x_modifier_list_rec.BUDGET_AMOUNT_TC := 0;
10660 x_modifier_list_rec.OFFER_AMOUNT := 0;
10661 x_modifier_list_rec.LIST_TYPE_CODE := 'PRO';
10662
10663
10664 OPEN c_sdr_info(p_sdr_header_id);
10665 FETCH c_sdr_info INTO l_sales_order_currency,
10666 l_request_currency_code,
10667 l_start_date_active,
10668 l_end_date_active,
10669 l_authorization_number,
10670 l_request_number,
10671 l_asignee_resource_id,
10672 l_request_basis,
10673 l_org_id;
10674 CLOSE c_sdr_info;
10675
10676 /*uncomment offer code */
10677
10678 debug_message('N: populateSDHeaderRec' || l_sales_order_currency);
10679 debug_message('N: populateSDHeaderRec' || l_request_currency_code);
10680
10681 x_modifier_list_rec.TRANSACTION_CURRENCY_CODE := NVL(l_sales_order_currency, l_request_currency_code);
10682 x_modifier_list_rec.CURRENCY_CODE := NVL(l_sales_order_currency, l_request_currency_code);
10683 x_modifier_list_rec.START_DATE_ACTIVE := trunc(l_start_date_active);
10684 x_modifier_list_rec.END_DATE_ACTIVE := trunc(l_end_date_active + get_grace_days(p_sdr_header_id));
10685 x_modifier_list_rec.NAME := NVL(l_authorization_number, l_request_number);
10686 x_modifier_list_rec.DESCRIPTION := NVL(l_authorization_number, l_request_number);
10687 --fix for bug 7580884
10688 x_modifier_list_rec.OFFER_CODE := l_request_number; --NVL(l_authorization_number, l_request_number);
10689 x_modifier_list_rec.COMMENTS := FND_MESSAGE.GET_STRING('OZF','OZF_SD_OFFER_COMMENTS');
10690 x_modifier_list_rec.ASK_FOR_FLAG := NVL(l_request_basis,'N');
10691
10692 IF l_org_id IS NOT NULL AND l_org_id <> FND_API.G_MISS_NUM
10693 AND NVL(fnd_profile.value('QP_SECURITY_CONTROL'), 'OFF') <> 'OFF' THEN
10694 x_modifier_list_rec.global_flag := 'N';
10695 x_modifier_list_rec.orig_org_id := l_org_id;
10696 ELSE
10697 x_modifier_list_rec.global_flag := 'Y';
10698 END IF;
10699
10700 -- x_modifier_list_rec.global_flag := 'Y';
10701
10702 x_modifier_list_rec.BUDGET_SOURCE_ID := FND_PROFILE.VALUE('OZF_SD_DEFAULT_BUDGET');
10703 x_modifier_list_rec.BUDGET_SOURCE_TYPE := 'FUND';
10704
10705 x_modifier_list_rec.OFFER_OPERATION := p_operation;
10706 x_modifier_list_rec.MODIFIER_OPERATION := p_operation;
10707 x_modifier_list_rec.OWNER_ID := l_asignee_resource_id;
10708
10709 debug_message('N: populateSDHeaderRec x_modifier_list_rec.TRANSACTION_CURRENCY_CODE ' || x_modifier_list_rec.TRANSACTION_CURRENCY_CODE);
10710
10711 EXCEPTION
10712 WHEN Fnd_Api.G_EXC_ERROR THEN
10713 x_return_status := Fnd_Api.g_ret_sts_error ;
10714 ROLLBACK TO populateSDHeaderRec;
10715 Fnd_Msg_Pub.Count_AND_Get
10716 ( p_count => x_msg_count,
10717 p_data => x_msg_data,
10718 p_encoded => Fnd_Api.G_FALSE
10719 );
10720 WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
10721 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
10722 ROLLBACK TO populateSDHeaderRec;
10723 Fnd_Msg_Pub.Count_AND_Get
10724 ( p_count => x_msg_count,
10725 p_data => x_msg_data,
10726 p_encoded => Fnd_Api.G_FALSE
10727 );
10728 WHEN OTHERS THEN
10729 x_return_status := Fnd_Api.g_ret_sts_unexp_erroR ;
10730 ROLLBACK TO populateSDHeaderRec;
10731 IF Fnd_Msg_Pub.Check_Msg_Level ( Fnd_Msg_Pub.G_MSG_LVL_UNEXP_ERROR )
10732 THEN
10733 Fnd_Msg_Pub.Add_Exc_Msg( G_PKG_NAME,'populateSDHeaderRec');
10734 END IF;
10735 Fnd_Msg_Pub.Count_AND_Get
10736 ( p_count => x_msg_count,
10737 p_data => x_msg_data,
10738 p_encoded => Fnd_Api.G_FALSE
10739 );
10740 END populateSDHeaderRec;
10741
10742
10743 /*
10744 This procedure creates SD offer discount line records.
10745 The mapping b/w QP and SDR lines is stored in orig_sys_line_ref and orig_sys_header_ref
10746 columns in tables qp_list_lines and qp_pricing_attributes
10747 */
10748
10749 PROCEDURE populateSDDiscountRulesRec(
10750 x_return_status OUT NOCOPY VARCHAR2
10751 ,x_msg_count OUT NOCOPY NUMBER
10752 ,x_msg_data OUT NOCOPY VARCHAR2
10753 ,p_operation IN VARCHAR2
10754 ,p_sdr_header_id IN NUMBER
10755 ,p_qp_list_header_id IN NUMBER
10756 ,x_modifier_line_tbl OUT NOCOPY modifier_line_tbl_type
10757 )
10758 IS
10759
10760 l_modifier_line_tbl MODIFIER_LINE_TBL_TYPE;
10761 l_supplier_site_id NUMBER;
10762 l_allow_qty_increase VARCHAR2(1);
10763 l_prod_index NUMBER := 1;
10764 l_list_line_id NUMBER;
10765 l_orig_sys_line_ref_id NUMBER;
10766 l_converted_amt NUMBER;
10767 l_rate NUMBER;
10768 l_request_currency_code VARCHAR2(15);
10769 l_sales_order_currency VARCHAR2(15);
10770 l_limit_id NUMBER;
10771
10772
10773 CURSOR cur_get_disc_lines IS
10774 SELECT request_line_id,product_context,
10775 prod_catg_id,inventory_item_id,
10776 item_uom,product_cost,
10777 product_cost_currency,
10778 requested_discount_type,
10779 requested_discount_value,
10780 approved_discount_type,
10781 approved_discount_value,
10782 approved_discount_currency,
10783 requested_discount_currency,
10784 cost_basis,limit_qty,
10785 start_date,end_date
10786 FROM ozf_sd_request_lines_all
10787 WHERE request_header_id = p_sdr_header_id
10788 AND vendor_approved_flag='Y';
10789
10790 CURSOR cur_get_sys_line_ref_id(p_request_line_id NUMBER,p_qp_list_header_id NUMBER) IS
10791 SELECT list_line_no,list_line_id
10792 FROM qp_list_lines
10793 WHERE list_line_no = to_char(p_request_line_id)
10794 AND list_header_id = p_qp_list_header_id ;
10795
10796 CURSOR cur_get_header_info IS
10797 SELECT sales_order_currency,
10798 request_currency_code,
10799 supplier_site_id
10800 FROM ozf_sd_request_headers_all_b
10801 WHERE request_header_id = p_sdr_header_id;
10802
10803 CURSOR cur_get_qty_inc_flag(p_supplier_site_id NUMBER) IS
10804 SELECT allow_qty_increase
10805 FROM ozf_supp_trd_prfls_all
10806 WHERE supplier_site_id = p_supplier_site_id;
10807
10808
10809 CURSOR cur_get_limit_id(p_list_line_id NUMBER) IS
10810 SELECT limit_id
10811 FROM qp_limits
10812 WHERE list_line_id = p_list_line_id
10813 AND limit_number = 3;
10814
10815 BEGIN
10816 SAVEPOINT populateSDDiscountRulesRec;
10817
10818
10819
10820
10821 x_return_status := Fnd_Api.g_ret_sts_success;
10822 --x_error_location := 0;
10823
10824 debug_message('N: populateSDDiscountRulesRec' || p_operation);
10825
10826 FOR line_rec IN cur_get_disc_lines LOOP
10827 debug_message('N: request_line_id' || line_rec.request_line_id);
10828 debug_message('N: l_prod_index' || l_prod_index);
10829 --IF p_operation = 'UPDATE' THEN
10830 debug_message('N: p_qp_list_header_id' || p_qp_list_header_id);
10831 OPEN cur_get_sys_line_ref_id(line_rec.request_line_id,p_qp_list_header_id);
10832 FETCH cur_get_sys_line_ref_id INTO l_orig_sys_line_ref_id,l_list_line_id;
10833 CLOSE cur_get_sys_line_ref_id;
10834 --dbms_output.put_line('N: l_list_line_id' || l_list_line_id);
10835
10836 -- END IF;
10837
10838 debug_message('N: l_orig_sys_line_ref_id' || l_orig_sys_line_ref_id);
10839 IF l_orig_sys_line_ref_id IS NULL OR l_orig_sys_line_ref_id=FND_API.G_MISS_NUM THEN
10840 x_modifier_line_tbl(l_prod_index).OPERATION := 'CREATE';
10841 ELSE
10842 x_modifier_line_tbl(l_prod_index).OPERATION := 'UPDATE';
10843 x_modifier_line_tbl(l_prod_index).list_line_id := l_list_line_id;
10844
10845 OPEN cur_get_limit_id(l_list_line_id);
10846 FETCH cur_get_limit_id INTO l_limit_id;
10847 CLOSE cur_get_limit_id;
10848
10849 x_modifier_line_tbl(l_prod_index).MAX_QTY_PER_RULE_ID := l_limit_id;
10850
10851 END IF;
10852 debug_message('N: list_line_id' || x_modifier_line_tbl(l_prod_index).list_line_id);
10853 debug_message('N: OPERATION' || x_modifier_line_tbl(l_prod_index).OPERATION );
10854
10855 debug_message('N: line_rec.request_line_id ' || line_rec.request_line_id );
10856 x_modifier_line_tbl(l_prod_index).LIST_LINE_NO := to_char(line_rec.request_line_id);
10857 debug_message('N: x_modifier_line_tbl(l_prod_index).LIST_LINE_NO ' || x_modifier_line_tbl(l_prod_index).LIST_LINE_NO );
10858 x_modifier_line_tbl(l_prod_index).LIST_HEADER_ID := p_qp_list_header_id;
10859 --dbms_output.put_line('N: x_modifier_line_tbl(l_prod_index).LIST_HEADER_ID ' || x_modifier_line_tbl(l_prod_index).LIST_HEADER_ID);
10860 x_modifier_line_tbl(l_prod_index).LIST_LINE_TYPE_CODE := 'DIS';
10861 x_modifier_line_tbl(l_prod_index).OPERAND := NVL(line_rec.approved_discount_value, line_rec.requested_discount_value);
10862 x_modifier_line_tbl(l_prod_index).ARITHMETIC_OPERATOR := NVL(line_rec.approved_discount_type, line_rec.requested_discount_type);
10863
10864 --if discount type is NEWPRICE get the discount amount
10865 --if discount type is Amount/Newprice do the currency conevrsion
10866 --Use sysdate as exchange date
10867
10868 debug_message('ARITHMETIC_OPERATOR '||x_modifier_line_tbl(l_prod_index).ARITHMETIC_OPERATOR);
10869
10870
10871
10872 debug_message('product_cost_currency '|| line_rec.product_cost_currency);
10873 debug_message('approved_discount_currency '|| line_rec.approved_discount_currency);
10874 debug_message('requested_discount_currency '|| line_rec.requested_discount_currency);
10875 debug_message('OPERAND '|| x_modifier_line_tbl(l_prod_index).OPERAND);
10876
10877 IF x_modifier_line_tbl(l_prod_index).ARITHMETIC_OPERATOR = 'NEWPRICE' THEN
10878
10879 IF line_rec.product_cost_currency
10880 <> NVL(line_rec.approved_discount_currency,line_rec.requested_discount_currency) THEN
10881
10882 ozf_utility_pvt.convert_currency (
10883 x_return_status=> x_return_status,
10884 p_from_currency=> line_rec.product_cost_currency,
10885 p_to_currency=> NVL(line_rec.approved_discount_currency,line_rec.requested_discount_currency),
10886 p_conv_date=> sysdate,
10887 p_from_amount=> line_rec.product_cost,
10888 x_to_amount=> l_converted_amt
10889 );
10890
10891 debug_message('l_converted_amt '|| l_converted_amt);
10892
10893 line_rec.product_cost := l_converted_amt;
10894
10895 END IF;
10896
10897 x_modifier_line_tbl(l_prod_index).ARITHMETIC_OPERATOR := 'AMT';
10898 x_modifier_line_tbl(l_prod_index).OPERAND := line_rec.product_cost - x_modifier_line_tbl(l_prod_index).OPERAND;
10899
10900 END IF;
10901
10902
10903
10904
10905
10906
10907 OPEN cur_get_header_info;
10908 FETCH cur_get_header_info INTO l_sales_order_currency,
10909 l_request_currency_code,
10910 l_supplier_site_id;
10911 CLOSE cur_get_header_info;
10912
10913 --dbms_output.put_line('l_converted_amt '|| l_converted_amt);
10914
10915
10916 IF x_modifier_line_tbl(l_prod_index).ARITHMETIC_OPERATOR = 'AMT'
10917 AND NVL(line_rec.approved_discount_currency,line_rec.requested_discount_currency)
10918 <> NVL(l_sales_order_currency,l_request_currency_code) THEN
10919 ozf_utility_pvt.convert_currency (
10920 x_return_status=> x_return_status,
10921 p_from_currency=> NVL(line_rec.approved_discount_currency,line_rec.requested_discount_currency),
10922 p_to_currency=> NVL(l_sales_order_currency,l_request_currency_code),
10923 p_conv_date=> sysdate,
10924 p_from_amount=> x_modifier_line_tbl(l_prod_index).OPERAND,
10925 x_to_amount=> l_converted_amt
10926 );
10927 x_modifier_line_tbl(l_prod_index).OPERAND := l_converted_amt;
10928 END IF;
10929
10930 IF line_rec.product_context = 'PRODUCT' THEN
10931 x_modifier_line_tbl(l_prod_index).PRODUCT_ATTR := 'PRICING_ATTRIBUTE1';
10932 x_modifier_line_tbl(l_prod_index).PRODUCT_ATTR_VAL := line_rec.inventory_item_id;
10933 Else
10934 x_modifier_line_tbl(l_prod_index).PRODUCT_ATTR := 'PRICING_ATTRIBUTE2';
10935 x_modifier_line_tbl(l_prod_index).PRODUCT_ATTR_VAL := line_rec.prod_catg_id;
10936 END IF;
10937
10938
10939 x_modifier_line_tbl(l_prod_index).PRODUCT_UOM_CODE := line_rec.item_uom;
10940 x_modifier_line_tbl(l_prod_index).MAX_QTY_PER_RULE := line_rec.limit_qty;
10941 x_modifier_line_tbl(l_prod_index).START_DATE_ACTIVE := trunc(line_rec.start_date);
10942 -- fix for bug 7584161
10943 --x_modifier_line_tbl(l_prod_index).END_DATE_ACTIVE := trunc(line_rec.end_date);
10944 x_modifier_line_tbl(l_prod_index).END_DATE_ACTIVE := trunc(line_rec.end_date+get_grace_days(p_sdr_header_id));
10945 x_modifier_line_tbl(l_prod_index).GENERATE_USING_FORMULA_ID := line_rec.cost_basis;
10946
10947 IF l_supplier_site_id IS NOT NULL
10948 AND l_supplier_site_id <> FND_API.G_MISS_NUM AND x_modifier_line_tbl(l_prod_index).OPERATION = 'CREATE' THEN
10949
10950 OPEN cur_get_qty_inc_flag(l_supplier_site_id);
10951 FETCH cur_get_qty_inc_flag INTO l_allow_qty_increase;
10952 CLOSE cur_get_qty_inc_flag;
10953
10954 IF l_allow_qty_increase = 'Y' THEN
10955 x_modifier_line_tbl(l_prod_index).LIMIT_EXCEED_ACTION_CODE := 'SOFT';
10956 ELSE
10957 x_modifier_line_tbl(l_prod_index).LIMIT_EXCEED_ACTION_CODE := 'HARD';
10958 END IF;
10959
10960 END IF;
10961
10962 l_orig_sys_line_ref_id := NULL;
10963 l_list_line_id := NULL;
10964 l_limit_id := FND_API.G_MISS_NUM;
10965
10966 l_prod_index := l_prod_index+1;
10967 END LOOP;
10968
10969
10970
10971 EXCEPTION
10972 WHEN Fnd_Api.G_EXC_ERROR THEN
10973 x_return_status := Fnd_Api.g_ret_sts_error ;
10974 ROLLBACK TO populateSDDiscountRulesRec;
10975 Fnd_Msg_Pub.Count_AND_Get
10976 ( p_count => x_msg_count,
10977 p_data => x_msg_data,
10978 p_encoded => Fnd_Api.G_FALSE
10979 );
10980 WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
10981 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
10982 ROLLBACK TO populateSDDiscountRulesRec;
10983 Fnd_Msg_Pub.Count_AND_Get
10984 ( p_count => x_msg_count,
10985 p_data => x_msg_data,
10986 p_encoded => Fnd_Api.G_FALSE
10987 );
10988 WHEN OTHERS THEN
10989 x_return_status := Fnd_Api.g_ret_sts_unexp_erroR ;
10990 ROLLBACK TO populateSDDiscountRulesRec;
10991 IF Fnd_Msg_Pub.Check_Msg_Level ( Fnd_Msg_Pub.G_MSG_LVL_UNEXP_ERROR )
10992 THEN
10993 Fnd_Msg_Pub.Add_Exc_Msg( G_PKG_NAME,'populateSDDiscountRulesRec');
10994 END IF;
10995 Fnd_Msg_Pub.Count_AND_Get
10996 ( p_count => x_msg_count,
10997 p_data => x_msg_data,
10998 p_encoded => Fnd_Api.G_FALSE
10999 );
11000 END populateSDDiscountRulesRec;
11001
11002 /*
11003 This procedure creates SD offer qualifier line records.
11004 */
11005
11006 PROCEDURE populateSDQualifiers(
11007 x_return_status OUT NOCOPY VARCHAR2
11008 ,x_msg_count OUT NOCOPY NUMBER
11009 ,x_msg_data OUT NOCOPY VARCHAR2
11010 ,p_sdr_header_id IN NUMBER
11011 ,p_qp_list_header_id IN NUMBER
11012 ,x_qualifier_tbl OUT NOCOPY qualifiers_tbl_type
11013 )
11014 IS
11015
11016 l_qualifier_tbl qualifiers_tbl_type;
11017 l_site_use_id NUMBER;
11018 l_cust_acct_id NUMBER;
11019 l_cust_seq_id NUMBER;
11020 l_cust_add_type_code VARCHAR2(250);
11021 l_cust_type_code VARCHAR2(250);
11022 l_qual_index NUMBER:= 1;
11023 l_end_cust_count NUMBER:=0;
11024 l_qualifier_grouping_no NUMBER:=10;
11025 l_internal_order_number NUMBER;
11026 l_order_header_id NUMBER;
11027 l_org_id NUMBER;
11028
11029 CURSOR cur_get_cust_qual_lines IS
11030 SELECT request_customer_id,party_id,
11031 cust_account_id,site_use_id,
11032 cust_usage_code,end_customer_flag
11033 FROM ozf_sd_customer_details
11034 WHERE request_header_id = p_sdr_header_id;
11035
11036 CURSOR cur_get_end_cust_qual_lines IS
11037 SELECT request_customer_id,party_id,
11038 cust_account_id,site_use_id,
11039 cust_usage_code,end_customer_flag
11040 FROM ozf_sd_customer_details
11041 WHERE request_header_id = p_sdr_header_id;
11042
11043 CURSOR cur_get_end_cust_count IS
11044 SELECT count(request_customer_id)
11045 FROM ozf_sd_customer_details
11046 WHERE request_header_id = p_sdr_header_id
11047 AND end_customer_flag = 'Y';
11048
11049 CURSOR cur_get_old_qualifiers IS
11050 SELECT qualifier_id
11051 FROM qp_qualifiers
11052 WHERE list_header_id = p_qp_list_header_id;
11053
11054 CURSOR cur_get_internal_order_number IS
11055 SELECT internal_order_number,org_id
11056 FROM ozf_sd_request_headers_all_b
11057 WHERE request_header_id = p_sdr_header_id;
11058
11059 CURSOR cur_get_order_header_id (p_internal_order_number NUMBER,p_org_id NUMBER)IS
11060 SELECT header_id
11061 FROM oe_order_headers_all
11062 WHERE order_number = p_internal_order_number
11063 AND org_id=p_org_id;
11064
11065 BEGIN
11066 SAVEPOINT populateSDQualifiers;
11067
11068 x_return_status := Fnd_Api.g_ret_sts_success;
11069 --x_error_location := 0;
11070 debug_message('N: populateSDQualifiers' || p_qp_list_header_id);
11071
11072 OPEN cur_get_end_cust_count;
11073 FETCH cur_get_end_cust_count INTO l_end_cust_count;
11074 CLOSE cur_get_end_cust_count;
11075
11076 debug_message('N: populateSDQualifiers' || l_end_cust_count);
11077
11078
11079 IF p_qp_list_header_id IS NOT NULL AND p_qp_list_header_id <> FND_API.G_MISS_NUM THEN
11080 FOR old_cust_line_rec IN cur_get_old_qualifiers LOOP
11081
11082 x_qualifier_tbl(l_qual_index).list_header_id := p_qp_list_header_id;
11083 x_qualifier_tbl(l_qual_index).qualifier_id := old_cust_line_rec.qualifier_id;
11084 x_qualifier_tbl(l_qual_index).operation := 'DELETE';
11085 x_qualifier_tbl(l_qual_index).list_line_id := -1;
11086 l_qual_index := l_qual_index+1;
11087
11088 END LOOP;
11089 END IF;
11090
11091
11092 IF l_end_cust_count>0 THEN --Check if any end customer exists. If yes then do the customer , end customer grouping
11093 FOR cust_line_rec IN cur_get_cust_qual_lines LOOP
11094 IF cust_line_rec.end_customer_flag = 'N' THEN
11095 FOR end_cust_line_rec IN cur_get_end_cust_qual_lines LOOP
11096 IF end_cust_line_rec.end_customer_flag = 'Y' THEN
11097
11098 --Populate customer record
11099 x_qualifier_tbl(l_qual_index).list_header_id := p_qp_list_header_id;
11100 x_qualifier_tbl(l_qual_index).qualifier_grouping_no := l_qualifier_grouping_no;
11101
11102 -- IF p_operation<>'DELETE' THEN
11103 IF cust_line_rec.cust_usage_code = 'CUSTOMER' OR
11104 cust_line_rec.cust_usage_code = 'BILL_TO' OR
11105 cust_line_rec.cust_usage_code = 'SHIP_TO' THEN
11106
11107 x_qualifier_tbl(l_qual_index).qualifier_context := 'CUSTOMER';
11108
11109 ELSIF cust_line_rec.cust_usage_code = 'BUYING_GROUP' THEN
11110 x_qualifier_tbl(l_qual_index).qualifier_context := 'CUSTOMER_GROUP';
11111 END IF;
11112
11113
11114 IF cust_line_rec.end_customer_flag='N' THEN
11115 IF cust_line_rec.cust_usage_code='CUSTOMER' THEN
11116 x_qualifier_tbl(l_qual_index).qualifier_attribute := 'QUALIFIER_ATTRIBUTE2';
11117 x_qualifier_tbl(l_qual_index).qualifier_attr_value := cust_line_rec.cust_account_id;
11118 ELSIF cust_line_rec.cust_usage_code='BILL_TO' THEN
11119 x_qualifier_tbl(l_qual_index).qualifier_attribute := 'QUALIFIER_ATTRIBUTE14';
11120 x_qualifier_tbl(l_qual_index).qualifier_attr_value := cust_line_rec.site_use_id;
11121 ELSIF cust_line_rec.cust_usage_code='SHIP_TO' THEN
11122 x_qualifier_tbl(l_qual_index).qualifier_attribute := 'QUALIFIER_ATTRIBUTE11';
11123 x_qualifier_tbl(l_qual_index).qualifier_attr_value := cust_line_rec.site_use_id;
11124 ELSIF cust_line_rec.cust_usage_code='BUYING_GROUP' THEN
11125 x_qualifier_tbl(l_qual_index).qualifier_attribute := 'QUALIFIER_ATTRIBUTE3';
11126 x_qualifier_tbl(l_qual_index).qualifier_attr_value := cust_line_rec.party_id;
11127 END IF;
11128 ELSIF cust_line_rec.end_customer_flag='Y' THEN --always customer name as per FDD
11129 x_qualifier_tbl(l_qual_index).qualifier_attribute := 'QUALIFIER_ATTRIBUTE20';
11130 x_qualifier_tbl(l_qual_index).qualifier_attr_value := cust_line_rec.cust_account_id;
11131 END IF;
11132
11133
11134 x_qualifier_tbl(l_qual_index).operation := 'CREATE';
11135 x_qualifier_tbl(l_qual_index).qualifier_attr_value_to := NULL;
11136 x_qualifier_tbl(l_qual_index).qualifier_id := NULL;
11137 x_qualifier_tbl(l_qual_index).comparison_operator_code := '=';
11138 x_qualifier_tbl(l_qual_index).start_date_active := NULL;
11139 x_qualifier_tbl(l_qual_index).end_date_active := NULL;
11140 x_qualifier_tbl(l_qual_index).activity_market_segment_id := NULL;
11141 x_qualifier_tbl(l_qual_index).list_line_id := -1;
11142
11143
11144 l_qual_index := l_qual_index+1;
11145 --end Populate customer record.
11146 --Start populating end customer record
11147
11148 x_qualifier_tbl(l_qual_index).list_header_id := p_qp_list_header_id;
11149 x_qualifier_tbl(l_qual_index).qualifier_grouping_no := l_qualifier_grouping_no;
11150
11151 --IF p_operation<>'DELETE' THEN
11152 IF end_cust_line_rec.cust_usage_code = 'CUSTOMER' OR
11153 end_cust_line_rec.cust_usage_code = 'BILL_TO' OR
11154 end_cust_line_rec.cust_usage_code = 'SHIP_TO' THEN
11155 x_qualifier_tbl(l_qual_index).qualifier_context := 'CUSTOMER';
11156
11157 ELSIF end_cust_line_rec.cust_usage_code = 'BUYING_GROUP' THEN
11158 x_qualifier_tbl(l_qual_index).qualifier_context := 'CUSTOMER_GROUP';
11159 END IF;
11160
11161
11162 IF end_cust_line_rec.end_customer_flag='N' THEN
11163 IF end_cust_line_rec.cust_usage_code='CUSTOMER' THEN
11164 x_qualifier_tbl(l_qual_index).qualifier_attribute := 'QUALIFIER_ATTRIBUTE2';
11165 x_qualifier_tbl(l_qual_index).qualifier_attr_value := end_cust_line_rec.cust_account_id;
11166 ELSIF end_cust_line_rec.cust_usage_code='BILL_TO' THEN
11167 x_qualifier_tbl(l_qual_index).qualifier_attribute := 'QUALIFIER_ATTRIBUTE14';
11168 x_qualifier_tbl(l_qual_index).qualifier_attr_value := end_cust_line_rec.site_use_id;
11169 ELSIF end_cust_line_rec.cust_usage_code='SHIP_TO' THEN
11170 x_qualifier_tbl(l_qual_index).qualifier_attribute := 'QUALIFIER_ATTRIBUTE11';
11171 x_qualifier_tbl(l_qual_index).qualifier_attr_value := end_cust_line_rec.site_use_id;
11172 ELSIF end_cust_line_rec.cust_usage_code='BUYING_GROUP' THEN
11173 x_qualifier_tbl(l_qual_index).qualifier_attribute := 'QUALIFIER_ATTRIBUTE3';
11174 x_qualifier_tbl(l_qual_index).qualifier_attr_value := end_cust_line_rec.party_id;
11175 END IF;
11176
11177 ELSIF end_cust_line_rec.end_customer_flag='Y' THEN --always customer name as per FDD
11178 x_qualifier_tbl(l_qual_index).qualifier_attribute := 'QUALIFIER_ATTRIBUTE20';
11179 x_qualifier_tbl(l_qual_index).qualifier_attr_value := end_cust_line_rec.cust_account_id;
11180 END IF;
11181
11182
11183 x_qualifier_tbl(l_qual_index).operation := 'CREATE';
11184 x_qualifier_tbl(l_qual_index).qualifier_attr_value_to := NULL;
11185 x_qualifier_tbl(l_qual_index).qualifier_id := NULL;
11186 x_qualifier_tbl(l_qual_index).comparison_operator_code := '=';
11187 x_qualifier_tbl(l_qual_index).start_date_active := NULL;
11188 x_qualifier_tbl(l_qual_index).end_date_active := NULL;
11189 x_qualifier_tbl(l_qual_index).activity_market_segment_id := NULL;
11190 x_qualifier_tbl(l_qual_index).list_line_id := -1;
11191
11192 l_qual_index := l_qual_index+1;
11193 l_qualifier_grouping_no := l_qualifier_grouping_no+10;
11194 --End populating end customer record
11195 END IF; --End of end_cust.qualifier_attribute IF
11196 END LOOP;--End of end_cust loop
11197 END IF;--End of cust.qualifier_attribute IF
11198 END LOOP;--End of end_cust loop
11199
11200
11201 ELSE--No end customers so no need for grouping logic
11202 FOR cust_line_rec IN cur_get_cust_qual_lines LOOP
11203
11204 x_qualifier_tbl(l_qual_index).list_header_id := p_qp_list_header_id;
11205 x_qualifier_tbl(l_qual_index).qualifier_grouping_no := l_qualifier_grouping_no;
11206
11207 IF cust_line_rec.cust_usage_code = 'CUSTOMER' OR
11208 cust_line_rec.cust_usage_code = 'BILL_TO' OR
11209 cust_line_rec.cust_usage_code = 'SHIP_TO' THEN
11210 x_qualifier_tbl(l_qual_index).qualifier_context := 'CUSTOMER';
11211
11212 ELSIF cust_line_rec.cust_usage_code = 'BUYING_GROUP' THEN
11213 x_qualifier_tbl(l_qual_index).qualifier_context := 'CUSTOMER_GROUP';
11214 END IF;
11215
11216
11217
11218 IF cust_line_rec.cust_usage_code='CUSTOMER' THEN
11219 x_qualifier_tbl(l_qual_index).qualifier_attribute := 'QUALIFIER_ATTRIBUTE2';
11220 x_qualifier_tbl(l_qual_index).qualifier_attr_value := cust_line_rec.cust_account_id;
11221 ELSIF cust_line_rec.cust_usage_code='BILL_TO' THEN
11222 x_qualifier_tbl(l_qual_index).qualifier_attribute := 'QUALIFIER_ATTRIBUTE14';
11223 x_qualifier_tbl(l_qual_index).qualifier_attr_value := cust_line_rec.site_use_id;
11224 ELSIF cust_line_rec.cust_usage_code='SHIP_TO' THEN
11225 x_qualifier_tbl(l_qual_index).qualifier_attribute := 'QUALIFIER_ATTRIBUTE11';
11226 x_qualifier_tbl(l_qual_index).qualifier_attr_value := cust_line_rec.site_use_id;
11227 ELSIF cust_line_rec.cust_usage_code='BUYING_GROUP' THEN
11228 x_qualifier_tbl(l_qual_index).qualifier_attribute := 'QUALIFIER_ATTRIBUTE3';
11229 x_qualifier_tbl(l_qual_index).qualifier_attr_value := cust_line_rec.party_id;
11230 END IF;
11231 x_qualifier_tbl(l_qual_index).operation := 'CREATE';
11232 x_qualifier_tbl(l_qual_index).qualifier_attr_value_to := NULL;
11233 x_qualifier_tbl(l_qual_index).qualifier_id := NULL;
11234 x_qualifier_tbl(l_qual_index).comparison_operator_code := '=';
11235 x_qualifier_tbl(l_qual_index).start_date_active := NULL;
11236 x_qualifier_tbl(l_qual_index).end_date_active := NULL;
11237 x_qualifier_tbl(l_qual_index).activity_market_segment_id := NULL;
11238 x_qualifier_tbl(l_qual_index).list_line_id := -1;
11239
11240 l_qual_index := l_qual_index+1;
11241 l_qualifier_grouping_no := l_qualifier_grouping_no+10;
11242 END LOOP;
11243 END IF;--END IF
11244
11245 OPEN cur_get_internal_order_number;
11246 FETCH cur_get_internal_order_number INTO l_internal_order_number,l_org_id;
11247 CLOSE cur_get_internal_order_number;
11248
11249 IF l_internal_order_number IS NOT NULL
11250 AND l_internal_order_number <> FND_API.G_MISS_NUM THEN
11251
11252 OPEN cur_get_order_header_id(l_internal_order_number,l_org_id);
11253 FETCH cur_get_order_header_id INTO l_order_header_id;
11254 CLOSE cur_get_order_header_id;
11255
11256 x_qualifier_tbl(l_qual_index).operation := 'CREATE';
11257 x_qualifier_tbl(l_qual_index).qualifier_attribute := 'QUALIFIER_ATTRIBUTE21';
11258 x_qualifier_tbl(l_qual_index).qualifier_attr_value := l_order_header_id;
11259 x_qualifier_tbl(l_qual_index).qualifier_grouping_no := -1;
11260 x_qualifier_tbl(l_qual_index).qualifier_context := 'ORDER';
11261 x_qualifier_tbl(l_qual_index).comparison_operator_code := '=';
11262
11263 x_qualifier_tbl(l_qual_index).list_line_id := -1;
11264 x_qualifier_tbl(l_qual_index).list_header_id := p_qp_list_header_id;
11265 x_qualifier_tbl(l_qual_index).start_date_active := NULL;
11266 x_qualifier_tbl(l_qual_index).end_date_active := NULL;
11267 x_qualifier_tbl(l_qual_index).qualifier_attr_value_to := NULL;
11268 x_qualifier_tbl(l_qual_index).qualifier_id := NULL;
11269
11270 END IF;
11271
11272 EXCEPTION
11273 WHEN Fnd_Api.G_EXC_ERROR THEN
11274 x_return_status := Fnd_Api.g_ret_sts_error ;
11275 ROLLBACK TO populateSDQualifiers;
11276 Fnd_Msg_Pub.Count_AND_Get
11277 ( p_count => x_msg_count,
11278 p_data => x_msg_data,
11279 p_encoded => Fnd_Api.G_FALSE
11280 );
11281 WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
11282 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
11283 ROLLBACK TO populateSDQualifiers;
11284 Fnd_Msg_Pub.Count_AND_Get
11285 ( p_count => x_msg_count,
11286 p_data => x_msg_data,
11287 p_encoded => Fnd_Api.G_FALSE
11288 );
11289 WHEN OTHERS THEN
11290 x_return_status := Fnd_Api.g_ret_sts_unexp_erroR ;
11291 ROLLBACK TO populateSDQualifiers;
11292 IF Fnd_Msg_Pub.Check_Msg_Level ( Fnd_Msg_Pub.G_MSG_LVL_UNEXP_ERROR )
11293 THEN
11294 Fnd_Msg_Pub.Add_Exc_Msg( G_PKG_NAME,'populateSDQualifiers');
11295 END IF;
11296 Fnd_Msg_Pub.Count_AND_Get
11297 ( p_count => x_msg_count,
11298 p_data => x_msg_data,
11299 p_encoded => Fnd_Api.G_FALSE
11300 );
11301 END populateSDQualifiers;
11302
11303 /*
11304 This procedure is starting point of SD offer creation and updation.
11305 */
11306
11307 PROCEDURE process_sd_modifiers(
11308 p_sdr_header_id IN NUMBER
11309 ,p_init_msg_list IN VARCHAR2 :=FND_API.g_true
11310 ,p_api_version IN NUMBER
11311 ,p_commit IN VARCHAR2 :=FND_API.g_false
11312 ,x_return_status OUT NOCOPY VARCHAR2
11313 ,x_msg_count OUT NOCOPY NUMBER
11314 ,x_msg_data OUT NOCOPY VARCHAR2
11315 ,x_qp_list_header_id IN OUT NOCOPY NUMBER
11316 ,x_error_location OUT NOCOPY NUMBER)
11317 IS
11318 l_api_version CONSTANT NUMBER := 1.0;
11319 l_api_name CONSTANT VARCHAR2(30) := 'process_sd_modifiers';
11320 l_offer_id NUMBER;
11321 l_obj_ver_num NUMBER;
11322 l_excl_index NUMBER := 0;
11323 l_dummy NUMBER;
11324 l_user_status_id NUMBER := 0;
11325 l_accrual_type VARCHAR2(30);
11326 l_cost_center_id NUMBER;
11327 l_supplier_site_id NUMBER;
11328 l_cust_account_id NUMBER;
11329 l_site_use_id NUMBER;
11330 l_operation VARCHAR2(30);
11331 l_access_exists NUMBER;
11332 l_activity_access_id NUMBER;
11333 l_object_version_number NUMBER;
11334 l_access_id NUMBER;
11335 l_qp_list_header_id NUMBER;
11336 l_sdr_status_id NUMBER;
11337
11338 l_old_status_id NUMBER;
11339 l_theme_approval_req VARCHAR2(1);
11340 l_budget_approval_req VARCHAR2(1);
11341
11342
11343 l_modifier_list_rec ozf_offer_pvt.modifier_list_rec_type;
11344 l_modifier_line_tbl ozf_offer_pvt.modifier_line_tbl_type;
11345 l_dummy_modifier_line_tbl ozf_offer_pvt.modifier_line_tbl_type;
11346 l_exclusion_tbl ozf_offer_pvt.pricing_attr_tbl_type;
11347 l_qualifiers_tbl ozf_offer_pvt.qualifiers_tbl_type;
11348 l_qualifiers_tbl_out qp_qualifier_rules_pub.qualifiers_tbl_type;
11349 l_advanced_options_rec ozf_offer_pvt.ADVANCED_OPTION_REC_TYPE;
11350 l_access_rec ams_access_pvt.access_rec_type;
11351
11352
11353
11354 CURSOR c_offer_info(l_qp_list_header_id NUMBER) IS
11355 SELECT offer_id, offer_type, custom_setup_id, offer_code, tier_level, object_version_number, transaction_currency_code, user_status_id
11356 FROM ozf_offers
11357 WHERE qp_list_header_id = l_qp_list_header_id;
11358
11359 CURSOR c_user_status_id(l_new_status VARCHAR2) IS
11360 SELECT min(user_status_id)
11361 FROM ams_user_statuses_vl
11362 WHERE system_status_type = 'OZF_OFFR_STATUS'
11363 AND system_status_code=l_new_status;
11364
11365 CURSOR c_sdr_info(l_sdr_hdr_id NUMBER) IS
11366 SELECT accrual_type,cust_account_id,supplier_site_id
11367 FROM ozf_sd_request_headers_all_b
11368 WHERE request_header_id=l_sdr_hdr_id;
11369
11370 CURSOR c_supp_trd_prfl_info(l_supplier_site_id NUMBER) IS
11371 SELECT cust_account_id, site_use_id
11372 FROM ozf_supp_trd_prfls_all
11373 WHERE supplier_site_id=l_supplier_site_id;
11374
11375
11376 CURSOR c_allow_qty_increase(l_supplier_site_id NUMBER) IS
11377 SELECT allow_qty_increase
11378 FROM ozf_supp_trd_prfls_all
11379 WHERE supplier_site_id=l_supplier_site_id;
11380
11381 CURSOR c_offer_access(l_qp_list_header_id NUMBER,l_request_header_id NUMBER) IS
11382 SELECT access_id,user_id,status
11383 FROM (
11384 SELECT activity_access_id access_id,user_or_role_id user_id,'ACCESS' status
11385 FROM ams_act_access
11386 WHERE act_access_to_object_id=l_qp_list_header_id
11387 AND arc_act_access_to_object='OFFR'
11388 AND arc_user_or_role_type = 'USER'
11389 UNION
11390 SELECT request_access_id access_id, user_id user_id,'REQUEST' status
11391 FROM ozf_sd_request_access
11392 WHERE request_header_id=l_request_header_id
11393 AND approver_flag='Y'
11394 AND enabled_flag='Y');
11395
11396 CURSOR c_access_exists(l_resource_id NUMBER,l_qp_list_header_id NUMBER) IS
11397 SELECT 1
11398 FROM DUAL
11399 WHERE EXISTS (SELECT 1
11400 FROM ams_act_access
11401 WHERE act_access_to_object_id = l_qp_list_header_id
11402 AND arc_act_access_to_object='OFFR'
11403 AND user_or_role_id = l_resource_id
11404 AND arc_user_or_role_type = 'USER');
11405
11406 CURSOR c_offer_access_details(l_qp_list_header_id NUMBER,l_resource_id NUMBER) IS
11407 SELECT activity_access_id,object_version_number
11408 FROM ams_act_access
11409 WHERE act_access_to_object_id = l_qp_list_header_id
11410 AND arc_act_access_to_object = 'OFFR'
11411 AND user_or_role_id = l_resource_id
11412 AND arc_user_or_role_type = 'USER';
11413
11414 CURSOR c_get_sdr_status(p_sdr_header_id NUMBER) IS
11415 SELECT user_status_id
11416 FROM OZF_SD_REQUEST_HEADERS_ALL_B
11417 WHERE request_header_id=p_sdr_header_id;
11418
11419 CURSOR cur_is_theme_appr_req(p_custom_setup_id NUMBER) IS
11420 SELECT attr_available_flag
11421 FROM ams_custom_setup_attr
11422 WHERE custom_setup_id = p_custom_setup_id
11423 AND object_attribute = 'TAPL';
11424
11425 CURSOR cur_is_budget_appr_req(p_custom_setup_id NUMBER) IS
11426 SELECT attr_available_flag
11427 FROM ams_custom_setup_attr
11428 WHERE custom_setup_id = p_custom_setup_id
11429 AND object_attribute = 'BAPL';
11430
11431 CURSOR c_get_sdr_owner(p_sdr_header_id NUMBER) IS
11432 SELECT NVL(resource_id,-1)
11433 FROM ozf_sd_request_access
11434 WHERE request_header_id= p_sdr_header_id;
11435
11436 BEGIN
11437
11438 SAVEPOINT process_sd_modifiers;
11439 IF Fnd_Api.to_boolean(p_init_msg_list) THEN
11440 Fnd_Msg_Pub.initialize;
11441 END IF;
11442
11443 IF NOT Fnd_Api.compatible_api_call(l_api_version,
11444 p_api_version,
11445 l_api_name,
11446 g_pkg_name)
11447 THEN
11448 RAISE Fnd_Api.g_exc_unexpected_error;
11449 END IF;
11450
11451 x_return_status := Fnd_Api.g_ret_sts_success;
11452 x_error_location := 0;
11453 g_sd_offer := 'Y';
11454
11455 IF FND_PROFILE.VALUE('OZF_SD_DEFAULT_BUDGET') IS NULL THEN
11456 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
11457 FND_MESSAGE.set_name('OZF', 'OZF_SD_OFFR_NO_BUDGET_REQUEST');
11458 FND_MSG_PUB.add;
11459 END IF;
11460 RAISE Fnd_Api.g_exc_unexpected_error;
11461 END IF;
11462
11463 /*decide operation*/
11464
11465 debug_message('N: qp_list_header_id' || x_qp_list_header_id);
11466
11467 l_qp_list_header_id := x_qp_list_header_id;
11468 IF x_qp_list_header_id IS NULL
11469 OR x_qp_list_header_id = Fnd_Api.g_miss_num THEN
11470 l_operation := 'CREATE';
11471 ELSE
11472 l_operation := 'UPDATE';
11473 END IF;
11474
11475 OPEN c_get_sdr_status(p_sdr_header_id);
11476 FETCH c_get_sdr_status INTO l_sdr_status_id;
11477 CLOSE c_get_sdr_status;
11478
11479 IF l_sdr_status_id = OZF_Utility_PVT.get_default_user_status('OZF_SD_REQUEST_STATUS','CANCELLED')
11480 OR l_sdr_status_id = OZF_Utility_PVT.get_default_user_status('OZF_SD_REQUEST_STATUS','CLOSED') THEN
11481
11482 OPEN c_offer_info(x_qp_list_header_id);
11483 FETCH c_offer_info INTO l_modifier_list_rec.offer_id, l_modifier_list_rec.offer_type,
11484 l_modifier_list_rec.custom_setup_id, l_modifier_list_rec.offer_code,
11485 l_modifier_list_rec.tier_level, l_modifier_list_rec.object_version_number,
11486 l_modifier_list_rec.transaction_currency_code,
11487 l_modifier_list_rec.user_status_id;
11488 CLOSE c_offer_info;
11489
11490
11491 IF x_qp_list_header_id IS NOT NULL THEN
11492 l_modifier_list_rec.qp_list_header_id := x_qp_list_header_id;
11493 l_modifier_list_rec.offer_operation := 'UPDATE';
11494 l_modifier_list_rec.status_code := 'COMPLETED';
11495 l_modifier_list_rec.modifier_operation := 'UPDATE';
11496 --l_modifier_list_rec.operation := 'UPDATE';
11497 l_modifier_list_rec.user_status_id := OZF_Utility_PVT.get_default_user_status('OZF_OFFER_STATUS','COMPLETED');
11498 l_qp_list_header_id := x_qp_list_header_id;
11499
11500 /*Complete Offer*/
11501 process_modifiers(
11502 p_init_msg_list => p_init_msg_list
11503 ,p_api_version => p_api_version
11504 ,p_commit => p_commit
11505 ,x_return_status => x_return_status
11506 ,x_msg_count => x_msg_count
11507 ,x_msg_data => x_msg_data
11508 ,p_offer_type => 'ACCRUAL'
11509 ,p_modifier_list_rec => l_modifier_list_rec
11510 ,p_modifier_line_tbl => l_dummy_modifier_line_tbl -- lines are already created. use empty line.
11511 ,x_qp_list_header_id => x_qp_list_header_id
11512 ,x_error_location => x_error_location);
11513
11514 GOTO COMPLETED_OFFER;
11515
11516 END IF;
11517 END IF;
11518
11519 /*Create Header record*/
11520 populateSDHeaderRec(
11521 x_return_status => x_return_status
11522 ,x_msg_count => x_msg_count
11523 ,x_msg_data => x_msg_data
11524 ,p_operation => l_operation
11525 ,p_sdr_header_id => p_sdr_header_id
11526 ,p_qp_list_header_id => x_qp_list_header_id
11527 ,x_modifier_list_rec => l_modifier_list_rec
11528 );
11529
11530 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
11531 RAISE Fnd_Api.g_exc_error;
11532 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
11533 RAISE Fnd_Api.g_exc_unexpected_error;
11534 END IF;
11535
11536 /*Create Header*/
11537 IF l_operation = 'CREATE' THEN
11538
11539 l_modifier_list_rec.modifier_operation := 'CREATE';
11540 l_modifier_list_rec.status_code := 'DRAFT';
11541 l_modifier_list_rec.user_status_id := ozf_utility_pvt.get_default_user_status('OZF_OFFER_STATUS','DRAFT');--1600;
11542
11543 IF l_modifier_list_rec.OWNER_ID IS NULL OR l_modifier_list_rec.OWNER_ID = fnd_api.g_miss_num THEN
11544 l_modifier_list_rec.OWNER_ID := ozf_utility_pvt.get_resource_id(NVL(FND_GLOBAL.user_id,-1));
11545 ELSE
11546 l_modifier_list_rec.OWNER_ID := l_modifier_list_rec.OWNER_ID;
11547 END IF;
11548
11549 l_modifier_list_rec.modifier_operation := 'CREATE';
11550
11551
11552 debug_message('N: l_modifier_list_rec.TRANSACTION_CURRENCY_CODE ' || l_modifier_list_rec.TRANSACTION_CURRENCY_CODE);
11553 debug_message('x_return_status ' ||x_return_status);
11554 debug_message('x_qp_list_header_id ' ||x_qp_list_header_id);
11555
11556
11557 ELSE
11558
11559 l_modifier_list_rec.qp_list_header_id:= x_qp_list_header_id;
11560
11561 IF l_modifier_list_rec.OWNER_ID IS NULL OR l_modifier_list_rec.OWNER_ID = -1
11562 OR l_modifier_list_rec.OWNER_ID = fnd_api.g_miss_num THEN
11563
11564 OPEN c_get_sdr_owner(p_sdr_header_id);
11565 FETCH c_get_sdr_owner INTO l_modifier_list_rec.OWNER_ID;
11566 CLOSE c_get_sdr_owner;
11567
11568 ELSE
11569 l_modifier_list_rec.OWNER_ID := l_modifier_list_rec.OWNER_ID;
11570 END IF;
11571
11572 END IF;
11573
11574 --dbms_output.put_line('Nirma 2 ' );
11575
11576
11577
11578
11579
11580 debug_message('N: l_offer_id'||l_offer_id);
11581 debug_message('N: l_modifier_list_rec.transaction_currency_code 33'||l_modifier_list_rec.transaction_currency_code);
11582 debug_message('N: pass list_header_id for update'||x_qp_list_header_id);
11583
11584 /*Create Discount Line Records*/
11585
11586 populateSDDiscountRulesRec(
11587 x_return_status => x_return_status
11588 ,x_msg_count => x_msg_count
11589 ,x_msg_data => x_msg_data
11590 ,p_operation => l_operation
11591 ,p_sdr_header_id => p_sdr_header_id
11592 ,p_qp_list_header_id => x_qp_list_header_id
11593 ,x_modifier_line_tbl => l_modifier_line_tbl
11594 );
11595
11596 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
11597 RAISE Fnd_Api.g_exc_error;
11598 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
11599 RAISE Fnd_Api.g_exc_unexpected_error;
11600 END IF;
11601
11602 debug_message('N: 11 l_modifier_line_tbl count ' || l_modifier_line_tbl.count);
11603
11604 /*Create Discount Lines*/
11605
11606 IF l_modifier_line_tbl.count>0 THEN
11607
11608 Ozf_Offer_Pvt.process_modifiers(
11609 p_init_msg_list => p_init_msg_list
11610 ,p_api_version => p_api_version
11611 ,p_commit => p_commit
11612 ,x_return_status => x_return_status
11613 ,x_msg_count => x_msg_count
11614 ,x_msg_data => x_msg_data
11615 ,p_offer_type => 'ACCRUAL'
11616 ,p_modifier_list_rec => l_modifier_list_rec
11617 ,p_modifier_line_tbl => l_modifier_line_tbl
11618 ,x_qp_list_header_id => l_dummy
11619 ,x_error_location => x_error_location);
11620
11621 ELSE
11622
11623 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
11624 FND_MESSAGE.set_name('OZF', 'OZF_OFFR_NO_DISC_LINES');
11625 FND_MSG_PUB.add;
11626 END IF;
11627 RAISE FND_API.g_exc_error;
11628 END IF;
11629
11630 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
11631 RAISE Fnd_Api.g_exc_error;
11632 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
11633 RAISE Fnd_Api.g_exc_unexpected_error;
11634 END IF;
11635
11636
11637 IF l_dummy IS NOT NULL THEN
11638 x_qp_list_header_id:=l_dummy;
11639 END IF;
11640
11641 OPEN c_offer_info(x_qp_list_header_id);
11642 FETCH c_offer_info INTO l_modifier_list_rec.offer_id,
11643 l_modifier_list_rec.offer_type,
11644 l_modifier_list_rec.custom_setup_id,
11645 l_modifier_list_rec.offer_code,
11646 l_modifier_list_rec.tier_level,
11647 l_modifier_list_rec.object_version_number,
11648 l_modifier_list_rec.transaction_currency_code,
11649 l_modifier_list_rec.user_status_id;
11650 CLOSE c_offer_info;
11651
11652
11653 IF l_modifier_list_rec.user_status_id IS NOT NULL AND l_modifier_list_rec.user_status_id <> fnd_api.g_miss_num THEN -- might have additional stage eg ACTIVE to go
11654 --dbms_output.put_line('l_modifier_list_rec.user_status_id set operation as update' );
11655 l_modifier_list_rec.offer_operation := 'UPDATE';
11656 l_modifier_list_rec.modifier_operation := 'UPDATE';
11657 l_modifier_list_rec.user_status_id := l_modifier_list_rec.user_status_id;
11658 l_modifier_list_rec.status_code := ozf_utility_pvt.get_system_status_code(l_modifier_list_rec.user_status_id);
11659 END IF;
11660
11661 /*Create Qualifier Line Records*/
11662 --dbms_output.put_line('N: x_qp_list_header_id '||x_qp_list_header_id);
11663
11664 IF x_qp_list_header_id IS NOT NULL THEN
11665 populateSDQualifiers(
11666 x_return_status => x_return_status
11667 ,x_msg_count => x_msg_count
11668 ,x_msg_data => x_msg_data
11669 ,p_sdr_header_id => p_sdr_header_id
11670 ,p_qp_list_header_id => x_qp_list_header_id
11671 ,x_qualifier_tbl => l_qualifiers_tbl
11672 );
11673 debug_message('N: count3 '||l_qualifiers_tbl.count);
11674
11675 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
11676 RAISE Fnd_Api.g_exc_error;
11677 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
11678 RAISE Fnd_Api.g_exc_unexpected_error;
11679 END IF;
11680
11681 /*Create Market Qualifiers*/
11682 process_market_qualifiers(
11683 p_init_msg_list => p_init_msg_list
11684 ,p_api_version => p_api_version
11685 ,p_commit => p_commit
11686 ,x_return_status => x_return_status
11687 ,x_msg_count => x_msg_count
11688 ,x_msg_data => x_msg_data
11689 ,p_qualifiers_tbl => l_qualifiers_tbl
11690 ,x_error_location => x_error_location
11691 ,x_qualifiers_tbl => l_qualifiers_tbl_out);
11692
11693 debug_message('N: count4 '||l_qualifiers_tbl_out.count);
11694
11695 /*IF x_return_status = Fnd_Api.g_ret_sts_error THEN
11696 RAISE Fnd_Api.g_exc_error;
11697 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
11698 RAISE Fnd_Api.g_exc_unexpected_error;
11699 END IF;*/
11700
11701 debug_message('N: activate the records '||x_return_status);
11702
11703
11704 l_advanced_options_rec.list_header_id := x_qp_list_header_id;
11705
11706 OPEN c_sdr_info(p_sdr_header_id);
11707 FETCH c_sdr_info INTO l_accrual_type, l_cust_account_id, l_supplier_site_id;
11708 CLOSE c_sdr_info;
11709
11710 IF l_accrual_type='SUPPLIER' THEN
11711 OPEN c_supp_trd_prfl_info(l_supplier_site_id);
11712 FETCH c_supp_trd_prfl_info INTO l_cust_account_id,l_site_use_id;
11713 CLOSE c_supp_trd_prfl_info;
11714 END IF;
11715
11716 l_advanced_options_rec.autopay_party_id := l_cust_account_id;
11717
11718 IF l_site_use_id IS NULL THEN
11719 l_advanced_options_rec.autopay_party_attr := 'CUSTOMER';
11720 --l_advanced_options_rec.autopay_party_id := l_cust_account_id;
11721 --l_advanced_options_rec.beneficiary_account_id := l_cust_account_id;
11722 ELSE
11723 l_advanced_options_rec.autopay_party_attr := 'CUSTOMER_BILL_TO';
11724 l_advanced_options_rec.autopay_party_id := l_site_use_id;
11725 --l_advanced_options_rec.beneficiary_account_id := l_cust_account_id;
11726 END IF;
11727
11728 /*Create Advance Option*/
11729 process_adv_options(
11730 p_init_msg_list => p_init_msg_list
11731 ,p_api_version => p_api_version
11732 ,p_commit => p_commit
11733 ,x_return_status => x_return_status
11734 ,x_msg_count => x_msg_count
11735 ,x_msg_data => x_msg_data
11736 ,p_advanced_options_rec => l_advanced_options_rec
11737 );
11738
11739 /*activate the offer */
11740 --change the create record to update record and activate the offer.
11741
11742 OPEN c_offer_info(x_qp_list_header_id);
11743 FETCH c_offer_info INTO l_modifier_list_rec.offer_id, l_modifier_list_rec.offer_type,
11744 l_modifier_list_rec.custom_setup_id, l_modifier_list_rec.offer_code,
11745 l_modifier_list_rec.tier_level, l_modifier_list_rec.object_version_number,
11746 l_modifier_list_rec.transaction_currency_code,
11747 l_modifier_list_rec.user_status_id;
11748 CLOSE c_offer_info;
11749
11750
11751 debug_message('N: process_adv_options '||x_return_status);
11752 debug_message('N: x_qp_list_header_id '|| x_qp_list_header_id);
11753
11754
11755 IF x_qp_list_header_id IS NOT NULL THEN
11756
11757 OPEN cur_is_theme_appr_req(l_modifier_list_rec.custom_setup_id);
11758 FETCH cur_is_theme_appr_req INTO l_theme_approval_req;
11759 CLOSE cur_is_theme_appr_req;
11760
11761
11762
11763 OPEN cur_is_budget_appr_req(l_modifier_list_rec.custom_setup_id);
11764 FETCH cur_is_budget_appr_req INTO l_budget_approval_req;
11765 CLOSE cur_is_budget_appr_req;
11766
11767 debug_message('N: l_theme_approval_req '|| l_theme_approval_req);
11768 debug_message('N: l_budget_approval_req '|| l_budget_approval_req);
11769
11770 IF l_theme_approval_req='Y' THEN
11771
11772 Ams_Approval_Submit_Pvt.Submit_Approval(
11773 p_api_version => 1,
11774 p_init_msg_list => FND_API.g_true,
11775 p_commit => FND_API.g_false,
11776 p_validation_level => FND_API.g_valid_level_full,
11777 p_object_id => x_qp_list_header_id,
11778 p_object_type => 'OFFR',
11779 p_new_status_id => 1640, -- planned status for offers
11780 x_return_status => x_return_status,
11781 x_msg_count => x_msg_count,
11782 x_msg_data => x_msg_data);
11783
11784 ELSIF l_budget_approval_req = 'Y' AND l_theme_approval_req='N' THEN
11785
11786 Ams_Approval_Submit_Pvt.Submit_Approval(
11787 p_api_version => 1,
11788 p_init_msg_list => FND_API.g_false,
11789 p_commit => FND_API.g_false,
11790 p_validation_level => FND_API.g_valid_level_full,
11791 p_object_id => x_qp_list_header_id,
11792 p_object_type => 'OFFR',
11793 p_new_status_id => 1604, -- will come from status dropdown on approval detail page
11794 x_return_status => x_return_status,
11795 x_msg_count => x_msg_count,
11796 x_msg_data => x_msg_data);
11797
11798 ELSE
11799
11800 l_modifier_list_rec.qp_list_header_id := x_qp_list_header_id;
11801 l_modifier_list_rec.offer_operation := 'UPDATE';
11802 l_modifier_list_rec.status_code := 'ACTIVE';
11803 l_modifier_list_rec.modifier_operation := 'UPDATE';
11804 --l_modifier_list_rec.operation := 'UPDATE';
11805 l_modifier_list_rec.user_status_id := OZF_Utility_PVT.get_default_user_status('OZF_OFFER_STATUS','ACTIVE');
11806 l_qp_list_header_id := x_qp_list_header_id;
11807
11808 /*Activate Offer*/
11809 process_modifiers(
11810 p_init_msg_list => p_init_msg_list
11811 ,p_api_version => p_api_version
11812 ,p_commit => p_commit
11813 ,x_return_status => x_return_status
11814 ,x_msg_count => x_msg_count
11815 ,x_msg_data => x_msg_data
11816 ,p_offer_type => 'ACCRUAL'
11817 ,p_modifier_list_rec => l_modifier_list_rec
11818 ,p_modifier_line_tbl => l_dummy_modifier_line_tbl -- lines are already created. use empty line.
11819 ,x_qp_list_header_id => x_qp_list_header_id
11820 ,x_error_location => x_error_location);
11821
11822 /*added this code to make SDR active */
11823
11824 /*IF l_modifier_list_rec.user_status_id = OZF_Utility_PVT.get_default_user_status('OZF_OFFER_STATUS','ACTIVE') THEN
11825
11826 debug_message('p_sdr_header_id1111 = '|| p_sdr_header_id);
11827
11828 update ozf_sd_request_headers_all_b
11829 set user_status_id = OZF_Utility_PVT.get_default_user_status('OZF_SD_REQUEST_STATUS','ACTIVE')
11830 where request_header_id = p_sdr_header_id;
11831
11832 END IF;*/
11833
11834 END IF;
11835
11836
11837
11838 debug_message('N: activate the records1 '||x_return_status);
11839 END IF;
11840
11841 IF x_return_status = Fnd_Api.g_ret_sts_error THEN
11842 RAISE Fnd_Api.g_exc_error;
11843 ELSIF x_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
11844 RAISE Fnd_Api.g_exc_unexpected_error;
11845 END IF;
11846
11847 IF l_qp_list_header_id IS NULL THEN
11848 l_qp_list_header_id := x_qp_list_header_id;
11849 END IF;
11850
11851 /*Add access code*/
11852 debug_message('N: x_qp_list_header_id '||l_qp_list_header_id);
11853 debug_message('N: p_sdr_header_id '||p_sdr_header_id);
11854 debug_message('N: b4 adding access');
11855
11856 FOR l_offer_access_rec IN c_offer_access(l_qp_list_header_id,p_sdr_header_id) LOOP
11857 dbms_output.put_line('N: l_offer_access_rec.user_id '||l_offer_access_rec.user_id);
11858 dbms_output.put_line('N: l_qp_list_header_id '||l_qp_list_header_id);
11859 l_access_exists := 0;
11860 OPEN c_access_exists (ozf_utility_pvt.get_resource_id(nvl(l_offer_access_rec.user_id,-1)),l_qp_list_header_id);
11861 FETCH c_access_exists INTO l_access_exists;
11862 CLOSE c_access_exists;
11863 debug_message('N: l_access_exists '||l_access_exists);
11864 debug_message('N: l_offer_access_rec.status '|| l_offer_access_rec.status);
11865
11866 IF l_access_exists <> 1 AND l_offer_access_rec.status='REQUEST' THEN
11867 --CREATE
11868 l_access_rec.act_access_to_object_id := l_qp_list_header_id;
11869 l_access_rec.arc_act_access_to_object := 'OFFR';
11870 l_access_rec.user_or_role_id := ozf_utility_pvt.get_resource_id(l_offer_access_rec.user_id);
11871 l_access_rec.arc_user_or_role_type := 'USER';
11872 l_access_rec.admin_flag := 'Y';
11873 l_access_rec.owner_flag := 'N';
11874 debug_message('N: l_access_rec.user_or_role_id '||l_access_rec.user_or_role_id);
11875 debug_message('N: l_access_rec.act_access_to_object_id '||l_access_rec.act_access_to_object_id);
11876
11877 ams_access_pvt.create_access(
11878 p_api_version => l_api_version
11879 ,p_init_msg_list => fnd_api.g_false
11880 ,p_validation_level => fnd_api.g_valid_level_full
11881 ,x_return_status => x_return_status
11882 ,x_msg_count => x_msg_count
11883 ,x_msg_data => x_msg_data
11884 ,p_commit => fnd_api.g_false
11885 ,p_access_rec => l_access_rec
11886 ,x_access_id => l_access_id);
11887
11888 IF x_return_status = fnd_api.g_ret_sts_error THEN
11889 RAISE fnd_api.g_exc_error;
11890 ELSIF x_return_status = fnd_api.g_ret_sts_unexp_error THEN
11891 RAISE fnd_api.g_exc_unexpected_error;
11892 END IF;
11893 debug_message('N: x_return_status '||x_return_status);
11894 END IF;
11895 END LOOP;
11896 END IF;
11897
11898 <<COMPLETED_OFFER>>
11899 NULL;
11900
11901 IF x_qp_list_header_id IS NULL THEN
11902 x_qp_list_header_id := l_qp_list_header_id;
11903 END IF;
11904
11905
11906 debug_message('Returned Status to Calling API '|| x_return_status);
11907 debug_message('Returned list_header_id to Calling API '|| x_qp_list_header_id);
11908
11909 EXCEPTION
11910 WHEN Fnd_Api.G_EXC_ERROR THEN
11911 x_return_status := Fnd_Api.g_ret_sts_error ;
11912 ROLLBACK TO process_sd_modifiers;
11913 Fnd_Msg_Pub.Count_AND_Get
11914 ( p_count => x_msg_count,
11915 p_data => x_msg_data,
11916 p_encoded => Fnd_Api.G_FALSE
11917 );
11918 WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
11919 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
11920 ROLLBACK TO process_sd_modifiers;
11921 Fnd_Msg_Pub.Count_AND_Get
11922 ( p_count => x_msg_count,
11923 p_data => x_msg_data,
11924 p_encoded => Fnd_Api.G_FALSE
11925 );
11926 WHEN OTHERS THEN
11927 x_return_status := Fnd_Api.g_ret_sts_unexp_erroR ;
11928 ROLLBACK TO process_sd_modifiers;
11929 IF Fnd_Msg_Pub.Check_Msg_Level ( Fnd_Msg_Pub.G_MSG_LVL_UNEXP_ERROR )
11930 THEN
11931 Fnd_Msg_Pub.Add_Exc_Msg( G_PKG_NAME,l_api_name);
11932 END IF;
11933 Fnd_Msg_Pub.Count_AND_Get
11934 ( p_count => x_msg_count,
11935 p_data => x_msg_data,
11936 p_encoded => Fnd_Api.G_FALSE
11937 );
11938
11939 END process_sd_modifiers;
11940
11941 END OZF_Offer_Pvt;
11942