DBA Data[Home] [Help]

PACKAGE BODY: APPS.AMS_APPROVAL_DETAILS_PVT

Source


1 PACKAGE BODY AMS_APPROVAL_DETAILS_PVT AS
2 /* $Header: amsvapdb.pls 120.2 2005/12/28 00:14:47 vmodur noship $ */
3 
4 -----------------------------------------------------------
5 -- PACKAGE
6 --    AMS_APPROVAL_DETAILS_PVT
7 --
8 -- PURPOSE
9 --    This package is a Private API for managing Approval details
10 --    in AMS.  It contains specification for pl/sql records and tables
11 --
12 --    AMS_APPROVAL_DETAILS_VL:
13 --    Create_Approval_Details (see below for specification)
14 --    Update_Approval_Details (see below for specification)
15 --    Delete_Approval_Details (see below for specification)
16 --    Lock_Approval_Details (see below for specification)
17 --    Validate_Approval_Details (see below for specification)
18 --
19 --    Check_Approval_Details_Items (see below for specification)
20 --    Check_Approval_Details_Record (see below for specification)
21 --    Init_Approval_Details_Rec
22 --    Complete_Approval_Details_Rec
23 --
24 -- NOTES
25 --
26 --
27 -- HISTORY
28 -- 19-OCT-2000    mukumar      Created.
29 -- 08-JAN-2001    MUKUMAR      In validation for lookup type
30 --                             AMS_FUND_SOURCE replaced with
31 --                             AMS_APPEOVAL_RULE_FOR.
32 -- 26-DEC-2001    SVEERAVE     Replaced logic in Check_Approval_Dtls_UK_Items
33 --                             to fix bug# 2155701
34 -- 05-FEB-2002    VMODUR       Change Check_Unique_Rule from a function to a
35 --                             procedure to also return the name of overlapping
36 --                             rule for bug# 2195020. Token is used to display
37 --                             this rule name in the jsp
38 -- 30-APR-2002    VMODUR       Country Code is now an integral part of Approval Rule
39 --                             Validation Enh 1578624
40 -- 09-MAY-2002    VMODUR       Fix for Bug 2340052 - Overlapping Rules
41 --                             Currency Code is also used to determine uniqueness
42 --                             and overlapping
43 -- 20-JUN-2002    VMODUR       Bug 2195020 - Fix for Budget and Concept Approval Rule Overlap
44 --                             to return the name of the overlapping rule. Function
45 --                             Check_Approval_Amounts_Overlap was changed to a procedure and
46 --                             new proc get_Approval_Rule_Name added
47 -- 24-Jul-2002    VMODUR       Fix for Bug 2474782 - Allow Negative Amounts For Claims
48 --                             and call check_approval_details_items during update also
49 -- 12-Sep-2002    VMODUR       l_meaning changed from Varchar2(30) to Varchar2(80) for MLS Bug
50 -- 31-Jan-2003    VMODUR       Bug 2776795 Fix
51 -- 29-Jul-2003    VMODUR       Bug 3068835 fix from 11.5.9 Cert
52 -- 13-Sep-2003    VMODUR       11.5.10 Changes for LITE CSCH - No Budget Min Amt null Validation
53 -- 30-Oct-2003    VMODUR       11.5.10 Amount Overlap Changes
54 -- 01-DEC-2003    VMODUR       Bug 3275739 Fix
55 -- 12-MAY-2004    VMODUR       Perf Repository Fix. Use _VL instead of _V
56 -- 12-JUL-2004    VMODUR       Bug 3737174 Fix
57 -- 04-OCT-2004    VMODUR       Bug 3871802 Fix in 11.5.11
58 -- 14-SEP-2005    VMODUR       R12 Changes - No LITE/PHAT distinction for CSCH
59 -----------------------------------------------------------
60 
61 -- Global CONSTANTS
62 G_PKG_NAME           CONSTANT VARCHAR2(30) := 'AMS_Approval_Details_PVT';
63 
64 AMS_DEBUG_HIGH_ON boolean := FND_MSG_PUB.CHECK_MSG_LEVEL(FND_MSG_PUB.G_MSG_LVL_DEBUG_HIGH);
65 AMS_DEBUG_LOW_ON boolean := FND_MSG_PUB.CHECK_MSG_LEVEL(FND_MSG_PUB.G_MSG_LVL_DEBUG_LOW);
66 AMS_DEBUG_MEDIUM_ON boolean := FND_MSG_PUB.CHECK_MSG_LEVEL(FND_MSG_PUB.G_MSG_LVL_DEBUG_MEDIUM);
67 
68 FUNCTION compare_columns(
69    p_approval_details_rec   IN  Approval_Details_Rec_Type
70 ) RETURN VARCHAR2;   -- FND_API.g_true/g_false
71 
72 FUNCTION seed_needs_update(
73    p_approval_details_rec   IN  Approval_Details_Rec_Type
74 ) RETURN VARCHAR2;   -- FND_API.g_true/g_false
75 
76 --       Check_Approval_Dtls_Req_Items
77 PROCEDURE Check_Approval_Dtls_Req_Items (
78    p_approval_details_rec   IN  Approval_Details_Rec_Type,
79    x_return_status       OUT NOCOPY   VARCHAR2
80 );
81 --       Check_Approval_Dtls_UK_Items
82 PROCEDURE Check_Approval_Dtls_UK_Items (
83    p_approval_details_rec   IN  Approval_Details_Rec_Type,
84    p_validation_mode     IN    VARCHAR2 := JTF_PLSQL_API.g_create,
85    x_return_status       OUT NOCOPY   VARCHAR2
86 );
87 --       Check_Approval_Dtls_FK_Items
88 PROCEDURE Check_Approval_Dtls_FK_Items (
89    p_approval_details_rec   IN  Approval_Details_Rec_Type,
90    x_return_status       OUT NOCOPY   VARCHAR2
91 );
92 --       Check_Approval_Dtls_Lkup_Items
93 PROCEDURE Check_Approval_Dtls_Lkup_Items (
94    p_approval_details_rec   IN  Approval_Details_Rec_Type,
95    x_return_status       OUT NOCOPY   VARCHAR2
96 );
97 
98 --       Check_Approval_Dtls_Flag_Items
99 PROCEDURE Check_Approval_Dtls_Flag_Items (
100    p_approval_details_rec   IN  Approval_Details_Rec_Type,
101    x_return_status       OUT NOCOPY   VARCHAR2
102 );
103 
104 PROCEDURE Check_Approval_Amounts_Overlap (
105    p_approval_details_rec   IN  Approval_Details_Rec_Type,
106    p_appoval_ids            IN  t_approval_id_table,
107    x_exist_rule_name        OUT NOCOPY VARCHAR2,
108    x_return_status          OUT NOCOPY VARCHAR2
109 );
110 
111 FUNCTION Check_Dates_Overlap (
112    p_approval_details_rec   IN  Approval_Details_Rec_Type,
113    p_validation_mode IN VARCHAR2
114 ) RETURN VARCHAR2;   -- FND_API.g_true/g_false
115 
116 
117 PROCEDURE Check_Unique_Rule (
118    p_approval_details_rec   IN  Approval_Details_Rec_Type,
119    x_exist_rule_name        OUT NOCOPY VARCHAR2,
120    x_return_status          OUT NOCOPY VARCHAR2 -- FND_API.g_true/g_false
121 );
122 
123 PROCEDURE Get_Approval_Rule_Name(
124    p_approval_detail_id     IN  NUMBER,
125    x_rule_name              OUT NOCOPY VARCHAR2)
126 IS
127 l_rule_name  VARCHAR2(240);
128 BEGIN
129 SELECT name
130 INTO l_rule_name
131 FROM ams_approval_details_v
132 where approval_detail_id = p_approval_detail_id;
133 x_rule_name := l_rule_name;
134 END;
135 
136 FUNCTION Is_Usage_Lite(
137    p_custom_setup_id   IN  NUMBER
138    ) RETURN VARCHAR2 -- FND_API.g_true/g_false
139 IS
140 l_usage VARCHAR2(30);
141 BEGIN
142 SELECT usage
143 INTO l_usage
144 FROM ams_custom_setups_b
145 WHERE custom_setup_id = p_custom_setup_id;
146 
147 IF l_usage = 'LITE' THEN
148    return FND_API.g_true;
149 ELSE
150    return FND_API.g_false;
151 END IF;
152 EXCEPTION
153 WHEN NO_DATA_FOUND THEN
154   return FND_API.g_false;
155 END;
156 
157 
158 --------------------------------------------------------------------
159 -- PROCEDURE
160 --    Create_Approval_Details
161 --
162 -- PURPOSE
163 --    Create Approval Details entry.
164 --
165 -- PARAMETERS
166 --    p_approval_detail_rec: the record representing AMS_APPROVAL_DETAILS_VL view..
167 --    x_approval_detail_id: the approval_detail_id.
168 --
169 -- NOTES
170 --    1. object_version_number will be set to 1.
171 --    2. If approval_detail_id is passed in, the uniqueness will be checked.
172 --       Raise exception in case of duplicates.
173 --    4. If a flag column is passed in, check if it is 'Y' or 'N'.
174 --       Raise exception for invalid flag.
175 --    5. If a flag column is not passed in, default it to 'Y' or 'N'.
176 --    6. Please don't pass in any FND_API.g_mess_char/num/date.
177 --------------------------------------------------------------------
178 PROCEDURE Create_approval_details (
179    p_api_version       IN  NUMBER,
180    p_init_msg_list     IN  VARCHAR2  := FND_API.g_false,
181    p_commit            IN  VARCHAR2  := FND_API.g_false,
182    p_validation_level  IN  NUMBER    := FND_API.g_valid_level_full,
183    x_return_status     OUT NOCOPY VARCHAR2,
184    x_msg_count         OUT NOCOPY NUMBER,
185    x_msg_data          OUT NOCOPY VARCHAR2,
186    p_approval_details_rec  IN  Approval_Details_Rec_Type,
187    x_approval_detail_id    OUT NOCOPY NUMBER
188 )
189 IS
190 
191    L_API_VERSION  CONSTANT NUMBER := 1.0;
192    L_API_NAME     CONSTANT VARCHAR2(30) := 'Create_Approval_Details';
193    L_FULL_NAME    CONSTANT VARCHAR2(60) := G_PKG_NAME || '.' || L_API_NAME;
194    l_Approval_Details_rec   Approval_Details_Rec_Type := p_approval_details_rec;
195    l_exist_rule_name    AMS_APPROVAL_DETAILS_V.Name%TYPE;
196    l_dummy              NUMBER;
197    l_return_status      VARCHAR2(1);
198    l_row_id             VARCHAR2(40);
199 
200    CURSOR c_seq IS
201      SELECT ams_approval_details_s.NEXTVAL
202      FROM   dual;
203 
204    CURSOR c_id_exists (x_id IN NUMBER) IS
205      SELECT 1 FROM   dual
206        WHERE EXISTS (SELECT 1 FROM   ams_approval_details
207                    WHERE  approval_detail_id = x_id);
208 BEGIN
209    --------------------- initialize -----------------------
210     SAVEPOINT Create_Approval_Details;
211     IF (AMS_DEBUG_HIGH_ON) THEN
212 
213     AMS_Utility_PVT.debug_message (l_full_name || ': Start');
214     END IF;
215         IF FND_API.to_boolean (p_init_msg_list) THEN
216            FND_MSG_PUB.initialize;
217         END IF;
218         IF NOT FND_API.compatible_api_call (
219             L_API_VERSION,
220             p_api_version,
221             L_API_NAME,
222             G_PKG_NAME
223           ) THEN
224             RAISE FND_API.g_exc_unexpected_error;
225         END IF;
226         x_return_status := FND_API.g_ret_sts_success;
227 
228 
229   ----------------Similar Rule Already Exists Or Not ---------------------------
230 
231    Check_Unique_Rule(p_approval_details_rec => l_Approval_Details_rec,
232                      x_exist_rule_name      => l_exist_rule_name,
233                      x_return_status        => l_return_status);
234    IF l_return_status = FND_API.g_true THEN
235        IF FND_MSG_PUB.check_msg_level (FND_MSG_PUB.g_msg_lvl_error) THEN
236          FND_MESSAGE.set_name ('AMS', 'AMS_APPR_RULE_EXISTS');
237          FND_MESSAGE.set_token('EXIST_RULE_NAME', l_exist_rule_name);
238          FND_MSG_PUB.add;
239        END IF;
240        RAISE FND_API.g_exc_error;
241    END IF;
242 
243   ----------------------- validate -----------------------
244         IF (AMS_DEBUG_HIGH_ON) THEN
245 
246         AMS_Utility_PVT.debug_message (l_full_name || ': Validate');
247         END IF;
248      Validate_approval_details (
249         p_api_version       =>  L_API_VERSION,
250         p_init_msg_list     =>  p_init_msg_list,
251         p_commit            =>  p_commit,
252         p_validation_level  =>  p_validation_level,
253         x_return_status     =>  l_return_status,
254         x_msg_count         =>  x_msg_count,
255         x_msg_data          =>  x_msg_data,
256         p_approval_details_rec   =>  l_Approval_Details_rec
257      );
258      IF l_return_status = FND_API.g_ret_sts_error THEN
259             RAISE FND_API.g_exc_error;
260         ELSIF l_return_status = FND_API.g_ret_sts_unexp_error THEN
261             RAISE FND_API.g_exc_unexpected_error;
262      END IF;
263      --
264      -- Check for the ID.
265      --
266     IF l_Approval_Details_rec.approval_detail_id IS NULL THEN
267       LOOP
268       --
269       -- If the ID is not passed into the API, then
270       -- grab a value from the sequence.
271         OPEN c_seq;
272         FETCH c_seq INTO l_Approval_Details_rec.approval_detail_id;
273         CLOSE c_seq;
274       --
275       -- Check to be sure that the sequence does not exist.
276         OPEN c_id_exists (l_Approval_Details_rec.approval_detail_id);
277         FETCH c_id_exists INTO l_dummy;
278         CLOSE c_id_exists;
279       --
280       -- If the value for the ID already exists, then
281       -- l_dummy would be populated with '1', otherwise,
282       -- it receives NULL.
283 
284         EXIT WHEN l_dummy IS NULL;
285      END LOOP;
286    END IF;
287   -------------------------- insert --------------------------
288    IF (AMS_DEBUG_HIGH_ON) THEN
289 
290    AMS_Utility_PVT.debug_message (l_full_name || ': Insert');
291    END IF;
292    --
293    -- Insert into mutli-language supported table.
294    --
295    AMS_APPROVAL_DETAILS_PKG.INSERT_ROW (
296       X_ROWID => l_row_id,
297       X_APPROVAL_DETAIL_ID => l_Approval_Details_rec.APPROVAL_DETAIL_ID,
298       X_START_DATE_ACTIVE => l_Approval_Details_rec.START_DATE_ACTIVE,
299       X_END_DATE_ACTIVE => l_Approval_Details_rec.END_DATE_ACTIVE,
300       X_OBJECT_VERSION_NUMBER => 1, --l_Approval_Details_rec.OBJECT_VERSION_NUMBER,
301       --X_SECURITY_GROUP_ID => l_Approval_Details_rec.SECURITY_GROUP_ID,
302       X_BUSINESS_GROUP_ID => l_Approval_Details_rec.BUSINESS_GROUP_ID,
303       X_BUSINESS_UNIT_ID => l_Approval_Details_rec.BUSINESS_UNIT_ID,
304       X_ORGANIZATION_ID => l_Approval_Details_rec.ORGANIZATION_ID,
305       X_CUSTOM_SETUP_ID => l_Approval_Details_rec.CUSTOM_SETUP_ID,
306       X_APPROVAL_OBJECT => l_Approval_Details_rec.APPROVAL_OBJECT,
307       X_APPROVAL_OBJECT_TYPE => l_Approval_Details_rec.APPROVAL_OBJECT_TYPE,
308       X_APPROVAL_TYPE => l_Approval_Details_rec.APPROVAL_TYPE,
309       X_APPROVAL_PRIORITY => l_Approval_Details_rec.APPROVAL_PRIORITY,
310       X_APPROVAL_LIMIT_TO => l_Approval_Details_rec.APPROVAL_LIMIT_TO,
311       X_APPROVAL_LIMIT_FROM => l_Approval_Details_rec.APPROVAL_LIMIT_FROM,
312       X_SEEDED_FLAG => nvl(l_Approval_Details_rec.SEEDED_FLAG, 'N'),
313       X_ACTIVE_FLAG => nvl(l_Approval_Details_rec.ACTIVE_FLAG, 'Y'),
314       X_CURRENCY_CODE => l_Approval_Details_rec.CURRENCY_CODE,
315       X_USER_COUNTRY_CODE => l_Approval_Details_rec.USER_COUNTRY_CODE,
316       X_NAME => l_Approval_Details_rec.NAME,
317       X_DESCRIPTION => l_Approval_Details_rec.DESCRIPTION,
318       X_CREATION_DATE => sysdate,
319       X_CREATED_BY => FND_GLOBAL.User_Id,
320       X_LAST_UPDATE_DATE => sysdate,
321       X_LAST_UPDATED_BY => FND_GLOBAL.User_Id,
322       X_LAST_UPDATE_LOGIN => FND_GLOBAL.Conc_Login_Id
323       ) ;
324         -- set OUT value
325      x_approval_detail_id := l_Approval_Details_rec.APPROVAL_DETAIL_ID;
326      --
327      -- END of API body.
328      --
329      -- Standard check of p_commit.
330      IF FND_API.To_Boolean ( p_commit ) THEN
331         COMMIT WORK;
332      END IF;
333         FND_MSG_PUB.count_and_get(
334            p_encoded => FND_API.g_false,
335            p_count   => x_msg_count,
336            p_data    => x_msg_data
337            );
338         IF (AMS_DEBUG_HIGH_ON) THEN
339 
340         AMS_Utility_PVT.debug_message (l_full_name || ': End');
341         END IF;
342 
343 EXCEPTION
344     WHEN FND_API.g_exc_error THEN
345        ROLLBACK TO Create_Approval_Details;
346        x_return_status := FND_API.g_ret_sts_error;
347        FND_MSG_PUB.count_and_get(
348         p_encoded => FND_API.g_false,
349         p_count   => x_msg_count,
350         p_data    => x_msg_data
351        );
352     WHEN FND_API.g_exc_unexpected_error THEN
353        ROLLBACK TO Create_Approval_Details;
354        x_return_status := FND_API.g_ret_sts_unexp_error ;
355        FND_MSG_PUB.count_and_get (
356          p_encoded => FND_API.g_false,
357          p_count   => x_msg_count,
358          p_data    => x_msg_data
359        );
360     WHEN OTHERS THEN
361           ROLLBACK TO Create_Approval_Details;
362           x_return_status := FND_API.g_ret_sts_unexp_error ;
363           IF FND_MSG_PUB.check_msg_level (FND_MSG_PUB.g_msg_lvl_unexp_error)
364           THEN
365              FND_MSG_PUB.add_exc_msg (g_pkg_name, l_api_name);
366           END IF;
367           FND_MSG_PUB.count_and_get (
368             p_encoded => FND_API.g_false,
369             p_count   => x_msg_count,
370             p_data    => x_msg_data
371           );
372 END Create_approval_details;
373    --------------------------------------------------------------------
374 -- PROCEDURE
375 --    Update_approval_details
376 --
377 -- PURPOSE
378 --    Update an approval details entry.
379 --
380 -- PARAMETERS
381 --    p_approval_details_rec: the record representing AMS_APPROVAL_DETAILS_VL (without the ROW_ID column).
382 --
383 -- NOTES
384 --    1. Raise exception if the object_version_number doesn't match.
385 --    2. If an attribute is passed in as FND_API.g_miss_char/num/date,
386 --       that column won't be updated.
387 --------------------------------------------------------------------
388 PROCEDURE Update_approval_details (
389    p_api_version       IN  NUMBER,
390    p_init_msg_list     IN  VARCHAR2  := FND_API.g_false,
391    p_commit            IN  VARCHAR2  := FND_API.g_false,
392    p_validation_level  IN  NUMBER    := FND_API.g_valid_level_full,
393 
394    x_return_status     OUT NOCOPY VARCHAR2,
395    x_msg_count         OUT NOCOPY NUMBER,
396    x_msg_data          OUT NOCOPY VARCHAR2,
397 
398    p_approval_details_rec   IN  Approval_Details_Rec_Type
399 )
400 IS
401 
402    L_API_VERSION   CONSTANT NUMBER := 1.0;
403    L_API_NAME    CONSTANT VARCHAR2(30) := 'Update_Approval_Details';
404    L_FULL_NAME   CONSTANT VARCHAR2(60) := G_PKG_NAME || '.' || L_API_NAME;
405 
406    l_Approval_Details_rec   Approval_Details_Rec_Type := p_approval_details_rec;
407    l_exist_rule_name    AMS_APPROVAL_DETAILS_V.Name%TYPE;
408    l_dummy              NUMBER;
409    l_return_status      VARCHAR2(1);
410 
411       CURSOR c_rec_exists (x_id IN NUMBER, ver IN NUMBER) IS
412                 SELECT 1 FROM   ams_approval_details
413                    WHERE  approval_detail_id = x_id
414                      AND object_version_number = ver;
415 
416 BEGIN
417      --------------------- initialize -----------------------
418     SAVEPOINT Update_approval_details;
419     IF (AMS_DEBUG_HIGH_ON) THEN
420 
421     AMS_Utility_PVT.debug_message (l_full_name || ': Start');
422     END IF;
423     IF FND_API.to_boolean (p_init_msg_list) THEN
424        FND_MSG_PUB.initialize;
425     END IF;
426     IF NOT FND_API.compatible_api_call(
427        l_api_version,
428        p_api_version,
429        l_api_name,
430        g_pkg_name
431      ) THEN
432        RAISE FND_API.g_exc_unexpected_error;
433     END IF;
434     x_return_status := FND_API.g_ret_sts_success;
435 
436 
437      ----------------Similar Rule Already Exists Or Not ---------------------------
438    Check_Unique_Rule(p_approval_details_rec => l_Approval_Details_rec,
439                      x_exist_rule_name      => l_exist_rule_name,
440                      x_return_status        => l_return_status);
441    IF l_return_status = FND_API.g_true THEN
442        IF FND_MSG_PUB.check_msg_level (FND_MSG_PUB.g_msg_lvl_error) THEN
443          FND_MESSAGE.set_name ('AMS', 'AMS_APPR_RULE_EXISTS');
444          FND_MESSAGE.set_token('EXIST_RULE_NAME',l_exist_rule_name);
445          FND_MSG_PUB.add;
446        END IF;
447        RAISE FND_API.g_exc_error;
448    END IF;
449 
450    ----------------------- validate ----------------------
451    IF (AMS_DEBUG_HIGH_ON) THEN
452 
453    AMS_Utility_PVT.debug_message (l_full_name || ': Validate');
454    END IF;
455    -- replace g_miss_char/num/date with current column values
456    Complete_approval_details_Rec(p_approval_details_rec,l_approval_details_Rec);
457    IF l_approval_details_Rec.seeded_flag = 'Y' THEN
458      IF compare_columns(l_approval_details_Rec) = FND_API.g_false THEN
459        IF FND_MSG_PUB.check_msg_level (FND_MSG_PUB.g_msg_lvl_error) THEN
460          FND_MESSAGE.set_name ('AMS', 'AMS_STATUS_SEED_DATA');
461          FND_MSG_PUB.add;
462        END IF;
463        RAISE FND_API.g_exc_error;
464      END IF;
465    ELSE
466 	 IF p_validation_level >= JTF_PLSQL_API.g_valid_level_item THEN
467 	    Check_approval_details_Items (
468 		  p_approval_details_rec  => l_approval_details_Rec ,
469 	       p_validation_mode =>  JTF_PLSQL_API.g_update,
470 		  x_return_status   => l_return_status
471 	    );
472 	    IF l_return_status = FND_API.g_ret_sts_unexp_error THEN
473 	       RAISE FND_API.g_exc_unexpected_error;
474 	    ELSIF l_return_status = FND_API.g_ret_sts_error THEN
475 	       RAISE FND_API.g_exc_error;
476 	    END IF;
477 	 END IF;
478       IF p_validation_level >= JTF_PLSQL_API.g_valid_level_record THEN
479 	    Check_approval_details_Record (
480 	        p_approval_details_rec => p_approval_details_rec,
481 		   p_complete_rec  =>  l_approval_details_rec,
482 	        x_return_status => l_return_status
483          );
484          IF l_return_status = FND_API.g_ret_sts_unexp_error THEN
485             RAISE FND_API.g_exc_unexpected_error;
486          ELSIF l_return_status = FND_API.g_ret_sts_error THEN
487             RAISE FND_API.g_exc_error;
488          END IF;
489       END IF;
490    END IF; -- check for seeded flag
491    -- Check to see if the row is seeded if the row is seeded then can't update
492    -- modified.. enabled flag for seeded rows can be updated.. added seed_needs_   -- update function
493    IF l_approval_details_rec.seeded_flag='N'
494 	    OR seed_needs_update(l_approval_details_rec) = FND_API.g_true
495 	 THEN
496    -------------------------- update --------------------
497       IF (AMS_DEBUG_HIGH_ON) THEN
498 
499       AMS_Utility_PVT.debug_message (l_full_name || ': Update');
500       END IF;
501 	    OPEN c_rec_exists (l_Approval_Details_rec.approval_detail_id, p_Approval_Details_rec.OBJECT_VERSION_NUMBER);
502         FETCH c_rec_exists INTO l_dummy;
503         If c_rec_exists%NOTFOUND THEN
504 			CLOSE c_rec_exists;
505 			IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
506 				FND_MESSAGE.set_name('AMS', 'AMS_API_RECORD_NOT_FOUND');
507 				FND_MSG_PUB.add;
508 			END IF;
509 			RAISE FND_API.g_exc_error;
510 		else
511 			CLOSE c_rec_exists;
512 		end IF;
513 
514 	 AMS_APPROVAL_DETAILS_PKG.UPDATE_ROW(
515         X_APPROVAL_DETAIL_ID => l_Approval_Details_rec.approval_detail_id,
516         X_START_DATE_ACTIVE => l_approval_details_rec.START_DATE_ACTIVE,
517         X_END_DATE_ACTIVE => l_approval_details_rec.END_DATE_ACTIVE,
518         X_OBJECT_VERSION_NUMBER => l_approval_details_rec.OBJECT_VERSION_NUMBER+1,
519         --X_SECURITY_GROUP_ID => l_approval_details_rec.SECURITY_GROUP_ID,
520         X_BUSINESS_GROUP_ID => l_approval_details_rec.BUSINESS_GROUP_ID,
521         X_BUSINESS_UNIT_ID => l_approval_details_rec.BUSINESS_UNIT_ID,
522         X_ORGANIZATION_ID => l_approval_details_rec.ORGANIZATION_ID,
523         X_CUSTOM_SETUP_ID => l_approval_details_rec.CUSTOM_SETUP_ID,
524         X_APPROVAL_OBJECT => l_approval_details_rec.APPROVAL_OBJECT,
525         X_APPROVAL_OBJECT_TYPE => l_approval_details_rec.APPROVAL_OBJECT_TYPE,
526         X_APPROVAL_TYPE => l_approval_details_rec.APPROVAL_TYPE,
527         X_APPROVAL_PRIORITY => l_approval_details_rec.APPROVAL_PRIORITY,
528         X_APPROVAL_LIMIT_TO => l_approval_details_rec.APPROVAL_LIMIT_TO,
529         X_APPROVAL_LIMIT_FROM => l_approval_details_rec.APPROVAL_LIMIT_FROM,
530         X_SEEDED_FLAG => l_approval_details_rec.SEEDED_FLAG,
531         X_ACTIVE_FLAG => l_Approval_Details_rec.ACTIVE_FLAG,
532         X_CURRENCY_CODE => l_Approval_Details_rec.CURRENCY_CODE,
533 	X_USER_COUNTRY_CODE => l_Approval_Details_rec.USER_COUNTRY_CODE,
534         X_NAME  => l_approval_details_rec.NAME,
535         X_DESCRIPTION   => l_approval_details_rec.DESCRIPTION,
536         X_LAST_UPDATE_DATE => SYSDATE,
537         X_LAST_UPDATED_BY => FND_GLOBAL.User_Id,
538         X_LAST_UPDATE_LOGIN => FND_GLOBAL.Conc_Login_Id
539         );
540    END IF;-- ending if loop for second seeded_flag check
541    -------------------- finish --------------------------
542    IF FND_API.to_boolean (p_commit) THEN
543       COMMIT;
544    END IF;
545    FND_MSG_PUB.count_and_get (
546       p_encoded => FND_API.g_false,
547       p_count   => x_msg_count,
548       p_data    => x_msg_data
549       );
550    IF (AMS_DEBUG_HIGH_ON) THEN
551 
552    AMS_Utility_PVT.debug_message (l_full_name || ': End');
553    END IF;
554 
555 EXCEPTION
556   WHEN FND_API.g_exc_error THEN
557      ROLLBACK TO Update_approval_details;
558      x_return_status := FND_API.g_ret_sts_error;
559      FND_MSG_PUB.count_and_get (
560        p_encoded => FND_API.g_false,
561        p_count   => x_msg_count,
562        p_data    => x_msg_data
563        );
564 
565   WHEN FND_API.g_exc_unexpected_error THEN
566      ROLLBACK TO Update_approval_details;
567      x_return_status := FND_API.g_ret_sts_unexp_error ;
568      FND_MSG_PUB.count_and_get (
569        p_encoded => FND_API.g_false,
570        p_count   => x_msg_count,
571        p_data    => x_msg_data
572        );
573 
574   WHEN OTHERS THEN
575      ROLLBACK TO Update_approval_details;
576      x_return_status := FND_API.g_ret_sts_unexp_error ;
577      IF FND_MSG_PUB.check_msg_level (FND_MSG_PUB.g_msg_lvl_unexp_error)
578      THEN
579         FND_MSG_PUB.add_exc_msg (g_pkg_name, l_api_name);
580      END IF;
581      FND_MSG_PUB.count_and_get (
582         p_encoded => FND_API.g_false,
583         p_count   => x_msg_count,
584         p_data    => x_msg_data
585      );
586 END Update_approval_details;
587 
588 --------------------------------------------------------------------
589 -- PROCEDURE
590 --    Delete_approval_details
591 --
592 -- PURPOSE
593 --    Delete a approval details entry.
594 --
595 -- PARAMETERS
596 --    p_approval_detail_id: the approval_detail_id
597 --    p_object_version: the object_version_number
598 --
599 -- ISSUES
600 --
601 -- NOTES
602 --    1. Raise exception if the object_version_number doesn't match.
603 --------------------------------------------------------------------
604 PROCEDURE Delete_approval_details (
605    p_api_version       IN  NUMBER,
606    p_init_msg_list     IN  VARCHAR2  := FND_API.g_false,
607    p_commit            IN  VARCHAR2  := FND_API.g_false,
608    p_validation_level  IN  NUMBER    := FND_API.g_valid_level_full,
609 
610    x_return_status     OUT NOCOPY VARCHAR2,
611    x_msg_count         OUT NOCOPY NUMBER,
612    x_msg_data          OUT NOCOPY VARCHAR2,
613 
614    p_approval_detail_id          IN  NUMBER,
615    p_object_version    IN  NUMBER
616 ) IS
617 
618    CURSOR c_approval_details IS
619    SELECT   *
620    FROM  ams_approval_details_vl
621    WHERE approval_detail_id = p_approval_detail_id;
622    --
623    -- This is the only exception for using %ROWTYPE.
624    -- We are selecting from the VL view, which may
625    -- have some denormalized columns as compared to
626    -- the base tables.
627 
628    l_approval_details_rec    c_approval_details%ROWTYPE;
629    l_api_version CONSTANT NUMBER       := 1.0;
630    l_api_name    CONSTANT VARCHAR2(30) := 'Delete_Approval_Details';
631    l_full_name   CONSTANT VARCHAR2(60) := g_pkg_name || '.' || l_api_name;
632 
633 Begin
634 
635    OPEN c_approval_details;
636    FETCH c_approval_details INTO l_approval_details_rec;
637    IF c_approval_details%NOTFOUND THEN
638       CLOSE c_approval_details;
639       IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
640         FND_MESSAGE.set_name('AMS', 'AMS_API_RECORD_NOT_FOUND');
641         FND_MSG_PUB.add;
642       END IF;
643       RAISE FND_API.g_exc_error;
644    END IF;
645    CLOSE c_approval_details;
646     --------------------- initialize -----------------------
647     SAVEPOINT Delete_approval_details;
648     IF (AMS_DEBUG_HIGH_ON) THEN
649 
650     AMS_Utility_PVT.debug_message (l_full_name || ': Start');
651     END IF;
652     IF FND_API.to_boolean (p_init_msg_list) THEN
653        FND_MSG_PUB.initialize;
654     END IF;
655     IF NOT FND_API.compatible_api_call (
656        l_api_version,
657        p_api_version,
658        l_api_name,
659        g_pkg_name
660     ) THEN
661        RAISE FND_API.g_exc_unexpected_error;
662     END IF;
663     x_return_status := FND_API.g_ret_sts_success;
664 
665     ------------------------ delete ------------------------
666     IF (AMS_DEBUG_HIGH_ON) THEN
667 
668     AMS_Utility_PVT.debug_message (l_full_name || ': Delete');
669     END IF;
670     -- Delete TL data
671     IF l_approval_details_rec.seeded_flag='N'
672     THEN
673        AMS_APPROVAL_DETAILS_PKG.DELETE_ROW (p_approval_detail_id);
674     ELSE
675        IF FND_MSG_PUB.check_msg_level (FND_MSG_PUB.g_msg_lvl_error) THEN
676           FND_MESSAGE.set_name ('AMS', 'AMS_API_SEED_DATA');
677           FND_MSG_PUB.add;
678           RAISE FND_API.g_exc_error;
679        END IF;
680     END IF;
681     -------------------- finish --------------------------
682     IF FND_API.to_boolean (p_commit) THEN
683        COMMIT;
684     END IF;
685     FND_MSG_PUB.count_and_get (
686        p_encoded => FND_API.g_false,
687        p_count   => x_msg_count,
688        p_data    => x_msg_data
689     );
690     IF (AMS_DEBUG_HIGH_ON) THEN
691 
692     AMS_Utility_PVT.debug_message (l_full_name || ': End');
693     END IF;
694 
695 EXCEPTION
696    WHEN FND_API.g_exc_error THEN
697      ROLLBACK TO Delete_approval_details;
698      x_return_status := FND_API.g_ret_sts_error;
699      FND_MSG_PUB.count_and_get (
700      p_encoded => FND_API.g_false,
701      p_count   => x_msg_count,
702      p_data    => x_msg_data
703      );
704 
705    WHEN FND_API.g_exc_unexpected_error THEN
706      ROLLBACK TO Delete_approval_details;
707      x_return_status := FND_API.g_ret_sts_unexp_error ;
708      FND_MSG_PUB.count_and_get (
709         p_encoded => FND_API.g_false,
710         p_count   => x_msg_count,
711         p_data    => x_msg_data
712      );
713 
714    WHEN OTHERS THEN
715 	ROLLBACK TO Delete_approval_details;
716 	x_return_status := FND_API.g_ret_sts_unexp_error ;
717 	IF FND_MSG_PUB.check_msg_level (FND_MSG_PUB.g_msg_lvl_unexp_error)
718 	THEN
719 	   FND_MSG_PUB.add_exc_msg (g_pkg_name, l_api_name);
720 	END IF;
721 	FND_MSG_PUB.count_and_get (
722 	   p_encoded => FND_API.g_false,
723 	   p_count   => x_msg_count,
724 	   p_data    => x_msg_data
725 	);
726 END Delete_approval_details;
727 
728 --------------------------------------------------------------------
729 -- PROCEDURE
730 --    Lock_approval_details
731 --
732 -- PURPOSE
733 --    Lock a approval details entry.
734 --
735 -- PARAMETERS
736 --    p_approval_detail_id: the approval_detail
737 --    p_object_version: the object_version_number
738 --
739 -- ISSUES
740 --
741 -- NOTES
742 --    1. Raise exception if the object_version_number doesn't match.
743 --------------------------------------------------------------------
744 PROCEDURE Lock_approval_details (
745    p_api_version       IN  NUMBER,
746    p_init_msg_list     IN  VARCHAR2  := FND_API.g_false,
747    p_commit            IN  VARCHAR2  := FND_API.g_false,
748    p_validation_level  IN  NUMBER    := FND_API.g_valid_level_full,
749 
750    x_return_status     OUT NOCOPY VARCHAR2,
751    x_msg_count         OUT NOCOPY NUMBER,
752    x_msg_data          OUT NOCOPY VARCHAR2,
753 
754    p_approval_detail_id          IN  NUMBER,
755    p_object_version    IN  NUMBER
756 ) IS
757 BEGIN
758    NULL;
759 END;
760 
761 --------------------------------------------------------------------
762 -- PROCEDURE
763 --    Validate_approval_details
764 --
765 -- PURPOSE
766 --    Validate a approval_details entry.
767 --
768 -- PARAMETERS
769 --    p_approval_details_rec: the record representing AMS_APPROVAL_DETAILS_VL (without ROW_ID).
770 --
771 -- NOTES
772 --    1. p_approval_details_rec should be the complete approval_details record.
773 --       There should not be any FND_API.g_miss_char/num/date in it.
774 --    2. If FND_API.g_miss_char/num/date is in the record, then raise
775 --       an exception, as those values are not handled.
776 --------------------------------------------------------------------
777 PROCEDURE Validate_approval_details (
778    p_api_version       IN  NUMBER,
779    p_init_msg_list     IN  VARCHAR2  := FND_API.g_false,
780    p_commit            IN  VARCHAR2  := FND_API.g_false,
781    p_validation_level  IN  NUMBER    := FND_API.g_valid_level_full,
782 
783    x_return_status     OUT NOCOPY VARCHAR2,
784    x_msg_count         OUT NOCOPY NUMBER,
785    x_msg_data          OUT NOCOPY VARCHAR2,
786 
787    p_approval_details_rec         IN  approval_details_rec_type
788 ) IS
789    L_API_VERSION CONSTANT NUMBER := 1.0;
790    L_API_NAME    CONSTANT VARCHAR2(30) := 'Validate_approval_details';
791    L_FULL_NAME   CONSTANT VARCHAR2(60) := G_PKG_NAME || '.' || L_API_NAME;
792    l_return_status   VARCHAR2(1);
793 
794 BEGIN
795 
796    --------------------- initialize -----------------------
797    IF (AMS_DEBUG_HIGH_ON) THEN
798 
799    AMS_Utility_PVT.debug_message (l_full_name || ': Start');
800    END IF;
801    IF FND_API.to_boolean (p_init_msg_list) THEN
802       FND_MSG_PUB.initialize;
803    END IF;
804    IF NOT FND_API.compatible_api_call (
805       l_api_version,
806       p_api_version,
807       l_api_name,
808       g_pkg_name
809    ) THEN
810       RAISE FND_API.g_exc_unexpected_error;
811    END IF;
812    x_return_status := FND_API.g_ret_sts_success;
813 
814    ---------------------- validate ------------------------
815    IF (AMS_DEBUG_HIGH_ON) THEN
816 
817    AMS_Utility_PVT.debug_message (l_full_name || ': Check items');
818    END IF;
819    IF p_validation_level >= JTF_PLSQL_API.g_valid_level_item THEN
820          Check_Approval_details_Items (
821          p_approval_details_rec => p_approval_details_rec,
822          p_validation_mode    => JTF_PLSQL_API.g_create,
823          x_return_status      => l_return_status
824       );
825       IF l_return_status = FND_API.g_ret_sts_unexp_error THEN
826          RAISE FND_API.g_exc_unexpected_error;
827       ELSIF l_return_status = FND_API.g_ret_sts_error THEN
828          RAISE FND_API.g_exc_error;
829       END IF;
830    END IF;
831    IF (AMS_DEBUG_HIGH_ON) THEN
832 
833    AMS_Utility_PVT.debug_message (l_full_name || ': Check record');
834    END IF;
835    IF p_validation_level >= JTF_PLSQL_API.g_valid_level_record THEN
836       Check_Approval_details_Record (
837          p_approval_details_rec => p_approval_details_rec,
838          p_complete_rec    => NULL,
839          x_return_status   => l_return_status
840       );
841       IF l_return_status = FND_API.g_ret_sts_unexp_error THEN
842          RAISE FND_API.g_exc_unexpected_error;
843       ELSIF l_return_status = FND_API.g_ret_sts_error THEN
844          RAISE FND_API.g_exc_error;
845       END IF;
846    END IF;
847    -----------------check the start date <= end date ------
848 
849    -------------------- finish --------------------------
850    FND_MSG_PUB.count_and_get (
851       p_encoded => FND_API.g_false,
852       p_count   => x_msg_count,
853       p_data    => x_msg_data
854    );
855    IF (AMS_DEBUG_HIGH_ON) THEN
856 
857    AMS_Utility_PVT.debug_message (l_full_name || ': End');
858    END IF;
859 EXCEPTION
860    WHEN FND_API.g_exc_error THEN
861    x_return_status := FND_API.g_ret_sts_error;
862    FND_MSG_PUB.count_and_get (
863       p_encoded => FND_API.g_false,
864       p_count   => x_msg_count,
865       p_data    => x_msg_data
866    );
867    WHEN FND_API.g_exc_unexpected_error THEN
868    x_return_status := FND_API.g_ret_sts_unexp_error ;
869    FND_MSG_PUB.count_and_get (
870    p_encoded => FND_API.g_false,
871    p_count   => x_msg_count,
872    p_data    => x_msg_data
873    );
874    WHEN OTHERS THEN
875    x_return_status := FND_API.g_ret_sts_unexp_error;
876    IF FND_MSG_PUB.check_msg_level (FND_MSG_PUB.g_msg_lvl_unexp_error)
877    THEN
878    FND_MSG_PUB.add_exc_msg (g_pkg_name, l_api_name);
879    END IF;
880    FND_MSG_PUB.count_and_get (
881    p_encoded => FND_API.g_false,
882    p_count   => x_msg_count,
883    p_data    => x_msg_data
884    );
885 
886 END Validate_approval_details;
887 
888 ---------------------------------------------------------------------
889 -- PROCEDURE
890 --    Check_approval_details_Items
891 --
892 -- PURPOSE
893 --    Perform the item level checking including unique keys,
894 --    required columns, foreign keys, domain constraints.
895 --
896 -- PARAMETERS
897 --    p_approval_details_rec: the record to be validated
898 --    p_validation_mode: JTF_PLSQL_API.g_create/g_update
899 ---------------------------------------------------------------------
900 PROCEDURE Check_approval_details_Items (
901    p_approval_details_rec       IN  approval_details_Rec_Type,
902    p_validation_mode IN  VARCHAR2 := JTF_PLSQL_API.g_create,
903    x_return_status   OUT NOCOPY VARCHAR2
904 ) IS
905 BEGIN
906    --
907    IF (AMS_DEBUG_HIGH_ON) THEN
908 
909    AMS_Utility_PVT.debug_message ('Inside Check_approval_details_Items0');
910    END IF;
911 
912    --IF p_validation_mode = JTF_PLSQL_API.g_create THEN --VMODUR 24-Jul-2002
913    --- some logic
914      If (p_approval_details_rec.start_date_active > p_approval_details_rec.end_date_active) THEN
915 	    --dbms_output.put_line('st > ed ');
916         IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
917            FND_MESSAGE.set_name('AMS', 'AMS_APPR_DTL_SD_BFR_ED');
918            FND_MSG_PUB.add;
919            x_return_status := FND_API.g_ret_sts_error;
920            RETURN;
921         END IF;
922      END IF;
923 
924      If (p_approval_details_rec.approval_type = 'BUDGET' )THEN
925       -- if (p_approval_details_rec.approval_object = 'CSCH') THEN -- R12
926        --  if Is_Usage_Lite(p_approval_details_rec.custom_setup_id) = FND_API.g_false THEN -- R12
927     	    if((p_approval_details_rec.approval_limit_from is NULL
928 		  or p_approval_details_rec.approval_limit_from = FND_API.g_miss_num)
929 		  AND(p_approval_details_rec.approval_limit_to is NULL
930 		  OR p_approval_details_rec.approval_limit_to = FND_API.g_miss_num))THEN
931 	        -- dbms_output.put_line('AMS_APPR_BGT_NO_MIN_AMT');
932                  IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
933                    FND_MESSAGE.set_name('AMS', 'AMS_APPR_BGT_NO_MIN_AMT');
934                    FND_MSG_PUB.add;
935                    x_return_status := FND_API.g_ret_sts_error;
936                  RETURN;
937                  END IF;
938             END IF;
939 	--  END IF;
940        -- END IF;
941      END IF;
942 
943      IF (AMS_DEBUG_HIGH_ON) THEN
944 
945 
946 
947      AMS_Utility_PVT.debug_message ('Checking for the -ve max amounts');
948 
949      END IF;
950      -- For Claims, negative max amount is OK
951      If (p_approval_details_rec.approval_limit_to  IS NOT NULL
952 	    AND p_approval_details_rec.approval_limit_to <> FND_API.g_miss_num
953        AND p_approval_details_rec.approval_limit_to < 0
954             AND p_approval_details_rec.approval_object <> 'CLAM')
955 	  THEN
956         IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
957          --  FND_MESSAGE.set_name('AMS', 'AMS_APPR_DTL_NO_CURR');
958 	   FND_MESSAGE.set_name('AMS', 'AMS_APPR_DTL_MAX_AMT_LS_ZERO');
959            FND_MSG_PUB.add;
960            x_return_status := FND_API.g_ret_sts_error;
961            RETURN;
962         END IF;
963      END IF;
964 
965      IF (AMS_DEBUG_HIGH_ON) THEN
966 
967 
968 
969      AMS_Utility_PVT.debug_message ('Checking for the -ve min amounts');
970 
971      END IF;
972      -- For Claims, negative min amount is OK
973      If (p_approval_details_rec.approval_limit_from  IS NOT NULL
974 	    AND p_approval_details_rec.approval_limit_from <> FND_API.g_miss_num
975        AND p_approval_details_rec.approval_limit_from < 0
976             AND p_approval_details_rec.approval_object <> 'CLAM')
977 	  THEN
978         IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
979            FND_MESSAGE.set_name('AMS', 'AMS_APPR_DTL_MIN_AMT_LS_ZERO');
980 	      --dbms_output.put_line('AMS_APPR_DTL_MIN_AMT_LS_ZERO');
981            FND_MSG_PUB.add;
982            x_return_status := FND_API.g_ret_sts_error;
983            RETURN;
984         END IF;
985      END IF;
986 
987      IF (AMS_DEBUG_HIGH_ON) THEN
988 
989 
990 
991      AMS_Utility_PVT.debug_message ('Inside Check_approval_details_Items1');
992 
993      END IF;
994      If (p_approval_details_rec.approval_limit_from >= p_approval_details_rec.approval_limit_to) THEN
995 	      --dbms_output.put_line('AMS_APPR_MIN_MAX_AMT_ERR');
996         IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
997            FND_MESSAGE.set_name('AMS', 'AMS_APPR_MIN_MAX_AMT_ERR');
998            FND_MSG_PUB.add;
999            x_return_status := FND_API.g_ret_sts_error;
1000            RETURN;
1001         END IF;
1002      END IF;
1003 
1004      IF (AMS_DEBUG_HIGH_ON) THEN
1005 
1006 
1007 
1008      AMS_Utility_PVT.debug_message ('Inside Check_approval_details_Items2');
1009 
1010      END IF;
1011      If (((p_approval_details_rec.approval_limit_to  IS NOT NULL
1012 	    AND p_approval_details_rec.approval_limit_to <> FND_API.g_miss_num)
1013 	    OR (p_approval_details_rec.approval_limit_from IS NOT NULL
1014 	    AND p_approval_details_rec.approval_limit_from <> FND_API.g_miss_num))
1015 	    AND (p_approval_details_rec.currency_code is NULL
1016 		 OR p_approval_details_rec.currency_code = FND_API.g_miss_char)) THEN
1017 	      --dbms_output.put_line('AMS_APPR_DTL_NO_CURR');
1018         IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
1019            FND_MESSAGE.set_name('AMS', 'AMS_APPR_DTL_NO_CURR');
1020            FND_MSG_PUB.add;
1021            x_return_status := FND_API.g_ret_sts_error;
1022            RETURN;
1023         END IF;
1024      END IF;
1025   --END IF; -- VMODUR 24-Jul-2002
1026 
1027 
1028    --- some logic
1029    IF (AMS_DEBUG_HIGH_ON) THEN
1030 
1031    AMS_Utility_PVT.debug_message ('Inside Check_approval_details_Items3');
1032    END IF;
1033    -- Validate required items.
1034    Check_approval_dtls_Req_Items (
1035       p_approval_details_rec       => p_approval_details_rec,
1036       x_return_status   => x_return_status
1037    );
1038    IF x_return_status <> FND_API.g_ret_sts_success THEN
1039       RETURN;
1040    END IF;
1041    --
1042    IF (AMS_DEBUG_HIGH_ON) THEN
1043 
1044    AMS_Utility_PVT.debug_message ('Inside Check_approval_details_Items4');
1045    END IF;
1046    -- Validate uniqueness.
1047    Check_approval_dtls_UK_Items (
1048       p_approval_details_rec          => p_approval_details_rec,
1049       p_validation_mode    => p_validation_mode,
1050       x_return_status      => x_return_status
1051    );
1052    IF x_return_status <> FND_API.g_ret_sts_success THEN
1053 
1054       RETURN;
1055    END IF;
1056    IF (AMS_DEBUG_HIGH_ON) THEN
1057 
1058    AMS_Utility_PVT.debug_message ('Inside Check_approval_details_Items6');
1059    END IF;
1060 /*   Check_approval_dtls_FK_Items(
1061       p_approval_details_rec       => p_approval_details_rec,
1062       x_return_status   => x_return_status
1063    );
1064 
1065    IF x_return_status <> FND_API.g_ret_sts_success THEN
1066       RETURN;
1067    END IF;
1068    */
1069    IF (AMS_DEBUG_HIGH_ON) THEN
1070 
1071    AMS_Utility_PVT.debug_message ('Inside Check_approval_details_Items7');
1072    END IF;
1073    Check_approval_dtls_Lkup_Items (
1074       p_approval_details_rec          => p_approval_details_rec,
1075       x_return_status      => x_return_status
1076    );
1077    IF x_return_status <> FND_API.g_ret_sts_success THEN
1078       RETURN;
1079    END IF;
1080    IF (AMS_DEBUG_HIGH_ON) THEN
1081 
1082    AMS_Utility_PVT.debug_message ('Inside Check_approval_details_Items8');
1083    END IF;
1084    Check_approval_dtls_Flag_Items(
1085       p_approval_details_rec       => p_approval_details_rec,
1086       x_return_status   => x_return_status
1087    );
1088    IF x_return_status <> FND_API.g_ret_sts_success THEN
1089       RETURN;
1090    END IF;
1091   /*
1092    --- some logic
1093    IF (AMS_DEBUG_HIGH_ON) THEN
1094 
1095    AMS_Utility_PVT.debug_message ('Inside Check_approval_details_Items9');
1096    END IF;
1097    If (p_approval_details_rec.start_date_active > p_approval_details_rec.end_date_active) THEN
1098 	    --dbms_output.put_line('st > ed ');
1099       IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
1100          FND_MESSAGE.set_name('AMS', 'AMS_APPR_DTL_SD_BFR_ED');
1101          FND_MSG_PUB.add;
1102          x_return_status := FND_API.g_ret_sts_error;
1103          RETURN;
1104       END IF;
1105    END IF;
1106 IF (AMS_DEBUG_HIGH_ON) THEN
1107 
1108 AMS_Utility_PVT.debug_message ('Inside Check_approval_details_Items10');
1109 END IF;
1110    If (p_approval_details_rec.approval_type = 'BUDGET' )THEN
1111 	 if((p_approval_details_rec.approval_limit_from is NULL
1112 		or p_approval_details_rec.approval_limit_from = FND_API.g_miss_num)
1113 		AND(p_approval_details_rec.approval_limit_to is NULL
1114 		OR p_approval_details_rec.approval_limit_to = FND_API.g_miss_num))THEN
1115 	      -- dbms_output.put_line('AMS_APPR_BGT_NO_MIN_AMT');
1116          IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
1117             FND_MESSAGE.set_name('AMS', 'AMS_APPR_BGT_NO_MIN_AMT');
1118             FND_MSG_PUB.add;
1119             x_return_status := FND_API.g_ret_sts_error;
1120             RETURN;
1121          END IF;
1122       END IF;
1123    END IF;
1124 IF (AMS_DEBUG_HIGH_ON) THEN
1125 
1126 AMS_Utility_PVT.debug_message ('Inside Check_approval_details_Items11');
1127 END IF;
1128    If (p_approval_details_rec.approval_limit_from >= p_approval_details_rec.approval_limit_to) THEN
1129 	    --dbms_output.put_line('AMS_APPR_MIN_MAX_AMT_ERR');
1130       IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
1131          FND_MESSAGE.set_name('AMS', 'AMS_APPR_MIN_MAX_AMT_ERR');
1132          FND_MSG_PUB.add;
1133          x_return_status := FND_API.g_ret_sts_error;
1134          RETURN;
1135       END IF;
1136    END IF;
1137 IF (AMS_DEBUG_HIGH_ON) THEN
1138 
1139 AMS_Utility_PVT.debug_message ('Inside Check_approval_details_Items12');
1140 END IF;
1141    If (((p_approval_details_rec.approval_limit_to  IS NOT NULL
1142 	  AND p_approval_details_rec.approval_limit_to <> FND_API.g_miss_num)
1143 	  OR (p_approval_details_rec.approval_limit_from IS NOT NULL
1144 	  AND p_approval_details_rec.approval_limit_from <> FND_API.g_miss_num))
1145 	  AND (p_approval_details_rec.currency_code is NULL
1146 		 OR p_approval_details_rec.currency_code = FND_API.g_miss_char)) THEN
1147 	    --dbms_output.put_line('AMS_APPR_DTL_NO_CURR');
1148       IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
1149          FND_MESSAGE.set_name('AMS', 'AMS_APPR_DTL_NO_CURR');
1150          FND_MSG_PUB.add;
1151          x_return_status := FND_API.g_ret_sts_error;
1152          RETURN;
1153       END IF;
1154    END IF;
1155   */
1156 END Check_approval_details_Items;
1157 
1158 ---------------------------------------------------------------------
1159 -- PROCEDURE
1160 --    Check_approval_details_Record
1161 --
1162 -- PURPOSE
1163 --    Check the record level business rules.
1164 --
1165 -- PARAMETERS
1166 --    p_approval_details_rec: the record to be validated; may contain attributes
1167 --       as FND_API.g_miss_char/num/date
1168 --    p_complete_rec: the complete record after all "g_miss" items
1169 --       have been replaced by current database values
1170 ---------------------------------------------------------------------
1171 PROCEDURE Check_approval_details_Record (
1172    p_approval_details_rec        IN  approval_details_Rec_Type,
1173    p_complete_rec     IN  approval_details_Rec_Type := NULL,
1174    x_return_status    OUT NOCOPY VARCHAR2
1175 ) IS
1176      l_start_date_active      DATE;
1177 	l_end_date_active        DATE;
1178 BEGIN
1179    --
1180    -- Use local vars to reduce amount of typing.
1181    if p_complete_rec.start_date_active IS NOT NULL then
1182       l_start_date_active := p_complete_rec.start_date_active;
1183    else
1184       if p_approval_details_rec.start_date_active is NOT NULL AND
1185          p_approval_details_rec.start_date_active <> FND_API.g_miss_date then
1186           l_start_date_active := p_approval_details_rec.start_date_active;
1187       end if;
1188    end if;
1189    if p_complete_rec.end_date_active IS NOT NULL then
1190        l_end_date_active := p_complete_rec.end_date_active;
1191    else
1192       if p_approval_details_rec.end_date_active is NOT NULL AND
1193          p_approval_details_rec.end_date_active <> FND_API.g_miss_date then
1194           l_end_date_active := p_approval_details_rec.end_date_active;
1195       end if;
1196    end if;
1197    x_return_status := FND_API.G_RET_STS_SUCCESS;
1198    IF l_start_date_active IS NOT NULL AND l_end_date_active IS NOT NULL THEN
1199      IF l_start_date_active > l_end_date_active THEN
1200         IF FND_MSG_PUB.check_msg_level (FND_MSG_PUB.g_msg_lvl_error) THEN
1201            FND_MESSAGE.set_name ('AMS', 'AMS_STATUS_FROMDT_GTR_TODT');
1202            FND_MSG_PUB.add;
1203         END IF;
1204         x_return_status := FND_API.g_ret_sts_error;
1205         RETURN;
1206      END IF;
1207    END IF;
1208 END Check_approval_details_Record;
1209 ---------------------------------------------------------------------
1210 -- PROCEDURE
1211 --    Init_approval_details_Rec
1212 --
1213 -- PURPOSE
1214 --    Initialize all attributes to be FND_API.g_miss_char/num/date.
1215 ---------------------------------------------------------------------
1216 PROCEDURE Init_approval_details_Rec (
1217    x_approval_details_rec         OUT NOCOPY  approval_details_Rec_Type
1218 ) IS
1219 BEGIN
1220       x_approval_details_rec.approval_detail_id := FND_API.g_miss_num;
1221       x_approval_details_rec.start_date_active := FND_API.g_miss_date;
1222       x_approval_details_rec.end_date_active := FND_API.g_miss_date;
1223       x_approval_details_rec.object_version_number := FND_API.g_miss_num;
1224       --x_approval_details_rec.security_group_id := FND_API.g_miss_num;
1225       x_approval_details_rec.business_group_id := FND_API.g_miss_num;
1226       x_approval_details_rec.business_unit_id := FND_API.g_miss_num;
1227       x_approval_details_rec.organization_id := FND_API.g_miss_num;
1228       x_approval_details_rec.custom_setup_id := FND_API.g_miss_num;
1229       x_approval_details_rec.approval_object := FND_API.g_miss_char;
1230       x_approval_details_rec.approval_object_type := FND_API.g_miss_char;
1231       x_approval_details_rec.approval_type := FND_API.g_miss_char;
1232       x_approval_details_rec.approval_priority := FND_API.g_miss_char;
1233       x_approval_details_rec.approval_limit_to := FND_API.g_miss_num;
1234       x_approval_details_rec.approval_limit_from := FND_API.g_miss_num;
1235       x_approval_details_rec.seeded_flag := FND_API.g_miss_char;
1236       x_approval_details_rec.active_flag := FND_API.g_miss_char;
1237       x_approval_details_rec.currency_code := FND_API.g_miss_char;
1238       x_approval_details_rec.user_country_code := FND_API.g_miss_char;
1239       x_approval_details_rec.name := FND_API.g_miss_char;
1240       x_approval_details_rec.description := FND_API.g_miss_char;
1241 END;
1242 
1243 ---------------------------------------------------------------------
1244 -- PROCEDURE
1245 --    Complete_approval_details_Rec
1246 --
1247 -- PURPOSE
1248 --    For Update_approval_details, some attributes may be passed in as
1249 --    FND_API.g_miss_char/num/date if the user doesn't want to
1250 --    update those attributes. This procedure will replace the
1251 --    "g_miss" attributes with current database values.
1252 --
1253 -- PARAMETERS
1254 --    p_approval_details_rec: the record which may contain attributes as
1255 --       FND_API.g_miss_char/num/date
1256 --    x_complete_rec: the complete record after all "g_miss" items
1257 --       have been replaced by current database values
1258 --    Changes have been made as g_miss_xxxx is no longer used
1259 ---------------------------------------------------------------------
1260 PROCEDURE Complete_approval_details_Rec (
1261    p_approval_details_rec      IN  approval_details_Rec_Type,
1262    x_complete_rec   OUT NOCOPY approval_details_Rec_Type
1263 ) IS
1264    CURSOR c_approval_details IS
1265    SELECT   *
1266    FROM     ams_approval_details_vl
1267    WHERE    approval_detail_id = p_approval_details_rec.approval_detail_id;
1268    --
1269    -- This is the only exception for using %ROWTYPE.
1270    -- We are selecting from the VL view, which may
1271    -- have some denormalized columns as compared to
1272    -- the base tables.
1273    l_approval_details_rec    c_approval_details%ROWTYPE;
1274 BEGIN
1275    x_complete_rec := p_approval_details_rec;
1276    OPEN c_approval_details;
1277    FETCH c_approval_details INTO l_approval_details_rec;
1278    IF c_approval_details%NOTFOUND THEN
1279       CLOSE c_approval_details;
1280       IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
1281          FND_MESSAGE.set_name('AMS', 'AMS_API_RECORD_NOT_FOUND');
1282          FND_MSG_PUB.add;
1283       END IF;
1284       RAISE FND_API.g_exc_error;
1285    END IF;
1286    CLOSE c_approval_details;
1287    --
1288       If p_approval_details_rec.approval_detail_id is null THEN
1289          x_complete_rec.approval_detail_id := l_approval_details_rec.approval_detail_id;
1290       END IF;
1291       -- Don't fill in dates as they can be null
1292 /*
1293       IF p_approval_details_rec.start_date_active is null THEN
1294          x_complete_rec.start_date_active := l_approval_details_rec.start_date_active;
1295       END IF;
1296 
1297       IF p_approval_details_rec.end_date_active is null THEN
1298          x_complete_rec.end_date_active := l_approval_details_rec.end_date_active;
1299       END IF;
1300 */
1301       IF p_approval_details_rec.object_version_number is null THEN
1302          x_complete_rec.object_version_number := l_approval_details_rec.object_version_number;
1303       END IF;
1304 
1305 /*    IF p_approval_details_rec.security_group_id is null THEN
1306          x_complete_rec.security_group_id := l_approval_details_rec.security_group_id;
1307       END IF;
1308 */
1309 
1310       IF p_approval_details_rec.business_group_id is null THEN
1311          x_complete_rec.business_group_id := l_approval_details_rec.business_group_id;
1312       END IF;
1313 
1314       IF p_approval_details_rec.business_unit_id is null THEN
1315          x_complete_rec.business_unit_id := l_approval_details_rec.business_unit_id;
1316       END IF;
1317 
1318       IF p_approval_details_rec.organization_id is null THEN
1319          x_complete_rec.organization_id := l_approval_details_rec.organization_id;
1320       END IF;
1321 
1322       IF p_approval_details_rec.custom_setup_id is null THEN
1323          x_complete_rec.custom_setup_id := l_approval_details_rec.custom_setup_id;
1324       END IF;
1325 
1326       IF p_approval_details_rec.approval_object is null THEN
1327          x_complete_rec.approval_object := l_approval_details_rec.approval_object;
1328       END IF;
1329 
1330       IF p_approval_details_rec.approval_object_type is null THEN
1331          x_complete_rec.approval_object_type := l_approval_details_rec.approval_object_type;
1332       END IF;
1333 
1334       IF p_approval_details_rec.approval_type is null THEN
1335          x_complete_rec.approval_type := l_approval_details_rec.approval_type;
1336       END IF;
1337 
1338       IF p_approval_details_rec.approval_priority is null THEN
1339          x_complete_rec.approval_priority := l_approval_details_rec.approval_priority;
1340       END IF;
1341       -- Limits can be null
1342 /*
1343       IF p_approval_details_rec.approval_limit_to is null THEN
1344          x_complete_rec.approval_limit_to := l_approval_details_rec.approval_limit_to;
1345       END IF;
1346 
1347       IF p_approval_details_rec.approval_limit_from is null THEN
1348          x_complete_rec.approval_limit_from := l_approval_details_rec.approval_limit_from;
1349       END IF;
1350 */
1351       IF p_approval_details_rec.seeded_flag is null THEN
1352          x_complete_rec.seeded_flag := l_approval_details_rec.seeded_flag;
1353       END IF;
1354 
1355       IF p_approval_details_rec.active_flag is null THEN
1356          x_complete_rec.active_flag := l_approval_details_rec.active_flag;
1357       END IF;
1358 
1359       IF p_approval_details_rec.currency_code is null THEN
1360          x_complete_rec.currency_code := l_approval_details_rec.currency_code;
1361       END IF;
1362       /*
1363       IF p_approval_details_rec.user_country_code is null THEN
1364          x_complete_rec.user_country_code := l_approval_details_rec.user_country_code;
1365       END IF;
1366       */
1367 
1368       IF p_approval_details_rec.name is null THEN
1369          x_complete_rec.name := l_approval_details_rec.name;
1370       END IF;
1371       -- Description can be null
1372 --    Bug 3737174
1373 /*
1374       IF p_approval_details_rec.description is null THEN
1375          x_complete_rec.description := l_approval_details_rec.description;
1376       END IF;
1377 */
1378 END Complete_approval_details_Rec;
1379 
1380 ---------------------------------------------------------
1381 --  Function Compare Columns
1382 -- added sugupta 05/22/2000
1383 -- this procedure will compare that no values have been modified for seeded statuses
1384 -----------------------------------------------------------------
1385 FUNCTION compare_columns(
1386    p_approval_details_rec         in  approval_details_Rec_Type
1387 )
1388 RETURN VARCHAR2
1389 IS
1390   l_count NUMBER := 0;
1391 
1392 BEGIN
1393 IF (AMS_DEBUG_HIGH_ON) THEN
1394 
1395 AMS_UTILITY_PVT.DEBUG_MESSAGE('sTART DATE:'|| to_char( p_approval_details_rec.start_date_active,'DD_MON_YYYY'));
1396 END IF;
1397 IF (AMS_DEBUG_HIGH_ON) THEN
1398 
1399 AMS_UTILITY_PVT.DEBUG_MESSAGE('end DATE:'|| to_char( p_approval_details_rec.end_Date_active,'DD-MON-YYYY'));
1400 END IF;
1401 
1402 	if p_approval_details_rec.start_date_active is NOT NULL then
1403         if p_approval_details_rec.end_Date_active is NOT NULL then
1404            BEGIN
1405 	        select 1 into l_count
1406 		   from AMS_APPROVAL_DETAILS_VL
1407 		   where approval_detail_id =p_approval_details_rec.approval_detail_id
1408 		   and name =  p_approval_details_rec.name
1409 		   and description =  p_approval_details_rec.description
1410 		   and start_date_active = p_approval_details_rec.start_date_active
1411 		   and end_date_active = p_approval_details_rec.end_Date_active
1412 		  -- and security_group_id = p_approval_details_rec.security_group_id
1413 		   and business_group_id = p_approval_details_rec.business_group_id
1414 		   and user_country_code = p_approval_details_rec.user_country_code
1415 		   and organization_id = p_approval_details_rec.organization_id
1416 		   and custom_setup_id = p_approval_details_rec.custom_setup_id
1417 		   and approval_object = p_approval_details_rec.approval_object
1418 		   and approval_object_type = p_approval_details_rec.approval_object_type
1419 		   and approval_type = p_approval_details_rec.approval_type
1420 		   and approval_priority = p_approval_details_rec.approval_priority
1421 		   and approval_limit_to = p_approval_details_rec.approval_limit_to
1422 		   and approval_limit_from = p_approval_details_rec.approval_limit_from
1423 		   and seeded_flag = 'Y'
1424 		   and active_flag = 'Y'
1425 		   and currency_code = p_approval_details_rec.currency_code;
1426 		 EXCEPTION
1427 		   WHEN NO_DATA_FOUND THEN
1428 		   l_count := 0;
1429 	      END;
1430 	   else -- for end date
1431 		BEGIN
1432 		   select 1 into l_count
1433 		   from AMS_APPROVAL_DETAILS_VL
1434 		   where approval_detail_id =p_approval_details_rec.approval_detail_id
1435 		   and name =  p_approval_details_rec.name
1436 		   and description =  p_approval_details_rec.description
1437 		   and start_date_active = p_approval_details_rec.start_date_active
1438 		   and end_date_active = p_approval_details_rec.end_Date_active
1439 		   -- and security_group_id = p_approval_details_rec.security_group_id
1440 		   and business_group_id = p_approval_details_rec.business_group_id
1441 		   and user_country_code = p_approval_details_rec.user_country_code
1442 		   and organization_id = p_approval_details_rec.organization_id
1443 		   and custom_setup_id = p_approval_details_rec.custom_setup_id
1444 		   and approval_object = p_approval_details_rec.approval_object
1445 		   and approval_object_type = p_approval_details_rec.approval_object_type
1446 		   and approval_type = p_approval_details_rec.approval_type
1447 		   and approval_priority = p_approval_details_rec.approval_priority
1448 		   and approval_limit_to = p_approval_details_rec.approval_limit_to
1449 		   and approval_limit_from = p_approval_details_rec.approval_limit_from
1450 		   and seeded_flag = 'Y'
1451 		   and active_flag = 'Y'
1452 		   and currency_code = p_approval_details_rec.currency_code;
1453 		EXCEPTION
1454 		   WHEN NO_DATA_FOUND THEN
1455 		   l_count := 0;
1456 		END;
1457 	   end if; -- for end date
1458 	else
1459 	   BEGIN
1460 	      select 1 into l_count
1461 		 from AMS_APPROVAL_DETAILS_VL
1462 		 where approval_detail_id =p_approval_details_rec.approval_detail_id
1463 		 and name =  p_approval_details_rec.name
1464 		 and description =  p_approval_details_rec.description
1465 		 and start_date_active = p_approval_details_rec.start_date_active
1466 		 and end_date_active = p_approval_details_rec.end_Date_active
1467 		-- and security_group_id = p_approval_details_rec.security_group_id
1468 		 and business_group_id = p_approval_details_rec.business_group_id
1469 		 and user_country_code = p_approval_details_rec.user_country_code
1470 		 and organization_id = p_approval_details_rec.organization_id
1471 		 and custom_setup_id = p_approval_details_rec.custom_setup_id
1472 		 and approval_object = p_approval_details_rec.approval_object
1473 		 and approval_object_type =p_approval_details_rec.approval_object_type
1474 		 and approval_type = p_approval_details_rec.approval_type
1475 		 and approval_priority = p_approval_details_rec.approval_priority
1476 		 and approval_limit_to = p_approval_details_rec.approval_limit_to
1477 		 and approval_limit_from = p_approval_details_rec.approval_limit_from
1478 		 and seeded_flag = 'Y'
1479 		 and active_flag = 'Y'
1480 		 and currency_code = p_approval_details_rec.currency_code;
1481 	   EXCEPTION
1482 		WHEN NO_DATA_FOUND THEN
1483 		l_count := 0;
1484 	   END;
1485 	end if;
1486      IF l_count = 0 THEN
1487         RETURN FND_API.g_false;
1488      ELSE
1489         RETURN FND_API.g_true;
1490      END IF;
1491 END compare_columns;
1492 
1493 ---------------------------------------------------------
1494 --  Function seed_needs_update
1495 -- added sugupta 05/22/2000
1496 -- this procedure will look at enabled flag and determine if update is needed
1497 -----------------------------------------------------------------
1498 FUNCTION seed_needs_update(
1499 	p_approval_details_rec         in  approval_details_Rec_Type
1500 )
1501 RETURN VARCHAR2
1502 IS
1503   l_count NUMBER := 0;
1504 
1505 BEGIN
1506    BEGIN
1507 	select 1 into l_count
1508 	from AMS_APPROVAL_DETAILS
1509 	where approval_detail_id = p_approval_details_rec.approval_detail_id
1510 	and   seeded_flag = 'Y';
1511    EXCEPTION
1512 		WHEN NO_DATA_FOUND THEN
1513 			l_count := 0;
1514    END;
1515 
1516    IF l_count = 0 THEN
1517       RETURN FND_API.g_true;  -- needs update
1518    ELSE
1519       RETURN FND_API.g_false;  -- doesnt need update
1520    END IF;
1521 END seed_needs_update;
1522 
1523 -------------------------------------------------------------
1524 --       Check_Approval_Dtls_Req_Items
1525 -------------------------------------------------------------
1526 PROCEDURE Check_Approval_Dtls_Req_Items (
1527    p_approval_details_rec   IN  Approval_Details_Rec_Type,
1528    x_return_status       OUT NOCOPY   VARCHAR2
1529 ) IS
1530 BEGIN
1531 
1532    IF p_approval_details_rec.name IS NULL THEN
1533       IF FND_MSG_PUB.check_msg_level (FND_MSG_PUB.g_msg_lvl_error) THEN
1534          FND_MESSAGE.set_name ('AMS', 'AMS_STATUS_NO_NAME');
1535          FND_MSG_PUB.add;
1536       END IF;
1537       x_return_status := FND_API.g_ret_sts_error;
1538       RETURN;
1539    END IF;
1540 
1541 END;
1542 -------------------------------------------------------------
1543 --       Check_Approval_Dtls_UK_Items
1544 -------------------------------------------------------------
1545 PROCEDURE Check_Approval_Dtls_UK_Items (
1546    p_approval_details_rec   IN  Approval_Details_Rec_Type,
1547    p_validation_mode     IN    VARCHAR2 := JTF_PLSQL_API.g_create,
1548    x_return_status       OUT NOCOPY   VARCHAR2
1549 )IS
1550 
1551    l_valid_flag    VARCHAR2(1);
1552 /*
1553 	l_dummy         NUMBER;
1554 	l_rec   approval_details_Rec_Type;
1555 	l_exists1  NUMBER := 1;
1556 	l_exists2  NUMBER := 1;
1557 
1558 
1559 
1560 	CURSOR c_approval_details(id_in IN NUMBER) IS
1561 	SELECT   *
1562 	FROM     ams_approval_details_vl
1563 	WHERE    approval_detail_id = id_in;
1564 
1565 	cursor c_appr_name1(name_in IN VARCHAR2) IS
1566 	SELECT 1 FROM DUAL WHERE EXISTS (select 1 from AMS_APPROVAL_DETAILS_VL
1567 							   where name = name_in);
1568 
1569 	cursor c_appr_name2(name_in IN VARCHAR2, id_in IN NUMBER) IS
1570 	SELECT 1 FROM DUAL WHERE EXISTS (select 1 from AMS_APPROVAL_DETAILS_VL
1571 							   where name = name_in
1572 								and approval_detail_id = id_in);
1573 
1574 	l_approval_details_rec    c_approval_details%ROWTYPE;
1575 */
1576         cursor c_rule_name(name_in IN VARCHAR2, id_in IN NUMBER) IS
1577 	SELECT '1' FROM DUAL WHERE EXISTS (select 1 from AMS_APPROVAL_DETAILS_VL
1578                                          where name = name_in
1579 					 and approval_detail_id <> id_in);
1580 
1581 BEGIN
1582    IF (AMS_DEBUG_HIGH_ON) THEN
1583 
1584    AMS_UTILITY_PVT.debug_message('Private API:Check_Approval_Dtls_UK_Items');
1585    END IF;
1586    x_return_status := FND_API.G_RET_STS_SUCCESS;
1587 
1588    --Validate unique approval_id
1589    IF p_validation_mode = JTF_PLSQL_API.g_create THEN
1590       l_valid_flag := AMS_Utility_PVT.check_uniqueness(
1591       'ams_approval_details',
1592       'approval_detail_id = ''' || p_approval_details_rec.approval_detail_id ||'''');
1593    ELSE
1594       l_valid_flag := AMS_Utility_PVT.check_uniqueness(
1595       'ams_approval_details',
1596       'approval_detail_id = ''' || p_approval_details_rec.approval_detail_id ||
1597       ''' AND approval_detail_id <> ' || p_approval_details_rec.approval_detail_id);
1598    END IF;
1599 
1600    IF l_valid_flag = FND_API.g_false THEN
1601       IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error)
1602       THEN
1603          FND_MESSAGE.set_name('AMS', 'AMS_APPR_DUPLICATE_ID');
1604          FND_MSG_PUB.add;
1605       END IF;
1606       x_return_status := FND_API.g_ret_sts_error;
1607       RETURN;
1608    END IF;
1609 
1610    --Validate unique apporval rule name
1611    -- Commented due to Bug 2776795 ams_utility_pvt check_uniqueness cannot handle names containing
1612    -- operators like 'AND'
1613    /*
1614 
1615    l_valid_flag := AMS_Utility_PVT.check_uniqueness(
1616       'ams_approval_details_vl',  'NAME = ''' || p_approval_details_rec.name ||
1617       ''' AND approval_detail_id <> ' || NVL(p_approval_details_rec.approval_detail_id,FND_API.G_MISS_NUM));
1618    */
1619 
1620    OPEN c_rule_name(p_approval_details_rec.name,NVL(p_approval_details_rec.approval_detail_id,FND_API.G_MISS_NUM));
1621    FETCH c_rule_name INTO l_valid_flag;
1622    IF c_rule_name%NOTFOUND THEN
1623       NULL;
1624    END IF;
1625    CLOSE c_rule_name;
1626 
1627 
1628    IF l_valid_flag = '1' THEN
1629 
1630       IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
1631          IF (AMS_DEBUG_HIGH_ON) THEN
1632 
1633          AMS_UTILITY_PVT.debug_message('Check_Approval_Dtls_UK_Items: Inside error');
1634          END IF;
1635          FND_MESSAGE.set_name('AMS', 'AMS_DUP_NAME');
1636          FND_MSG_PUB.add;
1637       END IF;
1638       x_return_status := FND_API.g_ret_sts_error;
1639       RETURN;
1640    END IF;
1641 
1642 
1643 /*
1644 	IF p_validation_mode = JTF_PLSQL_API.g_create
1645 	AND p_approval_details_rec.approval_detail_id IS NOT NULL THEN
1646 		OPEN c_appr_name2(P_approval_details_rec.name,P_approval_details_rec.approval_detail_id);
1647 		fetch c_appr_name2 into l_dummy;
1648 		close c_appr_name2;
1649 
1650 		IF l_dummy = 1 THEN
1651 			IF FND_MSG_PUB.check_msg_level (FND_MSG_PUB.g_msg_lvl_error) THEN
1652 				FND_MESSAGE.set_name ('AMS', 'AMS_DUP_NAME');
1653 				FND_MSG_PUB.add;
1654 			END IF;
1655 			x_return_status := FND_API.g_ret_sts_error;
1656 			RETURN;
1657 		END IF;
1658 
1659 	END IF;
1660 
1661 
1662    -- check if NAME is UNIQUE
1663 	IF p_validation_mode = JTF_PLSQL_API.g_create THEN
1664 		OPEN c_appr_name1(P_approval_details_rec.name);
1665 		fetch c_appr_name1 into l_dummy;
1666 		close c_appr_name1;
1667 		IF l_dummy <> 1 THEN
1668 			l_valid_flag := FND_API.g_false;
1669 		END IF;
1670 	ELSE
1671 		OPEN c_appr_name2(P_approval_details_rec.name, P_approval_details_rec.approval_detail_id);
1672 		fetch c_appr_name2 into l_dummy;
1673 		close c_appr_name2;
1674 		IF l_dummy <> 1 THEN
1675 			l_valid_flag := FND_API.g_false;
1676 		END IF;
1677 	END IF;
1678 
1679 
1680 	IF l_valid_flag = FND_API.g_false THEN
1681 		IF FND_MSG_PUB.check_msg_level (FND_MSG_PUB.g_msg_lvl_error) THEN
1682 			FND_MESSAGE.set_name ('AMS', 'AMS_DUP_NAME');
1683 			FND_MSG_PUB.add;
1684 		END IF;
1685 		x_return_status := FND_API.g_ret_sts_error;
1686 		RETURN;
1687 	END IF;
1688 
1689 */
1690     /* Check dates over lap. If Approval Type is Concept, we will check only for Dates overlap. If it is
1691        Budget, we call Amounts Over Lap function with in Dates Overlap function which checks for Budget
1692        Overlap.
1693      */
1694 
1695     IF( Check_Dates_Overlap ( p_approval_details_rec , p_validation_mode)) = FND_API.g_true THEN
1696           RAISE FND_API.g_exc_error;
1697     END IF;
1698 
1699 END Check_Approval_Dtls_UK_Items;
1700 -------------------------------------------------------------
1701 --       Check_Approval_Dtls_FK_Items
1702 -------------------------------------------------------------
1703 PROCEDURE Check_Approval_Dtls_FK_Items (
1704    p_approval_details_rec   IN  Approval_Details_Rec_Type,
1705    x_return_status       OUT NOCOPY   VARCHAR2
1706 )IS
1707    l_lookup_type           varchar2(30);
1708    l_count                 number;
1709    l_meaning               varchar2(80);
1710    l_dummy                 number;
1711 
1712    CURSOR c_get_org(cur_organization_id number,
1713       cur_business_group_id number,
1714       cur_org_type  varchar2) is
1715       SELECT count(1)
1716       FROM hr_organization_units  hou
1717       WHERE hou.organization_id   = cur_organization_id
1718       --AND hou.business_group_id = cur_business_group_id
1719       AND hou.type              = nvl(cur_org_type,hou.type)
1720       AND sysdate between hou.date_from and nvl(hou.date_to,sysdate +1 );
1721 
1722    Cursor c_appr_objt_type_exists(id_in IN NUMBER) IS
1723 	 SELECT 1 FROM   dual
1724 	 WHERE EXISTS (SELECT 1 FROM   ams_categories_b
1725 		                WHERE  enabled_flag = 'Y'
1726 				AND arc_category_created_for = 'FUND'
1727 				AND category_id = id_in);
1728 
1729    cursor c_cust_setup_id_c_exists(id_in IN NUMBER) IS
1730    SELECT 1 from dual
1731    where EXISTS (select 1 FROM ams_custom_setups_b
1732 			   WHERE enabled_flag = 'Y'
1733 			   AND object_type IN ('RCAM','ECAM'));
1734 
1735    cursor c_cust_setup_id_exists(id_in IN NUMBER, p_lookup_code IN VARCHAR2) IS
1736    SELECT 1 from dual
1737    where EXISTS (select 1 FROM ams_custom_setups_b
1738 			   WHERE enabled_flag = 'Y'
1739 			   AND object_type = p_lookup_code);
1740 BEGIN
1741 	x_return_status := FND_API.G_RET_STS_SUCCESS;
1742 	-- check approval_object
1743 	IF (AMS_DEBUG_HIGH_ON) THEN
1744 
1745 	AMS_Utility_PVT.debug_message ('Inside Check_FK__Items0');
1746 	END IF;
1747 	If p_approval_details_rec.approval_object <> FND_API.g_miss_char THEN
1748 		ams_utility_pvt.get_lookup_meaning( 'AMS_APPROVAL_RULE_FOR',
1749 			p_approval_details_rec.approval_object,
1750 			x_return_status,
1751 			l_meaning
1752 		);
1753 		IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1754 			IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
1755 				FND_MESSAGE.set_name('AMS', 'AMS_BAD_APPROVAL_OBJECT_TYPE');
1756 				FND_MSG_PUB.add;
1757 				RETURN;
1758 			END IF;
1759 		END IF;
1760 	END IF;
1761 	IF (AMS_DEBUG_HIGH_ON) THEN
1762 
1763 	AMS_Utility_PVT.debug_message ('Inside Check_FK__Items1');
1764 	END IF;
1765 	If p_approval_details_rec.approval_type <> FND_API.g_miss_char THEN
1766 		ams_utility_pvt.get_lookup_meaning( 'AMS_APPROVAL_TYPE',
1767 			p_approval_details_rec.approval_type,
1768 			x_return_status,
1769 			l_meaning
1770 		);
1771 		IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1772 			IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
1773 				FND_MESSAGE.set_name('AMS', 'AMS_INVALID_APPROVAL_TYPE');
1774 				FND_MSG_PUB.add;
1775 				RETURN;
1776 			END IF;
1777 		END IF;
1778 	END IF;
1779 	IF (AMS_DEBUG_HIGH_ON) THEN
1780 
1781 	AMS_Utility_PVT.debug_message ('Inside Check_FK__Items2');
1782 	END IF;
1783 	If (p_approval_details_rec.approval_object_type <> FND_API.g_miss_char
1784 		AND p_approval_details_rec.approval_object_type IS NOT NULL) THEN
1785 		IF (AMS_DEBUG_HIGH_ON) THEN
1786 
1787 		AMS_Utility_PVT.debug_message ('Inside Check_FK__Items21');
1788 		END IF;
1789 		IF p_approval_details_rec.approval_object = 'FUND' then
1790 			IF (AMS_DEBUG_HIGH_ON) THEN
1791 
1792 			AMS_Utility_PVT.debug_message ('Inside Check_FK__Items22');
1793 			END IF;
1794 			open c_appr_objt_type_exists(to_number(p_approval_details_rec.approval_object_type));
1795 			fetch c_appr_objt_type_exists INTO l_dummy;
1796 			close c_appr_objt_type_exists;
1797 			IF l_dummy <> 1 THEN
1798 				IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
1799 					FND_MESSAGE.set_name('AMS', 'AMS_BAD_APPROVAL_OBJECT_TYPE');
1800 					FND_MSG_PUB.add;
1801 					x_return_status := FND_API.g_ret_sts_error;
1802 					RETURN;
1803 				END IF;
1804 			END IF;
1805 		ELSIF p_approval_details_rec.approval_object = 'CAMP' OR
1806 			p_approval_details_rec.approval_object = 'EVEH'   OR
1807 			p_approval_details_rec.approval_object = 'EONE'   OR
1808 			p_approval_details_rec.approval_object = 'EVEO' then
1809 			IF (AMS_DEBUG_HIGH_ON) THEN
1810 
1811 			AMS_Utility_PVT.debug_message ('Inside Check_FK__Items3');
1812 			END IF;
1813 			IF p_approval_details_rec.approval_object = 'CAMP' then
1814 				l_lookup_type := 'AMS_MEDIA_TYPE';
1815 			ELSE
1816 				l_lookup_type := 'AMS_EVENT_TYPE';
1817 			END IF;
1818 			ams_utility_pvt.get_lookup_meaning( l_lookup_type,
1819 				p_approval_details_rec.approval_object_type,
1820 				x_return_status,
1821 				l_meaning
1822 			);
1823 			IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1824 				IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
1825 					FND_MESSAGE.set_name('AMS', 'AMS_BAD_APPROVAL_OBJECT_TYPE');
1826 					FND_MSG_PUB.add;
1827 					RETURN;
1828 				END IF;
1829 			END IF;
1830 		END IF;
1831 	END iF;
1832 	IF (AMS_DEBUG_HIGH_ON) THEN
1833 
1834 	AMS_Utility_PVT.debug_message ('Inside Check_FK__Items4');
1835 	END IF;
1836 	IF (p_approval_details_rec.approval_priority IS NOT NULL AND
1837 		p_approval_details_rec.approval_priority <> FND_API.g_miss_char) THEN
1838 		IF p_approval_details_rec.approval_object = 'CAMP' OR
1839 			p_approval_details_rec.approval_object = 'EVEH'   OR
1840 			p_approval_details_rec.approval_object = 'EVEO' then
1841 				ams_utility_pvt.get_lookup_meaning( 'AMS_PRIORITY',
1842 				 p_approval_details_rec.approval_priority,
1843 				x_return_status,
1844 				l_meaning
1845 			);
1846 			IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1847 				IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
1848 					FND_MESSAGE.set_name('AMS', 'AMS_APPR_NO_PRIORITY_LKUP');
1849 					FND_MSG_PUB.add;
1850 					RETURN;
1851 				END IF;
1852 			END IF;
1853 		END IF;
1854 	END iF;
1855 	IF (AMS_DEBUG_HIGH_ON) THEN
1856 
1857 	AMS_Utility_PVT.debug_message ('Inside Check_FK__Items5');
1858 	END IF;
1859 
1860 	If p_approval_details_rec.custom_setup_id <> FND_API.g_miss_num THEN
1861 		IF p_approval_details_rec.approval_object <> FND_API.g_miss_char THEN
1862 			IF p_approval_details_rec.approval_object = 'CAMP' THEN
1863 				open c_cust_setup_id_c_exists(p_approval_details_rec.custom_setup_id);
1864 				fetch  c_cust_setup_id_c_exists INTO l_dummy;
1865 				close  c_cust_setup_id_c_exists;
1866 				IF l_dummy <> 1 THEN
1867 					IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
1868 						FND_MESSAGE.set_name('AMS', 'AMS_BAD_CUSTOM_SETUP_ID');
1869 						FND_MSG_PUB.add;
1870 						x_return_status := FND_API.g_ret_sts_error;
1871 						RETURN;
1872 					END IF;
1873 				END IF;
1874 			ELSIF p_approval_details_rec.approval_object = 'EVEH'
1875 			OR p_approval_details_rec.approval_object = 'EVEO'
1876 			OR p_approval_details_rec.approval_object = 'FUND' THEN
1877 				open c_cust_setup_id_exists(p_approval_details_rec.custom_setup_id, p_approval_details_rec.approval_object);
1878 				fetch  c_cust_setup_id_exists INTO l_dummy;
1879 				close  c_cust_setup_id_exists;
1880 				IF l_dummy <> 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_BAD_CUSTOM_SETUP_ID');
1883 						FND_MSG_PUB.add;
1884 						x_return_status := FND_API.g_ret_sts_error;
1885 						RETURN;
1886 					END IF;
1887 				END IF;
1888 			END IF;
1889 		END IF;
1890 	END IF;
1891 	IF (AMS_DEBUG_HIGH_ON) THEN
1892 
1893 	AMS_Utility_PVT.debug_message ('Inside Check_FK__Items6');
1894 	END IF;
1895 	IF p_approval_details_rec.business_unit_id is not null then
1896 		OPEN c_get_org(p_approval_details_rec.business_unit_id ,
1897          p_approval_details_rec.business_group_id, 'BU') ;
1898 		fetch c_get_org into l_count;
1899 		close c_get_org;
1900 		IF l_count = 0 then
1901 			IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
1902 				FND_MESSAGE.set_name('AMS', 'AMS_BAD_BU_ID');
1903 				FND_MSG_PUB.add;
1904 				x_return_status := FND_API.g_ret_sts_error;
1905 				RETURN;
1906 			END IF;
1907 		END IF;
1908 	END IF;
1909 	IF (AMS_DEBUG_HIGH_ON) THEN
1910 
1911 	AMS_Utility_PVT.debug_message ('Inside Check_FK__Items7');
1912 	END IF;
1913 	IF p_approval_details_rec.organization_id is not null then
1914 		OPEN c_get_org(p_approval_details_rec.organization_id ,
1915          p_approval_details_rec.business_group_id, '') ;
1916 		fetch c_get_org into l_count;
1917 		close c_get_org;
1918 		IF l_count = 0 then
1919 			IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
1920 				FND_MESSAGE.set_name('AMS', 'AMS_BAD_ORG_ID');
1921 				FND_MSG_PUB.add;
1922 				x_return_status := FND_API.g_ret_sts_error;
1923 				RETURN;
1924 			END IF;
1925 		END IF;
1926 	END IF;
1927 END Check_Approval_Dtls_FK_Items;
1928 -------------------------------------------------------------
1929 --       Check_Approval_Dtls_Lkup_Items
1930 -------------------------------------------------------------
1931 PROCEDURE Check_Approval_Dtls_Lkup_Items (
1932    p_approval_details_rec   IN  Approval_Details_Rec_Type,
1933    x_return_status       OUT NOCOPY   VARCHAR2
1934 )IS
1935 BEGIN
1936    x_return_status := FND_API.G_RET_STS_SUCCESS;
1937 END Check_Approval_Dtls_Lkup_Items;
1938 
1939 -------------------------------------------------------------
1940 --       Check_Approval_Dtls_Flag_Items
1941 -------------------------------------------------------------
1942 PROCEDURE Check_Approval_Dtls_Flag_Items (
1943    p_approval_details_rec   IN  Approval_Details_Rec_Type,
1944    x_return_status       OUT NOCOPY   VARCHAR2
1945 ) IS
1946 BEGIN
1947    x_return_status := FND_API.G_RET_STS_SUCCESS;
1948 END Check_Approval_Dtls_Flag_Items;
1949 --------------------------------------------------------------------
1950 
1951 -------------------------------------------------------------
1952 --       Check_Approval_Amounts_Overlap
1953 -------------------------------------------------------------
1954 -- Bug 2195020 This was changed from a function to a procedure to return
1955 -- the name of the overlapping rule
1956 PROCEDURE Check_Approval_Amounts_Overlap (
1957    p_approval_details_rec   IN  Approval_Details_Rec_Type,
1958    p_appoval_ids            IN  t_approval_id_table,
1959    x_exist_rule_name        OUT NOCOPY VARCHAR2,
1960    x_return_status          OUT NOCOPY VARCHAR2)
1961 IS
1962 
1963 l_Approval_Details_rec   Approval_Details_Rec_Type;
1964 l_max_amount   NUMBER;
1965 l_min_amount   NUMBER;
1966 l_approval_id  NUMBER;
1967 p_max_amount   NUMBER := p_approval_details_rec.approval_limit_to;
1968 p_min_amount   NUMBER := p_approval_details_rec.approval_limit_from;
1969 l_id           NUMBER := 1;
1970 amount_overlap BOOLEAN := FND_API.to_boolean(FND_API.g_false);
1971 l_rule_name    VARCHAR2(240);
1972 
1973 CURSOR c_approval_rule (l_approval_id IN NUMBER)IS
1974          SELECT approval_limit_from, approval_limit_to
1975 	 FROM ams_approval_details
1976          WHERE  approval_detail_id = l_approval_id;
1977 
1978 BEGIN
1979 
1980      FOR l_id IN 1..p_appoval_ids.COUNT LOOP
1981 
1982          l_approval_id :=  p_appoval_ids(l_id);
1983 
1984          OPEN c_approval_rule(l_approval_id);
1985          FETCH c_approval_rule INTO l_min_amount, l_max_amount;
1986          CLOSE c_approval_rule;
1987 
1988          IF ( l_max_amount IS NULL AND l_min_amount IS NOT NULL AND p_min_amount IS NOT NULL AND p_max_amount IS NOT NULL) THEN
1989             IF ( p_max_amount > l_min_amount) THEN
1990                 amount_overlap := FND_API.to_boolean(FND_API.g_true);
1991             END IF;
1992          END IF;
1993 
1994          IF NOT amount_overlap AND
1995 	   (l_max_amount IS NOT NULL AND l_min_amount IS NOT NULL AND p_max_amount IS NULL AND p_min_amount IS NOT NULL) THEN
1996              IF ( p_min_amount < l_max_amount) THEN
1997                amount_overlap := FND_API.to_boolean(FND_API.g_true);
1998             END IF;
1999          END IF;
2000 
2001          -- Condition added by VMODUR for bug 2340052
2002       -- Case when max amounts are null and a rule is setup for which min amountis greater than or equal existing amount
2003          IF NOT amount_overlap AND
2004 	   (l_min_amount IS NOT NULL and l_max_amount IS NULL and p_min_amount IS NOT NULL and p_max_amount IS NULL) THEN
2005 
2006             IF (p_min_amount >= l_min_amount) THEN
2007               amount_overlap := FND_API.to_boolean(FND_API.g_true);
2008             END IF;
2009          END IF;
2010 
2011          IF NOT amount_overlap AND
2012 	   ( l_max_amount IS NOT NULL AND l_min_amount IS NOT NULL AND p_max_amount IS NOT NULL AND p_min_amount IS NOT NULL) THEN
2013 
2014 
2015             IF ( p_min_amount >= l_min_amount AND p_min_amount < l_max_amount ) THEN
2016                 IF (AMS_DEBUG_HIGH_ON) THEN
2017 
2018                 Ams_Utility_Pvt.debug_message('The budget range is overlapping with that of existing rule ');
2019                 END IF;
2020                 amount_overlap := FND_API.to_boolean(FND_API.g_true);
2021 
2022             ELSIF ( p_max_amount > l_min_amount AND p_max_amount <= l_max_amount ) THEN
2023                 IF (AMS_DEBUG_HIGH_ON) THEN
2024 
2025                 Ams_Utility_Pvt.debug_message('The budget range is overlapping with that of existing rule ');
2026                 END IF;
2027                 amount_overlap := FND_API.to_boolean(FND_API.g_true);
2028 
2029             ELSIF ( p_min_amount < l_min_amount AND p_max_amount > l_max_amount ) THEN
2030                 IF (AMS_DEBUG_HIGH_ON) THEN
2031 
2032                 Ams_Utility_Pvt.debug_message('The budget range is overlapping with that of existing rule ');
2033                 END IF;
2034                 amount_overlap := FND_API.to_boolean(FND_API.g_true);
2035 
2036             END IF;
2037 
2038         END IF;
2039 
2040 	IF amount_overlap THEN
2041 	   Get_Approval_Rule_Name(p_approval_detail_id => l_approval_id,
2042 	                          x_rule_name          => l_rule_name);
2043 
2044            x_exist_rule_name := l_rule_name;
2045 	   x_return_status   := FND_API.g_true;
2046 	   EXIT;
2047 	ELSE
2048 	   x_return_status := FND_API.g_false;
2049 	END IF;
2050 
2051      END LOOP;
2052 
2053 END Check_Approval_Amounts_Overlap;
2054 
2055 ------------------------------------------------------------------------
2056 -- Bug# 2195020 VMODUR
2057 PROCEDURE Check_Unique_Rule (
2058    p_approval_details_rec   IN  Approval_Details_Rec_Type,
2059    x_exist_rule_name        OUT NOCOPY VARCHAR2,
2060    x_return_status          OUT NOCOPY VARCHAR2
2061 )
2062 IS
2063 l_count                  NUMBER       := 0;
2064 l_miss_num               NUMBER := FND_API.g_miss_num;
2065 l_miss_char              VARCHAR2(30) := FND_API.g_miss_char;
2066 l_miss_date              DATE := FND_API.g_miss_date;
2067 l_approval_detail_id     NUMBER;
2068 l_approval_rule_name     AMS_APPROVAL_DETAILS_V.Name%TYPE;
2069 
2070    CURSOR c_approval_unique IS
2071           select approval_detail_id, name
2072             from AMS_APPROVAL_DETAILS_VL --  Perf Bug Fix. Was previously using _V
2073             where nvl(start_date_active,l_miss_date)  = nvl(p_approval_details_rec.start_date_active, l_miss_date)
2074             and nvl(end_date_active,l_miss_date)  = nvl(p_approval_details_rec.end_date_active, l_miss_date)
2075             and nvl(business_unit_id,l_miss_num)  = nvl(p_approval_details_rec.business_unit_id, l_miss_num)
2076             and nvl(user_country_code,l_miss_char) = nvl(p_approval_details_rec.user_country_code, l_miss_char)
2077             and nvl(currency_code,l_miss_char) = nvl(p_approval_details_rec.currency_code, l_miss_char)
2078             and nvl(organization_id,l_miss_num)  = nvl(p_approval_details_rec.organization_id, l_miss_num)
2079             and nvl(custom_setup_id,l_miss_num)  = nvl(p_approval_details_rec.custom_setup_id, l_miss_num)
2080             and approval_object = p_approval_details_rec.approval_object
2081             and nvl(approval_object_type,l_miss_char)  = nvl(p_approval_details_rec.approval_object_type, l_miss_char)
2082             and nvl(approval_type,l_miss_char)  = nvl(p_approval_details_rec.approval_type, l_miss_char)
2083             and nvl(approval_priority,l_miss_char)  = nvl(p_approval_details_rec.approval_priority, l_miss_char)
2084             -- Bug 3068835 both lines were using limit_to
2085             and nvl(approval_limit_from,l_miss_num)  = nvl(p_approval_details_rec.approval_limit_from, l_miss_num)
2086             and nvl(approval_limit_to,l_miss_num)  = nvl(p_approval_details_rec.approval_limit_to, l_miss_num);
2087 
2088 
2089 
2090 BEGIN
2091 
2092         OPEN c_approval_unique;
2093         FETCH c_approval_unique INTO l_approval_detail_id, l_approval_rule_name;
2094         CLOSE c_approval_unique ;
2095 
2096         IF l_approval_detail_id IS NOT NULL THEN
2097                     IF  p_approval_details_rec.approval_detail_id IS NOT NULL THEN
2098                        IF l_approval_detail_id <> p_approval_details_rec.approval_detail_id THEN
2099                               x_return_status := Fnd_Api.g_true;
2100                        ELSE
2101                               x_return_status := Fnd_Api.g_false;
2102                        END IF;
2103                     ELSE
2104                        x_return_status := Fnd_Api.g_true;
2105                     END IF;
2106         ELSE
2107                      x_return_status := Fnd_Api.g_false;
2108         END IF;
2109 
2110            x_exist_rule_name := l_approval_rule_name;
2111 END Check_Unique_Rule;
2112 
2113 ----------------------------------------------------------------------------------
2114 
2115 -------------------------------------------------------------
2116 --       Check_Dates_Overlap
2117 -------------------------------------------------------------
2118 FUNCTION Check_Dates_Overlap (
2119    p_approval_details_rec   IN  Approval_Details_Rec_Type,
2120    p_validation_mode IN VARCHAR2
2121 ) RETURN VARCHAR2
2122 IS
2123 
2124 l_Approval_Details_rec   Approval_Details_Rec_Type;
2125 l_start_date DATE;
2126 l_end_date DATE;
2127 p_start_date DATE := TRUNC(p_approval_details_rec.start_date_active);
2128 p_end_date DATE := TRUNC(p_approval_details_rec.end_date_active);
2129 l_approval_detail_id    NUMBER ;
2130 
2131 l_temp NUMBER := 0;
2132 
2133 l_miss_num               NUMBER := FND_API.g_miss_num;
2134 l_miss_char              VARCHAR2(30) := FND_API.g_miss_char;
2135 l_miss_date              DATE := FND_API.g_miss_date;
2136 l_rule_name              VARCHAR2(240);
2137 l_return_status          VARCHAR2(1);
2138 
2139 
2140    v_approvalIds t_approval_id_table;
2141 
2142    CURSOR c_approval_dates IS
2143          SELECT TRUNC(start_date_active) , TRUNC(end_date_active) FROM ams_approval_details
2144                  WHERE approval_detail_id = p_approval_details_rec.approval_detail_id;
2145 
2146    CURSOR c_approval_rule IS
2147          SELECT approval_detail_id, TRUNC(start_date_active), TRUNC(end_date_active) FROM ams_approval_details
2148                 where nvl(business_unit_id,l_miss_num)  = nvl(p_approval_details_rec.business_unit_id, l_miss_num)
2149                 and nvl(user_country_code,l_miss_char) = nvl(p_approval_details_rec.user_country_code, l_miss_char)
2150                 and nvl(currency_code,l_miss_char) = nvl(p_approval_details_rec.currency_code, l_miss_char)
2151                 and nvl(organization_id,l_miss_num)  = nvl(p_approval_details_rec.organization_id, l_miss_num)
2152                 and nvl(custom_setup_id,l_miss_num)  = nvl(p_approval_details_rec.custom_setup_id, l_miss_num)
2153                 and approval_object  = p_approval_details_rec.approval_object
2154                 and nvl(approval_object_type,l_miss_char)  = nvl(p_approval_details_rec.approval_object_type, l_miss_char)
2155                 and approval_type  = p_approval_details_rec.approval_type
2156                 and nvl(approval_priority,l_miss_char)  = nvl(p_approval_details_rec.approval_priority, l_miss_char)
2157                 AND approval_detail_id NOT IN(nvl(p_approval_details_rec.approval_detail_id,0));
2158 
2159 
2160  BEGIN
2161 
2162    /* If the Rule is already active i.e. start_date is < SYSDATE, you cannot update the start_date */
2163 	IF p_validation_mode = JTF_PLSQL_API.g_update THEN
2164 
2165      OPEN c_approval_dates;
2166      FETCH c_approval_dates INTO l_start_date, l_end_date;
2167      CLOSE c_approval_dates;
2168 
2169       IF (AMS_DEBUG_HIGH_ON) THEN
2170         Ams_Utility_Pvt.debug_message('l_start_date '||l_start_date);
2171         Ams_Utility_Pvt.debug_message('l_end_date '||l_end_date);
2172         Ams_Utility_Pvt.debug_message('p_rec_start_date '||p_start_date);
2173         Ams_Utility_Pvt.debug_message('p_rec_end_date '||p_end_date);
2174       END IF;
2175 
2176       IF (p_start_date IS NOT NULL ) THEN
2177 
2178          IF (l_start_date <= trunc(SYSDATE) AND p_start_date <> l_start_date ) THEN
2179              IF (AMS_DEBUG_HIGH_ON) THEN
2180                Ams_Utility_Pvt.debug_message('You cannot update the Approval Rule start date as it is already active');
2181          END IF;
2182 
2183              IF Fnd_Msg_Pub.check_msg_level(Fnd_Msg_Pub.G_MSG_LVL_ERROR) THEN
2184                 Fnd_Message.set_name('AMS', 'AMS_APRD_START_DATE_NO_UPDATE');
2185                 Fnd_Msg_Pub.ADD;
2186                 RETURN FND_API.g_true;
2187              END IF;
2188 
2189          END IF;
2190 
2191          IF ( l_start_date IS NOT NULL AND l_start_date > trunc(SYSDATE)
2192               AND p_start_date < trunc(SYSDATE)
2193             ) THEN
2194                IF (AMS_DEBUG_HIGH_ON) THEN
2195 
2196                Ams_Utility_Pvt.debug_message('Approval Rule Start Date cannot be less than the system date');
2197                END IF;
2198 
2199             IF Fnd_Msg_Pub.check_msg_level(Fnd_Msg_Pub.G_MSG_LVL_ERROR) THEN
2200               Fnd_Message.set_name('AMS', 'AMS_APRD_START_DATE_LT_SYSDATE');
2201               Fnd_Msg_Pub.ADD;
2202               RETURN FND_API.g_true;
2203             END IF;
2204          END IF;
2205 
2206 
2207        END IF;
2208 
2209     END IF;
2210 
2211 
2212     IF p_validation_mode = JTF_PLSQL_API.g_create THEN
2213 
2214        /* Checking the Dates are Valid Or Not */
2215        IF (p_start_date IS NOT NULL AND p_start_date < trunc(SYSDATE)) THEN
2216            IF (AMS_DEBUG_HIGH_ON) THEN
2217 
2218            Ams_Utility_Pvt.debug_message('Approval Rule Start Date cannot be less than the system date');
2219            END IF;
2220 
2221            IF Fnd_Msg_Pub.check_msg_level(Fnd_Msg_Pub.G_MSG_LVL_ERROR) THEN
2222               Fnd_Message.set_name('AMS', 'AMS_APRD_START_DATE_LT_SYSDATE');
2223               Fnd_Msg_Pub.ADD;
2224               RETURN FND_API.g_true;
2225            END IF;
2226        END IF;
2227 
2228     END IF;
2229 
2230     IF (p_start_date IS NOT NULL AND p_start_date < trunc(SYSDATE)
2231         AND l_start_date IS NOT NULL AND l_start_date > trunc(SYSDATE)) THEN
2232         IF (AMS_DEBUG_HIGH_ON) THEN
2233 
2234         Ams_Utility_Pvt.debug_message('Approval Rule Start Date cannot be less than the system date');
2235         END IF;
2236 
2237         IF Fnd_Msg_Pub.check_msg_level(Fnd_Msg_Pub.G_MSG_LVL_ERROR) THEN
2238            Fnd_Message.set_name('AMS', 'AMS_APRD_START_DATE_LT_SYSDATE');
2239            Fnd_Msg_Pub.ADD;
2240            RETURN FND_API.g_true;
2241         END IF;
2242     END IF;
2243 
2244     IF (p_end_date IS NOT NULL AND p_end_date < trunc(SYSDATE)) THEN
2245        IF (AMS_DEBUG_HIGH_ON) THEN
2246 
2247        Ams_Utility_Pvt.debug_message('Approval Rule End Date cannot be less than the system date');
2248        END IF;
2249 
2250        IF Fnd_Msg_Pub.check_msg_level(Fnd_Msg_Pub.G_MSG_LVL_ERROR) THEN
2251           Fnd_Message.set_name('AMS', 'AMS_APRD_END_DATE_LT_SYSDATE');
2252           Fnd_Msg_Pub.ADD;
2253           RETURN FND_API.g_true;
2254        END IF;
2255      END IF;
2256 
2257      IF (p_start_date IS NOT NULL AND p_end_date IS NOT NULL) THEN
2258         IF ( p_start_date > p_end_date ) THEN
2259            IF (AMS_DEBUG_HIGH_ON) THEN
2260 
2261            Ams_Utility_Pvt.debug_message('Approval Rule END Date cannot be less than  Start Date');
2262            END IF;
2263 
2264            IF Fnd_Msg_Pub.check_msg_level(Fnd_Msg_Pub.G_MSG_LVL_ERROR) THEN
2265               Fnd_Message.set_name('AMS', 'AMS_APRD_ED_DATE_LT_ST_DATE');
2266               Fnd_Msg_Pub.ADD;
2267               RETURN FND_API.g_true;
2268            END IF;
2269         END IF;
2270      END IF;
2271 
2272 
2273 
2274 
2275      /* Checking for Date Overlap with any other record if exists with the same rule parameters */
2276 
2277      OPEN c_approval_rule;
2278      FETCH c_approval_rule INTO l_approval_detail_id, l_start_date, l_end_date;
2279 
2280      WHILE c_approval_rule%FOUND LOOP
2281 
2282       IF ( l_end_date IS NULL AND l_start_date IS NOT NULL AND p_start_date IS NOT NULL AND p_end_date IS NOT NULL) THEN
2283          IF( p_end_date >= l_start_date) THEN
2284 
2285            IF (AMS_DEBUG_HIGH_ON) THEN
2286 
2287 
2288 
2289            Ams_Utility_Pvt.debug_message('Entered Condition 1 ');
2290 
2291            END IF;
2292            IF (AMS_DEBUG_HIGH_ON) THEN
2293 
2294            Ams_Utility_Pvt.debug_message('The date range is overlapping with that of existing rule ');
2295            END IF;
2296 
2297            l_temp := l_temp + 1;
2298            v_approvalIds(l_temp) := l_approval_detail_id;
2299 
2300          END IF;
2301       END IF;
2302 
2303       IF ( l_end_date IS NULL AND l_start_date IS NOT NULL AND p_start_date IS NOT NULL AND p_end_date IS NULL) THEN
2304          IF( p_start_date >= l_start_date) THEN
2305 
2306            IF (AMS_DEBUG_HIGH_ON) THEN
2307 
2308 
2309 
2310            Ams_Utility_Pvt.debug_message('Entered Condition 1 ');
2311 
2312            END IF;
2313            IF (AMS_DEBUG_HIGH_ON) THEN
2314 
2315            Ams_Utility_Pvt.debug_message('The date range is overlapping with that of existing rule ');
2316            END IF;
2317 
2318            l_temp := l_temp + 1;
2319            v_approvalIds(l_temp) := l_approval_detail_id;
2320 
2321          END IF;
2322       END IF;
2323 
2324 
2325 
2326       IF (l_end_date IS NOT NULL AND l_start_date IS NOT NULL AND p_end_date IS NULL AND p_start_date IS NOT NULL) THEN
2327           IF( p_start_date <= l_end_date) THEN
2328 
2329            IF (AMS_DEBUG_HIGH_ON) THEN
2330 
2331 
2332 
2333            Ams_Utility_Pvt.debug_message('Entered Condition 2 ');
2334 
2335            END IF;
2336            IF (AMS_DEBUG_HIGH_ON) THEN
2337 
2338            Ams_Utility_Pvt.debug_message('The date range is overlapping with that of existing rule ');
2339            END IF;
2340 
2341            l_temp := l_temp + 1;
2342            v_approvalIds(l_temp) := l_approval_detail_id;
2343 
2344 
2345          END IF;
2346       END IF;
2347 
2348 
2349       IF( l_end_date IS NOT NULL AND l_start_date IS NOT NULL AND p_end_date IS NOT NULL AND p_start_date IS NOT NULL) THEN
2350 
2351          IF (AMS_DEBUG_HIGH_ON) THEN
2352          Ams_Utility_Pvt.debug_message('Entered Condition 3 ');
2353          Ams_Utility_Pvt.debug_message('p_start_date is ' || to_char(p_start_date));
2354          Ams_Utility_Pvt.debug_message('p_end_date is ' || to_char(p_end_date));
2355          Ams_Utility_Pvt.debug_message('l_start_date is ' || to_char(l_start_date));
2356          Ams_Utility_Pvt.debug_message('l_end_date is ' || to_char(l_end_date));
2357          END IF;
2358 
2359          IF ( p_start_date >= l_start_date AND p_start_date <= l_end_date
2360          -- AND Condition added due to Bug 3275739
2361          -- We don't need to validate overlap with expired approval rules
2362           AND l_end_date >= trunc(SYSDATE)) THEN
2363              IF (AMS_DEBUG_HIGH_ON) THEN
2364 
2365              Ams_Utility_Pvt.debug_message('The date range is overlapping with that of existing rule ');
2366              END IF;
2367 
2368              l_temp := l_temp + 1;
2369              v_approvalIds(l_temp) := l_approval_detail_id;
2370 
2371          ELSIF ( p_end_date >= l_start_date AND p_end_date <= l_end_date
2372          -- AND Condition added due to Bug 3275739
2373          -- We don't need to validate overlap with expired approval rules
2374          AND l_end_date >= trunc(SYSDATE)) THEN
2375              IF (AMS_DEBUG_HIGH_ON) THEN
2376 
2377              Ams_Utility_Pvt.debug_message('The date range is overlapping with that of existing rule ');
2378              END IF;
2379 
2380              l_temp := l_temp + 1;
2381              v_approvalIds(l_temp) := l_approval_detail_id;
2382 
2383          ELSIF ( p_start_date <= l_start_date AND p_end_date >= l_end_date
2384          -- AND Condition added due to Bug 3275739
2385          -- We don't need to validate overlap with expired approval rules
2386          AND l_end_date >= trunc(SYSDATE)) THEN
2387              IF (AMS_DEBUG_HIGH_ON) THEN
2388 
2389              Ams_Utility_Pvt.debug_message('The date range is overlapping with that of existing rule ');
2390              END IF;
2391 
2392              l_temp := l_temp + 1;
2393              v_approvalIds(l_temp) := l_approval_detail_id;
2394 
2395          END IF;
2396 
2397       END IF;
2398 
2399       FETCH c_approval_rule INTO l_approval_detail_id, l_start_date, l_end_date;
2400 
2401           END LOOP;
2402 
2403      CLOSE c_approval_rule;
2404 
2405      IF(p_approval_details_rec.approval_type = 'CONCEPT') THEN
2406         IF(l_temp <> 0) THEN -- date overlap is there
2407 
2408            Get_Approval_Rule_Name(p_approval_detail_id => v_approvalIds(1),
2409                                   x_rule_name          => l_rule_name);
2410 
2411            IF Fnd_Msg_Pub.check_msg_level(Fnd_Msg_Pub.G_MSG_LVL_ERROR) THEN
2412               Fnd_Message.set_name('AMS', 'AMS_APRD_DATE_OVERLAP');
2413               Fnd_Message.set_token('EXIST_RULE_NAME', l_rule_name);
2414               Fnd_Msg_Pub.ADD;
2415               RETURN FND_API.g_true;
2416            END IF;
2417         END IF;
2418      --ELSIF (p_approval_details_rec.approval_type = 'BUDGET') THEN --- VMODUR 30-Oct-2003
2419      -- Change because claims etc. are not being checked for Amt Overlap
2420      ELSE
2421         IF(l_temp <> 0) THEN -- date overlap is there
2422            Check_Approval_Amounts_Overlap  (p_approval_details_rec => p_approval_details_rec,
2423                                             p_appoval_ids          => v_approvalIds,
2424                                             x_exist_rule_name      => l_rule_name,
2425                                             x_return_status        => l_return_status);
2426            IF l_return_status = FND_API.g_true THEN
2427              IF Fnd_Msg_Pub.check_msg_level(Fnd_Msg_Pub.G_MSG_LVL_ERROR) THEN
2428                  Fnd_Message.set_name('AMS', 'AMS_APRD_MIN_MAX_AMT_OVERLAP');
2429                  Fnd_Message.set_token('EXIST_RULE_NAME', l_rule_name);
2430                  Fnd_Msg_Pub.ADD;
2431                  RETURN FND_API.g_true;
2432               END IF;
2433            END IF;
2434         END IF;
2435      END IF;
2436 
2437      RETURN FND_API.g_false;
2438 
2439 END Check_Dates_Overlap;
2440 --------------------------------------------------------------------
2441 
2442 END AMS_approval_details_PVT;