DBA Data[Home] [Help]

PACKAGE BODY: APPS.QP_BULK_VALIDATE

Source


1 PACKAGE BODY QP_BULK_VALIDATE AS
2 /* $Header: QPXBLVAB.pls 120.71 2011/07/15 11:42:34 smbalara ship $ */
3 
4 /* Begin Bug No. 8854118, shaneed
5  * changes
6  * procedure dup_line_check - modified completely
7  * function get_count - removed
8  * function check_dates_for_dupl - removed
9  * check_dates_overlap - new function added, similar to check_dates_overlap
10  * procedure mark_dup_line  - new fuction, to mark a line is duplict
11  */
12 
13 /* this function check whether the dates of both line overlap
14  * return true if there is an overlap, otherwise returns false
15  */
16 FUNCTION CHECK_DATES_OVERLAP(P_REQUEST_ID NUMBER,
17                              p_orig_sys_header_ref VARCHAR2,
18                              p_orig_sys_line_ref_a VARCHAR2,
19                              p_orig_sys_line_ref_b VARCHAR2)
20 RETURN BOOLEAN
21 IS
22     l_min_date DATE;
23     l_max_date DATE;
24 
25     l_a_start_date_active DATE;
26     l_a_end_date_active DATE;
27 
28     l_b_start_date_active DATE;
29     l_b_end_date_active DATE;
30 
31     l_routine VARCHAR2(230) := 'QP_BULK_VALIDATE.CHECK_DATES_OVERLAP ';
32 
33 BEGIN
34     l_min_date := To_Date('01/01/1900', 'MM/DD/YYYY');
35     l_max_date := To_Date('12/31/9999', 'MM/DD/YYYY');
36 
37     --fetching dates for first line, that will be in interface table
38     BEGIN
39         SELECT Nvl(a.start_date_active, l_min_date), Nvl(a.end_date_active, l_max_date)
40             INTO l_a_start_date_active, l_a_end_date_active
41         FROM qp_interface_list_lines a
42         WHERE a.orig_sys_header_ref = p_orig_sys_header_ref
43           AND a.orig_sys_line_ref = p_orig_sys_line_ref_a
44           AND a.request_id = p_request_id;
45     EXCEPTION
46         WHEN No_Data_Found
47         THEN
48             qp_bulk_loader_pub.write_log(l_routine || 'no line in qp_interface_list_lines for ' || p_orig_sys_line_ref_a);
49             RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
50         WHEN OTHERS
51         THEN
52             qp_bulk_loader_pub.write_log(l_routine || '#100 Unexpected exception ' || SQLERRM);
53             RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
54     END;
55 
56     --fetching dates for second line, that can be either in interface table or setup table
57     BEGIN --begin1
58         SELECT Nvl(a.start_date_active, l_min_date), Nvl(a.end_date_active, l_max_date)
59             INTO l_b_start_date_active, l_b_end_date_active
60         FROM qp_interface_list_lines a
61         WHERE a.orig_sys_header_ref = p_orig_sys_header_ref
62             AND a.orig_sys_line_ref = p_orig_sys_line_ref_b
63             AND a.request_id = p_request_id;
64     EXCEPTION --begin1
65         WHEN No_Data_Found
66         THEN
67             BEGIN --begin2
68                 SELECT Nvl(a.start_date_active, l_min_date), Nvl(a.end_date_active, l_max_date)
69                     INTO l_b_start_date_active, l_b_end_date_active
70                 FROM qp_list_lines a
71                 WHERE a.orig_sys_header_ref = p_orig_sys_header_ref
72                 AND a.orig_sys_line_ref = p_orig_sys_line_ref_b;
73             EXCEPTION --begin2
74                 WHEN No_Data_Found
75                 THEN
76                     qp_bulk_loader_pub.write_log(l_routine || ' date not found in qp_list_lines and qp_interface_list_lines');
77                     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
78             END; --begin2
79     END; --begin1
80 
81     l_a_start_date_active := Trunc(l_a_start_date_active); --truncate the dates, to remove time part
82     l_a_end_date_active := Trunc(l_a_end_date_active);
83 
84     l_b_start_date_active := Trunc(l_b_start_date_active);
85     l_b_end_date_active := Trunc(l_b_end_date_active);
86 
87     /* checking for (S1 between S2 and E2) or (E1 between S2 and E2)
88     * that can be simplified as S1 <= E2 and S2 <= E1  -- condition for overlap
89     * S1 - start date of first line
90     */
91     IF l_a_start_date_active <= l_b_end_date_active  --it is the simplified condition
92         AND l_b_start_date_active <= l_a_end_date_active
93     THEN
94         RETURN TRUE; --it overlap
95     END IF;
96 
97     RETURN FALSE; --no overlap
98 
99 EXCEPTION
100     WHEN OTHERS
101     THEN
102         qp_bulk_loader_pub.write_log(l_routine || '#200 Unexpected exception ' || SQLERRM);
103         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
104 END CHECK_DATES_OVERLAP; --check_dates_overlap;
105 
106 --mark duplicate line - insert into qp_interface_errors
107 PROCEDURE mark_dup_line(p_request_id NUMBER,
108                         p_orig_sys_header_ref VARCHAR2,
109                         p_orig_sys_line_ref VARCHAR2)
110 IS
111     l_msg VARCHAR2(2000);
112     l_error_id NUMBER;
113 
114     l_routine VARCHAR2(230) := 'MARK_DUP_LINE ';
115 BEGIN
116     UPDATE qp_interface_list_lines
117     SET process_status_flag = NULL --process_status_flag = NULL means, line errored out
118     WHERE orig_sys_header_ref = p_orig_sys_header_ref
119         AND orig_sys_line_ref = p_orig_sys_line_ref
120         AND request_id = p_request_id;
121 
122     fnd_message.set_name('QP', 'QP_DUPLICATE_LIST_LINES');
123     l_msg := fnd_message.Get;
124 
125     SELECT qp_interface_errors_s.NEXTVAL
126         INTO l_error_id
127     FROM dual;
128 
129     INSERT INTO qp_interface_errors(error_id, last_update_date, last_updated_by,
130         creation_date, created_by, last_update_login, request_id,
131         program_application_id, program_id, program_update_date, entity_type,
132         table_name, column_name, orig_sys_header_ref, orig_sys_line_ref,
133         orig_sys_qualifier_ref, orig_sys_pricing_attr_ref, error_message)
134     VALUES(l_error_id, SYSDATE, FND_GLOBAL.USER_ID,
135         SYSDATE, FND_GLOBAL.USER_ID, FND_GLOBAL.CONC_LOGIN_ID, p_request_id,
136         661, NULL, NULL, 'PRL',
137         'QP_INTERFACE_LIST_LINES', NULL, p_orig_sys_header_ref, p_orig_sys_line_ref,
138         NULL, NULL, l_msg);
139 
140 EXCEPTION
141     WHEN OTHERS
142     THEN
143         qp_bulk_loader_pub.write_log(l_routine || 'Unexpected exception ' || SQLERRM);
144         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
145 END mark_dup_line;
146 
147 PROCEDURE dup_line_check(p_request_id NUMBER)
148 IS
149     /* This cursor gives lines which got atleast one
150 	 * duplicate pricing attibute with another line
151      * in qp_interface_pricing_attribs */
152     CURSOR c_dup_line_rec IS
153         SELECT distinct a_attr.orig_sys_header_ref,
154             a_attr.orig_sys_line_ref,      --first line
155             b_attr.orig_sys_line_ref       --second line
156         FROM qp_interface_pricing_attribs a_attr,
157             qp_interface_pricing_attribs b_attr
158         WHERE a_attr.request_id = p_request_id
159             AND b_attr.request_id =  p_request_id
160             AND a_attr.process_status_flag = 'P'
161             AND b_attr.process_status_flag = 'P'
162             AND a_attr.interface_action_code IN ('INSERT', 'UPDATE') --don't have to consider attributes
163             AND b_attr.interface_action_code IN ('INSERT', 'UPDATE') --which are going to be deleted
164             AND a_attr.orig_sys_header_ref = b_attr.orig_sys_header_ref --should be in same price list
165             AND a_attr.orig_sys_line_ref <> b_attr.orig_sys_line_ref --not same line
166             AND a_attr.product_attribute_context = b_attr.product_attribute_context
167             AND a_attr.product_attribute = b_attr.product_attribute
168             AND a_attr.product_attr_value = b_attr.product_attr_value
169             AND Nvl(a_attr.product_uom_code, '*') = Nvl(b_attr.product_uom_code, '*')
170             AND (
171                     (  --either no pricing attribute or same pricing attribute
172                         a_attr.pricing_attribute_context = b_attr.pricing_attribute_context
173                         AND a_attr.pricing_attribute = b_attr.pricing_attribute
174                         AND nvl(a_attr.pricing_attr_value_from, 0) =
175                             nvl(b_attr.pricing_attr_value_from, 0)
176                         AND nvl(a_attr.pricing_attr_value_to, 0) =
177                             nvl(b_attr.pricing_attr_value_to, 0)
178                         AND a_attr.comparison_operator_code = b_attr.comparison_operator_code
179                     )
180                     OR   --either no pricing attribute or same pricing attribute
181                     (
182                         a_attr.pricing_attribute_context IS NULL
183                         AND b_attr.pricing_attribute_context IS NULL
184                         AND a_attr.pricing_attribute IS NULL
185                         AND b_attr.pricing_attribute IS NULL
186                     )
187             )
188     ;
189 
190     /* Cursor gives line that got atleast one duplicate pricing attribute line
191      * in qp_pricing_attributes table */
192     CURSOR c_dup_line_rec1 IS
193         SELECT DISTINCT a_attr.orig_sys_header_ref,
194             a_attr.orig_sys_line_ref,
195             b_attr.orig_sys_line_ref
196         FROM qp_interface_pricing_attribs a_attr,
197             qp_pricing_attributes b_attr
198         WHERE a_attr.request_id = p_request_id
199             AND a_attr.process_status_flag = 'P'
200             AND a_attr.interface_action_code IN ('INSERT', 'UPDATE')
201             AND b_attr.orig_sys_header_ref = a_attr.orig_sys_header_ref
202             AND b_attr.orig_sys_line_ref <> a_attr.orig_sys_line_ref
203             AND b_attr.product_attribute_context = a_attr.product_attribute_context
204             AND b_attr.product_attribute = a_attr.product_attribute
205             AND b_attr.product_attr_value = a_attr.product_attr_value
206             AND Nvl(b_attr.product_uom_code, '*') = Nvl(a_attr.product_uom_code, '*')
207             AND NOT EXISTS(  /* should not consider pricing attribute which  */
208                 SELECT 'X'   /* going to be updated or deleted */
209                 FROM qp_interface_pricing_attribs c
210                 WHERE c.request_id = p_request_id
211                     AND c.orig_sys_pricing_attr_ref = b_attr.orig_sys_pricing_attr_ref
212                     AND c.interface_action_code IN ('UPDATE', 'DELETE')
213             )
214             AND (  --either no pricing attribute or same pricing attribute
215                     (
216                         a_attr.pricing_attribute_context = b_attr.pricing_attribute_context
217                         AND a_attr.pricing_attribute = b_attr.pricing_attribute
218                         AND nvl(a_attr.pricing_attr_value_from, 0) =
219                             nvl(b_attr.pricing_attr_value_from, 0)
220                         AND nvl(a_attr.pricing_attr_value_to, 0) =
221                             nvl(b_attr.pricing_attr_value_to, 0)
222                         AND a_attr.comparison_operator_code = b_attr.comparison_operator_code
223                     )
224                     OR
225                     (
226                         a_attr.pricing_attribute_context IS NULL
227                         AND b_attr.pricing_attribute_context IS NULL
228                         AND a_attr.pricing_attribute IS NULL
229                         AND b_attr.pricing_attribute IS NULL
230                     )
231                 )
232         ;
233 
234     /* gives all pricing attribute of a line
235      * union b/w qp_interface_pricing_attribs and qp_pricing_attributes
236      */
237     CURSOR c_pricing_attr(l_orig_sys_line_ref VARCHAR2) IS
238     /* take attibute from qp_interface_pricing_attribs */
239         SELECT pricing_attribute_context,
240         pricing_attribute,
241         pricing_attr_value_from,
242         pricing_attr_value_to,
243         comparison_operator_code
244         FROM qp_interface_pricing_attribs
245         WHERE request_id = p_request_id
246             AND orig_sys_line_ref = l_orig_sys_line_ref
247             AND pricing_attribute_context IS NOT NULL
248             AND pricing_attribute IS NOT NULL
249 
250         UNION /* union with qp_interface_pricing_attribs */
251 
252         SELECT pricing_attribute_context,
253             pricing_attribute,
254             pricing_attr_value_from,
255             pricing_attr_value_to,
256             comparison_operator_code
257         FROM qp_pricing_attributes qpa
258         WHERE qpa.orig_sys_line_ref = l_orig_sys_line_ref
259             AND qpa.pricing_attribute_context IS NOT NULL
260             AND qpa.pricing_attribute IS NOT NULL
261             AND NOT EXISTS (  /* do not take an attribute from */
262                 SELECT 1      /* qp_pricing_attributes if that going to */
263 			      /*  be updated or deleted */
264                 FROM qp_interface_pricing_attribs c
265                 WHERE c.orig_sys_line_ref = l_orig_sys_line_ref
266                     AND c.interface_action_code IN ('UPDATE', 'DELETE')
267                     AND c.orig_sys_pricing_attr_ref = qpa.orig_sys_pricing_attr_ref
268             )
269     ;
270 
271 
272     TYPE char50_type   IS TABLE OF Varchar2(50)   INDEX BY BINARY_INTEGER;
273     TYPE char30_type   IS TABLE OF Varchar2(50)   INDEX BY BINARY_INTEGER;
274     TYPE char240_type   IS TABLE OF Varchar2(50)   INDEX BY BINARY_INTEGER;
275 
276     TYPE dup_line_type IS RECORD (
277         orig_sys_header_ref char50_type,
278         a_orig_sys_line_ref char50_type,
279         b_orig_sys_line_ref char50_type
280     );
281     TYPE found_duplicate_type IS TABLE OF varchar2(1) INDEX BY varchar2(50);
282 
283     TYPE pa_line_type IS RECORD (
284         pricing_attribute_context char30_type,
285         pricing_attribute char30_type,
286         pricing_attr_value_from char240_type,
287         pricing_attr_value_to char240_type,
288         comparison_operator_code char30_type
289     );
290 
291     l_dup_line_rec dup_line_type;
292     l_found_duplicate_tbl FOUND_DUPLICATE_TYPE;
293 
294     l_a_pa_line_rec PA_LINE_TYPE; --pricing attirbutes of first line
295     l_b_pa_line_rec PA_LINE_TYPE; --that of second line
296 
297     l_limit NUMBER := 5000; --number of records to be bulk collected
298 
299     l_a_pa_count NUMBER;
300     l_b_pa_count NUMBER;
301     l_pa_count NUMBER;
302 
303     l_a_count NUMBER;
304     l_b_count NUMBER;
305 
306     l_dummy VARCHAR2(2);
307 
308     l_routine VARCHAR2(230) := 'DUP_LINE_CHECK ';
309 BEGIN
310     /* First we check for duplicates in qp_interface_pricing_attribs(i_mode = 1)
311      * then in qp_pricing_attributes(i_mode = 2) */
312     qp_bulk_loader_pub.write_log('In ' || l_routine);
313     FOR i_mode IN 1..2
314     LOOP
315         qp_bulk_loader_pub.write_log('i_mode = ' || i_mode);
316         IF i_mode = 1
317         THEN
318             OPEN c_dup_line_rec;
319         ELSE
320             OPEN c_dup_line_rec1;
321         END IF;
322 
323         LOOP	--LOOP_1
324             l_dup_line_rec.orig_sys_header_ref.DELETE;
325             l_dup_line_rec.a_orig_sys_line_ref.DELETE;
326             l_dup_line_rec.b_orig_sys_line_ref.DELETE;
327 
328             IF i_mode = 1
329             THEN
330                 FETCH c_dup_line_rec BULK COLLECT
331                     INTO l_dup_line_rec.orig_sys_header_ref,
332                     l_dup_line_rec.a_orig_sys_line_ref,
333                     l_dup_line_rec.b_orig_sys_line_ref
334                 LIMIT l_limit;
335 
336                 qp_bulk_loader_pub.write_log('count = ' || l_dup_line_rec.a_orig_sys_line_ref.count);
337 
338                 EXIT WHEN l_dup_line_rec.a_orig_sys_line_ref.COUNT = 0;
339             ELSIF i_mode = 2 --IF i_mode = 1
340             THEN
341                 FETCH c_dup_line_rec1 BULK COLLECT
342                     INTO l_dup_line_rec.orig_sys_header_ref,
343                     l_dup_line_rec.a_orig_sys_line_ref,
344                     l_dup_line_rec.b_orig_sys_line_ref
345                 LIMIT l_limit;
346 
347                 qp_bulk_loader_pub.write_log('count = ' || l_dup_line_rec.a_orig_sys_line_ref.count);
348 
349                 EXIT WHEN l_dup_line_rec.a_orig_sys_line_ref.COUNT = 0;
350             END IF; --IF i_mode = 1
351 
352             FOR i IN 1..l_dup_line_rec.a_orig_sys_line_ref.Count
353             LOOP
354                 IF l_found_duplicate_tbl.EXISTS(l_dup_line_rec.a_orig_sys_line_ref(i)) --IF3
355                 THEN
356                     qp_bulk_loader_pub.write_log('a = ' || l_dup_line_rec.a_orig_sys_line_ref(i));
357                     qp_bulk_loader_pub.write_log('b = ' || l_dup_line_rec.b_orig_sys_line_ref(i));
358                     qp_bulk_loader_pub.write_log('already found these are duplicates');
359                 ELSE --IF3
360                     /* do not process price break */
361                     IF i_mode = 1 --IF1
362                     THEN
363                         BEGIN
364                             SELECT 'X' INTO l_dummy
365                             FROM qp_interface_list_lines
366                             WHERE orig_sys_line_ref = l_dup_line_rec.b_orig_sys_line_ref(i)
367                                 AND price_break_header_ref IS NOT NULL
368                                 AND rltd_modifier_grp_type = 'PRICE BREAK'; --test this
369                         EXCEPTION
370                             WHEN OTHERS
371                             THEN
372                                 NULL;
373                         END;
374                     ELSIF i_mode = 2  --IF1
375                     THEN
376                         BEGIN
377                             SELECT 'X' INTO l_dummy
378                             FROM qp_rltd_modifiers qrm,
379                                 qp_list_lines b
380                             WHERE b.orig_sys_header_ref = l_dup_line_rec.orig_sys_header_ref(i)
381                                 AND b.orig_sys_line_ref = l_dup_line_rec.b_orig_sys_line_ref(i)
382                                 AND qrm.rltd_modifier_grp_type = 'PRICE BREAK'
383                                 AND qrm.to_rltd_modifier_id = b.list_line_id;
384                         EXCEPTION
385                         WHEN OTHERS
386                         THEN
387                             NULL;
388                         END;
389                     END IF; --IF1
390 
391                     IF l_dummy IS NULL --this code does not process price breaks
392                     THEN
393                         /* first code checks if there is a date overlap
394                          * if no overlap, line is not duplicate
395                          * if overlaps, check whether all pricing attributes
396                          * got duplicates
397                          */
398                         IF NOT check_dates_overlap(p_request_id, --if dates do not overlap
399                             l_dup_line_rec.orig_sys_header_ref(i),
400                             l_dup_line_rec.a_orig_sys_line_ref(i),
401                             l_dup_line_rec.b_orig_sys_line_ref(i))
402                         THEN
403                             NULL; --not duplicates
404                         ELSE --date overlap
405                             l_a_pa_count := 0;
406                             l_b_pa_count := 0;
407 
408                             l_a_pa_line_rec.pricing_attribute_context.DELETE;
409                             l_a_pa_line_rec.pricing_attribute.DELETE;
410                             l_a_pa_line_rec.pricing_attr_value_from.DELETE;
411                             l_a_pa_line_rec.pricing_attr_value_to.DELETE;
412                             l_a_pa_line_rec.comparison_operator_code.DELETE;
413 
414                             /* fetch pricing attribute of first line */
415                             OPEN c_pricing_attr(l_dup_line_rec.a_orig_sys_line_ref(i));
416                             FETCH c_pricing_attr BULK COLLECT
417                             INTO l_a_pa_line_rec.pricing_attribute_context,
418                                 l_a_pa_line_rec.pricing_attribute,
419                                 l_a_pa_line_rec.pricing_attr_value_from,
420                                 l_a_pa_line_rec.pricing_attr_value_to,
421                                 l_a_pa_line_rec.comparison_operator_code;
422 
423                             CLOSE c_pricing_attr;
424 
425                             l_b_pa_line_rec.pricing_attribute_context.DELETE;
426                             l_b_pa_line_rec.pricing_attribute.DELETE;
427                             l_b_pa_line_rec.pricing_attr_value_from.DELETE;
428                             l_b_pa_line_rec.pricing_attr_value_to.DELETE;
429                             l_b_pa_line_rec.comparison_operator_code.DELETE;
430 
431                             /* fetch pricing attributes of second line */
432                             OPEN c_pricing_attr(l_dup_line_rec.b_orig_sys_line_ref(i));
433                             FETCH c_pricing_attr BULK COLLECT
434                             INTO l_b_pa_line_rec.pricing_attribute_context,
435                                 l_b_pa_line_rec.pricing_attribute,
436                                 l_b_pa_line_rec.pricing_attr_value_from,
437                                 l_b_pa_line_rec.pricing_attr_value_to,
438                                 l_b_pa_line_rec.comparison_operator_code;
439 
440                             CLOSE c_pricing_attr;
441 
442                             l_a_pa_count := l_a_pa_line_rec.pricing_attribute_context.Count;
443                             l_b_pa_count := l_b_pa_line_rec.pricing_attribute_context.Count;
444 
445                             /* if both got same number of pricing attibutes
446                              * further checking
447                              * otherwise it is not a duplicate
448                              */
449                             IF l_a_pa_count = l_b_pa_count
450                             THEN
451                                 --check if the pricing attributes in both the lines match
452                                 l_pa_count := l_a_pa_count;
453                                 FOR j IN 1..l_a_pa_line_rec.pricing_attribute_context.Count --FOR1
454                                 LOOP
455                                     FOR k IN 1..l_b_pa_line_rec.pricing_attribute_context.Count --FOR2
456                                     LOOP
457                                         IF l_a_pa_line_rec.pricing_attribute_context(j)
458                                                 = l_b_pa_line_rec.pricing_attribute_context(k)
459                                                 AND l_a_pa_line_rec.pricing_attribute(j)
460                                                 = l_b_pa_line_rec.pricing_attribute(k)
461                                             AND l_a_pa_line_rec.pricing_attr_value_from(j)
462                                                 = l_b_pa_line_rec.pricing_attr_value_from(k)
463                                             AND Nvl(l_a_pa_line_rec.pricing_attr_value_to(j), '*')
464                                                 = Nvl(l_b_pa_line_rec.pricing_attr_value_to(k), '*')
465                                             AND l_a_pa_line_rec.comparison_operator_code(j)
466                                                 = l_b_pa_line_rec.comparison_operator_code(k)
467                                         THEN
468                                             l_pa_count := l_pa_count - 1;
469                                             EXIT; --exit loop FOR2
470                                         END IF;
471                                     END LOOP; --FOR2
472                                 END LOOP;--FOR1
473 
474                                 IF l_pa_count = 0 --if all the attributes are same, then duplicates
475                                 THEN
476                                     mark_dup_line(p_request_id,
477                                                   l_dup_line_rec.orig_sys_header_ref(i),
478                                                   l_dup_line_rec.a_orig_sys_line_ref(i));
479 
480                                     --mark it, so we don't have to procss the same line again!!
481                                     l_found_duplicate_tbl(l_dup_line_rec.a_orig_sys_line_ref(i)) := 'Y';
482                                     qp_bulk_loader_pub.write_log('Found a duplicate b/w '
483                                             || l_dup_line_rec.a_orig_sys_line_ref(i) ||
484                     						' and ' || l_dup_line_rec.b_orig_sys_line_ref(i));
485                                 END IF; --IF l_pa_count = 0
486                             END IF; --IF l_a_pa_count = l_b_pa_count
487                         END IF; --IF3, end if for date overlap check
488                     END IF; --IF l_dummy IS NULL
489                 END IF; --IF l_found_duplicate_tbl.EXISTS(l_dup_line_rec.a_orig_sys_line_ref(i))
490             END LOOP; --FOR i IN 1..l_dup_line_rec.a_orig_sys_line_ref.Count
491         END LOOP;   --LOOP_1
492 
493         IF i_mode = 1
494         THEN
495             CLOSE c_dup_line_rec;
496         ELSE
497             CLOSE c_dup_line_rec1;
498         END IF;
499 	END LOOP; --FOR i_mode IN 1..2
500     qp_bulk_loader_pub.write_log(l_routine || 'Done, found ' || l_found_duplicate_tbl.COUNT || ' duplicates');
501 EXCEPTION
502     WHEN OTHERS
503     THEN
504         qp_bulk_loader_pub.write_log(l_routine || 'Unexpected Exception ' || SQLERRM);
505         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
506 END dup_line_check; -- dup_line_check
507 --End Bug No: 8854118, shaneed
508 
509 FUNCTION GET_FLEX_ENABLED_FLAG(p_flex_name VARCHAR2)
510 RETURN VARCHAR2
511 IS
512 l_count NUMBER;
513 BEGIN
514     SELECT count(*)
515     INTO l_count
516     FROM fnd_descr_flex_column_usages
517     WHERE APPLICATION_ID = 661
518     AND DESCRIPTIVE_FLEXFIELD_NAME = p_flex_name
519     AND ENABLED_FLAG = 'Y'
520     AND ROWNUM = 1;
521 
522     IF l_count = 1 THEN
523         RETURN 'Y';
524     ELSE
525         RETURN 'N';
526     END IF;
527 EXCEPTION
528     WHEN OTHERS THEN
529         RETURN 'N';
530 END GET_FLEX_ENABLED_FLAG;
531 
532 FUNCTION Desc_Flex ( p_flex_name IN VARCHAR2 )
533 RETURN BOOLEAN
534 IS
535    l_count NUMBER := 0;
536 BEGIN
537 
538 
539     qp_bulk_loader_pub.write_log( 'In Desc Flex '||p_flex_name);
540 
541     g_context     := NULL;
542     g_attribute1  := NULL;
543     g_attribute2  := NULL;
544     g_attribute3  := NULL;
545     g_attribute4  := NULL;
546     g_attribute5  := NULL;
547     g_attribute6  := NULL;
548     g_attribute7  := NULL;
549     g_attribute8  := NULL;
550     g_attribute9  := NULL;
551     g_attribute10 := NULL;
552     g_attribute11 := NULL;
553     g_attribute12 := NULL;
554     g_attribute13 := NULL;
555     g_attribute14 := NULL;
556     g_attribute15 := NULL;
557 
558     IF FND_FLEX_DESCVAL.Validate_Desccols( 'QP', p_flex_name, 'D') THEN
559 
560 
561        -- Copying values into global variables
562        l_count := fnd_flex_descval.segment_count;
563        qp_bulk_loader_pub.write_log( 'segment count='||to_char(l_count));
564 
565        FOR i IN 1..l_count LOOP
566 
567 qp_bulk_loader_pub.write_log( 'segment col nam='||FND_FLEX_DESCVAL.segment_column_name(i));
568 qp_bulk_loader_pub.write_log( 'segment ID='|| FND_FLEX_DESCVAL.segment_id(i));
569 
570           IF FND_FLEX_DESCVAL.segment_column_name(i) = g_context_name THEN
571              g_context :=  FND_FLEX_DESCVAL.segment_id(i);
572            ELSIF FND_FLEX_DESCVAL.segment_column_name(i) = g_attribute1_name THEN
573              g_attribute1 := FND_FLEX_DESCVAL.segment_id(i);
574            ELSIF FND_FLEX_DESCVAL.segment_column_name(i) = g_attribute2_name THEN
575              g_attribute2 := FND_FLEX_DESCVAL.segment_id(i);
576            ELSIF FND_FLEX_DESCVAL.segment_column_name(i) = g_attribute3_name THEN
577              g_attribute3 := FND_FLEX_DESCVAL.segment_id(i);
578            ELSIF FND_FLEX_DESCVAL.segment_column_name(i) = g_attribute4_name THEN
579              g_attribute4 := FND_FLEX_DESCVAL.segment_id(i);
580            ELSIF FND_FLEX_DESCVAL.segment_column_name(i) = g_attribute5_name THEN
581              g_attribute5 := FND_FLEX_DESCVAL.segment_id(i);
582            ELSIF FND_FLEX_DESCVAL.segment_column_name(i) = g_attribute6_name THEN
583              g_attribute6 := FND_FLEX_DESCVAL.segment_id(i);
584            ELSIF FND_FLEX_DESCVAL.segment_column_name(i) = g_attribute7_name THEN
585              g_attribute7 := FND_FLEX_DESCVAL.segment_id(i);
586            ELSIF FND_FLEX_DESCVAL.segment_column_name(i) = g_attribute8_name THEN
587              g_attribute8 := FND_FLEX_DESCVAL.segment_id(i);
588            ELSIF FND_FLEX_DESCVAL.segment_column_name(i) = g_attribute9_name THEN
589              g_attribute9 := FND_FLEX_DESCVAL.segment_id(i);
590            ELSIF FND_FLEX_DESCVAL.segment_column_name(i) = g_attribute10_name THEN
591              g_attribute10 := FND_FLEX_DESCVAL.segment_id(i);
592            ELSIF FND_FLEX_DESCVAL.segment_column_name(i) = g_attribute11_name THEN
593              g_attribute11 := FND_FLEX_DESCVAL.segment_id(i);
594            ELSIF FND_FLEX_DESCVAL.segment_column_name(i) = g_attribute12_name THEN
595              g_attribute12 := FND_FLEX_DESCVAL.segment_id(i);
596            ELSIF FND_FLEX_DESCVAL.segment_column_name(i) = g_attribute13_name THEN
597              g_attribute13 := FND_FLEX_DESCVAL.segment_id(i);
598            ELSIF FND_FLEX_DESCVAL.segment_column_name(i) = g_attribute14_name THEN
599              g_attribute14 := FND_FLEX_DESCVAL.segment_id(i);
600            ELSIF FND_FLEX_DESCVAL.segment_column_name(i) = g_attribute15_name THEN
601              g_attribute15 := FND_FLEX_DESCVAL.segment_id(i);
602           END IF;
603        END LOOP;
604 
605        RETURN TRUE;
606 
607      ELSE
608         --  Prepare the encoded message by setting it on the message
609         --  dictionary stack. Then, add it to the API message list.
610 
611         FND_MESSAGE.Set_Encoded(FND_FLEX_DESCVAL.Encoded_Error_Message);
612 
613         --  Derive return status.
614 
615         IF FND_FLEX_DESCVAL.value_error OR
616             FND_FLEX_DESCVAL.unsupported_error
617         THEN
618             --  In case of an expected error return FALSE
619 	    qp_bulk_loader_pub.write_log( p_flex_name||'Desc Flex value/unsupport error');
620             RETURN FALSE;
621         ELSE
622             --  In case of an unexpected error raise an exception.
623 	    qp_bulk_loader_pub.write_log( p_flex_name||'Desc Flex unexpected error');
624             RETURN FALSE;
625         END IF;
626     END IF;
627 
628 
629     RETURN TRUE;
630 END Desc_Flex;
631 
632 FUNCTION Init_Desc_Flex (p_flex_name IN VARCHAR2,
633 			   p_context IN VARCHAR2,
634                            p_attribute1 IN VARCHAR2,
635                            p_attribute2 IN VARCHAR2,
636                            p_attribute3 IN VARCHAR2,
637                            p_attribute4 IN VARCHAR2,
638                            p_attribute5 IN VARCHAR2,
639                            p_attribute6 IN VARCHAR2,
640                            p_attribute7 IN VARCHAR2,
641                            p_attribute8 IN VARCHAR2,
642                            p_attribute9 IN VARCHAR2,
643                            p_attribute10 IN VARCHAR2,
644                            p_attribute11 IN VARCHAR2,
645                            p_attribute12 IN VARCHAR2,
646                            p_attribute13 IN VARCHAR2,
647                            p_attribute14 IN VARCHAR2,
648                            p_attribute15 IN VARCHAR2)
649 RETURN BOOLEAN
650 IS
651 l_column_value VARCHAR2(240) := null;
652 BEGIN
653       qp_bulk_loader_pub.write_log( 'In Init Desc Flex '||p_flex_name);
654 
655 	g_context_name := 'CONTEXT';
656 	g_attribute1_name := 'ATTRIBUTE1';
657 	g_attribute2_name := 'ATTRIBUTE2';
658 	g_attribute3_name := 'ATTRIBUTE3';
659 	g_attribute4_name := 'ATTRIBUTE4';
660 	g_attribute5_name := 'ATTRIBUTE5';
661 	g_attribute6_name := 'ATTRIBUTE6';
662 	g_attribute7_name := 'ATTRIBUTE7';
663 	g_attribute8_name := 'ATTRIBUTE8';
664 	g_attribute9_name := 'ATTRIBUTE9';
665 	g_attribute10_name := 'ATTRIBUTE10';
666 	g_attribute11_name := 'ATTRIBUTE11';
667 	g_attribute12_name := 'ATTRIBUTE12';
668 	g_attribute13_name := 'ATTRIBUTE13';
669 	g_attribute14_name := 'ATTRIBUTE14';
670 	g_attribute15_name := 'ATTRIBUTE15';
671 
672 	  IF p_attribute1 = FND_API.G_MISS_CHAR THEN
673 
674 	     l_column_value := null;
675 
676 	  ELSE
677 
678 	     l_column_value := p_attribute1;
679 	    qp_bulk_loader_pub.write_log( 'Attribute1='||l_column_value);
680 
681 	  END IF;
682 
683 	  FND_FLEX_DESCVAL.Set_Column_Value
684 	  (   column_name   => 'ATTRIBUTE1'
685 	   ,  column_value  => l_column_value);
686 
687 	  IF p_attribute2 = FND_API.G_MISS_CHAR THEN
688 
689 	     l_column_value := null;
690 
691 	  ELSE
692 
693 	     l_column_value := p_attribute2;
694 	    qp_bulk_loader_pub.write_log( 'Attribute2='||l_column_value);
695 
696 	  END IF;
697 
698 	  FND_FLEX_DESCVAL.Set_Column_Value
699 	  (   column_name   => 'ATTRIBUTE2'
700 	   ,  column_value  => l_column_value);
701 
702 	  IF p_attribute3 = FND_API.G_MISS_CHAR THEN
703 
704 	     l_column_value := null;
705 
706 	  ELSE
707 
708 	     l_column_value := p_attribute3;
709 	    qp_bulk_loader_pub.write_log( 'Attribute3='||l_column_value);
710 
711 	  END IF;
712 
713 	  FND_FLEX_DESCVAL.Set_Column_Value
714 	  (   column_name   => 'ATTRIBUTE3'
715 	   ,  column_value  => l_column_value);
716 
717 	  IF p_attribute4 = FND_API.G_MISS_CHAR THEN
718 
719 	     l_column_value := null;
720 
721 	  ELSE
722 
723 	     l_column_value := p_attribute4;
724 	    qp_bulk_loader_pub.write_log( 'Attribute4='||l_column_value);
725 
726 	  END IF;
727 
728 	  FND_FLEX_DESCVAL.Set_Column_Value
729 	  (   column_name   => 'ATTRIBUTE4'
730 	   ,  column_value  => l_column_value);
731 
732 	  IF p_attribute5 = FND_API.G_MISS_CHAR THEN
733 
734 	     l_column_value := null;
735 
736 	  ELSE
737 
738 	     l_column_value := p_attribute5;
739 	    qp_bulk_loader_pub.write_log( 'Attribute5='||l_column_value);
740 
741 	  END IF;
742 
743 	  FND_FLEX_DESCVAL.Set_Column_Value
744 	  (   column_name   => 'ATTRIBUTE5'
745 	   ,  column_value  => l_column_value);
746 
747 	  IF p_attribute6 = FND_API.G_MISS_CHAR THEN
748 
749 	     l_column_value := null;
750 
751 	  ELSE
752 
753 	     l_column_value := p_attribute6;
754 	    qp_bulk_loader_pub.write_log( 'Attribute6='||l_column_value);
755 
756 	  END IF;
757 
758 	  FND_FLEX_DESCVAL.Set_Column_Value
759 	  (   column_name   => 'ATTRIBUTE6'
760 	   ,  column_value  => l_column_value);
761 
762 	  IF p_attribute7 = FND_API.G_MISS_CHAR THEN
763 
764 	     l_column_value := null;
765 
766 	  ELSE
767 
768 	     l_column_value := p_attribute7;
769 	    qp_bulk_loader_pub.write_log( 'Attribute7='||l_column_value);
770 
771 	  END IF;
772 
773 	  FND_FLEX_DESCVAL.Set_Column_Value
774 	  (   column_name   => 'ATTRIBUTE7'
775 	   ,  column_value  => l_column_value);
776 
777 	  IF p_attribute8 = FND_API.G_MISS_CHAR THEN
778 
779 	     l_column_value := null;
780 
781 	  ELSE
782 
783 	     l_column_value := p_attribute8;
784 	    qp_bulk_loader_pub.write_log( 'Attribute8='||l_column_value);
785 
786 	  END IF;
787 
788 	  FND_FLEX_DESCVAL.Set_Column_Value
789 	  (   column_name   => 'ATTRIBUTE8'
790 	   ,  column_value  => l_column_value);
791 
792 	  IF p_attribute9 = FND_API.G_MISS_CHAR THEN
793 
794 	     l_column_value := null;
795 
796 	  ELSE
797 
798 	     l_column_value := p_attribute9;
799 	    qp_bulk_loader_pub.write_log( 'Attribute9='||l_column_value);
800 
801 	  END IF;
802 
803 	  FND_FLEX_DESCVAL.Set_Column_Value
804 	  (   column_name   => 'ATTRIBUTE9'
805 	   ,  column_value  => l_column_value);
806 
807 	  IF p_attribute10 = FND_API.G_MISS_CHAR THEN
808 
809 	     l_column_value := null;
810 
811 	  ELSE
812 
813 	     l_column_value := p_attribute10;
814 	    qp_bulk_loader_pub.write_log( 'Attribute10='||l_column_value);
815 
816 	  END IF;
817 
818 	  FND_FLEX_DESCVAL.Set_Column_Value
819 	  (   column_name   => 'ATTRIBUTE10'
820 	   ,  column_value  => l_column_value);
821 
822 	  IF p_attribute11 = FND_API.G_MISS_CHAR THEN
823 
824 	     l_column_value := null;
825 
826 	  ELSE
827 
828 	     l_column_value := p_attribute11;
829 	    qp_bulk_loader_pub.write_log( 'Attribute11='||l_column_value);
830 
831 	  END IF;
832 
833 	  FND_FLEX_DESCVAL.Set_Column_Value
834 	  (   column_name   => 'ATTRIBUTE11'
835 	   ,  column_value  => l_column_value);
836 
837 	  IF p_attribute12 = FND_API.G_MISS_CHAR THEN
838 
839 	     l_column_value := null;
840 
841 	  ELSE
842 
843 	     l_column_value := p_attribute12;
844 	    qp_bulk_loader_pub.write_log( 'Attribute12='||l_column_value);
845 
846 	  END IF;
847 
848 	  FND_FLEX_DESCVAL.Set_Column_Value
849 	  (   column_name   => 'ATTRIBUTE12'
850 	   ,  column_value  => l_column_value);
851 
852 	  IF p_attribute13 = FND_API.G_MISS_CHAR THEN
853 
854 	     l_column_value := null;
855 
856 	  ELSE
857 
858 	     l_column_value := p_attribute13;
859 	    qp_bulk_loader_pub.write_log( 'Attribute13='||l_column_value);
860 
861 	  END IF;
862 
863 	  FND_FLEX_DESCVAL.Set_Column_Value
864 	  (   column_name   => 'ATTRIBUTE13'
865 	   ,  column_value  => l_column_value);
866 
867 	  IF p_attribute14 = FND_API.G_MISS_CHAR THEN
868 
869 	     l_column_value := null;
870 
871 	  ELSE
872 
873 	     l_column_value := p_attribute14;
874 	    qp_bulk_loader_pub.write_log( 'Attribute14='||l_column_value);
875 
876 	  END IF;
877 
878 	  FND_FLEX_DESCVAL.Set_Column_Value
879 	  (   column_name   => 'ATTRIBUTE14'
880 	   ,  column_value  => l_column_value);
881 
882 	  IF p_attribute15 = FND_API.G_MISS_CHAR THEN
883 
884 	     l_column_value := null;
885 
886 	  ELSE
887 
888 	     l_column_value := p_attribute15;
889 	    qp_bulk_loader_pub.write_log( 'Attribute15='||l_column_value);
890 
891 	  END IF;
892 
893 	  FND_FLEX_DESCVAL.Set_Column_Value
894 	  (   column_name   => 'ATTRIBUTE15'
895 	   ,  column_value  => l_column_value);
896 
897 	  IF p_context = FND_API.G_MISS_CHAR THEN
898 
899 	     l_column_value := null;
900 
901 	  ELSE
902 
903 	     l_column_value := p_context;
904 	    qp_bulk_loader_pub.write_log( 'Context='||l_column_value);
905 
906 	  END IF;
907 	  FND_FLEX_DESCVAL.Set_Context_Value
908 	   ( context_value   => l_column_value);
909 
910 	 IF NOT Desc_Flex(p_flex_name) THEN
911 		RETURN FALSE;
912 	 END IF;
913 	RETURN TRUE;
914 END;
915 
916 PROCEDURE ENTITY_HEADER
917           (p_header_rec IN OUT NOCOPY QP_BULK_LOADER_PUB.HEADER_REC_TYPE)
918 
919 IS
920 l_msg_rec QP_BULK_MSG.Msg_Rec_Type;
921 l_old_PRICE_LIST_rec  QP_Price_List_PUB.Price_List_Rec_Type;
922 l_dummy                       VARCHAR2(10);
923 l_unit_precision_type varchar2(255) ;
924 l_precision number := NULL;
925 l_extended_precision number := NULL;
926 l_price_rounding   VARCHAR2(50);
927 l_list_header_id NUMBER;
928 l_exist NUMBER;
929 l_start_date_active VARCHAR2(30);
930 l_qp_pte VARCHAR2(50);
931 l_qp_source_system_code VARCHAR2(50);
932 
933 l_header_flex_enabled VARCHAR2(1);
934 l_security_profile VARCHAR2(1);
935 l_header_id_null VARCHAR2(1);   --bug 6961376
936 
937 -- Bug 4904393 START RAVI
938 /**
939 Local variables to store the hdr interface dates in date format.
940 **/
941 l_start_date DATE;
942 l_end_date DATE;
943 -- Bug 4904393 END RAVI
944 
945 -- Bug 5414062 START RAVI
946 l_first_date_hash VARCHAR2(1);
947 l_second_date_hash VARCHAR2(1);
948 l_date_length NUMBER;
949 -- Bug 5414062 END RAVI
950 
951 BEGIN
952    qp_bulk_loader_pub.write_log('Entering Entity_header validation');
953 
954    select fnd_date.date_to_canonical(TRUNC(SYSDATE))
955    into	  l_start_date_active
956    from DUAL;
957 
958     l_qp_pte := FND_PROFILE.VALUE('QP_PRICING_TRANSACTION_ENTITY');
959     l_qp_source_system_code := FND_PROFILE.VALUE('QP_SOURCE_SYSTEM_CODE');
960 
961    l_header_flex_enabled := get_flex_enabled_flag('QP_LIST_HEADERS');
962    qp_bulk_loader_pub.write_log('Flex enabled '||l_header_flex_enabled);
963 
964 FOR I IN 1..p_header_rec.orig_sys_header_ref.COUNT
965 LOOP
966 
967 --Initially setting the message context.
968 
969 l_msg_rec.REQUEST_ID := P_HEADER_REC.REQUEST_ID(I);
970 l_msg_rec.ENTITY_TYPE :='PRL';
971 l_msg_rec.TABLE_NAME :='QP_INTERFACE_LIST_HEADERS';
972 l_msg_rec.ORIG_SYS_HEADER_REF := nvl(p_header_rec.orig_sys_header_ref(I),p_header_rec.list_header_id(I));
973 l_msg_rec.LIST_HEADER_ID := p_header_rec.list_header_id(I);
974 l_msg_rec.ORIG_SYS_LINE_REF := NULL;
975 l_msg_rec.ORIG_SYS_QUALIFIER_REF := NULL;
976 l_msg_rec.ORIG_SYS_PRICING_ATTR_REF := NULL;
977 
978   -- Populating internal fields --
979 
980   IF p_header_rec.interface_action_code(I) = 'INSERT' THEN
981       Select qp_list_headers_b_s.nextval
982 	into p_header_rec.list_header_id(I)
983 	from dual;
984   END IF;
985 
986   p_header_rec.version_no(I) := '1';
987   p_header_rec.automatic_flag(I) := 'Y';
988   p_header_rec.discount_lines_flag(I) := 'N';
989   if p_header_rec.active_flag(I) is NULL then
990 	p_header_rec.active_flag(I) := 'Y';
991   end if;
992   if p_header_rec.mobile_download(I) is NULL then
993 	p_header_rec.mobile_download(I) := 'N';
994   end if;
995   if p_header_rec.global_flag(I) is NULL then
996 	p_header_rec.global_flag(I) := 'Y';
997   end if;
998 --source_system_code
999     IF p_header_rec.source_system_code(I) IS NULL
1000     THEN
1001        p_header_rec.source_system_code(I) := l_qp_source_system_code;
1002         if p_header_rec.source_system_code(I) is NULL then
1003            p_header_rec.source_system_code(I) := 'QP';
1004         end if;
1005     END IF;
1006 --pte_code
1007     IF p_header_rec.pte_code(I) IS NULL
1008     THEN
1009        p_header_rec.pte_code(I) := l_qp_pte;
1010         if p_header_rec.pte_code(I) is NULL then
1011            p_header_rec.pte_code(I) := 'ORDFUL';
1012         end if;
1013     END IF;
1014 
1015 /*------------ Performing required field validation for ----------------------*/
1016 
1017     --orig_sys_header_ref,
1018   IF p_header_rec.interface_action_code(I) = 'INSERT' THEN
1019     IF p_header_rec.orig_sys_header_ref(I) IS NULL
1020     THEN
1021 
1022        p_header_rec.process_status_flag(I):=NULL; --'E';
1023 
1024        FND_MESSAGE.SET_NAME('QP','QP_ATTRIBUTE_REQUIRED');
1025        FND_MESSAGE.SET_TOKEN('ATTRIBUTE','ORIG_SYS_HEADER_ID');
1026        QP_BULK_MSG.ADD(l_msg_rec);
1027 
1028     END IF;
1029   END IF;
1030 
1031     --List_type_code
1032 
1033     IF p_header_rec.list_type_code(I) IS NULL
1034     THEN
1035        p_header_rec.list_type_code(I):= '1';
1036        P_header_rec.process_status_flag(I):=NULL; --'E';
1037 
1038        FND_MESSAGE.SET_NAME('QP','QP_ATTRIBUTE_REQUIRED');
1039        FND_MESSAGE.SET_TOKEN('ATTRIBUTE','LIST_TYPE_CODE');
1040        QP_BULK_MSG.ADD(l_msg_rec);
1041 
1042     END IF;
1043 
1044     --currency_code
1045     IF p_header_rec.currency_code(I) IS NULL
1046     THEN
1047        p_header_rec.currency_code(I) := '1';
1048        P_header_rec.process_status_flag(I):=NULL; --'E';
1049 
1050        FND_MESSAGE.SET_NAME('QP','QP_ATTRIBUTE_REQUIRED');
1051        FND_MESSAGE.SET_TOKEN('ATTRIBUTE','CURRENCY_CODE');
1052        QP_BULK_MSG.ADD(l_msg_rec);
1053        qp_bulk_loader_pub.write_log('Currency Validation failed');
1054 
1055     END IF;
1056 
1057     --Name
1058     IF p_header_rec.name(I) IS NULL
1059     THEN
1060        p_header_rec.name(I) := '1';
1061        p_header_rec.process_status_flag(I):=NULL; --'E';
1062 
1063        FND_MESSAGE.SET_NAME('QP','QP_ATTRIBUTE_REQUIRED');
1064        FND_MESSAGE.SET_TOKEN('ATTRIBUTE','NAME');
1065        QP_BULK_MSG.ADD(l_msg_rec);
1066 
1067     END IF;
1068 
1069     --Rounding_factor
1070     IF p_header_rec.rounding_factor(I) IS NULL
1071     THEN
1072        p_header_rec.rounding_factor(I):= -1;
1073        P_header_rec.process_status_flag(I):=NULL;
1074 
1075        FND_MESSAGE.SET_NAME('QP','QP_ATTRIBUTE_REQUIRED');
1076        FND_MESSAGE.SET_TOKEN('ATTRIBUTE','ROUNDING_FACTOR');
1077        QP_BULK_MSG.ADD(l_msg_rec);
1078 
1079     END IF;
1080 
1081   IF p_header_rec.interface_action_code(I) = 'INSERT' THEN
1082     -- Language
1083     IF p_header_rec.language(I) IS NULL
1084     THEN
1085        p_header_rec.language(I):= '1';
1086        P_header_rec.process_status_flag(I):=NULL;
1087 
1088        FND_MESSAGE.SET_NAME('QP','QP_ATTRIBUTE_REQUIRED');
1089        FND_MESSAGE.SET_TOKEN('ATTRIBUTE','LANGUAGE');
1090        QP_BULK_MSG.ADD(l_msg_rec);
1091 
1092     END IF;
1093 
1094     -- Source Language
1095     IF p_header_rec.source_lang(I) IS NULL
1096     THEN
1097        p_header_rec.source_lang(I):= '1';
1098        p_header_rec.process_status_flag(I):=NULL;
1099 
1100        FND_MESSAGE.SET_NAME('QP','QP_ATTRIBUTE_REQUIRED');
1101        FND_MESSAGE.SET_TOKEN('ATTRIBUTE','SOURCE_LANG');
1102        QP_BULK_MSG.ADD(l_msg_rec);
1103 
1104     END IF;
1105   END IF;
1106 
1107     --curency_header_id (conditionally required)
1108     If NVL(fnd_profile.value('QP_MULTI_CURRENCY_INSTALLED'), 'N') = 'Y'
1109     AND p_header_rec.currency_header_id(I) IS NULL
1110     THEN
1111 
1112        p_header_rec.process_status_flag(I):=NULL;
1113        FND_MESSAGE.SET_NAME('QP','QP_MUL_CURR_REQD');
1114        QP_BULK_MSG.ADD(l_msg_rec);
1115 
1116     END IF;
1117 
1118 
1119     -- Effective Date Check
1120 
1121     -- Bug 4904393 START RAVI (5138015,5207598,5207612,5414062)
1122     /**
1123     The date entered in the interface headers should be in the canonical format
1124     YYYY/MM/DD format or an error should be thrown
1125     **/
1126     IF p_header_rec.start_date_active(I) is not null THEN
1127 
1128        l_first_date_hash := null;
1129        l_second_date_hash := null;
1130        l_date_length := null;
1131 
1132        begin
1133           select substr(p_header_rec.start_date_active(I),5,1)
1134           into l_first_date_hash from dual;
1135           select substr(p_header_rec.start_date_active(I),8,1)
1136           into l_second_date_hash from dual;
1137           select length(p_header_rec.start_date_active(I))
1138           into l_date_length from dual;
1139 
1140           IF l_date_length<>10 or l_first_date_hash<>'/' or l_second_date_hash<>'/'
1141           THEN
1142              p_header_rec.process_status_flag(I):=NULL;
1143              FND_MESSAGE.SET_NAME('QP', 'QP_INVALID_DATE');
1144              QP_BULK_MSG.Add(l_msg_rec);
1145           END IF;
1146 
1147           l_start_date := to_date(p_header_rec.start_date_active(I),'YYYY/MM/DD');
1148        exception
1149        when others then
1150              p_header_rec.process_status_flag(I):=NULL;
1151              FND_MESSAGE.SET_NAME('QP', 'QP_INVALID_DATE');
1152              QP_BULK_MSG.Add(l_msg_rec);
1153        end;
1154     END IF;
1155 
1156     IF p_header_rec.end_date_active(I) is not null THEN
1157 
1158        l_first_date_hash := null;
1159        l_second_date_hash := null;
1160        l_date_length := null;
1161 
1162        begin
1163           select substr(p_header_rec.end_date_active(I),5,1)
1164           into l_first_date_hash from dual;
1165           select substr(p_header_rec.end_date_active(I),8,1)
1166           into l_second_date_hash from dual;
1167           select length(p_header_rec.end_date_active(I))
1168           into l_date_length from dual;
1169 
1170           IF l_date_length<>10 or l_first_date_hash<>'/' or l_second_date_hash<>'/'
1171           THEN
1172              p_header_rec.process_status_flag(I):=NULL;
1173              FND_MESSAGE.SET_NAME('QP', 'QP_INVALID_DATE');
1174              QP_BULK_MSG.Add(l_msg_rec);
1175           END IF;
1176 
1177           l_end_date := to_date(p_header_rec.end_date_active(I),'YYYY/MM/DD');
1178        exception
1179        when others then
1180              p_header_rec.process_status_flag(I):=NULL;
1181              FND_MESSAGE.SET_NAME('QP', 'QP_INVALID_DATE');
1182              QP_BULK_MSG.Add(l_msg_rec);
1183        end;
1184     END IF;
1185     -- Bug 4904393 END RAVI (5138015,5207598,5207612,5414062)
1186 
1187     -- Bug 4929691 START RAVI (5207598,5207612)
1188     /**
1189     If start date is null set it to sysdate and then check if it's greater
1190     than end date. If it is throw an error and set the process status to null
1191     **/
1192     IF l_end_date IS NOT NULL
1193     AND l_start_date IS NOT NULL
1194     THEN
1195        IF l_start_date > l_end_date THEN
1196           p_header_rec.process_status_flag(I):=NULL;
1197           FND_MESSAGE.SET_NAME('QP', 'QP_STRT_DATE_BFR_END_DATE');
1198 	      QP_BULK_MSG.Add(l_msg_rec);
1199        END IF;
1200     END IF;
1201     -- Bug 4929691 END RAVI (5207598,5207612)
1202 
1203     -- Rounding factor value check
1204       l_unit_precision_type :=  FND_PROFILE.VALUE('QP_UNIT_PRICE_PRECISION_TYPE');
1205       l_price_rounding := fnd_profile.value('QP_PRICE_ROUNDING');
1206 
1207 	IF p_header_rec.currency_code(I) is not null THEN
1208                       BEGIN
1209                       	SELECT -1*PRECISION, -1*EXTENDED_PRECISION
1210              		INTO   l_precision, l_extended_precision
1211 			FROM   FND_CURRENCIES
1212 			WHERE  CURRENCY_CODE = P_header_rec.CURRENCY_CODE(I);
1213                      EXCEPTION
1214                                WHEN NO_DATA_FOUND THEN
1215        				 p_header_rec.process_status_flag(I):=NULL;
1216                                  FND_MESSAGE.SET_NAME('QP','QP_INVALID_ATTRIBUTE');
1217                                  FND_MESSAGE.SET_TOKEN('ATTRIBUTE','rounding_factor');
1218                                  qp_bulk_msg.add(l_msg_rec);
1219                      END;
1220                      END IF;
1221 
1222         IF p_header_rec.rounding_factor(I) IS  NOT NULL
1223         THEN
1224 
1225         IF l_unit_precision_type = 'STANDARD' THEN
1226 
1227 	   IF l_price_rounding = 'PRECISION' THEN
1228 	       IF p_header_rec.rounding_factor(I) <> l_precision THEN
1229        		      p_header_rec.process_status_flag(I):=NULL;
1230                       FND_MESSAGE.SET_NAME('QP', 'QP_ROUNDING_FACTOR_NO_UPDATE');
1231                      qp_bulk_msg.add(l_msg_rec);
1232                END IF;
1233            END IF;
1234 
1235            IF (p_header_rec.rounding_factor(I))
1236 		 < nvl((l_precision), (p_header_rec.rounding_factor(I))) THEN
1237        		          p_header_rec.process_status_flag(I):=NULL;
1238 			  FND_MESSAGE.SET_NAME('QP', 'OE_PRL_INVALID_ROUNDING_FACTOR');
1239                           FND_MESSAGE.SET_TOKEN('PRECISION', l_precision);
1240                           qp_bulk_msg.add(l_msg_rec);
1241            END IF;
1242 
1243        ELSE
1244            IF l_price_rounding = 'PRECISION' THEN
1245                    IF p_header_rec.rounding_factor(I) <> l_extended_precision THEN
1246        		      p_header_rec.process_status_flag(I):=NULL;
1247                       FND_MESSAGE.SET_NAME('QP', 'QP_ROUNDING_FACTOR_NO_UPDATE');
1248  		      qp_bulk_msg.add(l_msg_rec);
1249                    END IF;
1250            END IF;
1251 
1252            IF (p_header_rec.rounding_factor(I))
1253 		      < nvl((l_extended_precision),(p_header_rec.rounding_factor(I))) THEN
1254        		p_header_rec.process_status_flag(I):=NULL;
1255  	        FND_MESSAGE.SET_NAME('QP', 'OE_PRL_INVALID_ROUNDING_FACTOR');
1256                 FND_MESSAGE.SET_TOKEN('PRECISION', l_extended_precision);
1257                 qp_bulk_msg.add(l_msg_rec);
1258             END IF;
1259        END IF;
1260 
1261      END IF;
1262 -- end rounding_factor
1263 
1264 /*-------checking for the value of the flags ----------------------------
1265 --active_flag
1266 --automatic_flag
1267 --mobile_download
1268 --global_flag
1269 -------------------------------------------------------------------------*/
1270 
1271     IF ( p_header_rec.active_flag(I) IS NOT NULL)
1272     THEN
1273 		IF p_header_rec.active_flag(I) NOT IN ('Y', 'N', 'y', 'n')
1274 		THEN
1275                   p_header_rec.process_status_flag(I):=NULL;
1276 		  FND_MESSAGE.SET_NAME('QP','QP_INVALID_ATTRIBUTE');
1277 		  FND_MESSAGE.SET_TOKEN('ATTRIBUTE','active_flag');
1278                   qp_bulk_msg.add(l_msg_rec);
1279         	END IF;
1280     END IF;
1281 
1282     IF ( p_header_rec.automatic_flag(I) IS NOT NULL)
1283     THEN
1284 		IF p_header_rec.automatic_flag(I) NOT IN ('Y', 'N', 'y', 'n')
1285 		THEN
1286                   p_header_rec.process_status_flag(I):=NULL;
1287 		  FND_MESSAGE.SET_NAME('QP','QP_INVALID_ATTRIBUTE');
1288 		  FND_MESSAGE.SET_TOKEN('ATTRIBUTE','automatic_flag');
1289 		  qp_bulk_msg.add(l_msg_rec);
1290         	END IF;
1291     END IF;
1292 
1293 		IF p_header_rec.global_flag(I) NOT IN ('Y', 'N', 'n')
1294 		THEN
1295                   p_header_rec.process_status_flag(I):=NULL;
1296 		  FND_MESSAGE.SET_NAME('QP','QP_INVALID_ATTRIBUTE');
1297 		  FND_MESSAGE.SET_TOKEN('ATTRIBUTE','global_flag');
1298  		  qp_bulk_msg.add(l_msg_rec);
1299         	END IF;
1300 
1301     --added for MOAC
1302     l_security_profile := QP_SECURITY.security_on;
1303 
1304     IF ( p_header_rec.global_flag(I) IS NOT NULL)
1305     THEN
1306 
1307                 --if security is OFF, global_flag cannot be 'N'
1308                 IF (l_security_profile = 'N'
1309                 and p_header_rec.global_flag(I) in ('N', 'n')) THEN
1310                   p_header_rec.process_status_flag(I):=NULL;
1311 		  FND_MESSAGE.SET_NAME('QP','QP_INVALID_ATTRIBUTE');
1312 		  FND_MESSAGE.SET_TOKEN('ATTRIBUTE','global_flag');
1313 		  qp_bulk_msg.add(l_msg_rec);
1314         	END IF;
1315 
1316                 IF l_security_profile = 'Y' THEN
1317                   --if security is ON and global_flag is 'N', orig_org_id cannot be null
1318                   IF (p_header_rec.global_flag(I) in ('N', 'n')
1319                   -- Bug 4947191 RAVI
1320                   /**
1321                   if security is ON and global_flag is 'N', orig_org_id cannot be null
1322                   **/
1323                   and p_header_rec.orig_org_id(I) is null) THEN
1324                     p_header_rec.process_status_flag(I):=NULL;
1325 		    FND_MESSAGE.SET_NAME('QP','QP_ATTRIBUTE_REQUIRED');
1326                     FND_MESSAGE.SET_TOKEN('ATTRIBUTE','ORIG_ORG_ID');
1327 		    qp_bulk_msg.add(l_msg_rec);
1328 
1329                   END IF;
1330 
1331 /* for bug 4731613 moved this validation to attribute_header procedure
1332                   --if orig_org_id is not null and it is not a valid org
1333                   IF (p_header_rec.orig_org_id(I) is not null
1334                   and QP_UTIL.validate_org_id(p_header_rec.orig_org_id(I)) = 'N') THEN
1335                     p_header_rec.process_status_flag(I):=NULL;
1336                     FND_MESSAGE.SET_NAME('FND','FND_MO_ORG_INVALID');
1337 --		    FND_MESSAGE.SET_TOKEN('ATTRIBUTE','orig_org_id');
1338 		    qp_bulk_msg.add(l_msg_rec);
1339                   END IF;
1340 */
1341                 END IF;--IF l_security_profile = 'Y'
1342 
1343                 --global_flag 'Y', org_id not null combination is invalid
1344                 IF ((p_header_rec.global_flag(I) = 'Y'
1345                 and p_header_rec.orig_org_id(I) is not null) OR (p_header_rec.global_flag(I) = 'N' and p_header_rec.orig_org_id(I) is null)) THEN
1346                   p_header_rec.process_status_flag(I):=NULL;
1347                   FND_MESSAGE.SET_NAME('QP', 'QP_GLOBAL_OU_VALIDATION');
1348                   qp_bulk_msg.add(l_msg_rec);
1349                 END IF;--p_header_rec.global_flag
1350     END IF;
1351     --end validations for moac
1352 
1353         IF ( p_header_rec.mobile_download(I) IS NOT NULL)
1354     THEN
1355 		IF p_header_rec.mobile_download(I) NOT IN ('Y', 'N', 'y', 'n')
1356 		THEN
1357                   p_header_rec.process_status_flag(I):=NULL;
1358 		  FND_MESSAGE.SET_NAME('QP','QP_INVALID_ATTRIBUTE');
1359 		  FND_MESSAGE.SET_TOKEN('ATTRIBUTE','mobile_download');
1360 		  qp_bulk_msg.add(l_msg_rec);
1361         	END IF;
1362     END IF;
1363 
1364 --Checking for uniqueness of the Name in qp_list_headers.
1365     l_exist:=null;
1366     Begin
1367       Select 1 into l_exist
1368       from qp_list_headers_tl
1369       where name= p_header_rec.name(I)
1370       and list_header_id <>
1371           (select list_header_id From qp_list_headers_b
1372            -- ENH unod alcoa changes RAVI
1373            /**
1374            The key between interface and qp tables is only orig_sys_hdr_ref
1375            (not list_header_id)
1376            **/
1377            where orig_system_header_ref =p_header_rec.orig_sys_header_ref(I)
1378            and nvl(list_source_code,'*') =nvl(p_header_rec.list_source_code(I),'*')
1379            )
1380        and language = userenv('LANG');
1381 
1382     Exception
1383        When no_data_found then
1384 	  l_exist := 0;
1385     End;
1386 
1387     If l_exist = 1  THEN
1388        p_header_rec.process_status_flag(I):=NULL;
1389        fnd_message.set_name('QP', 'SO_OTHER_NAME_ALREADY_IN_USE');
1390        qp_bulk_msg.add(l_msg_rec);
1391     END IF;
1392 
1393      l_exist := NULL;
1394 
1395    IF p_header_rec.interface_action_code(I) = 'INSERT' THEN
1396      Select count(*) into l_exist
1397        from qp_interface_list_headers
1398       where request_id = p_header_rec.request_id(I)
1399 	and name = p_header_rec.name(I)
1400 	and orig_sys_header_ref <> p_header_rec.orig_sys_header_ref(I)
1401         and process_status_flag = 'P'; --is null;
1402 
1403      IF  l_exist >0 THEN
1404 	 p_header_rec.process_status_flag(I):=NULL;
1405 	 fnd_message.set_name('QP', 'SO_OTHER_NAME_ALREADY_IN_USE');
1406          qp_bulk_msg.add(l_msg_rec);
1407     END IF;
1408   END IF;
1409 
1410 --Checking for uniqueness of orig_sys_header_ref in qp_list_headers
1411 --and qp_interface_list_headers
1412 
1413     l_exist := NULL;
1414 
1415    BEGIN
1416      select 1, list_header_id into l_exist, l_list_header_id
1417      from qp_list_headers_b
1418      -- ENH unod alcoa changes START RAVI
1419      /**
1420      The key between interface and qp tables is only orig_sys_hdr_ref
1421      (not list_header_id)
1422      **/
1423      where orig_system_header_ref = p_header_rec.orig_sys_header_ref(I)
1424     and nvl(list_source_code,'*') =nvl(p_header_rec.list_source_code(I),'*');
1425    EXCEPTION
1426       	When no_data_found then
1427 	   l_exist := 0;
1428      END;
1429 
1430      IF p_header_rec.interface_action_code(I) = 'INSERT' AND l_exist =1 THEN
1431 	p_header_rec.process_status_flag(I):=NULL;
1432 	fnd_message.set_name('QP', 'ORIG_SYS_HEADER_REF_NOT_UNIQUE');
1433         FND_MESSAGE.SET_TOKEN('REF_NO', p_header_rec.orig_sys_header_ref(I));
1434         FND_MESSAGE.SET_TOKEN('LS_CODE', p_header_rec.list_source_code(I));
1435         qp_bulk_msg.add(l_msg_rec);
1436      ELSIF p_header_rec.interface_action_code(I) = 'UPDATE' AND l_exist =0 THEN
1437 	p_header_rec.process_status_flag(I):=NULL;
1438 	fnd_message.set_name('QP', 'HEADER_RECORD_DOES_NOT_EXIST');
1439         FND_MESSAGE.SET_TOKEN('REF_NO', p_header_rec.orig_sys_header_ref(I));
1440         FND_MESSAGE.SET_TOKEN('LS_CODE', p_header_rec.list_source_code(I));
1441         qp_bulk_msg.add(l_msg_rec);
1442     END IF;
1443 
1444     --bug 6961376 start
1445 
1446     IF  p_header_rec.list_header_id(I) IS NULL THEN
1447         l_header_id_null := 'Y';
1448     ELSE
1449         l_header_id_null := 'N';
1450     END IF;
1451     qp_bulk_loader_pub.write_log('Is Header Id null: ' || l_header_id_null);
1452 
1453 
1454     IF p_header_rec.interface_action_code(I) = 'UPDATE'
1455 	AND p_header_rec.list_header_id(I) IS NULL
1456 	AND l_exist =1 THEN
1457 	p_header_rec.list_header_id(I):=l_list_header_id;
1458     END IF;
1459 
1460     l_exist:= NULL;
1461 
1462      IF p_header_rec.interface_action_code(I) = 'INSERT' THEN
1463       select count(*) into l_exist
1464         from qp_interface_list_headers
1465        where request_id =p_header_rec.request_id(I)
1466          and (list_header_id = p_header_rec.list_header_id(I) or
1467               orig_sys_header_ref = p_header_rec.orig_sys_header_ref(I))
1468         and nvl(list_source_code,'*') =nvl(p_header_rec.list_source_code(I),'*');
1469 
1470        IF l_exist >1 THEN
1471           qp_bulk_loader_pub.write_log('Entity Header l_exist of orig is: '||l_exist);
1472 	  p_header_rec.process_status_flag(I):=NULL;
1473 	  fnd_message.set_name('QP','ORIG_SYS_HEADER_REF_NOT_UNIQUE');
1474           FND_MESSAGE.SET_TOKEN('REF_NO', p_header_rec.orig_sys_header_ref(I));
1475           FND_MESSAGE.SET_TOKEN('LS_CODE', p_header_rec.list_source_code(I));
1476           qp_bulk_msg.add(l_msg_rec);
1477        END IF;
1478      ELSIF p_header_rec.interface_action_code(I) = 'UPDATE' AND l_header_id_null = 'N' THEN
1479         qp_bulk_loader_pub.write_log('checking for unique orig_sys_header_ref: ' || p_header_rec.orig_sys_header_ref(I));
1480           select count(distinct list_header_id) into l_exist
1481              from qp_interface_list_headers
1482           where  request_id =p_header_rec.request_id(I)
1483 	      and orig_sys_header_ref = p_header_rec.orig_sys_header_ref(I)
1484               and nvl(list_source_code,'*') =nvl(p_header_rec.list_source_code(I),'*');
1485 /* 1749 to 1764 commented to for the bug number 6961376 as the bug 3604226 and bug 6961376  are raised for the same problem and the fix for the
1486 bug 6961376 is giving better result than the bug 3604226 we commented these lines and incorporated the new code */
1487 
1488    /*   select count(*) into l_exist
1489         from qp_interface_list_headers
1490        where request_id =p_header_rec.request_id(I)
1491          -- Bug 3604226 RAVI
1492          /**
1493          Multiple headers for insert or delete action with same orig_sys_hdr_ref
1494          are not allowed
1495          **/
1496      --    and p_header_rec.interface_action_code(I) <> 'UPDATE'
1497          -- ENH undo alcoa changes RAVI
1498          /**
1499          The key between interface and qp tables is only orig_sys_hdr_ref
1500          (not list_header_id)
1501          **/
1502       --   and orig_sys_header_ref = p_header_rec.orig_sys_header_ref(I)
1503       --  and nvl(list_source_code,'*') =nvl(p_header_rec.list_source_code(I),'*'); */
1504 
1505 
1506     IF l_exist >1 THEN
1507        qp_bulk_loader_pub.write_log('Entity Header l_exist of orig is: '||l_exist);
1508 	p_header_rec.process_status_flag(I):=NULL;
1509 	fnd_message.set_name('QP','ORIG_SYS_HEADER_REF_NOT_UNIQUE');
1510         FND_MESSAGE.SET_TOKEN('REF_NO', p_header_rec.orig_sys_header_ref(I));
1511         FND_MESSAGE.SET_TOKEN('LS_CODE', p_header_rec.list_source_code(I));
1512         qp_bulk_msg.add(l_msg_rec);
1513     END IF;
1514    END IF;
1515    --bug 6961376 end
1516 
1517 --QP_Security_check
1518   IF p_header_rec.interface_action_code(I) = 'UPDATE' THEN
1519  qp_bulk_loader_pub.write_log('Secu. Check list_header_id: '||to_char(p_header_rec.list_header_id(I)));
1520      IF QP_security.check_function( p_function_name => QP_Security.G_FUNCTION_UPDATE,
1521                                  p_instance_type => QP_Security.G_PRICELIST_OBJECT,
1522                                  p_instance_pk1  => p_header_rec.list_header_id(I)) <> 'T' THEN
1523 	p_header_rec.process_status_flag(I):=NULL;
1524         fnd_message.set_name('QP', 'QP_NO_PRIVILEGE');
1525         fnd_message.set_token('PRICING_OBJECT', 'Price List');
1526         qp_bulk_msg.add(l_msg_rec);
1527      END IF;
1528   END IF;
1529 
1530 --Defaulting
1531 -- Basic_Pricing_Condition
1532     IF (QP_BULK_LOADER_PUB.GET_QP_STATUS <> 'I' OR
1533 	   FND_PROFILE.VALUE('QP_MULTI_CURRENCY_INSTALLED') = 'N')
1534 	AND p_header_rec.currency_header_id(I) IS NOT NULL THEN
1535     -- No multi currency in Basic Pricing
1536        p_header_rec.currency_header_id(I) := NULL;
1537     END IF;
1538 
1539 --Flex field check
1540 
1541     IF l_header_flex_enabled = 'Y' THEN
1542       qp_bulk_loader_pub.write_log( 'Header Flex enabled ');
1543 
1544          IF NOT Init_Desc_Flex
1545                (p_flex_name	     =>'QP_LIST_HEADERS'
1546 	       ,p_context            => p_header_rec.context(i)
1547                ,p_attribute1         => p_header_rec.attribute1(i)
1548                ,p_attribute2         => p_header_rec.attribute2(i)
1549                ,p_attribute3         => p_header_rec.attribute3(i)
1550                ,p_attribute4         => p_header_rec.attribute4(i)
1551                ,p_attribute5         => p_header_rec.attribute5(i)
1552                ,p_attribute6         => p_header_rec.attribute6(i)
1553                ,p_attribute7         => p_header_rec.attribute7(i)
1554                ,p_attribute8         => p_header_rec.attribute8(i)
1555                ,p_attribute9         => p_header_rec.attribute9(i)
1556                ,p_attribute10        => p_header_rec.attribute10(i)
1557                ,p_attribute11        => p_header_rec.attribute11(i)
1558                ,p_attribute12        => p_header_rec.attribute12(i)
1559                ,p_attribute13        => p_header_rec.attribute13(i)
1560                ,p_attribute14        => p_header_rec.attribute14(i)
1561                ,p_attribute15        => p_header_rec.attribute15(i)) THEN
1562 
1563 	         QP_BULK_MSG.ADD(l_msg_rec);
1564 
1565                  -- Log Error Message
1566                  FND_MESSAGE.SET_NAME('QP','QP_INVALID_ATTRIBUTE');
1567                  FND_MESSAGE.SET_TOKEN('ATTRIBUTE',
1568                                        'Entity:Flexfield:Header_Desc_Flex');
1569 	         P_header_rec.process_status_flag(I):=NULL;
1570 
1571 	         QP_BULK_MSG.ADD(l_msg_rec);
1572 
1573           ELSE -- if the flex validation is successfull
1574 
1575             IF p_header_rec.context(i) IS NULL
1576               OR p_header_rec.context(i) = FND_API.G_MISS_CHAR THEN
1577                p_header_rec.context(i)    := g_context;
1578             END IF;
1579 
1580             IF p_header_rec.attribute1(i) IS NULL
1581               OR p_header_rec.attribute1(i) = FND_API.G_MISS_CHAR THEN
1582                p_header_rec.attribute1(i) := g_attribute1;
1583             END IF;
1584 
1585             IF p_header_rec.attribute2(i) IS NULL
1586               OR p_header_rec.attribute2(i) = FND_API.G_MISS_CHAR THEN
1587                p_header_rec.attribute2(i) := g_attribute2;
1588             END IF;
1589 
1590             IF p_header_rec.attribute3(i) IS NULL
1591               OR p_header_rec.attribute3(i) = FND_API.G_MISS_CHAR THEN
1592                p_header_rec.attribute3(i) := g_attribute3;
1593             END IF;
1594 
1595             IF p_header_rec.attribute4(i) IS NULL
1596               OR p_header_rec.attribute4(i) = FND_API.G_MISS_CHAR THEN
1597                p_header_rec.attribute4(i) := g_attribute4;
1598             END IF;
1599 
1600             IF p_header_rec.attribute5(i) IS NULL
1601               OR p_header_rec.attribute5(i) = FND_API.G_MISS_CHAR THEN
1602                p_header_rec.attribute5(i) := g_attribute5;
1603             END IF;
1604 
1605             IF p_header_rec.attribute6(i) IS NULL
1606               OR p_header_rec.attribute6(i) = FND_API.G_MISS_CHAR THEN
1607                p_header_rec.attribute6(i) := g_attribute6;
1608             END IF;
1609             IF p_header_rec.attribute7(i) IS NULL
1610               OR p_header_rec.attribute7(i) = FND_API.G_MISS_CHAR THEN
1611                p_header_rec.attribute7(i) := g_attribute7;
1612             END IF;
1613 
1614             IF p_header_rec.attribute8(i) IS NULL
1615               OR p_header_rec.attribute8(i) = FND_API.G_MISS_CHAR THEN
1616                p_header_rec.attribute8(i) := g_attribute8;
1617             END IF;
1618 
1619             IF p_header_rec.attribute9(i) IS NULL
1620               OR p_header_rec.attribute9(i) = FND_API.G_MISS_CHAR THEN
1621                p_header_rec.attribute9(i) := g_attribute9;
1622             END IF;
1623 
1624             IF p_header_rec.attribute10(i) IS NULL
1625               OR p_header_rec.attribute10(i) = FND_API.G_MISS_CHAR THEN
1626                p_header_rec.attribute10(i) := G_attribute10;
1627             End IF;
1628 
1629             IF p_header_rec.attribute11(i) IS NULL
1630               OR p_header_rec.attribute11(i) = FND_API.G_MISS_CHAR THEN
1631                p_header_rec.attribute11(i) := g_attribute11;
1632             END IF;
1633 
1634             IF p_header_rec.attribute12(i) IS NULL
1635               OR p_header_rec.attribute12(i) = FND_API.G_MISS_CHAR THEN
1636                p_header_rec.attribute12(i) := g_attribute12;
1637             END IF;
1638 
1639             IF p_header_rec.attribute13(i) IS NULL
1640               OR p_header_rec.attribute13(i) = FND_API.G_MISS_CHAR THEN
1641                p_header_rec.attribute13(i) := g_attribute13;
1642             END IF;
1643 
1644             IF p_header_rec.attribute14(i) IS NULL
1645               OR p_header_rec.attribute14(i) = FND_API.G_MISS_CHAR THEN
1646                p_header_rec.attribute14(i) := g_attribute14;
1647             END IF;
1648 
1649             IF p_header_rec.attribute15(i) IS NULL
1650               OR p_header_rec.attribute15(i) = FND_API.G_MISS_CHAR THEN
1651                p_header_rec.attribute15(i) := g_attribute15;
1652             END IF;
1653 	END IF;
1654     END IF; 	--l_header_flex_enabled = 'Y'
1655 
1656 --start_date_active
1657 -- bug 4510489
1658 /*
1659     IF p_header_rec.start_date_active(I) IS NULL
1660        AND (p_header_rec.end_date_active(I) IS NULL or
1661 	to_date(p_header_rec.end_date_active(I), 'MM/DD/YYYY') <= to_date(l_start_date_active, 'MM/DD/YYYY'))
1662     THEN
1663 	p_header_rec.start_date_active(I) := l_start_date_active;
1664     END IF;
1665 */
1666 
1667 
1668   -- Updation check
1669   --cannot update Source system code, pte code
1670   IF p_header_rec.interface_action_code(I) = 'UPDATE'
1671      AND p_header_rec.process_status_flag(I) = 'P'  THEN
1672 
1673       qp_bulk_loader_pub.write_log( 'Update header no: '||to_char(l_list_header_id));
1674       l_old_PRICE_LIST_rec := QP_Price_List_Util.Query_Row
1675 	(   p_list_header_id        => l_list_header_id
1676 	);
1677 
1678       qp_bulk_loader_pub.write_log( 'Update source_system_code : '||l_old_price_list_rec.source_system_code);
1679       qp_bulk_loader_pub.write_log( 'Update pte_code : '||l_old_price_list_rec.pte_code);
1680       IF l_old_price_list_rec.source_system_code <> p_header_rec.source_system_code(I) or
1681          l_old_price_list_rec.pte_code <> p_header_rec.pte_code(I) THEN
1682 	    p_header_rec.process_status_flag(I):=NULL;
1683 	    fnd_message.set_name('QP', 'QP_NO_UPDATE_ATTRIBUTE');
1684             fnd_message.set_token('ATTRIBUTE', 'Source System Code / PTE Code');
1685 	    qp_bulk_msg.add(l_msg_rec);
1686       END IF;
1687   END IF;
1688 
1689 END LOOP;
1690 
1691   qp_bulk_loader_pub.write_log('Leaving Entity_header validation');
1692 
1693 EXCEPTION
1694     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1695        qp_bulk_loader_pub.write_log( 'UNEXCPECTED ERROR IN PROCEDURE ENTITY_HEADER:'||sqlerrm);
1696        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1697     WHEN OTHERS THEN
1698        qp_bulk_loader_pub.write_log( 'UNEXCPECTED ERROR IN PROCEDURE ENTITY_HEADER:'||sqlerrm);
1699        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1700 END ENTITY_HEADER;
1701 
1702 
1703 PROCEDURE ENTITY_LINE
1704           (P_LINE_REC IN OUT NOCOPY QP_BULK_LOADER_PUB.LINE_REC_TYPE)
1705 
1706 IS
1707    l_msg_rec QP_BULK_MSG.Msg_Rec_Type;
1708    l_dummy NUMBER;
1709    l_dummy_1 NUMBER;
1710    l_exist  NUMBER;
1711    l_pb_type_code  QP_LIST_LINES.price_break_type_code%type;
1712    l_art_opr  QP_LIST_LINES.arithmetic_operator%type;
1713    l_list_header_id	NUMBER:=null;
1714    l_orig_sys_header_ref VARCHAR2(50) := NULL;
1715    l_start_date date;
1716    l_line_flex_enabled VARCHAR2(1);
1717 
1718    --Bug 5246745 RAVI
1719    l_header_start_date DATE;
1720    l_header_end_date DATE;
1721 
1722    --Bug 5246745 RAVI
1723    l_servicable_item Varchar2(1) := 'N';
1724 
1725    --Bug 5246745 RAVI
1726    l_PBH_start_date DATE;
1727    l_PBH_end_date DATE;
1728 
1729 BEGIN
1730 
1731    qp_bulk_loader_pub.write_log('Entering Entity Line');
1732 
1733     l_line_flex_enabled := get_flex_enabled_flag('QP_LIST_LINES');
1734     qp_bulk_loader_pub.write_log('Flex enabled '||l_line_flex_enabled);
1735 
1736    FOR I IN 1..p_line_rec.orig_sys_line_ref.count
1737    LOOP
1738 
1739       --Initially setting the message context.
1740       --qp_bulk_loader_pub.write_log(' In the loop');
1741       l_msg_rec.REQUEST_ID := P_LINE_REC.REQUEST_ID(i);
1742       l_msg_rec.ENTITY_TYPE :='PRL';
1743       l_msg_rec.TABLE_NAME :='QP_INTERFACE_LIST_LINES';
1744       l_msg_rec.ORIG_SYS_HEADER_REF := p_line_rec.orig_sys_header_ref(I);
1745       l_msg_rec.ORIG_SYS_LINE_REF := p_line_rec.orig_sys_line_ref(I);
1746       l_msg_rec.ORIG_SYS_QUALIFIER_REF := NULL;
1747       l_msg_rec.ORIG_SYS_PRICING_ATTR_REF := NULL;
1748 
1749    /*-- populating some internal fields --*/
1750       If p_line_rec.interface_action_code(I)='INSERT' THEN
1751 	  select  qp_list_lines_s.nextval
1752 	    into  p_line_rec.list_line_id(I)
1753 	    from dual;
1754       end if;
1755       p_line_rec.list_line_no(I):= p_line_rec.list_line_id(I);
1756       p_line_rec.pricing_phase_id(I) := 1;
1757       p_line_rec.automatic_flag(I) := 'Y';
1758       p_line_rec.modifier_level_code(I) := 'LINE';
1759       p_line_rec.incompatibility_grp_code(I) := 'EXCL';
1760 
1761       IF l_orig_sys_header_ref IS NULL or
1762 	 l_orig_sys_header_ref <> p_line_rec.orig_sys_header_ref(I) THEN
1763 	  Begin
1764 	  select list_header_id, start_date_active
1765 	    into p_line_rec.list_header_id(I), l_start_date
1766 	    from qp_list_headers_b
1767 	   where orig_system_header_ref = p_line_rec.orig_sys_header_ref(I);
1768 	 Exception
1769 	    When no_data_found then
1770 	    p_line_rec.list_header_id(I) := -1;
1771 	    p_line_rec.process_status_flag(I):=NULL;
1772 	    fnd_message.set_name('QP', 'QP_INVALID_HEADER_REF');
1773 	    FND_MESSAGE.SET_TOKEN('REF_NO', p_line_rec.orig_sys_header_ref(I));
1774 	    FND_MESSAGE.SET_TOKEN('LS_CODE', NULL);
1775 	    qp_bulk_msg.add(l_msg_rec);
1776 	 End;
1777 	 IF p_line_rec.list_header_id(I) IS NOT NULL or
1778 	    p_line_rec.list_header_id(I) <> 0 THEN
1779 		l_list_header_id := p_line_rec.list_header_id(I);
1780 		l_orig_sys_header_ref := p_line_rec.orig_sys_header_ref(I);
1781 	 ELSE
1782 		l_list_header_id := NULL;
1783 		l_orig_sys_header_ref := NULL;
1784 	 END IF;
1785       ELSE
1786 	 p_line_rec.list_header_id(I) := l_list_header_id;
1787       END IF;
1788       qp_bulk_loader_pub.write_log('Line Start date active'||to_char(l_start_date));
1789 
1790    /*------- Performing required field validation for ---------*/
1791 
1792    --1.orig_sys_line_ref,
1793    IF p_line_rec.orig_sys_line_ref(I) IS NULL
1794    THEN
1795         p_line_rec.process_status_flag(I):=NULL;
1796 	fnd_message.set_name('QP', 'QP_ATTRIBUTE_REQUIRED');
1797 	fnd_message.set_token('ATTRIBUTE', 'ORIG_SYS_LINE_REF');
1798         qp_bulk_msg.add(l_msg_rec);
1799    END IF;
1800 
1801    --Bug#5359974 RAVI START
1802    --The continuous PB flag set to 'Y' if the line is PBH
1803    --1.1 continuous_price_break_flag
1804    IF p_line_rec.list_line_type_code(I)='PBH'
1805    THEN
1806       p_line_rec.continuous_price_break_flag(I):= 'Y';
1807    END IF;
1808    --Bug#5359974 RAVI END
1809 
1810    --2.List Line Type Code
1811     IF p_line_rec.list_line_type_code(I) IS NULL
1812    THEN
1813         p_line_rec.list_line_type_code(I):= '1';
1814         p_line_rec.process_status_flag(I):=NULL;
1815 	fnd_message.set_name('QP', 'QP_ATTRIBUTE_REQUIRED');
1816 	fnd_message.set_token('ATTRIBUTE', 'LIST_LINE_TYPE_CODE');
1817         qp_bulk_msg.add(l_msg_rec);
1818    END IF;
1819 
1820    IF p_line_rec.list_line_type_code(I) <>'PLL' AND p_line_rec.list_line_type_code(I)<>'PBH' THEN
1821        p_line_rec.process_status_flag(I):=NULL;
1822 	fnd_message.set_name('QP', 'QP_INVALID_ATTRIBUTE');
1823 	fnd_message.set_token('ATTRIBUTE', 'LIST_LINE_TYPE_CODE');
1824         qp_bulk_msg.add(l_msg_rec);
1825    END IF;
1826 
1827    --3. Arithmetic Operator
1828    IF p_line_rec.arithmetic_operator(I) IS NULL
1829    THEN
1830         p_line_rec.arithmetic_operator(I):= '1';
1831         p_line_rec.process_status_flag(I):=NULL;
1832 	fnd_message.set_name('QP', 'QP_ATTRIBUTE_REQUIRED');
1833 	fnd_message.set_token('ATTRIBUTE', 'ARITHMETIC_OPERATOR1');
1834         qp_bulk_msg.add(l_msg_rec);
1835    ELSE
1836 	IF p_line_rec.arithmetic_operator(I) = 'BLOCK_PRICE' AND
1837            p_line_rec.list_line_type_code(I) <> 'PBH' AND
1838 	   p_line_rec.price_break_header_ref(I) IS NULL THEN
1839 	    p_line_rec.arithmetic_operator(I):= '1';
1840 	    p_line_rec.process_status_flag(I):=NULL;
1841 	    FND_MESSAGE.SET_NAME('QP', 'QP_INVALID_ATTRIBUTE');
1842 	    fnd_message.set_token('ATTRIBUTE', 'ARITHMETIC_OPERATOR 2');
1843 	    qp_bulk_msg.add(l_msg_rec);
1844 	END IF;
1845 	IF  p_line_rec.arithmetic_operator(I) = 'BREAKUNIT_PRICE' THEN
1846 		IF p_line_rec.list_line_type_code(I) = 'PLL' AND
1847        		   p_line_rec.price_break_header_ref(I) IS NOT NULL THEN
1848 		    NULL;
1849 		ELSE
1850 		    p_line_rec.arithmetic_operator(I):= '1';
1851 		    p_line_rec.process_status_flag(I):=NULL;
1852 		    FND_MESSAGE.SET_NAME('QP', 'QP_INVALID_ATTRIBUTE');
1853 		    fnd_message.set_token('ATTRIBUTE', 'ARITHMETIC_OPERATOR 3');
1854 		    qp_bulk_msg.add(l_msg_rec);
1855 		END IF;
1856 	 END IF;
1857     --End arithemetic operator check
1858 
1859     -- Bug# 5246745 RAVI START
1860     --Check if item is servicable
1861 	IF p_line_rec.arithmetic_operator(I) = 'PERCENT_PRICE' THEN
1862    		qp_bulk_loader_pub.write_log('Percent Price - arithmetic operator check');
1863 		l_exist :=0;
1864 
1865 		begin
1866 		   select count(*) into l_exist
1867     	   from qp_interface_pricing_attribs qipa, mtl_system_items_vl msiv
1868 		   where qipa.orig_sys_line_ref = p_line_rec.orig_sys_line_ref(I)
1869 		   and qipa.request_id = p_line_rec.request_id(I)
1870 		   and qipa.product_attribute_context = 'ITEM'
1871 		   and qipa.product_attribute = 'PRICING_ATTRIBUTE1'
1872 		   and msiv.inventory_item_id = to_number(qipa.PRODUCT_ATTR_VALUE)
1873 		   and msiv.organization_id = fnd_profile.value('QP_ORGANIZATION_ID')
1874 		   and msiv.service_item_flag = 'Y'
1875            and qipa.interface_action_code in ('INSERT','UPDATE');
1876 		exception
1877            when NO_DATA_FOUND then
1878 		   l_exist := 0;
1879 		end;
1880 
1881 		if l_exist=0 then
1882            begin
1883 	      select count(*) into l_exist
1884     	      from qp_pricing_attributes qpa, mtl_system_items_vl msiv
1885 	      where qpa.orig_sys_line_ref = p_line_rec.orig_sys_line_ref(I)
1886               -- Bug 5246745 Use Composite Index for Ref columns
1887               and qpa.orig_sys_header_ref = p_line_rec.orig_sys_header_ref(I)
1888               and qpa.product_attribute_context = 'ITEM'
1889 	      and qpa.product_attribute = 'PRICING_ATTRIBUTE1'
1890 	      and msiv.inventory_item_id = to_number(qpa.PRODUCT_ATTR_VALUE)
1891 	      and msiv.organization_id = fnd_profile.value('QP_ORGANIZATION_ID')
1892 	      and msiv.service_item_flag = 'Y'
1893               and qpa.orig_sys_pricing_attr_ref not in (
1894                        select qpa.orig_sys_pricing_attr_ref
1895                        from   qp_interface_pricing_attribs qipa
1896                        where  qipa.orig_sys_pricing_attr_ref = qpa.orig_sys_pricing_attr_ref
1897                        and    qipa.interface_action_code = 'DELETE'
1898                        and    qipa.request_id = p_line_rec.request_id(I));
1899 		   exception
1900               when NO_DATA_FOUND then
1901 		      l_exist := 0;
1902 		   end;
1903         end if;
1904 
1905 		if l_exist = 0 then
1906 		    p_line_rec.arithmetic_operator(I):= '1';
1907 		    p_line_rec.process_status_flag(I):=NULL;
1908 		    FND_MESSAGE.SET_NAME('QP', 'QP_INVALID_ATTRIBUTE');
1909 		    fnd_message.set_token('ATTRIBUTE', 'ARITHMETIC_OPERATOR 4');
1910 		    qp_bulk_msg.add(l_msg_rec);
1911         else
1912            l_servicable_item := 'Y';
1913 		end if;
1914 	END IF;
1915    END IF; --End arithemetic operator check
1916 
1917    qp_bulk_loader_pub.write_log('After required field check');
1918 
1919     -- Uniqueness of orig_sys_line_ref
1920     l_exist := 0;
1921 
1922    qp_bulk_loader_pub.write_log('Header ref'|| p_line_rec.orig_sys_header_ref(I));
1923    qp_bulk_loader_pub.write_log('Line ref'|| p_line_rec.orig_sys_line_ref(I));
1924 
1925    BEGIN
1926      select count(*) into l_exist
1927      from   qp_list_lines
1928      where  orig_sys_line_ref = p_line_rec.orig_sys_line_ref(I)
1929      and    orig_sys_header_ref = p_line_rec.orig_sys_header_ref(I) ;
1930 
1931    EXCEPTION
1932       	When no_data_found then
1933 	   l_exist := 0;
1934    END;
1935 
1936      If p_line_rec.interface_action_code(I)='INSERT' AND l_exist >= 1 THEN
1937 	p_line_rec.process_status_flag(I):=NULL;
1938 	fnd_message.set_name('QP', 'ORIG_SYS_LINE_REF_NOT_UNIQUE');
1939         FND_MESSAGE.SET_TOKEN('REF_NO', p_line_rec.orig_sys_line_ref(I));
1940         qp_bulk_msg.add(l_msg_rec);
1941      ELSIF p_line_rec.interface_action_code(I)='UPDATE' AND l_exist = 0 THEN
1942 	p_line_rec.process_status_flag(I):=NULL;
1943 	fnd_message.set_name('QP', 'LINE_RECORD_DOES_NOT_EXIST');
1944         FND_MESSAGE.SET_TOKEN('REF_NO', p_line_rec.orig_sys_line_ref(I));
1945         qp_bulk_msg.add(l_msg_rec);
1946      END IF;
1947 
1948    If p_line_rec.interface_action_code(I)='INSERT' THEN
1949       l_exist:= NULL;
1950       select count(*) into l_exist
1951       from   qp_interface_list_lines
1952       where  request_id = p_line_rec.request_id(I)
1953       and    orig_sys_line_ref = p_line_rec.orig_sys_line_ref(I)
1954       and    orig_sys_header_ref = p_line_rec.orig_sys_header_ref(I);
1955 
1956     IF l_exist >1 THEN
1957 	p_line_rec.process_status_flag(I):=NULL;
1958 	fnd_message.set_name('QP', 'ORIG_SYS_LINE_REF_NOT_UNIQUE');
1959         FND_MESSAGE.SET_TOKEN('REF_NO', p_line_rec.orig_sys_line_ref(I));
1960         qp_bulk_msg.add(l_msg_rec);
1961     END IF;
1962    end if;
1963 
1964    /*
1965        Commenting code for bug 9350532.
1966        Duplicate validation is not required for orig_sys_line_ref in case of UPDATE.
1967        Since orig_sys_line_ref is considered as a primary key in bulk loader
1968        the line to be updated will be identified by orig_sys_line_ref instead
1969        of list_line_id (if the user has provided both). Also list line id is not
1970        updated for the line identified with orig_sys_line_ref.
1971    */
1972 
1973    --bug 9247305 start
1974    /*If p_line_rec.interface_action_code(I)='UPDATE' THEN
1975       l_exist:= NULL;
1976 
1977       select 1 INTO l_exist
1978       from qp_list_lines qpll
1979       WHERE qpll.orig_sys_line_ref = p_line_rec.orig_sys_line_ref(I)
1980         and qpll.list_line_id is not null
1981         and qpll.list_line_id <> p_line_rec.list_line_id(I);
1982 
1983      IF l_exist = 1 THEN
1984 	p_line_rec.process_status_flag(I):=NULL;
1985 	fnd_message.set_name('QP', 'ORIG_SYS_LINE_REF_NOT_UNIQUE');
1986         FND_MESSAGE.SET_TOKEN('REF_NO', p_line_rec.orig_sys_line_ref(I));
1987         qp_bulk_msg.add(l_msg_rec);
1988      END IF;
1989     end if;*/
1990     --bug 9247305 end
1991 
1992        --- check for conditionally required fields --------
1993      IF p_line_rec.list_line_type_code(I) = 'PBH' then
1994        IF p_line_rec.price_break_type_code(I) IS NULL then
1995 	p_line_rec.process_status_flag(I):=NULL;
1996 	fnd_message.set_name('QP', 'QP_ATTRIBUTE_REQUIRED');
1997 	fnd_message.set_token('ATTRIBUTE', 'PRICE_BREAK_TYPE_CODE');
1998         qp_bulk_msg.add(l_msg_rec);
1999        END IF;
2000     ELSE
2001        IF p_line_rec.price_break_header_ref(I) IS NULL and
2002 	  p_line_rec.price_break_type_code(I) IS NOT NULL then
2003 	    p_line_rec.process_status_flag(I):=NULL;
2004 	    FND_MESSAGE.SET_NAME('QP', 'QP_INVALID_ATTRIBUTE');
2005 	    fnd_message.set_token('ATTRIBUTE', 'PRICE_BREAK_TYPE_CODE');
2006 	    qp_bulk_msg.add(l_msg_rec);
2007        END IF;
2008     END IF;
2009 
2010      IF p_line_rec.price_break_header_ref(I) IS NOT NULL then
2011        IF p_line_rec.rltd_modifier_grp_type(I) IS NULL then
2012 	p_line_rec.process_status_flag(I):=NULL;
2013 	fnd_message.set_name('QP', 'QP_ATTRIBUTE_REQUIRED');
2014 	fnd_message.set_token('ATTRIBUTE', 'RLTD_MODIFIER_GRP_TYPE');
2015         qp_bulk_msg.add(l_msg_rec);
2016        END IF;
2017     END IF;
2018 
2019        qp_bulk_loader_pub.write_log('check price break ARITHMETIC OPERATOR');
2020        -- check UNIT price break has no BLOCK price break child lines
2021 
2022        l_dummy:= null;
2023      IF p_line_rec.list_line_type_code(I) = 'PBH' then
2024 	 IF (p_LINE_rec.arithmetic_operator(I) = 'UNIT_PRICE')
2025          THEN
2026 	  SELECT count(*)
2027 	      INTO l_dummy
2028 	      FROM qp_interface_list_lines
2029 	     WHERE price_break_header_ref = p_LINE_rec.orig_sys_line_ref(I)
2030 	       AND arithmetic_operator = 'BLOCK_PRICE';
2031 
2032           -- if any price breaks are BLOCK
2033 	  IF (l_dummy > 0) THEN
2034 	     p_line_rec.process_status_flag(I):=NULL;
2035 	     FND_MESSAGE.SET_NAME('QP','QP_INVALID_CHILD_APPL_METHOD');
2036 	     qp_bulk_msg.add(l_msg_rec);
2037 	  END IF;
2038 
2039          -- Bug# 5228560 RAVI START
2040          l_dummy:= null;
2041 
2042          select count(*) into l_dummy
2043          from qp_list_lines l1, qp_list_lines l2, qp_rltd_modifiers l3
2044          where l1.orig_sys_line_ref=p_LINE_rec.orig_sys_line_ref(I)
2045          -- Bug 5246745 Use Composite Index for Ref columns
2046          and l1.orig_sys_header_ref=p_LINE_rec.orig_sys_header_ref(I)
2047          and l1.list_line_id=l3.FROM_RLTD_MODIFIER_ID
2048          and l3.TO_RLTD_MODIFIER_ID=l2.list_line_id
2049          and l3.RLTD_MODIFIER_GRP_TYPE='PRICE BREAK'
2050 	 AND l2.arithmetic_operator <> 'UNIT_PRICE';
2051 
2052          -- if any price breaks are BLOCK in old lines
2053          IF (l_dummy > 0) THEN
2054 	    p_line_rec.process_status_flag(I):=NULL;
2055 	    FND_MESSAGE.SET_NAME('QP','QP_INVALID_CHILD_APPL_METHOD');
2056 	    qp_bulk_msg.add(l_msg_rec);
2057 	 END IF;
2058          -- Bug# 5228560 RAVI END
2059       END IF;
2060 
2061        -- block pricing
2062        l_dummy := null;
2063        l_dummy_1 := null;
2064        IF (p_LINE_rec.arithmetic_operator(I) = 'BLOCK_PRICE' AND
2065 	   p_LINE_rec.price_break_type_code(I) = 'POINT')
2066        THEN
2067 --	  SELECT count(*)
2068 --	      INTO l_dummy
2069 --	      FROM qp_list_lines pl, qp_list_lines cl,qp_rltd_modifiers rtd
2070 --	     WHERE pl.orig_sys_line_ref = p_line_rec.orig_sys_line_ref(I)
2071 --	       AND rtd.from_rltd_modifier_id = pl.list_line_id
2072 --	       AND cl.list_line_id = rtd.to_rltd_modifier_id
2073 --	       AND (cl.arithmetic_operator = 'UNIT_PRICE' OR cl.recurring_value IS NOT NULL);
2074 --
2075 	  SELECT count(*)
2076 	      INTO l_dummy
2077 	      FROM qp_interface_list_lines
2078 	     WHERE price_break_header_ref = p_LINE_rec.orig_sys_line_ref(I)
2079 	       AND (arithmetic_operator = 'UNIT_PRICE' OR recurring_value IS NOT NULL);
2080 
2081 	IF (l_dummy > 0) THEN
2082 	    p_line_rec.process_status_flag(I):=NULL;
2083 	     FND_MESSAGE.SET_NAME('QP','QP_INVALID_PRICE_BREAK');
2084 	     qp_bulk_msg.add(l_msg_rec);
2085 	END IF;
2086 
2087       END IF;
2088 
2089       -- Bug# 5228560 RAVI START
2090       IF p_LINE_rec.arithmetic_operator(I) = 'BLOCK_PRICE' THEN
2091          l_dummy := null;
2092          IF p_LINE_rec.price_break_type_code(I) = 'RANGE' THEN
2093             select count(*) into l_dummy
2094             from qp_list_lines l1, qp_list_lines l2, qp_rltd_modifiers l3
2095             where l1.orig_sys_line_ref=p_LINE_rec.orig_sys_line_ref(I)
2096             -- Bug 5246745 Use Composite Index for Ref columns
2097             and l1.orig_sys_header_ref=p_LINE_rec.orig_sys_header_ref(I)
2098             and l1.list_line_id=l3.FROM_RLTD_MODIFIER_ID
2099             and l3.TO_RLTD_MODIFIER_ID=l2.list_line_id
2100             and l3.RLTD_MODIFIER_GRP_TYPE='PRICE BREAK'
2101             AND l2.arithmetic_operator = 'UNIT_PRICE';
2102          END IF;
2103 
2104          IF (l_dummy > 0) THEN
2105 	        p_line_rec.process_status_flag(I):=NULL;
2106             FND_MESSAGE.SET_NAME('QP','QP_INVALID_PRICE_BREAK');
2107             qp_bulk_msg.add(l_msg_rec);
2108          END IF;
2109 
2110          l_dummy := null;
2111          IF p_LINE_rec.price_break_type_code(I) = 'POINT' THEN
2112             select count(*) into l_dummy
2113             from qp_list_lines l1, qp_list_lines l2, qp_rltd_modifiers l3
2114             where l1.orig_sys_line_ref=p_LINE_rec.orig_sys_line_ref(I)
2115             -- Bug 5246745 Use Composite Index for Ref columns
2116             and l1.orig_sys_header_ref=p_LINE_rec.orig_sys_header_ref(I)
2117             and l1.list_line_id=l3.FROM_RLTD_MODIFIER_ID
2118             and l3.TO_RLTD_MODIFIER_ID=l2.list_line_id
2119             and l3.RLTD_MODIFIER_GRP_TYPE='PRICE BREAK'
2120             AND l2.arithmetic_operator <> 'UNIT_PRICE';
2121          END IF;
2122 
2123          IF (l_dummy > 0) THEN
2124             p_line_rec.process_status_flag(I):=NULL;
2125             FND_MESSAGE.SET_NAME('QP','QP_INVALID_PRICE_BREAK');
2126             qp_bulk_msg.add(l_msg_rec);
2127          END IF;
2128       END IF;
2129       -- Bug# 5228560 RAVI END
2130 
2131    END IF;
2132 
2133       -- check for pbh child line arithmetic operator
2134      IF p_line_rec.list_line_type_code(I) = 'PLL' AND
2135         p_line_rec.price_break_header_ref(I) IS NOT NULL THEN
2136 
2137         IF p_line_rec.arithmetic_operator(I) = 'BREAKUNIT_PRICE' and
2138            p_line_rec.recurring_value(I) is not NULL THEN
2139 	       P_LINE_REC.PROCESS_STATUS_FLAG(I):= NULL; --'E';
2140 	       FND_MESSAGE.SET_NAME('QP', 'QP_INVALID_ATTRIBUTE');
2141 	       FND_MESSAGE.SET_TOKEN('ATTRIBUTE', 'Recurring Value');
2142 	       QP_BULK_MSG.ADD(l_msg_rec);
2143         END IF;
2144 
2145         BEGIN
2146            SELECT price_break_type_code, arithmetic_operator
2147 	       INTO l_pb_type_code, l_art_opr
2148 	       FROM QP_INTERFACE_LIST_LINES
2149 	       WHERE orig_sys_line_ref = p_line_rec.price_break_header_ref(I)
2150 	       AND orig_sys_header_ref = p_line_rec.orig_sys_header_ref(I)
2151 	       AND request_id = p_line_rec.request_id(I);
2152            --Bug 4405737 START RAVI
2153            /**
2154            Price break type of Price break hdr line and child line should not be null.
2155            The price break type code of Price break hdr line and child line should be
2156            equal.
2157            **/
2158            IF p_line_rec.price_break_type_code(I) IS NULL OR
2159               l_pb_type_code IS NULL THEN
2160               P_LINE_REC.PROCESS_STATUS_FLAG(I):= NULL; --'E';
2161               FND_MESSAGE.SET_NAME('QP', 'QP_INVALID_ATTRIBUTE');
2162 	          FND_MESSAGE.SET_TOKEN('ATTRIBUTE', 'Recurring Value');
2163 	          QP_BULK_MSG.ADD(l_msg_rec);
2164               qp_bulk_loader_pub.write_log('PRICE BREAK TYPE CODE NULL');
2165            ELSE
2166               IF p_line_rec.price_break_type_code(I) = l_pb_type_code
2167               THEN
2168                  NULL;
2169               ELSE
2170                  P_LINE_REC.PROCESS_STATUS_FLAG(I):= NULL; --'E';
2171                  FND_MESSAGE.SET_NAME('QP', 'QP_INVALID_ATTRIBUTE');
2172                  FND_MESSAGE.SET_TOKEN('ATTRIBUTE', 'Recurring Value');
2173                  QP_BULK_MSG.ADD(l_msg_rec);
2174                  qp_bulk_loader_pub.write_log('PRICE BREAK TYPE CODE OF PARENT AND CHILD UNEQUAL');
2175               END IF;
2176            END IF;
2177     --Bug 4405737 END RAVI
2178       IF l_servicable_item='N' THEN
2179          IF p_line_rec.arithmetic_operator(I) = 'UNIT_PRICE' THEN
2180             IF l_art_opr <> 'UNIT_PRICE'
2181 		       and l_art_opr <> 'PERCENT_PRICE'
2182             THEN
2183 	           P_LINE_REC.PROCESS_STATUS_FLAG(I):= NULL; --'E';
2184 	           FND_MESSAGE.SET_NAME('QP', 'QP_INVALID_ATTRIBUTE');
2185 	           FND_MESSAGE.SET_TOKEN('ATTRIBUTE', 'Arithmetic Operator');
2186 	           QP_BULK_MSG.ADD(l_msg_rec);
2187             END IF;
2188          ELSIF p_line_rec.arithmetic_operator(I) = 'BLOCK_PRICE' THEN
2189             IF l_art_opr <> 'BLOCK_PRICE' THEN
2190 	           P_LINE_REC.PROCESS_STATUS_FLAG(I):= NULL; --'E';
2191                FND_MESSAGE.SET_NAME('QP', 'QP_INVALID_ATTRIBUTE');
2192 	           FND_MESSAGE.SET_TOKEN('ATTRIBUTE', 'Arithmetic Operator');
2193 	           QP_BULK_MSG.ADD(l_msg_rec);
2194             END IF;
2195          ELSIF p_line_rec.arithmetic_operator(I) = 'BREAKUNIT_PRICE' THEN
2196             IF l_art_opr <> 'BLOCK_PRICE' OR l_pb_type_code <> 'RANGE'  THEN
2197 	           P_LINE_REC.PROCESS_STATUS_FLAG(I):= NULL; --'E';
2198                FND_MESSAGE.SET_NAME('QP', 'QP_INVALID_ATTRIBUTE');
2199 	           FND_MESSAGE.SET_TOKEN('ATTRIBUTE', 'Arithmetic Operator');
2200 	           QP_BULK_MSG.ADD(l_msg_rec);
2201             END IF;
2202 	     END IF;
2203       END IF;
2204 
2205          -- Bug# 5228560 (5246745) RAVI START
2206          -- Check for application method compatibility between PBH line and PBC line
2207 	     l_pb_type_code := NULL;
2208 	     l_art_opr := NULL;
2209 
2210          --Get the PBH details
2211          SELECT L2.price_break_type_code, L2.arithmetic_operator
2212     	 INTO l_pb_type_code, l_art_opr
2213          from qp_list_lines l1, qp_list_lines l2, qp_rltd_modifiers l3
2214          where l1.orig_sys_line_ref=p_LINE_rec.orig_sys_line_ref(I)
2215          -- Bug 5246745 Use Composite Index for Ref columns
2216          and l1.orig_sys_header_ref=p_LINE_rec.orig_sys_header_ref(I)
2217          and l1.list_line_id=l3.TO_RLTD_MODIFIER_ID
2218          and l3.FROM_RLTD_MODIFIER_ID=l2.list_line_id
2219          and l3.RLTD_MODIFIER_GRP_TYPE='PRICE BREAK';
2220 
2221          IF l_servicable_item='N' THEN
2222             IF p_line_rec.arithmetic_operator(I) = 'UNIT_PRICE' THEN
2223                IF l_art_opr <> 'UNIT_PRICE' THEN
2224                   P_LINE_REC.PROCESS_STATUS_FLAG(I):= NULL; --'E';
2225                   FND_MESSAGE.SET_NAME('QP', 'QP_INVALID_ATTRIBUTE');
2226                   FND_MESSAGE.SET_TOKEN('ATTRIBUTE', 'Arithmetic Operator - Orderable item - PBC UNIT_PRICE -- PBH Wrong');
2227                   QP_BULK_MSG.ADD(l_msg_rec);
2228                END IF;
2229 	        ELSIF p_line_rec.arithmetic_operator(I) = 'BLOCK_PRICE' THEN
2230                IF l_art_opr <> 'BLOCK_PRICE' THEN
2231 	              P_LINE_REC.PROCESS_STATUS_FLAG(I):= NULL; --'E';
2232                   FND_MESSAGE.SET_NAME('QP', 'QP_INVALID_ATTRIBUTE');
2233 	              FND_MESSAGE.SET_TOKEN('ATTRIBUTE', 'Arithmetic Operator - Orderable item - PBC BLOCK_PRICE -- PBH Wrong');
2234 	              QP_BULK_MSG.ADD(l_msg_rec);
2235                END IF;
2236             ELSIF p_line_rec.arithmetic_operator(I) = 'BREAKUNIT_PRICE' THEN
2237                IF l_art_opr <> 'BLOCK_PRICE' OR l_pb_type_code <> 'RANGE' THEN
2238                   P_LINE_REC.PROCESS_STATUS_FLAG(I):= NULL; --'E';
2239 	              FND_MESSAGE.SET_NAME('QP', 'QP_INVALID_ATTRIBUTE');
2240                   FND_MESSAGE.SET_TOKEN('ATTRIBUTE', 'Arithmetic Operator - Orderable item - PBC BREAKUNIT_PRICE -- PBH Wrong');
2241 	              QP_BULK_MSG.ADD(l_msg_rec);
2242                END IF;
2243 	        END IF;
2244          ELSIF l_servicable_item='Y' THEN
2245             IF p_line_rec.arithmetic_operator(I) = 'UNIT_PRICE' THEN
2246                IF l_art_opr <> 'UNIT_PRICE' and l_art_opr <> 'PERCENT_PRICE' THEN
2247                   P_LINE_REC.PROCESS_STATUS_FLAG(I):= NULL; --'E';
2248                   FND_MESSAGE.SET_NAME('QP', 'QP_INVALID_ATTRIBUTE');
2249                   FND_MESSAGE.SET_TOKEN('ATTRIBUTE', 'Arithmetic Operator - Servicable item - PBC UNIT_PRICE -- PBH Wrong');
2250                   QP_BULK_MSG.ADD(l_msg_rec);
2251                END IF;
2252 	        ELSIF p_line_rec.arithmetic_operator(I) = 'BLOCK_PRICE' THEN
2253                IF l_art_opr <> 'BLOCK_PRICE' THEN
2254 	              P_LINE_REC.PROCESS_STATUS_FLAG(I):= NULL; --'E';
2255                   FND_MESSAGE.SET_NAME('QP', 'QP_INVALID_ATTRIBUTE');
2256 	              FND_MESSAGE.SET_TOKEN('ATTRIBUTE', 'Arithmetic Operator - Servicable item - PBC BLOCK_PRICE -- PBH Wrong');
2257 	              QP_BULK_MSG.ADD(l_msg_rec);
2258                END IF;
2259             ELSIF p_line_rec.arithmetic_operator(I) = 'BREAKUNIT_PRICE' THEN
2260                IF l_art_opr <> 'BLOCK_PRICE' THEN
2261                   P_LINE_REC.PROCESS_STATUS_FLAG(I):= NULL; --'E';
2262 	              FND_MESSAGE.SET_NAME('QP', 'QP_INVALID_ATTRIBUTE');
2263                   FND_MESSAGE.SET_TOKEN('ATTRIBUTE', 'Arithmetic Operator - Servicable item - PBC BREAKUNIT_PRICE -- PBH Wrong');
2264 	              QP_BULK_MSG.ADD(l_msg_rec);
2265                END IF;
2266             ELSIF p_line_rec.arithmetic_operator(I) = 'PERCENT_PRICE' THEN
2267                IF l_art_opr <> 'BLOCK_PRICE' OR
2268                   l_art_opr <> 'PERCENT_PRICE' OR
2269                   l_art_opr <> 'UNIT_PRICE'
2270                THEN
2271                   P_LINE_REC.PROCESS_STATUS_FLAG(I):= NULL; --'E';
2272 	              FND_MESSAGE.SET_NAME('QP', 'QP_INVALID_ATTRIBUTE');
2273                   FND_MESSAGE.SET_TOKEN('ATTRIBUTE', 'Arithmetic Operator - Servicable item - PBC PERCENT_PRICE -- PBH Wrong');
2274 	              QP_BULK_MSG.ADD(l_msg_rec);
2275                END IF;
2276             END IF;
2277          END IF;
2278          -- Bug# 5228560 (5246745) RAVI END
2279 
2280         EXCEPTION
2281 	   WHEN NO_DATA_FOUND THEN
2282 	      null;
2283 	END;
2284      END IF;
2285 
2286       qp_bulk_loader_pub.write_log('After pbh check');
2287 
2288    -- check for operand value for the line.
2289    IF  p_LINE_rec.list_line_type_code(I) = 'PLL'
2290    and p_LINE_rec.operand(I) IS NULL
2291    and p_LINE_rec.price_by_formula_id(I) IS NULL
2292    and p_LINE_rec.generate_using_formula_id(I) IS NULL
2293    THEN
2294 
2295     p_line_rec.process_status_flag(I):=NULL;
2296     FND_MESSAGE.SET_NAME('QP','QP_OPERAND_FORMULA');
2297     QP_BULK_MSG.ADD(l_msg_rec);
2298 
2299    END IF;
2300 
2301    -- Recurring value check
2302    -- Bug 4995724 START RAVI
2303    /**
2304    Recurring value should always be more than 1.
2305    Recurring value allowed only for RANGE and BLOCK PRICE
2306    **/
2307    IF p_line_rec.recurring_value(I) is not null THEN
2308       IF p_line_rec.recurring_value(I) < 1 Then
2309          FND_MESSAGE.SET_NAME('QP','QP_INVALID_ATTRIBUTE');
2310          FND_MESSAGE.SET_TOKEN('ATTRIBUTE','Recurring Value');
2311          QP_BULK_MSG.ADD(l_msg_rec);
2312       ELSIF p_line_rec.arithmetic_operator(I) <> 'BLOCK_PRICE'
2313       OR l_art_opr <> 'BLOCK_PRICE'
2314       OR l_pb_type_code <> 'RANGE'
2315       THEN
2316          FND_MESSAGE.SET_NAME('QP','QP_INVALID_ATTRIBUTE');
2317          FND_MESSAGE.SET_TOKEN('ATTRIBUTE','Recurring Value');
2318          QP_BULK_MSG.ADD(l_msg_rec);
2319        END IF;
2320    END IF;
2321    /**
2322    IF p_line_rec.recurring_value(I) is not null
2323       And p_line_rec.recurring_value(I) < 1 Then
2324       FND_MESSAGE.SET_NAME('QP','QP_INVALID_ATTRIBUTE');
2325       FND_MESSAGE.SET_TOKEN('ATTRIBUTE','Recurring Value');
2326       QP_BULK_MSG.ADD(l_msg_rec);
2327    END IF;
2328    **/
2329    -- Bug 4995724 END RAVI
2330 
2331 
2332    -- Date Check
2333    IF p_line_rec.end_date_active(I) IS NULL
2334    OR p_line_rec.start_date_active(I) IS NULL
2335    THEN
2336        Null;
2337    ELSIF (p_line_rec.start_date_active(I) > p_line_rec.end_date_active(I) ) THEN
2338        FND_MESSAGE.SET_NAME('QP', 'QP_STRT_DATE_BFR_END_DATE');
2339        QP_BULK_MSG.Add(l_msg_rec);
2340        --Bug# 5228368 RAVI
2341        p_line_rec.process_status_flag(I):=NULL;
2342    END IF;
2343 
2344 
2345    -- Date check with respect to header dates
2346    /**
2347     * Bug 5246745 RAVI START
2348     * Price List Line Start date should be on or after Price List Header Start Date
2349     * Price List Line End date should be on or before Price List Header End Date
2350     **/
2351     l_header_start_date := null;
2352     l_header_end_date := null;
2353 
2354     BEGIN
2355        select fnd_date.canonical_to_date(start_date_active),
2356               fnd_date.canonical_to_date(end_date_active)
2357        into l_header_start_date, l_header_end_date
2358        from qp_interface_list_headers
2359        where orig_sys_header_ref=p_line_rec.orig_sys_header_ref(I)
2360          and request_id=p_line_rec.request_id(I)
2361          and interface_action_code in ('INSERT','UPDATE');
2362     EXCEPTION
2363        WHEN OTHERS
2364        THEN
2365           qp_bulk_loader_pub.write_log( 'ERROR in comparing the Header and Line start Dates (INTERFACE)');
2366     END;
2367 
2368     IF l_header_start_date IS NULL THEN
2369        BEGIN
2370           select start_date_active, end_date_active
2371           into l_header_start_date, l_header_end_date
2372           from qp_list_headers_b
2373           where orig_system_header_ref=p_line_rec.orig_sys_header_ref(I);
2374        EXCEPTION
2375           WHEN OTHERS
2376           THEN
2377              qp_bulk_loader_pub.write_log( 'ERROR in comparing the Header and Line start Dates (QP)');
2378        END;
2379     END IF;
2380 
2381     IF p_line_rec.start_date_active(I) < l_header_start_date OR
2382        p_line_rec.end_date_active(I) > l_header_end_date
2383     THEN
2384        FND_MESSAGE.SET_NAME('QP', 'QP_INVALID_DATE');
2385        QP_BULK_MSG.Add(l_msg_rec);
2386        p_line_rec.process_status_flag(I):=NULL;
2387     END IF;
2388     -- Bug 5246745 RAVI END
2389 
2390 
2391    -- Price break child date check with respect to price break header dates
2392    /**
2393     * Bug 5246745 RAVI START
2394     * Price break child line Start date should be equal to Price break Header Start Date
2395     * Price break child line End date should be equal to Price break Header End Date
2396     **/
2397     l_PBH_start_date := null;
2398     l_PBH_end_date := null;
2399 
2400     IF p_line_rec.list_line_type_code(I)='PLL' AND
2401        p_line_rec.PRICE_BREAK_HEADER_REF(I) is not null AND
2402        p_line_rec.RLTD_MODIFIER_GRP_TYPE(I)='PRICE BREAK'
2403     THEN
2404        BEGIN
2405           select start_date_active, end_date_active
2406           into l_PBH_start_date, l_PBH_end_date
2407           from qp_interface_list_lines
2408           where orig_sys_line_ref=p_line_rec.PRICE_BREAK_HEADER_REF(I)
2409             -- Bug 5246745 Use Composite Index for Ref columns
2410             and orig_sys_header_ref=p_LINE_rec.orig_sys_header_ref(I)
2411             and request_id=p_line_rec.request_id(I)
2412             and interface_action_code in ('INSERT','UPDATE');
2413        EXCEPTION
2414           WHEN OTHERS
2415           THEN
2416              qp_bulk_loader_pub.write_log( 'ERROR in comparing the PBH and PBC start Dates (INTERFACE)');
2417        END;
2418 
2419        IF l_PBH_start_date is null THEN
2420           BEGIN
2421              select start_date_active, end_date_active
2422              into l_PBH_start_date, l_PBH_end_date
2423              from qp_list_lines
2424              where orig_sys_line_ref=p_line_rec.PRICE_BREAK_HEADER_REF(I)
2425              -- Bug 5246745 Use Composite Index for Ref columns
2426              and orig_sys_header_ref=p_LINE_rec.orig_sys_header_ref(I);
2427           EXCEPTION
2428              WHEN OTHERS
2429              THEN
2430                 qp_bulk_loader_pub.write_log( 'ERROR in comparing the PBH and PBC start Dates (INTERFACE)');
2431           END;
2432        END IF;
2433 
2434        IF l_PBH_start_date <> p_line_rec.start_date_active(I) OR
2435           l_PBH_end_date <> p_line_rec.end_date_active(I)
2436        THEN
2437           FND_MESSAGE.SET_NAME('QP', 'QP_INVALID_DATE');
2438           QP_BULK_MSG.Add(l_msg_rec);
2439           p_line_rec.process_status_flag(I):=NULL;
2440        END IF;
2441     END IF;
2442     -- Bug 5246745 RAVI END
2443 
2444 --Flex field check
2445 
2446     IF l_line_flex_enabled = 'Y' THEN
2447       qp_bulk_loader_pub.write_log( 'Line Flex enabled ');
2448 
2449          IF NOT Init_Desc_Flex
2450                (p_flex_name	     =>'QP_LIST_LINES'
2451 	       ,p_context            => p_line_rec.context(i)
2452                ,p_attribute1         => p_line_rec.attribute1(i)
2453                ,p_attribute2         => p_line_rec.attribute2(i)
2454                ,p_attribute3         => p_line_rec.attribute3(i)
2455                ,p_attribute4         => p_line_rec.attribute4(i)
2456                ,p_attribute5         => p_line_rec.attribute5(i)
2457                ,p_attribute6         => p_line_rec.attribute6(i)
2458                ,p_attribute7         => p_line_rec.attribute7(i)
2459                ,p_attribute8         => p_line_rec.attribute8(i)
2460                ,p_attribute9         => p_line_rec.attribute9(i)
2461                ,p_attribute10        => p_line_rec.attribute10(i)
2462                ,p_attribute11        => p_line_rec.attribute11(i)
2463                ,p_attribute12        => p_line_rec.attribute12(i)
2464                ,p_attribute13        => p_line_rec.attribute13(i)
2465                ,p_attribute14        => p_line_rec.attribute14(i)
2466                ,p_attribute15        => p_line_rec.attribute15(i)) THEN
2467 
2468 	         QP_BULK_MSG.ADD(l_msg_rec);
2469 
2470                  -- Log Error Message
2471                  FND_MESSAGE.SET_NAME('QP','QP_INVALID_ATTRIBUTE');
2472                  FND_MESSAGE.SET_TOKEN('ATTRIBUTE',
2473                                        'Entity:Flexfield:Line_Desc_Flex');
2474 	         p_line_rec.process_status_flag(I):=NULL;
2475 
2476 	         QP_BULK_MSG.ADD(l_msg_rec);
2477 
2478           ELSE -- if the flex validation is successfull
2479 
2480             IF p_line_rec.context(i) IS NULL
2481               OR p_line_rec.context(i) = FND_API.G_MISS_CHAR THEN
2482                p_line_rec.context(i)    := g_context;
2483             END IF;
2484 
2485             IF p_line_rec.attribute1(i) IS NULL
2486               OR p_line_rec.attribute1(i) = FND_API.G_MISS_CHAR THEN
2487                p_line_rec.attribute1(i) := g_attribute1;
2488             END IF;
2489 
2490             IF p_line_rec.attribute2(i) IS NULL
2491               OR p_line_rec.attribute2(i) = FND_API.G_MISS_CHAR THEN
2492                p_line_rec.attribute2(i) := g_attribute2;
2493             END IF;
2494 
2495             IF p_line_rec.attribute3(i) IS NULL
2496               OR p_line_rec.attribute3(i) = FND_API.G_MISS_CHAR THEN
2497                p_line_rec.attribute3(i) := g_attribute3;
2498             END IF;
2499 
2500             IF p_line_rec.attribute4(i) IS NULL
2501               OR p_line_rec.attribute4(i) = FND_API.G_MISS_CHAR THEN
2502                p_line_rec.attribute4(i) := g_attribute4;
2503             END IF;
2504 
2505             IF p_line_rec.attribute5(i) IS NULL
2506               OR p_line_rec.attribute5(i) = FND_API.G_MISS_CHAR THEN
2507                p_line_rec.attribute5(i) := g_attribute5;
2508             END IF;
2509 
2510             IF p_line_rec.attribute6(i) IS NULL
2511               OR p_line_rec.attribute6(i) = FND_API.G_MISS_CHAR THEN
2512                p_line_rec.attribute6(i) := g_attribute6;
2513             END IF;
2514             IF p_line_rec.attribute7(i) IS NULL
2515               OR p_line_rec.attribute7(i) = FND_API.G_MISS_CHAR THEN
2516                p_line_rec.attribute7(i) := g_attribute7;
2517             END IF;
2518 
2519             IF p_line_rec.attribute8(i) IS NULL
2520               OR p_line_rec.attribute8(i) = FND_API.G_MISS_CHAR THEN
2521                p_line_rec.attribute8(i) := g_attribute8;
2522             END IF;
2523 
2524             IF p_line_rec.attribute9(i) IS NULL
2525               OR p_line_rec.attribute9(i) = FND_API.G_MISS_CHAR THEN
2526                p_line_rec.attribute9(i) := g_attribute9;
2527             END IF;
2528 
2529             IF p_line_rec.attribute10(i) IS NULL
2530               OR p_line_rec.attribute10(i) = FND_API.G_MISS_CHAR THEN
2531                p_line_rec.attribute10(i) := G_attribute10;
2532             End IF;
2533 
2534             IF p_line_rec.attribute11(i) IS NULL
2535               OR p_line_rec.attribute11(i) = FND_API.G_MISS_CHAR THEN
2536                p_line_rec.attribute11(i) := g_attribute11;
2537             END IF;
2538 
2539             IF p_line_rec.attribute12(i) IS NULL
2540               OR p_line_rec.attribute12(i) = FND_API.G_MISS_CHAR THEN
2541                p_line_rec.attribute12(i) := g_attribute12;
2542             END IF;
2543 
2544             IF p_line_rec.attribute13(i) IS NULL
2545               OR p_line_rec.attribute13(i) = FND_API.G_MISS_CHAR THEN
2546                p_line_rec.attribute13(i) := g_attribute13;
2547             END IF;
2548 
2549             IF p_line_rec.attribute14(i) IS NULL
2550               OR p_line_rec.attribute14(i) = FND_API.G_MISS_CHAR THEN
2551                p_line_rec.attribute14(i) := g_attribute14;
2552             END IF;
2553 
2554             IF p_line_rec.attribute15(i) IS NULL
2555               OR p_line_rec.attribute15(i) = FND_API.G_MISS_CHAR THEN
2556                p_line_rec.attribute15(i) := g_attribute15;
2557             END IF;
2558 	END IF;
2559     END IF;
2560 
2561 -- Basic_Pricing_Condition
2562    IF QP_BULK_LOADER_PUB.GET_QP_STATUS <> 'I' THEN
2563 	IF p_line_rec.price_break_type_code(I) IS NOT NULL THEN
2564 	   p_line_rec.price_break_type_code(I) := NULL;
2565 	END IF;
2566 	IF p_line_rec.primary_uom_flag(I) = 'Y' THEN
2567 	   p_line_rec.primary_uom_flag(I) := 'N';
2568 	END IF;
2569    END IF;
2570 --start_date_active
2571       qp_bulk_loader_pub.write_log('Line Start date value'||nvl(to_char(p_line_rec.start_date_active(I)), 'NULL'));
2572       qp_bulk_loader_pub.write_log('Line end date value'||nvl(to_char(p_line_rec.end_date_active(I)), 'NULL'));
2573 
2574     --Bug#5353889 RAVI START
2575     --Start date null should be allowed
2576     /**
2577     IF p_line_rec.start_date_active(I) IS NULL
2578        AND (p_line_rec.end_date_active(I) IS NULL or
2579 	p_line_rec.end_date_active(I) <= l_start_date)
2580     THEN
2581       qp_bulk_loader_pub.write_log('Line Start date updated');
2582 	p_line_rec.start_date_active(I) := l_start_date;
2583     END IF;
2584     **/
2585     --Bug#5353889 RAVI END
2586 
2587   END LOOP;
2588 
2589   qp_bulk_loader_pub.write_log('Leaving entity line validation');
2590 
2591  EXCEPTION
2592     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2593        qp_bulk_loader_pub.write_log( 'UNEXCPECTED ERROR IN PROCEDURE ENTITY_LINE:'||sqlerrm);
2594        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2595     WHEN OTHERS THEN
2596        qp_bulk_loader_pub.write_log( 'UNEXCPECTED ERROR IN PROCEDURE ENTITY_LINE:'||sqlerrm);
2597        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2598 END ENTITY_LINE;
2599 
2600 
2601 PROCEDURE ENTITY_QUALIFIER
2602           (p_qualifier_rec IN OUT NOCOPY QP_BULK_LOADER_PUB.qualifier_rec_type)
2603 IS
2604  l_msg_rec                  QP_BULK_MSG.Msg_Rec_Type;
2605  l_segment_name             VARCHAR2(240);
2606  x_value                    VARCHAR2(240);
2607  x_id                       VARCHAR2(150);
2608  x_format_type              VARCHAR2(1);
2609  l_exist                    NUMBER;
2610  l_dummy                    VARCHAR2(240);
2611  l_seg_level                VARCHAR2(10);
2612 
2613 l_context_error VARCHAR2(1);
2614 l_attribute_error VARCHAR2(1);
2615 l_value_error VARCHAR2(1);
2616 l_datatype VARCHAR2(1);
2617 l_precedence NUMBER;
2618 l_error_code NUMBER;
2619 
2620 l_context_type                VARCHAR2(30);
2621 l_sourcing_enabled            VARCHAR2(1);
2622 l_sourcing_status             VARCHAR2(1);
2623 l_hierarchy_enabled           VARCHAR2(1);
2624 l_sourcing_method             VARCHAR2(30);
2625 
2626 -- Bug 4926775 RAVI
2627 /**
2628 local variable for header id.
2629 **/
2630 l_list_header_id NUMBER;
2631 
2632 BEGIN
2633   qp_bulk_loader_pub.write_log('Entering Entity Qualifier');
2634 
2635   FOR I IN p_qualifier_rec.orig_sys_qualifier_ref.first
2636            ..p_qualifier_rec.orig_sys_qualifier_ref.last
2637   LOOP
2638 
2639      --qp_bulk_loader_pub.write_log('request_id: '||p_qualifier_rec.request_id(I));
2640       --Initially setting the message context.
2641 
2642      l_msg_rec.REQUEST_ID := P_QUALIFIER_REC.REQUEST_ID(I);
2643      l_msg_rec.ENTITY_TYPE :='PRL';
2644      l_msg_rec.TABLE_NAME :='QP_INTERFACE_QUALIFIERS';
2645      l_msg_rec.ORIG_SYS_HEADER_REF := p_qualifier_rec.orig_sys_header_ref(I);
2646      l_msg_rec.ORIG_SYS_QUALIFIER_REF := p_qualifier_rec.orig_sys_qualifier_ref(I);
2647      l_msg_rec.ORIG_SYS_QUALIFIER_REF := NULL;
2648      l_msg_rec.ORIG_SYS_PRICING_ATTR_REF := NULL;
2649 
2650      /*--- Internal Field populate ----*/
2651      p_qualifier_rec.excluder_flag(I) := 'N';
2652      p_qualifier_rec.orig_sys_line_ref(I) := '-1';
2653 
2654       If p_qualifier_rec.interface_action_code(I)='INSERT' THEN
2655        Select qp_qualifiers_s.nextval
2656        into p_qualifier_rec.qualifier_id(I) from dual;
2657       end if;
2658 
2659 
2660 
2661      /*---- Conversion of qualifier_context, qualifier_attribute,-------------
2662      --------qualifier_attr_value, qualifier_attr_value_to  -----------------*/
2663 
2664      IF p_qualifier_rec.qualifier_grouping_no(I) IS NULL THEN
2665 	p_qualifier_rec.process_status_flag(I):=NULL;
2666 	FND_MESSAGE.SET_NAME('QP','QP_ATTRIBUTE_REQUIRED');
2667         FND_MESSAGE.SET_TOKEN('ATTRIBUTE','QUALIFIER GROUPING NO');
2668         QP_BULK_MSG.ADD(l_msg_rec);
2669      END IF;
2670 
2671      IF p_qualifier_rec.list_line_id(I) IS NOT NULL THEN
2672 	IF p_qualifier_rec.list_line_id(I) <> -1 THEN
2673 	       p_qualifier_rec.process_status_flag(I):=NULL;
2674 	       FND_MESSAGE.SET_NAME('QP','QP_INVALID_ATTRIBUTE');
2675 	       FND_MESSAGE.SET_TOKEN('ATTRIBUTE','LIST_LINE_ID');
2676 	       QP_BULK_MSG.ADD(l_msg_rec);
2677      	END IF;
2678      ELSE
2679 	p_qualifier_rec.list_line_id(I):=-1;
2680      END IF;
2681      -- Qualifier Context
2682 /*     IF p_qualifier_rec.qualifier_context(I) IS NULL THEN
2683 	p_qualifier_rec.qualifier_context(I) := '1';
2684 	p_qualifier_rec.process_status_flag(I):=NULL;
2685 	FND_MESSAGE.SET_NAME('QP','QP_ATTRIBUTE_REQUIRED');
2686         FND_MESSAGE.SET_TOKEN('ATTRIBUTE','QUALIFIER CONTEXT');
2687         QP_BULK_MSG.ADD(l_msg_rec);
2688     END IF; */
2689 
2690 
2691      -- Qualifier Attribute
2692 
2693 	IF p_qualifier_rec.qualifier_attribute(I) IS NULL THEN
2694 
2695 --	IF p_qualifier_rec.qualifier_attribute_code(I) IS NULL THEN
2696 	p_qualifier_rec.qualifier_attribute_code(I):= '1';
2697 	p_qualifier_rec.process_status_flag(I):=NULL;
2698 	FND_MESSAGE.SET_NAME('QP','QP_ATTRIBUTE_REQUIRED');
2699         FND_MESSAGE.SET_TOKEN('ATTRIBUTE','QUALIFIER ATTRIBUTE CODE');
2700         QP_BULK_MSG.ADD(l_msg_rec);
2701 /*	ELSE
2702 
2703 	   BEGIN
2704 	      p_qualifier_rec.qualifier_attribute(I):= QP_UTIL.Get_Attribute_Name(
2705 				p_application_short_name => 'QP',
2706 				p_flexfield_name=> 'QP_ATTR_DEFNS_QUALIFIER',
2707 				p_context_name =>p_qualifier_rec.qualifier_context(I),
2708 				p_attribute_name=>p_qualifier_rec.qualifier_attribute_code(I));
2709 
2710               IF p_qualifier_rec.qualifier_attribute(I) IS NULL THEN
2711                 p_qualifier_rec.qualifier_attribute(I):='1';
2712 		p_qualifier_rec.process_status_flag(I):=NULL;
2713 		FND_MESSAGE.SET_NAME('QP','QP_VALUE_TO_ID_ERROR');
2714 		FND_MESSAGE.SET_TOKEN('ATTRIBUTE','qualifier_attribute');
2715 		QP_BULK_MSG.ADD(l_msg_rec);
2716               END IF;
2717 	   EXCEPTION
2718 	     WHEN NO_DATA_FOUND THEN
2719 		 p_qualifier_rec.qualifier_attribute(I):='1';
2720 		p_qualifier_rec.process_status_flag(I):=NULL;
2721 		FND_MESSAGE.SET_NAME('QP','QP_VALUE_TO_ID_ERROR');
2722 		FND_MESSAGE.SET_TOKEN('ATTRIBUTE','qualifier_attribute');
2723 		QP_BULK_MSG.ADD(l_msg_rec);
2724 	  END;
2725 	END IF; */
2726 
2727 	END IF;
2728 
2729     	IF ( p_qualifier_rec.qualify_hier_descendents_flag(I) IS NOT NULL)
2730           THEN
2731                 IF p_qualifier_rec.qualify_hier_descendents_flag(I) NOT IN ('Y', 'N', 'y', 'n')
2732                 THEN
2733                 p_qualifier_rec.process_status_flag(I):=NULL;
2734                 FND_MESSAGE.SET_NAME('QP','QP_INVALID_ATTRIBUTE');
2735                 FND_MESSAGE.SET_TOKEN('ATTRIBUTE','QUALIFY HIER DESCENDENTS FLAG ');
2736                 qp_bulk_msg.add(l_msg_rec);
2737                 ELSIF p_qualifier_rec.qualify_hier_descendents_flag(I) in ('Y','y') THEN
2738                  BEGIN
2739                  select 'Y' into l_hierarchy_enabled
2740                  from dual
2741                  where exists(select 'X'
2742                  from qp_segments_b qs,qp_prc_contexts_b qpc
2743                  where
2744                  qs.prc_context_id = qpc.prc_context_id and
2745                  qpc.prc_context_code = p_qualifier_rec.qualifier_context(I) and
2746                  qs.segment_mapping_column = p_qualifier_rec.qualifier_attribute(I) and
2747                  qpc.PRC_CONTEXT_TYPE = 'QUALIFIER'
2748                  and qs.party_hierarchy_enabled_flag ='Y');
2749                   p_qualifier_rec.qualify_hier_descendents_flag(I) := 'Y';
2750                  EXCEPTION WHEN NO_DATA_FOUND THEN
2751                   p_qualifier_rec.process_status_flag(I):=NULL;
2752                   FND_MESSAGE.SET_NAME('QP','QP_INVALID_ATTRIBUTE');
2753                   FND_MESSAGE.SET_TOKEN('ATTRIBUTE','QUALIFY HIER DESCENDENTS FLAG ');
2754                   qp_bulk_msg.add(l_msg_rec);
2755                  END;
2756                  ELSE
2757                     null;
2758                 END IF;
2759     END IF;
2760 
2761 -- Bug# 5214576 RAVI START
2762 -- Qualifier Start and End Date validation
2763 IF p_qualifier_rec.end_date_active(I) is not null THEN
2764    IF p_qualifier_rec.start_date_active(I) is not null THEN
2765       IF p_qualifier_rec.start_date_active(I) > p_qualifier_rec.end_date_active(I) THEN
2766          qp_bulk_loader_pub.write_log('End Date is before Start Date');
2767          p_qualifier_rec.process_status_flag(I):=NULL;
2768          FND_MESSAGE.SET_NAME('QP', 'QP_STRT_DATE_BFR_END_DATE');
2769 	 QP_BULK_MSG.Add(l_msg_rec);
2770       END IF;
2771    ELSE
2772       qp_bulk_loader_pub.write_log('Qualifier Start Date is null');
2773       p_qualifier_rec.process_status_flag(I):=NULL;
2774       FND_MESSAGE.SET_NAME('QP', 'QP_INVALID_DATE');
2775       QP_BULK_MSG.Add(l_msg_rec);
2776    END IF;
2777 END IF;
2778 -- Bug# 5214576 RAVI END
2779 
2780 -- Qualifier Attr Value
2781 
2782 --Bug 4929426 START RAVI
2783 /**
2784 Qualifier attribute value validation (Messages)
2785 **/
2786 
2787 IF p_qualifier_rec.qualifier_context(I) = 'MODLIST'
2788 AND p_qualifier_rec.qualifier_attribute(I) = 'QUALIFIER_ATTRIBUTE4'
2789 THEN
2790    begin
2791       select 1 into l_exist from qp_list_headers_b
2792       where list_header_id = to_number(p_qualifier_rec.qualifier_attr_value(I));
2793    exception when others then
2794       p_qualifier_rec.process_status_flag(I):=NULL;
2795       FND_MESSAGE.SET_NAME('QP','QP_INVALID_ATTRIBUTE');
2796       FND_MESSAGE.SET_TOKEN('ATTRIBUTE','QUALIFIER_ATTR_VALUE');
2797       QP_BULK_MSG.ADD(l_msg_rec);
2798    end;
2799 ELSE
2800 
2801    -- Bug 5152088 Checking if Qualifier Attribute Value Code is valid
2802    IF p_QUALIFIER_rec.qualifier_attr_value_code(I) IS NOT NULL THEN
2803       p_QUALIFIER_rec.qualifier_attr_value(I) := QP_Value_To_Id.qualifier_attr_value(
2804                                     p_QUALIFIER_rec.qualifier_attr_value_code(I),
2805                                     p_QUALIFIER_rec.qualifier_context(I),
2806                                     p_QUALIFIER_rec.qualifier_attribute(I)
2807                                    );
2808    END IF;
2809 
2810    QP_UTIL.validate_qp_flexfield(
2811       flexfield_name         =>'QP_ATTR_DEFNS_QUALIFIER'
2812       ,context               =>p_QUALIFIER_rec.qualifier_context(I)
2813    	  ,attribute             =>p_QUALIFIER_rec.qualifier_attribute(I)
2814    	  -- Bug 5152088 Checking if Qualifier Attribute Value Code is valid
2815 	  ,value                 =>p_QUALIFIER_rec.qualifier_attr_value(I)
2816       ,application_short_name=>'QP'
2817 	  ,context_flag          =>l_context_error
2818 	  ,attribute_flag        =>l_attribute_error
2819 	  ,value_flag            =>l_value_error
2820 	  ,datatype              =>l_datatype
2821 	  ,precedence            =>l_precedence
2822 	  ,error_code            =>l_error_code
2823    );
2824 
2825    IF l_error_code IS NULL THEN
2826       p_qualifier_rec.process_status_flag(I):=NULL;
2827       FND_MESSAGE.SET_NAME('QP','QP_ATTRIBUTE_REQUIRED');
2828       FND_MESSAGE.SET_TOKEN('ATTRIBUTE','QUALIFIER ATTRIBUTE CODE');
2829       QP_BULK_MSG.ADD(l_msg_rec);
2830    ELSE
2831       IF l_error_code=1 THEN
2832          qp_bulk_loader_pub.write_log('Qualifier Flexfield_name is not passed.');
2833          p_qualifier_rec.process_status_flag(I):=NULL;
2834          FND_MESSAGE.SET_NAME('QP','QP_QLF_FLXFLD_NULL');
2835          --FND_MESSAGE.SET_TOKEN('ATTRIBUTE','QUALIFIER ATTRIBUTE CODE');
2836          QP_BULK_MSG.ADD(l_msg_rec);
2837       ELSIF l_error_code=2 THEN
2838          qp_bulk_loader_pub.write_log('Qualifier Context is not passed');
2839          p_qualifier_rec.process_status_flag(I):=NULL;
2840          FND_MESSAGE.SET_NAME('QP','QP_QLF_CNTXT_NULL');
2841          --FND_MESSAGE.SET_TOKEN('ATTRIBUTE','QUALIFIER ATTRIBUTE CODE');
2842          QP_BULK_MSG.ADD(l_msg_rec);
2843       ELSIF l_error_code=3 THEN
2844          qp_bulk_loader_pub.write_log('Qualifier Attribute is not passed.');
2845          p_qualifier_rec.process_status_flag(I):=NULL;
2846          FND_MESSAGE.SET_NAME('QP','QP_QLF_ATTR_NULL');
2847          --FND_MESSAGE.SET_TOKEN('ATTRIBUTE','QUALIFIER ATTRIBUTE CODE');
2848          QP_BULK_MSG.ADD(l_msg_rec);
2849       ELSIF l_error_code=4 THEN
2850          qp_bulk_loader_pub.write_log('Qualifier Value is not passed');
2851          p_qualifier_rec.process_status_flag(I):=NULL;
2852          FND_MESSAGE.SET_NAME('QP','QP_QLF_ATTR_VAL_NULL');
2853          --FND_MESSAGE.SET_TOKEN('ATTRIBUTE','QUALIFIER ATTRIBUTE CODE');
2854          QP_BULK_MSG.ADD(l_msg_rec);
2855       ELSIF l_error_code=5 THEN
2856          qp_bulk_loader_pub.write_log('Qualifier Application short name is not passed');
2857          p_qualifier_rec.process_status_flag(I):=NULL;
2858          FND_MESSAGE.SET_NAME('QP','QP_QLF_APP_NAME_NULL');
2859          --FND_MESSAGE.SET_TOKEN('ATTRIBUTE','QUALIFIER ATTRIBUTE CODE');
2860          QP_BULK_MSG.ADD(l_msg_rec);
2861       ELSIF l_error_code=6 THEN
2862          qp_bulk_loader_pub.write_log('Qualifier Invalid application short name.');
2863          p_qualifier_rec.process_status_flag(I):=NULL;
2864          FND_MESSAGE.SET_NAME('QP','QP_QLF_INVALID_APP_NAME');
2865          --FND_MESSAGE.SET_TOKEN('ATTRIBUTE','QUALIFIER ATTRIBUTE CODE');
2866          QP_BULK_MSG.ADD(l_msg_rec);
2867       ELSIF l_error_code=7 THEN
2868          qp_bulk_loader_pub.write_log('Qualifier Invalid context passed');
2869          p_qualifier_rec.process_status_flag(I):=NULL;
2870          FND_MESSAGE.SET_NAME('QP','QP_QLF_INVALID_CNTXT');
2871          --FND_MESSAGE.SET_TOKEN('ATTRIBUTE','QUALIFIER ATTRIBUTE CODE');
2872          QP_BULK_MSG.ADD(l_msg_rec);
2873       ELSIF l_error_code=8 THEN
2874          qp_bulk_loader_pub.write_log('Qualifier Invalid Attribute passed');
2875          p_qualifier_rec.process_status_flag(I):=NULL;
2876          FND_MESSAGE.SET_NAME('QP','QP_QLF_INVALID_ATTRIB');
2877          --FND_MESSAGE.SET_TOKEN('ATTRIBUTE','QUALIFIER ATTRIBUTE CODE');
2878          QP_BULK_MSG.ADD(l_msg_rec);
2879       ELSIF l_error_code=9 THEN
2880          qp_bulk_loader_pub.write_log('Qualifier Value does not exist');
2881          p_qualifier_rec.process_status_flag(I):=NULL;
2882          FND_MESSAGE.SET_NAME('QP','QP_QLF_INVALID_ATTR_VAL');
2883          --FND_MESSAGE.SET_TOKEN('ATTRIBUTE','QUALIFIER ATTRIBUTE CODE');
2884          QP_BULK_MSG.ADD(l_msg_rec);
2885       ELSIF l_error_code=10 THEN
2886          qp_bulk_loader_pub.write_log('Qualifier Invalid Flexfield Name');
2887          p_qualifier_rec.process_status_flag(I):=NULL;
2888          FND_MESSAGE.SET_NAME('QP','QP_QLF_INVALID_FLXFLD_NAME');
2889          --FND_MESSAGE.SET_TOKEN('ATTRIBUTE','QUALIFIER ATTRIBUTE CODE');
2890          QP_BULK_MSG.ADD(l_msg_rec);
2891       END IF;
2892    END IF;
2893 END IF;
2894 
2895 --Bug 4929426 END RAVI
2896 
2897 	qp_bulk_loader_pub.write_log( 'Qualifier_attr_val:'||p_qualifier_rec.qualifier_attr_value(I));
2898       -- Qualifier Attr Value To
2899        IF p_qualifier_rec.comparison_operator_code(I)= 'BETWEEN' AND
2900 	  p_qualifier_rec.qualifier_attr_value_to(I) IS NULL 	THEN
2901 
2902 	IF p_qualifier_rec.qualifier_attr_value_to_code(I) IS NULL THEN
2903 	p_qualifier_rec.process_status_flag(I):=NULL;
2904 	FND_MESSAGE.SET_NAME('QP','QP_ATTRIBUTE_REQUIRED');
2905         FND_MESSAGE.SET_TOKEN('ATTRIBUTE','QUALIFIER ATTRIBUTE VALUE TO');
2906         QP_BULK_MSG.ADD(l_msg_rec);
2907 	ELSE
2908 
2909 	   BEGIN
2910 	      l_segment_name :=QP_PRICE_LIST_LINE_UTIL.Get_Segment_Name
2911 			('QP_ATTR_DEFNS_QUALIFIER',
2912 			 p_qualifier_rec.qualifier_context(I),
2913   			 p_qualifier_rec.qualifier_attribute(I));
2914 
2915 	      QP_Value_To_ID.Flex_Meaning_To_Value_Id(
2916  		    p_flexfield_name => 'QP_ATTR_DEFNS_QUALIFIER',
2917  		    p_context => p_qualifier_rec.qualifier_context(I),
2918                     p_segment => l_segment_name,
2919 	            p_meaning => p_qualifier_rec.qualifier_attr_value_to_code(I),
2920                     x_value => x_value,
2921              	    x_id => x_id,
2922  		    x_format_type => x_format_type);
2923 
2924 	      IF x_id IS NOT NULL THEN
2925 		 p_qualifier_rec.qualifier_attr_value_to(I) := x_id;
2926 	      ELSE
2927 		 p_qualifier_rec.qualifier_attr_value_to(I) := x_value;
2928 	      END IF;
2929 
2930 	      IF p_qualifier_rec.qualifier_attr_value_to(I) IS NULL THEN
2931 	       p_qualifier_rec.process_status_flag(I):=NULL;
2932                FND_MESSAGE.SET_NAME('QP','QP_VALUE_TO_ID_ERROR');
2933                FND_MESSAGE.SET_TOKEN('ATTRIBUTE','qualifier_attr_value_to');
2934 	       QP_BULK_MSG.add(l_msg_rec);
2935 	      END IF;
2936 
2937 	   EXCEPTION
2938 	      WHEN NO_DATA_FOUND THEN
2939                 p_qualifier_rec.process_status_flag(I):=NULL;
2940                FND_MESSAGE.SET_NAME('QP','QP_VALUE_TO_ID_ERROR');
2941                FND_MESSAGE.SET_TOKEN('ATTRIBUTE','qualifier_attr_value_to');
2942 	       QP_BULK_MSG.ADD(l_msg_rec);
2943 
2944 	   END;
2945 	END IF;
2946      END IF;
2947 
2948 
2949 
2950     /*------ Performing required field validation for ----------------
2951          orig_sys_qualifier_ref.
2952      -------------------------------------------------------------*/
2953      IF p_qualifier_rec.orig_sys_qualifier_ref(I) IS NULL THEN
2954         p_qualifier_rec.process_status_flag(I):=NULL;
2955       	FND_MESSAGE.SET_NAME('QP','QP_ATTRIBUTE_REQUIRED');
2956         FND_MESSAGE.SET_TOKEN('ATTRIBUTE','ORIG_SYS_QUALIFIER_REF');
2957         QP_BULK_MSG.ADD(l_msg_rec);
2958      END IF;
2959      l_exist:=null;
2960      -- Check for uniqueness of orig_sys_qualifier_ref
2961      BEGIN
2962 	Select  1 INTO l_exist
2963 	  from qp_qualifiers
2964 	 where orig_sys_qualifier_ref=p_qualifier_rec.orig_sys_qualifier_ref(I)
2965 	   and orig_sys_header_ref = p_qualifier_rec.orig_sys_header_ref(I);
2966      EXCEPTION
2967 	 WHEN NO_DATA_FOUND THEN
2968 	    l_exist := 0;
2969      END;
2970 
2971      IF p_qualifier_rec.interface_action_code(I) = 'INSERT' AND l_exist =  1 THEN
2972 	p_qualifier_rec.process_status_flag(I):=NULL;
2973 	FND_MESSAGE.SET_NAME('QP', 'ORIG_SYS_QUAL_REF_NOT_UNIQUE');
2974         FND_MESSAGE.SET_TOKEN('REF_NO', p_qualifier_rec.orig_sys_qualifier_ref(I));
2975 	QP_BULK_MSG.add(l_msg_rec);
2976      ELSIF p_qualifier_rec.interface_action_code(I) = 'UPDATE' AND l_exist = 0 THEN
2977 	p_qualifier_rec.process_status_flag(I):=NULL;
2978 	FND_MESSAGE.SET_NAME('QP', 'QUALIFIER_REC_DOES_NOT_EXIST');
2979         FND_MESSAGE.SET_TOKEN('REF_NO', p_qualifier_rec.orig_sys_qualifier_ref(I));
2980 	QP_BULK_MSG.add(l_msg_rec);
2981      END IF;
2982      If p_qualifier_rec.interface_action_code(I)='INSERT' THEN
2983      l_exist:=null;
2984     	Select /*+ index(qp_interface_qualifiers QP_INTERFACE_QUALIFIERS_N3) */ --bug8359604
2985 	  count(*) INTO l_exist
2986 	  from qp_interface_qualifiers
2987 	 where request_id = p_qualifier_rec.request_id(I)
2988 	   and orig_sys_qualifier_ref=p_qualifier_rec.orig_sys_qualifier_ref(I)
2989 	   and p_qualifier_rec.process_status_flag(I) ='P' --is null
2990            and orig_sys_header_ref = p_qualifier_rec.orig_sys_header_ref(I);
2991 
2992       IF l_exist >1 THEN
2993 	p_qualifier_rec.process_status_flag(I):=NULL;
2994 	FND_MESSAGE.SET_NAME('QP', 'ORIG_SYS_QUAL_REF_NOT_UNIQUE');
2995         FND_MESSAGE.SET_TOKEN('REF_NO', p_qualifier_rec.orig_sys_qualifier_ref(I));
2996 	QP_BULK_MSG.add(l_msg_rec);
2997      END IF;
2998     end if;
2999 
3000      Begin
3001        select  list_header_id, active_flag
3002 	into    p_qualifier_rec.list_header_id(I), p_qualifier_rec.active_flag(i)
3003 	from    qp_list_headers_b
3004 	where   orig_system_header_ref = p_qualifier_rec.orig_sys_header_ref(I);
3005      Exception
3006 	When NO_DATA_FOUND then
3007 	   p_qualifier_rec.process_status_flag(I):=NULL;
3008 	   p_qualifier_rec.list_header_id(I) := -1;
3009 	   fnd_message.set_name('QP', 'QP_INVALID_HEADER_REF');
3010            FND_MESSAGE.SET_TOKEN('REF_NO',NULL);
3011 	   qp_bulk_msg.add(l_msg_rec);
3012      End;
3013 
3014  --SECONDARY PRICELIST CHECK
3015     qp_bulk_loader_pub.write_log( 'SECONDARY PRICELIST CHECK');
3016     IF p_qualifier_rec.qualifier_context(I) = 'MODLIST'
3017 	AND p_qualifier_rec.qualifier_attribute(I) = 'QUALIFIER_ATTRIBUTE4' THEN
3018 
3019 -- Bug 4926775 START RAVI
3020 /**
3021 The currency code for the primary and secondary price lists should be same. (Messages)
3022 **/
3023 	    BEGIN
3024 	    SELECT qplh.list_header_id
3025 	      INTO l_list_header_id
3026 	      FROM QP_interface_list_headers qpilh, qp_list_headers qplh
3027           WHERE qplh.list_header_id = to_number(p_qualifier_rec.qualifier_attr_value(I))
3028 	       AND qpilh.ORIG_SYS_HEADER_REF = p_qualifier_rec.ORIG_SYS_HEADER_REF(I)
3029            AND qplh.currency_code = qpilh.currency_code;
3030 	    EXCEPTION
3031 	       WHEN NO_DATA_FOUND THEN
3032 	          qp_bulk_loader_pub.write_log( 'Secondary Price List Currency not compatible with primary price list currency code');
3033 		  P_QUALIFIER_REC.PROCESS_STATUS_FLAG(I):= NULL; --'E';
3034 		  FND_MESSAGE.SET_NAME('QP', 'QP_SEC_PRL_CCD_INVALID');
3035 		  --FND_MESSAGE.SET_TOKEN('PRICELIST_NAME', p_qualifier_rec.qualifier_attr_value(I));
3036 		  QP_BULK_MSG.ADD(l_msg_rec);
3037 	    END;
3038 -- Bug 4926775 END RAVI
3039 
3040 	IF p_qualifier_rec.qualifier_attr_value(I) IS NULL THEN
3041 	    qp_bulk_loader_pub.write_log( 'Secondary Price List read from qp_list_header');
3042 	    BEGIN
3043 	    SELECT to_char(list_header_id)
3044 	      INTO p_qualifier_rec.qualifier_attr_value(I)
3045 	      FROM QP_LIST_HEADERS_TL
3046 	     WHERE NAME = p_qualifier_rec.qualifier_attr_value_code(I)
3047 	       AND LANGUAGE = userenv('LANG');
3048 	    EXCEPTION
3049 	       WHEN NO_DATA_FOUND THEN
3050 		  P_QUALIFIER_REC.PROCESS_STATUS_FLAG(I):= NULL; --'E';
3051 		  FND_MESSAGE.SET_NAME('QP', 'SEC_PRL_ERROR');
3052 		  FND_MESSAGE.SET_TOKEN('PRICELIST_NAME', p_qualifier_rec.qualifier_attr_value_code(I));
3053 		  QP_BULK_MSG.ADD(l_msg_rec);
3054 	    END;
3055 	END IF;
3056 	IF p_qualifier_rec.qualifier_attr_value(I) IS NOT NULL THEN
3057 	    qp_bulk_loader_pub.write_log( 'Secondary Price List duplicate check');
3058 	    l_exist:=0;
3059 	    begin
3060 	    select 1 into l_exist
3061 	    from qp_qualifiers
3062 	    where qualifier_context = 'MODLIST'
3063 	    and qualifier_attribute = 'QUALIFIER_ATTRIBUTE4'
3064 	    and qualifier_attr_value = to_number(p_qualifier_rec.qualifier_attr_value(I))
3065 	    -- Bug# 5276935 RAVI
3066 	    -- Chcek for duplication in the remaining qualifiers
3067             and orig_sys_qualifier_ref <> p_qualifier_rec.orig_sys_qualifier_ref(I)
3068 	    and list_header_id = p_qualifier_rec.list_header_id(I);
3069 	    exception
3070 		when others then
3071 			null;
3072 	    end;
3073 	    if l_exist = 0 then
3074 	    qp_bulk_loader_pub.write_log( 'Secondary Price List dupl. checkin int. table');
3075 		begin
3076 		select 1 into l_exist
3077 		from qp_interface_qualifiers
3078 		where request_id = p_qualifier_rec.request_id(I)
3079 		and orig_sys_header_ref = p_qualifier_rec.orig_sys_header_ref(I)
3080 		and orig_sys_qualifier_ref <> p_qualifier_rec.orig_sys_qualifier_ref(I)
3081 		and qualifier_context = 'MODLIST'
3082 		and qualifier_attribute = 'QUALIFIER_ATTRIBUTE4'
3083 	    	and qualifier_attr_value = p_qualifier_rec.qualifier_attr_value(I);
3084 		exception
3085 		    when others then
3086 			    null;
3087 		end;
3088 	    end if;
3089 	    if l_exist <> 0 then
3090 		  P_QUALIFIER_REC.PROCESS_STATUS_FLAG(I):= NULL; --'E';
3091 		  FND_MESSAGE.SET_NAME('QP','QP_INVALID_ATTRIBUTE');
3092 		  FND_MESSAGE.SET_TOKEN('ATTRIBUTE',' Price List');
3093 		  QP_BULK_MSG.ADD(l_msg_rec);
3094 	    end if;
3095 	    qp_bulk_loader_pub.write_log( 'Secondary Price List security check');
3096 	      IF QP_security.check_function(p_function_name => QP_Security.G_FUNCTION_UPDATE,
3097 					 p_instance_type => QP_Security.G_PRICELIST_OBJECT,
3098 					 p_instance_pk1  => to_number(p_qualifier_rec.qualifier_attr_value(I))) <> 'T' THEN
3099 		p_qualifier_rec.process_status_flag(I):=NULL;
3100 		fnd_message.set_name('QP', 'QP_NO_PRIVILEGE');
3101 		fnd_message.set_token('PRICING_OBJECT', 'Price List');
3102 		qp_bulk_msg.add(l_msg_rec);
3103 	       END IF;
3104         END IF;
3105     END IF;
3106 
3107 -- Basic_Pricing_Condition
3108 -- Secondary PricelIst check while basic pricing
3109    IF QP_BULK_LOADER_PUB.GET_QP_STATUS<>'I' THEN
3110     IF p_qualifier_rec.qualifier_context(I) = 'MODLIST'
3111 	AND p_qualifier_rec.qualifier_attribute(I) = 'QUALIFIER_ATTRIBUTE4' THEN
3112      	   l_exist:=0;
3113 
3114 	   SELECT count(*)
3115 	   INTO	  l_exist
3116 	   FROM   QP_SECONDARY_PRICE_LISTS_V
3117 	   WHERE  parent_price_list_id = p_qualifier_rec.qualifier_attr_value(I);
3118 
3119     qp_bulk_loader_pub.write_log( 'l_exist='||l_exist);
3120 
3121 	   IF l_exist > 0 THEN
3122 	      P_QUALIFIER_REC.PROCESS_STATUS_FLAG(I):= NULL; --'E';
3123 	      FND_MESSAGE.SET_NAME('QP','QP_1_SEC_PLST_FOR_BASIC');
3124 	      --Only one secondary pricelist allowed in Basic Pricing
3125 	      QP_BULK_MSG.ADD(l_msg_rec);
3126 	   END IF;
3127 	   l_exist:=0;
3128 	   SELECT count(*)
3129 	   INTO	l_exist
3130 	   FROM	QP_INTERFACE_QUALIFIERS
3131 	   WHERE QUALIFIER_CONTEXT = 'MODLIST'
3132 	   AND	QUALIFIER_ATTRIBUTE = 'QUALIFIER_ATTRIBUTE4'
3133 	   AND  request_id = p_qualifier_rec.request_id(I)
3134 	   AND	(QUALIFIER_ATTR_VALUE = p_qualifier_rec.qualifier_attr_value(I)
3135 	    OR	QUALIFIER_ATTR_VALUE_CODE = p_qualifier_rec.qualifier_attr_value_code(I));
3136 	   IF l_exist > 1 THEN
3137 	      P_QUALIFIER_REC.PROCESS_STATUS_FLAG(I):= NULL; --'E';
3138 	      FND_MESSAGE.SET_NAME('QP','QP_1_SEC_PLST_FOR_BASIC');
3139 	      --Only one secondary pricelist allowed in Basic Pricing
3140 	      QP_BULK_MSG.ADD(l_msg_rec);
3141 	   END IF;
3142     END IF;
3143    END IF;
3144  --check for the qualifier level
3145   IF p_qualifier_rec.process_status_flag(I) ='P' THEN --IS NOT NULL THEN
3146     BEGIN
3147        SELECT  f.segment_level
3148 	 INTO  l_seg_level
3149 	 FROM  qp_prc_contexts_b d,
3150 	       qp_segments_b e,  qp_pte_segments f
3151 	WHERE  d.prc_context_code =p_qualifier_rec.qualifier_context(I)
3152 	  AND  e.segment_mapping_column = p_qualifier_rec.qualifier_attribute(I)
3153 	  AND  d.prc_context_id = e.prc_context_id
3154 	  AND  e.segment_id = f.segment_id
3155 	  AND  f.pte_code = 'ORDFUL';
3156 
3157      IF l_seg_level = 'ORDER' THEN
3158 	  P_QUALIFIER_REC.PROCESS_STATUS_FLAG(I):= NULL; --'E';
3159           FND_MESSAGE.SET_NAME('QP', 'QP_ORDER_LEVEL_QUAL_NOT_ALLOWED');
3160 	  QP_BULK_MSG.ADD(l_msg_rec);
3161      END IF;
3162 
3163      EXCEPTION
3164 	 WHEN NO_DATA_FOUND THEN
3165 	    NULL;
3166      END;
3167 
3168   END IF;
3169 
3170   IF p_qualifier_rec.qualifier_precedence(I) IS NULL or
3171      p_qualifier_rec.qualifier_precedence(I) = 0 THEN
3172     QP_UTIL.validate_qp_flexfield(flexfield_name =>'QP_ATTR_DEFNS_QUALIFIER'
3173                ,context        =>p_qualifier_rec.qualifier_context(I)
3174                ,attribute      =>p_qualifier_rec.qualifier_attribute(I)
3175 	       ,value          =>p_qualifier_rec.qualifier_attr_value(I)
3176                 ,application_short_name         => 'QP'
3177                          ,context_flag           =>l_context_error
3178                          ,attribute_flag         =>l_attribute_error
3179                          ,value_flag             =>l_value_error
3180                          ,datatype               =>l_datatype
3181                          ,precedence              =>l_precedence
3182                          ,error_code             =>l_error_code
3183                          );
3184 
3185     If l_error_code = 0 Then
3186           p_qualifier_rec.qualifier_precedence(I) := l_precedence;
3187     end if;
3188   END IF;
3189 
3190 --warning messages
3191   IF P_QUALIFIER_REC.PROCESS_STATUS_FLAG(I)='P' THEN --,'*')<> 'E' THEN
3192    qp_bulk_loader_pub.write_log('Entering Qualifier warnings');
3193 
3194     IF p_Qualifier_rec.qualifier_context(I) IS NOT NULL AND
3195        p_Qualifier_rec.qualifier_attribute(I) IS NOT NULL
3196     THEN
3197       qp_bulk_loader_pub.write_log('Context and Attribute OK ');
3198       QP_UTIL.Get_Context_Type('QP_ATTR_DEFNS_QUALIFIER',
3199                                p_Qualifier_rec.qualifier_context(I),
3200                                l_context_type,
3201                                l_error_code);
3202 
3203       IF l_error_code = 0 THEN --successfully returned context_type
3204 
3205         QP_UTIL.Get_Sourcing_Info(l_context_type,
3206                                   p_Qualifier_rec.qualifier_context(I),
3207                                   p_Qualifier_rec.qualifier_attribute(I),
3208                                   l_sourcing_enabled,
3209                                   l_sourcing_status,
3210                                   l_sourcing_method);
3211 
3212    	qp_bulk_loader_pub.write_log('Sourcing method / status / enabled'||l_sourcing_method||l_sourcing_status||l_sourcing_enabled);
3213 
3214         IF l_sourcing_method = 'ATTRIBUTE MAPPING' THEN
3215 
3216           IF l_sourcing_enabled <> 'Y' THEN
3217 
3218             FND_MESSAGE.SET_NAME('QP','QP_ENABLE_SOURCING');
3219             FND_MESSAGE.SET_TOKEN('CONTEXT',
3220                                   p_Qualifier_rec.qualifier_context(I));
3221             FND_MESSAGE.SET_TOKEN('ATTRIBUTE',
3222                                   p_Qualifier_rec.qualifier_attribute(I));
3223 	    QP_BULK_MSG.ADD(l_msg_rec);
3224 
3225           END IF;
3226 
3227           IF l_sourcing_status <> 'Y' THEN
3228 
3229             IF NOT (
3230                p_qualifier_rec.qualifier_context(I)= 'MODLIST' AND
3231                p_qualifier_rec.qualifier_attribute(I) = 'QUALIFIER_ATTRIBUTE10')
3232             THEN
3233               FND_MESSAGE.SET_NAME('QP','QP_BUILD_SOURCING_RULES');
3234               FND_MESSAGE.SET_TOKEN('CONTEXT',
3235                                     p_Qualifier_rec.qualifier_context(I));
3236               FND_MESSAGE.SET_TOKEN('ATTRIBUTE',
3237                                     p_Qualifier_rec.qualifier_attribute(I));
3238 	      QP_BULK_MSG.ADD(l_msg_rec);
3239             END IF;
3240 
3241           END IF;
3242 
3243         END IF; --If sourcing_method = 'ATTRIBUTE MAPPING'
3244 
3245       END IF; --l_error_code = 0
3246 
3247     END IF;--If qualifier_context and qualifier_attribute are NOT NULL
3248 
3249   END IF;
3250 END LOOP;
3251 
3252  qp_bulk_loader_pub.write_log('Leaving Entity qualifier validation');
3253 
3254  EXCEPTION
3255     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
3256        qp_bulk_loader_pub.write_log( 'UNEXCPECTED ERROR IN PROCEDURE ENTITY_QUALIFIER:'||sqlerrm);
3257        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3258     WHEN OTHERS THEN
3259        qp_bulk_loader_pub.write_log( 'UNEXCPECTED ERROR IN PROCEDURE ENTITY_QUALIFIER:'||sqlerrm);
3260        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3261 
3262 
3263 END ENTITY_QUALIFIER;
3264 
3265 PROCEDURE ENTITY_PRICING_ATTR
3266           (p_pricing_attr_rec IN OUT  NOCOPY QP_BULK_LOADER_PUB.pricing_attr_rec_type)
3267 IS
3268    l_msg_rec QP_BULK_MSG.Msg_Rec_Type;
3269    l_exist NUMBER;
3270    l_exist1 NUMBER;
3271    l_comparison_operator_code VARCHAR2(30);
3272    l_error_code NUMBER;
3273    l_precedence NUMBER;
3274    l_datatype FND_FLEX_VALUE_SETS.Format_type%TYPE;
3275    l_value_error                 VARCHAR2(1);
3276    l_context_error               VARCHAR2(1);
3277    l_attribute_error             VARCHAR2(1);
3278    l_primary_uom_flag            VARCHAR2(1);
3279    l_count                       NUMBER;
3280    l_count1                      NUMBER;
3281    l_msg_txt                     VARCHAR2(2000);
3282    l_status                      VARCHAR2(20);
3283    l_status1                     VARCHAR2(20);
3284    l_pricing_attribute_id        NUMBER;
3285    l_old_pricing_attr_rec        QP_Price_List_PUB.Pricing_Attr_Rec_Type;
3286    l_availability_in_basic	VARCHAR2(1);
3287    l_pricing_attr_flex_enabled VARCHAR2(1);
3288    l_pte_code VARCHAR2(30);
3289 
3290 l_context_type                VARCHAR2(30);
3291 l_sourcing_enabled            VARCHAR2(1);
3292 l_sourcing_status             VARCHAR2(1);
3293 l_sourcing_method             VARCHAR2(30);
3294 --smbalara 9458481/10152629 /10152629  START
3295 l_min_date DATE;
3296 l_max_date DATE;
3297 l_return_status               VARCHAR2(1) := FND_API.G_RET_STS_SUCCESS;
3298 l_start_date_active DATE;
3299 l_end_date_active DATE;
3300 l_edate DATE;
3301 l_sdate DATE;
3302 l_revision VARCHAR2(30);
3303 l_list_header_id NUMBER;
3304 l_x_rows NUMBER := 0;
3305 l_x_revision BOOLEAN;
3306 l_x_effdates BOOLEAN;
3307 l_x_dup_sdate DATE;
3308 l_x_dup_edate DATE;
3309 --smbalara 9458481/10152629 /10152629  END
3310 l_ss_code                     VARCHAR2(30);
3311 l_fna_name                    VARCHAR2(4000);
3312 l_fna_desc                    VARCHAR2(489);
3313 l_fna_valid                   BOOLEAN;
3314 
3315 --ENH Continuous Price Break START RAVI
3316 l_old_break_pa_count NUMBER := -1;
3317 l_new_break_pa_count NUMBER := -1;
3318 l_new_break_low_value NUMBER := -1;
3319 l_new_break_high_value NUMBER := -1;
3320 l_old_break_low_value NUMBER := -1;
3321 l_old_break_high_value NUMBER := -1;
3322 l_break_high_value NUMBER := -1;
3323 l_to_value_old NUMBER := -1;
3324 l_to_value_new NUMBER := -1;
3325 l_from_value_old NUMBER := -1;
3326 l_from_value_new NUMBER := -1;
3327 --ENH Continuous Price Break END RAVI
3328 
3329 -- Bug# 5246745 RAVI
3330 l_pa_count NUMBER := 0;
3331 
3332 
3333 -- Bug# 5440851 RAVI
3334 l_pa_from_val_tmp NUMBER := 0;
3335 l_pa_to_val_tmp   NUMBER := 0;
3336 
3337 -- Bug# 5528754
3338 -- Local variable to store price break or price list line
3339 l_pa_price_break VARCHAR2(30):='PRICE LIST LINE';
3340 
3341 Cursor C_break_lines(p_orig_sys_line_ref VARCHAR2,
3342                      -- Bug 5246745 Use Composite Index for Ref columns
3343                      p_orig_sys_header_ref VARCHAR2) IS
3344 --ENH Continuous Price Break RAVI
3345 /**
3346 Check for overlap of price breaks
3347 **/
3348        SELECT  'OVERLAP'
3349           FROM   qp_list_lines la,
3350 		 qp_rltd_modifiers ra,
3351                  qp_rltd_modifiers rb,
3352                  qp_interface_pricing_attribs pa,
3353                  qp_pricing_attributes pb
3354        WHERE  la.orig_sys_line_ref = p_orig_sys_line_ref
3355        -- Bug 5246745 Use Composite Index for Ref columns
3356        AND    la.orig_sys_header_ref = p_orig_sys_header_ref
3357        AND    ra.to_rltd_modifier_id = la.list_line_id
3358        AND    ra.rltd_modifier_grp_type = 'PRICE BREAK'
3359        -- Got Price Break Line
3360        AND    ra.from_rltd_modifier_id = rb.from_rltd_modifier_id
3361        AND    ra.to_rltd_modifier_id <> rb.to_rltd_modifier_id
3362        -- Got Remaining Price Break Lines
3363        AND    pa.orig_sys_line_ref = la.orig_sys_line_ref
3364        -- Got Price Break Line New Values
3365        AND    rb.to_rltd_modifier_id = pb.list_line_id
3366        -- Got Remaining Price Break Lines Values
3367        -- Bug# 5236432 RAVI
3368        AND pb.orig_sys_pricing_attr_ref NOT IN (
3369                 select pia.orig_sys_pricing_attr_ref
3370                 from qp_interface_pricing_attribs pia
3371                 where pia.orig_sys_header_ref=pb.orig_sys_header_ref
3372                 and pia.orig_sys_line_ref=pb.orig_sys_line_ref
3373            )
3374        -- Got the remaining Price Break Lines that are not being updated in this request
3375        AND (
3376              ( qp_number.canonical_to_number(pa.pricing_attr_value_from) >=
3377                  qp_number.canonical_to_number(pa.pricing_attr_value_to)
3378              ) -- New Price Break To is greater than (or equal to) New Price Break From
3379              OR
3380              ( qp_number.canonical_to_number(pa.pricing_attr_value_from) <
3381                  qp_number.canonical_to_number(pb.pricing_attr_value_to)
3382                AND qp_number.canonical_to_number(pa.pricing_attr_value_from) >=
3383                    qp_number.canonical_to_number(pb.pricing_attr_value_from)
3384              ) -- New Price Break From in between Old Price Break
3385              OR
3386              ( qp_number.canonical_to_number(pa.pricing_attr_value_to) <=
3387                  qp_number.canonical_to_number(pb.pricing_attr_value_to)
3388                AND qp_number.canonical_to_number(pa.pricing_attr_value_to) >
3389                   qp_number.canonical_to_number(pb.pricing_attr_value_from)
3390              ) -- New Price Break To in between Old Price Break
3391              OR
3392              ( qp_number.canonical_to_number(pa.pricing_attr_value_from) <
3393                  qp_number.canonical_to_number(pb.pricing_attr_value_from)
3394                AND qp_number.canonical_to_number(pa.pricing_attr_value_to) >
3395                   qp_number.canonical_to_number(pb.pricing_attr_value_to)
3396              ) -- Old Price Break in between New Price Break
3397            );
3398 
3399 Cursor C_old_cont_grp_break_line(p_orig_sys_line_ref VARCHAR2,
3400                      -- Bug 5246745 Use Composite Index for Ref columns
3401                      p_orig_sys_header_ref VARCHAR2) IS
3402 --ENH Continuous Price Break RAVI
3403 /**
3404 Count of old price breaks
3405 **/
3406        SELECT  count(*) old_break_pa_count,
3407                min(to_number(pb.pricing_attr_value_from)) new_break_low_value,
3408                max(to_number(pb.pricing_attr_value_to)) new_break_high_value
3409           FROM   qp_list_lines la,
3410 		 qp_rltd_modifiers ra,
3411                  qp_rltd_modifiers rb,
3412                  qp_interface_pricing_attribs pa,
3413                  qp_pricing_attributes pb
3414        WHERE  la.orig_sys_line_ref = p_orig_sys_line_ref
3415        -- Bug 5246745 Use Composite Index for Ref columns
3416        AND    la.orig_sys_header_ref = p_orig_sys_header_ref
3417        AND    ra.to_rltd_modifier_id = la.list_line_id
3418        AND    ra.rltd_modifier_grp_type = 'PRICE BREAK'
3419        -- Got Price Break Line
3420        AND    ra.from_rltd_modifier_id = rb.from_rltd_modifier_id
3421        AND    ra.to_rltd_modifier_id <> rb.to_rltd_modifier_id
3422        -- Got Remaining Price Break Lines
3423        AND    pa.orig_sys_line_ref = la.orig_sys_line_ref
3424        -- Got Price Break Line New Values
3425        AND    rb.to_rltd_modifier_id = pb.list_line_id;
3426        -- Got Remaining Price Break Lines Values
3427 
3428 --ENH Continuous Price Break RAVI
3429 /**
3430 Count of new price breaks
3431 **/
3432 Cursor C_new_cont_grp_break_lines(p_orig_sys_line_ref VARCHAR2,
3433                      -- Bug 5246745 Use Composite Index for Ref columns
3434                      p_orig_sys_header_ref VARCHAR2) IS
3435        SELECT  count(*) new_break_pa_count,
3436                min(to_number(pb.pricing_attr_value_from)) new_break_low_value,
3437                max(to_number(pb.pricing_attr_value_to)) new_break_high_value
3438           FROM   qp_list_lines la,
3439 	         qp_list_lines lb,
3440 		 qp_rltd_modifiers ra,
3441                  qp_rltd_modifiers rb,
3442                  qp_interface_pricing_attribs pa,
3443                  qp_interface_pricing_attribs pb
3444        WHERE  la.orig_sys_line_ref = p_orig_sys_line_ref
3445        -- Bug 5246745 Use Composite Index for Ref columns
3446        AND    la.orig_sys_header_ref = p_orig_sys_header_ref
3447        AND    ra.to_rltd_modifier_id = la.list_line_id
3448        AND    ra.from_rltd_modifier_id = rb.from_rltd_modifier_id
3449        AND    pa.orig_sys_line_ref = la.orig_sys_line_ref
3450        AND    rb.to_rltd_modifier_id = lb.list_line_id
3451        AND    pb.orig_sys_line_ref = lb.orig_sys_line_ref
3452        AND    ra.rltd_modifier_grp_type = 'PRICE BREAK'
3453        AND    ra.to_rltd_modifier_id <> rb.to_rltd_modifier_id;
3454 
3455 --ENH Continuous Price Break RAVI
3456 /**
3457 Count of Old Price Breaks with Same From value
3458 **/
3459 Cursor C_from_value_old(p_orig_sys_line_ref VARCHAR2,
3460                      -- Bug 5246745 Use Composite Index for Ref columns
3461                      p_orig_sys_header_ref VARCHAR2) IS
3462        SELECT  count(*) l_from_value_old
3463           FROM   qp_list_lines la,
3464 		 qp_rltd_modifiers ra,
3465                  qp_rltd_modifiers rb,
3466                  qp_interface_pricing_attribs pa,
3467                  qp_pricing_attributes pb
3468        WHERE  la.orig_sys_line_ref = p_orig_sys_line_ref
3469        -- Bug 5246745 Use Composite Index for Ref columns
3470        AND    la.orig_sys_header_ref = p_orig_sys_header_ref
3471        AND    ra.to_rltd_modifier_id = la.list_line_id
3472        AND    ra.rltd_modifier_grp_type = 'PRICE BREAK'
3473        -- Got Price Break Line
3474        AND    ra.from_rltd_modifier_id = rb.from_rltd_modifier_id
3475        AND    ra.to_rltd_modifier_id <> rb.to_rltd_modifier_id
3476        -- Got Remaining Price Break Lines
3477        AND    pa.orig_sys_line_ref = la.orig_sys_line_ref
3478        -- Got Price Break Line New Values
3479        AND    rb.to_rltd_modifier_id = pb.list_line_id
3480        -- Got Remaining Price Break Lines Values
3481        AND    pa.pricing_attr_value_from=pb.pricing_attr_value_to;
3482 
3483 --ENH Continuous Price Break RAVI
3484 /**
3485 Count of new Price Breaks with Same From value
3486 **/
3487 Cursor C_from_value_new(p_orig_sys_line_ref VARCHAR2,
3488                      -- Bug 5246745 Use Composite Index for Ref columns
3489                      p_orig_sys_header_ref VARCHAR2) IS
3490        SELECT  count(*) l_from_value_new
3491           FROM   qp_list_lines la,
3492 	         qp_list_lines lb,
3493 		 qp_rltd_modifiers ra,
3494                  qp_rltd_modifiers rb,
3495                  qp_interface_pricing_attribs pa,
3496                  qp_interface_pricing_attribs pb
3497        WHERE  la.orig_sys_line_ref = p_orig_sys_line_ref
3498        -- Bug 5246745 Use Composite Index for Ref columns
3499        AND    la.orig_sys_header_ref = p_orig_sys_header_ref
3500        AND    ra.to_rltd_modifier_id = la.list_line_id
3501        AND    ra.from_rltd_modifier_id = rb.from_rltd_modifier_id
3502        AND    pa.orig_sys_line_ref = la.orig_sys_line_ref
3503        AND    rb.to_rltd_modifier_id = lb.list_line_id
3504        AND    pb.orig_sys_line_ref = lb.orig_sys_line_ref
3505        AND    ra.rltd_modifier_grp_type = 'PRICE BREAK'
3506        AND    ra.to_rltd_modifier_id <> rb.to_rltd_modifier_id
3507        AND    pa.pricing_attr_value_from=pb.pricing_attr_value_to;
3508 
3509 --ENH Continuous Price Break RAVI
3510 /**
3511 Count of Old Price Breaks with Same to value
3512 **/
3513 Cursor C_to_value_old(p_orig_sys_line_ref VARCHAR2,
3514                      -- Bug 5246745 Use Composite Index for Ref columns
3515                      p_orig_sys_header_ref VARCHAR2) IS
3516        SELECT  count(*) l_to_value_old
3517           FROM   qp_list_lines la,
3518 		 qp_rltd_modifiers ra,
3519                  qp_rltd_modifiers rb,
3520                  qp_interface_pricing_attribs pa,
3521                  qp_pricing_attributes pb
3522        WHERE  la.orig_sys_line_ref = p_orig_sys_line_ref
3523        -- Bug 5246745 Use Composite Index for Ref columns
3524        AND    la.orig_sys_header_ref = p_orig_sys_header_ref
3525        AND    ra.to_rltd_modifier_id = la.list_line_id
3526        AND    ra.rltd_modifier_grp_type = 'PRICE BREAK'
3527        -- Got Price Break Line
3528        AND    ra.from_rltd_modifier_id = rb.from_rltd_modifier_id
3529        AND    ra.to_rltd_modifier_id <> rb.to_rltd_modifier_id
3530        -- Got Remaining Price Break Lines
3531        AND    pa.orig_sys_line_ref = la.orig_sys_line_ref
3532        -- Got Price Break Line New Values
3533        AND    rb.to_rltd_modifier_id = pb.list_line_id
3534        -- Got Remaining Price Break Lines Values
3535        AND    pa.pricing_attr_value_to=pb.pricing_attr_value_from;
3536 
3537 --ENH Continuous Price Break RAVI
3538 /**
3539 Count of new Price Breaks with Same to value
3540 **/
3541 Cursor C_to_value_new(p_orig_sys_line_ref VARCHAR2,
3542                      -- Bug 5246745 Use Composite Index for Ref columns
3543                      p_orig_sys_header_ref VARCHAR2) IS
3544        SELECT  count(*) l_to_value_new
3545           FROM   qp_list_lines la,
3546 	         qp_list_lines lb,
3547 		 qp_rltd_modifiers ra,
3548                  qp_rltd_modifiers rb,
3549                  qp_interface_pricing_attribs pa,
3550                  qp_interface_pricing_attribs pb
3551        WHERE  la.orig_sys_line_ref = p_orig_sys_line_ref
3552        -- Bug 5246745 Use Composite Index for Ref columns
3553        AND    la.orig_sys_header_ref = p_orig_sys_header_ref
3554        AND    ra.to_rltd_modifier_id = la.list_line_id
3555        AND    ra.from_rltd_modifier_id = rb.from_rltd_modifier_id
3556        AND    pa.orig_sys_line_ref = la.orig_sys_line_ref
3557        AND    rb.to_rltd_modifier_id = lb.list_line_id
3558        AND    pb.orig_sys_line_ref = lb.orig_sys_line_ref
3559        AND    ra.rltd_modifier_grp_type = 'PRICE BREAK'
3560        AND    ra.to_rltd_modifier_id <> rb.to_rltd_modifier_id
3561        AND    pa.pricing_attr_value_to=pb.pricing_attr_value_from;
3562 
3563 Cursor C_Int_break_lines(p_orig_sys_line_ref VARCHAR2,
3564                      -- Bug 5246745 Use Composite Index for Ref columns
3565                      p_orig_sys_header_ref VARCHAR2,
3566                      p_request_id number) IS   -- changes done by rassharm for bug no 6028305
3567        SELECT  /*+ leading(la) index(pa QP_INTERFACE_PRCNG_ATTRIBS_N4) index(pb QP_INTERFACE_PRCNG_ATTRIBS_N4) */ --7433219
3568        'OVERLAP'
3569           FROM   qp_list_lines la,
3570 	         qp_list_lines lb,
3571 		 qp_rltd_modifiers ra,
3572                  qp_rltd_modifiers rb,
3573                  qp_interface_pricing_attribs pa,
3574                  qp_interface_pricing_attribs pb
3575        WHERE  la.orig_sys_line_ref = p_orig_sys_line_ref
3576        -- Bug 5246745 Use Composite Index for Ref columns
3577        AND    la.orig_sys_header_ref = p_orig_sys_header_ref
3578        AND    ra.to_rltd_modifier_id = la.list_line_id
3579        AND    ra.from_rltd_modifier_id = rb.from_rltd_modifier_id
3580        AND    pa.orig_sys_line_ref = la.orig_sys_line_ref
3581        AND    rb.to_rltd_modifier_id = lb.list_line_id
3582        AND    pb.orig_sys_line_ref = lb.orig_sys_line_ref
3583        AND    ra.rltd_modifier_grp_type = 'PRICE BREAK'
3584        AND    ra.to_rltd_modifier_id <> rb.to_rltd_modifier_id
3585 	AND    nvl(pa.pricing_attribute_datatype,'N') = 'N'
3586        -- changes done by rassharm for bug no 6028305
3587        AND pa.request_id=p_request_id
3588        AND pb.request_id=p_request_id
3589        -- end changes
3590 
3591        AND    (qp_number.canonical_to_number(pa.pricing_attr_value_from) < -- 4713369
3592                   qp_number.canonical_to_number(pb.pricing_attr_value_to)      AND
3593                      qp_number.canonical_to_number(pa.pricing_attr_value_from) >=
3594                      qp_number.canonical_to_number(pb.pricing_attr_value_from)
3595                      OR
3596                         qp_number.canonical_to_number(pa.pricing_attr_value_to) <=
3597                   qp_number.canonical_to_number(pb.pricing_attr_value_to)      AND
3598                      qp_number.canonical_to_number(pa.pricing_attr_value_to) >
3599                      qp_number.canonical_to_number(pb.pricing_attr_value_from)
3600                      OR
3601                         qp_number.canonical_to_number(pa.pricing_attr_value_from) <=
3602                   qp_number.canonical_to_number(pb.pricing_attr_value_from)    AND
3603                      qp_number.canonical_to_number(pa.pricing_attr_value_to) >=
3604                      qp_number.canonical_to_number(pb.pricing_attr_value_to));
3605 
3606 BEGIN
3607 qp_bulk_loader_pub.write_log('Entering Entity pricing attribute validation');
3608 FND_PROFILE.GET('QP_PRICING_TRANSACTION_ENTITY',l_pte_code);
3609 
3610 FOR I IN 1..p_pricing_attr_rec.orig_sys_pricing_attr_ref.COUNT
3611 LOOP
3612 
3613 --Initially setting the message context.
3614 
3615 l_msg_rec.REQUEST_ID := P_PRICING_ATTR_REC.REQUEST_ID(I);
3616 l_msg_rec.ENTITY_TYPE := 'PRL';
3617 l_msg_rec.TABLE_NAME := 'QP_INTERFACE_PRICING_ATTRIBS';
3618 l_msg_rec.ORIG_SYS_HEADER_REF := p_pricing_attr_rec.orig_sys_header_ref(I);
3619 l_msg_rec.ORIG_SYS_LINE_REF := p_pricing_attr_rec.orig_sys_line_ref(I);
3620 l_msg_rec.ORIG_SYS_QUALIFIER_REF := NULL;
3621 l_msg_rec.ORIG_SYS_PRICING_ATTR_REF := p_pricing_attr_rec.orig_sys_pricing_attr_ref(I);
3622 
3623  qp_bulk_loader_pub.write_log('Inside entity pricing attr');
3624 -- Internal field population
3625 --List Line ID
3626  BEGIN
3627  select list_line_id
3628    into p_pricing_attr_rec.list_line_id(I)
3629    from qp_list_lines
3630   where orig_sys_line_ref = p_pricing_attr_rec.orig_sys_line_ref(I)
3631     and orig_sys_header_ref  = p_pricing_attr_rec.orig_sys_header_ref(I);
3632 
3633  EXCEPTION
3634      WHEN NO_DATA_FOUND THEN
3635 	p_pricing_attr_rec.list_line_id(I) := -1;
3636         p_pricing_attr_rec.process_status_flag(I):=NULL;
3637 	fnd_message.set_name('QP', 'QP_INVALID_LINE_REF');
3638         FND_MESSAGE.SET_TOKEN('REF_NO', p_pricing_attr_rec.orig_sys_line_ref(I));
3639         qp_bulk_msg.add(l_msg_rec);
3640  END;
3641  qp_bulk_loader_pub.write_log('After entity list_line_id pricing attribute');
3642 
3643 
3644  -- Bug# 5246745 RAVI START
3645  --2 If org is Purchasing or PO then the item must be Purchasable or Orderable.
3646  IF p_pricing_attr_rec.product_attribute_context(I)='ITEM' AND
3647     p_pricing_attr_rec.product_attribute(I)= 'PRICING_ATTRIBUTE1'
3648  THEN
3649     l_pa_count :=0;
3650     IF fnd_global.resp_appl_id=178 OR fnd_global.resp_appl_id=201
3651     THEN --Check if item is purchasing enabled
3652        Begin
3653           select count(*) into l_pa_count
3654           from qp_interface_pricing_attribs qipa, mtl_system_items msi
3655           where qipa.orig_sys_pricing_attr_ref = p_pricing_attr_rec.orig_sys_pricing_attr_ref(I)
3656           and qipa.request_id = P_PRICING_ATTR_REC.REQUEST_ID(I)
3657           and qipa.product_attribute_context = 'ITEM'
3658           and qipa.product_attribute = 'PRICING_ATTRIBUTE1'
3659           and msi.inventory_item_id = to_number(qipa.PRODUCT_ATTR_VALUE)
3660           and msi.organization_id = fnd_profile.value('QP_ORGANIZATION_ID')
3661           and msi.purchasing_enabled_flag = 'Y'
3662           and qipa.interface_action_code in ('INSERT','UPDATE');
3663        Exception
3664           when NO_DATA_FOUND then
3665              l_pa_count := 0;
3666        End;
3667     ELSE --Check if item is orderable
3668        Begin
3669           select count(*) into l_pa_count
3670           from qp_interface_pricing_attribs qipa, mtl_system_items msi
3671           where qipa.orig_sys_pricing_attr_ref = p_pricing_attr_rec.orig_sys_pricing_attr_ref(I)
3672           and qipa.request_id = P_PRICING_ATTR_REC.REQUEST_ID(I)
3673           and qipa.product_attribute_context = 'ITEM'
3674           and qipa.product_attribute = 'PRICING_ATTRIBUTE1'
3675           and msi.inventory_item_id = to_number(qipa.PRODUCT_ATTR_VALUE)
3676           and msi.organization_id = fnd_profile.value('QP_ORGANIZATION_ID')
3677           and msi.CUSTOMER_ORDER_flag = 'Y'
3678           and qipa.interface_action_code in ('INSERT','UPDATE');
3679        Exception
3680           when NO_DATA_FOUND then
3681              l_pa_count := 0;
3682        End;
3683     END IF;
3684     if l_pa_count=0 then
3685        p_pricing_attr_rec.process_status_flag(I):=NULL;
3686        FND_MESSAGE.SET_NAME('QP', 'QP_INVALID_ATTRIBUTE');
3687        fnd_message.set_token('ATTRIBUTE', 'PRODUCT_ATTRIBUTE_VALUE');
3688        qp_bulk_msg.add(l_msg_rec);
3689     end if;
3690  END IF;
3691  -- Bug# 5246745 RAVI END
3692 
3693   --list_header_id
3694 
3695  BEGIN
3696  select list_header_id
3697    into p_pricing_attr_rec.list_header_id(I)
3698    from qp_list_headers_b
3699   where orig_system_header_ref = p_pricing_attr_rec.orig_sys_header_ref(I);
3700  EXCEPTION
3701      WHEN NO_DATA_FOUND THEN
3702 	p_pricing_attr_rec.list_header_id(I) := -1;
3703         p_pricing_attr_rec.process_status_flag(I):=NULL;
3704 	fnd_message.set_name('QP', 'QP_INVALID_HEADER_REF');
3705         FND_MESSAGE.SET_TOKEN('REF_NO', p_pricing_attr_rec.orig_sys_header_ref(I));
3706         FND_MESSAGE.SET_TOKEN('LS_CODE', NULL);
3707         qp_bulk_msg.add(l_msg_rec);
3708  END;
3709 
3710   -- Excluder Flag
3711  p_pricing_attr_rec.excluder_flag(I):='N';
3712  p_pricing_attr_rec.accumulate_flag(I):='N';
3713 
3714  -- Attribute Grouping No
3715 
3716  IF p_pricing_attr_rec.interface_action_code(I) = 'INSERT' THEN
3717      Select qp_pricing_attr_group_no_s.nextval
3718        into p_pricing_attr_rec.attribute_grouping_no(I)
3719        from dual;
3720  END IF;
3721 
3722  p_pricing_attr_rec.pricing_phase_id(I):=1;
3723 
3724  -- Check for the uniqueness of orig_sys_pricing_attr_ref
3725  l_exist:=null;
3726  BEGIN
3727       SELECT 1,pricing_attribute_id INTO l_exist,l_pricing_attribute_id
3728 	FROM qp_pricing_attributes
3729        WHERE orig_sys_pricing_attr_ref = p_pricing_attr_rec.orig_sys_pricing_attr_ref(I)
3730          AND orig_sys_line_ref = p_pricing_attr_rec.orig_sys_line_ref(I)
3731          AND orig_sys_header_ref =  p_pricing_attr_rec.orig_sys_header_ref(I);
3732  EXCEPTION
3733  WHEN NO_DATA_FOUND THEN
3734     l_exist:=0;
3735  END;
3736 
3737  IF p_pricing_attr_rec.interface_action_code(I) = 'INSERT' AND l_exist = 1 THEN
3738         p_pricing_attr_rec.process_status_flag(I):=NULL;
3739 	fnd_message.set_name('QP', 'ORIG_SYS_PRC_ATTR_REF_NOT_UNIQ');
3740         FND_MESSAGE.SET_TOKEN('REF_NO', p_pricing_attr_rec.orig_sys_pricing_attr_ref(I));
3741         qp_bulk_msg.add(l_msg_rec);
3742  ELSIF p_pricing_attr_rec.interface_action_code(I) = 'UPDATE' AND l_exist = 0 THEN
3743         p_pricing_attr_rec.process_status_flag(I):=NULL;
3744 	fnd_message.set_name('QP', 'PRC_ATTR_REC_DOES_NOT_EXIST');
3745         FND_MESSAGE.SET_TOKEN('REF_NO', p_pricing_attr_rec.orig_sys_pricing_attr_ref(I));
3746         qp_bulk_msg.add(l_msg_rec);
3747  END IF;
3748 
3749  IF p_pricing_attr_rec.interface_action_code(I) = 'INSERT' THEN
3750   l_exist:=null;
3751   BEGIN
3752       SELECT count(*) INTO l_exist
3753 	FROM qp_interface_pricing_attribs
3754        WHERE request_id = p_pricing_attr_rec.request_id(I)
3755 	 AND orig_sys_pricing_attr_ref = p_pricing_attr_rec.orig_sys_pricing_attr_ref(I)
3756 	 AND orig_sys_line_ref = p_pricing_attr_rec.orig_sys_line_ref(I)
3757          AND orig_sys_header_ref =  p_pricing_attr_rec.orig_sys_header_ref(I);
3758 
3759  EXCEPTION
3760  WHEN NO_DATA_FOUND THEN
3761     l_exist:=0;
3762  END;
3763 
3764  IF l_exist > 1 THEN
3765         p_pricing_attr_rec.process_status_flag(I):=NULL;
3766 	fnd_message.set_name('QP', 'ORIG_SYS_PRC_ATTR_REF_NOT_UNIQ');
3767         FND_MESSAGE.SET_TOKEN('REF_NO', p_pricing_attr_rec.orig_sys_pricing_attr_ref(I));
3768         qp_bulk_msg.add(l_msg_rec);
3769  END IF;
3770  END IF;
3771 
3772      -- Functional Area Validation for Hierarchical Categories (sfiresto)
3773     IF p_PRICING_ATTR_rec.product_attribute_context(I) = 'ITEM' AND
3774        p_PRICING_ATTR_rec.product_attribute(I) = 'PRICING_ATTRIBUTE2' THEN
3775         BEGIN
3776 
3777           SELECT nvl(pte_code, fnd_profile.value('QP_PRICING_TRANSACTION_ENTITY')),
3778                  nvl(source_system_code, fnd_profile.value('QP_SOURCE_SYSTEM_CODE'))
3779           INTO l_pte_code, l_ss_code
3780           FROM qp_interface_list_headers
3781           WHERE orig_sys_header_ref = p_PRICING_ATTR_rec.orig_sys_header_ref(I);
3782 
3783           QP_UTIL.Get_Item_Cat_Info(
3784              p_PRICING_ATTR_rec.product_attr_value(I),
3785              l_pte_code,
3786              l_ss_code,
3787              l_fna_name,
3788              l_fna_desc,
3789              l_fna_valid);
3790 
3791           IF NOT l_fna_valid THEN
3792 
3793             P_PRICING_ATTR_REC.process_status_flag(I):=NULL;
3794 
3795             FND_MESSAGE.set_name('QP', 'QP_INVALID_CAT_FUNC_PTE');
3796             FND_MESSAGE.set_token('CATID', p_PRICING_ATTR_REC.product_attr_value(I));
3797             FND_MESSAGE.set_token('PTE', l_pte_code);
3798             FND_MESSAGE.set_token('SS', l_ss_code);
3799             QP_BULK_MSG.Add(L_MSG_REC);
3800 
3801           END IF;
3802 
3803         END;
3804     END IF;
3805 
3806  ----- Getting product_attribute_datatype -----
3807  QP_UTIL.GET_PROD_FLEX_PROPERTIES(p_pricing_attr_rec.product_attribute_context(I),
3808 				  p_pricing_attr_rec.product_attribute(I),
3809 				  p_pricing_attr_rec.product_attr_value(I),
3810 				  l_datatype,
3811 				  l_precedence,
3812 				  l_error_code);
3813  IF l_datatype IS NOT NULL THEN
3814     p_pricing_attr_rec.product_attribute_datatype(I):=l_datatype;
3815  ELSE
3816     p_pricing_attr_rec.process_status_flag(I):=NULL;
3817     fnd_message.set_name('QP', 'QP_ATTRIBUTE_REQUIRED');
3818     FND_MESSAGE.SET_TOKEN('ATTRIBUTE','Product Attribute Datatype');
3819     qp_bulk_msg.add(l_msg_rec);
3820  END IF;
3821 
3822   qp_bulk_loader_pub.write_log('After entity pricing attribute');
3823 
3824 -- product uom code
3825 
3826  IF P_PRICING_ATTR_REC.PRODUCT_UOM_CODE(I) IS NULL THEN
3827     P_PRICING_ATTR_REC.process_status_flag(I):=NULL;
3828     FND_MESSAGE.SET_NAME('QP','QP_ATTRIBUTE_REQUIRED');
3829     FND_MESSAGE.SET_TOKEN('ATTRIBUTE',QP_PRC_UTIL.Get_Attribute_Name('PRODUCT_UOM_CODE'));
3830     QP_BULK_MSG.ADD(L_MSG_REC);
3831  END IF;
3832 
3833 
3834  --- check for single pricing_attribute record with pricing context/attr/value null
3835   qp_bulk_loader_pub.write_log('Pricing attr ref' || p_pricing_attr_rec.orig_sys_pricing_attr_ref(I));
3836   IF p_pricing_attr_rec.pricing_attribute_context(I) IS NULL
3837     OR p_pricing_attr_rec.pricing_attribute(I) IS NULL THEN
3838      l_exist := 0;
3839      BEGIN
3840 	SELECT count(*) INTO l_exist
3841 	  FROM qp_pricing_attributes
3842 	 WHERE orig_sys_line_ref = p_pricing_attr_rec.orig_sys_line_ref(I)
3843 	   AND orig_sys_header_ref = p_pricing_attr_rec.orig_sys_header_ref(I)
3844 	   AND pricing_attribute_context IS NULL
3845            AND pricing_attribute IS NULL
3846            AND orig_sys_pricing_attr_ref <> p_pricing_attr_rec.orig_sys_pricing_attr_ref(I)
3847            AND (pricing_attr_value_from IS NULL OR pricing_Attr_value_to IS NULL);
3848       EXCEPTION
3849 	 WHEN NO_DATA_FOUND THEN
3850 	    l_exist := 0;
3851       END;
3852 
3853       qp_bulk_loader_pub.write_log('Count of records in Pricing Attr table with pricing contect/attr/value null' || to_char(l_exist));
3854       l_exist1:=null;
3855       BEGIN
3856 	SELECT count(*) INTO l_exist1
3857 	  FROM qp_interface_pricing_attribs
3858 	 WHERE request_id = p_pricing_attr_rec.request_id(I)
3859 	   AND orig_sys_line_ref = p_pricing_attr_rec.orig_sys_line_ref(I)
3860 	   AND orig_sys_header_ref = p_pricing_attr_rec.orig_sys_header_ref(I)
3861 	    AND orig_sys_pricing_attr_ref <> p_pricing_attr_rec.orig_sys_pricing_attr_ref(I)
3862 	   AND pricing_attribute_context IS NULL
3863            AND pricing_attribute IS NULL
3864            AND (pricing_attr_value_from IS NULL OR pricing_attr_value_to IS NULL);
3865       EXCEPTION
3866 	 WHEN NO_DATA_FOUND THEN
3867 	    l_exist1 := 0;
3868       END;
3869 
3870       qp_bulk_loader_pub.write_log('Count of records in Int table with pricing contect/attr/value null' || to_char(l_exist1));
3871       IF l_exist > 0 THEN
3872 	 p_pricing_attr_rec.process_status_flag(I):=NULL;
3873 	 FND_MESSAGE.SET_NAME('QP','QP_BULK_PRC_ATTR_ERROR');
3874 	 QP_BULK_MSG.ADD(l_msg_rec);
3875       END IF;
3876       IF l_exist1 > 0 THEN
3877 	 p_pricing_attr_rec.process_status_flag(I):=NULL;
3878 	 FND_MESSAGE.SET_NAME('QP','QP_BULK_INT_PRC_ATTR_ERROR');
3879 	 QP_BULK_MSG.ADD(l_msg_rec);
3880       END IF;
3881 
3882     END IF;
3883 
3884 -- Basic_Pricing_Condition
3885     IF QP_BULK_LOADER_PUB.GET_QP_STATUS <> 'I' THEN
3886       IF p_pricing_attr_rec.pricing_attribute_context(I) IS NOT NULL
3887 	AND p_pricing_attr_rec.pricing_attribute(I) IS NOT NULL THEN
3888 	 l_exist := 0;
3889 	 BEGIN
3890 	    SELECT count(*) INTO l_exist
3891 	      FROM qp_pricing_attributes
3892 	     WHERE orig_sys_line_ref = p_pricing_attr_rec.orig_sys_line_ref(I)
3893 	       AND orig_sys_header_ref = p_pricing_attr_rec.orig_sys_header_ref(I)
3894 	       AND pricing_attribute_context <> p_pricing_attr_rec.pricing_attribute_context(I)
3895 	       AND orig_sys_pricing_attr_ref <> p_pricing_attr_rec.orig_sys_pricing_attr_ref(I);
3896 	  EXCEPTION
3897 	     WHEN NO_DATA_FOUND THEN
3898 		l_exist := 0;
3899 	  END;
3900 
3901 	  l_exist1:=null;
3902 	  BEGIN
3903 	    SELECT count(*) INTO l_exist1
3904 	      FROM qp_interface_pricing_attribs
3905 	     WHERE request_id = p_pricing_attr_rec.request_id(I)
3906 	       AND orig_sys_line_ref = p_pricing_attr_rec.orig_sys_line_ref(I)
3907 	       AND orig_sys_header_ref = p_pricing_attr_rec.orig_sys_header_ref(I)
3908 		AND orig_sys_pricing_attr_ref <> p_pricing_attr_rec.orig_sys_pricing_attr_ref(I)
3909 	       AND pricing_attribute_context <> p_pricing_attr_rec.pricing_attribute_context(I);
3910 	  EXCEPTION
3911 	     WHEN NO_DATA_FOUND THEN
3912 		l_exist1 := 0;
3913 	  END;
3914 	  IF l_exist > 0 OR l_exist1 > 0 THEN
3915 	     p_pricing_attr_rec.process_status_flag(I):=NULL;
3916 	     FND_MESSAGE.SET_NAME('QP','QP_1_PRIC_CONT_FOR_BASIC');
3917 	     --Only one pricing context allwed in Basic Pricing
3918 	     QP_BULK_MSG.ADD(l_msg_rec);
3919 	  END IF;
3920 
3921       END IF;
3922     END IF;
3923 
3924 -- Basic_Pricing_Condition
3925     IF QP_BULK_LOADER_PUB.GET_QP_STATUS <> 'I' THEN
3926        IF p_pricing_attr_rec.pricing_attribute_context(I) IS NOT NULL AND
3927 	  p_pricing_attr_rec.pricing_attribute(I) IS NOT NULL	THEN
3928 	BEGIN
3929 		select s.availability_in_basic
3930 		into   l_availability_in_basic
3931 		from   qp_segments_b s, qp_prc_contexts_b c
3932 		where  s.prc_context_id = c.prc_context_id
3933 		and    c.prc_context_code = p_pricing_attr_rec.pricing_attribute_context(I)
3934 		and    s.segment_mapping_column = p_pricing_attr_rec.pricing_attribute(I)
3935 		and    s.availability_in_basic = 'Y';
3936 	EXCEPTION
3937 		WHEN NO_DATA_FOUND THEN
3938 		 p_pricing_attr_rec.process_status_flag(I):=NULL;
3939 		 FND_MESSAGE.SET_NAME('QP','QP_PRIC_CONTXT_NA_BASIC');
3940 		 --Pricing Attribute Context not allowed in Basic Pricing
3941 		 QP_BULK_MSG.ADD(l_msg_rec);
3942 	END;
3943 
3944        END IF;
3945 
3946        IF p_pricing_attr_rec.product_attribute_context(I) IS NOT NULL AND
3947 	  p_pricing_attr_rec.product_attribute(I) IS NOT NULL	THEN
3948 	BEGIN
3949 		select s.availability_in_basic
3950 		into   l_availability_in_basic
3951 		from   qp_segments_b s, qp_prc_contexts_b c
3952 		where  s.prc_context_id = c.prc_context_id
3953 		and    c.prc_context_code = p_pricing_attr_rec.product_attribute_context(I)
3954 		and    s.segment_mapping_column = p_pricing_attr_rec.product_attribute(I)
3955 		and    s.availability_in_basic = 'Y';
3956 	EXCEPTION
3957 		WHEN NO_DATA_FOUND THEN
3958 		 p_pricing_attr_rec.process_status_flag(I):=NULL;
3959 		 FND_MESSAGE.SET_NAME('QP','QP_PROD_CONTXT_NA_BASIC');
3960 		 --Product Attribute Context not allowed in Basic Pricing
3961 		 QP_BULK_MSG.ADD(l_msg_rec);
3962 	END;
3963       END IF;
3964     END IF;
3965  --- check for consistency of product context/att/val among the attributes
3966 
3967     BEGIN
3968        l_exist := NULL;
3969        SELECT count(*) INTO l_exist
3970 	 FROM qp_pricing_attributes
3971         WHERE orig_sys_line_ref = p_pricing_attr_rec.orig_sys_line_ref(I)
3972 	  AND orig_sys_header_ref = p_pricing_attr_rec.orig_sys_header_ref(I)
3973 	  AND product_attribute_context <> p_pricing_attr_rec.product_attribute_context(I)
3974 	  AND product_attribute <> p_pricing_attr_rec.product_attribute(I)
3975 	  AND product_attr_value <> p_pricing_attr_rec.product_attr_value(I);
3976      EXCEPTION
3977 	WHEN NO_DATA_FOUND THEN
3978 	   l_exist:=0;
3979      END;
3980 
3981     BEGIN
3982        l_exist1 := NULL;
3983        SELECT /*+ index(qipa QP_INTERFACE_PRCNG_ATTRIBS_N2) */ --7433219
3984        count(*) INTO l_exist1
3985 	 FROM qp_interface_pricing_attribs
3986         WHERE request_id = p_pricing_attr_rec.request_id(I)
3987 	  AND process_status_flag = 'P' --is null
3988 	  AND orig_sys_line_ref = p_pricing_attr_rec.orig_sys_line_ref(I)
3989 	  AND orig_sys_header_ref = p_pricing_attr_rec.orig_sys_header_ref(I)
3990 	  AND product_attribute_context <> p_pricing_attr_rec.product_attribute_context(I)
3991 	  AND product_attribute <> p_pricing_attr_rec.product_attribute(I)
3992 	  AND product_attr_value <> p_pricing_attr_rec.product_attr_value(I);
3993      EXCEPTION
3994 	WHEN NO_DATA_FOUND THEN
3995 	   l_exist1:=0;
3996      END;
3997 
3998      IF l_exist >0 OR l_exist1>0 THEN
3999 	 p_pricing_attr_rec.process_status_flag(I):=NULL;
4000 	 FND_MESSAGE.SET_NAME('QP', 'INVALID_PROD_CONTEXT_ATTR_PAIR');
4001 	 QP_BULK_MSG.ADD(l_msg_rec);
4002      END IF;
4003 
4004  -- check for pricing atributes
4005      IF (p_Pricing_Attr_rec.pricing_attribute_context(I) IS NOT NULL
4006 	 OR p_Pricing_Attr_rec.pricing_attribute(I) IS NOT NULL
4007 	 OR p_Pricing_Attr_rec.pricing_attr_value_from(I) IS NOT NULL
4008 	 OR p_Pricing_Attr_rec.pricing_attr_value_to(I) IS NOT NULL)
4009      THEN
4010 	IF (p_Pricing_Attr_rec.pricing_attribute_context(I) IS NULL
4011 	    OR p_Pricing_Attr_rec.pricing_attribute(I) IS NULL
4012 	    OR p_Pricing_Attr_rec.comparison_operator_code(I) IS NULL)
4013         THEN
4014 	 p_pricing_attr_rec.process_status_flag(I):=NULL;
4015 	 IF p_Pricing_Attr_rec.pricing_attribute_context(I) IS NULL THEN
4016 	     FND_MESSAGE.SET_NAME('QP','QP_ATTRIBUTE_REQUIRED'  );
4017 	     FND_MESSAGE.SET_TOKEN('ATTRIBUTE', 'PRICING_ATTRIBUTE_CONTEXT');
4018 	     QP_BULK_MSG.ADD(l_msg_rec);
4019 	 END IF;
4020 	 IF p_Pricing_Attr_rec.pricing_attribute(I) IS NULL THEN
4021 	     IF p_Pricing_Attr_rec.pricing_attr_code(I) IS NULL THEN
4022 		 FND_MESSAGE.SET_NAME('QP','QP_ATTRIBUTE_REQUIRED'  );
4023 		 FND_MESSAGE.SET_TOKEN('ATTRIBUTE', 'PRICING_ATTRIBUTE');
4024 		 QP_BULK_MSG.ADD(l_msg_rec);
4025 	     ELSE
4026 		 FND_MESSAGE.SET_NAME('QP','QP_VALUE_TO_ID_ERROR'  );
4027 		 FND_MESSAGE.SET_TOKEN('ATTRIBUTE', 'PRICING_ATTRIBUTE');
4028 		 QP_BULK_MSG.ADD(l_msg_rec);
4029 	     END IF;
4030 	 END IF;
4031 	 IF p_Pricing_Attr_rec.comparison_operator_code(I) IS NULL THEN
4032 	     FND_MESSAGE.SET_NAME('QP','QP_ATTRIBUTE_REQUIRED'  );
4033 	     FND_MESSAGE.SET_TOKEN('ATTRIBUTE', 'COMPARISON_OPERATOR_CODE');
4034 	     QP_BULK_MSG.ADD(l_msg_rec);
4035 	 END IF;
4036         ELSE
4037 	   QP_UTIL.validate_qp_flexfield(flexfield_name  =>'QP_ATTR_DEFNS_PRICING'
4038 					 ,context =>p_Pricing_Attr_rec.pricing_attribute_context(I)
4039 					 ,attribute =>p_Pricing_Attr_rec.pricing_attribute(I)
4040 					 ,value =>p_Pricing_Attr_rec.pricing_attr_value_from(I)
4041 					 ,application_short_name         => 'QP'
4042 					 ,context_flag                   =>l_context_error
4043 					 ,attribute_flag                 =>l_attribute_error
4044 					 ,value_flag                     =>l_value_error
4045 					 ,datatype                       =>l_datatype
4046 					 ,precedence                      =>l_precedence
4047 					 ,error_code                     =>l_error_code
4048 					 );
4049 
4050 	   If (l_context_error = 'N'  AND l_error_code = 7)       --  invalid context
4051 	   Then
4052 	      p_pricing_attr_rec.process_status_flag(I):=NULL;
4053 	      FND_MESSAGE.SET_NAME('QP','QP_ATTRIBUTE_REQUIRED'  );
4054 	      FND_MESSAGE.SET_TOKEN('ATTRIBUTE',
4055 				    QP_PRC_UTIL.Get_Attribute_Name('PRICING_ATTRIBUTE_CONTEXT'));
4056 
4057 	      QP_BULK_MSG.Add(l_msg_rec);
4058 	   END IF;
4059 
4060 	   If l_attribute_error = 'N'   AND l_error_code = 8    --  invalid Attribute
4061 					    Then
4062 	      p_pricing_attr_rec.process_status_flag(I):=NULL;
4063 	      FND_MESSAGE.SET_NAME('QP','QP_INVALID_ATTRIBUTE');
4064 	      FND_MESSAGE.SET_TOKEN('ATTRIBUTE',' Attribute');
4065 	      QP_BULK_MSG.Add(l_msg_rec);
4066 	   END IF;
4067 
4068 	   IF p_pricing_Attr_rec.comparison_operator_code(I) = '=' Then
4069 
4070 	      If l_value_error = 'N'  AND l_error_code = 9      --  invalid value
4071 					  Then
4072 		 p_pricing_attr_rec.process_status_flag(I):=NULL;
4073 		 FND_MESSAGE.SET_NAME('QP','QP_INVALID_ATTRIBUTE');
4074 		 FND_MESSAGE.SET_TOKEN('ATTRIBUTE',' Value From ');
4075 		 QP_BULK_MSG.Add(l_msg_rec);
4076 	      End If;
4077 	   END IF;
4078 
4079 	   p_pricing_attr_rec.pricing_attribute_datatype(I):=l_datatype;
4080 
4081 	   IF p_Pricing_Attr_rec.pricing_attribute_context(I) = 'VOLUME' AND
4082              p_Pricing_Attr_rec.pricing_attribute(I) = 'PRICING_ATTRIBUTE12'
4083                    --When Pricing Context is 'Volume' and Attribute is 'Item Amount'
4084            THEN
4085               p_pricing_attr_rec.process_status_flag(I):=NULL;
4086               FND_MESSAGE.SET_NAME('QP','QP_INVALID_ATTRIBUTE');
4087               FND_MESSAGE.SET_TOKEN('ATTRIBUTE','Pricing Attribute');
4088               QP_BULK_MSG.Add(l_msg_rec);
4089 	   END IF;
4090 
4091 --validation for canonical form
4092 l_error_code:=QP_UTIL.validate_num_date(p_Pricing_Attr_rec.pricing_attribute_datatype(I),
4093 					p_Pricing_Attr_rec.pricing_attr_value_from(I));
4094         IF l_error_code  <> 0  THEN
4095               p_pricing_attr_rec.process_status_flag(I):=NULL;
4096                FND_MESSAGE.SET_NAME('QP','QP_INVALID_ATTRIBUTE');
4097                FND_MESSAGE.SET_TOKEN('ATTRIBUTE','Value From ');
4098               QP_BULK_MSG.Add(l_msg_rec);
4099      END IF;
4100 
4101  -- Validation for Value_To
4102 
4103          IF p_Pricing_Attr_rec.pricing_attribute_context(I) IS NOT NULL AND
4104             p_Pricing_Attr_rec.pricing_attribute(I) IS NOT NULL AND
4105                   UPPER(p_Pricing_Attr_rec.comparison_operator_code(I)) = 'BETWEEN' AND
4106                     (p_Pricing_Attr_rec.pricing_attr_value_to(I) IS NULL OR
4107                         p_Pricing_Attr_rec.pricing_attr_value_from(I) IS NULL)
4108       THEN
4109                    p_pricing_attr_rec.process_status_flag(I):=NULL;
4110                    FND_MESSAGE.SET_NAME('QP','QP_ATTRIBUTE_REQUIRED'  );
4111                    FND_MESSAGE.SET_TOKEN('ATTRIBUTE',
4112 			QP_PRC_UTIL.Get_Attribute_Name('PRICING_ATTR_VALUE_TO')||'/'||
4113                       	QP_PRC_UTIL.Get_Attribute_Name('PRICING_ATTR_VALUE_FROM'));
4114               QP_BULK_MSG.Add(l_msg_rec);
4115       END IF;
4116 
4117  -- validate value from
4118 
4119          IF p_Pricing_Attr_rec.pricing_attribute_context(I) IS NOT NULL AND
4120             p_Pricing_Attr_rec.pricing_attribute(I) IS NOT NULL AND
4121                   UPPER(p_Pricing_Attr_rec.comparison_operator_code(I)) <> 'BETWEEN' AND
4122                         p_Pricing_Attr_rec.pricing_attr_value_from(I) IS NULL
4123        THEN
4124                    p_pricing_attr_rec.process_status_flag(I):=NULL;
4125                    FND_MESSAGE.SET_NAME('QP','QP_ATTRIBUTE_REQUIRED'  );
4126                    FND_MESSAGE.SET_TOKEN('ATTRIBUTE',
4127 			QP_PRC_UTIL.Get_Attribute_Name('PRICING_ATTR_VALUE_FROM'));
4128                     QP_BULK_MSG.Add(l_msg_rec);
4129         END IF;
4130 
4131    l_error_code:=QP_UTIL.validate_num_date(p_Pricing_Attr_rec.pricing_attribute_datatype(I),
4132   		             		     p_Pricing_Attr_rec.pricing_attr_value_to(I));
4133 
4134          IF l_error_code  <> 0  THEN
4135                 p_pricing_attr_rec.process_status_flag(I):=NULL;
4136                 FND_MESSAGE.SET_NAME('QP','QP_INVALID_ATTRIBUTE');
4137                 FND_MESSAGE.SET_TOKEN('ATTRIBUTE','Value To ');
4138                 QP_BULK_MSG.Add(l_msg_rec);
4139         END IF;
4140 
4141       END IF;  -- Else
4142 
4143  END IF;  -- pricing attr pair not null
4144 
4145    IF ( p_Pricing_Attr_rec.pricing_attribute_context(I) is not null
4146 	 or   p_Pricing_Attr_rec.pricing_attribute(I) is not null ) then
4147 
4148     IF p_Pricing_Attr_rec.comparison_operator_code(I) is null then
4149        p_pricing_attr_rec.process_status_flag(I) :=NULL; --'E';
4150        FND_MESSAGE.SET_NAME('QP','QP_ATTRIBUTE_REQUIRED'  );
4151        FND_MESSAGE.SET_TOKEN('ATTRIBUTE',
4152 			     QP_PRC_UTIL.Get_Attribute_Name('COMPARISON_OPERATOR_CODE'));
4153        QP_BULK_MSG.Add(l_msg_rec);
4154     ElSE
4155 	 SELECT  lookup_code
4156            INTO  l_comparison_operator_code
4157            FROM  QP_LOOKUPS
4158           WHERE  LOOKUP_TYPE = 'COMPARISON_OPERATOR'
4159             AND  LOOKUP_CODE = UPPER(p_Pricing_Attr_rec.comparison_operator_code(I));
4160 
4161        If SQL%NOTFOUND
4162        Then
4163 	  p_pricing_attr_rec.process_status_flag(I) :=NULL; --'E';
4164 	  FND_MESSAGE.SET_NAME('QP','QP_ATTRIBUTE_REQUIRED'  );
4165 	  FND_MESSAGE.SET_TOKEN('ATTRIBUTE',
4166 				QP_PRC_UTIL.Get_Attribute_Name('COMPARISON_OPERATOR_CODE'));
4167 	  QP_BULK_MSG.Add(l_msg_rec);
4168        END IF;
4169 
4170     END IF; /* comparison_operator_code is null */
4171 
4172     l_exist := 0;
4173     begin
4174        SELECT  1
4175        into l_exist
4176        FROM qp_interface_pricing_attribs b, qp_prc_contexts_b d,
4177 	    qp_segments_b e, qp_pte_segments f
4178        WHERE orig_sys_pricing_attr_ref = p_pricing_attr_rec.orig_sys_pricing_attr_ref(I)
4179         AND  b.product_attribute_context = d.prc_context_code
4180 	AND b.product_attribute = e.segment_mapping_column
4181 	AND d.prc_context_id = e.prc_context_id
4182 	AND d.prc_context_type = 'PRICING_ATTRIBUTE'
4183 	AND e.segment_id = f.segment_id
4184 	AND f.pte_code = l_pte_code
4185 	AND f.segment_level <> 'LINE';
4186    exception
4187 	when others then
4188 		null;
4189    end;
4190    if l_exist > 0 then
4191       p_pricing_attr_rec.process_status_flag(I) :=NULL; --'E';
4192       FND_MESSAGE.SET_NAME('QP','QP_INVALID_ATTRIBUTE');
4193       FND_MESSAGE.SET_TOKEN('ATTRIBUTE', 'PRICING ATTRIBUTE');
4194       QP_BULK_MSG.Add(l_msg_rec);
4195    end if;
4196 
4197  END IF; /* context or atttribute is not null */
4198 
4199  -- price break child line can have only VOLUME pricing context
4200 
4201  IF  p_pricing_attr_rec.process_status_flag(I)='P' --<> 'E'
4202  THEN
4203    BEGIN
4204     --Bug# 5528754 RAVI
4205     --Check if the pricing attribute is for a PRICE BREAK
4206     SELECT /*+ index(l qp_list_lines_n11) index(r qp_rltd_modifiers_n2) */ --bug 9247305
4207      r.rltd_modifier_grp_type
4208       INTO l_pa_price_break
4209      FROM  qp_list_lines l, qp_rltd_modifiers r
4210     WHERE  l.orig_sys_line_ref = p_pricing_attr_rec.orig_sys_line_ref(I)
4211       -- Bug 5246745 Use Composite Index for Ref columns
4212       AND  l.orig_sys_header_ref = p_pricing_attr_rec.orig_sys_header_ref(I)
4213       AND  r.to_rltd_modifier_id = l.list_line_id
4214       AND  r.rltd_modifier_grp_type = 'PRICE BREAK';
4215 
4216     IF    p_pricing_attr_rec.pricing_attribute_context(I) IS NULL THEN
4217 	  p_pricing_attr_rec.process_status_flag(I) :=NULL; --'E';
4218 	  FND_MESSAGE.SET_NAME('QP','QP_ATTRIBUTE_REQUIRED');
4219           FND_MESSAGE.SET_TOKEN('ATTRIBUTE', 'Pricing Attribute Context');
4220 	  QP_BULK_MSG.Add(l_msg_rec);
4221     ELSIF p_pricing_attr_rec.pricing_attribute_context(I)<>'VOLUME' THEN
4222 	  p_pricing_attr_rec.process_status_flag(I) :=NULL; --'E';
4223 	  FND_MESSAGE.SET_NAME('QP','PBH_CHILD_LINE_INVALID_CONTEXT');
4224 	  QP_BULK_MSG.Add(l_msg_rec);
4225     END IF;
4226 
4227     EXCEPTION
4228       WHEN NO_DATA_FOUND THEN
4229         --Bug 5649050 (If this pricing attribute is not for a price break then set it back to default)
4230         l_pa_price_break :='PRICE LIST LINE';
4231     END;
4232  END IF;
4233 
4234    --  qp_bulk_loader_pub.write_log('check 5');
4235 
4236   --check for duplicate primary uom flag set
4237    --check for duplicate primary uom flag set --smbalara 9458481/10152629 /10152629  start
4238  IF p_pricing_attr_rec.process_status_flag(I)='P' THEN -- IS NULL THEN
4239 
4240      /* SELECT  primary_uom_flag
4241 	INTO  l_primary_uom_flag
4242 	FROM  qp_list_lines
4243        WHERE  list_line_id = p_PRICING_ATTR_rec.list_line_id(I);
4244 
4245     IF l_primary_uom_flag = 'Y'
4246 	 AND p_PRICING_ATTR_rec.product_attribute(I) <> 'PRICING_ATTRIBUTE3' THEN
4247        l_count:= null;
4248        BEGIN
4249        -- Bug# 5228284 RAVI
4250        -- Do not consider the line if it's already the primary flag
4251 	    SELECT count(*)
4252               INTO   l_count
4253 	      FROM   qp_list_lines l, qp_pricing_attributes a
4254 	     WHERE    l.list_line_id = a.list_line_id
4255 	       AND    a.list_header_id = p_PRICING_ATTR_rec.list_header_id(I)
4256 	       AND    a.product_attribute_context=p_PRICING_ATTR_rec.product_attribute_context(I)
4257 	       AND    a.product_attribute = p_PRICING_ATTR_rec.product_attribute(I)
4258 	       AND    a.product_attr_value = p_PRICING_ATTR_rec.product_attr_value(I)
4259 	       AND    a.product_uom_code <> p_PRICING_ATTR_rec.product_uom_code(I)
4260 	       AND    l.primary_uom_flag = 'Y'
4261 	       AND    l.list_line_id <> p_PRICING_ATTR_rec.list_line_id(I);
4262 
4263        EXCEPTION
4264 	  WHEN NO_DATA_FOUND THEN
4265 	     l_count := 0;
4266        END;
4267        */
4268        BEGIN
4269 		SELECT  primary_uom_flag
4270 		INTO  l_primary_uom_flag
4271 		FROM  qp_list_lines
4272 		WHERE  list_line_id = p_PRICING_ATTR_rec.list_line_id(I);
4273 	EXCEPTION
4274 	WHEN OTHERS THEN
4275 		qp_bulk_loader_pub.write_log('9458481/10152629  smbalara 1 ');
4276 		l_return_status := FND_API.G_RET_STS_ERROR;
4277 	END;
4278 
4279 	qp_bulk_loader_pub.write_log('9458481/10152629  smbalara 2 :'||l_primary_uom_flag);
4280 	--check for dates overlapping for lines with primary uom flag checked  --smbalara 9458481/10152629  START
4281 	select start_date_active, end_date_active , revision, list_header_id
4282 	into l_start_date_active, l_end_date_active, l_revision, l_list_header_id
4283 	from qp_list_lines
4284 	where list_line_id = p_PRICING_ATTR_rec.list_line_id(I);
4285 
4286 	IF l_primary_uom_flag = 'Y' AND p_PRICING_ATTR_rec.product_attribute(I) <> 'PRICING_ATTRIBUTE3' THEN
4287 		qp_bulk_loader_pub.write_log('9458481/10152629  smbalara 3 ');
4288 		l_count:=null;
4289 		for c1 in
4290 		(
4291 		select  b.list_line_id col2
4292 		from    qp_pricing_attributes b, qp_list_lines c
4293 		where 	b.list_line_id <> p_PRICING_ATTR_rec.list_line_id(I)
4294 		and     b.list_line_id=c.list_line_id
4295 		and     c.primary_uom_flag='Y'
4296 		and     b.product_attribute_context = p_PRICING_ATTR_rec.product_attribute_context(I)
4297 		and     b.product_attribute = p_PRICING_ATTR_rec.product_attribute(I)
4298 		and     b.product_attr_value = p_PRICING_ATTR_rec.product_attr_value(I)
4299 		and     b.list_header_id = p_PRICING_ATTR_rec.list_header_id(I)
4300 		AND     b.product_uom_code <> p_PRICING_ATTR_rec.product_uom_code(I)  -- for bug 7135111
4301 		)
4302 		Loop
4303 			/*----------------------------------------------*/
4304 			l_min_date := to_date('01/01/1900', 'MM/DD/YYYY');
4305 			l_max_date := to_date('12/31/9999', 'MM/DD/YYYY');
4306 			/*--------------------------------------------*/
4307 			begin
4308 				SELECT  start_date_active, end_date_active
4309 				into  l_sdate, l_edate
4310 				from qp_list_lines
4311 				where list_line_id = c1.col2;
4312 
4313 			exception
4314 			when no_data_found then
4315 				null;
4316 			end;
4317 
4318 			qp_bulk_loader_pub.write_log('9458481/10152629  smbalara 4');
4319 			IF ( nvl(l_Start_Date_Active, l_min_date) <= nvl(l_sdate, l_min_date))
4320 			THEN
4321 				l_min_date := nvl(l_Start_Date_Active, l_min_date);
4322 			ELSE
4323 				l_min_date := nvl(l_sdate, l_min_date);
4324 			END IF;
4325 
4326 			IF ( nvl(l_End_Date_Active, l_max_date) >= nvl(l_edate, l_max_date))
4327 			THEN
4328 				l_max_date := nvl(l_End_Date_Active, l_max_date);
4329 			ELSE
4330 				l_max_date := nvl(l_edate, l_max_date);
4331 			END IF;
4332 			/*
4333 			qp_bulk_loader_pub.write_log('printing dates :');
4334 			qp_bulk_loader_pub.write_log('9458481/10152629  l_sdate :'||l_sdate);
4335 			qp_bulk_loader_pub.write_log('9458481/10152629  l_edate :'||l_edate);
4336 			qp_bulk_loader_pub.write_log('9458481/10152629  l_Start_Date_Active :'||l_Start_Date_Active);
4337 			qp_bulk_loader_pub.write_log('9458481/10152629  l_End_Date_Active :'||l_End_Date_Active);
4338 			qp_bulk_loader_pub.write_log('9458481/10152629  l_min_date :'||l_min_date);
4339 			qp_bulk_loader_pub.write_log('9458481/10152629  l_max_date :'||l_max_date);
4340 			*/
4341 			if ( trunc(nvl(l_sdate, l_min_date)) between
4342 			trunc(nvl(l_Start_Date_Active, l_min_date))
4343 			and trunc(nvl(l_End_Date_Active, l_max_date)) )
4344 			OR
4345 			( trunc(nvl(l_edate, l_max_date)) between
4346 			trunc(nvl(l_Start_Date_Active, l_min_date))
4347 			and trunc(nvl(l_End_Date_Active, l_max_date)) )
4348 
4349 			OR
4350 			( trunc(nvl(l_sdate, l_min_date)) <=
4351 			nvl(l_Start_Date_Active,l_min_date)
4352 			AND
4353 			trunc(nvl(l_edate, l_max_date)) >=
4354 			nvl(l_End_Date_Active,l_max_date) )
4355 
4356 			THEN
4357 				l_count:=1;
4358 				qp_bulk_loader_pub.write_log('Dates Overlapping for lines with Primary UOM flag checked' );
4359 				exit;
4360 			end if;
4361 
4362 		end loop;
4363 		--check for dates overlapping for lines with primary uom flag checked  --smbalara 9458481/10152629  END
4364        IF l_count > 0 THEN
4365 	  p_pricing_attr_rec.process_status_flag(I):=NULL;
4366 	  FND_MESSAGE.SET_NAME('QP','QP_UNIQUE_PRIMARY_UOM');
4367 	  QP_BULK_MSG.Add(l_msg_rec);
4368 
4369 	  -- set the corresponding line as errored
4370 	    UPDATE qp_interface_list_lines
4371 	       SET  process_status_flag = NULL --'E'
4372 	     WHERE  request_id = p_pricing_attr_rec.request_id(I)
4373 	       AND  orig_sys_line_ref = p_pricing_attr_rec.orig_sys_line_ref(I)
4374 	       AND  orig_sys_header_ref = p_pricing_attr_rec.orig_sys_header_ref(I);
4375 
4376 	  FND_MESSAGE.SET_NAME('QP','QP_UNIQUE_PRIMARY_UOM');
4377 	  l_msg_txt:= FND_MESSAGE.GET;
4378 
4379 	    INSERT INTO QP_INTERFACE_ERRORS
4380 			(error_id,last_update_date, last_updated_by, creation_date,
4381 			 created_by, last_update_login, request_id, program_application_id,
4382 			 program_id, program_update_date, entity_type, table_name, column_name,
4383 			 orig_sys_header_ref,orig_sys_line_ref,orig_sys_qualifier_ref,
4384 			orig_sys_pricing_attr_ref, error_message)
4385 	    VALUES
4386 	     (qp_interface_errors_s.nextval, sysdate ,FND_GLOBAL.USER_ID, sysdate,
4387 	      FND_GLOBAL.USER_ID, FND_GLOBAL.CONC_LOGIN_ID, p_pricing_attr_rec.request_id(I),661,
4388 	      NULL,NULL, 'PRL', 'QP_INTERFACE_LIST_LINES', NULL,
4389 	      p_pricing_attr_rec.orig_sys_header_ref(I),p_pricing_attr_rec.orig_sys_line_ref(I),null,
4390 	      null,l_msg_txt);
4391 
4392 	  FOR J IN p_pricing_attr_rec.orig_sys_line_ref.first
4393 		   ..p_pricing_attr_rec.orig_sys_line_ref.last
4394 		   LOOP
4395 	     IF p_pricing_attr_rec.orig_sys_line_ref(J) = p_pricing_attr_rec.orig_sys_line_ref(I)
4396              AND p_pricing_attr_rec.orig_sys_pricing_attr_ref(J) <>
4397 		 p_pricing_attr_rec.orig_sys_pricing_attr_ref(I)
4398 	     THEN
4399 		p_pricing_attr_rec.process_status_flag(J):=NULL; --'E';
4400 		l_msg_rec.orig_sys_pricing_attr_ref := p_pricing_attr_rec.orig_sys_pricing_attr_ref(J);
4401 		FND_MESSAGE.SET_NAME('QP', 'QP_PARENT_FAILED');
4402 		QP_BULK_MSG.ADD(l_msg_rec);
4403 	     END IF;
4404 	  END LOOP;
4405 
4406        END IF;  --End duplicate exists
4407        IF (l_count IS NULL) THEN--check for interface attribs only if above check is successfull
4408        BEGIN
4409 	  l_count := null;
4410 	    SELECT count(*)
4411 	      INTO   l_count
4412 	      FROM   qp_list_lines l, qp_interface_pricing_attribs a
4413 	     WHERE   l.orig_sys_line_ref  = a.orig_sys_line_ref
4414 	       AND   l.orig_sys_header_ref  = a.orig_sys_header_ref
4415 	       AND    a.orig_sys_header_ref = p_PRICING_ATTR_rec.orig_sys_header_ref(I)
4416 	       AND    a.product_attribute_context = p_PRICING_ATTR_rec.product_attribute_context(I)
4417 	       AND    a.product_attribute = p_PRICING_ATTR_rec.product_attribute(I)
4418 	       AND    a.product_attr_value = p_PRICING_ATTR_rec.product_attr_value(I)
4419 	       AND    a.product_uom_code <> p_PRICING_ATTR_rec.product_uom_code(I)
4420                AND    a.orig_sys_pricing_attr_ref <> p_pricing_attr_rec.orig_sys_pricing_attr_ref(I)
4421 	       AND    a.request_id =  p_pricing_attr_rec.request_id(I) 	       --bug 9247305
4422 	       AND    a.process_status_flag = 'P' 	       --bug 9247305
4423 	       AND    l.primary_uom_flag = 'Y';
4424 
4425        EXCEPTION
4426 	  WHEN NO_DATA_FOUND THEN
4427 	     l_count := 0;
4428        END;
4429 
4430        IF l_count > 0 THEN
4431 	  p_pricing_attr_rec.process_status_flag(I):=NULL;
4432 	  FND_MESSAGE.SET_NAME('QP','QP_UNIQUE_PRIMARY_UOM');
4433 	  QP_BULK_MSG.Add(l_msg_rec);
4434 
4435 	  -- set the corresponding line as errored
4436 	    UPDATE qp_interface_list_lines
4437 	       SET  process_status_flag = NULL --'E'
4438 	     WHERE  request_id = p_pricing_attr_rec.request_id(I)
4439 	       AND  orig_sys_line_ref = p_pricing_attr_rec.orig_sys_line_ref(I)
4440 	       AND  orig_sys_header_ref = p_pricing_attr_rec.orig_sys_header_ref(I);
4441 
4442 	  FND_MESSAGE.SET_NAME('QP','QP_UNIQUE_PRIMARY_UOM');
4443 	  l_msg_txt:= FND_MESSAGE.GET;
4444 
4445 	    INSERT INTO QP_INTERFACE_ERRORS
4446 			(error_id,last_update_date, last_updated_by, creation_date,
4447 			 created_by, last_update_login, request_id, program_application_id,
4448 			 program_id, program_update_date, entity_type, table_name, column_name,
4449 			 orig_sys_header_ref,orig_sys_line_ref,orig_sys_qualifier_ref,
4450 			 orig_sys_pricing_attr_ref, error_message)
4451 	    VALUES
4452 	     (qp_interface_errors_s.nextval, sysdate ,FND_GLOBAL.USER_ID, sysdate,
4453 	      FND_GLOBAL.USER_ID, FND_GLOBAL.CONC_LOGIN_ID, p_pricing_attr_rec.request_id(I),661,
4454 	      NULL,NULL, 'PRL', 'QP_INTERFACE_LIST_LINES', NULL,
4455 	      p_pricing_attr_rec.orig_sys_header_ref(I),p_pricing_attr_rec.orig_sys_line_ref(I),null,
4456 	      null,l_msg_txt);
4457 
4458 	  FOR J IN p_pricing_attr_rec.orig_sys_line_ref.first
4459 		   ..p_pricing_attr_rec.orig_sys_line_ref.last
4460 		   LOOP
4461 	     IF p_pricing_attr_rec.orig_sys_line_ref(J) = p_pricing_attr_rec.orig_sys_line_ref(I)
4462 		AND p_pricing_attr_rec.orig_sys_pricing_attr_ref(J) <>
4463 		    p_pricing_attr_rec.orig_sys_pricing_attr_ref(I)
4464 	     THEN
4465 		p_pricing_attr_rec.process_status_flag(J):=NULL; --'E';
4466 		l_msg_rec.orig_sys_pricing_attr_ref := p_pricing_attr_rec.orig_sys_pricing_attr_ref(J);
4467 		FND_MESSAGE.SET_NAME('QP', 'QP_PARENT_FAILED');
4468 		QP_BULK_MSG.ADD(l_msg_rec);
4469 	     END IF;
4470 	  END LOOP;
4471        END IF;   -- If duplicate
4472      END IF;
4473 
4474     END IF;   -- IF  primary_uom_flag set
4475 
4476  END IF;   --  IF process_status_flag
4477 
4478  l_msg_rec.orig_sys_pricing_attr_ref := p_pricing_attr_rec.orig_sys_pricing_attr_ref(I);
4479 
4480  -- qp_bulk_loader_pub.write_log('check 6');
4481 --Delayed request validation
4482 -- Checking multiple price break attributes
4483 
4484      BEGIN
4485 
4486           l_count:=null;
4487 	 /* SELECT COUNT(1) INTO l_count
4488 	   FROM
4489 	  (SELECT /*+ ordered leading(la) index(pb QP_INTERFACE_PRCNG_ATTRIBS_N4) */ /*DISTINCT pb.pricing_attribute
4490 	    FROM qp_list_lines la,
4491 		 qp_pricing_attributes pb,
4492 		 qp_rltd_modifiers ra
4493 	   WHERE ra.to_rltd_modifier_id = la.list_line_id
4494 	     AND pb.list_line_id = ra.to_rltd_modifier_id
4495 	     AND ra.from_rltd_modifier_id = (select from_rltd_modifier_id
4496                            from qp_rltd_modifiers, qp_list_lines
4497                            where orig_sys_line_ref = p_pricing_attr_rec.orig_sys_line_ref(I)
4498                            -- Bug 5246745 Use Composite Index for Ref columns
4499                            and orig_sys_header_ref = p_pricing_attr_rec.orig_sys_header_ref(I)
4500                            and to_rltd_modifier_id = list_line_id)
4501 	     AND ra.rltd_modifier_grp_type = 'PRICE BREAK'
4502 	    UNION
4503 	  SELECT  /*+ leading(la) */ /*DISTINCT pb.pricing_attribute
4504 	    FROM   qp_list_lines la,
4505 	           qp_interface_pricing_attribs pb,
4506         	   qp_rltd_modifiers ra
4507 	   WHERE   ra.to_rltd_modifier_id = la.list_line_id
4508 	     AND   pb.orig_sys_line_ref  = la.orig_sys_line_ref
4509 	     AND   pb.request_id =  p_pricing_attr_rec.request_id(I)
4510 	     AND   pb.process_status_flag = 'P' --IS NULL
4511 	     AND   ra.from_rltd_modifier_id = (select from_rltd_modifier_id
4512                            from qp_rltd_modifiers, qp_list_lines
4513                            where orig_sys_line_ref = p_pricing_attr_rec.orig_sys_line_ref(I)
4514                            -- Bug 5246745 Use Composite Index for Ref columns
4515                            and orig_sys_header_ref = p_pricing_attr_rec.orig_sys_header_ref(I)
4516                            and to_rltd_modifier_id = list_line_id)
4517 	     AND   ra.rltd_modifier_grp_type = 'PRICE BREAK');*/
4518 
4519 
4520 	  SELECT COUNT(1) INTO l_count
4521 	   FROM
4522           (SELECT /*+ ordered leading(la) index(pb QP_INTERFACE_PRCNG_ATTRIBS_N4) */ DISTINCT pb.pricing_attribute
4523 	    FROM qp_list_lines la,
4524 		 qp_rltd_modifiers ra,
4525                  qp_rltd_modifiers rb,
4526                  qp_list_lines lb,
4527 		 qp_interface_pricing_attribs pb
4528             WHERE la.orig_sys_line_ref =  p_pricing_attr_rec.orig_sys_line_ref(I) AND
4529                   la.list_line_type_code = 'PLL' AND
4530                   la.pricing_phase_id = 1 AND
4531                   ra.to_rltd_modifier_id = la.list_line_id AND
4532                   rb.from_rltd_modifier_id = ra.FROM_RLTD_MODIFIER_ID AND
4533                   lb.list_line_id = rb.to_rltd_modifier_id AND
4534                   pb.orig_sys_line_ref = lb.orig_sys_line_ref AND
4535                   pb.request_id =  p_pricing_attr_rec.request_id(I) AND
4536                   pb.process_status_flag = 'P' AND --IS NULL  AND
4537                   rb.rltd_modifier_grp_type = 'PRICE BREAK'
4538          UNION
4539             SELECT /*+ leading(la) */ DISTINCT pb.pricing_attribute
4540 	    FROM qp_list_lines la,
4541 		 qp_pricing_attributes pb,
4542 		 qp_rltd_modifiers ra,
4543                  qp_rltd_modifiers rb
4544             WHERE la.orig_sys_line_ref = p_pricing_attr_rec.orig_sys_line_ref(I) AND
4545                   la.list_line_type_code = 'PLL' AND
4546                   la.pricing_phase_id = 1 AND
4547                   ra.to_rltd_modifier_id = la.list_line_id AND
4548                   rb.from_rltd_modifier_id = ra.FROM_RLTD_MODIFIER_ID AND
4549                   pb.list_line_id = rb.to_rltd_modifier_id AND
4550                   rb.rltd_modifier_grp_type = 'PRICE BREAK');
4551 
4552 	 --qp_bulk_loader_pub.write_log('multi_attr:'||l_count);
4553 
4554          IF l_count>1 THEN
4555             P_PRICING_ATTR_REC.PROCESS_STATUS_FLAG(I):= NULL; --'E';
4556 	    FND_MESSAGE.SET_NAME('QP', 'QP_MULT_PRICE_BREAK_ATTRS');
4557 	    QP_BULK_MSG.ADD(l_msg_rec);
4558 
4559 	    UPDATE qp_interface_list_lines
4560 	       SET process_status_flag = NULL --'E'
4561 	     WHERE orig_sys_line_ref = p_pricing_attr_rec.orig_sys_line_ref(I)
4562 	       AND orig_sys_header_ref = p_pricing_attr_rec.orig_sys_header_ref(I);
4563 
4564 	  l_msg_txt:= FND_MESSAGE.GET;
4565 
4566 	  INSERT INTO QP_INTERFACE_ERRORS
4567 		       (error_id,last_update_date, last_updated_by, creation_date,
4568 			created_by, last_update_login, request_id, program_application_id,
4569 			program_id, program_update_date, entity_type, table_name, column_name,
4570 			orig_sys_header_ref,orig_sys_line_ref,orig_sys_qualifier_ref,
4571 			orig_sys_pricing_attr_ref, error_message)
4572 	   VALUES
4573 	    (qp_interface_errors_s.nextval, sysdate ,FND_GLOBAL.USER_ID, sysdate,
4574 	     FND_GLOBAL.USER_ID, FND_GLOBAL.CONC_LOGIN_ID, p_pricing_attr_rec.request_id(I), 661,
4575 	     NULL,NULL, 'PRL', 'QP_INTERFACE_LIST_LINES', NULL,
4576 	     p_pricing_attr_rec.orig_sys_header_ref(I),p_pricing_attr_rec.orig_sys_line_ref(I),null,
4577 	     null,l_msg_txt);
4578 
4579 	 END IF;
4580 
4581       EXCEPTION
4582 	 WHEN NO_DATA_FOUND THEN
4583 	    NULL;
4584       END;
4585 
4586 -- qp_bulk_loader_pub.write_log('check 7: Ref:'|| p_pricing_attr_rec.orig_sys_pricing_attr_ref(I));
4587 
4588 -- Check Overlapping Price break child lines
4589    BEGIN
4590 
4591     l_status := null;
4592     l_status1:= null;
4593 
4594    IF  p_pricing_attr_rec.pricing_attribute_datatype(I)='N' THEN
4595        OPEN C_break_lines(p_pricing_attr_rec.orig_sys_line_ref(I),
4596                           -- Bug 5246745 Use Composite Index for Ref columns
4597                           p_pricing_attr_rec.orig_sys_header_ref(I));
4598 
4599        FETCH C_break_lines into l_status;       CLOSE C_break_lines;
4600    END IF;
4601 
4602 --ENH Continuous Price Breaks START RAVI
4603 /**
4604 Validation check for multiple continuous price breaks (Messages)
4605 **/
4606    IF  p_pricing_attr_rec.pricing_attribute_datatype(I)='N' THEN
4607 
4608        -- Bug# 5440851 RAVI START
4609        -- If the PA values are tried to be changed to Char from Num type throw an error.
4610        BEGIN
4611   	  l_pa_to_val_tmp:=to_number(p_pricing_attr_rec.pricing_attr_value_to(I));
4612        EXCEPTION
4613           WHEN OTHERS THEN
4614              P_PRICING_ATTR_REC.PROCESS_STATUS_FLAG(I):= NULL; --'E';
4615 	     FND_MESSAGE.SET_NAME('QP', 'QP_INVALID_DATA_TYPE');
4616 	     QP_BULK_MSG.ADD(l_msg_rec);
4617              p_pricing_attr_rec.pricing_attr_value_to(I):=0;
4618        END;
4619 
4620        BEGIN
4621           l_pa_from_val_tmp:=to_number(p_pricing_attr_rec.pricing_attr_value_from(I));
4622        EXCEPTION
4623           WHEN OTHERS THEN
4624              P_PRICING_ATTR_REC.PROCESS_STATUS_FLAG(I):= NULL; --'E';
4625 	     FND_MESSAGE.SET_NAME('QP', 'QP_INVALID_DATA_TYPE');
4626 	     QP_BULK_MSG.ADD(l_msg_rec);
4627              p_pricing_attr_rec.pricing_attr_value_from(I):=0;
4628        END;
4629        -- Bug# 5440851 RAVI END
4630 
4631        OPEN C_old_cont_grp_break_line(p_pricing_attr_rec.orig_sys_line_ref(I),
4632                           -- Bug 5246745 Use Composite Index for Ref columns
4633                           p_pricing_attr_rec.orig_sys_header_ref(I));
4634        FETCH C_old_cont_grp_break_line
4635              into l_old_break_pa_count, l_old_break_low_value, l_old_break_high_value;
4636        CLOSE C_old_cont_grp_break_line;
4637        OPEN C_new_cont_grp_break_lines(p_pricing_attr_rec.orig_sys_line_ref(I),
4638                           -- Bug 5246745 Use Composite Index for Ref columns
4639                           p_pricing_attr_rec.orig_sys_header_ref(I));
4640        FETCH C_new_cont_grp_break_lines
4641              into l_new_break_pa_count, l_new_break_low_value, l_new_break_high_value;
4642        CLOSE C_new_cont_grp_break_lines;
4643 
4644        --Max from value
4645        l_break_high_value:=to_number(p_pricing_attr_rec.pricing_attr_value_to(I));
4646        IF l_break_high_value < l_old_break_high_value THEN
4647           l_break_high_value:=l_old_break_high_value;
4648        END IF;
4649 
4650        IF l_break_high_value < l_new_break_high_value THEN
4651           l_break_high_value:=l_new_break_high_value;
4652        END IF;
4653 
4654        --Continuous Price Break To and From Values Check
4655        OPEN C_to_value_old(p_pricing_attr_rec.orig_sys_line_ref(I),
4656                           -- Bug 5246745 Use Composite Index for Ref columns
4657                           p_pricing_attr_rec.orig_sys_header_ref(I));
4658        FETCH C_to_value_old into l_to_value_old;
4659        CLOSE C_to_value_old;
4660        OPEN C_to_value_new(p_pricing_attr_rec.orig_sys_line_ref(I),
4661                           -- Bug 5246745 Use Composite Index for Ref columns
4662                           p_pricing_attr_rec.orig_sys_header_ref(I));
4663        FETCH C_to_value_new into l_to_value_new;
4664        CLOSE C_to_value_new;
4665 
4666        OPEN C_from_value_old(p_pricing_attr_rec.orig_sys_line_ref(I),
4667                           -- Bug 5246745 Use Composite Index for Ref columns
4668                           p_pricing_attr_rec.orig_sys_header_ref(I));
4669        FETCH C_from_value_old into l_from_value_old;
4670        CLOSE C_from_value_old;
4671        OPEN C_from_value_new(p_pricing_attr_rec.orig_sys_line_ref(I),
4672                           -- Bug 5246745 Use Composite Index for Ref columns
4673                           p_pricing_attr_rec.orig_sys_header_ref(I));
4674        FETCH C_from_value_new into l_from_value_new;
4675        CLOSE C_from_value_new;
4676 
4677        IF l_old_break_pa_count > 0 OR l_new_break_pa_count > 0 THEN
4678           --Multiple price breaks
4679           qp_bulk_loader_pub.write_log('The price breaks header has multiple price breaks');
4680           IF l_to_value_old = 1 OR l_to_value_new = 1 OR
4681              to_number(p_pricing_attr_rec.pricing_attr_value_to(I)) = l_break_high_value THEN
4682              qp_bulk_loader_pub.write_log('TO value has a corresponding FROM value or is the max.');
4683              IF l_from_value_old = 1 OR l_from_value_new = 1 OR
4684                 to_number(p_pricing_attr_rec.pricing_attr_value_from(I))=0 THEN
4685                 null;
4686                 qp_bulk_loader_pub.write_log('FROM value has a corresponding TO value or is zero.');
4687              ELSE
4688 		qp_bulk_loader_pub.write_log('ERROR: No Same To_From Value for Price Break');
4689                 P_PRICING_ATTR_REC.PROCESS_STATUS_FLAG(I):= NULL ; --'E';
4690                 FND_MESSAGE.SET_NAME('QP', 'QP_PBK_CRSPNDNG_TO_FROM');
4691                 QP_BULK_MSG.ADD(l_msg_rec);
4692 
4693       	        UPDATE qp_interface_list_lines
4694                 SET process_status_flag = NULL --'E'
4695 	            WHERE orig_sys_line_ref = p_pricing_attr_rec.orig_sys_line_ref(I)
4696 	            AND orig_sys_header_ref = p_pricing_attr_rec.orig_sys_header_ref(I);
4697 
4698                 FND_MESSAGE.SET_NAME('QP', 'QP_PBK_CRSPNDNG_TO_FROM');
4699 	            l_msg_txt:= FND_MESSAGE.GET;
4700 
4701       	        INSERT INTO QP_INTERFACE_ERRORS
4702 	      	       (error_id,last_update_date, last_updated_by, creation_date,
4703 		         	created_by, last_update_login, request_id, program_application_id,
4704       	      		program_id, program_update_date, entity_type, table_name, column_name,
4705 	      	      	orig_sys_header_ref,orig_sys_line_ref,orig_sys_qualifier_ref,
4706       		      	orig_sys_pricing_attr_ref, error_message)
4707                 VALUES
4708 	                (qp_interface_errors_s.nextval, sysdate ,FND_GLOBAL.USER_ID, sysdate,
4709 	                 FND_GLOBAL.USER_ID, FND_GLOBAL.CONC_LOGIN_ID, p_pricing_attr_rec.request_id(I), 661,
4710                      NULL,NULL, 'PRL', 'QP_INTERFACE_LIST_LINES', NULL,
4711 	                 p_pricing_attr_rec.orig_sys_header_ref(I),p_pricing_attr_rec.orig_sys_line_ref(I),null,
4712                      null,l_msg_txt);
4713              END IF;
4714           ELSE
4715 	     qp_bulk_loader_pub.write_log('ERROR: No Same From_To Value for Price Break');
4716              P_PRICING_ATTR_REC.PROCESS_STATUS_FLAG(I):= NULL ; --'E';
4717              FND_MESSAGE.SET_NAME('QP', 'QP_PBK_CRSPNDNG_FROM_TO');
4718              QP_BULK_MSG.ADD(l_msg_rec);
4719 
4720 	         UPDATE qp_interface_list_lines
4721 	         SET process_status_flag = NULL --'E'
4722 	         WHERE orig_sys_line_ref = p_pricing_attr_rec.orig_sys_line_ref(I)
4723 	         AND orig_sys_header_ref = p_pricing_attr_rec.orig_sys_header_ref(I);
4724 
4725 	         FND_MESSAGE.SET_NAME('QP', 'QP_PBK_CRSPNDNG_FROM_TO');
4726 	         l_msg_txt:= FND_MESSAGE.GET;
4727 
4728 	         INSERT INTO QP_INTERFACE_ERRORS
4729 		       (error_id,last_update_date, last_updated_by, creation_date,
4730 			    created_by, last_update_login, request_id, program_application_id,
4731 			    program_id, program_update_date, entity_type, table_name, column_name,
4732 			    orig_sys_header_ref,orig_sys_line_ref,orig_sys_qualifier_ref,
4733 			    orig_sys_pricing_attr_ref, error_message)
4734 	         VALUES
4735 	           (qp_interface_errors_s.nextval, sysdate ,FND_GLOBAL.USER_ID, sysdate,
4736 	            FND_GLOBAL.USER_ID, FND_GLOBAL.CONC_LOGIN_ID, p_pricing_attr_rec.request_id(I), 661,
4737 	            NULL,NULL, 'PRL', 'QP_INTERFACE_LIST_LINES', NULL,
4738 	            p_pricing_attr_rec.orig_sys_header_ref(I),p_pricing_attr_rec.orig_sys_line_ref(I),null,
4739             	null,l_msg_txt);
4740           END IF;
4741        END IF;
4742 
4743        --Check if lowest PB value is zero
4744        IF to_number(p_pricing_attr_rec.pricing_attr_value_from(I)) <> 0 AND l_pa_price_break='PRICE BREAK'
4745        THEN
4746 
4747        --Bug# 5528754 RAVI END
4748           IF l_old_break_low_value = 0 OR l_new_break_low_value = 0 THEN
4749              NULL;
4750           ELSE
4751 	     qp_bulk_loader_pub.write_log('ERROR: No 0 From Value');
4752              P_PRICING_ATTR_REC.PROCESS_STATUS_FLAG(I):= NULL ; --'E';
4753              FND_MESSAGE.SET_NAME('QP', 'QP_PBK_ZERO_FROM');
4754              QP_BULK_MSG.ADD(l_msg_rec);
4755 
4756   	         UPDATE qp_interface_list_lines
4757 	         SET process_status_flag = NULL --'E'
4758 	         WHERE orig_sys_line_ref = p_pricing_attr_rec.orig_sys_line_ref(I)
4759 	         AND orig_sys_header_ref = p_pricing_attr_rec.orig_sys_header_ref(I);
4760 
4761 	         FND_MESSAGE.SET_NAME('QP', 'QP_PBK_ZERO_FROM');
4762 	         l_msg_txt:= FND_MESSAGE.GET;
4763 
4764 	         INSERT INTO QP_INTERFACE_ERRORS
4765 		       (error_id,last_update_date, last_updated_by, creation_date,
4766 			    created_by, last_update_login, request_id, program_application_id,
4767 			    program_id, program_update_date, entity_type, table_name, column_name,
4768 			    orig_sys_header_ref,orig_sys_line_ref,orig_sys_qualifier_ref,
4769 			    orig_sys_pricing_attr_ref, error_message)
4770 	           VALUES
4771 	             (qp_interface_errors_s.nextval, sysdate ,FND_GLOBAL.USER_ID, sysdate,
4772 	              FND_GLOBAL.USER_ID, FND_GLOBAL.CONC_LOGIN_ID, p_pricing_attr_rec.request_id(I), 661,
4773 	              NULL,NULL, 'PRL', 'QP_INTERFACE_LIST_LINES', NULL,
4774 	              p_pricing_attr_rec.orig_sys_header_ref(I),p_pricing_attr_rec.orig_sys_line_ref(I),null,
4775             	  null,l_msg_txt);
4776           END IF;
4777        END IF;
4778    END IF;
4779 --ENH Continuous Price Breaks END RAVI
4780 
4781    IF p_pricing_attr_rec.pricing_attribute_datatype(I)='N' THEN
4782        OPEN C_Int_break_lines(p_pricing_attr_rec.orig_sys_line_ref(I),
4783                           -- Bug 5246745 Use Composite Index for Ref columns
4784                           p_pricing_attr_rec.orig_sys_header_ref(I),
4785                           p_pricing_attr_rec.request_id(I));  -- changes done by rassharm for bug no 6028305
4786        FETCH C_Int_break_lines into l_status1;
4787 
4788        CLOSE C_Int_break_lines;
4789    END IF;
4790 
4791    IF l_status = 'OVERLAP' OR l_status1 = 'OVERLAP' THEN
4792       qp_bulk_loader_pub.write_log('Overlapping Price Breaks');
4793       P_PRICING_ATTR_REC.PROCESS_STATUS_FLAG(I):= NULL ; --'E';
4794       FND_MESSAGE.SET_NAME('QP', 'QP_OVERLAP_PRICE_BREAK_RANGE');
4795       QP_BULK_MSG.ADD(l_msg_rec);
4796 
4797 	    UPDATE qp_interface_list_lines
4798 	       SET process_status_flag = NULL --'E'
4799 	     WHERE orig_sys_line_ref = p_pricing_attr_rec.orig_sys_line_ref(I)
4800 	       AND orig_sys_header_ref = p_pricing_attr_rec.orig_sys_header_ref(I);
4801 
4802 	  FND_MESSAGE.SET_NAME('QP', 'QP_OVERLAP_PRICE_BREAK_RANGE');
4803 	  l_msg_txt:= FND_MESSAGE.GET;
4804 
4805 	 INSERT INTO QP_INTERFACE_ERRORS
4806 		       (error_id,last_update_date, last_updated_by, creation_date,
4807 			created_by, last_update_login, request_id, program_application_id,
4808 			program_id, program_update_date, entity_type, table_name, column_name,
4809 			orig_sys_header_ref,orig_sys_line_ref,orig_sys_qualifier_ref,
4810 			orig_sys_pricing_attr_ref, error_message)
4811 	   VALUES
4812 	    (qp_interface_errors_s.nextval, sysdate ,FND_GLOBAL.USER_ID, sysdate,
4813 	     FND_GLOBAL.USER_ID, FND_GLOBAL.CONC_LOGIN_ID, p_pricing_attr_rec.request_id(I), 661,
4814 	     NULL,NULL, 'PRL', 'QP_INTERFACE_LIST_LINES', NULL,
4815 	     p_pricing_attr_rec.orig_sys_header_ref(I),p_pricing_attr_rec.orig_sys_line_ref(I),null,
4816 	     null,l_msg_txt);
4817 
4818    END IF;
4819 EXCEPTION
4820    WHEN NO_DATA_FOUND THEN
4821       NULL;
4822 END;
4823 
4824 --Flex field check
4825 
4826    IF ( p_Pricing_Attr_rec.pricing_attribute_context(I) is not null
4827 	 or   p_Pricing_Attr_rec.pricing_attribute(I) is not null ) then
4828 
4829     IF l_pricing_attr_flex_enabled = 'Y' THEN
4830       qp_bulk_loader_pub.write_log( 'Pricing Attr Flex enabled ');
4831 
4832          IF NOT Init_Desc_Flex
4833                (p_flex_name	     =>'QP_PRICING_ATTRIBUTES'
4834 	       ,p_context            => p_pricing_attr_rec.context(i)
4835                ,p_attribute1         => p_pricing_attr_rec.attribute1(i)
4836                ,p_attribute2         => p_pricing_attr_rec.attribute2(i)
4837                ,p_attribute3         => p_pricing_attr_rec.attribute3(i)
4838                ,p_attribute4         => p_pricing_attr_rec.attribute4(i)
4839                ,p_attribute5         => p_pricing_attr_rec.attribute5(i)
4840                ,p_attribute6         => p_pricing_attr_rec.attribute6(i)
4841                ,p_attribute7         => p_pricing_attr_rec.attribute7(i)
4842                ,p_attribute8         => p_pricing_attr_rec.attribute8(i)
4843                ,p_attribute9         => p_pricing_attr_rec.attribute9(i)
4844                ,p_attribute10        => p_pricing_attr_rec.attribute10(i)
4845                ,p_attribute11        => p_pricing_attr_rec.attribute11(i)
4846                ,p_attribute12        => p_pricing_attr_rec.attribute12(i)
4847                ,p_attribute13        => p_pricing_attr_rec.attribute13(i)
4848                ,p_attribute14        => p_pricing_attr_rec.attribute14(i)
4849                ,p_attribute15        => p_pricing_attr_rec.attribute15(i)) THEN
4850 
4851 	         QP_BULK_MSG.ADD(l_msg_rec);
4852 
4853                  -- Log Error Message
4854                  FND_MESSAGE.SET_NAME('QP','QP_INVALID_ATTRIBUTE');
4855                  FND_MESSAGE.SET_TOKEN('ATTRIBUTE',
4856                                        'Entity:Flexfield:Pricing_Attr_Desc_Flex');
4857 	         p_pricing_attr_rec.process_status_flag(I):=NULL;
4858 
4859 	         QP_BULK_MSG.ADD(l_msg_rec);
4860 
4861           ELSE -- if the flex validation is successfull
4862 
4863             IF p_pricing_attr_rec.context(i) IS NULL
4864               OR p_pricing_attr_rec.context(i) = FND_API.G_MISS_CHAR THEN
4865                p_pricing_attr_rec.context(i)    := g_context;
4866             END IF;
4867 
4868             IF p_pricing_attr_rec.attribute1(i) IS NULL
4869               OR p_pricing_attr_rec.attribute1(i) = FND_API.G_MISS_CHAR THEN
4870                p_pricing_attr_rec.attribute1(i) := g_attribute1;
4871             END IF;
4872 
4873             IF p_pricing_attr_rec.attribute2(i) IS NULL
4874               OR p_pricing_attr_rec.attribute2(i) = FND_API.G_MISS_CHAR THEN
4875                p_pricing_attr_rec.attribute2(i) := g_attribute2;
4876             END IF;
4877 
4878             IF p_pricing_attr_rec.attribute3(i) IS NULL
4879               OR p_pricing_attr_rec.attribute3(i) = FND_API.G_MISS_CHAR THEN
4880                p_pricing_attr_rec.attribute3(i) := g_attribute3;
4881             END IF;
4882 
4883             IF p_pricing_attr_rec.attribute4(i) IS NULL
4884               OR p_pricing_attr_rec.attribute4(i) = FND_API.G_MISS_CHAR THEN
4885                p_pricing_attr_rec.attribute4(i) := g_attribute4;
4886             END IF;
4887 
4888             IF p_pricing_attr_rec.attribute5(i) IS NULL
4889               OR p_pricing_attr_rec.attribute5(i) = FND_API.G_MISS_CHAR THEN
4890                p_pricing_attr_rec.attribute5(i) := g_attribute5;
4891             END IF;
4892 
4893             IF p_pricing_attr_rec.attribute6(i) IS NULL
4894               OR p_pricing_attr_rec.attribute6(i) = FND_API.G_MISS_CHAR THEN
4895                p_pricing_attr_rec.attribute6(i) := g_attribute6;
4896             END IF;
4897             IF p_pricing_attr_rec.attribute7(i) IS NULL
4898               OR p_pricing_attr_rec.attribute7(i) = FND_API.G_MISS_CHAR THEN
4899                p_pricing_attr_rec.attribute7(i) := g_attribute7;
4900             END IF;
4901 
4902             IF p_pricing_attr_rec.attribute8(i) IS NULL
4903               OR p_pricing_attr_rec.attribute8(i) = FND_API.G_MISS_CHAR THEN
4904                p_pricing_attr_rec.attribute8(i) := g_attribute8;
4905             END IF;
4906 
4907             IF p_pricing_attr_rec.attribute9(i) IS NULL
4908               OR p_pricing_attr_rec.attribute9(i) = FND_API.G_MISS_CHAR THEN
4909                p_pricing_attr_rec.attribute9(i) := g_attribute9;
4910             END IF;
4911 
4912             IF p_pricing_attr_rec.attribute10(i) IS NULL
4913               OR p_pricing_attr_rec.attribute10(i) = FND_API.G_MISS_CHAR THEN
4914                p_pricing_attr_rec.attribute10(i) := G_attribute10;
4915             End IF;
4916 
4917             IF p_pricing_attr_rec.attribute11(i) IS NULL
4918               OR p_pricing_attr_rec.attribute11(i) = FND_API.G_MISS_CHAR THEN
4919                p_pricing_attr_rec.attribute11(i) := g_attribute11;
4920             END IF;
4921 
4922             IF p_pricing_attr_rec.attribute12(i) IS NULL
4923               OR p_pricing_attr_rec.attribute12(i) = FND_API.G_MISS_CHAR THEN
4924                p_pricing_attr_rec.attribute12(i) := g_attribute12;
4925             END IF;
4926 
4927             IF p_pricing_attr_rec.attribute13(i) IS NULL
4928               OR p_pricing_attr_rec.attribute13(i) = FND_API.G_MISS_CHAR THEN
4929                p_pricing_attr_rec.attribute13(i) := g_attribute13;
4930             END IF;
4931 
4932             IF p_pricing_attr_rec.attribute14(i) IS NULL
4933               OR p_pricing_attr_rec.attribute14(i) = FND_API.G_MISS_CHAR THEN
4934                p_pricing_attr_rec.attribute14(i) := g_attribute14;
4935             END IF;
4936 
4937             IF p_pricing_attr_rec.attribute15(i) IS NULL
4938               OR p_pricing_attr_rec.attribute15(i) = FND_API.G_MISS_CHAR THEN
4939                p_pricing_attr_rec.attribute15(i) := g_attribute15;
4940             END IF;
4941 	END IF;
4942     END IF;
4943  END IF;  -- pricing attr pair not null
4944 
4945   -- Updation check
4946   --cannot update product attribute
4947   IF p_pricing_attr_rec.interface_action_code(I) = 'UPDATE'
4948      AND p_pricing_attr_rec.process_status_flag(I)='P' THEN --,'*') <> 'E' THEN
4949 
4950       l_old_pricing_attr_rec := Qp_pll_pricing_attr_Util.Query_Row
4951 	(   p_pricing_attribute_id        => l_pricing_attribute_id
4952 	);
4953 
4954       IF l_old_pricing_attr_rec.product_attribute_context <>
4955 	 p_pricing_attr_rec.product_attribute_context(I)
4956 	 OR l_old_pricing_attr_rec.product_attribute <>
4957 	    p_pricing_attr_rec.product_attribute(I)
4958 	    OR l_old_pricing_attr_rec.product_attr_value <>
4959 	       p_pricing_attr_rec.product_attr_value(I) THEN
4960 
4961 	 P_PRICING_ATTR_REC.PROCESS_STATUS_FLAG(I):= NULL; --'E';
4962 	 FND_MESSAGE.SET_NAME('QP', 'NO_PRODUCT_ATTR_UPD');
4963 	 QP_BULK_MSG.ADD(l_msg_rec);
4964       END IF;
4965   END IF;
4966 
4967 
4968 --Warning messages
4969 -- Product attribute
4970      IF p_pricing_attr_rec.process_status_flag(I)='P' --,'*') <> 'E'
4971 	and p_pricing_attr_rec.pricing_attribute_context(I) IS NULL
4972 	and p_pricing_attr_rec.pricing_attribute(I) IS NULL THEN
4973 
4974         QP_UTIL.Get_Context_Type('QP_ATTR_DEFNS_PRICING',
4975                                p_Pricing_Attr_rec.product_attribute_context(I),
4976                                l_context_type,
4977                                l_error_code);
4978 
4979         QP_UTIL.Get_Sourcing_Info(l_context_type,
4980                                   p_Pricing_Attr_rec.product_attribute_context(I),
4981                                   p_Pricing_Attr_rec.product_attribute(I),
4982                                   l_sourcing_enabled,
4983                                   l_sourcing_status,
4984                                   l_sourcing_method);
4985    	qp_bulk_loader_pub.write_log('Sourcing method / status / enabled'||l_sourcing_method||l_sourcing_status||l_sourcing_enabled);
4986 
4987         IF l_sourcing_method = 'ATTRIBUTE MAPPING' THEN
4988 
4989           IF l_sourcing_enabled <> 'Y' THEN
4990 
4991             FND_MESSAGE.SET_NAME('QP','QP_ENABLE_SOURCING');
4992             FND_MESSAGE.SET_TOKEN('CONTEXT',
4993                                 p_Pricing_Attr_rec.product_attribute_context(I));
4994 	    FND_MESSAGE.SET_TOKEN('ATTRIBUTE',
4995                                   p_Pricing_Attr_rec.product_attribute(I));
4996 	    QP_BULK_MSG.ADD(l_msg_rec);
4997            END IF;
4998 
4999           IF l_sourcing_status <> 'Y' THEN
5000 
5001             FND_MESSAGE.SET_NAME('QP','QP_BUILD_SOURCING_RULES');
5002             FND_MESSAGE.SET_TOKEN('CONTEXT',
5003                                   p_Pricing_Attr_rec.product_attribute_context(I));
5004 	    FND_MESSAGE.SET_TOKEN('ATTRIBUTE',
5005                                   p_Pricing_Attr_rec.product_attribute(I));
5006 	    QP_BULK_MSG.ADD(l_msg_rec, 'W'); --bug no: 9652756- set type of this message to Warning
5007 
5008           END IF;
5009 
5010         END IF; --If sourcing_method = 'ATTRIBUTE MAPPING'
5011      END IF; -- process_status_flag(I) <> 'E'
5012 
5013 -- Pricing attribute
5014      IF p_pricing_attr_rec.process_status_flag(I)='P' --,'*') <> 'E'
5015 	and p_pricing_attr_rec.pricing_attribute_context(I) IS NOT NULL
5016 	and p_pricing_attr_rec.pricing_attribute(I) IS NOT NULL THEN
5017 
5018         QP_UTIL.Get_Context_Type('QP_ATTR_DEFNS_PRICING',
5019                                p_Pricing_Attr_rec.pricing_attribute_context(I),
5020                                l_context_type,
5021                                l_error_code);
5022 
5023         QP_UTIL.Get_Sourcing_Info(l_context_type,
5024                                   p_Pricing_Attr_rec.pricing_attribute_context(I),
5025                                   p_Pricing_Attr_rec.pricing_attribute(I),
5026                                   l_sourcing_enabled,
5027                                   l_sourcing_status,
5028                                   l_sourcing_method);
5029 
5030    	qp_bulk_loader_pub.write_log('Sourcing method / status / enabled'||l_sourcing_method||l_sourcing_status||l_sourcing_enabled);
5031 
5032         IF l_sourcing_method = 'ATTRIBUTE MAPPING' THEN
5033 
5034           IF l_sourcing_enabled <> 'Y' THEN
5035 
5036             FND_MESSAGE.SET_NAME('QP','QP_ENABLE_SOURCING');
5037             FND_MESSAGE.SET_TOKEN('CONTEXT',
5038                                 p_Pricing_Attr_rec.pricing_attribute_context(I));
5039 	    FND_MESSAGE.SET_TOKEN('ATTRIBUTE',
5040                                   p_Pricing_Attr_rec.pricing_attribute(I));
5041 	    QP_BULK_MSG.ADD(l_msg_rec);
5042            END IF;
5043 
5044           IF l_sourcing_status <> 'Y' THEN
5045 
5046             FND_MESSAGE.SET_NAME('QP','QP_BUILD_SOURCING_RULES');
5047             FND_MESSAGE.SET_TOKEN('CONTEXT',
5048                                   p_Pricing_Attr_rec.pricing_attribute_context(I));
5049 	    FND_MESSAGE.SET_TOKEN('ATTRIBUTE',
5050                                   p_Pricing_Attr_rec.pricing_attribute(I));
5051 	    QP_BULK_MSG.ADD(l_msg_rec, 'W'); --bug no: 9652756- set type of this message - Warning
5052 
5053           END IF;
5054 
5055         END IF; --If sourcing_method = 'ATTRIBUTE MAPPING'
5056      END IF; -- process_status_flag(I) <> 'E'
5057  END LOOP;
5058 
5059  qp_bulk_loader_pub.write_log( 'Leaving Entity Pricing Attr validation');
5060 
5061  EXCEPTION
5062     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
5063        qp_bulk_loader_pub.write_log( 'UNEXCPECTED ERROR IN PROCEDURE ENTITY_PRICING_ATTR:'||sqlerrm);
5064        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5065     WHEN OTHERS THEN
5066        qp_bulk_loader_pub.write_log( 'UNEXCPECTED ERROR IN PROCEDURE ENTITY_PRICING_ATTR:'||sqlerrm);
5067        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5068 
5069 
5070 END ENTITY_PRICING_ATTR;
5071 
5072 
5073 
5074 
5075 PROCEDURE ATTRIBUTE_HEADER
5076           (p_request_id NUMBER)
5077 IS
5078    l_msg_txt VARCHAR2(240);
5079 
5080 BEGIN
5081 
5082         --Currency Code
5083 	--List Type Code
5084 	--Freight Terms
5085 	--Payment Terms
5086 	--Ship Method (Freight Carrier)
5087 	--Currency Header Id
5088 	--Name
5089 	--PTE
5090 	--Source System
5091 
5092 qp_bulk_loader_pub.write_log('Entering Attribute Header validation');
5093 -- 1.Currency  Code
5094 
5095 FND_MESSAGE.SET_NAME('QP','QP_INVALID_ATTRIBUTE');
5096 FND_MESSAGE.SET_TOKEN('ATTRIBUTE','CURRENCY CODE');
5097 l_msg_txt := FND_MESSAGE.GET;
5098 
5099 
5100 INSERT INTO QP_INTERFACE_ERRORS
5101    (error_id,last_update_date, last_updated_by, creation_date,
5102     created_by, last_update_login, request_id, program_application_id,
5103     program_id, program_update_date, entity_type, table_name, column_name,
5104     orig_sys_header_ref,orig_sys_line_ref,orig_sys_qualifier_ref,
5105     orig_sys_pricing_attr_ref, error_message)
5106     	SELECT
5107      	qp_interface_errors_s.nextval, sysdate ,FND_GLOBAL.USER_ID, sysdate,
5108      	FND_GLOBAL.USER_ID, FND_GLOBAL.CONC_LOGIN_ID, qpih.request_id, 661,
5109      	NULL,NULL, 'PRL', 'QP_INTERFACE_LIST_HEADERS', 'CURRENCY_CODE',
5110      	qpih.orig_sys_header_ref,null,null,null,l_msg_txt
5111     	FROM QP_INTERFACE_LIST_HEADERS qpih
5112     	WHERE qpih.request_id = p_request_id
5113       	AND qpih.process_status_flag ='P' --is null
5114         AND qpih.currency_code is not null
5115 	AND qpih.interface_action_code IN ('INSERT', 'UPDATE')
5116       	AND NOT EXISTS (SELECT currency_code -- Validation
5117      		      FROM fnd_currencies_vl
5118      		      WHERE enabled_flag = 'Y'
5119      		      AND currency_flag='Y'
5120      		      AND currency_code = qpih.currency_code
5121                       );
5122 
5123  -- 2.Freight Terms
5124 
5125 FND_MESSAGE.SET_NAME('QP','QP_INVALID_ATTRIBUTE');
5126 FND_MESSAGE.SET_TOKEN('ATTRIBUTE', 'FREIGHT TERMS');
5127 l_msg_txt := FND_MESSAGE.GET;
5128 
5129 --Bug# 5412029 START RAVI
5130 --Check if the frieght terms are valid
5131     INSERT INTO QP_INTERFACE_ERRORS
5132    (error_id,last_update_date, last_updated_by, creation_date,
5133     created_by, last_update_login, request_id, program_application_id,
5134     program_id, program_update_date, entity_type, table_name, column_name,
5135     orig_sys_header_ref,orig_sys_line_ref,orig_sys_qualifier_ref,
5136     orig_sys_pricing_attr_ref, error_message)
5137     SELECT
5138      qp_interface_errors_s.nextval, sysdate ,FND_GLOBAL.USER_ID, sysdate,
5139      FND_GLOBAL.USER_ID, FND_GLOBAL.CONC_LOGIN_ID, qpih.request_id, 661,
5140      NULL,NULL, 'PRL', 'QP_INTERFACE_LIST_HEADERS', 'FREIGHT TERMS',
5141      qpih.orig_sys_header_ref,null,null,null, l_msg_txt
5142     FROM QP_INTERFACE_LIST_HEADERS qpih
5143     WHERE qpih.request_id = p_request_id
5144       AND  qpih.process_status_flag ='P' --is null
5145       AND  qpih.interface_action_code IN ('INSERT', 'UPDATE')
5146       AND qpih.freight_terms_code IS NOT NULL
5147       AND qpih.freight_terms_code <> QP_BULK_LOADER_PUB.G_NULL_CHAR
5148       AND qpih.freight_terms IS NOT NULL
5149       AND NOT EXISTS (SELECT   freight_terms_code
5150                       	   FROM     OE_FRGHT_TERMS_ACTIVE_V
5151                       	   WHERE    freight_terms_code = qpih.freight_terms_code
5152                            AND      freight_terms = qpih.freight_terms
5153                       	   AND    sysdate BETWEEN nvl(start_date_active, sysdate)
5154                                               AND    nvl(end_date_active, sysdate));
5155 
5156     INSERT INTO QP_INTERFACE_ERRORS
5157    (error_id,last_update_date, last_updated_by, creation_date,
5158     created_by, last_update_login, request_id, program_application_id,
5159     program_id, program_update_date, entity_type, table_name, column_name,
5160     orig_sys_header_ref,orig_sys_line_ref,orig_sys_qualifier_ref,
5161     orig_sys_pricing_attr_ref, error_message)
5162     SELECT
5163      qp_interface_errors_s.nextval, sysdate ,FND_GLOBAL.USER_ID, sysdate,
5164      FND_GLOBAL.USER_ID, FND_GLOBAL.CONC_LOGIN_ID, qpih.request_id, 661,
5165      NULL,NULL, 'PRL', 'QP_INTERFACE_LIST_HEADERS', 'FREIGHT TERMS',
5166      qpih.orig_sys_header_ref,null,null,null, l_msg_txt
5167     FROM QP_INTERFACE_LIST_HEADERS qpih
5168     WHERE qpih.request_id = p_request_id
5169       AND  qpih.process_status_flag ='P' --is null
5170       AND  qpih.interface_action_code IN ('INSERT', 'UPDATE')
5171       AND qpih.freight_terms IS NOT NULL
5172       AND qpih.freight_terms_code IS NULL
5173       AND NOT EXISTS (SELECT   freight_terms_code
5174                       	   FROM     OE_FRGHT_TERMS_ACTIVE_V
5175                       	   WHERE    freight_terms = qpih.freight_terms
5176                       	   AND    sysdate BETWEEN nvl(start_date_active, sysdate)
5177                                               AND    nvl(end_date_active, sysdate));
5178 
5179     INSERT INTO QP_INTERFACE_ERRORS
5180    (error_id,last_update_date, last_updated_by, creation_date,
5181     created_by, last_update_login, request_id, program_application_id,
5182     program_id, program_update_date, entity_type, table_name, column_name,
5183     orig_sys_header_ref,orig_sys_line_ref,orig_sys_qualifier_ref,
5184     orig_sys_pricing_attr_ref, error_message)
5185     SELECT
5186      qp_interface_errors_s.nextval, sysdate ,FND_GLOBAL.USER_ID, sysdate,
5187      FND_GLOBAL.USER_ID, FND_GLOBAL.CONC_LOGIN_ID, qpih.request_id, 661,
5188      NULL,NULL, 'PRL', 'QP_INTERFACE_LIST_HEADERS', 'FREIGHT TERMS',
5189      qpih.orig_sys_header_ref,null,null,null, l_msg_txt
5190     FROM QP_INTERFACE_LIST_HEADERS qpih
5191     WHERE qpih.request_id = p_request_id
5192       AND  qpih.process_status_flag ='P' --is null
5193       AND  qpih.interface_action_code IN ('INSERT', 'UPDATE')
5194       AND qpih.freight_terms IS NULL
5195       AND qpih.freight_terms_code IS NOT NULL
5196       AND qpih.freight_terms_code <> QP_BULK_LOADER_PUB.G_NULL_CHAR
5197       AND NOT EXISTS (SELECT   freight_terms_code
5198                       	   FROM     OE_FRGHT_TERMS_ACTIVE_V
5199                       	   WHERE    freight_terms_code = qpih.freight_terms_code
5200                       	   AND    sysdate BETWEEN nvl(start_date_active, sysdate)
5201                                               AND    nvl(end_date_active, sysdate));
5202 --Bug# 5412029 END RAVI
5203 
5204 -- 3.  LIST TYPE CODE
5205 
5206 FND_MESSAGE.SET_NAME('QP','QP_INVALID_ATTRIBUTE');
5207 FND_MESSAGE.SET_TOKEN('ATTRIBUTE','LIST TYPE CODE');
5208 l_msg_txt := FND_MESSAGE.GET;
5209 
5210     INSERT INTO QP_INTERFACE_ERRORS
5211    (error_id,last_update_date, last_updated_by, creation_date,
5212     created_by, last_update_login, request_id, program_application_id,
5213     program_id, program_update_date, entity_type, table_name, column_name,
5214     orig_sys_header_ref,orig_sys_line_ref,orig_sys_qualifier_ref,
5215     orig_sys_pricing_attr_ref, error_message)
5216     SELECT
5217      qp_interface_errors_s.nextval, sysdate ,FND_GLOBAL.USER_ID, sysdate,
5218      FND_GLOBAL.USER_ID, FND_GLOBAL.CONC_LOGIN_ID, qpih.request_id, 661,
5219      NULL,NULL, 'PRL', 'QP_INTERFACE_LIST_HEADERS', 'LIST_TYPE_CODE',
5220      qpih.orig_sys_header_ref,null,null,null,l_msg_txt
5221     FROM QP_INTERFACE_LIST_HEADERS qpih
5222     WHERE qpih.request_id = p_request_id
5223          AND   qpih.process_status_flag ='P' --is null
5224          AND   qpih.interface_action_code IN ('INSERT', 'UPDATE')
5225          AND   qpih.list_type_code IS NOT NULL
5226          AND   NOT EXISTS (SELECT lookup_code
5227      		      FROM qp_lookups
5228      	      	      WHERE lookup_type = 'LIST_TYPE_CODE'
5229      		      AND lookup_code   = qpih.list_type_code);
5230 
5231 -- 4.Ship Method(Freight Carrier)
5232 
5233 FND_MESSAGE.SET_NAME('QP','QP_INVALID_ATTRIBUTE');
5234 FND_MESSAGE.SET_TOKEN('ATTRIBUTE', 'FREIGHT CARRIER');
5235 l_msg_txt := FND_MESSAGE.GET;
5236 
5237 --Bug# 5412029 START RAVI
5238 --Check if the ship method are valid
5239     INSERT INTO QP_INTERFACE_ERRORS
5240    (error_id,last_update_date, last_updated_by, creation_date,
5241     created_by, last_update_login, request_id, program_application_id,
5242     program_id, program_update_date, entity_type, table_name, column_name,
5243     orig_sys_header_ref,orig_sys_line_ref,orig_sys_qualifier_ref,
5244     orig_sys_pricing_attr_ref,  error_message)
5245     SELECT
5246      qp_interface_errors_s.nextval, sysdate ,FND_GLOBAL.USER_ID, sysdate,
5247      FND_GLOBAL.USER_ID, FND_GLOBAL.CONC_LOGIN_ID, qpih.request_id, 661,
5248      NULL,NULL, 'PRL', 'QP_INTERFACE_LIST_HEADERS',  'FRIEGHT CARRIER',
5249      qpih.orig_sys_header_ref, null,null,null,l_msg_txt
5250     FROM QP_INTERFACE_LIST_HEADERS qpih
5251     WHERE qpih.request_id = p_request_id
5252       AND  qpih.process_status_flag ='P' --is null
5253       AND  qpih.interface_action_code IN ('INSERT', 'UPDATE')
5254       AND qpih.ship_method IS NOT NULL
5255       AND qpih.ship_method_code IS NOT NULL
5256       AND qpih.ship_method_code <> QP_BULK_LOADER_PUB.G_NULL_CHAR
5257       AND NOT EXISTS (SELECT LOOKUP_CODE
5258     		        FROM OE_SHIP_METHODS_V
5259     		       WHERE LOOKUP_TYPE = 'SHIP_METHOD'
5260     		       AND  LOOKUP_CODE = qpih.ship_method_code
5261     		       AND  MEANING = qpih.ship_method
5262     		       AND  sysdate BETWEEN nvl(start_date_active, sysdate)
5263                                      AND    nvl(end_date_active, sysdate) );
5264 
5265     INSERT INTO QP_INTERFACE_ERRORS
5266    (error_id,last_update_date, last_updated_by, creation_date,
5267     created_by, last_update_login, request_id, program_application_id,
5268     program_id, program_update_date, entity_type, table_name, column_name,
5269     orig_sys_header_ref,orig_sys_line_ref,orig_sys_qualifier_ref,
5270     orig_sys_pricing_attr_ref,  error_message)
5271     SELECT
5272      qp_interface_errors_s.nextval, sysdate ,FND_GLOBAL.USER_ID, sysdate,
5273      FND_GLOBAL.USER_ID, FND_GLOBAL.CONC_LOGIN_ID, qpih.request_id, 661,
5274      NULL,NULL, 'PRL', 'QP_INTERFACE_LIST_HEADERS',  'FRIEGHT CARRIER',
5275      qpih.orig_sys_header_ref, null,null,null,l_msg_txt
5276     FROM QP_INTERFACE_LIST_HEADERS qpih
5277     WHERE qpih.request_id = p_request_id
5278       AND  qpih.process_status_flag ='P' --is null
5279       AND  qpih.interface_action_code IN ('INSERT', 'UPDATE')
5280       AND qpih.ship_method IS NULL
5281       AND qpih.ship_method_code IS NOT NULL
5282       AND qpih.ship_method_code <> QP_BULK_LOADER_PUB.G_NULL_CHAR
5283       AND NOT EXISTS (SELECT LOOKUP_CODE
5284     		        FROM OE_SHIP_METHODS_V
5285     		       WHERE LOOKUP_TYPE = 'SHIP_METHOD'
5286     		       AND  LOOKUP_CODE = qpih.ship_method_code
5287     		       AND  sysdate BETWEEN nvl(start_date_active, sysdate)
5288                                      AND    nvl(end_date_active, sysdate) );
5289 
5290     INSERT INTO QP_INTERFACE_ERRORS
5291    (error_id,last_update_date, last_updated_by, creation_date,
5292     created_by, last_update_login, request_id, program_application_id,
5293     program_id, program_update_date, entity_type, table_name, column_name,
5294     orig_sys_header_ref,orig_sys_line_ref,orig_sys_qualifier_ref,
5295     orig_sys_pricing_attr_ref,  error_message)
5296     SELECT
5297      qp_interface_errors_s.nextval, sysdate ,FND_GLOBAL.USER_ID, sysdate,
5298      FND_GLOBAL.USER_ID, FND_GLOBAL.CONC_LOGIN_ID, qpih.request_id, 661,
5299      NULL,NULL, 'PRL', 'QP_INTERFACE_LIST_HEADERS',  'FRIEGHT CARRIER',
5300      qpih.orig_sys_header_ref, null,null,null,l_msg_txt
5301     FROM QP_INTERFACE_LIST_HEADERS qpih
5302     WHERE qpih.request_id = p_request_id
5303       AND  qpih.process_status_flag ='P' --is null
5304       AND  qpih.interface_action_code IN ('INSERT', 'UPDATE')
5305       AND qpih.ship_method IS NOT NULL
5306       AND qpih.ship_method_code IS NULL
5307       AND NOT EXISTS (SELECT LOOKUP_CODE
5308     		        FROM OE_SHIP_METHODS_V
5309     		       WHERE LOOKUP_TYPE = 'SHIP_METHOD'
5310     		       AND  MEANING = qpih.ship_method
5311     		       AND  sysdate BETWEEN nvl(start_date_active, sysdate)
5312                                      AND    nvl(end_date_active, sysdate) );
5313 --Bug# 5412029 END RAVI
5314 
5315 -- 5. Payment Terms
5316 FND_MESSAGE.SET_NAME('QP','QP_INVALID_ATTRIBUTE');
5317 FND_MESSAGE.SET_TOKEN('ATTRIBUTE', 'PAYMENT TERMS');
5318 l_msg_txt := FND_MESSAGE.GET;
5319 
5320 --Bug# 5412029 START RAVI
5321 --Check if the payment terms are valid
5322     INSERT INTO QP_INTERFACE_ERRORS
5323    (error_id,last_update_date, last_updated_by, creation_date,
5324     created_by, last_update_login, request_id, program_application_id,
5325     program_id, program_update_date, entity_type, table_name, column_name,
5326     orig_sys_header_ref,orig_sys_line_ref,orig_sys_qualifier_ref,
5327     orig_sys_pricing_attr_ref, error_message)
5328     SELECT
5329      qp_interface_errors_s.nextval, sysdate ,FND_GLOBAL.USER_ID, sysdate,
5330      FND_GLOBAL.USER_ID, FND_GLOBAL.CONC_LOGIN_ID, qpih.request_id, 661,
5331      NULL,NULL, 'PRL', 'QP_INTERFACE_LIST_HEADERS', 'PAYMENT TERMS',
5332      qpih.orig_sys_header_ref,null,null,null,l_msg_txt
5333     FROM QP_INTERFACE_LIST_HEADERS qpih
5334     WHERE qpih.request_id = p_request_id
5335       AND  qpih.process_status_flag ='P' --is null
5336       AND  qpih.interface_action_code IN ('INSERT', 'UPDATE')
5337       AND qpih.terms_id IS NOT NULL
5338       AND qpih.terms IS NOT NULL
5339       AND qpih.terms <> QP_BULK_LOADER_PUB.G_NULL_CHAR
5340       --Bug#5248659 RAVI
5341       --Use Term_id not terms_id
5342       AND NOT EXISTS (SELECT   TERM_ID
5343                       FROM     RA_TERMS
5344                       WHERE    TERM_ID = qpih.terms_id
5345                         AND    name = qpih.terms
5346                         AND    sysdate BETWEEN nvl(start_date_active, sysdate)
5347                                      AND    nvl(end_date_active, sysdate) );
5348 
5349     INSERT INTO QP_INTERFACE_ERRORS
5350    (error_id,last_update_date, last_updated_by, creation_date,
5351     created_by, last_update_login, request_id, program_application_id,
5352     program_id, program_update_date, entity_type, table_name, column_name,
5353     orig_sys_header_ref,orig_sys_line_ref,orig_sys_qualifier_ref,
5354     orig_sys_pricing_attr_ref, error_message)
5355     SELECT
5356      qp_interface_errors_s.nextval, sysdate ,FND_GLOBAL.USER_ID, sysdate,
5357      FND_GLOBAL.USER_ID, FND_GLOBAL.CONC_LOGIN_ID, qpih.request_id, 661,
5358      NULL,NULL, 'PRL', 'QP_INTERFACE_LIST_HEADERS', 'PAYMENT TERMS',
5359      qpih.orig_sys_header_ref,null,null,null,l_msg_txt
5360     FROM QP_INTERFACE_LIST_HEADERS qpih
5361     WHERE qpih.request_id = p_request_id
5362       AND  qpih.process_status_flag ='P' --is null
5363       AND  qpih.interface_action_code IN ('INSERT', 'UPDATE')
5364       AND qpih.terms_id IS NOT NULL
5365       AND qpih.terms IS NULL
5366       --Bug#5248659 RAVI
5367       --Use Term_id not terms_id
5368       AND NOT EXISTS (SELECT   TERM_ID
5369                       FROM     RA_TERMS
5370                       WHERE    TERM_ID = qpih.terms_id
5371                         AND    sysdate BETWEEN nvl(start_date_active, sysdate)
5372                                      AND    nvl(end_date_active, sysdate) );
5373 
5374     INSERT INTO QP_INTERFACE_ERRORS
5375    (error_id,last_update_date, last_updated_by, creation_date,
5376     created_by, last_update_login, request_id, program_application_id,
5377     program_id, program_update_date, entity_type, table_name, column_name,
5378     orig_sys_header_ref,orig_sys_line_ref,orig_sys_qualifier_ref,
5379     orig_sys_pricing_attr_ref, error_message)
5380     SELECT
5381      qp_interface_errors_s.nextval, sysdate ,FND_GLOBAL.USER_ID, sysdate,
5382      FND_GLOBAL.USER_ID, FND_GLOBAL.CONC_LOGIN_ID, qpih.request_id, 661,
5383      NULL,NULL, 'PRL', 'QP_INTERFACE_LIST_HEADERS', 'PAYMENT TERMS',
5384      qpih.orig_sys_header_ref,null,null,null,l_msg_txt
5385     FROM QP_INTERFACE_LIST_HEADERS qpih
5386     WHERE qpih.request_id = p_request_id
5387       AND  qpih.process_status_flag ='P' --is null
5388       AND  qpih.interface_action_code IN ('INSERT', 'UPDATE')
5389       AND qpih.terms_id IS NULL
5390       AND qpih.terms IS NOT NULL
5391       AND qpih.terms <> QP_BULK_LOADER_PUB.G_NULL_CHAR
5392       --Bug#5248659 RAVI
5393       --Use Term_id not terms_id
5394       AND NOT EXISTS (SELECT   TERM_ID
5395                       FROM     RA_TERMS
5396                       WHERE    name = qpih.terms
5397                         AND    sysdate BETWEEN nvl(start_date_active, sysdate)
5398                                      AND    nvl(end_date_active, sysdate) );
5399 
5400 --Bug# 5412029 END RAVI
5401   -- 6. Currency Header
5402 
5403 FND_MESSAGE.SET_NAME('QP','QP_INVALID_ATTRIBUTE');
5404 FND_MESSAGE.SET_TOKEN('ATTRIBUTE', 'CURRENCY HEADER');
5405 l_msg_txt := FND_MESSAGE.GET;
5406 
5407 -- Bug 4938046,5412029 START RAVI
5408 /**
5409 Currency Header and Header ID validation
5410 **/
5411 
5412 INSERT INTO QP_INTERFACE_ERRORS
5413    (error_id,last_update_date, last_updated_by, creation_date,
5414     created_by, last_update_login, request_id, program_application_id,
5415     program_id, program_update_date, entity_type, table_name, column_name,
5416     orig_sys_header_ref,orig_sys_line_ref,orig_sys_qualifier_ref,
5417     orig_sys_pricing_attr_ref,  error_message)
5418     SELECT
5419      qp_interface_errors_s.nextval, sysdate ,FND_GLOBAL.USER_ID, sysdate,
5420      FND_GLOBAL.USER_ID, FND_GLOBAL.CONC_LOGIN_ID, qpih.request_id, 661,
5421      NULL,NULL, 'PRL', 'QP_INTERFACE_LIST_HEADERS',  'CURRENCY_HEADER',
5422      qpih.orig_sys_header_ref,null,null,null,l_msg_txt
5423     FROM QP_INTERFACE_LIST_HEADERS qpih
5424     WHERE qpih.request_id = p_request_id
5425       AND qpih.process_status_flag ='P' --is null
5426       AND qpih.interface_action_code IN ('INSERT', 'UPDATE')
5427       AND qpih.currency_header_id is NOT NULL
5428       AND qpih.currency_header is NOT NULL
5429       AND qpih.currency_header <> QP_BULK_LOADER_PUB.G_NULL_CHAR
5430       AND NOT EXISTS ( SELECT qpclb.currency_header_id
5431 		       FROM   qp_currency_lists_b qpclb, qp_currency_lists_tl qpclt
5432 		       WHERE  qpclb.currency_header_id = qpih.currency_header_id
5433                AND    qpclb.base_currency_code = qpih.currency_code
5434                AND    qpclt.currency_header_id = qpclb.currency_header_id
5435                AND    qpclt.language = nvl(qpih.language,'US')
5436                AND    qpclt.name = qpih.currency_header);
5437 
5438 INSERT INTO QP_INTERFACE_ERRORS
5439    (error_id,last_update_date, last_updated_by, creation_date,
5440     created_by, last_update_login, request_id, program_application_id,
5441     program_id, program_update_date, entity_type, table_name, column_name,
5442     orig_sys_header_ref,orig_sys_line_ref,orig_sys_qualifier_ref,
5443     orig_sys_pricing_attr_ref,  error_message)
5444     SELECT
5445      qp_interface_errors_s.nextval, sysdate ,FND_GLOBAL.USER_ID, sysdate,
5446      FND_GLOBAL.USER_ID, FND_GLOBAL.CONC_LOGIN_ID, qpih.request_id, 661,
5447      NULL,NULL, 'PRL', 'QP_INTERFACE_LIST_HEADERS',  'CURRENCY_HEADER',
5448      qpih.orig_sys_header_ref,null,null,null,l_msg_txt
5449     FROM QP_INTERFACE_LIST_HEADERS qpih
5450     WHERE qpih.request_id = p_request_id
5451       AND  qpih.process_status_flag ='P' --is null
5452       AND  qpih.interface_action_code IN ('INSERT', 'UPDATE')
5453       AND  qpih.currency_header is NOT NULL
5454       AND  qpih.currency_header <> QP_BULK_LOADER_PUB.G_NULL_CHAR
5455       AND  qpih.currency_header_id is NULL
5456       AND NOT EXISTS ( SELECT qpclb.currency_header_id
5457 		       FROM   qp_currency_lists_b qpclb, qp_currency_lists_tl qpclt
5458 		       WHERE  qpclb.base_currency_code = qpih.currency_code
5459                AND    qpclt.currency_header_id = qpclb.currency_header_id
5460                AND    qpclt.language = nvl(qpih.language,'US')
5461                AND    qpclt.name = qpih.currency_header);
5462 
5463 INSERT INTO QP_INTERFACE_ERRORS
5464    (error_id,last_update_date, last_updated_by, creation_date,
5465     created_by, last_update_login, request_id, program_application_id,
5466     program_id, program_update_date, entity_type, table_name, column_name,
5467     orig_sys_header_ref,orig_sys_line_ref,orig_sys_qualifier_ref,
5468     orig_sys_pricing_attr_ref,  error_message)
5469     SELECT
5470      qp_interface_errors_s.nextval, sysdate ,FND_GLOBAL.USER_ID, sysdate,
5471      FND_GLOBAL.USER_ID, FND_GLOBAL.CONC_LOGIN_ID, qpih.request_id, 661,
5472      NULL,NULL, 'PRL', 'QP_INTERFACE_LIST_HEADERS',  'CURRENCY_HEADER',
5473      qpih.orig_sys_header_ref,null,null,null,l_msg_txt
5474     FROM QP_INTERFACE_LIST_HEADERS qpih
5475     WHERE qpih.request_id = p_request_id
5476       AND  qpih.process_status_flag ='P' --is null
5477       AND  qpih.interface_action_code IN ('INSERT', 'UPDATE')
5478       AND  qpih.currency_header_id is NOT NULL
5479       AND  qpih.currency_header is NULL
5480       AND NOT EXISTS ( SELECT qpclb.currency_header_id
5481 		       FROM   qp_currency_lists_b qpclb
5482 		       WHERE  qpclb.currency_header_id = qpih.currency_header_id
5483                        AND    qpclb.base_currency_code = qpih.currency_code);
5484 -- Bug 4938046,5412029 END RAVI
5485 
5486   -- 7. Name
5487 
5488 fnd_message.set_name('QP', 'QP_ATTRIBUTE_REQUIRED');
5489 FND_MESSAGE.SET_TOKEN('ATTRIBUTE', 'NAME');
5490 l_msg_txt := FND_MESSAGE.GET;
5491 
5492 INSERT INTO QP_INTERFACE_ERRORS
5493    (error_id,last_update_date, last_updated_by, creation_date,
5494     created_by, last_update_login, request_id, program_application_id,
5495     program_id, program_update_date, entity_type, table_name, column_name,
5496     orig_sys_header_ref,orig_sys_line_ref,orig_sys_qualifier_ref,
5497     orig_sys_pricing_attr_ref,  error_message)
5498     SELECT
5499      qp_interface_errors_s.nextval, sysdate ,FND_GLOBAL.USER_ID, sysdate,
5500      FND_GLOBAL.USER_ID, FND_GLOBAL.CONC_LOGIN_ID, qpih.request_id, 661,
5501      NULL,NULL, 'PRL', 'QP_INTERFACE_LIST_HEADERS',  'Name',
5502      qpih.orig_sys_header_ref,null,null,null,l_msg_txt
5503     FROM QP_INTERFACE_LIST_HEADERS qpih
5504     WHERE qpih.request_id = p_request_id
5505       AND  qpih.process_status_flag ='P' --is null
5506 --      AND  qpih.interface_action_code IN ('INSERT', 'UPDATE')
5507       AND  qpih.interface_action_code IN ('INSERT')
5508       AND  (name is null or name = '');
5509 
5510   -- 8. Name in other pricelists
5511 
5512 fnd_message.set_name('QP', 'SO_OTHER_NAME_ALREADY_IN_USE');
5513 l_msg_txt := FND_MESSAGE.GET;
5514 
5515  qp_bulk_loader_pub.write_log('Name check in TL table '||userenv('LANG')||' '||to_char(p_request_id));
5516 
5517 INSERT INTO QP_INTERFACE_ERRORS
5518    (error_id,last_update_date, last_updated_by, creation_date,
5519     created_by, last_update_login, request_id, program_application_id,
5520     program_id, program_update_date, entity_type, table_name, column_name,
5521     orig_sys_header_ref,orig_sys_line_ref,orig_sys_qualifier_ref,
5522     orig_sys_pricing_attr_ref,  error_message)
5523     SELECT
5524      qp_interface_errors_s.nextval, sysdate ,FND_GLOBAL.USER_ID, sysdate,
5525      FND_GLOBAL.USER_ID, FND_GLOBAL.CONC_LOGIN_ID, qpih.request_id, 661,
5526      NULL,NULL, 'PRL', 'QP_INTERFACE_LIST_HEADERS',  'Name',
5527      qpih.orig_sys_header_ref,null,null,null,l_msg_txt
5528     FROM QP_INTERFACE_LIST_HEADERS qpih
5529     WHERE qpih.request_id = p_request_id
5530       AND  qpih.process_status_flag ='P' --is null
5531       AND  qpih.interface_action_code IN ('INSERT')
5532       AND EXISTS ( Select qlht.name from qp_list_headers_tl qlht
5533 	     	   where qlht.name= qpih.name
5534 	           and qlht.language = qpih.language);
5535 
5536  qp_bulk_loader_pub.write_log('Count '||SQL%ROWCOUNT);
5537 
5538   -- 9. Name in other Interface header records
5539 
5540 fnd_message.set_name('QP', 'SO_OTHER_NAME_ALREADY_IN_USE');
5541 l_msg_txt := FND_MESSAGE.GET;
5542 
5543 INSERT INTO QP_INTERFACE_ERRORS
5544    (error_id,last_update_date, last_updated_by, creation_date,
5545     created_by, last_update_login, request_id, program_application_id,
5546     program_id, program_update_date, entity_type, table_name, column_name,
5547     orig_sys_header_ref,orig_sys_line_ref,orig_sys_qualifier_ref,
5548     orig_sys_pricing_attr_ref,  error_message)
5549     SELECT
5550      qp_interface_errors_s.nextval, sysdate ,FND_GLOBAL.USER_ID, sysdate,
5551      FND_GLOBAL.USER_ID, FND_GLOBAL.CONC_LOGIN_ID, qpih.request_id, 661,
5552      NULL,NULL, 'PRL', 'QP_INTERFACE_LIST_HEADERS',  'Name',
5553      qpih.orig_sys_header_ref,null,null,null,l_msg_txt
5554     FROM QP_INTERFACE_LIST_HEADERS qpih
5555     WHERE qpih.request_id = p_request_id
5556       AND  qpih.process_status_flag ='P' --is null
5557       AND  qpih.interface_action_code IN ('INSERT')
5558       AND EXISTS ( Select 'x' from qp_interface_list_headers qpih1
5559 		  where qpih1.request_id = p_request_id
5560 		    and qpih1.name = qpih.name
5561 		    and qpih1.process_status_flag is null
5562 		    and qpih1.rowid <> qpih.rowid
5563 		    and qpih1.interface_action_code = 'INSERT');
5564  qp_bulk_loader_pub.write_log('Count 9 '||SQL%ROWCOUNT);
5565 
5566   -- 10. Pricing Transaction Entity
5567 
5568 FND_MESSAGE.SET_NAME('QP','QP_INVALID_ATTRIBUTE');
5569 FND_MESSAGE.SET_TOKEN('ATTRIBUTE', 'Pricing Transaction Entity');
5570 l_msg_txt := FND_MESSAGE.GET;
5571 
5572 INSERT INTO QP_INTERFACE_ERRORS
5573    (error_id,last_update_date, last_updated_by, creation_date,
5574     created_by, last_update_login, request_id, program_application_id,
5575     program_id, program_update_date, entity_type, table_name, column_name,
5576     orig_sys_header_ref,orig_sys_line_ref,orig_sys_qualifier_ref,
5577     orig_sys_pricing_attr_ref,  error_message)
5578     SELECT
5579      qp_interface_errors_s.nextval, sysdate ,FND_GLOBAL.USER_ID, sysdate,
5580      FND_GLOBAL.USER_ID, FND_GLOBAL.CONC_LOGIN_ID, qpih.request_id, 661,
5581      NULL,NULL, 'PRL', 'QP_INTERFACE_LIST_HEADERS',  'pte_code',
5582      qpih.orig_sys_header_ref,null,null,null,l_msg_txt
5583     FROM QP_INTERFACE_LIST_HEADERS qpih
5584     WHERE qpih.request_id = p_request_id
5585       AND  qpih.process_status_flag ='P' --is null
5586       AND   qpih.interface_action_code IN ('INSERT', 'UPDATE')
5587       AND   qpih.pte_code IS NOT NULL
5588       AND   NOT EXISTS (SELECT lookup_code
5589      		      FROM qp_lookups
5590      	      	      WHERE lookup_type = 'QP_PTE_TYPE'
5591      		      AND  lookup_code   = qpih.pte_code);
5592 
5593   -- 11. Source System Code
5594 
5595 FND_MESSAGE.SET_NAME('QP','QP_INVALID_ATTRIBUTE');
5596 FND_MESSAGE.SET_TOKEN('ATTRIBUTE', 'Source System Code');
5597 l_msg_txt := FND_MESSAGE.GET;
5598 
5599 INSERT INTO QP_INTERFACE_ERRORS
5600    (error_id,last_update_date, last_updated_by, creation_date,
5601     created_by, last_update_login, request_id, program_application_id,
5602     program_id, program_update_date, entity_type, table_name, column_name,
5603     orig_sys_header_ref,orig_sys_line_ref,orig_sys_qualifier_ref,
5604     orig_sys_pricing_attr_ref,  error_message)
5605     SELECT
5606      qp_interface_errors_s.nextval, sysdate ,FND_GLOBAL.USER_ID, sysdate,
5607      FND_GLOBAL.USER_ID, FND_GLOBAL.CONC_LOGIN_ID, qpih.request_id, 661,
5608      NULL,NULL, 'PRL', 'QP_INTERFACE_LIST_HEADERS',  'Name',
5609      qpih.orig_sys_header_ref,null,null,null,l_msg_txt
5610     FROM QP_INTERFACE_LIST_HEADERS qpih
5611     WHERE qpih.request_id = p_request_id
5612       AND  qpih.process_status_flag ='P' --is null
5613       AND  qpih.interface_action_code IN ('INSERT', 'UPDATE')
5614       AND   qpih.source_system_code IS NOT NULL
5615       AND   NOT EXISTS (SELECT lookup_code
5616      		      FROM qp_lookups
5617      	      	      WHERE lookup_type = 'SOURCE_SYSTEM'
5618      		      AND  lookup_code   = qpih.source_system_code);
5619 
5620 -- Bug 5208365 RAVI
5621 INSERT INTO QP_INTERFACE_ERRORS
5622    (error_id,last_update_date, last_updated_by, creation_date,
5623     created_by, last_update_login, request_id, program_application_id,
5624     program_id, program_update_date, entity_type, table_name, column_name,
5625     orig_sys_header_ref,orig_sys_line_ref,orig_sys_qualifier_ref,
5626     orig_sys_pricing_attr_ref,  error_message)
5627     SELECT
5628      qp_interface_errors_s.nextval, sysdate ,FND_GLOBAL.USER_ID, sysdate,
5629      FND_GLOBAL.USER_ID, FND_GLOBAL.CONC_LOGIN_ID, qpih.request_id, 661,
5630      NULL,NULL, 'PRL', 'QP_INTERFACE_LIST_HEADERS',  'Name',
5631      qpih.orig_sys_header_ref,null,null,null,l_msg_txt
5632     FROM QP_INTERFACE_LIST_HEADERS qpih
5633     WHERE qpih.request_id = p_request_id
5634       AND  qpih.process_status_flag ='P' --is null
5635       AND  qpih.interface_action_code IN ('INSERT', 'UPDATE')
5636       -- Bug 5416556 RAVI
5637       --Only Price Lists with source system code equal to FND_PROFILE.VALUE('QP_SOURCE_SYSTEM_CODE') should be updated.
5638       AND   qpih.source_system_code <> FND_PROFILE.VALUE('QP_SOURCE_SYSTEM_CODE');
5639 
5640 --for bug 4731613 moved this validation to attribute_header procedure
5641   -- 12. Validate Orig_Org_Id
5642 
5643 FND_MESSAGE.SET_NAME('FND','FND_MO_ORG_INVALID');
5644 --FND_MESSAGE.SET_TOKEN('ATTRIBUTE', 'Source System Code');
5645 l_msg_txt := FND_MESSAGE.GET;
5646 
5647 INSERT INTO QP_INTERFACE_ERRORS
5648    (error_id,last_update_date, last_updated_by, creation_date,
5649     created_by, last_update_login, request_id, program_application_id,
5650     program_id, program_update_date, entity_type, table_name, column_name,
5651     orig_sys_header_ref,orig_sys_line_ref,orig_sys_qualifier_ref,
5652     orig_sys_pricing_attr_ref,  error_message)
5653     SELECT
5654      qp_interface_errors_s.nextval, sysdate ,FND_GLOBAL.USER_ID, sysdate,
5655      FND_GLOBAL.USER_ID, FND_GLOBAL.CONC_LOGIN_ID, qpih.request_id, 661,
5656      NULL,NULL, 'PRL', 'QP_INTERFACE_LIST_HEADERS',  'Name',
5657      qpih.orig_sys_header_ref,null,null,null,l_msg_txt
5658     FROM QP_INTERFACE_LIST_HEADERS qpih
5659     WHERE qpih.request_id = p_request_id
5660       AND  qpih.process_status_flag ='P' --is null
5661       AND  qpih.interface_action_code IN ('INSERT', 'UPDATE')
5662       AND   qpih.global_flag = 'N' and qpih.orig_org_id IS NOT NULL
5663       AND   QP_UTIL.validate_org_id(qpih.orig_org_id) = 'N';
5664 
5665   --Bug#5208112 RAVI START
5666   -- 13. Validate Rounding Factor
5667 
5668   FND_MESSAGE.SET_NAME('QP','QP_ROUNDING_FACTOR_NO_UPDATE');
5669   l_msg_txt := FND_MESSAGE.GET;
5670 
5671   INSERT INTO QP_INTERFACE_ERRORS
5672    (error_id,last_update_date, last_updated_by, creation_date,
5673     created_by, last_update_login, request_id, program_application_id,
5674     program_id, program_update_date, entity_type, table_name, column_name,
5675     orig_sys_header_ref,orig_sys_line_ref,orig_sys_qualifier_ref,
5676     orig_sys_pricing_attr_ref,  error_message)
5677     SELECT
5678      qp_interface_errors_s.nextval, sysdate ,FND_GLOBAL.USER_ID, sysdate,
5679      FND_GLOBAL.USER_ID, FND_GLOBAL.CONC_LOGIN_ID, qpih.request_id, 661,
5680      NULL,NULL, 'PRL', 'QP_INTERFACE_LIST_HEADERS',  'ROUNDING_FACTOR',
5681      qpih.orig_sys_header_ref,null,null,null,l_msg_txt
5682     FROM QP_INTERFACE_LIST_HEADERS qpih
5683     WHERE qpih.request_id = p_request_id
5684       AND qpih.process_status_flag ='P' --is null
5685       AND qpih.interface_action_code ='UPDATE'
5686       AND EXISTS(
5687             select 1 from qp_list_headers qplh
5688             where qplh.orig_system_header_ref=qpih.orig_sys_header_ref
5689             and qplh.rounding_factor <> qpih.rounding_factor
5690             );
5691   --Bug#5208112 RAVI END
5692 
5693   -- Bug#3604226 RAVI START
5694 
5695   -- 14. Only one record with a unique Orig_Sys_Hdr_ref must be updated in one request
5696   -- Commenting code for bug 6961376
5697 
5698   /*fnd_message.set_name('QP', 'QP_HDR_REF_MULTIPLE_UPDATE');
5699   l_msg_txt := FND_MESSAGE.GET;
5700 
5701   INSERT INTO QP_INTERFACE_ERRORS
5702    (error_id,last_update_date, last_updated_by, creation_date,
5703     created_by, last_update_login, request_id, program_application_id,
5704     program_id, program_update_date, entity_type, table_name, column_name,
5705     orig_sys_header_ref,orig_sys_line_ref,orig_sys_qualifier_ref,
5706     orig_sys_pricing_attr_ref,  error_message)
5707     SELECT
5708      qp_interface_errors_s.nextval, sysdate ,FND_GLOBAL.USER_ID, sysdate,
5709      FND_GLOBAL.USER_ID, FND_GLOBAL.CONC_LOGIN_ID, qpih.request_id, 661,
5710      NULL,NULL, 'PRL', 'QP_INTERFACE_LIST_HEADERS',  'ORIG_SYS_HEADER_REF',
5711      qpih.orig_sys_header_ref,null,null,null,l_msg_txt
5712     FROM QP_INTERFACE_LIST_HEADERS qpih
5713     WHERE qpih.request_id = p_request_id
5714       AND qpih.process_status_flag ='P' --is null
5715       AND qpih.interface_action_code IN ('UPDATE', 'DELETE')
5716       AND ( select count(*) from qp_interface_list_headers qplh
5717             where qplh.orig_sys_header_ref=qpih.orig_sys_header_ref
5718             ) > 1;*/
5719   --Bug#3604226 RAVI END
5720 
5721 
5722  qp_bulk_loader_pub.write_log('Leaving Attribute Header validation');
5723 
5724  EXCEPTION
5725     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
5726        qp_bulk_loader_pub.write_log( 'UNEXCPECTED ERROR IN PROCEDURE ATTRIBUTE_HEADER:'||sqlerrm);
5727        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5728     WHEN OTHERS THEN
5729        qp_bulk_loader_pub.write_log( 'UNEXCPECTED ERROR IN PROCEDURE ATTRIBUTE_HEADER:'||sqlerrm);
5730        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5731 
5732 END ATTRIBUTE_HEADER;
5733 
5734 
5735 
5736 PROCEDURE ATTRIBUTE_QUALIFIER
5737                (p_request_id NUMBER)
5738 IS
5739 
5740    l_msg_txt VARCHAR2(240);
5741    l_pte_code VARCHAR2(30);
5742 
5743 BEGIN
5744 
5745     qp_bulk_loader_pub.write_log('Entering Attribute qualifier validation');
5746     FND_PROFILE.GET('QP_PRICING_TRANSACTION_ENTITY',l_pte_code);
5747     --1. Comparison Operator
5748 
5749    FND_MESSAGE.SET_NAME('QP','QP_INVALID_ATTRIBUTE');
5750    FND_MESSAGE.SET_TOKEN('ATTRIBUTE','COMPARISON OPERATOR');
5751    l_msg_txt := FND_MESSAGE.GET;
5752 
5753     INSERT INTO QP_INTERFACE_ERRORS
5754    (error_id,last_update_date, last_updated_by, creation_date,
5755     created_by, last_update_login, request_id, program_application_id,
5756     program_id, program_update_date, entity_type, table_name, column_name,
5757     orig_sys_header_ref,orig_sys_line_ref,orig_sys_qualifier_ref,
5758     orig_sys_pricing_attr_ref,  error_message)
5759     SELECT
5760      qp_interface_errors_s.nextval, sysdate ,FND_GLOBAL.USER_ID, sysdate,
5761      FND_GLOBAL.USER_ID, FND_GLOBAL.CONC_LOGIN_ID, qpiq.request_id, 661,
5762      NULL,NULL, 'PRL', 'QP_INTERFACE_QUALIFIERS',  'COMPARISON_OPERATOR',
5763      qpiq.orig_sys_header_ref,null,qpiq.orig_sys_qualifier_ref,null, l_msg_txt
5764     FROM QP_INTERFACE_QUALIFIERS qpiq
5765     WHERE qpiq.request_id = p_request_id
5766       AND  qpiq.process_status_flag ='P' --is null
5767       AND  qpiq.interface_action_code IN ('INSERT', 'UPDATE')
5768       AND  qpiq.comparison_operator_code is NOT NULL
5769       AND NOT EXISTS ( SELECT  lookup_code
5770 		       FROM     qp_lookups
5771 		       WHERE lookup_type = 'COMPARISON_OPERATOR'
5772 	               AND    lookup_code   = qpiq.comparison_operator_code);
5773 
5774    --2. Orig sys header ref
5775 
5776    FND_MESSAGE.SET_NAME('QP','QP_INVALID_ATTRIBUTE');
5777    FND_MESSAGE.SET_TOKEN('ATTRIBUTE','ORIG SYS HEADER REF');
5778    l_msg_txt := FND_MESSAGE.GET;
5779 
5780     INSERT INTO QP_INTERFACE_ERRORS
5781    (error_id,last_update_date, last_updated_by, creation_date,
5782     created_by, last_update_login, request_id, program_application_id,
5783     program_id, program_update_date, entity_type, table_name, column_name,
5784     orig_sys_header_ref,orig_sys_line_ref,orig_sys_qualifier_ref,
5785     orig_sys_pricing_attr_ref,error_message)
5786     SELECT
5787      qp_interface_errors_s.nextval, sysdate ,FND_GLOBAL.USER_ID, sysdate,
5788      FND_GLOBAL.USER_ID, FND_GLOBAL.CONC_LOGIN_ID, qpiq.request_id, 661,
5789      NULL,NULL, 'PRL', 'QP_INTERFACE_QUALIFIERS',  'ORIG_SYS_HEADER_REF',
5790      qpiq.orig_sys_header_ref,null,qpiq.orig_sys_qualifier_ref,null,l_msg_txt
5791     FROM QP_INTERFACE_QUALIFIERS qpiq
5792     WHERE qpiq.request_id = p_request_id
5793       AND  qpiq.process_status_flag ='P' --is null
5794       AND  qpiq.interface_action_code IN ('INSERT', 'UPDATE')
5795       AND  qpiq.orig_sys_header_ref is NOT NULL
5796       AND NOT EXISTS ( SELECT  orig_system_header_ref
5797 		       FROM     qp_list_headers_b
5798 		       WHERE  orig_system_header_ref = qpiq.orig_sys_header_ref);
5799 
5800     --3. Secondary Pricelist
5801 
5802 -- Basic_Pricing_Condition
5803    -- In the case of Basic pricing only the qualifier of type secondary
5804    -- Pricelists are allowed.
5805 
5806    IF QP_BULK_LOADER_PUB.GET_QP_STATUS <> 'I' THEN
5807 
5808        FND_MESSAGE.SET_NAME('QP','QP_QUAL_NA_BASIC');
5809        --Qualifiers not allowed in Basic Pricing
5810        l_msg_txt := FND_MESSAGE.GET;
5811 
5812 	INSERT INTO QP_INTERFACE_ERRORS
5813        (error_id,last_update_date, last_updated_by, creation_date,
5814 	created_by, last_update_login, request_id, program_application_id,
5815 	program_id, program_update_date, entity_type, table_name,
5816 	orig_sys_header_ref,orig_sys_line_ref,orig_sys_qualifier_ref,
5817 	orig_sys_pricing_attr_ref,  error_message)
5818 	SELECT
5819 	 qp_interface_errors_s.nextval, sysdate ,FND_GLOBAL.USER_ID, sysdate,
5820 	 FND_GLOBAL.USER_ID, FND_GLOBAL.CONC_LOGIN_ID, qpiq.request_id, 661,
5821 	 NULL,NULL, 'PRL', 'QP_INTERFACE_QUALIFIERS',
5822 	 qpiq.orig_sys_header_ref,null,qpiq.orig_sys_qualifier_ref,null, l_msg_txt
5823 	FROM QP_INTERFACE_QUALIFIERS qpiq
5824 	WHERE qpiq.request_id = p_request_id
5825 	  AND  qpiq.process_status_flag ='P' --is null
5826 	  AND  qpiq.interface_action_code IN ('INSERT', 'UPDATE')
5827 	  AND  (qpiq.qualifier_context <> 'MODLIST'
5828 	    OR qpiq.qualifier_attribute <> 'QUALIFIER_ATTRIBUTE4');
5829 
5830   END IF;
5831 
5832    --4. Qualifier Context
5833        FND_MESSAGE.SET_NAME('QP','QP_ATTRIBUTE_REQUIRED');
5834        FND_MESSAGE.SET_TOKEN('ATTRIBUTE', 'QUALIFIER CONTEXT');
5835 
5836        l_msg_txt := FND_MESSAGE.GET;
5837 
5838 	INSERT INTO QP_INTERFACE_ERRORS
5839        (error_id,last_update_date, last_updated_by, creation_date,
5840 	created_by, last_update_login, request_id, program_application_id,
5841 	program_id, program_update_date, entity_type, table_name,
5842 	orig_sys_header_ref,orig_sys_line_ref,orig_sys_qualifier_ref,
5843 	orig_sys_pricing_attr_ref,  error_message)
5844 	SELECT
5845 	 qp_interface_errors_s.nextval, sysdate ,FND_GLOBAL.USER_ID, sysdate,
5846 	 FND_GLOBAL.USER_ID, FND_GLOBAL.CONC_LOGIN_ID, qpiq.request_id, 661,
5847 	 NULL,NULL, 'PRL', 'QP_INTERFACE_QUALIFIERS',
5848 	 qpiq.orig_sys_header_ref,null,qpiq.orig_sys_qualifier_ref,null, l_msg_txt
5849 	FROM QP_INTERFACE_QUALIFIERS qpiq
5850 	WHERE qpiq.request_id = p_request_id
5851 	  AND  qpiq.process_status_flag ='P' --is null
5852 	  AND  qpiq.interface_action_code IN ('INSERT', 'UPDATE')
5853 	  AND  qpiq.qualifier_context IS NULL;
5854 
5855    --5. Qualifier Attribute
5856 
5857    FND_MESSAGE.SET_NAME('QP','QP_INVALID_ATTRIBUTE');
5858    FND_MESSAGE.SET_TOKEN('ATTRIBUTE','QUALIFIER ATTRIBUTE');
5859    l_msg_txt := FND_MESSAGE.GET;
5860 
5861 --Bug# 5456164 START RAVI
5862 --Validate qualifier attribute
5863     INSERT INTO QP_INTERFACE_ERRORS
5864    (error_id,last_update_date, last_updated_by, creation_date,
5865     created_by, last_update_login, request_id, program_application_id,
5866     program_id, program_update_date, entity_type, table_name, column_name,
5867     orig_sys_header_ref,orig_sys_line_ref,orig_sys_qualifier_ref,
5868     orig_sys_pricing_attr_ref,error_message)
5869     SELECT
5870      qp_interface_errors_s.nextval, sysdate ,FND_GLOBAL.USER_ID, sysdate,
5871      FND_GLOBAL.USER_ID, FND_GLOBAL.CONC_LOGIN_ID, qpiq.request_id, 661,
5872      NULL,NULL, 'PRL', 'QP_INTERFACE_QUALIFIERS',  'QUALIFIER_ATTRIBUTE',
5873      qpiq.orig_sys_header_ref,null,qpiq.orig_sys_qualifier_ref,null,l_msg_txt
5874     FROM QP_INTERFACE_QUALIFIERS qpiq
5875     WHERE qpiq.request_id = p_request_id
5876       AND  qpiq.process_status_flag ='P' --is null
5877       AND  qpiq.interface_action_code IN ('INSERT', 'UPDATE')
5878       AND  qpiq.qualifier_attribute is not null
5879       AND  qpiq.qualifier_attribute_code is not null
5880       AND  qpiq.qualifier_attribute_code <> QP_BULK_LOADER_PUB.G_NULL_CHAR
5881       AND NOT EXISTS (
5882         SELECT  'x'
5883         FROM    qp_interface_qualifiers b,
5884                 qp_prc_contexts_b d,
5885                 qp_segments_b e,
5886                 qp_pte_segments f
5887         WHERE b.qualifier_context = d.prc_context_code
5888 	  AND b.qualifier_attribute = e.segment_mapping_column
5889           and e.segment_code = b.qualifier_attribute_code
5890 	  AND d.prc_context_id = e.prc_context_id
5891           AND d.prc_context_type = 'QUALIFIER'
5892 	  AND e.segment_id = f.segment_id
5893 	  AND f.pte_code = l_pte_code
5894 	 -- AND f.segment_level NOT IN ('LINE')   bug#12710486
5895 	  AND qpiq.rowid = b.rowid);
5896 
5897     INSERT INTO QP_INTERFACE_ERRORS
5898    (error_id,last_update_date, last_updated_by, creation_date,
5899     created_by, last_update_login, request_id, program_application_id,
5900     program_id, program_update_date, entity_type, table_name, column_name,
5901     orig_sys_header_ref,orig_sys_line_ref,orig_sys_qualifier_ref,
5902     orig_sys_pricing_attr_ref,error_message)
5903     SELECT
5904      qp_interface_errors_s.nextval, sysdate ,FND_GLOBAL.USER_ID, sysdate,
5905      FND_GLOBAL.USER_ID, FND_GLOBAL.CONC_LOGIN_ID, qpiq.request_id, 661,
5906      NULL,NULL, 'PRL', 'QP_INTERFACE_QUALIFIERS',  'QUALIFIER_ATTRIBUTE',
5907      qpiq.orig_sys_header_ref,null,qpiq.orig_sys_qualifier_ref,null,l_msg_txt
5908     FROM QP_INTERFACE_QUALIFIERS qpiq
5909     WHERE qpiq.request_id = p_request_id
5910       AND  qpiq.process_status_flag ='P' --is null
5911       AND  qpiq.interface_action_code IN ('INSERT', 'UPDATE')
5912       AND  qpiq.qualifier_attribute is null
5913       AND  qpiq.qualifier_attribute_code is not null
5914       AND  qpiq.qualifier_attribute_code <> QP_BULK_LOADER_PUB.G_NULL_CHAR
5915       AND NOT EXISTS (
5916         SELECT  'x'
5917         FROM    qp_interface_qualifiers b,
5918                 qp_prc_contexts_b d,
5919                 qp_segments_b e,
5920                 qp_pte_segments f
5921         WHERE  b.qualifier_context = d.prc_context_code
5922            and e.segment_code = b.qualifier_attribute_code
5923 	   AND d.prc_context_id = e.prc_context_id
5924            AND d.prc_context_type = 'QUALIFIER'
5925 	   AND e.segment_id = f.segment_id
5926 	   AND f.pte_code = l_pte_code
5927 	  -- AND f.segment_level NOT IN ('LINE')   bug#12710486
5928 	   AND qpiq.rowid = b.rowid);
5929 
5930     INSERT INTO QP_INTERFACE_ERRORS
5931    (error_id,last_update_date, last_updated_by, creation_date,
5932     created_by, last_update_login, request_id, program_application_id,
5933     program_id, program_update_date, entity_type, table_name, column_name,
5934     orig_sys_header_ref,orig_sys_line_ref,orig_sys_qualifier_ref,
5935     orig_sys_pricing_attr_ref,error_message)
5936     SELECT
5937      qp_interface_errors_s.nextval, sysdate ,FND_GLOBAL.USER_ID, sysdate,
5938      FND_GLOBAL.USER_ID, FND_GLOBAL.CONC_LOGIN_ID, qpiq.request_id, 661,
5939      NULL,NULL, 'PRL', 'QP_INTERFACE_QUALIFIERS',  'QUALIFIER_ATTRIBUTE',
5940      qpiq.orig_sys_header_ref,null,qpiq.orig_sys_qualifier_ref,null,l_msg_txt
5941     FROM QP_INTERFACE_QUALIFIERS qpiq
5942     WHERE qpiq.request_id = p_request_id
5943       AND  qpiq.process_status_flag ='P' --is null
5944       AND  qpiq.interface_action_code IN ('INSERT', 'UPDATE')
5945       AND  qpiq.qualifier_attribute is not null
5946       AND  qpiq.qualifier_attribute_code is null
5947       AND NOT EXISTS (
5948         SELECT  'x'
5949         FROM    qp_interface_qualifiers b,
5950                 qp_prc_contexts_b d,
5951                 qp_segments_b e,
5952                 qp_pte_segments f
5953         WHERE b.qualifier_context = d.prc_context_code
5954 	  AND b.qualifier_attribute = e.segment_mapping_column
5955 	  AND d.prc_context_id = e.prc_context_id
5956           AND d.prc_context_type = 'QUALIFIER'
5957 	  AND e.segment_id = f.segment_id
5958 	  AND f.pte_code = l_pte_code
5959 	 -- AND f.segment_level NOT IN ('LINE')  bug#12710486
5960 	  AND qpiq.rowid = b.rowid);
5961 --Bug# 5456164 END RAVI
5962 
5963    qp_bulk_loader_pub.write_log('Leaving Attribute qualifier validation');
5964 
5965 EXCEPTION
5966     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
5967        qp_bulk_loader_pub.write_log( 'UNEXCPECTED ERROR IN PROCEDURE ATTRIBUTE_QUALIFIER:'||sqlerrm);
5968        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5969     WHEN OTHERS THEN
5970        qp_bulk_loader_pub.write_log( 'UNEXCPECTED ERROR IN PROCEDURE ATTRIBUTE_QUALIFIER:'||sqlerrm);
5971        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5972 
5973 END ATTRIBUTE_QUALIFIER;
5974 
5975 
5976 -- Bug# 5412045
5977 -- Shell for qp_validate.product_uom to return Varchar2 ('TRUE', 'FALSE')
5978 -- qp_validate.product_uom returns a boolean.
5979 Function product_uom ( p_product_uom_code IN VARCHAR2,
5980                        p_category_id IN NUMBER,
5981                        p_list_header_id IN NUMBER )
5982 RETURN VARCHAR2 IS
5983 BEGIN
5984    IF QP_Validate.product_uom(p_product_uom_code,p_category_id,p_list_header_id)=TRUE
5985    THEN
5986       RETURN 'TRUE';
5987    ELSE
5988       RETURN 'FALSE';
5989    END IF;
5990 EXCEPTION
5991   When OTHERS THEN
5992      RETURN 'FALSE';
5993 END product_uom;
5994 
5995 
5996 PROCEDURE ATTRIBUTE_LINE
5997                (p_request_id NUMBER)
5998 IS
5999 
6000    l_msg_txt  VARCHAR2(240);
6001    l_pte_code VARCHAR2(30);
6002 
6003    BEGIN
6004 
6005     qp_bulk_loader_pub.write_log('Entering Attribute line validation');
6006     FND_PROFILE.GET('QP_PRICING_TRANSACTION_ENTITY',l_pte_code);
6007 
6008     -- 1. LIST LINE TYPE CODE
6009    FND_MESSAGE.SET_NAME('QP','QP_INVALID_ATTRIBUTE');
6010    FND_MESSAGE.SET_TOKEN('ATTRIBUTE','LIST_LINE_TYPE_CODE');
6011    l_msg_txt := FND_MESSAGE.GET;
6012 
6013     INSERT INTO QP_INTERFACE_ERRORS
6014    (error_id,last_update_date, last_updated_by, creation_date,
6015     created_by, last_update_login, request_id, program_application_id,
6016     program_id, program_update_date, entity_type, table_name, column_name,
6017     orig_sys_header_ref,orig_sys_line_ref,orig_sys_qualifier_ref,
6018     orig_sys_pricing_attr_ref,error_message)
6019     SELECT
6020      qp_interface_errors_s.nextval, sysdate ,FND_GLOBAL.USER_ID, sysdate,
6021      FND_GLOBAL.USER_ID, FND_GLOBAL.CONC_LOGIN_ID, qpil.request_id, 661,
6022      NULL,NULL, 'PRL', 'QP_INTERFACE_LIST_LINES',  'LIST_LINE_TYPE_CODE',
6023      qpil.orig_sys_header_ref,qpil.orig_sys_line_ref,null,null, l_msg_txt
6024     FROM QP_INTERFACE_LIST_LINES qpil
6025     WHERE qpil.request_id = p_request_id
6026       AND  qpil.process_status_flag ='P' --is null
6027       AND  qpil.interface_action_code IN ('INSERT', 'UPDATE')
6028       AND  qpil.list_line_type_code is NOT NULL
6029       AND NOT EXISTS ( SELECT  lookup_code
6030 		       FROM     qp_lookups
6031 		       WHERE  lookup_type= 'LIST_LINE_TYPE_CODE'
6032                        AND        lookup_code= qpil.list_line_type_code
6033                        AND        qpil.list_line_type_code IN ('PLL', 'PBH') );
6034 
6035   -- 2. ARITHMETIC OPERATOR
6036    FND_MESSAGE.SET_NAME('QP','QP_INVALID_ATTRIBUTE');
6037    FND_MESSAGE.SET_TOKEN('ATTRIBUTE','ARITHMETIC_OPERATOR 5');
6038    l_msg_txt := FND_MESSAGE.GET;
6039 
6040     INSERT INTO QP_INTERFACE_ERRORS
6041    (error_id,last_update_date, last_updated_by, creation_date,
6042     created_by, last_update_login, request_id, program_application_id,
6043     program_id, program_update_date, entity_type, table_name, column_name,
6044     orig_sys_header_ref,orig_sys_line_ref,orig_sys_qualifier_ref,
6045     orig_sys_pricing_attr_ref,error_message)
6046     SELECT
6047      qp_interface_errors_s.nextval, sysdate ,FND_GLOBAL.USER_ID, sysdate,
6048      FND_GLOBAL.USER_ID, FND_GLOBAL.CONC_LOGIN_ID, qpil.request_id, 661,
6049      NULL,NULL, 'PRL', 'QP_INTERFACE_LIST_LINES',  'ARITHMETIC_OPERATOR',
6050      qpil.orig_sys_header_ref,qpil.orig_sys_line_ref,null,null,l_msg_txt
6051     FROM QP_INTERFACE_LIST_LINES qpil
6052     WHERE qpil.request_id = p_request_id
6053       AND  qpil.process_status_flag ='P' --is null
6054       AND  qpil.interface_action_code IN ('INSERT', 'UPDATE')
6055       AND  qpil.arithmetic_operator is NOT NULL
6056       AND NOT EXISTS ( SELECT  meaning
6057 		       FROM     qp_lookups
6058 		       WHERE  lookup_type= 'ARITHMETIC_OPERATOR'
6059                        AND        lookup_code= qpil.arithmetic_operator );
6060 
6061    --3. PRICE BREAK TYPE CODE
6062    FND_MESSAGE.SET_NAME('QP','QP_INVALID_ATTRIBUTE');
6063    FND_MESSAGE.SET_TOKEN('ATTRIBUTE','PRICE_BREAK_TYPE_CODE');
6064    l_msg_txt := FND_MESSAGE.GET;
6065 
6066     INSERT INTO QP_INTERFACE_ERRORS
6067    (error_id,last_update_date, last_updated_by, creation_date,
6068     created_by, last_update_login, request_id, program_application_id,
6069     program_id, program_update_date, entity_type, table_name, column_name,
6070     orig_sys_header_ref,orig_sys_line_ref,orig_sys_qualifier_ref,
6071     orig_sys_pricing_attr_ref,error_message)
6072     SELECT
6073      qp_interface_errors_s.nextval, sysdate ,FND_GLOBAL.USER_ID, sysdate,
6074      FND_GLOBAL.USER_ID, FND_GLOBAL.CONC_LOGIN_ID, qpil.request_id, 661,
6075      NULL,NULL, 'PRL', 'QP_INTERFACE_LIST_LINES',  'PRICE_BREAK_TYPE_CODE',
6076      qpil.orig_sys_header_ref,qpil.orig_sys_line_ref,null,null,l_msg_txt
6077     FROM QP_INTERFACE_LIST_LINES qpil
6078     WHERE qpil.request_id = p_request_id
6079       AND  qpil.process_status_flag ='P' --is null
6080       AND  qpil.interface_action_code IN ('INSERT', 'UPDATE')
6081       AND  qpil.price_break_type_code is NOT NULL
6082       AND NOT EXISTS ( SELECT     meaning
6083 		       FROM     qp_lookups
6084 		       WHERE  lookup_type= 'PRICE_BREAK_TYPE_CODE'
6085                        AND        lookup_code= qpil.price_break_type_code);
6086 
6087   --4. UOM
6088    FND_MESSAGE.SET_NAME('QP','QP_INVALID_ATTRIBUTE');
6089    FND_MESSAGE.SET_TOKEN('ATTRIBUTE','Product Uom Code');
6090    l_msg_txt := FND_MESSAGE.GET;
6091 
6092 	-- Bug# 5412045
6093 	-- Validate UOM for a category line
6094     INSERT INTO QP_INTERFACE_ERRORS
6095    (error_id,last_update_date, last_updated_by, creation_date,
6096     created_by, last_update_login, request_id, program_application_id,
6097     program_id, program_update_date, entity_type, table_name, column_name,
6098     orig_sys_header_ref,orig_sys_line_ref,orig_sys_qualifier_ref,
6099     orig_sys_pricing_attr_ref,error_message)
6100     SELECT /*+ index(qpip QP_INTERFACE_PRCNG_ATTRIBS_N4) */
6101      qp_interface_errors_s.nextval, sysdate ,FND_GLOBAL.USER_ID, sysdate,
6102      FND_GLOBAL.USER_ID, FND_GLOBAL.CONC_LOGIN_ID, qpil.request_id, 661,
6103      NULL,NULL, 'PRL', 'QP_INTERFACE_PRICING_ATTRIBS',  'PRODUCT_UOM_CODE',
6104      qpip.orig_sys_header_ref,qpip.orig_sys_line_ref,null,
6105      qpip.orig_sys_pricing_attr_ref,  l_msg_txt
6106     FROM QP_INTERFACE_LIST_LINES qpil, QP_INTERFACE_PRICING_ATTRIBS qpip, QP_LIST_HEADERS_B qplh
6107     WHERE qpil.request_id = p_request_id
6108       AND  qpip.request_id = p_request_id -- bug no 5881528
6109       AND  qpil.process_status_flag ='P' --is null
6110       AND  qpil.orig_sys_line_ref = qpip.orig_sys_line_ref
6111       -- ENH unod alcoa changes RAVI
6112       /**
6113       The key between interface and qp tables is only orig_sys_hdr_ref
6114       (not list_header_id)
6115       **/
6116       AND  qpil.orig_sys_header_ref = qplh.orig_system_header_ref
6117       AND  qpip.pricing_attribute_context IS NULL
6118       AND  qpil.interface_action_code IN ('INSERT', 'UPDATE')
6119       AND  qpip.interface_action_code IN ('INSERT', 'UPDATE')
6120       AND  qpip.product_uom_code is NOT NULL
6121       and qpip.product_attribute_context = 'ITEM'
6122       and qpip.product_attribute = 'PRICING_ATTRIBUTE1'
6123       AND NOT EXISTS (
6124 	select uom_code
6125 	from mtl_item_uoms_view
6126 	where organization_id = nvl(qpil.organization_id, organization_id)
6127 	and inventory_item_id = to_number(qpip.product_attr_value)
6128 	and uom_code = qpip.product_uom_code
6129         -- commented out for bug 4713401
6130         /*
6131 	union
6132 	select uom_code
6133 	from mtl_item_uoms_view
6134 	where (organization_id = qpil.organization_id or qpil.organization_id is null)
6135 	and inventory_item_id in ( select inventory_item_id
6136 	from mtl_item_categories
6137 	where category_id =      to_number(qpip.product_attr_value)
6138 	and (organization_id = qpil.organization_id or qpil.organization_id is null ))
6139 	and qpip.product_attribute_context = 'ITEM'
6140 	and qpip.product_attribute = 'PRICING_ATTRIBUTE2'
6141 	and uom_code = qpip.product_uom_code
6142         */
6143 	-- added for bug 4713401
6144         /* commented out as this code is not performant
6145 	union
6146 	select uom_code
6147 	from mtl_item_uoms_view
6148 	where (organization_id = qpil.organization_id or qpil.organization_id is null) and
6149         qpip.product_attribute_context = 'ITEM' and
6150         qpip.product_attribute = 'PRICING_ATTRIBUTE2' and
6151 	uom_code = qpip.product_uom_code and
6152         inventory_item_id in ( select inventory_item_id
6153         	                     from mtl_item_categories cat
6154 	                             where (category_id = to_number(qpip.product_attr_value) or
6155 				            exists (SELECT 'Y'
6156 					      FROM   eni_denorm_hierarchies
6157 					      WHERE  parent_id = to_number(qpip.product_attr_value) and
6158 					             child_id = cat.category_id
6159 					             and exists (select 'Y' from QP_SOURCESYSTEM_FNAREA_MAP A,
6160 										 qp_pte_source_systems B ,
6161 										 mtl_default_category_sets c,
6162 										 mtl_category_sets d
6163 					                         where A.PTE_SOURCE_SYSTEM_ID = B.PTE_SOURCE_SYSTEM_ID and
6164 					                               B.PTE_CODE = qplh.pte_code and
6165 					                               B.APPLICATION_SHORT_NAME = qplh.source_system_code and
6166 					                               A.FUNCTIONAL_AREA_ID = c.FUNCTIONAL_AREA_ID and
6167 					                               c.CATEGORY_SET_ID = d.CATEGORY_SET_ID and
6168 					                               d.HIERARCHY_ENABLED = 'Y' and
6169 					                               A.ENABLED_FLAG = 'Y' and B.ENABLED_FLAG = 'Y'))))
6170         */
6171 	union
6172 	select  uom_code
6173 	from mtl_units_of_measure_vl
6174 	where uom_code = qpip.product_uom_code
6175 	);
6176 
6177 
6178 	-- Bug# 5412045
6179 	-- Validate UOM for a category line
6180     INSERT INTO QP_INTERFACE_ERRORS
6181    (error_id,last_update_date, last_updated_by, creation_date,
6182     created_by, last_update_login, request_id, program_application_id,
6183     program_id, program_update_date, entity_type, table_name, column_name,
6184     orig_sys_header_ref,orig_sys_line_ref,orig_sys_qualifier_ref,
6185     orig_sys_pricing_attr_ref,error_message)
6186     SELECT
6187      qp_interface_errors_s.nextval, sysdate ,FND_GLOBAL.USER_ID, sysdate,
6188      FND_GLOBAL.USER_ID, FND_GLOBAL.CONC_LOGIN_ID, qpil.request_id, 661,
6189      NULL,NULL, 'PRL', 'QP_INTERFACE_PRICING_ATTRIBS',  'PRODUCT_UOM_CODE',
6190      qpip.orig_sys_header_ref,qpip.orig_sys_line_ref,null,
6191      qpip.orig_sys_pricing_attr_ref,  l_msg_txt
6192     FROM QP_INTERFACE_LIST_LINES qpil, QP_INTERFACE_PRICING_ATTRIBS qpip, QP_LIST_HEADERS_B qplh
6193     WHERE qpil.request_id = p_request_id
6194       AND  qpip.request_id = p_request_id -- bug no 5881528
6195       AND  qpil.process_status_flag ='P' --is null
6196       AND  qpil.orig_sys_line_ref = qpip.orig_sys_line_ref
6197       AND  qpil.orig_sys_header_ref = qplh.orig_system_header_ref
6198       AND  qpip.pricing_attribute_context IS NULL
6199       AND  qpil.interface_action_code IN ('INSERT', 'UPDATE')
6200       AND  qpip.interface_action_code IN ('INSERT', 'UPDATE')
6201       AND  qpip.product_uom_code is NOT NULL
6202       and qpip.product_attribute_context = 'ITEM'
6203       and qpip.product_attribute = 'PRICING_ATTRIBUTE2'
6204       AND NOT EXISTS (
6205         select 'EXISTS'
6206         from dual
6207         where QP_BULK_VALIDATE.product_uom(
6208                 qpip.product_uom_code,
6209                 to_number(qpip.product_attr_value),
6210                 qplh.list_header_id) = 'TRUE'
6211       );
6212 
6213 
6214  /**
6215   Bug# 5465109 RAVI START
6216   4.1) UNIQUE FORMULA CHECK
6217   Only one formula should be inserted or updated in a line. Either PriceBy or Generate Formula is to be used.
6218   If one is used the other should be set to null. If both are used then an error should be thrown.
6219  **/
6220    FND_MESSAGE.SET_NAME('QP','QP_STATIC_OR_DYNAMIC_FORMULA');
6221    l_msg_txt := FND_MESSAGE.GET;
6222 
6223     INSERT INTO QP_INTERFACE_ERRORS
6224    (error_id,last_update_date, last_updated_by, creation_date,
6225     created_by, last_update_login, request_id, program_application_id,
6226     program_id, program_update_date, entity_type, table_name, column_name,
6227     orig_sys_header_ref,orig_sys_line_ref,orig_sys_qualifier_ref,
6228     orig_sys_pricing_attr_ref,error_message)
6229     SELECT
6230      qp_interface_errors_s.nextval, sysdate ,FND_GLOBAL.USER_ID, sysdate,
6231      FND_GLOBAL.USER_ID, FND_GLOBAL.CONC_LOGIN_ID, qpil.request_id, 661,
6232      NULL,NULL, 'PRL', 'QP_INTERFACE_LIST_LINES',  'PRICE_BY_AND_GENERATE_FORMULA_ID',
6233      qpil.orig_sys_header_ref,qpil.orig_sys_line_ref,null,null,l_msg_txt
6234     FROM QP_INTERFACE_LIST_LINES qpil
6235     WHERE qpil.request_id = p_request_id
6236       AND  qpil.process_status_flag ='P' --is null
6237       AND  qpil.interface_action_code IN ('INSERT', 'UPDATE')
6238       AND  qpil.price_by_formula_id is NOT NULL
6239       AND  qpil.price_by_formula_id <> QP_BULK_LOADER_PUB.G_NULL_NUMBER
6240       AND  qpil.generate_using_formula_id is NOT NULL
6241       AND  qpil.generate_using_formula_id <> QP_BULK_LOADER_PUB.G_NULL_NUMBER;
6242   --Bug# 5465109 RAVI END
6243 
6244 --5. PRICE BY FORMULA ID
6245 
6246    -- Bug# 5236656 RAVI
6247    -- Change the message that needs to be thrown.
6248 
6249    FND_MESSAGE.SET_NAME('QP','QP_PRC_FOR_NAME_ID_INCMPTBLE');
6250    l_msg_txt := FND_MESSAGE.GET;
6251 
6252     INSERT INTO QP_INTERFACE_ERRORS
6253    (error_id,last_update_date, last_updated_by, creation_date,
6254     created_by, last_update_login, request_id, program_application_id,
6255     program_id, program_update_date, entity_type, table_name, column_name,
6256     orig_sys_header_ref,orig_sys_line_ref,orig_sys_qualifier_ref,
6257     orig_sys_pricing_attr_ref,error_message)
6258     SELECT
6259      qp_interface_errors_s.nextval, sysdate ,FND_GLOBAL.USER_ID, sysdate,
6260      FND_GLOBAL.USER_ID, FND_GLOBAL.CONC_LOGIN_ID, qpil.request_id, 661,
6261      NULL,NULL, 'PRL', 'QP_INTERFACE_LIST_LINES',  'PRICE_BY_FORMULA_ID',
6262      qpil.orig_sys_header_ref,qpil.orig_sys_line_ref,null,null,l_msg_txt
6263     FROM QP_INTERFACE_LIST_LINES qpil
6264     WHERE qpil.request_id = p_request_id
6265       AND  qpil.process_status_flag ='P' --is null
6266       AND  qpil.interface_action_code IN ('INSERT', 'UPDATE')
6267       AND  qpil.price_by_formula_id is NOT NULL
6268       AND  qpil.price_by_formula is NOT NULL
6269       AND  qpil.price_by_formula <> QP_BULK_LOADER_PUB.G_NULL_CHAR
6270       AND NOT EXISTS ( SELECT  name
6271 		       FROM    qp_price_formulas_vl
6272 		       WHERE   price_formula_id = qpil.price_by_formula_id
6273 		       AND     name = qpil.price_by_formula);
6274 
6275     INSERT INTO QP_INTERFACE_ERRORS
6276    (error_id,last_update_date, last_updated_by, creation_date,
6277     created_by, last_update_login, request_id, program_application_id,
6278     program_id, program_update_date, entity_type, table_name, column_name,
6279     orig_sys_header_ref,orig_sys_line_ref,orig_sys_qualifier_ref,
6280     orig_sys_pricing_attr_ref,error_message)
6281     SELECT
6282      qp_interface_errors_s.nextval, sysdate ,FND_GLOBAL.USER_ID, sysdate,
6283      FND_GLOBAL.USER_ID, FND_GLOBAL.CONC_LOGIN_ID, qpil.request_id, 661,
6284      NULL,NULL, 'PRL', 'QP_INTERFACE_LIST_LINES',  'PRICE_BY_FORMULA_ID',
6285      qpil.orig_sys_header_ref,qpil.orig_sys_line_ref,null,null,l_msg_txt
6286     FROM QP_INTERFACE_LIST_LINES qpil
6287     WHERE qpil.request_id = p_request_id
6288       AND  qpil.process_status_flag ='P' --is null
6289       AND  qpil.interface_action_code IN ('INSERT', 'UPDATE')
6290       AND  qpil.price_by_formula_id is NOT NULL
6291       AND  qpil.price_by_formula is NULL
6292       AND NOT EXISTS ( SELECT  name
6293 		       FROM    qp_price_formulas_vl
6294 		       WHERE   price_formula_id = qpil.price_by_formula_id);
6295 
6296     INSERT INTO QP_INTERFACE_ERRORS
6297    (error_id,last_update_date, last_updated_by, creation_date,
6298     created_by, last_update_login, request_id, program_application_id,
6299     program_id, program_update_date, entity_type, table_name, column_name,
6300     orig_sys_header_ref,orig_sys_line_ref,orig_sys_qualifier_ref,
6301     orig_sys_pricing_attr_ref,error_message)
6302     SELECT
6303      qp_interface_errors_s.nextval, sysdate ,FND_GLOBAL.USER_ID, sysdate,
6304      FND_GLOBAL.USER_ID, FND_GLOBAL.CONC_LOGIN_ID, qpil.request_id, 661,
6305      NULL,NULL, 'PRL', 'QP_INTERFACE_LIST_LINES',  'PRICE_BY_FORMULA_ID',
6306      qpil.orig_sys_header_ref,qpil.orig_sys_line_ref,null,null,l_msg_txt
6307     FROM QP_INTERFACE_LIST_LINES qpil
6308     WHERE qpil.request_id = p_request_id
6309       AND  qpil.process_status_flag ='P' --is null
6310       AND  qpil.interface_action_code IN ('INSERT', 'UPDATE')
6311       AND  qpil.price_by_formula_id is NULL
6312       AND  qpil.price_by_formula is NOT NULL
6313       AND  qpil.price_by_formula <> QP_BULK_LOADER_PUB.G_NULL_CHAR
6314       AND NOT EXISTS ( SELECT  name
6315 		       FROM    qp_price_formulas_vl
6316 		       WHERE   name = qpil.price_by_formula);
6317 
6318 --5. GENERATE USING FORMULA ID
6319 
6320     -- Bug# 5236656 RAVI START
6321     -- Change the message that needs to be thrown.
6322 
6323    FND_MESSAGE.SET_NAME('QP','QP_GEN_FOR_NAME_ID_INCMPTBLE');
6324    l_msg_txt := FND_MESSAGE.GET;
6325 
6326     INSERT INTO QP_INTERFACE_ERRORS
6327    (error_id,last_update_date, last_updated_by, creation_date,
6328     created_by, last_update_login, request_id, program_application_id,
6329     program_id, program_update_date, entity_type, table_name, column_name,
6330     orig_sys_header_ref,orig_sys_line_ref,orig_sys_qualifier_ref,
6331     orig_sys_pricing_attr_ref,error_message)
6332     SELECT
6333      qp_interface_errors_s.nextval, sysdate ,FND_GLOBAL.USER_ID, sysdate,
6334      FND_GLOBAL.USER_ID, FND_GLOBAL.CONC_LOGIN_ID, qpil.request_id, 661,
6335      NULL,NULL, 'PRL', 'QP_INTERFACE_LIST_LINES',  'GENERATE_USING_FORMULA_ID',
6336      qpil.orig_sys_header_ref,qpil.orig_sys_line_ref,null,null,l_msg_txt
6337     FROM QP_INTERFACE_LIST_LINES qpil
6338     WHERE qpil.request_id = p_request_id
6339       AND  qpil.process_status_flag ='P' --is null
6340       AND  qpil.interface_action_code IN ('INSERT', 'UPDATE')
6341       AND  qpil.generate_using_formula_id is NOT NULL
6342       AND  qpil.generate_using_formula is NOT NULL
6343       AND  qpil.generate_using_formula <> QP_BULK_LOADER_PUB.G_NULL_CHAR
6344       AND NOT EXISTS ( SELECT  name
6345 		       FROM    qp_price_formulas_vl
6346 		       WHERE   price_formula_id = qpil.generate_using_formula_id
6347 		       AND     name = qpil.generate_using_formula);
6348 
6349 
6350      IF SQL%ROWCOUNT >0 THEN
6351         qp_bulk_loader_pub.write_log('Generate formula ID and Name are incompatible');
6352      END IF;
6353 
6354     --FND_MESSAGE.SET_NAME('QP','QP_INVALID_FORMULA_FOR_PL');
6355     --l_msg_txt := FND_MESSAGE.GET;
6356     -- Bug# 5236656 RAVI END
6357 
6358     INSERT INTO QP_INTERFACE_ERRORS
6359    (error_id,last_update_date, last_updated_by, creation_date,
6360     created_by, last_update_login, request_id, program_application_id,
6361     program_id, program_update_date, entity_type, table_name, column_name,
6362     orig_sys_header_ref,orig_sys_line_ref,orig_sys_qualifier_ref,
6363     orig_sys_pricing_attr_ref,error_message)
6364     SELECT
6365      qp_interface_errors_s.nextval, sysdate ,FND_GLOBAL.USER_ID, sysdate,
6366      FND_GLOBAL.USER_ID, FND_GLOBAL.CONC_LOGIN_ID, qpil.request_id, 661,
6367      NULL,NULL, 'PRL', 'QP_INTERFACE_LIST_LINES',  'GENERATE_USING_FORMULA_ID',
6368      qpil.orig_sys_header_ref,qpil.orig_sys_line_ref,null,null,l_msg_txt
6369     FROM QP_INTERFACE_LIST_LINES qpil
6370     WHERE qpil.request_id = p_request_id
6371       AND  qpil.process_status_flag ='P' --is null
6372       AND  qpil.interface_action_code IN ('INSERT', 'UPDATE')
6373       AND  qpil.generate_using_formula_id is NOT NULL
6374       AND  qpil.generate_using_formula is NULL
6375       AND NOT EXISTS ( SELECT  name
6376 		       FROM    qp_price_formulas_vl
6377 		       WHERE   price_formula_id = qpil.generate_using_formula_id);
6378 
6379     INSERT INTO QP_INTERFACE_ERRORS
6380    (error_id,last_update_date, last_updated_by, creation_date,
6381     created_by, last_update_login, request_id, program_application_id,
6382     program_id, program_update_date, entity_type, table_name, column_name,
6383     orig_sys_header_ref,orig_sys_line_ref,orig_sys_qualifier_ref,
6384     orig_sys_pricing_attr_ref,error_message)
6385     SELECT
6386      qp_interface_errors_s.nextval, sysdate ,FND_GLOBAL.USER_ID, sysdate,
6387      FND_GLOBAL.USER_ID, FND_GLOBAL.CONC_LOGIN_ID, qpil.request_id, 661,
6388      NULL,NULL, 'PRL', 'QP_INTERFACE_LIST_LINES',  'GENERATE_USING_FORMULA_ID',
6389      qpil.orig_sys_header_ref,qpil.orig_sys_line_ref,null,null,l_msg_txt
6390     FROM QP_INTERFACE_LIST_LINES qpil
6391     WHERE qpil.request_id = p_request_id
6392       AND  qpil.process_status_flag ='P' --is null
6393       AND  qpil.interface_action_code IN ('INSERT', 'UPDATE')
6394       AND  qpil.generate_using_formula_id is NULL
6395       AND  qpil.generate_using_formula is NOT NULL
6396       AND  qpil.generate_using_formula <> QP_BULK_LOADER_PUB.G_NULL_CHAR
6397       AND NOT EXISTS ( SELECT  name
6398 		       FROM    qp_price_formulas_vl
6399 		       WHERE   name = qpil.generate_using_formula);
6400 
6401     -- Bug# 5236656 RAVI
6402     IF SQL%ROWCOUNT >0 THEN
6403        qp_bulk_loader_pub.write_log('Generate formula ID is inaccurate');
6404     END IF;
6405 
6406 --6. PBH not allowed in Basic pricing
6407 -- Basic_Pricing_Condition
6408 
6409    IF QP_BULK_LOADER_PUB.GET_QP_STATUS <> 'I' THEN
6410        FND_MESSAGE.SET_NAME('QP','QP_PBH_NA_BASIC');
6411        --Price Break Header not allowed in Basic Pricing
6412        l_msg_txt := FND_MESSAGE.GET;
6413 
6414 	INSERT INTO QP_INTERFACE_ERRORS
6415        (error_id,last_update_date, last_updated_by, creation_date,
6416 	created_by, last_update_login, request_id, program_application_id,
6417 	program_id, program_update_date, entity_type, table_name,
6418 	orig_sys_header_ref,orig_sys_line_ref,orig_sys_qualifier_ref,
6419 	orig_sys_pricing_attr_ref,error_message)
6420 	SELECT
6421 	 qp_interface_errors_s.nextval, sysdate ,FND_GLOBAL.USER_ID, sysdate,
6422 	 FND_GLOBAL.USER_ID, FND_GLOBAL.CONC_LOGIN_ID, qpil.request_id, 661,
6423 	 NULL,NULL, 'PRL', 'QP_INTERFACE_LIST_LINES',
6424 	 qpil.orig_sys_header_ref,qpil.orig_sys_line_ref,null,null,l_msg_txt
6425 	FROM QP_INTERFACE_LIST_LINES qpil
6426 	WHERE qpil.request_id = p_request_id
6427 	  AND  qpil.process_status_flag ='P' --is null
6428 	  AND  qpil.interface_action_code IN ('INSERT', 'UPDATE')
6429 	  AND  (qpil.list_line_type_code = 'PBH'
6430 		OR qpil.price_break_header_ref is not NULL);
6431 
6432   END IF;
6433 
6434   --7. Product Attribute
6435    FND_MESSAGE.SET_NAME('QP','QP_INVALID_ATTRIBUTE');
6436    FND_MESSAGE.SET_TOKEN('ATTRIBUTE','Product Attribute ');
6437    l_msg_txt := FND_MESSAGE.GET;
6438 
6439     INSERT INTO QP_INTERFACE_ERRORS
6440    (error_id,last_update_date, last_updated_by, creation_date,
6441     created_by, last_update_login, request_id, program_application_id,
6442     program_id, program_update_date, entity_type, table_name, column_name,
6443     orig_sys_header_ref,orig_sys_line_ref,orig_sys_qualifier_ref,
6444     orig_sys_pricing_attr_ref,error_message)
6445     SELECT
6446      qp_interface_errors_s.nextval, sysdate ,FND_GLOBAL.USER_ID, sysdate,
6447      FND_GLOBAL.USER_ID, FND_GLOBAL.CONC_LOGIN_ID, qpil.request_id, 661,
6448      NULL,NULL, 'PRL', 'QP_INTERFACE_LIST_LINES',  'PRODUCT_ATTRIBUTE',
6449      qpip.orig_sys_header_ref,qpip.orig_sys_line_ref,null,
6450      qpip.orig_sys_pricing_attr_ref,  l_msg_txt
6451     FROM QP_INTERFACE_LIST_LINES qpil, QP_INTERFACE_PRICING_ATTRIBS qpip
6452     WHERE qpil.request_id = p_request_id
6453       AND  qpip.request_id = p_request_id -- bug no 5881528
6454       AND  qpil.process_status_flag ='P' --is null
6455       AND  qpil.orig_sys_line_ref = qpip.orig_sys_line_ref
6456       AND  qpip.pricing_attribute_context IS NULL
6457       AND  qpil.interface_action_code IN ('INSERT', 'UPDATE')
6458       AND EXISTS ( SELECT  'x'
6459         FROM qp_interface_pricing_attribs b, qp_prc_contexts_b d, qp_segments_b e, qp_pte_segments f
6460         WHERE  b.product_attribute_context = d.prc_context_code
6461 	AND b.product_attribute = e.segment_mapping_column
6462 	and e.segment_code = b.product_attr_code
6463         AND d.prc_context_id = e.prc_context_id
6464 	AND d.prc_context_type = 'PRODUCT'
6465 	AND e.segment_id = f.segment_id
6466 	AND f.pte_code = l_pte_code
6467 	AND f.segment_level <> 'LINE'
6468 	AND qpip.rowid = b.rowid
6469         union
6470         SELECT  'x'
6471         FROM qp_interface_pricing_attribs b, qp_prc_contexts_b d, qp_segments_b e, qp_pte_segments f
6472         WHERE  b.product_attribute_context = d.prc_context_code
6473 	AND b.product_attribute is NULL and e.segment_code = b.product_attr_code
6474 	AND d.prc_context_id = e.prc_context_id
6475 	AND d.prc_context_type = 'PRODUCT'
6476 	AND e.segment_id = f.segment_id
6477 	AND f.pte_code = l_pte_code
6478 	AND f.segment_level <> 'LINE'
6479 	AND qpip.rowid = b.rowid);
6480 
6481 --Bug# 5456164 START RAVI
6482   --Validate product attribute
6483   --8. Product Attribute
6484    FND_MESSAGE.SET_NAME('QP','QP_INVALID_ATTRIBUTE');
6485    FND_MESSAGE.SET_TOKEN('ATTRIBUTE','Product Attribute ');
6486    l_msg_txt := FND_MESSAGE.GET;
6487 
6488     INSERT INTO QP_INTERFACE_ERRORS
6489    (error_id,last_update_date, last_updated_by, creation_date,
6490     created_by, last_update_login, request_id, program_application_id,
6491     program_id, program_update_date, entity_type, table_name, column_name,
6492     orig_sys_header_ref,orig_sys_line_ref,orig_sys_qualifier_ref,
6493     orig_sys_pricing_attr_ref,error_message)
6494     SELECT
6495      qp_interface_errors_s.nextval, sysdate ,FND_GLOBAL.USER_ID, sysdate,
6496      FND_GLOBAL.USER_ID, FND_GLOBAL.CONC_LOGIN_ID, qpil.request_id, 661,
6497      NULL,NULL, 'PRL', 'QP_INTERFACE_LIST_LINES',  'PRODUCT_ATTRIBUTE',
6498      qpip.orig_sys_header_ref,qpip.orig_sys_line_ref,null,
6499      qpip.orig_sys_pricing_attr_ref,  l_msg_txt
6500     FROM QP_INTERFACE_LIST_LINES qpil, QP_INTERFACE_PRICING_ATTRIBS qpip
6501     WHERE qpil.request_id = p_request_id
6502       AND  qpip.request_id = p_request_id -- bug no 5881528
6503       AND qpil.process_status_flag ='P' --is null
6504       AND qpil.orig_sys_line_ref = qpip.orig_sys_line_ref
6505       AND qpip.product_attribute_context IS NOT NULL
6506       AND qpip.product_attribute IS NOT NULL
6507       AND qpip.product_attr_code IS NOT NULL
6508       AND qpip.product_attr_code <> QP_BULK_LOADER_PUB.G_NULL_CHAR
6509       AND qpil.interface_action_code IN ('INSERT', 'UPDATE')
6510       AND NOT EXISTS ( SELECT  'x'
6511         FROM qp_interface_pricing_attribs b, qp_prc_contexts_b d, qp_segments_b e, qp_pte_segments f
6512         WHERE  b.product_attribute_context = d.prc_context_code
6513 	AND b.product_attribute = e.segment_mapping_column
6514 	and e.segment_code = b.product_attr_code
6515         AND d.prc_context_id = e.prc_context_id
6516 	AND d.prc_context_type = 'PRODUCT'
6517 	AND e.segment_id = f.segment_id
6518 	AND f.pte_code = l_pte_code
6519 	AND qpip.rowid = b.rowid);
6520 
6521     INSERT INTO QP_INTERFACE_ERRORS
6522    (error_id,last_update_date, last_updated_by, creation_date,
6523     created_by, last_update_login, request_id, program_application_id,
6524     program_id, program_update_date, entity_type, table_name, column_name,
6525     orig_sys_header_ref,orig_sys_line_ref,orig_sys_qualifier_ref,
6526     orig_sys_pricing_attr_ref,error_message)
6527     SELECT
6528      qp_interface_errors_s.nextval, sysdate ,FND_GLOBAL.USER_ID, sysdate,
6529      FND_GLOBAL.USER_ID, FND_GLOBAL.CONC_LOGIN_ID, qpil.request_id, 661,
6530      NULL,NULL, 'PRL', 'QP_INTERFACE_LIST_LINES',  'PRODUCT_ATTRIBUTE',
6531      qpip.orig_sys_header_ref,qpip.orig_sys_line_ref,null,
6532      qpip.orig_sys_pricing_attr_ref,  l_msg_txt
6533     FROM QP_INTERFACE_LIST_LINES qpil, QP_INTERFACE_PRICING_ATTRIBS qpip
6534     WHERE qpil.request_id = p_request_id
6535       AND  qpip.request_id = p_request_id -- bug no 5881528
6536       AND qpil.process_status_flag ='P' --is null
6537       AND qpil.orig_sys_line_ref = qpip.orig_sys_line_ref
6538       AND qpip.product_attribute_context IS NOT NULL
6539       AND qpip.product_attribute IS NULL
6540       AND qpip.product_attr_code IS NOT NULL
6541       AND qpip.product_attr_code <> QP_BULK_LOADER_PUB.G_NULL_CHAR
6542       AND qpil.interface_action_code IN ('INSERT', 'UPDATE')
6543       AND NOT EXISTS ( SELECT  'x'
6544         FROM qp_interface_pricing_attribs b, qp_prc_contexts_b d, qp_segments_b e, qp_pte_segments f
6545         WHERE  b.product_attribute_context = d.prc_context_code
6546 	and e.segment_code = b.product_attr_code
6547         AND d.prc_context_id = e.prc_context_id
6548 	AND d.prc_context_type = 'PRODUCT'
6549 	AND e.segment_id = f.segment_id
6550 	AND f.pte_code = l_pte_code
6551 	AND qpip.rowid = b.rowid);
6552 
6553     INSERT INTO QP_INTERFACE_ERRORS
6554    (error_id,last_update_date, last_updated_by, creation_date,
6555     created_by, last_update_login, request_id, program_application_id,
6556     program_id, program_update_date, entity_type, table_name, column_name,
6557     orig_sys_header_ref,orig_sys_line_ref,orig_sys_qualifier_ref,
6558     orig_sys_pricing_attr_ref,error_message)
6559     SELECT
6560      qp_interface_errors_s.nextval, sysdate ,FND_GLOBAL.USER_ID, sysdate,
6561      FND_GLOBAL.USER_ID, FND_GLOBAL.CONC_LOGIN_ID, qpil.request_id, 661,
6562      NULL,NULL, 'PRL', 'QP_INTERFACE_LIST_LINES',  'PRODUCT_ATTRIBUTE',
6563      qpip.orig_sys_header_ref,qpip.orig_sys_line_ref,null,
6564      qpip.orig_sys_pricing_attr_ref,  l_msg_txt
6565     FROM QP_INTERFACE_LIST_LINES qpil, QP_INTERFACE_PRICING_ATTRIBS qpip
6566     WHERE qpil.request_id = p_request_id
6567       AND  qpip.request_id = p_request_id -- bug no 5881528
6568       AND qpil.process_status_flag ='P' --is null
6569       AND qpil.orig_sys_line_ref = qpip.orig_sys_line_ref
6570       AND qpip.product_attribute_context IS NOT NULL
6571       AND qpip.product_attribute IS NOT NULL
6572       AND qpip.product_attr_code IS NULL
6573       AND qpil.interface_action_code IN ('INSERT', 'UPDATE')
6574       AND NOT EXISTS ( SELECT  'x'
6575         FROM qp_interface_pricing_attribs b, qp_prc_contexts_b d, qp_segments_b e, qp_pte_segments f
6576         WHERE  b.product_attribute_context = d.prc_context_code
6577 	AND b.product_attribute = e.segment_mapping_column
6578         AND d.prc_context_id = e.prc_context_id
6579 	AND d.prc_context_type = 'PRODUCT'
6580 	AND e.segment_id = f.segment_id
6581 	AND f.pte_code = l_pte_code
6582 	AND qpip.rowid = b.rowid);
6583 
6584   --Validate pricing attribute
6585   --9. Pricing Attribute
6586    FND_MESSAGE.SET_NAME('QP','QP_INVALID_ATTRIBUTE');
6587    FND_MESSAGE.SET_TOKEN('ATTRIBUTE','Pricing Attribute ');
6588    l_msg_txt := FND_MESSAGE.GET;
6589 
6590     INSERT INTO QP_INTERFACE_ERRORS
6591    (error_id,last_update_date, last_updated_by, creation_date,
6592     created_by, last_update_login, request_id, program_application_id,
6593     program_id, program_update_date, entity_type, table_name, column_name,
6594     orig_sys_header_ref,orig_sys_line_ref,orig_sys_qualifier_ref,
6595     orig_sys_pricing_attr_ref,error_message)
6596     SELECT
6597      qp_interface_errors_s.nextval, sysdate ,FND_GLOBAL.USER_ID, sysdate,
6598      FND_GLOBAL.USER_ID, FND_GLOBAL.CONC_LOGIN_ID, qpil.request_id, 661,
6599      NULL,NULL, 'PRL', 'QP_INTERFACE_LIST_LINES',  'PRODUCT_ATTRIBUTE',
6600      qpip.orig_sys_header_ref,qpip.orig_sys_line_ref,null,
6601      qpip.orig_sys_pricing_attr_ref,  l_msg_txt
6602     FROM QP_INTERFACE_LIST_LINES qpil, QP_INTERFACE_PRICING_ATTRIBS qpip
6603     WHERE qpil.request_id = p_request_id
6604       AND  qpip.request_id = p_request_id -- bug no 5881528
6605       AND qpil.process_status_flag ='P' --is null
6606       AND qpil.orig_sys_line_ref = qpip.orig_sys_line_ref
6607       AND qpip.pricing_attribute_context IS NOT NULL
6608       AND qpip.pricing_attribute IS NOT NULL
6609       AND qpip.pricing_attr_code IS NOT NULL
6610       AND qpip.pricing_attr_code <> QP_BULK_LOADER_PUB.G_NULL_CHAR
6611       AND qpil.interface_action_code IN ('INSERT', 'UPDATE')
6612       AND NOT EXISTS ( SELECT  'x'
6613         FROM qp_interface_pricing_attribs b, qp_prc_contexts_b d, qp_segments_b e, qp_pte_segments f
6614         WHERE  b.pricing_attribute_context = d.prc_context_code
6615 	AND b.pricing_attribute = e.segment_mapping_column
6616 	and e.segment_code = b.pricing_attr_code
6617         AND d.prc_context_id = e.prc_context_id
6618 	AND d.prc_context_type = 'PRICING_ATTRIBUTE'
6619 	AND e.segment_id = f.segment_id
6620 	AND f.pte_code = l_pte_code
6621 	AND qpip.rowid = b.rowid);
6622 
6623     INSERT INTO QP_INTERFACE_ERRORS
6624    (error_id,last_update_date, last_updated_by, creation_date,
6625     created_by, last_update_login, request_id, program_application_id,
6626     program_id, program_update_date, entity_type, table_name, column_name,
6627     orig_sys_header_ref,orig_sys_line_ref,orig_sys_qualifier_ref,
6628     orig_sys_pricing_attr_ref,error_message)
6629     SELECT
6630      qp_interface_errors_s.nextval, sysdate ,FND_GLOBAL.USER_ID, sysdate,
6631      FND_GLOBAL.USER_ID, FND_GLOBAL.CONC_LOGIN_ID, qpil.request_id, 661,
6632      NULL,NULL, 'PRL', 'QP_INTERFACE_LIST_LINES',  'PRODUCT_ATTRIBUTE',
6633      qpip.orig_sys_header_ref,qpip.orig_sys_line_ref,null,
6634      qpip.orig_sys_pricing_attr_ref,  l_msg_txt
6635     FROM QP_INTERFACE_LIST_LINES qpil, QP_INTERFACE_PRICING_ATTRIBS qpip
6636     WHERE qpil.request_id = p_request_id
6637       AND  qpip.request_id = p_request_id -- bug no 5881528
6638       AND qpil.process_status_flag ='P' --is null
6639       AND qpil.orig_sys_line_ref = qpip.orig_sys_line_ref
6640       AND qpip.pricing_attribute_context IS NOT NULL
6641       AND qpip.pricing_attribute IS NULL
6642       AND qpip.pricing_attr_code IS NOT NULL
6643       AND qpip.pricing_attr_code <> QP_BULK_LOADER_PUB.G_NULL_CHAR
6644       AND qpil.interface_action_code IN ('INSERT', 'UPDATE')
6645       AND NOT EXISTS ( SELECT  'x'
6646         FROM qp_interface_pricing_attribs b, qp_prc_contexts_b d, qp_segments_b e, qp_pte_segments f
6647         WHERE  b.pricing_attribute_context = d.prc_context_code
6648 	and e.segment_code = b.pricing_attr_code
6649         AND d.prc_context_id = e.prc_context_id
6650 	AND d.prc_context_type = 'PRICING_ATTRIBUTE'
6651 	AND e.segment_id = f.segment_id
6652 	AND f.pte_code = l_pte_code
6653 	AND qpip.rowid = b.rowid);
6654 
6655     INSERT INTO QP_INTERFACE_ERRORS
6656    (error_id,last_update_date, last_updated_by, creation_date,
6657     created_by, last_update_login, request_id, program_application_id,
6658     program_id, program_update_date, entity_type, table_name, column_name,
6659     orig_sys_header_ref,orig_sys_line_ref,orig_sys_qualifier_ref,
6660     orig_sys_pricing_attr_ref,error_message)
6661     SELECT
6662      qp_interface_errors_s.nextval, sysdate ,FND_GLOBAL.USER_ID, sysdate,
6663      FND_GLOBAL.USER_ID, FND_GLOBAL.CONC_LOGIN_ID, qpil.request_id, 661,
6664      NULL,NULL, 'PRL', 'QP_INTERFACE_LIST_LINES',  'PRODUCT_ATTRIBUTE',
6665      qpip.orig_sys_header_ref,qpip.orig_sys_line_ref,null,
6666      qpip.orig_sys_pricing_attr_ref,  l_msg_txt
6667     FROM QP_INTERFACE_LIST_LINES qpil, QP_INTERFACE_PRICING_ATTRIBS qpip
6668     WHERE qpil.request_id = p_request_id
6669       AND  qpip.request_id = p_request_id -- bug no 5881528
6670       AND qpil.process_status_flag ='P' --is null
6671       AND qpil.orig_sys_line_ref = qpip.orig_sys_line_ref
6672       AND qpip.pricing_attribute_context IS NOT NULL
6673       AND qpip.pricing_attribute IS NOT NULL
6674       AND qpip.pricing_attr_code IS NULL
6675       AND qpil.interface_action_code IN ('INSERT', 'UPDATE')
6676       AND NOT EXISTS ( SELECT  'x'
6677         FROM qp_interface_pricing_attribs b, qp_prc_contexts_b d, qp_segments_b e, qp_pte_segments f
6678         WHERE  b.pricing_attribute_context = d.prc_context_code
6679 	AND b.pricing_attribute = e.segment_mapping_column
6680         AND d.prc_context_id = e.prc_context_id
6681 	AND d.prc_context_type = 'PRICING_ATTRIBUTE'
6682 	AND e.segment_id = f.segment_id
6683 	AND f.pte_code = l_pte_code
6684 	AND qpip.rowid = b.rowid);
6685 --Bug# 5456164 END RAVI
6686 
6687        qp_bulk_loader_pub.write_log('Leaving Attribute Line validation');
6688 	EXCEPTION
6689 	WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
6690 	   qp_bulk_loader_pub.write_log( 'UNEXCPECTED ERROR IN PROCEDURE ATTRIBUTE_LINE:'||sqlerrm);
6691 	   RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6692 	WHEN OTHERS THEN
6693 	   qp_bulk_loader_pub.write_log( 'UNEXCPECTED ERROR IN PROCEDURE ATTRIBUTE_LINE:'||sqlerrm);
6694        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6695 END ATTRIBUTE_LINE;
6696 
6697 
6698 PROCEDURE MARK_ERRORED_INTERFACE_RECORD
6699    (p_table_type  VARCHAR2,
6700     p_request_id  NUMBER)
6701 IS
6702 BEGIN
6703 
6704    qp_bulk_loader_pub.write_log('Entering Mark errored inreface record');
6705 
6706    IF p_table_type = 'HEADER'  THEN
6707 
6708 	UPDATE qp_interface_list_headers h
6709 	   SET h.process_status_flag = NULL --'E'
6710 	 WHERE h.request_id = p_request_id
6711 	   AND EXISTS
6712 	 (SELECT  orig_sys_header_ref
6713 	    FROM  qp_interface_errors e
6714 	   WHERE  e.orig_sys_header_ref = h.orig_sys_header_ref
6715 	     AND  e.table_name ='QP_INTERFACE_LIST_HEADERS'
6716 	     AND  e.request_id = p_request_id	  );
6717 
6718    ELSIF p_table_type = 'QUALIFIER' THEN
6719 
6720 	UPDATE qp_interface_qualifiers  q
6721 	   SET process_status_flag = NULL --'E'
6722 	 WHERE q.request_id =p_request_id
6723 	   AND EXISTS
6724 	 (SELECT  orig_sys_qualifier_ref
6725 	    FROM    qp_interface_errors e
6726 	   WHERE    e.orig_sys_qualifier_ref = q.orig_sys_qualifier_ref
6727 	     AND    e.orig_sys_header_ref = q.orig_sys_header_ref
6728 	     AND    e.table_name ='QP_INTERFACE_QUALIFIERS'
6729 	     AND    e.request_id = p_request_id);
6730 
6731    ELSIF p_table_type = 'LINE' THEN
6732 
6733 	UPDATE qp_interface_list_lines  l
6734 	   SET    process_status_flag = NULL --'E'
6735 	 WHERE    l.request_id =p_request_id
6736 	   AND EXISTS
6737 	 (SELECT  orig_sys_line_ref
6738 	    FROM    qp_interface_errors e
6739 	   WHERE    e.orig_sys_line_ref = l.orig_sys_line_ref
6740 	     AND    e.orig_sys_header_ref = l.orig_sys_header_ref
6741 	     AND  table_name ='QP_INTERFACE_LIST_LINES'
6742 	     AND  e.request_id = p_request_id	 );
6743 
6744    ELSIF p_table_type = 'PRICING_ATTRIBS' THEN
6745 
6746 	UPDATE qp_interface_pricing_attribs  a
6747 	   SET     process_status_flag = NULL --'E'
6748 	 WHERE  a.request_id =p_request_id
6749 		AND EXISTS
6750 	 (SELECT    orig_sys_pricing_attr_ref
6751 	    FROM    qp_interface_errors e
6752 	   WHERE    e.orig_sys_line_ref = a.orig_sys_line_ref
6753 	     AND    e.orig_sys_header_ref = a.orig_sys_header_ref
6754 	     AND    e.orig_sys_pricing_attr_ref = a.orig_sys_pricing_attr_ref
6755 	     AND    table_name ='QP_INTERFACE_PRICING_ATTRIBS'
6756 	     AND    e.request_id = p_request_id
6757 		 AND    NVL(e.message_type, 'E') = 'E'  --bug no: 9652756 - only if this is an error.  b/c warning messages also goes into errors table
6758 		 );
6759 
6760    END IF;
6761 
6762    qp_bulk_loader_pub.write_log('Entering Mark errored inreface record');
6763 
6764    EXCEPTION
6765     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
6766        qp_bulk_loader_pub.write_log(
6767 			 'UNEXCPECTED ERROR IN PROCEDURE MARK_ERRORED_INTERFACE_RECORD:'||sqlerrm);
6768        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6769     WHEN OTHERS THEN
6770        qp_bulk_loader_pub.write_log(
6771 			 'UNEXCPECTED ERROR IN PROCEDURE MARK_ERRORED_INTERFACE_RECORD:'||sqlerrm);
6772        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6773 
6774 END MARK_ERRORED_INTERFACE_RECORD;
6775 
6776 END QP_BULK_VALIDATE;