DBA Data[Home] [Help]

PACKAGE BODY: APPS.AMS_ACTPRODUCT_PVT

Source


1 PACKAGE BODY AMS_ActProduct_PVT as
2 /*$Header: amsvprdb.pls 120.4 2006/05/17 00:17:47 inanaiah noship $*/
3 -- NAME
4 --   AMS_ActProduct_PVT
5 --
6 -- HISTORY
7 --      1/1/2000        rvaka   CREATED
8 --
9 G_PACKAGE_NAME  CONSTANT VARCHAR2(30):='AMS_ActProduct_PVT';
10 G_FILE_NAME     CONSTANT VARCHAR2(12):='amsvprdb.pls';
11 G_module_name constant varchar2(100):='oracle.apps.ams.plsql.'||G_PACKAGE_NAME;
12 
13 -- Debug mode
14 g_debug boolean := FALSE;
15 --g_debug boolean := TRUE;
16 AMS_DEBUG_HIGH_ON boolean := FND_MSG_PUB.CHECK_MSG_LEVEL(FND_MSG_PUB.G_MSG_LVL_DEBUG_HIGH);
17 AMS_DEBUG_LOW_ON boolean := FND_MSG_PUB.CHECK_MSG_LEVEL(FND_MSG_PUB.G_MSG_LVL_DEBUG_LOW);
18 AMS_DEBUG_MEDIUM_ON boolean := FND_MSG_PUB.CHECK_MSG_LEVEL(FND_MSG_PUB.G_MSG_LVL_DEBUG_MEDIUM);
19 
20 AMS_LOG_PROCEDURE constant number := FND_LOG.LEVEL_PROCEDURE;
21 AMS_LOG_EXCEPTION constant Number := FND_LOG.LEVEL_EXCEPTION;
22 AMS_LOG_STATEMENT constant Number := FND_LOG.LEVEL_STATEMENT;
23 
24 AMS_LOG_PROCEDURE_ON boolean := AMS_UTILITY_PVT.logging_enabled(AMS_LOG_PROCEDURE);
25 AMS_LOG_EXCEPTION_ON boolean := AMS_UTILITY_PVT.logging_enabled(AMS_LOG_EXCEPTION);
26 AMS_LOG_STATEMENT_ON boolean := AMS_UTILITY_PVT.logging_enabled(AMS_LOG_STATEMENT);
27 
28 
29 --
30 -- Procedure and function declarations.
31 /*****************************************************************************************/
32 -- Start of Comments
33 --
34 -- NAME
35 --   Create_Act_Product
36 --
37 -- PURPOSE
38 --   This procedure is to create a Product record that satisfy caller needs
39 --
40 -- HISTORY
41 --   11/11/1999        rvaka      created
42 --   08/01/2000        sugupta    added access code to prevent hacking
43 --   04/03/2001        abhola     call to AMS_ACCESS_PVT changed to check for return value N
44 --   01-MAY-2001       julou      modified, added 3 columns to ams_act_products
45 --                                security_group_id, line_lumpsum_amount, line_lumpsum_qty
46 --   03-May-2001       rssharma   Added validation for Offers(prod)
47 --   07-May-2001       rssharma   changed the validation for offer
48 --   18-Oct-2001       Musman     Added the validation for the schedules.
49 --   05-Nov-2001       musman     Commented out the reference to security_group_id
50 --   07-may-2002       abhola     resolved bug # 2156368
51 --   22-Oct-2002       Musman     Added the validation for primary_product_flag
52 --   11-Sep-2003       MUSMAN     Added the validation reqd FOR modl object.
53 --   10-Feb-2005       inanaiah   Added the validation for category_id, category_set_id, inventory_id in Validate_Act_Product_Items.
54 --   17-Mar-2005       mkothari   Relaxed category_set_id validation for FUND - Bug 4241326
55 --                                (also modified get_category_name and description functions)
56 --   26-May-2005       musman     Added schedule validation
57 --   26-Sep-2005       musman     Commenting out the validation for schedules.BUG:4634617 fix
58 --   31-JAN-2006       inanaiah   Bug 4956134 fix - sql id 14423554, 14423628
59 --
60 -- End of Comments
61 
62 /*
63 --bug: 4634617 fix as per r12 requirement removing the validation
64 --PROCEDURE check_product_val_for_csch
65 --(    p_act_Product_rec     IN      act_Product_rec_type,
66 --    x_return_status  OUT NOCOPY       VARCHAR2
67 --);
68 */
69 
70 
71 FUNCTION get_actual_unit(p_activity_product_id IN NUMBER)
72 RETURN NUMBER
73 IS
74 
75   CURSOR c_actual_unit IS
76   SELECT NVL(SUM(scan_unit - scan_unit_remaining), 0)
77     FROM ozf_funds_utilized_all_b
78    WHERE activity_product_id = p_activity_product_id;
79 
80   l_actual_unit NUMBER := 0;
81 
82 BEGIN
83 
84   OPEN c_actual_unit;
85   FETCH c_actual_unit INTO l_actual_unit;
86   CLOSE c_actual_unit;
87 
88   RETURN l_actual_unit;
89 
90   EXCEPTION
91     WHEN OTHERS THEN
92   RETURN 0;
93 
94 END ;
95 
96 PROCEDURE Create_Act_Product
97 ( p_api_version         IN     NUMBER,
98   p_init_msg_list       IN     VARCHAR2         := FND_API.G_FALSE,
99   p_commit              IN     VARCHAR2         := FND_API.G_FALSE,
100   p_validation_level    IN     NUMBER           := FND_API.G_VALID_LEVEL_FULL,
101   x_return_status       OUT NOCOPY    VARCHAR2,
102   x_msg_count           OUT NOCOPY    NUMBER,
103   x_msg_data            OUT NOCOPY    VARCHAR2,
104   p_act_Product_rec     IN     act_Product_rec_type,
105   x_act_product_id      OUT NOCOPY    NUMBER
106 ) IS
107         l_api_name      CONSTANT VARCHAR2(30)  := 'Create_Act_Product';
108         l_api_version   CONSTANT NUMBER        := 1.0;
109         l_full_name     CONSTANT VARCHAR2(60)  := G_PACKAGE_NAME || '.' || l_api_name;
110         -- Status Local Variables
111         l_return_status         VARCHAR2(1);  -- Return value from procedures
112         l_act_Product_rec       act_Product_rec_type := p_act_Product_rec;
113         l_act_product_id        NUMBER;
114    l_user_id  NUMBER;
115    l_res_id   NUMBER;
116 
117    CURSOR get_res_id(l_user_id IN NUMBER) IS
118    SELECT resource_id
119    FROM ams_jtf_rs_emp_v
120    WHERE user_id = l_user_id;
121 
122         CURSOR C_act_product_id IS
123         SELECT ams_act_products_s.NEXTVAL
124         FROM dual;
125   BEGIN
126         -- Standard Start of API savepoint
127         SAVEPOINT Create_Act_Product_PVT;
128         -- Standard call to check for call compatibility.
129         IF NOT FND_API.Compatible_API_Call ( l_api_version,
130                                              p_api_version,
131                                              l_api_name,
132                                              G_PACKAGE_NAME)
133         THEN
134                 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
135         END IF;
136         -- Initialize message list IF p_init_msg_list is set to TRUE.
137         IF FND_API.to_Boolean( p_init_msg_list )
138         THEN
139                 FND_MSG_PUB.initialize;
140         END IF;
141         --  Initialize API return status to success
142         x_return_status := FND_API.G_RET_STS_SUCCESS;
143         --
144         -- API body
145         --
146    ----------------------- validate -----------------------
147    IF (AMS_DEBUG_HIGH_ON) THEN
148 
149    AMS_Utility_PVT.debug_message(l_full_name ||': validate');
150    END IF;
151         Validate_Act_Product
152         ( p_api_version                         => 1.0
153           ,p_init_msg_list                      => p_init_msg_list
154           ,p_validation_level                   => p_validation_level
155           ,x_return_status                      => l_return_status
156           ,x_msg_count                          => x_msg_count
157           ,x_msg_data                           => x_msg_data
158           ,p_act_Product_rec                    => l_act_Product_rec
159         );
160         -- If any errors happen abort API.
161         IF l_return_status = FND_API.G_RET_STS_ERROR
162         THEN
163                 RAISE FND_API.G_EXC_ERROR;
164         ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR
165         THEN
166                 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
167         END IF;
168    --------------- CHECK ACCESS FOR THE USER-------------------
169    ----------added sugupta 07/25/2000
170    -- modified sugupta 09/05/2000 bug 1391106
171    -- Ownrship not checked for Messages screen - its a work around. Thsi IF loop should be
172    -- removed once Nari comesout with a better solution
173   -- Changed by rssharma as we will not require this validation for exclusion .. added  prod to the list
174   IF l_act_Product_rec.arc_act_product_used_by NOT IN ('MESG','OFFR' , 'PROD') THEN
175    IF (AMS_DEBUG_HIGH_ON) THEN
176 
177    AMS_Utility_PVT.debug_message(l_api_name||': check access');
178    END IF;
179         l_user_id := FND_GLOBAL.User_Id;
180    IF (AMS_DEBUG_HIGH_ON) THEN
181 
182    AMS_Utility_PVT.debug_message(l_api_name||': check access- user id='||l_user_id);
183    END IF;
184         if l_user_id IS NOT NULL then
185                 open get_res_id(l_user_id);
186                 fetch get_res_id into l_res_id;
187                 close get_res_id;
188         end if;
189         --
190         -- Changed access to check for value N
191         --
192         if AMS_ACCESS_PVT.check_update_access(l_act_Product_rec.act_product_used_by_id,l_act_Product_rec.arc_act_product_used_by, l_res_id, 'USER') = 'N'  then
193                 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
194          FND_MESSAGE.set_name('AMS', 'AMS_EVO_NO_UPDATE_ACCESS'); --reusing message
195          FND_MSG_PUB.add;
196                 END IF;
197                 RAISE FND_API.g_exc_error;
198         end if;
199   END IF;
200         -------------------------------create---------------------------------
201         -- Get ID for activity product from sequence.
202         OPEN c_act_product_id;
203         FETCH c_act_product_id INTO l_act_Product_rec.activity_product_id;
204         CLOSE c_act_product_id;
205 
206         INSERT INTO AMS_ACT_PRODUCTS
207         (
208         activity_product_id,
209         last_update_date,
210         last_updated_by,
211         creation_date,
212         created_by,
213         last_update_login,
214         object_version_number,
215         act_product_used_by_id,
216         arc_act_product_used_by,
217         inventory_item_id,
218         organization_id,
219         category_id,
220         category_set_id,
221         level_type_code,
222         product_sale_type,
223         primary_product_flag,
224         enabled_flag,
225         excluded_flag,
226         attribute_category,
227         attribute1,
228         attribute2,
229         attribute3,
230         attribute4,
231         attribute5,
232         attribute6,
233         attribute7,
234         attribute8,
235         attribute9,
236         attribute10,
237         attribute11,
238         attribute12,
239         attribute13,
240         attribute14,
241         attribute15,
242         --security_group_id,
243         line_lumpsum_amount,
244         line_lumpsum_qty,
245         channel_id,
246         uom_code,
247         quantity,
248         scan_value,
249         scan_unit_forecast,
250         adjustment_flag)
251         VALUES
252         (
253         l_act_Product_rec.activity_product_id,
254         -- standard who columns
255         sysdate,
256         FND_GLOBAL.User_Id,
257         sysdate,
258         FND_GLOBAL.User_Id,
259         FND_GLOBAL.Conc_Login_Id,
260         1,  -- object_version_number
261         l_act_Product_rec.act_product_used_by_id,
262         l_act_Product_rec.arc_act_product_used_by,
263         l_act_Product_rec.inventory_item_id,
264         l_act_Product_rec.organization_id,
265         l_act_Product_rec.category_ID,
266         l_act_Product_rec.category_set_id,
267         l_act_Product_rec.level_type_code,
268         l_act_Product_rec.PRODUCT_SALE_TYPE,
269         nvl(l_act_Product_rec.PRIMARY_PRODUCT_FLAG,'N'),
270         nvl(l_act_Product_rec.ENABLED_FLAG,'Y'),
271         nvl(l_act_Product_rec.EXCLUDED_FLAG,'N'),
272         l_act_Product_rec.attribute_category,
273         l_act_Product_rec.attribute1,
274         l_act_Product_rec.attribute2,
275         l_act_Product_rec.attribute3,
276         l_act_Product_rec.attribute4,
277         l_act_Product_rec.attribute5,
278         l_act_Product_rec.attribute6,
279         l_act_Product_rec.attribute7,
280         l_act_Product_rec.attribute8,
281         l_act_Product_rec.attribute9,
282         l_act_Product_rec.attribute10,
283         l_act_Product_rec.attribute11,
284         l_act_Product_rec.attribute12,
285         l_act_Product_rec.attribute13,
286         l_act_Product_rec.attribute14,
287         l_act_Product_rec.attribute15,
288         --l_act_Product_rec.security_group_id,
289         l_act_Product_rec.line_lumpsum_amount,
290         l_act_Product_rec.line_lumpsum_qty,
291         l_act_Product_rec.channel_id,
292         DECODE(l_act_Product_rec.uom_code, NULL, 'Ea', FND_API.G_MISS_CHAR, 'Ea', l_act_Product_rec.uom_code),
293         DECODE(l_act_Product_rec.quantity, NULL, 1, FND_API.G_MISS_NUM, 1, l_act_Product_rec.quantity),
294         l_act_Product_rec.scan_value,
295         l_act_Product_rec.scan_unit_forecast,
296         l_act_Product_rec.adjustment_flag);
297         -- set OUT value
298         x_act_product_id := l_act_Product_rec.activity_product_id;
299 
300   /*
301    -- added by sugupta on 07/11/2000
302    -- indicate proiduct has been defined for the entity
303    AMS_ObjectAttribute_PVT.modify_object_attribute(
304       p_api_version        => l_api_version,
305       p_init_msg_list      => FND_API.g_false,
306       p_commit             => FND_API.g_false,
307       p_validation_level   => FND_API.g_valid_level_full,
308 
309       x_return_status      => l_return_status,
310       x_msg_count          => x_msg_count,
311       x_msg_data           => x_msg_data,
312 
313       p_object_type        => l_act_Product_rec.arc_act_product_used_by,
314       p_object_id          => l_act_Product_rec.act_product_used_by_id,
315       p_attr               => 'PROD',
316       p_attr_defined_flag  => 'Y'
317    );
318 
319    IF l_return_status = FND_API.g_ret_sts_error THEN
320       RAISE FND_API.g_exc_error;
321    ELSIF l_return_status = FND_API.g_ret_sts_unexp_error THEN
322       RAISE FND_API.g_exc_unexpected_error;
323    END IF;
324 */
325     --
326     -- END of API body.
327     --
328     -- Standard check of p_commit.
329     IF FND_API.To_Boolean ( p_commit )
330     THEN
331                 COMMIT WORK;
332     END IF;
333     -- Standard call to get message count AND IF count is 1, get message info.
334     FND_MSG_PUB.Count_AND_Get
335     ( p_count           =>      x_msg_count,
336       p_data            =>      x_msg_data,
337       p_encoded         =>      FND_API.G_FALSE
338     );
339   EXCEPTION
340         WHEN FND_API.G_EXC_ERROR THEN
341                 ROLLBACK TO Create_Act_Product_PVT;
342                 x_return_status := FND_API.G_RET_STS_ERROR ;
343                 FND_MSG_PUB.Count_AND_Get
344                 ( p_count       =>      x_msg_count,
345                   p_data        =>      x_msg_data,
346                   p_encoded     =>      FND_API.G_FALSE
347                 );
348         WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
349                 ROLLBACK TO Create_Act_Product_PVT;
350                 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
351                 FND_MSG_PUB.Count_AND_Get
352                 ( p_count       =>      x_msg_count,
353                   p_data        =>      x_msg_data,
354                   p_encoded     =>      FND_API.G_FALSE
355                 );
356         WHEN OTHERS THEN
357                         IF (c_act_product_id%ISOPEN) THEN
358                                 CLOSE c_act_product_id;
359                         END IF;
360                 ROLLBACK TO Create_Act_Product_PVT;
361                 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
362                 IF FND_MSG_PUB.Check_Msg_Level ( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR )
363                 THEN
364                         FND_MSG_PUB.Add_Exc_Msg( G_PACKAGE_NAME,l_api_name);
365                 END IF;
366                 FND_MSG_PUB.Count_AND_Get
367                 ( p_count       =>      x_msg_count,
368                   p_data        =>      x_msg_data,
369                   p_encoded     =>      FND_API.G_FALSE
370                 );
371 END Create_Act_Product;
372 /*****************************************************************************************/
373 -- Start of Comments
374 --
375 -- NAME
376 --   Update_Act_Product
377 --
378 -- PURPOSE
379 --   This procedure is to update a Product record that satisfy caller needs
380 --
381 -- HISTORY
382 --   11/11/1999        rvaka            created
383 -- End of Comments
384 PROCEDURE Update_Act_Product
385 ( p_api_version         IN      NUMBER,
386   p_init_msg_list               IN      VARCHAR2        := FND_API.G_FALSE,
387   p_commit                      IN      VARCHAR2        := FND_API.G_FALSE,
388   p_validation_level    IN      NUMBER  := FND_API.G_VALID_LEVEL_FULL,
389   x_return_status               OUT NOCOPY     VARCHAR2,
390   x_msg_count                   OUT NOCOPY     NUMBER,
391   x_msg_data                    OUT NOCOPY     VARCHAR2,
392   p_act_Product_rec     IN      act_Product_rec_type
393 ) IS
394         l_api_name                      CONSTANT VARCHAR2(30)  := 'Update_Act_Product';
395         l_api_version                   CONSTANT NUMBER        := 1.0;
396         -- Status Local Variables
397         l_return_status                 VARCHAR2(1);  -- Return value from procedures
398         l_act_Product_rec               act_Product_rec_type;
399                    ------
400    l_user_id  NUMBER;
401    l_res_id   NUMBER;
402 
403    CURSOR get_res_id(l_user_id IN NUMBER) IS
404    SELECT resource_id
405    FROM ams_jtf_rs_emp_v
406    WHERE user_id = l_user_id;
407 
408   BEGIN
409         -- Standard Start of API savepoint
410         SAVEPOINT Update_Act_Product_PVT;
411         -- Standard call to check for call compatibility.
412         IF NOT FND_API.Compatible_API_Call ( l_api_version,
413                                              p_api_version,
414                                              l_api_name,
415                                              G_PACKAGE_NAME)
416         THEN
417                 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
418         END IF;
419         -- Initialize message list IF p_init_msg_list is set to TRUE.
420         IF FND_API.to_Boolean( p_init_msg_list ) THEN
421                 FND_MSG_PUB.initialize;
422         END IF;
423         --  Initialize API return status to success
424         x_return_status := FND_API.G_RET_STS_SUCCESS;
425         --
426         -- API body
427         --
428            complete_act_Product_rec(
429                 p_act_Product_rec,
430                 l_act_Product_rec
431            );
432 
433         IF p_validation_level >= JTF_PLSQL_API.g_valid_level_item
434         THEN
435                 Validate_Act_Product_Items
436                 ( p_act_Product_rec     => l_act_Product_rec,
437                   p_validation_mode     => JTF_PLSQL_API.g_update,
438                   x_return_status               => l_return_status
439                 );
440                 -- If any errors happen abort API.
441                 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR
442                 THEN
443                         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
444                 ELSIF l_return_status = FND_API.G_RET_STS_ERROR
445                 THEN
446                         RAISE FND_API.G_EXC_ERROR;
447                 END IF;
448         END IF;
449 
450    --------------- CHECK ACCESS FOR THE USER-------------------
451    ----------added sugupta 07/25/2000
452    IF (AMS_DEBUG_HIGH_ON) THEN
453 
454    AMS_Utility_PVT.debug_message(l_api_name||': check access');
455    END IF;
456         l_user_id := FND_GLOBAL.User_Id;
457    IF (AMS_DEBUG_HIGH_ON) THEN
458 
459    AMS_Utility_PVT.debug_message(l_api_name||': check access- user id='||l_user_id);
460    END IF;
461         if l_user_id IS NOT NULL then
462                 open get_res_id(l_user_id);
463                 fetch get_res_id into l_res_id;
464                 close get_res_id;
465         end if;
466         --
467         -- Changed Access call to check N instead of F
468         --
469         if l_act_Product_rec.arc_act_product_used_by NOT IN ('OFFR') THEN
470         if AMS_ACCESS_PVT.check_update_access(l_act_Product_rec.act_product_used_by_id,l_act_Product_rec.arc_act_product_used_by, l_res_id, 'USER') = 'N' then
471                 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
472          FND_MESSAGE.set_name('AMS', 'AMS_EVO_NO_UPDATE_ACCESS'); --reusing message
473          FND_MSG_PUB.add;
474                 END IF;
475                 RAISE FND_API.g_exc_error;
476         end if;
477         end if;
478    ---------------------------------update-----------------------------
479         -- Perform the database operation
480 
481         update AMS_ACT_PRODUCTS
482         set
483                 last_update_date = sysdate
484                 ,last_updated_by =  FND_GLOBAL.User_Id
485                 ,last_update_login = FND_GLOBAL.Conc_Login_Id
486                 ,object_version_number = l_act_Product_rec.object_version_number+1
487                 ,act_product_used_by_id = l_act_Product_rec.act_product_used_by_id
488                 ,arc_act_product_used_by = l_act_Product_rec.arc_act_product_used_by
489                 ,organization_id = l_act_Product_rec.organization_id
490                 ,inventory_item_id = l_act_Product_rec.inventory_item_id
491                 ,category_id = l_act_Product_rec.category_id
492                 ,category_set_id = l_act_Product_rec.category_set_id
493                 ,level_type_code = l_act_Product_rec.level_type_code
494                 ,product_sale_type = l_act_Product_rec.product_sale_type
495                 ,primary_product_flag = l_act_Product_rec.primary_product_flag
496                 ,enabled_flag = l_act_Product_rec.enabled_flag
497                 ,excluded_flag = l_act_Product_rec.excluded_flag
498                 ,attribute_category = l_act_Product_rec.attribute_category
499                 ,attribute1 = l_act_Product_rec.attribute1
500                 ,attribute2 = l_act_Product_rec.attribute2
501                 ,attribute3 = l_act_Product_rec.attribute3
502                 ,attribute4 = l_act_Product_rec.attribute4
503                 ,attribute5 = l_act_Product_rec.attribute5
504                 ,attribute6 = l_act_Product_rec.attribute6
505                 ,attribute7 = l_act_Product_rec.attribute7
506                 ,attribute8 = l_act_Product_rec.attribute8
507                 ,attribute9 = l_act_Product_rec.attribute9
508                 ,attribute10 = l_act_Product_rec.attribute10
509                 ,attribute11 = l_act_Product_rec.attribute11
510                 ,attribute12 = l_act_Product_rec.attribute12
511                 ,attribute13 = l_act_Product_rec.attribute13
512                 ,attribute14 = l_act_Product_rec.attribute14
513                 ,attribute15 = l_act_Product_rec.attribute15
514                 --,security_group_id = l_act_product_rec.security_group_id
515                 ,line_lumpsum_amount = l_act_product_rec.line_lumpsum_amount
516                 ,line_lumpsum_qty = l_act_product_rec.line_lumpsum_qty
517                 ,channel_id = l_act_Product_rec.channel_id
518                 ,uom_code = DECODE(l_act_Product_rec.uom_code, NULL, 'Ea', FND_API.G_MISS_CHAR, 'Ea', l_act_Product_rec.uom_code)
519                 ,quantity = DECODE(l_act_Product_rec.quantity, NULL, 1, FND_API.G_MISS_NUM, 1, l_act_Product_rec.quantity)
520                 ,scan_value = l_act_Product_rec.scan_value
521                 ,scan_unit_forecast = l_act_Product_rec.scan_unit_forecast
522                 ,adjustment_flag = l_act_Product_rec.adjustment_flag
523         WHERE activity_product_id = l_act_Product_rec.activity_product_id
524        AND object_version_number = l_act_Product_rec.object_version_number;
525         IF (SQL%NOTFOUND)
526         THEN
527                 -- Error, check the msg level and added an error message to the
528                 -- API message list
529                 IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_ERROR)
530                 THEN -- MMSG
531                                 FND_MESSAGE.set_name('AMS', 'AMS_API_RECORD_NOT_FOUND');
532                         FND_MSG_PUB.Add;
533                 END IF;
534                 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
535         END IF;
536         --
537         -- END of API body.
538         --
539         -- Standard check of p_commit.
540         IF FND_API.To_Boolean ( p_commit )
541         THEN
542                 COMMIT WORK;
543         END IF;
544         -- Standard call to get message count AND IF count is 1, get message info.
545         FND_MSG_PUB.Count_AND_Get
546         ( p_count       =>      x_msg_count,
547              p_data     =>      x_msg_data,
548              p_encoded  =>      FND_API.G_FALSE
549         );
550   EXCEPTION
551         WHEN FND_API.G_EXC_ERROR THEN
552                 ROLLBACK TO Update_Act_Product_PVT;
553                 x_return_status := FND_API.G_RET_STS_ERROR ;
554                 FND_MSG_PUB.Count_AND_Get
555                 ( p_count       =>      x_msg_count,
556                p_data   =>      x_msg_data,
557                   p_encoded     =>      FND_API.G_FALSE
558              );
559         WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
560                 ROLLBACK TO Update_Act_Product_PVT;
561                 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
562                 FND_MSG_PUB.Count_AND_Get
563                 ( p_count       =>      x_msg_count,
564                p_data   =>      x_msg_data,
565                   p_encoded     =>      FND_API.G_FALSE
566              );
567         WHEN OTHERS THEN
568                 ROLLBACK TO Update_Act_Product_PVT;
569                 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
570                 IF FND_MSG_PUB.Check_Msg_Level ( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR )
571                 THEN
572                         FND_MSG_PUB.Add_Exc_Msg( G_PACKAGE_NAME,l_api_name);
573                 END IF;
574                 FND_MSG_PUB.Count_AND_Get
575                 ( p_count       =>      x_msg_count,
576                   p_data        =>      x_msg_data,
577                   p_encoded     =>      FND_API.G_FALSE
578              );
579 END Update_Act_Product;
580 /*****************************************************************************************/
581 -- Start of Comments
582 --
583 -- NAME
584 --   Delete_Act_Product
585 --
586 -- PURPOSE
587 --   This procedure is to delete a product record that satisfy caller needs
588 --
589 -- HISTORY
590 --   11/11/1999        rvaka            created
591 -- End of Comments
592 PROCEDURE Delete_Act_Product
593 ( p_api_version         IN     NUMBER,
594   p_init_msg_list               IN     VARCHAR2 := FND_API.G_FALSE,
595   p_commit                      IN     VARCHAR2 := FND_API.G_FALSE,
596   p_validation_level    IN     NUMBER           := FND_API.G_VALID_LEVEL_FULL,
597   x_return_status               OUT NOCOPY    VARCHAR2,
598   x_msg_count                   OUT NOCOPY    NUMBER,
599   x_msg_data                    OUT NOCOPY    VARCHAR2,
600   p_act_product_id              IN     NUMBER,
601   p_object_version       IN     NUMBER
602 ) IS
603         l_api_name              CONSTANT VARCHAR2(30)  := 'Delete_Act_Product';
604         l_api_version   CONSTANT NUMBER        := 1.0;
605         -- Status Local Variables
606         l_return_status         VARCHAR2(1);  -- Return value from procedures
607         l_act_product_id        NUMBER := p_act_product_id;
608    l_object_type      VARCHAR2(30);
609    l_object_id        NUMBER;
610    l_dummy            VARCHAR2(100);
611    l_acc_obj              VARCHAR2(30);
612    l_acc_obj_id           NUMBER;
613    ------
614    l_user_id  NUMBER;
615    l_res_id   NUMBER;
616 
617    cursor get_association_info(l_act_id IN NUMBER) is
618    SELECT distinct a.ARC_ACT_PRODUCT_USED_BY, a.ACT_PRODUCT_USED_BY_ID
619      FROM ams_act_products a, ams_act_products b
620    WHERE  a.ARC_ACT_PRODUCT_USED_BY = b.ARC_ACT_PRODUCT_USED_BY
621    AND a.ACT_PRODUCT_USED_BY_ID = b.ACT_PRODUCT_USED_BY_ID
622    AND b.ACTIVITY_PRODUCT_ID = l_act_id;
623 
624    cursor get_count(c_obj_type IN VARCHAR2, c_obj_id IN NUMBER) is
625      SELECT 'dummy'
626      FROM ams_act_products
627    WHERE  ARC_ACT_PRODUCT_USED_BY = c_obj_type
628    AND ACT_PRODUCT_USED_BY_ID = c_obj_id;
629 
630    CURSOR get_res_id(l_user_id IN NUMBER) IS
631    SELECT resource_id
632    FROM ams_jtf_rs_emp_v
633    WHERE user_id = l_user_id;
634 
635    CURSOR get_obj_info(l_actprd_id IN NUMBER) IS
636    SELECT arc_act_product_used_by, act_product_used_by_id
637    FROM ams_act_products
638    WHERE activity_product_id = l_actprd_id;
639 
640   BEGIN
641         -- Standard Start of API savepoint
642         SAVEPOINT Delete_Act_Product_PVT;
643         -- Standard call to check for call compatibility.
644         IF NOT FND_API.Compatible_API_Call ( l_api_version,
645                                            p_api_version,
646                                            l_api_name,
647                                            G_PACKAGE_NAME)
648         THEN
649                 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
650         END IF;
651         -- Initialize message list IF p_init_msg_list is set to TRUE.
652         IF FND_API.to_Boolean( p_init_msg_list )
653         THEN
654                 FND_MSG_PUB.initialize;
655         END IF;
656         --  Initialize API return status to success
657         x_return_status := FND_API.G_RET_STS_SUCCESS;
658         --
659         -- API body
660         --
661    --------------- CHECK ACCESS FOR THE USER-------------------
662    ----------added sugupta 07/25/2000
663         l_user_id := FND_GLOBAL.User_Id;
664    IF (AMS_DEBUG_HIGH_ON) THEN
665 
666    AMS_Utility_PVT.debug_message(l_api_name||': check access- user id='||l_user_id);
667    END IF;
668         if l_user_id IS NOT NULL then
669                 open get_res_id(l_user_id);
670                 fetch get_res_id into l_res_id;
671                 close get_res_id;
672         end if;
673 
674         open get_obj_info(p_act_product_id);
675         fetch get_obj_info into l_acc_obj, l_acc_obj_id;
676         close get_obj_info;
677 
678         -- Commented out the following call to check_update_access
679         -- as it does not work for Messages tab. GDEODHAR : Oct 06, 2000
680         /*
681         if AMS_ACCESS_PVT.check_update_access(l_acc_obj_id, l_acc_obj, l_res_id, 'USER') <> 'F' then
682                 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
683          FND_MESSAGE.set_name('AMS', 'AMS_EVO_NO_UPDATE_ACCESS'); --reusing message
684          FND_MSG_PUB.add;
685                 END IF;
686                 RAISE FND_API.g_exc_error;
687         end if;
688         */
689         -- End of commented part. GDEODHAR : Oct 06, 2000.
690    ---------------------delete-------------------------------------
691      OPEN get_association_info(l_act_product_id);
692      FETCH  get_association_info into l_object_type, l_object_id;
693      close get_association_info;
694 
695         -- Perform the database operation
696                 -- Delete header data
697                 DELETE FROM AMS_ACT_PRODUCTS
698                 WHERE  activity_product_id = l_act_product_id
699                   and  object_version_number = p_object_version;
700                 IF SQL%NOTFOUND THEN
701                 --
702                 -- Add error message to API message list.
703                 --
704                         IF FND_MSG_PUB.check_msg_level (FND_MSG_PUB.G_MSG_LVL_ERROR)
705                         THEN
706                                 FND_MESSAGE.set_name ('AMS', 'AMS_API_RECORD_NOT_FOUND');
707                                 FND_MSG_PUB.add;
708                         END IF;
709                         RAISE FND_API.G_EXC_ERROR;
710                 END IF;
711 
712 /*
713    -----          Modify Object Attribute ---------------
714 
715      OPEN get_count(l_object_type,l_object_id);
716      FETCH  get_count into l_dummy;
717 
718      if (get_count%NOTFOUND) then
719 
720      -- need to make a call to update ams_objec_attributes that no information
721      -- exist for this combination of master obj type and id and using object type
722      -- and set attribute defined flag to N
723 
724      AMS_ObjectAttribute_PVT.modify_object_attribute(
725                 p_api_version        => l_api_version,
726                 p_init_msg_list      => FND_API.g_false,
727                 p_commit             => FND_API.g_false,
728                 p_validation_level   => FND_API.g_valid_level_full,
729 
730                 x_return_status      => x_return_status,
731                 x_msg_count          => x_msg_count,
732                 x_msg_data           => x_msg_data,
733 
734                 p_object_type        => l_object_type,
735                 p_object_id          => l_object_id,
736                 p_attr               => 'PROD',
737                 p_attr_defined_flag  => 'N'
738              );
739              IF x_return_status = FND_API.g_ret_sts_error THEN
740                 RAISE FND_API.g_exc_error;
741              ELSIF x_return_status = FND_API.g_ret_sts_unexp_error THEN
742                 RAISE FND_API.g_exc_unexpected_error;
743              END IF;
744 
745      end if;
746 
747      close get_count;
748 */
749 
750         --
751         -- END of API body.
752         --
753         -- Standard check of p_commit.
754         IF FND_API.To_Boolean ( p_commit )
755         THEN
756                 COMMIT WORK;
757         END IF;
758         -- Standard call to get message count AND IF count is 1, get message info.
759         FND_MSG_PUB.Count_AND_Get
760         ( p_count       =>      x_msg_count,
761           p_data        =>      x_msg_data,
762           p_encoded     =>      FND_API.G_FALSE
763         );
764   EXCEPTION
765         WHEN FND_API.G_EXC_ERROR THEN
766                 ROLLBACK TO Delete_Act_Product_PVT;
767                 x_return_status := FND_API.G_RET_STS_ERROR ;
768                 FND_MSG_PUB.Count_AND_Get
769                 ( p_count       =>      x_msg_count,
770                p_data        =>      x_msg_data,
771                   p_encoded     =>      FND_API.G_FALSE
772              );
773         WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
774                 ROLLBACK TO Delete_Act_Product_PVT;
775                 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
776                 FND_MSG_PUB.Count_AND_Get
777                 ( p_count       =>      x_msg_count,
778                p_data   =>      x_msg_data,
779                   p_encoded     =>      FND_API.G_FALSE
780              );
781         WHEN OTHERS THEN
782                         IF (get_association_info%ISOPEN) THEN
783                                 CLOSE get_association_info;
784                         END IF;
785                         IF (get_count%ISOPEN) THEN
786                                 CLOSE get_count;
787                         END IF;
788                 ROLLBACK TO Delete_Act_Product_PVT;
789                 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
790                 IF FND_MSG_PUB.Check_Msg_Level ( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR )
791                 THEN
792                         FND_MSG_PUB.Add_Exc_Msg( G_PACKAGE_NAME,l_api_name);
793                 END IF;
794                 FND_MSG_PUB.Count_AND_Get
795                 ( p_count       =>      x_msg_count,
796                        p_data   =>      x_msg_data,
797                   p_encoded     =>      FND_API.G_FALSE
798              );
799 END Delete_Act_Product;
800 /*****************************************************************************************/
801 -- Start of Comments
802 --
803 -- NAME
804 --   Lock_Act_product
805 --
806 -- PURPOSE
807 --   This procedure is to lock a product record that satisfy caller needs
808 --
809 -- HISTORY
810 --   11/11/1999        rvaka            created
811 -- End of Comments
812 PROCEDURE Lock_Act_product
813 ( p_api_version                 IN     NUMBER,
814   p_init_msg_list               IN     VARCHAR2    := FND_API.G_FALSE,
815   p_validation_level            IN     NUMBER      := FND_API.G_VALID_LEVEL_FULL,
816   x_return_status               OUT NOCOPY    VARCHAR2,
817   x_msg_count                   OUT NOCOPY    NUMBER,
818   x_msg_data                    OUT NOCOPY    VARCHAR2,
819   p_act_product_id      IN     NUMBER,
820   p_object_version              IN     NUMBER
821 ) IS
822         l_api_name              CONSTANT VARCHAR2(30)  := 'Lock_Act_Product';
823         l_api_version   CONSTANT NUMBER        := 1.0;
824         -- Status Local Variables
825         l_return_status         VARCHAR2(1);  -- Return value from procedures
826         l_act_product_id        NUMBER;
827         CURSOR c_act_product IS
828         SELECT activity_product_id
829           FROM AMS_ACT_PRODUCTS
830          WHERE activity_product_id = p_act_product_id
831            AND object_version_number = p_object_version
832            FOR UPDATE of activity_product_id NOWAIT;
833   BEGIN
834         -- Standard call to check for call compatibility.
835         IF NOT FND_API.Compatible_API_Call ( l_api_version,
836                                            p_api_version,
837                                            l_api_name,
838                                            G_PACKAGE_NAME)
839         THEN
840                 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
841         END IF;
842         -- Initialize message list if p_init_msg_list is set to TRUE.
843         IF FND_API.to_Boolean( p_init_msg_list )
844         THEN
845                 FND_MSG_PUB.initialize;
846         END IF;
847         --  Initialize API return status to success
848         x_return_status := FND_API.G_RET_STS_SUCCESS;
849         --
850         -- API body
851         --
852         -- Perform the database operation
853         OPEN c_act_product;
854         FETCH c_act_product INTO l_act_product_id;
855         IF (c_act_product%NOTFOUND) THEN
856         CLOSE c_act_product;
857                 -- Error, check the msg level and added an error message to the
858                 -- API message list
859                 IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_ERROR)
860                 THEN -- MMSG
861                         FND_MESSAGE.Set_Name('AMS', 'AMS_API_RECORD_NOT_FOUND');
862                         FND_MSG_PUB.Add;
863                 END IF;
864                 RAISE FND_API.G_EXC_ERROR;
865         END IF;
866         CLOSE c_act_product;
867         --
868         -- END of API body.
869         --
870         -- Standard call to get message count AND IF count is 1, get message info.
871         FND_MSG_PUB.Count_AND_Get
872         ( p_count       =>      x_msg_count,
873           p_data        =>      x_msg_data,
874              p_encoded  =>      FND_API.G_FALSE
875         );
876   EXCEPTION
877         WHEN FND_API.G_EXC_ERROR THEN
878                 x_return_status := FND_API.G_RET_STS_ERROR ;
879                 FND_MSG_PUB.Count_AND_Get
880                 ( p_count       =>      x_msg_count,
881                p_data   =>      x_msg_data,
882                   p_encoded     =>      FND_API.G_FALSE
883              );
884         WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
885                 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
886                 FND_MSG_PUB.Count_AND_Get
887                 ( p_count       =>      x_msg_count,
888                p_data   =>      x_msg_data,
889                   p_encoded     =>      FND_API.G_FALSE
890              );
891         WHEN AMS_Utility_PVT.resource_locked THEN
892         x_return_status := FND_API.g_ret_sts_error;
893           IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
894              FND_MESSAGE.set_name('AMS', 'AMS_API_RESOURCE_LOCKED');
895              FND_MSG_PUB.add;
896           END IF;
897                 FND_MSG_PUB.Count_AND_Get
898                 ( p_count       =>      x_msg_count,
899                   p_data                =>      x_msg_data,
900                            p_encoded    =>      FND_API.G_FALSE
901                 );
902         WHEN OTHERS THEN
903                         IF (c_act_product%ISOPEN) THEN
904                                 CLOSE c_act_product;
905                         END IF;
906                 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
907                 IF FND_MSG_PUB.Check_Msg_Level ( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR )
908                 THEN
909                         FND_MSG_PUB.Add_Exc_Msg( G_PACKAGE_NAME,l_api_name);
910                 END IF;
911                 FND_MSG_PUB.Count_AND_Get
912                 ( p_count       =>      x_msg_count,
913                        p_data   =>      x_msg_data,
914                   p_encoded     =>      FND_API.G_FALSE
915              );
916 END Lock_Act_Product;
917 /*****************************************************************************************/
918 -- Start of Comments
919 --
920 -- NAME
921 --   Validate_Act_Product
922 --
923 -- PURPOSE
924 --   This procedure is to validate an activity product record
925 --
926 -- HISTORY
927 --   1/1/2000        rvaka            created
928 -- End of Comments
929 PROCEDURE Validate_Act_Product
930 ( p_api_version         IN     NUMBER,
931   p_init_msg_list       IN     VARCHAR2 := FND_API.G_FALSE,
932   p_validation_level    IN     NUMBER   := FND_API.G_VALID_LEVEL_FULL,
933   x_return_status       OUT NOCOPY    VARCHAR2,
934   x_msg_count           OUT NOCOPY    NUMBER,
935   x_msg_data            OUT NOCOPY    VARCHAR2,
936   p_act_Product_rec     IN     act_Product_rec_type
937 ) IS
938         l_api_name      CONSTANT VARCHAR2(30)  := 'Validate_Act_Product';
939         l_api_version   CONSTANT NUMBER        := 1.0;
940                 l_full_name     CONSTANT VARCHAR2(60)  := G_PACKAGE_NAME || '.' || l_api_name;
941         -- Status Local Variables
942         l_return_status         VARCHAR2(1);  -- Return value from procedures
943         l_act_Product_rec       act_Product_rec_type := p_act_Product_rec;
944         l_default_act_product_rec       act_Product_rec_type;
945                 l_act_product_id        NUMBER;
946   BEGIN
947         -- Standard call to check for call compatibility.
948         IF NOT FND_API.Compatible_API_Call ( l_api_version,
949                                            p_api_version,
950                                            l_api_name,
951                                            G_PACKAGE_NAME)
952         THEN
953                 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
954         END IF;
955         -- Initialize message list if p_init_msg_list is set to TRUE.
956         IF FND_API.to_Boolean( p_init_msg_list ) THEN
957                 FND_MSG_PUB.initialize;
958         END IF;
959         --  Initialize API return status to success
960         x_return_status := FND_API.G_RET_STS_SUCCESS;
961         --
962         -- API body
963         --
964    IF (AMS_DEBUG_HIGH_ON) THEN
965 
966    AMS_Utility_PVT.debug_message(l_full_name||': check items');
967    END IF;
968         IF p_validation_level >= JTF_PLSQL_API.g_valid_level_item
969         THEN
970                 Validate_Act_Product_Items
971                 ( p_act_Product_rec     => l_act_Product_rec,
972                   p_validation_mode     => JTF_PLSQL_API.g_create,
973                   x_return_status               => l_return_status
974                 );
975                 -- If any errors happen abort API.
976                 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR
977                 THEN
978                         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
979                 ELSIF l_return_status = FND_API.G_RET_STS_ERROR
980                 THEN
981                         RAISE FND_API.G_EXC_ERROR;
982                 END IF;
983         END IF;
984         -- Perform cross attribute validation and missing attribute checks. Record
985         -- level validation.
986    IF (AMS_DEBUG_HIGH_ON) THEN
987 
988    AMS_Utility_PVT.debug_message(l_full_name||': check record level');
989    END IF;
990         IF p_validation_level >= JTF_PLSQL_API.g_valid_level_record
991         THEN
992                 Validate_Act_product_Record(
993                   p_act_Product_rec          => l_act_Product_rec,
994                   x_return_status               => l_return_status
995                 );
996                 -- If any errors happen abort API.
997                 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
998                         RAISE FND_API.G_EXC_ERROR;
999                 ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
1000                         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1001                 END IF;
1002         END IF;
1003         --
1004         -- END of API body.
1005         --
1006    -------------------- finish --------------------------
1007    FND_MSG_PUB.count_and_get(
1008          p_encoded => FND_API.g_false,
1009          p_count   => x_msg_count,
1010          p_data    => x_msg_data
1011    );
1012   EXCEPTION
1013         WHEN FND_API.G_EXC_ERROR THEN
1014                 x_return_status := FND_API.G_RET_STS_ERROR ;
1015                 FND_MSG_PUB.Count_AND_Get
1016                 ( p_count       =>      x_msg_count,
1017                   p_data        =>      x_msg_data,
1018                   p_encoded     =>      FND_API.G_FALSE
1019              );
1020         WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1021                 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
1022                 FND_MSG_PUB.Count_AND_Get
1023                 ( p_count       =>      x_msg_count,
1024                   p_data        =>      x_msg_data,
1025                   p_encoded     =>      FND_API.G_FALSE
1026              );
1027         WHEN OTHERS THEN
1028                 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
1029                 IF FND_MSG_PUB.Check_Msg_Level ( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR )
1030                 THEN
1031                         FND_MSG_PUB.Add_Exc_Msg( G_PACKAGE_NAME,l_api_name);
1032                 END IF;
1033                 FND_MSG_PUB.Count_AND_Get
1034                 ( p_count       =>      x_msg_count,
1035                p_data   =>      x_msg_data,
1036                   p_encoded     =>      FND_API.G_FALSE
1037              );
1038 END Validate_Act_Product;
1039 
1040 -------------------------------------------------------------------------------------------
1041 
1042 PROCEDURE check_primary_flag
1043 (
1044     p_act_Product_rec     IN      act_Product_rec_type,
1045     x_return_status  OUT NOCOPY       VARCHAR2
1046 )IS
1047 
1048 
1049 
1050    CURSOR get_primary_flag(p_category_set_id IN NUMBER
1051                           ,p_act_product_used_by_id  IN NUMBER
1052                           ,p_arc_act_product_used_by IN VARCHAR2)
1053    IS
1054    SELECT distinct primary_product_flag
1055    FROM ams_act_products
1056    WHERE category_set_id = p_category_set_id
1057    AND act_product_used_by_id  = p_act_product_used_by_id
1058    AND arc_act_product_used_by =  p_arc_act_product_used_by
1059    AND primary_product_flag = 'Y';
1060 
1061 
1062    l_primary_flag VARCHAR2(1) := 'N';
1063 
1064 BEGIN
1065 
1066    x_return_status := FND_API.g_ret_sts_success;
1067 
1068    IF (AMS_DEBUG_HIGH_ON) THEN
1069 
1070 
1071 
1072    AMS_UTILITY_PVT.debug_message('check_primary_flag: '|| p_act_product_rec.primary_product_flag);
1073 
1074    END IF;
1075 
1076    IF p_act_product_rec.primary_product_flag <> FND_API.G_MISS_CHAR
1077    AND p_act_product_rec.primary_product_flag = 'Y'
1078    THEN
1079       OPEN get_primary_flag(p_act_product_rec.category_set_id
1080                            ,p_act_product_rec.act_product_used_by_id
1081                            ,p_act_product_rec.arc_act_product_used_by);
1082       FETCH get_primary_flag INTO l_primary_flag;
1083       CLOSE get_primary_flag;
1084 
1085       IF (AMS_DEBUG_HIGH_ON) THEN
1086 
1087 
1088 
1089       AMS_UTILITY_PVT.debug_message('l_primary_flag: '|| l_primary_flag);
1090 
1091       END IF;
1092 
1093       IF l_primary_flag = 'Y'
1094       THEN
1095          IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error)
1096          THEN
1097             FND_MESSAGE.set_name('AMS', 'AMS_CANNOT_UPD_PRIMARY_FLAG');
1098             FND_MSG_PUB.add;
1099          END IF;
1100          x_return_status := FND_API.g_ret_sts_error;
1101          RETURN;
1102       END IF;
1103    END IF;
1104 
1105    IF (AMS_DEBUG_HIGH_ON) THEN
1106 
1107 
1108 
1109    AMS_UTILITY_PVT.debug_message('check_primary_flag is checked with no errors');
1110 
1111    END IF;
1112 
1113 END check_primary_flag;
1114 
1115 
1116 
1117 /*****************************************************************************************/
1118 -- Start of Comments
1119 --
1120 -- NAME
1121 --   Validate_Act_Product_Items
1122 --
1123 -- PURPOSE
1124 --   This procedure is to validate product items
1125 -- End of Comments
1126 PROCEDURE Validate_Act_Product_Items
1127 ( p_act_Product_rec     IN      act_Product_rec_type,
1128   p_validation_mode             IN      VARCHAR2 := JTF_PLSQL_API.g_create,
1129   x_return_status               OUT NOCOPY     VARCHAR2
1130 ) IS
1131         l_table_name    VARCHAR2(30);
1132         l_pk_name       VARCHAR2(30);
1133         l_pk_value      VARCHAR2(30);
1134         l_level   VARCHAR2(150) := null;
1135 
1136         CURSOR c_include_level IS
1137         select level_type_code
1138         from AMS_ACT_PRODUCTS
1139         where ARC_ACT_PRODUCT_USED_BY = p_act_Product_rec.ARC_ACT_PRODUCT_USED_BY
1140         and   ACT_PRODUCT_USED_BY_ID = p_act_Product_rec.ACT_PRODUCT_USED_BY_ID;
1141 
1142                 CURSOR c_get_budget_type(l_fund_id IN NUMBER) IS
1143                 select 'Y'
1144                   from ozf_funds_all_b
1145          where fund_id = l_fund_id
1146            and fund_type = 'FULLY_ACCRUED'
1147            and accrual_discount_level = 'ORDER' ;
1148 
1149   CURSOR c_offer_type IS
1150   SELECT OFFER_TYPE, custom_setup_id
1151     FROM ams_offers
1152    WHERE qp_list_header_id = p_act_Product_rec.act_product_used_by_id;
1153 
1154                 l_budget_flag VARCHAR2(1);
1155     l_offer_type  VARCHAR2(30);
1156     l_custom_setup_id NUMBER;
1157 
1158 BEGIN
1159         --  Initialize API/Procedure return status to success
1160         x_return_status := FND_API.G_RET_STS_SUCCESS;
1161  -- Check required parameters
1162      IF  (p_act_Product_rec.act_product_used_by_id = FND_API.G_MISS_NUM OR
1163          p_act_Product_rec.act_product_used_by_id IS NULL)
1164      THEN
1165           -- missing required fields
1166           IF FND_MSG_PUB.check_msg_level (FND_MSG_PUB.G_MSG_LVL_ERROR)
1167           THEN -- MMSG
1168              FND_MESSAGE.set_name('AMS', 'AMS_ACT_PRD_NO_USEDBYID');
1169                FND_MSG_PUB.add;
1170           END IF;
1171           x_return_status := FND_API.G_RET_STS_ERROR;
1172           -- If any error happens abort API.
1173            RETURN;
1174      END IF;
1175 
1176      -- arc_act_product_used_by
1177      IF (p_act_Product_rec.arc_act_product_used_by = FND_API.G_MISS_CHAR OR
1178          p_act_Product_rec.arc_act_product_used_by IS NULL)
1179      THEN
1180           -- missing required fields
1181           IF FND_MSG_PUB.check_msg_level (FND_MSG_PUB.G_MSG_LVL_ERROR)
1182           THEN -- MMSG
1183                FND_MESSAGE.set_name('AMS', 'AMS_ACT_PRD_NO_USEDBY');
1184                FND_MSG_PUB.add;
1185           END IF;
1186           x_return_status := FND_API.G_RET_STS_ERROR;
1187           -- If any error happens abort API.
1188            RETURN;
1189      END IF;
1190 
1191      check_primary_flag(p_act_Product_rec,x_return_status);
1192      IF x_return_status <> FND_API.G_RET_STS_SUCCESS
1193      THEN
1194        RETURN;
1195      END IF;
1196 
1197     -- category_id
1198     IF (p_act_Product_rec.level_type_code = 'FAMILY'
1199     AND (p_act_Product_rec.category_id IS NULL
1200     OR  p_act_Product_rec.category_id = FND_API.G_MISS_NUM))
1201     THEN
1202         IF FND_MSG_PUB.check_msg_level (FND_MSG_PUB.G_MSG_LVL_ERROR) THEN -- MMSG
1203           FND_MESSAGE.set_name('AMS', 'AMS_CAT_NAME_MISSING');
1204           FND_MSG_PUB.add;
1205         END IF;
1206         x_return_status := FND_API.G_RET_STS_ERROR;
1207         RETURN;
1208     END IF;
1209 
1210     --Category_set_id
1211     IF  (p_act_Product_rec.level_type_code = 'FAMILY'
1212     AND (p_act_Product_rec.arc_act_product_used_by <> 'OFFR'
1213      AND p_act_Product_rec.arc_act_product_used_by <> 'FUND')
1214     AND (p_act_Product_rec.category_set_id IS NULL
1215      OR  p_act_Product_rec.category_set_id = FND_API.G_MISS_NUM))
1216     THEN
1217        IF FND_MSG_PUB.check_msg_level (FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
1218          FND_MESSAGE.set_name('AMS', 'AMS_CAT_SET_ID_MISSING');
1219           FND_MSG_PUB.add;
1220         END IF;
1221         x_return_status := FND_API.G_RET_STS_ERROR;
1222         RETURN;
1223     END IF;
1224 
1225     --Inventory_item_id
1226     IF (p_act_Product_rec.level_type_code = 'PRODUCT'
1227     AND (p_act_Product_rec.inventory_item_id IS NULL
1228     OR  p_act_Product_rec.inventory_item_id = FND_API.G_MISS_NUM))
1229     THEN
1230        IF FND_MSG_PUB.check_msg_level (FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
1231          FND_MESSAGE.set_name('AMS', 'AMS_INVENTORY_ITEM_ID_MISSING');
1232           FND_MSG_PUB.add;
1233         END IF;
1234         x_return_status := FND_API.G_RET_STS_ERROR;
1235         RETURN;
1236     END IF;
1237 
1238    IF p_act_Product_rec.arc_act_product_used_by = 'OFFR' THEN
1239     OPEN c_offer_type;
1240     FETCH c_offer_type INTO l_offer_type, l_custom_setup_id;
1241     CLOSE c_offer_type;
1242 
1243     IF l_offer_type = 'SCAN_DATA' THEN
1244       IF p_act_Product_rec.level_type_code = 'PRODUCT' THEN -- category does not have uom
1245         IF p_act_Product_rec.uom_code = FND_API.G_MISS_CHAR
1246         OR p_act_Product_rec.uom_code IS NULL
1247         THEN
1248           IF FND_MSG_PUB.check_msg_level (FND_MSG_PUB.G_MSG_LVL_ERROR) THEN -- MMSG
1249             FND_MESSAGE.set_name('AMS', 'AMS_ACT_PRD_NO_UOM');
1250             FND_MSG_PUB.add;
1251           END IF;
1252           x_return_status := FND_API.G_RET_STS_ERROR;
1253           RETURN;
1254         END IF;
1255       END IF;
1256 
1257       IF p_act_Product_rec.quantity = FND_API.G_MISS_NUM
1258       OR p_act_Product_rec.quantity IS NULL
1259       THEN
1260         IF FND_MSG_PUB.check_msg_level (FND_MSG_PUB.G_MSG_LVL_ERROR) THEN -- MMSG
1261           FND_MESSAGE.set_name('AMS', 'AMS_ACT_PRD_NO_QUANTITY');
1262           FND_MSG_PUB.add;
1263         END IF;
1264         x_return_status := FND_API.G_RET_STS_ERROR;
1265         RETURN;
1266       END IF;
1267 
1268      IF l_custom_setup_id <> 117 THEN -- channel_id not mandatory for special pricing
1269       IF p_act_Product_rec.channel_id = FND_API.G_MISS_NUM
1270       OR p_act_Product_rec.channel_id IS NULL
1271       THEN
1272         IF FND_MSG_PUB.check_msg_level (FND_MSG_PUB.G_MSG_LVL_ERROR) THEN -- MMSG
1273           FND_MESSAGE.set_name('AMS', 'AMS_ACT_PRD_NO_SCAN_TYPE');
1274           FND_MSG_PUB.add;
1275         END IF;
1276         x_return_status := FND_API.G_RET_STS_ERROR;
1277         RETURN;
1278       END IF;
1279      END IF;
1280 
1281       IF p_act_Product_rec.scan_value = FND_API.G_MISS_NUM
1282       OR p_act_Product_rec.scan_value IS NULL
1283       THEN
1284         IF FND_MSG_PUB.check_msg_level (FND_MSG_PUB.G_MSG_LVL_ERROR) THEN -- MMSG
1285           FND_MESSAGE.set_name('AMS', 'AMS_ACT_PRD_NO_SCAN_VALUE');
1286           FND_MSG_PUB.add;
1287         END IF;
1288         x_return_status := FND_API.G_RET_STS_ERROR;
1289         RETURN;
1290       END IF;
1291 
1292       IF p_act_Product_rec.scan_unit_forecast = FND_API.G_MISS_NUM
1293       OR p_act_Product_rec.scan_unit_forecast IS NULL
1294       THEN
1295         IF FND_MSG_PUB.check_msg_level (FND_MSG_PUB.G_MSG_LVL_ERROR) THEN -- MMSG
1296           FND_MESSAGE.set_name('AMS', 'AMS_ACT_PRD_NO_UNIT_FCST');
1297           FND_MSG_PUB.add;
1298         END IF;
1299         x_return_status := FND_API.G_RET_STS_ERROR;
1300         RETURN;
1301       END IF;
1302     END IF; -- end scan data
1303   END IF; -- end offer
1304 
1305   --   Validate uniqueness
1306    IF p_validation_mode = JTF_PLSQL_API.g_create
1307       AND p_act_Product_rec.activity_product_id IS NOT NULL
1308    THEN
1309       IF AMS_Utility_PVT.check_uniqueness(
1310                 'ams_act_products',
1311                     'activity_product_id = ' ||  p_act_Product_rec.activity_product_id
1312                ) = FND_API.g_false
1313           THEN
1314          IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error)
1315                THEN
1316             FND_MESSAGE.set_name('AMS', 'AMS_ACT_PRD_DUPLICATE_ID');
1317             FND_MSG_PUB.add;
1318          END IF;
1319          x_return_status := FND_API.g_ret_sts_error;
1320          RETURN;
1321       END IF;
1322    END IF;
1323 --
1324 --   check for lookups....ARC_ACT_PRODUCT_USED_BY
1325 --
1326    IF p_act_Product_rec.arc_act_product_used_by <> FND_API.g_miss_char THEN
1327       IF AMS_Utility_PVT.check_lookup_exists(
1328             p_lookup_type => 'AMS_SYS_ARC_QUALIFIER',
1329             p_lookup_code => p_act_Product_rec.arc_act_product_used_by
1330          ) = FND_API.g_false
1331       THEN
1332          IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error)
1333          THEN
1334             FND_MESSAGE.set_name('AMS', 'AMS_ACT_PRD_BAD_USEDBY');
1335             FND_MSG_PUB.add;
1336          END IF;
1337          x_return_status := FND_API.g_ret_sts_error;
1338          RETURN;
1339       END IF;
1340    END IF;
1341 --
1342 --   check for lookups....LEVEL_TYPE_CODE
1343 --
1344    IF p_act_Product_rec.LEVEL_TYPE_CODE <> FND_API.g_miss_char THEN
1345       IF AMS_Utility_PVT.check_lookup_exists(
1346             p_lookup_type => 'AMS_PRODUCT_LEVEL',
1347             p_lookup_code => p_act_Product_rec.LEVEL_TYPE_CODE
1348          ) = FND_API.g_false
1349       THEN
1350          IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error)
1351          THEN
1352             FND_MESSAGE.set_name('AMS', 'AMS_ACT_PRD_BAD_LEVELTYPE');
1353             FND_MSG_PUB.add;
1354          END IF;
1355          x_return_status := FND_API.g_ret_sts_error;
1356          RETURN;
1357       END IF;
1358    END IF;
1359 
1360  --
1361  -- Bug # 2156368
1362  --
1363  /***************  Code added by ABHOLA  ************/
1364 
1365 
1366      IF ((p_act_Product_rec.act_product_used_by_id <> FND_API.g_miss_num)
1367             AND
1368                 (p_act_Product_rec.arc_act_product_used_by='FUND'))
1369          THEN
1370 
1371               OPEN  c_get_budget_type(p_act_Product_rec.act_product_used_by_id);
1372                   FETCH c_get_budget_type INTO l_budget_flag;
1373                   CLOSE c_get_budget_type;
1374 
1375                   if (l_budget_flag = 'Y') then
1376 
1377                       IF FND_MSG_PUB.check_msg_level (FND_MSG_PUB.G_MSG_LVL_ERROR)
1378                         THEN
1379                                 FND_MESSAGE.set_name('AMS', 'AMS_CANNOT_ASSOCIATE_PROD');
1380                                 FND_MSG_PUB.add;
1381                         END IF;
1382                         x_return_status := FND_API.G_RET_STS_ERROR;
1383                         -- If any errors happen abort API/Procedure.
1384                         RETURN;
1385 
1386                   end if ;
1387 
1388          END IF;
1389 
1390 
1391  /****************************************************/
1392         --
1393         -- Begin Validate Referential
1394         --
1395         -- Check FK parameter: act_product_used_by_id #1
1396         IF p_act_Product_rec.act_product_used_by_id <> FND_API.g_miss_num
1397         THEN
1398                 IF p_act_Product_rec.arc_act_product_used_by='EVEH'
1399                   THEN
1400                      l_table_name := 'AMS_EVENT_HEADERS_VL';
1401                      l_pk_name := 'EVENT_HEADER_ID';
1402                  ELSIF p_act_Product_rec.arc_act_product_used_by='EVEO'
1403                   THEN
1404                      l_table_name := 'AMS_EVENT_OFFERS_VL';
1405                      l_pk_name := 'EVENT_OFFER_ID';
1406 
1407                  ELSIF p_act_Product_rec.arc_act_product_used_by='EONE'
1408                   THEN
1409                      l_table_name := 'AMS_EVENT_OFFERS_VL';
1410                      l_pk_name := 'EVENT_OFFER_ID';
1411 
1412                  ELSIF p_act_Product_rec.arc_act_product_used_by='CAMP'
1413                   THEN
1414                      l_table_name := 'AMS_CAMPAIGNS_VL';
1415                      l_pk_name := 'CAMPAIGN_ID';
1416                  -- 03-May-2001  RSSHARMA added
1417                  ELSIF p_act_Product_rec.arc_act_product_used_by='PROD'
1418                   THEN
1419                      l_table_name := 'AMS_ACT_PRODUCTS_V';
1420                      l_pk_name    := 'ACTIVITY_PRODUCT_ID';
1421                  -- end 03-May-2001
1422                  ELSIF p_act_Product_rec.arc_act_product_used_by='MESG'
1423                   THEN
1424                      l_table_name := 'AMS_MESSAGES_VL';
1425                      l_pk_name := 'MESSAGE_ID';
1426                      --07-May-2001  RSSHARMA changed the table name and the primary key
1427                  ELSIF p_act_Product_rec.arc_act_product_used_by='OFFR'
1428                   THEN
1429                      l_table_name := 'QP_LIST_HEADERS_B';
1430                      l_pk_name := 'LIST_HEADER_ID';
1431                      --end change on 07-May-2001
1432                 ELSIF p_act_Product_rec.arc_act_product_used_by='FUND'
1433                   THEN
1434                      l_table_name := 'OZF_FUNDS_ALL_VL';
1435                      l_pk_name := 'FUND_ID';
1436                 ELSIF  p_act_product_rec.arc_act_product_used_by ='CSCH'
1437                   THEN
1438                      l_table_name := 'AMS_CAMPAIGN_SCHEDULES_B';
1439                      l_pk_name := 'SCHEDULE_ID';
1440                 ELSIF  p_act_product_rec.arc_act_product_used_by ='MODL'
1441                 THEN
1442                    l_table_name := 'AMS_DM_MODELS_V';
1443                    l_pk_name := 'MODEL_ID';
1444                 END IF;
1445 
1446                 l_pk_value := p_act_Product_rec.act_product_used_by_id;
1447                 IF AMS_Utility_PVT.Check_FK_Exists (
1448                  p_table_name           => l_table_name
1449                  ,p_pk_name             => l_pk_name
1450                  ,p_pk_value            => l_pk_value
1451                 ) = FND_API.G_FALSE
1452                 THEN
1453                         IF FND_MSG_PUB.check_msg_level (FND_MSG_PUB.G_MSG_LVL_ERROR)
1454                         THEN
1455                                 FND_MESSAGE.set_name('AMS', 'AMS_ACT_PRD_INVALID_REFERENCE');
1456                                 FND_MSG_PUB.add;
1457                         END IF;
1458                         x_return_status := FND_API.G_RET_STS_ERROR;
1459                         -- If any errors happen abort API/Procedure.
1460                         RETURN;
1461                 END IF;  -- check_fk_exists
1462         END IF;
1463     -- Check FK parameter: inventory_item_id
1464         IF p_act_Product_rec.inventory_item_id <> FND_API.g_miss_num
1465         THEN
1466                 l_table_name := 'MTL_SYSTEM_ITEMS_VL';
1467                 l_pk_name := 'inventory_item_id';
1468                 l_pk_value := p_act_Product_rec.inventory_item_id;
1469                 IF AMS_Utility_PVT.Check_FK_Exists (
1470                  p_table_name                   => l_table_name
1471                  ,p_pk_name                     => l_pk_name
1472                  ,p_pk_value                    => l_pk_value
1473                 ) = FND_API.G_FALSE
1474                 THEN
1475                         IF FND_MSG_PUB.check_msg_level (FND_MSG_PUB.G_MSG_LVL_ERROR)
1476                         THEN
1477                                 FND_MESSAGE.set_name('AMS', 'AMS_ACT_PRD_INVALID_ITEM');
1478                                 FND_MSG_PUB.add;
1479                         END IF;
1480                         x_return_status := FND_API.G_RET_STS_ERROR;
1481                         -- If any errors happen abort API/Procedure.
1482                         RETURN;
1483                 END IF;  -- check_fk_exists
1484         END IF;
1485 
1486         -- Check FK parameter:organization_id
1487         IF p_act_Product_rec.organization_id <> FND_API.g_miss_num
1488         THEN
1489                 l_table_name := 'MTL_SYSTEM_ITEMS_VL';
1490                 l_pk_name := 'organization_id';
1491                 l_pk_value := p_act_Product_rec.organization_id;
1492                 IF AMS_Utility_PVT.Check_FK_Exists (
1493                  p_table_name                   => l_table_name
1494                  ,p_pk_name                     => l_pk_name
1495                  ,p_pk_value                    => l_pk_value
1496                 ) = FND_API.G_FALSE
1497                 THEN
1498                         IF FND_MSG_PUB.check_msg_level (FND_MSG_PUB.G_MSG_LVL_ERROR)
1499                         THEN
1500                                 FND_MESSAGE.set_name('AMS', 'AMS_ACT_PRD_INVALID_ORG');
1501                                 FND_MSG_PUB.add;
1502                         END IF;
1503                         x_return_status := FND_API.G_RET_STS_ERROR;
1504                         -- If any errors happen abort API/Procedure.
1505                         RETURN;
1506                 END IF;  -- check_fk_exists
1507         END IF;
1508 
1509         IF p_act_Product_rec.category_id <> FND_API.g_miss_num
1510         THEN
1511                 l_table_name := 'MTL_CATEGORIES';
1512                 l_pk_name := 'category_id';
1513                 l_pk_value := p_act_Product_rec.category_id;
1514                 IF AMS_Utility_PVT.Check_FK_Exists (
1515                  p_table_name                   => l_table_name
1516                  ,p_pk_name                     => l_pk_name
1517                  ,p_pk_value                    => l_pk_value
1518                 ) = FND_API.G_FALSE
1519                 THEN
1520                         IF FND_MSG_PUB.check_msg_level (FND_MSG_PUB.G_MSG_LVL_ERROR)
1521                         THEN
1522                                 FND_MESSAGE.set_name('AMS', 'AMS_ACT_PRD_INVALID_CAT');
1523                                 FND_MSG_PUB.add;
1524                         END IF;
1525                         x_return_status := FND_API.G_RET_STS_ERROR;
1526                         -- If any errors happen abort API/Procedure.
1527                         RETURN;
1528                 END IF;  -- check_fk_exists
1529         END IF;
1530 
1531         IF p_act_Product_rec.category_set_id <> FND_API.g_miss_num
1532         THEN
1533                 l_table_name := 'MTL_CATEGORY_SETS';
1534                 l_pk_name := 'category_set_id';
1535                 l_pk_value := p_act_Product_rec.category_set_id;
1536                 IF AMS_Utility_PVT.Check_FK_Exists (
1537                  p_table_name                   => l_table_name
1538                  ,p_pk_name                     => l_pk_name
1539                  ,p_pk_value                    => l_pk_value
1540                 ) = FND_API.G_FALSE
1541                 THEN
1542                         IF FND_MSG_PUB.check_msg_level (FND_MSG_PUB.G_MSG_LVL_ERROR)
1543                         THEN
1544                                 FND_MESSAGE.set_name('AMS', 'AMS_ACT_PRD_INVALID_ITEMCAT');
1545                                 FND_MSG_PUB.add;
1546                         END IF;
1547                         x_return_status := FND_API.G_RET_STS_ERROR;
1548                         -- If any errors happen abort API/Procedure.
1549                         RETURN;
1550                 END IF;  -- check_fk_exists
1551         END IF;
1552 
1553 
1554 -- check for flags
1555 
1556    ----------------------- enabled_flag ------------------------
1557    IF p_act_Product_rec.enabled_flag <> FND_API.g_miss_char
1558       AND p_act_Product_rec.enabled_flag IS NOT NULL
1559    THEN
1560       IF AMS_Utility_PVT.is_Y_or_N(p_act_Product_rec.enabled_flag) = FND_API.g_false
1561       THEN
1562          IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error)
1563          THEN
1564             FND_MESSAGE.set_name('AMS', 'AMS_ACT_PRD_BAD_ENABLED_FLAG');
1565             FND_MSG_PUB.add;
1566          END IF;
1567          x_return_status := FND_API.g_ret_sts_error;
1568          RETURN;
1569       END IF;
1570    END IF;
1571    ----------------------- excluded_flag ------------------------
1572    IF p_act_Product_rec.excluded_flag <> FND_API.g_miss_char
1573       AND p_act_Product_rec.excluded_flag IS NOT NULL
1574    THEN
1575       IF AMS_Utility_PVT.is_Y_or_N(p_act_Product_rec.excluded_flag) = FND_API.g_false
1576       THEN
1577          IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error)
1578          THEN
1579             FND_MESSAGE.set_name('AMS', 'AMS_ACT_PRD_BAD_EXCLUDED_FLAG');
1580             FND_MSG_PUB.add;
1581          END IF;
1582          x_return_status := FND_API.g_ret_sts_error;
1583          RETURN;
1584       END IF;
1585    END IF;
1586 
1587    ----------------------- primary_product_flag ------------------------
1588    IF p_act_Product_rec.primary_product_flag <> FND_API.g_miss_char
1589       AND p_act_Product_rec.primary_product_flag IS NOT NULL
1590    THEN
1591       IF AMS_Utility_PVT.is_Y_or_N(p_act_Product_rec.primary_product_flag) = FND_API.g_false
1592       THEN
1593          IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error)
1594          THEN
1595             FND_MESSAGE.set_name('AMS', 'AMS_ACT_PRD_BAD_PRIMARY_FLAG');
1596             FND_MSG_PUB.add;
1597          END IF;
1598          x_return_status := FND_API.g_ret_sts_error;
1599          RETURN;
1600       END IF;
1601    END IF;
1602 
1603   -------------------- Product Name --------------------
1604   -- bug 4102448
1605   IF p_act_product_rec.category_id IS NULL AND p_act_product_rec.inventory_item_id IS NULL THEN
1606     IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
1607       FND_MESSAGE.set_name('AMS', 'AMS_ACT_PRD_NO_PROD');
1608       FND_MSG_PUB.add;
1609     END IF;
1610     x_return_status := FND_API.g_ret_sts_error;
1611   END IF;
1612 
1613 -------------------------------------------------------------------------------
1614 -- added sugupta 06/06/2000
1615 ---  Create time validations for ACT_OFFERS
1616 -----------------------------------------------------------------------------
1617 
1618 /*  IF p_act_Product_rec.ARC_ACT_PRODUCT_USED_BY = 'OFFR' THEN
1619         -- go inside database and look for existing 'PROD' level row
1620                 OPEN c_include_level;
1621                 FETCH c_include_level into l_level;
1622                 CLOSE c_include_level;
1623 
1624                 IF l_level IS NULL THEN
1625                         l_level := 'NEW';
1626                 END IF;
1627 
1628         -- if level =PROD, error out.. no more include/exclude rows allowed
1629                 IF l_level = 'PRODUCT' THEN
1630                           IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error)
1631                                  THEN
1632                                         FND_MESSAGE.set_name('AMS', 'AMS_ACT_PRD_NO_MORE_ROWS');
1633                                         FND_MSG_PUB.add;
1634                           END IF;
1635                           x_return_status := FND_API.g_ret_sts_error;
1636                           RETURN;
1637                 ELSE
1638         -- either no rows exist or it exists for CAT
1639         -- if row exists for CAT and to be added one is include row, error out
1640         -- in this release though.. this stage not necessary as CAT/subCAT wont be allowed to be excluded
1641                         IF l_level = 'FAMILY' and p_act_Product_rec.excluded_flag <> 'Y' THEN
1642                                 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error)
1643                                  THEN
1644                                         FND_MESSAGE.set_name('AMS', 'AMS_ACT_PRD_NO_MORE_ROWS');
1645                                         FND_MSG_PUB.add;
1646                                  END IF;
1647                                  x_return_status := FND_API.g_ret_sts_error;
1648                                  RETURN;
1649                         END IF;
1650         -- if no row exists, and exclusion row being added, error out
1651 
1652                         IF l_level = 'NEW' and p_act_Product_rec.excluded_flag = 'Y' THEN
1653                                 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error)
1654                                  THEN
1655                                         FND_MESSAGE.set_name('AMS', 'AMS_ACT_PRD_NO_INCLUDE_ROWS');
1656                                         FND_MSG_PUB.add;
1657                                  END IF;
1658                                  x_return_status := FND_API.g_ret_sts_error;
1659                                  RETURN;
1660                         END IF;
1661         -- all other cases are allowed... which are:
1662         -- new row for inclusion (CAT or PROD)
1663         -- PROD level rows for exclusion (if level = CAT)
1664                 END IF; -- l_level = PROD
1665         END IF; -- used_by = OFFR */
1666 
1667 END Validate_Act_Product_Items;
1668 
1669 /*****************************************************************************************/
1670 -- Start of Comments
1671 --
1672 -- NAME
1673 --   Validate_Act_product_Record
1674 --
1675 -- PURPOSE
1676 --   This procedure is to validate product record
1677 --
1678 -- NOTES
1679 -- End of Comments
1680 PROCEDURE Validate_Act_product_Record(
1681   p_act_Product_rec     IN      act_Product_rec_type,
1682   x_return_status        OUT NOCOPY  VARCHAR2
1683 ) IS
1684         l_api_name              CONSTANT VARCHAR2(30)  := 'Validate_Act_product_Record';
1685         l_api_version           CONSTANT NUMBER        := 1.0;
1686         -- Status Local Variables
1687         l_return_status         VARCHAR2(1);  -- Return value from procedures
1688                 item_in_cat             NUMBER := 0; -- return value for cursor c_check_item
1689 
1690         CURSOR c_get_categories IS
1691         select category_id
1692         from AMS_ACT_PRODUCTS
1693         where ARC_ACT_PRODUCT_USED_BY = p_act_Product_rec.ARC_ACT_PRODUCT_USED_BY
1694         and   ACT_PRODUCT_USED_BY_ID = p_act_Product_rec.ACT_PRODUCT_USED_BY_ID
1695         and   EXCLUDED_FLAG = 'N';
1696 
1697         CURSOR c_get_all_categories IS
1698         select category_id
1699         from AMS_ACT_PRODUCTS
1700         where ARC_ACT_PRODUCT_USED_BY = p_act_Product_rec.ARC_ACT_PRODUCT_USED_BY
1701         and   ACT_PRODUCT_USED_BY_ID = p_act_Product_rec.ACT_PRODUCT_USED_BY_ID
1702         and  level_type_code = 'FAMILY'  -- musman: in prod assoc also we store cat id for lite
1703         and   CATEGORY_ID IS NOT NULL;
1704 
1705         CURSOR c_get_all_items IS
1706         select INVENTORY_ITEM_ID
1707         from AMS_ACT_PRODUCTS
1708         where ARC_ACT_PRODUCT_USED_BY = p_act_Product_rec.ARC_ACT_PRODUCT_USED_BY
1709         and   ACT_PRODUCT_USED_BY_ID = p_act_Product_rec.ACT_PRODUCT_USED_BY_ID
1710         and   INVENTORY_ITEM_ID IS NOT NULL;
1711 
1712         cat_id  NUMBER;
1713         item_id NUMBER;
1714 
1715         CURSOR c_check_item(l_cat_id IN NUMBER) IS
1716         select 1
1717         from dual
1718         where exists (  select 1
1719                                         from MTL_ITEM_CATEGORIES
1720                                         where INVENTORY_ITEM_ID = p_act_Product_rec.INVENTORY_ITEM_ID
1721                                         and   CATEGORY_ID = l_cat_id);
1722 
1723   -- julou cursors to check duplication of items and categories for scan data
1724   CURSOR c_scan_cat_dup1 IS
1725   SELECT COUNT(*)
1726     FROM ams_act_products
1727    WHERE arc_act_product_used_by = 'OFFR'
1728      AND act_product_used_by_id = p_act_Product_rec.act_product_used_by_id
1729      AND category_id = p_act_product_rec.category_id
1730      AND channel_id = p_act_Product_rec.channel_id
1731      AND excluded_flag = 'N';
1732 
1733   CURSOR c_scan_cat_dup2 IS
1734   SELECT COUNT(*)
1735     FROM ams_act_products
1736    WHERE arc_act_product_used_by = 'OFFR'
1737      AND act_product_used_by_id = p_act_Product_rec.act_product_used_by_id
1738      AND category_id = p_act_product_rec.category_id
1739      AND channel_id IS NULL
1740      AND excluded_flag = 'N';
1741 
1742   CURSOR c_scan_item_dup1 IS
1743   SELECT COUNT(*)
1744     FROM ams_act_products
1745    WHERE arc_act_product_used_by = 'OFFR'
1746      AND act_product_used_by_id = p_act_Product_rec.act_product_used_by_id
1747      AND inventory_item_id = p_act_Product_rec.inventory_item_id
1748      AND channel_id = p_act_Product_rec.channel_id
1749      AND excluded_flag = 'N';
1750 
1751   CURSOR c_scan_item_dup2 IS
1752   SELECT count(*)
1753     FROM ams_act_products
1754    WHERE arc_act_product_used_by = 'OFFR'
1755      AND act_product_used_by_id = p_act_Product_rec.act_product_used_by_id
1756      AND inventory_item_id = p_act_Product_rec.inventory_item_id
1757      AND channel_id IS NULL
1758      AND excluded_flag = 'N';
1759 
1760   CURSOR c_all_cat1 IS
1761   SELECT category_id
1762     FROM ams_act_products
1763    WHERE arc_act_product_used_by = p_act_product_rec.arc_act_product_used_by
1764      AND act_product_used_by_id = p_act_product_rec.act_product_used_by_id
1765      AND channel_id = p_act_Product_rec.channel_id
1766      AND category_id IS NOT NULL;
1767 
1768   CURSOR c_all_cat2 IS
1769   SELECT category_id
1770     FROM ams_act_products
1771    WHERE arc_act_product_used_by = p_act_product_rec.arc_act_product_used_by
1772      AND act_product_used_by_id = p_act_product_rec.act_product_used_by_id
1773      AND channel_id IS NULL
1774      AND category_id IS NOT NULL;
1775 
1776   CURSOR c_all_item1 IS
1777   SELECT inventory_item_id
1778     FROM ams_act_products
1779    WHERE arc_act_product_used_by = p_act_product_rec.arc_act_product_used_by
1780      AND act_product_used_by_id = p_act_product_rec.act_product_used_by_id
1781      AND channel_id = p_act_Product_rec.channel_id
1782      AND inventory_item_id IS NOT NULL;
1783 
1784   CURSOR c_all_item2 IS
1785   SELECT inventory_item_id
1786     FROM ams_act_products
1787    WHERE arc_act_product_used_by = p_act_product_rec.arc_act_product_used_by
1788      AND act_product_used_by_id = p_act_product_rec.act_product_used_by_id
1789      AND channel_id IS NULL
1790      AND inventory_item_id IS NOT NULL;
1791 
1792   CURSOR c_check_item_in_cat(l_cat_id NUMBER, l_item_id NUMBER) IS
1793   SELECT 1
1794     FROM DUAL
1795    WHERE EXISTS(SELECT 1
1796                   FROM mtl_item_categories
1797                  WHERE category_id = l_cat_id
1798                    AND inventory_item_id = l_item_id);
1799   l_count1 NUMBER := 0; -- count for same item or cat
1800   l_count2 NUMBER := 0; -- count for item in category
1801 
1802   CURSOR c_offer_type(l_id NUMBER) IS
1803   SELECT offer_type
1804     FROM ams_offers
1805    WHERE qp_list_header_id = l_id;
1806   l_offer_type    VARCHAR2(30);
1807 
1808   BEGIN
1809         -- Standard call to check for call compatibility.
1810         IF NOT FND_API.Compatible_API_Call ( l_api_version,
1811                                              l_api_version,
1812                                              l_api_name,
1813                                              G_PACKAGE_NAME)
1814         THEN
1815                 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1816         END IF;
1817   --  Initialize API return status to success
1818         x_return_status := FND_API.G_RET_STS_SUCCESS;
1819   -- API body
1820 -- added sugupta 06/16/2000
1821 -- DO NOT ALLOW SAME PRODUCT / CATEGORY TO BE INCLUDED /EXCLUDED AGAIN...
1822 -- irrespective of excluded_Flag value... if same product/category appears.. error out..
1823 -- checking for cat duplication
1824   -- julou check items and categories for scan data
1825   IF p_act_Product_rec.arc_act_product_used_by = 'OFFR' THEN
1826    OPEN c_offer_type(p_act_Product_rec.act_product_used_by_id);
1827    FETCH c_offer_type INTO l_offer_type;
1828    CLOSE c_offer_type;
1829 
1830    IF l_offer_type = 'SCAN_DATA' THEN
1831     IF p_act_Product_rec.level_type_code = 'PRODUCT' THEN
1832       --first check if duplicate item exists
1833       IF p_act_Product_rec.channel_id <> FND_API.G_MISS_NUM
1834       AND p_act_Product_rec.channel_id IS NOT NULL
1835       THEN
1836         OPEN c_scan_item_dup1;
1837         FETCH c_scan_item_dup1 INTO l_count1;
1838         CLOSE c_scan_item_dup1;
1839       ELSE
1840         OPEN c_scan_item_dup2;
1841         FETCH c_scan_item_dup2 INTO l_count1;
1842         CLOSE c_scan_item_dup2;
1843       END IF;
1844 
1845       IF l_count1 > 0 THEN
1846         IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
1847           FND_MESSAGE.set_name('AMS', 'AMS_ACT_PRD_DUP_ITEM');
1848           FND_MSG_PUB.add;
1849         END IF;
1850 
1851         x_return_status := FND_API.g_ret_sts_error;
1852         RETURN;
1853       END IF;
1854 
1855       -- check if item in existing categories
1856       IF p_act_Product_rec.channel_id <> FND_API.G_MISS_NUM
1857       AND p_act_Product_rec.channel_id IS NOT NULL
1858       THEN
1859         FOR i IN c_all_cat1 LOOP
1860           OPEN c_check_item_in_cat(i.category_id, p_act_Product_rec.inventory_item_id);
1861           FETCH c_check_item_in_cat INTO l_count2;
1862           CLOSE c_check_item_in_cat;
1863 
1864           IF l_count2 = 1 THEN
1865             IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
1866               FND_MESSAGE.set_name('AMS', 'AMS_ACT_PRD_ITEM_IN_CAT');
1867               FND_MSG_PUB.add;
1868             END IF;
1869 
1870             x_return_status := FND_API.g_ret_sts_error;
1871             RETURN;
1872           END IF;
1873         END LOOP;
1874       ELSE
1875         FOR i IN c_all_cat2 LOOP
1876           OPEN c_check_item_in_cat(i.category_id, p_act_Product_rec.inventory_item_id);
1877           FETCH c_check_item_in_cat INTO l_count2;
1878           CLOSE c_check_item_in_cat;
1879 
1880           IF l_count2 = 1 THEN
1881             IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
1882               FND_MESSAGE.set_name('AMS', 'AMS_ACT_PRD_ITEM_IN_CAT');
1883               FND_MSG_PUB.add;
1884             END IF;
1885 
1886             x_return_status := FND_API.g_ret_sts_error;
1887             RETURN;
1888           END IF;
1889         END LOOP;
1890       END IF;
1891     ELSIF p_act_Product_rec.level_type_code = 'FAMILY' THEN
1892       --first check if duplicate category exists
1893       IF p_act_Product_rec.channel_id <> FND_API.G_MISS_NUM
1894       AND p_act_Product_rec.channel_id IS NOT NULL
1895       THEN
1896         OPEN c_scan_cat_dup1;
1897         FETCH c_scan_cat_dup1 INTO l_count1;
1898         CLOSE c_scan_cat_dup1;
1899       ELSE
1900         OPEN c_scan_cat_dup2;
1901         FETCH c_scan_cat_dup2 INTO l_count1;
1902         CLOSE c_scan_cat_dup2;
1903       END IF;
1904 
1905       IF l_count1 > 0 THEN
1906         IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
1907           FND_MESSAGE.set_name('AMS', 'AMS_ACT_PRD_DUP_CAT');
1908           FND_MSG_PUB.add;
1909         END IF;
1910 
1911         x_return_status := FND_API.g_ret_sts_error;
1912         RETURN;
1913       END IF;
1914 
1915       -- check if new category containing existing items
1916       IF p_act_Product_rec.channel_id <> FND_API.G_MISS_NUM
1917       AND p_act_Product_rec.channel_id IS NOT NULL
1918       THEN
1919         FOR i IN c_all_item1 LOOP
1920           OPEN c_check_item_in_cat(p_act_Product_rec.category_id, i.inventory_item_id);
1921           FETCH c_check_item_in_cat INTO l_count2;
1922           CLOSE c_check_item_in_cat;
1923 
1924           IF l_count2 = 1 THEN
1925             IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
1926               FND_MESSAGE.set_name('AMS', 'AMS_ACT_PRD_CAT_HAS_ITEM');
1927               FND_MSG_PUB.add;
1928             END IF;
1929 
1930             x_return_status := FND_API.g_ret_sts_error;
1931             RETURN;
1932           END IF;
1933         END LOOP;
1934       ELSE
1935         FOR i IN c_all_item2 LOOP
1936           OPEN c_check_item_in_cat(p_act_Product_rec.category_id, i.inventory_item_id);
1937           FETCH c_check_item_in_cat INTO l_count2;
1938           CLOSE c_check_item_in_cat;
1939 
1940           IF l_count2 = 1 THEN
1941             IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
1942               FND_MESSAGE.set_name('AMS', 'AMS_ACT_PRD_CAT_HAS_ITEM');
1943               FND_MSG_PUB.add;
1944             END IF;
1945 
1946             x_return_status := FND_API.g_ret_sts_error;
1947             RETURN;
1948           END IF;
1949         END LOOP;
1950       END IF;
1951     END IF;
1952    END IF;
1953   ELSE -- julou end checking for scan data. code below is not changed
1954 
1955   IF p_act_Product_rec.level_type_code = 'FAMILY' THEN
1956 
1957          OPEN c_get_all_categories;
1958          LOOP
1959                 FETCH c_get_all_categories INTO cat_id;
1960 
1961                 EXIT WHEN c_get_all_categories%NOTFOUND;
1962 
1963                 IF p_act_Product_rec.category_id = cat_id THEN
1964                         IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error)
1965                         THEN
1966                                 FND_MESSAGE.set_name('AMS', 'AMS_ACT_PRD_DUPE_CAT');
1967                                 FND_MSG_PUB.add;
1968                         END IF;
1969                         x_return_status := FND_API.g_ret_sts_error;
1970                         CLOSE c_get_all_categories;
1971                         RETURN;
1972                 END IF;
1973         END LOOP;
1974         CLOSE c_get_all_categories;
1975   END IF;
1976 -- checking for item duplication..
1977 -- for now, i do not care the item belongs to what category.. item inclusion/exclusion holds good
1978 -- irrespective of category
1979   IF p_act_Product_rec.level_type_code = 'PRODUCT' THEN
1980 
1981          OPEN c_get_all_items;
1982          LOOP
1983                 FETCH c_get_all_items INTO item_id;
1984 
1985                 EXIT WHEN c_get_all_items%NOTFOUND;
1986 
1987                 IF p_act_Product_rec.inventory_item_id = item_id THEN
1988                         IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error)
1989                         THEN
1990                                 FND_MESSAGE.set_name('AMS', 'AMS_ACT_PRD_DUPE_ITEM');
1991                                 FND_MSG_PUB.add;
1992                         END IF;
1993                         x_return_status := FND_API.g_ret_sts_error;
1994                         CLOSE c_get_all_items;
1995                         RETURN;
1996                 END IF;
1997         END LOOP;
1998         CLOSE c_get_all_items;
1999   END IF;
2000   -- for any row, CAT cannot be excluded
2001   /** commented by abhola
2002   IF p_act_Product_rec.level_type_code = 'FAMILY'
2003       AND p_act_Product_rec.excluded_flag = 'Y' THEN
2004          IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error)
2005          THEN
2006             FND_MESSAGE.set_name('AMS', 'AMS_ACT_PRD_CANT_EXCLUDE_CAT');
2007             FND_MSG_PUB.add;
2008          END IF;
2009          x_return_status := FND_API.g_ret_sts_error;
2010          RETURN;
2011    END IF;
2012    **/
2013 
2014 
2015 -- for any row, if excluding a product, the item need to be associated to the category
2016 /***** commented by ABHOLA
2017 
2018   IF p_act_Product_rec.level_type_code = 'PRODUCT'
2019       AND p_act_Product_rec.excluded_flag = 'Y' THEN
2020 
2021          OPEN c_get_categories;
2022          LOOP
2023                 FETCH c_get_categories INTO cat_id;
2024 
2025                 EXIT WHEN c_get_categories%NOTFOUND;
2026 
2027                 OPEN c_check_item(cat_id);
2028                 FETCH c_check_item into item_in_cat;
2029                 CLOSE c_check_item;
2030 
2031                 EXIT WHEN item_in_cat = 1;
2032         END LOOP;
2033         CLOSE c_get_categories;
2034           IF item_in_cat <> 1 THEN
2035                  IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error)
2036                  THEN
2037                         FND_MESSAGE.set_name('AMS', 'AMS_ACT_PRD_NOT_IN_CAT');
2038                         FND_MSG_PUB.add;
2039                  END IF;
2040                  x_return_status := FND_API.g_ret_sts_error;
2041                  RETURN;
2042           END IF;
2043 
2044    END IF;
2045 *****/
2046 
2047   -- END of API body.
2048   END IF;
2049   ---------------------Product/Category hierarchy validation for schedule -----------------
2050   /*
2051   --bug: 4634617 fix as per r12 requirement removing the validation
2052   IF ( p_act_product_rec.arc_act_product_used_by = 'CSCH'
2053   OR p_act_product_rec.arc_act_product_used_by = 'CAMP')
2054   THEN
2055      check_product_val_for_csch(p_act_product_rec,x_return_status);
2056      IF x_return_status <> FND_API.G_RET_STS_SUCCESS
2057      THEN
2058         RETURN;
2059      END IF;
2060   END IF;
2061   */
2062 
2063 
2064 END Validate_Act_product_Record;
2065 
2066 
2067 PROCEDURE complete_act_Product_rec(
2068         p_act_Product_rec  IN    act_Product_rec_type,
2069         x_act_Product_rec  OUT NOCOPY   act_Product_rec_type
2070 ) IS
2071         CURSOR c_product IS
2072         SELECT *
2073         FROM ams_act_products
2074         WHERE activity_product_id = p_act_Product_rec.activity_product_id;
2075 
2076         l_act_Product_rec c_product%ROWTYPE;
2077 BEGIN
2078         x_act_Product_rec  :=  p_act_Product_rec;
2079         OPEN c_product;
2080         FETCH c_product INTO l_act_Product_rec;
2081         IF c_product%NOTFOUND THEN
2082                 CLOSE c_product;
2083                 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
2084           FND_MESSAGE.set_name('AMS', 'AMS_API_RECORD_NOT_FOUND');
2085           FND_MSG_PUB.add;
2086           END IF;
2087           RAISE FND_API.g_exc_error;
2088      END IF;
2089      CLOSE c_product;
2090         IF p_act_Product_rec.act_product_used_by_id = FND_API.g_miss_num THEN
2091            x_act_Product_rec.act_product_used_by_id :=l_act_Product_rec.act_product_used_by_id;
2092      END IF;
2093         IF p_act_Product_rec.arc_act_product_used_by = FND_API.g_miss_char THEN
2094            x_act_Product_rec.arc_act_product_used_by := l_act_Product_rec.arc_act_product_used_by;
2095      END IF;
2096         IF p_act_Product_rec.inventory_item_id = FND_API.g_miss_num THEN
2097            x_act_Product_rec.inventory_item_id := l_act_Product_rec.inventory_item_id;
2098      END IF;
2099         IF p_act_Product_rec.ORGANIZATION_ID = FND_API.g_miss_num THEN
2100            x_act_Product_rec.ORGANIZATION_ID := l_act_Product_rec.ORGANIZATION_ID;
2101      END IF;
2102         IF p_act_Product_rec.CATEGORY_ID = FND_API.g_miss_num THEN
2103            x_act_Product_rec.CATEGORY_ID := l_act_Product_rec.CATEGORY_ID;
2104      END IF;
2105         IF p_act_Product_rec.CATEGORY_SET_ID = FND_API.g_miss_num THEN
2106            x_act_Product_rec.CATEGORY_SET_ID := l_act_Product_rec.CATEGORY_SET_ID;
2107      END IF;
2108         IF p_act_Product_rec.LEVEL_TYPE_CODE = FND_API.g_miss_char THEN
2109            x_act_Product_rec.LEVEL_TYPE_CODE := l_act_Product_rec.LEVEL_TYPE_CODE;
2110      END IF;
2111         IF p_act_Product_rec.ENABLED_FLAG = FND_API.g_miss_char THEN
2112            x_act_Product_rec.ENABLED_FLAG := l_act_Product_rec.ENABLED_FLAG;
2113      END IF;
2114         IF p_act_Product_rec.EXCLUDED_FLAG = FND_API.g_miss_char THEN
2115            x_act_Product_rec.EXCLUDED_FLAG := l_act_Product_rec.EXCLUDED_FLAG;
2116      END IF;
2117         IF p_act_Product_rec.PRIMARY_PRODUCT_FLAG = FND_API.g_miss_char THEN
2118            x_act_Product_rec.PRIMARY_PRODUCT_FLAG := l_act_Product_rec.PRIMARY_PRODUCT_FLAG;
2119      END IF;
2120         IF p_act_Product_rec.PRODUCT_SALE_TYPE = FND_API.g_miss_char THEN
2121            x_act_Product_rec.PRODUCT_SALE_TYPE := l_act_Product_rec.PRODUCT_SALE_TYPE;
2122      END IF;
2123         IF p_act_Product_rec.ATTRIBUTE_CATEGORY = FND_API.g_miss_char THEN
2124            x_act_Product_rec.ATTRIBUTE_CATEGORY := l_act_Product_rec.ATTRIBUTE_CATEGORY;
2125      END IF;
2126         IF p_act_Product_rec.ATTRIBUTE1 = FND_API.g_miss_char THEN
2127            x_act_Product_rec.ATTRIBUTE1 := l_act_Product_rec.ATTRIBUTE1;
2128      END IF;
2129         IF p_act_Product_rec.ATTRIBUTE2 = FND_API.g_miss_char THEN
2130            x_act_Product_rec.ATTRIBUTE2 := l_act_Product_rec.ATTRIBUTE2;
2131      END IF;
2132         IF p_act_Product_rec.ATTRIBUTE3 = FND_API.g_miss_char THEN
2133            x_act_Product_rec.ATTRIBUTE3 := l_act_Product_rec.ATTRIBUTE3;
2134      END IF;
2135         IF p_act_Product_rec.ATTRIBUTE4 = FND_API.g_miss_char THEN
2136            x_act_Product_rec.ATTRIBUTE4 := l_act_Product_rec.ATTRIBUTE4;
2137      END IF;
2138         IF p_act_Product_rec.ATTRIBUTE5 = FND_API.g_miss_char THEN
2139            x_act_Product_rec.ATTRIBUTE5 := l_act_Product_rec.ATTRIBUTE5;
2140      END IF;
2141         IF p_act_Product_rec.ATTRIBUTE6 = FND_API.g_miss_char THEN
2142            x_act_Product_rec.ATTRIBUTE6 := l_act_Product_rec.ATTRIBUTE6;
2143      END IF;
2144         IF p_act_Product_rec.ATTRIBUTE7 = FND_API.g_miss_char THEN
2145            x_act_Product_rec.ATTRIBUTE7 := l_act_Product_rec.ATTRIBUTE7;
2146      END IF;
2147         IF p_act_Product_rec.ATTRIBUTE8 = FND_API.g_miss_char THEN
2148            x_act_Product_rec.ATTRIBUTE8 := l_act_Product_rec.ATTRIBUTE8;
2149      END IF;
2150         IF p_act_Product_rec.ATTRIBUTE9 = FND_API.g_miss_char THEN
2151            x_act_Product_rec.ATTRIBUTE9 := l_act_Product_rec.ATTRIBUTE9;
2152      END IF;
2153         IF p_act_Product_rec.ATTRIBUTE10 = FND_API.g_miss_char THEN
2154            x_act_Product_rec.ATTRIBUTE10 := l_act_Product_rec.ATTRIBUTE10;
2155      END IF;
2156         IF p_act_Product_rec.ATTRIBUTE11 = FND_API.g_miss_char THEN
2157            x_act_Product_rec.ATTRIBUTE11 := l_act_Product_rec.ATTRIBUTE11;
2158      END IF;
2159         IF p_act_Product_rec.ATTRIBUTE11 = FND_API.g_miss_char THEN
2160            x_act_Product_rec.ATTRIBUTE11 := l_act_Product_rec.ATTRIBUTE11;
2161      END IF;
2162         IF p_act_Product_rec.ATTRIBUTE12 = FND_API.g_miss_char THEN
2163            x_act_Product_rec.ATTRIBUTE12 := l_act_Product_rec.ATTRIBUTE12;
2164      END IF;
2165         IF p_act_Product_rec.ATTRIBUTE13 = FND_API.g_miss_char THEN
2166            x_act_Product_rec.ATTRIBUTE13 := l_act_Product_rec.ATTRIBUTE13;
2167      END IF;
2168         IF p_act_Product_rec.ATTRIBUTE14 = FND_API.g_miss_char THEN
2169            x_act_Product_rec.ATTRIBUTE14 := l_act_Product_rec.ATTRIBUTE14;
2170      END IF;
2171         IF p_act_Product_rec.ATTRIBUTE15 = FND_API.g_miss_char THEN
2172            x_act_Product_rec.ATTRIBUTE15 := l_act_Product_rec.ATTRIBUTE15;
2173      END IF;
2174      /*
2175      IF p_act_Product_rec.security_group_id = FND_API.g_miss_num THEN
2176            x_act_Product_rec.security_group_id := l_act_Product_rec.security_group_id;
2177      END IF;
2178      */
2179         IF p_act_Product_rec.line_lumpsum_amount = FND_API.g_miss_num THEN
2180            x_act_Product_rec.line_lumpsum_amount := l_act_Product_rec.line_lumpsum_amount;
2181      END IF;
2182         IF p_act_Product_rec.line_lumpsum_qty = FND_API.g_miss_num THEN
2183            x_act_Product_rec.line_lumpsum_qty := l_act_Product_rec.line_lumpsum_qty;
2184      END IF;
2185 
2186         IF p_act_Product_rec.scan_value = FND_API.g_miss_num THEN
2187            x_act_Product_rec.scan_value := l_act_Product_rec.scan_value;
2188      END IF;
2189 
2190         IF p_act_Product_rec.scan_unit_forecast = FND_API.g_miss_num THEN
2191            x_act_Product_rec.scan_unit_forecast := l_act_Product_rec.scan_unit_forecast;
2192      END IF;
2193 
2194         IF p_act_Product_rec.channel_id = FND_API.g_miss_num THEN
2195            x_act_Product_rec.channel_id := l_act_Product_rec.channel_id;
2196      END IF;
2197 
2198         IF p_act_Product_rec.adjustment_flag = FND_API.g_miss_char THEN
2199            x_act_Product_rec.adjustment_flag := l_act_Product_rec.adjustment_flag;
2200      END IF;
2201 
2202         IF p_act_Product_rec.uom_code = FND_API.g_miss_char THEN
2203            x_act_Product_rec.uom_code := l_act_Product_rec.uom_code;
2204      END IF;
2205 
2206         IF p_act_Product_rec.quantity = FND_API.g_miss_num THEN
2207            x_act_Product_rec.quantity := l_act_Product_rec.quantity;
2208      END IF;
2209 
2210 END complete_act_Product_rec;
2211 
2212 
2213 /*
2214   This function will be getting the Calculated Category Name with invalid,
2215   depending upon object type.
2216 */
2217 FUNCTION get_category_name(
2218   p_category_id  IN  NUMBER,
2219   p_category_set_id IN NUMBER,
2220   p_object_type in varchar2
2221 ) RETURN VARCHAR2
2222 IS
2223 
2224 CURSOR get_cat_name IS
2225 SELECT CATEGORY_CONCAT_SEGS
2226   FROM mtl_categories_v
2227  WHERE category_id = p_category_id;
2228 
2229 CURSOR get_cat_name2 IS
2230 SELECT
2231 NVL(d.category_desc, category_concat_segs) categoryName
2232 FROM
2233    mtl_default_category_sets a ,
2234    mtl_category_sets_b b ,
2235    mtl_categories_v c ,
2236    ENI_PROD_DEN_HRCHY_PARENTS_V d
2237 WHERE
2238     a.functional_area_id in (7,11)
2239 AND a.category_set_id = b.category_set_id
2240 AND b.structure_id = c.structure_id
2241 AND c.category_id = d.category_id(+)
2242 AND c.category_id = p_category_id;
2243 
2244 CURSOR get_cat_name3 IS
2245 SELECT c.category_concat_segs
2246 FROM mtl_categories_v c
2247 WHERE c.category_id = p_category_id;
2248 
2249 --inanaiah   Bug 4956134 fix - sql id 14423554, 14423628
2250 --inanaiah - Bug 5025294 fix - removed XXXIFC_region_items reference
2251 --inanaiah - Bug 5207293 fix - removed "like" as it is an exact match - Ids 17263290/17263381
2252 /*
2253 CURSOR get_prompt  IS
2254 SELECT ATTRIBUTE_LABEL_LONG
2255 from AK_REGION_ITEMS_VL
2256 where region_code like 'AMS_COMPETITOR_PRODUCTS'
2257 and attribute_code like 'AMS_INVALID';
2258 */
2259 CURSOR get_prompt  IS
2260 SELECT
2261   ARAT.ATTRIBUTE_LABEL_LONG
2262 FROM
2263   AK_REGION_ITEMS_TL ARAT,
2264   AK_REGION_ITEMS ARA
2265 WHERE
2266   ARAT.REGION_APPLICATION_ID = ARA.REGION_APPLICATION_ID AND
2267   ARAT.REGION_CODE = ARA.REGION_CODE AND
2268   ARAT.ATTRIBUTE_APPLICATION_ID = ARA.ATTRIBUTE_APPLICATION_ID AND
2269   ARAT.ATTRIBUTE_CODE = ARA.ATTRIBUTE_CODE AND
2270   ARAT.LANGUAGE = USERENV('LANG') AND
2271   ARA.REGION_CODE = 'AMS_COMPETITOR_PRODUCTS' AND
2272   ARA.ATTRIBUTE_CODE = 'AMS_INVALID';
2273 
2274 l_cat_name VARCHAR2(4000);
2275 l_name VARCHAR2(4000);
2276 l_name2 VARCHAR2(4000);
2277 l_prompt VARCHAR2(80);
2278 
2279 BEGIN
2280   OPEN get_prompt;
2281   FETCH get_prompt INTO l_prompt;
2282   CLOSE get_prompt;
2283 
2284   IF (p_object_type = 'FUND' OR p_object_type = 'OFFR')
2285   THEN
2286      OPEN get_cat_name2;
2287      FETCH get_cat_name2 INTO l_name2;
2288      CLOSE get_cat_name2;
2289      l_cat_name := l_name2;
2290   ELSE
2291      OPEN get_cat_name;
2292      FETCH get_cat_name INTO l_name;
2293      CLOSE get_cat_name;
2294      l_cat_name := l_name ||' - '||l_prompt;
2295   END IF;
2296 
2297   IF l_cat_name IS NULL
2298   THEN
2299      OPEN get_cat_name3;
2300      FETCH get_cat_name3 INTO l_name2;
2301      CLOSE get_cat_name3;
2302      l_cat_name := l_name2 ||' - '||l_prompt;
2303   END IF;
2304 
2305   return (l_cat_name);
2306 EXCEPTION
2307    WHEN OTHERS THEN
2308         return l_prompt;
2309 END;
2310 
2311 FUNCTION get_category_desc(
2312   p_category_id  IN  NUMBER,
2313   p_category_set_id IN NUMBER,
2314   p_object_type in varchar2
2315 ) RETURN VARCHAR2
2316 IS
2317 
2318 CURSOR get_cat_Desc IS
2319 SELECT  CONCATENATED_DESCRIPTION
2320   FROM ams_mtl_Categories_denorm_vl
2321  WHERE category_id = p_category_id;
2322 
2323 CURSOR get_cat_Desc2 IS
2324 SELECT
2325 NVL(d.concat_cat_parentage, c.description) categoryDescr
2326 FROM
2327    mtl_default_category_sets a ,
2328    mtl_category_sets_b b ,
2329    mtl_categories_v c ,
2330    ENI_PROD_DEN_HRCHY_PARENTS_V d
2331 WHERE
2332     a.functional_area_id in (7,11)
2333 AND a.category_set_id = b.category_set_id
2334 AND b.structure_id = c.structure_id
2335 AND c.category_id = d.category_id(+)
2336 AND c.category_id = p_category_id;
2337 
2338 CURSOR get_cat_Desc3 IS
2339 SELECT c.description
2340 FROM mtl_categories_v c
2341 WHERE c.category_id = p_category_id;
2342 
2343 --inanaiah   Bug 4956134 fix - sql id 14423554, 14423628
2344 --inanaiah - Bug 5025294 fix - removed XXXIFC_region_items reference
2345 --inanaiah - Bug 5207293 fix - removed "like" as it is an exact match - Ids 17263290/17263381
2346 /*
2347 CURSOR get_prompt  IS
2348 SELECT ATTRIBUTE_LABEL_LONG
2349 from AK_REGION_ITEMS_VL
2350 where region_code like 'AMS_COMPETITOR_PRODUCTS'
2351 and attribute_code like 'AMS_INVALID';
2352 */
2353 CURSOR get_prompt  IS
2354 SELECT
2355   ARAT.ATTRIBUTE_LABEL_LONG
2356 FROM
2357   AK_REGION_ITEMS_TL ARAT,
2358   AK_REGION_ITEMS ARA
2359 WHERE
2360   ARAT.REGION_APPLICATION_ID = ARA.REGION_APPLICATION_ID AND
2361   ARAT.REGION_CODE = ARA.REGION_CODE AND
2362   ARAT.ATTRIBUTE_APPLICATION_ID = ARA.ATTRIBUTE_APPLICATION_ID AND
2363   ARAT.ATTRIBUTE_CODE = ARA.ATTRIBUTE_CODE AND
2364   ARAT.LANGUAGE = USERENV('LANG') AND
2365   ARA.REGION_CODE = 'AMS_COMPETITOR_PRODUCTS' AND
2366   ARA.ATTRIBUTE_CODE = 'AMS_INVALID';
2367 
2368 l_cat_desc VARCHAR2(4000);
2369 l_desc VARCHAR2(4000);
2370 l_desc2 VARCHAR2(4000);
2371 l_prompt VARCHAR2(80);
2372 
2373 BEGIN
2374 
2375   OPEN get_prompt;
2376   FETCH get_prompt INTO l_prompt;
2377   CLOSE get_prompt;
2378 
2379   IF (p_object_type = 'FUND' OR p_object_type = 'OFFR')
2380   THEN
2381      OPEN get_cat_Desc2;
2382      FETCH get_cat_Desc2 INTO l_desc2;
2383      CLOSE get_cat_Desc2;
2384      l_cat_desc := l_desc2;
2385   ELSE
2386      OPEN get_cat_Desc;
2387      FETCH get_cat_Desc INTO l_desc;
2388      CLOSE get_cat_Desc;
2389      l_cat_desc := l_desc ||' - '||l_prompt;
2390   END IF;
2391 
2392   IF l_cat_desc IS NULL
2393   THEN
2394      OPEN get_cat_desc3;
2395      FETCH get_cat_desc3 INTO l_desc2;
2396      CLOSE get_cat_desc3;
2397      l_cat_desc := l_desc2 ||' - '||l_prompt;
2398   END IF;
2399 
2400   return (l_cat_desc);
2401 EXCEPTION
2402    WHEN OTHERS THEN
2403         return l_prompt;
2404 END;
2405 
2406 -- Private procedure to write debug message to FND_LOG table
2407 PROCEDURE write_debug_message(p_log_level       NUMBER,
2408                               p_procedure_name  VARCHAR2,
2409                               p_label           VARCHAR2,
2410                               p_text            VARCHAR2
2411                               )
2412 IS
2413    l_module_name  VARCHAR2(400);
2414    DELIMETER    CONSTANT   VARCHAR2(1) := '.';
2415    LABEL_PREFIX CONSTANT   VARCHAR2(15) := 'WFScheduleExec';
2416 BEGIN
2417    IF AMS_UTILITY_PVT.logging_enabled (p_log_level)
2418    THEN
2419       -- Set the Module Name
2420       l_module_name := 'ams'||DELIMETER||'plsql'||DELIMETER||G_PACKAGE_NAME||DELIMETER||p_procedure_name||DELIMETER||LABEL_PREFIX||'-'||p_label;
2421       -- Log the Message
2422       AMS_UTILITY_PVT.debug_message(p_log_level,
2423                                     l_module_name,
2424                                     p_text
2425                                     );
2426    END IF;
2427 END write_debug_message;
2428 
2429 FUNCTION UPDATE_SCHEDULE_ACTIVITIES(p_subscription_guid   IN       RAW,
2430                  p_event               IN OUT NOCOPY  WF_EVENT_T
2431 ) RETURN VARCHAR2
2432 IS
2433    l_schedule_id     NUMBER;
2434    l_association_id  NUMBER;
2435    l_citem_id        NUMBER;
2436    l_citem_ver_id    NUMBER;
2437    l_act_prod_id     NUMBER;
2438    l_Return_status  varchar2(20);
2439 
2440 CURSOR c_citem_assoc (l_csch_id IN NUMBER) IS
2441    SELECT assoc.association_id, assoc.content_item_id, ci.live_citem_version_id
2442      FROM ibc_associations assoc, ibc_content_Items ci
2443      --by musman:as per r12 requirement,live version stamping should be done for collab content
2444     WHERE assoc.association_type_code in ('AMS_PLCE') --('AMS_COLB','AMS_PLCE')
2445       AND assoc.associated_object_val1 = to_char(l_csch_id) --musman:bug 4145845 Fix
2446       AND assoc.content_item_id = ci.content_Item_id;
2447 
2448 /* -- primary product flag should be marked from the UI
2449 CURSOR c_act_prod_id (l_csch_id IN NUMBER) IS
2450         SELECT activity_product_id
2451         from ams_act_products act, ams_campaign_schedules_b csc
2452         where act.ARC_ACT_PRODUCT_USED_BY = 'CSCH'
2453         and act.ACT_PRODUCT_USED_BY_ID = l_csch_id
2454         and act.LEVEL_TYPE_CODE = 'FAMILY'
2455         and act.ACT_PRODUCT_USED_BY_ID = csc.SCHEDULE_ID
2456         and csc.USAGE = 'LITE';
2457 */
2458 PROCEDURE_NAME CONSTANT    VARCHAR2(30) := 'UPDATE_SCHEDULE_ACTIVITIES';
2459 
2460 BEGIN
2461 
2462    -- Get the Value of SCHEDULE_ID
2463    l_schedule_id := p_event.getValueForParameter('SCHEDULE_ID');
2464 
2465    OPEN  c_citem_assoc(l_schedule_id);
2466    LOOP
2467       FETCH c_citem_assoc INTO l_association_id, l_citem_id, l_citem_ver_id;
2468       EXIT WHEN c_citem_assoc%NOTFOUND;
2469 
2470       IF l_association_id IS NOT null
2471       AND l_citem_id IS NOT null
2472       AND l_citem_ver_id IS NOT NULl
2473       THEN
2474          Ibc_Associations_Pkg.UPDATE_ROW(
2475                p_association_id                  => l_association_id
2476                ,p_citem_version_id               => l_citem_ver_id
2477                );
2478       END IF;
2479    END LOOP;
2480    CLOSE c_citem_assoc;
2481 
2482 /*
2483    OPEN c_act_prod_id(l_schedule_id);
2484    FETCH c_act_prod_id INTO l_act_prod_id;
2485    CLOSE c_act_prod_id ;
2486 
2487    IF (l_act_prod_id IS NOT NULL)
2488    THEN
2489      UPDATE ams_act_products
2490      SET primary_product_flag = 'Y'
2491      WHERE activity_product_id =l_act_prod_id;
2492    END IF;
2493    */
2494 
2495   return 'SUCCESS';
2496 
2497 EXCEPTION
2498 
2499    WHEN OTHERS THEN
2500       WF_CORE.CONTEXT('AMS_ACT_PRODUCTS','UPDATE_SCHEDULE_ACTIVITIES',
2501                         p_event.getEventName( ), p_subscription_guid);
2502       WF_EVENT.setErrorInfo(p_event, 'ERROR');
2503       RETURN 'ERROR';
2504 END UPDATE_SCHEDULE_ACTIVITIES;
2505 
2506 /** API to be used by Campign approval process **/
2507 /** Before approval to find out whether content is approved or not **/
2508 
2509 procedure IS_ALL_CONTENT_APPROVED (
2510    p_schedule_id    IN         NUMBER,
2511    x_return_status  OUT NOCOPY VARCHAR2
2512 )
2513 IS
2514 cursor C_Content( l_sch_id IN NUMBER)  IS
2515 SELECT count(*)
2516 FROM   IBC_ASSOCIATIONS IbcAssn,
2517        ibc_content_items citem
2518 WHERE  IbcAssn.ASSOCIATED_OBJECT_VAL1 = to_char(l_sch_id )-- musman:bug 4145845 Fix
2519        AND IbcAssn.Content_item_id    = citem.content_item_id
2520        AND citem.content_item_status <> 'APPROVED'
2521        AND ibcassn.ASSOCIATION_TYPE_CODE  in ('AMS_COLB','AMS_PLCE') ;
2522 
2523 COUNTER NUMBER;
2524 BEGIN
2525   open  C_Content(p_schedule_id);
2526   fetch C_Content  into COUNTER;
2527   if (C_Content%notfound) then
2528     x_return_status := 'Y';
2529   end if;
2530   if (COUNTER > 0) then
2531     x_return_status := 'N';
2532    else
2533     x_return_status := 'Y';
2534   end if;
2535   close C_Content;
2536 END IS_ALL_CONTENT_APPROVED;
2537 
2538 ------------------------------------------------------------------------------------------
2539 /*
2540   --bug: 4634617 fix as per r12 requirement removing the validation
2541 PROCEDURE check_product_val_for_csch
2542 (    p_act_Product_rec     IN      act_Product_rec_type,
2543     x_return_status  OUT NOCOPY       VARCHAR2
2544 )IS
2545 
2546 
2547 
2548 l_campaign_id NUMBER;
2549 l_usage       varchar2(30);
2550 
2551 
2552 CURSOR get_csch_detl
2553 IS
2554 SELECT campaign_id,usage
2555 FROM ams_campaign_schedules_b
2556 WHERE schedule_id = p_act_product_rec.act_product_used_by_id;
2557 
2558  CURSOR check_prod_exist
2559  IS
2560  SELECT 1
2561  from ams_act_products
2562  where arc_act_product_used_by = 'CAMP'
2563  and act_product_used_by_id = l_campaign_id
2564  and level_type_code = 'PRODUCT'
2565  and organization_id = p_act_product_rec.organization_id
2566  and inventory_item_id = p_act_product_rec.inventory_item_id;
2567 
2568   CURSOR check_prod_cat_exist
2569  IS
2570  SELECT 1
2571  from ams_act_products a
2572  ,mtl_item_categories ml
2573  where arc_act_product_used_by = 'CAMP'
2574  and act_product_used_by_id = l_campaign_id
2575  and level_type_code = 'FAMILY'
2576  and a.category_id = p_act_product_rec.category_id
2577  and ml.organization_id = p_act_product_rec.organization_id
2578  and ml.inventory_item_id = p_act_product_rec.inventory_item_id
2579  and ml.category_id = a.CATEGORY_ID
2580  and ml.category_set_id = p_act_product_rec.category_SET_id;
2581 
2582  CURSOR check_cat_exist
2583  IS
2584  SELECT 1
2585  from ams_act_products
2586  where arc_act_product_used_by = 'CAMP'
2587  and act_product_used_by_id = l_campaign_id
2588  and level_type_code = 'FAMILY'
2589  and category_id = p_act_product_rec.category_id
2590  and category_set_id = p_act_product_rec.category_set_id;
2591 
2592 CURSOR check_cat_exist_hrchy
2593  IS
2594  select 1
2595  from ENI_PROD_DEN_HRCHY_PARENTS_V
2596  where category_id =  p_act_product_rec.category_id
2597  start with category_id in (select category_id
2598                            from ams_act_products
2599                            where arc_act_product_used_by = 'CAMP'
2600                             and  act_product_used_by_id =  l_campaign_id
2601                             and level_type_code = 'FAMILY')
2602  connect by  prior category_id = category_parent_id     ;
2603 
2604 
2605  l_count NUMBER := 0;
2606  l_api_name    constant VARCHAR2(30) := 'check_product_val_for_csch';
2607  l_full_name   CONSTANT VARCHAR2(60) := g_package_name ||'.'|| l_api_name;
2608 
2609  CURSOR c_item_cat_check
2610  IS
2611  SELECT 1
2612  from mtl_item_categories
2613  where inventory_item_id = p_act_product_rec.inventory_item_id
2614  and  category_id = p_act_product_rec.category_id
2615  and category_set_id = p_act_product_rec.category_set_id;
2616 
2617 BEGIN
2618 
2619    x_return_status := FND_API.g_ret_sts_success;
2620     -- checking if cat_id and inv id is passed,assoc exist.
2621    IF (AMS_LOG_PROCEDURE_ON) THEN
2622       AMS_UTILITY_PVT.debug_message(AMS_LOG_PROCEDURE,G_module_name,l_full_name||':Start');
2623    END IF;
2624 
2625    IF (( p_act_product_rec.inventory_item_id <> FND_API.G_MISS_NUM
2626    AND   p_act_product_rec.category_id <> FND_API.G_MISS_NUM )
2627    AND  p_act_product_rec.level_type_code = 'PRODUCT')
2628    THEN
2629       OPEN c_item_cat_check;
2630       FETCH c_item_cat_check into l_count;
2631       CLOSE c_item_cat_check;
2632       IF l_count = 0 THEN
2633         IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
2634            FND_MESSAGE.set_name('AMS', 'AMS_API_PRD_ITEM_IN_CAT');
2635            FND_MSG_PUB.add;
2636         END IF;
2637       END IF;
2638       l_count := 0;
2639    END IF;
2640 
2641    IF p_act_product_rec.arc_act_product_used_by = 'CSCH'
2642    THEN
2643       IF (AMS_DEBUG_HIGH_ON) THEN
2644          AMS_UTILITY_PVT.debug_message('checking for hierarchy inheritance for schedule:'|| p_act_product_rec.act_product_used_by_id);
2645          AMS_UTILITY_PVT.debug_message('inventory_item_id:'|| p_act_product_rec.inventory_item_id);
2646          AMS_UTILITY_PVT.debug_message('organization_id:'|| p_act_product_rec.organization_id);
2647          AMS_UTILITY_PVT.debug_message('category_id'|| p_act_product_rec.category_id);
2648          AMS_UTILITY_PVT.debug_message('level_type_code'|| p_act_product_rec.level_type_code);
2649       END IF;
2650 
2651       OPEN get_csch_detl;
2652       FETCH get_csch_detl INTO l_campaign_id,l_usage;
2653       CLOSE get_csch_detl;
2654 
2655       IF (AMS_DEBUG_HIGH_ON) THEN
2656          AMS_UTILITY_PVT.debug_message('campaign_id:'|| l_campaign_id);
2657       END IF;
2658       IF (AMS_LOG_STATEMENT_ON) THEN
2659         AMS_UTILITY_PVT.debug_message(AMS_LOG_STATEMENT,G_module_name,'inv_id:'
2660                 ||p_act_product_rec.inventory_item_id||',cat_id:'||p_act_product_rec.category_id
2661                 ||',schId'||p_act_product_rec.act_product_used_by_id ||',campaign_id:'|| l_campaign_id);
2662       END IF;
2663 
2664 
2665       IF (l_usage is not null
2666       AND l_usage = 'LITE')
2667       THEN
2668          IF (   p_act_product_rec.inventory_item_id <> FND_API.G_MISS_NUM
2669             AND p_act_product_rec.organization_id <> FND_API.G_MISS_NUM )
2670          THEN
2671 
2672             IF (AMS_LOG_STATEMENT_ON) THEN
2673                AMS_UTILITY_PVT.debug_message(AMS_LOG_STATEMENT,G_module_name,'checking if the product association exist in campaign');
2674             END IF;
2675             --- checking if the product association exist in campaign
2676             OPEN check_prod_exist;
2677             FETCH check_prod_exist INTO l_count;
2678             CLOSE check_prod_exist;
2679             IF l_count = 0 THEN
2680                IF (AMS_LOG_STATEMENT_ON) THEN
2681                  AMS_UTILITY_PVT.debug_message(AMS_LOG_STATEMENT,G_module_name,'check_prod_exist does not exist');
2682                END IF;
2683                --- checking if the category, which is assigned to the product,direct assoc with camp
2684                -- or the category exists in its hierarchy  association exist in campaign
2685                If ( p_act_product_rec.category_id IS NOT NULL
2686                AND p_Act_product_Rec.category_id <> FND_API.G_MISS_NUM) THEN
2687                  IF (AMS_LOG_STATEMENT_ON) THEN
2688                    AMS_UTILITY_PVT.debug_message(AMS_LOG_STATEMENT,G_module_name,'INSIDE Category, cat-set-id not null condn');
2689                  END IF;
2690                  --checking direct assoc
2691                  OPEN check_prod_cat_exist;
2692                  FETCH check_prod_cat_exist INTO l_count;
2693                  CLOSE check_prod_cat_exist;
2694                  IF l_count = 0  THEN
2695                    -- checking if the category exist in the hierachy
2696                    OPEN check_cat_exist_hrchy;
2697                    FETCH check_cat_exist_hrchy INTO l_count;
2698                    CLOSE check_cat_exist_hrchy;
2699                    IF l_count = 0 THEN
2700                     IF (AMS_LOG_STATEMENT_ON) THEN
2701                      AMS_UTILITY_PVT.debug_message(AMS_LOG_STATEMENT,G_module_name,'check_cat_exist does not exist');
2702                     END IF;
2703                   --- both hierarch doesn't exist raising an error
2704                     IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error)
2705                     THEN
2706                        FND_MESSAGE.set_name('AMS', 'AMS_PROD_ASSOC_NOT_IN_CAMP');
2707                        FND_MSG_PUB.add;
2708                     END IF;
2709                     x_return_status := FND_API.g_ret_sts_error;
2710                     RETURN;
2711                     END IF;
2712                  END IF;
2713                ELSE --- if there is no category passed, which means the product assoc doesnot there in campaign
2714                  IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error)
2715                  THEN
2716                     FND_MESSAGE.set_name('AMS', 'AMS_PROD_ASSOC_NOT_IN_CAMP');
2717                     FND_MSG_PUB.add;
2718                  END IF;
2719                  x_return_status := FND_API.g_ret_sts_error;
2720                  RETURN;
2721               END IF;
2722             END IF;
2723             --- checking if the category association exist. this we would need for just category
2724              -- association.
2725          ELSIF (p_act_product_rec.category_id <> FND_API.G_MISS_NUM
2726          AND p_act_product_rec.category_set_id <> FND_API.G_MISS_NUM)
2727          THEN
2728             OPEN check_cat_exist;
2729             FETCH check_cat_exist INTO l_count;
2730             CLOSE check_cat_exist;
2731             IF l_count = 0
2732             THEN
2733               IF (AMS_LOG_STATEMENT_ON) THEN
2734                  AMS_UTILITY_PVT.debug_message(AMS_LOG_STATEMENT,G_module_name,'check_cat_exist does not exist');
2735               END IF;
2736               -- checking if the category exist in the hierachy
2737               OPEN check_cat_exist_hrchy;
2738               FETCH check_cat_exist_hrchy INTO l_count;
2739               CLOSE check_cat_exist_hrchy;
2740               IF l_count = 0
2741               THEN
2742                  IF (AMS_LOG_STATEMENT_ON) THEN
2743                    AMS_UTILITY_PVT.debug_message(AMS_LOG_STATEMENT,G_module_name,'HIERARCHY ALSO DOESNT EXIST');
2744                  END IF;
2745                  IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error)
2746                  THEN
2747                      FND_MESSAGE.set_name('AMS', 'AMS_CAT_ASSOC_NOT_IN_CAMP');
2748                      FND_MSG_PUB.add;
2749                  END IF;
2750                  x_return_status := FND_API.g_ret_sts_error;
2751                  RETURN;
2752               END IF;
2753             END IF;
2754          END IF; -- invId/cat Id chceck
2755       END IF; -- l_usage
2756    END IF;  -- obj_type = csch
2757 
2758    IF (AMS_LOG_STATEMENT_ON) THEN
2759      AMS_UTILITY_PVT.debug_message(AMS_LOG_STATEMENT,G_module_name,'check_product_val_for_csch is checked with no errors');
2760    END IF;
2761 
2762    IF (AMS_LOG_PROCEDURE_ON) THEN
2763      AMS_UTILITY_PVT.debug_message(AMS_LOG_STATEMENT,G_module_name,l_full_name||'- End');
2764    END IF;
2765 
2766 END check_product_val_for_csch;
2767 
2768 */
2769 
2770 FUNCTION GET_CATEGORY_SET_ID
2771 RETURN NUMBER IS
2772 
2773    CURSOR get_cat_Set_id
2774    IS Select category_Set_id
2775    FROM ENI_PROD_DEN_HRCHY_PARENTS_V a
2776    WHERE rownum <2 ;
2777 
2778 l_cat_set_id NUMBER;
2779 
2780 begin
2781    open get_cat_set_id;
2782    fetch get_Cat_set_id INTO l_cat_set_id;
2783    close get_cat_set_id;
2784    return l_cat_set_id;
2785 
2786 End;
2787 
2788 FUNCTION GET_LEVEL_TYPE_CODE( p_inv_id  IN  NUMBER
2789                           ,p_Cat_id  IN NUMBER)
2790 RETURN VARCHAR2 IS
2791    l_level_type_code varchar2(10):= 'FAMILY';
2792 
2793 BEGIN
2794    If p_inv_id is not null
2795    and p_inv_id <> FND_API.G_MISS_NUM
2796    THEN
2797      l_level_type_code := 'PRODUCT';
2798    End If;
2799 
2800    Return l_level_type_code;
2801 End;
2802 
2803 END AMS_ActProduct_PVT;