DBA Data[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