DBA Data[Home] [Help]

PACKAGE BODY: APPS.OZF_OFFER_PVT

Source


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