DBA Data[Home] [Help]

PACKAGE BODY: APPS.HZ_UTILITY_V2PUB

Source


1 PACKAGE BODY HZ_UTILITY_V2PUB AS
2 /*$Header: ARH2UTSB.pls 120.47.12020000.2 2012/12/03 12:16:11 rgokavar ship $ */
3 
4 --------------------------------------
5 -- declaration of private global varibles
6 --------------------------------------
7 
8 G_SPECIAL_STRING                        CONSTANT VARCHAR2(4):= '%#@*';
9 G_LENGTH                                CONSTANT NUMBER := LENGTHB( G_SPECIAL_STRING );
10 
11 TYPE VAL_TAB_TYPE IS TABLE OF VARCHAR2(255) INDEX BY BINARY_INTEGER;
12 
13 -- file handler we will use for log file.
14 G_FILE                                  UTL_FILE.FILE_TYPE;
15 
16 -- running in file debug mode.
17 G_FILE_DEBUG                            BOOLEAN := FALSE;
18 G_FILE_NAME                             VARCHAR2(100);
19 G_FILE_PATH                             VARCHAR2(200);
20 
21 -- running in normal debug mode by calling dbms_output.
22 G_DBMS_DEBUG                            BOOLEAN := FALSE;
23 
24 -- buffer size used by dbms_output.debug
25 G_BUFFER_SIZE                           CONSTANT NUMBER := 1000000;
26 G_MAX_LINE_SIZE_OF_FILE                 CONSTANT NUMBER := 1023;
27 G_MAX_LINE_SIZE_OF_DBMS                 CONSTANT NUMBER := 255;
28 
29 -- level of debug has been called.
30 G_COUNT                                 NUMBER := 0;
31 
32 --------------------------------------
33 -- define the internal table that will cache values
34 --------------------------------------
35 
36 VAL_TAB                                 VAL_TAB_TYPE;    -- the table of values
37 TABLE_SIZE                              BINARY_INTEGER := 2048; -- the size of above tables
38 LOOKUP_MEANING_TAB                      VAL_TAB_TYPE;
39 
40 --------------------------------------
41 -- declaration of private procedures and functions
42 --------------------------------------
43 
44 FUNCTION get_index (
45     p_val                               IN     VARCHAR2
46 ) RETURN BINARY_INTEGER;
47 
48 FUNCTION put (
49     p_val                               IN     VARCHAR2
50 ) RETURN BINARY_INTEGER;
51 
52 FUNCTION search (
53     p_val                               IN     VARCHAR2,
54     p_category                          IN     VARCHAR2
55 ) RETURN BOOLEAN;
56 
57 FUNCTION search (
58     p_val                               IN     VARCHAR2,
59     p_category                          IN     VARCHAR2,
60     x_lookup_meaning                    OUT NOCOPY    VARCHAR2,
61     p_calling_proc                      IN  VARCHAR2
62 ) RETURN BOOLEAN;
63 
64 PROCEDURE enable_file_debug;
65 
66 --------------------------------------
67 -- private procedures and functions
68 --------------------------------------
69 
70 /**
71  * PRIVATE FUNCTION get_index
72  *
73  * DESCRIPTION
74  *     Gets index in caching table for a specified value.
75  *
76  * EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
77  *
78  * ARGUMENTS
79  *   IN:
80  *     p_val                          Specified value.
81  *
82  * NOTES
83  *
84  * MODIFICATION HISTORY
85  *
86  *   07-23-2001    Jianying Huang      o Created.
87  *
88  */
89 
90 FUNCTION get_index (
91     p_val                               IN     VARCHAR2
92 ) RETURN BINARY_INTEGER IS
93 
94     l_table_index                       BINARY_INTEGER;
95     l_found                             BOOLEAN := FALSE;
96     l_hash_value                        NUMBER;
97 
98 BEGIN
99 
100     l_table_index := DBMS_UTILITY.get_hash_value( p_val, 1, TABLE_SIZE );
101 
102     IF VAL_TAB.EXISTS(l_table_index) THEN
103         IF VAL_TAB(l_table_index) = p_val THEN
104             RETURN l_table_index;
105         ELSE
106             l_hash_value := l_table_index;
107             l_table_index := l_table_index + 1;
108             l_found := FALSE;
109 
110             WHILE ( l_table_index < TABLE_SIZE ) AND ( NOT l_found ) LOOP
111                 IF VAL_TAB.EXISTS(l_table_index) THEN
112                     IF VAL_TAB(l_table_index) = p_val THEN
113                         l_found := TRUE;
114                     ELSE
115                         l_table_index := l_table_index + 1;
116                     END IF;
117                 ELSE
118                     RETURN TABLE_SIZE + 1;
119                 END IF;
120             END LOOP;
121 
122             IF NOT l_found THEN  -- Didn't find any till the end
123                 l_table_index := 1;  -- Start from the beginning
124 
125                 WHILE ( l_table_index < l_hash_value ) AND ( NOT l_found ) LOOP
126                     IF VAL_TAB.EXISTS(l_table_index) THEN
127                         IF VAL_TAB(l_table_index) = p_val THEN
128                             l_found := TRUE;
129                         ELSE
130                             l_table_index := l_table_index + 1;
131                         END IF;
132                     ELSE
133                         RETURN TABLE_SIZE + 1;
134                     END IF;
135                 END LOOP;
136             END IF;
137 
138             IF NOT l_found THEN
139                 RETURN TABLE_SIZE + 1;  -- Return a higher value
140             END IF;
141         END IF;
142     ELSE
143         RETURN TABLE_SIZE + 1;
144     END IF;
145 
146     RETURN l_table_index;
147 
148 EXCEPTION
149     WHEN OTHERS THEN  -- The entry doesn't exists
150         RETURN TABLE_SIZE + 1;
151 
152 END get_index;
153 
154 /**
155  * PRIVATE FUNCTION put
156  *
157  * DESCRIPTION
158  *     Put value in caching table and return table index.
159  *
160  * EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
161  *
162  * ARGUMENTS
163  *   IN:
164  *     p_val                          Specified value.
165  *
166  * NOTES
167  *
168  * MODIFICATION HISTORY
169  *
170  *   07-23-2001    Jianying Huang      o Created.
171  *   03-04-2002    Jianying Huang      o Modified the procedure to be a function
172  *                                       to return table index.
173  *
174  */
175 
176 FUNCTION put (
177     p_val                               IN     VARCHAR2
178 ) RETURN BINARY_INTEGER IS
179 
180     l_table_index                       BINARY_INTEGER;
181     l_stored                            BOOLEAN := FALSE;
182     l_hash_value                        NUMBER;
183 
184 BEGIN
185 
186     l_table_index := DBMS_UTILITY.get_hash_value( p_val, 1, TABLE_SIZE );
187 
188     IF VAL_TAB.EXISTS(l_table_index) THEN
189         IF VAL_TAB(l_table_index) <> p_val THEN --Collision
190             l_hash_value := l_table_index;
191             l_table_index := l_table_index + 1;
192 
193             WHILE (l_table_index < TABLE_SIZE) AND (NOT l_stored) LOOP
194                 IF VAL_TAB.EXISTS(l_table_index) THEN
195                     IF VAL_TAB(l_table_index) <> p_val THEN
196                         l_table_index := l_table_index + 1;
197                     END IF;
198                 ELSE
199                     VAL_TAB(l_table_index) := p_val;
200                     l_stored := TRUE;
201                 END IF;
202             END LOOP;
203 
204             IF NOT l_stored THEN --Didn't find any free bucket till the end
205                 l_table_index := 1;
206 
207                 WHILE (l_table_index < l_hash_value) AND (NOT l_stored) LOOP
208                     IF VAL_TAB.EXISTS(l_table_index) THEN
209                         IF VAL_TAB(l_table_index) <> p_val THEN
210                             l_table_index := l_table_index + 1;
211                         END IF;
212                     ELSE
213                         VAL_TAB(l_table_index) := p_val;
214                         l_stored := TRUE;
215                     END IF;
216                 END LOOP;
217             END IF;
218 
219         END IF;
220     ELSE
221         VAL_TAB(l_table_index) := p_val;
222     END IF;
223 
224     RETURN l_table_index;
225 EXCEPTION
226     WHEN OTHERS THEN
227         NULL;
228 
229 END put;
230 
231 /**
232  * PRIVATE FUNCTION search
233  *
234  * DESCRIPTION
235  *     Find value with a specified category, for instance, lookup.
236  *
237  * EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
238  *
239  * ARGUMENTS
240  *   IN:
241  *     p_val                          Specified value.
242  *     p_category                     Value category. We only support
243  *                                    category LOOKUP for now.
244  *   OUT:
245  *     x_lookup_meaning               Lookup Meaning
246  *
247  * NOTES
248  *
249  * MODIFICATION HISTORY
250  *
251  *   07-23-2001    Jianying Huang      o Created.
252  *   03-04-2002    Jianying Huang      o Added new parameter to return
253  *                                       lookup meaning.
254  *
255  */
256 
257 FUNCTION search (
258     p_val                               IN     VARCHAR2,
259     p_category                          IN     VARCHAR2,
260     x_lookup_meaning                    OUT NOCOPY    VARCHAR2,
261     p_calling_proc                      IN VARCHAR2
262 ) RETURN BOOLEAN IS
263 
264     l_table_index                       BINARY_INTEGER;
265     l_return                            BOOLEAN;
266 
267     l_dummy                             VARCHAR2(1);
268     l_position1                         NUMBER;
269     l_position2                         NUMBER;
270 
271     l_lookup_table                      VARCHAR2(30);
272     l_lookup_type                       AR_LOOKUPS.lookup_type%TYPE;
273     l_lookup_code                       AR_LOOKUPS.lookup_code%TYPE;
274 
275     l_relationship_type                 VARCHAR2(30);
276     l_incl_unrelated_entities           VARCHAR2(1);
277 
281 
278     --  Bug 5398089 : Added variables
279     l_string VARCHAR2(255);
280     l_cache BOOLEAN;
282 BEGIN
283 
284     -- search for the value
285     l_table_index := get_index( p_val || G_SPECIAL_STRING || p_category );
286     l_cache := TRUE;
287 
288     IF l_table_index < table_size THEN
289        IF p_calling_proc <> 'Get_LookupMeaning' THEN
290           RETURN TRUE;
291        ELSE
292        --  Bug 5398089 : conisder language for lookup meaning
293          IF p_category = 'LOOKUP' THEN
294            l_string := LOOKUP_MEANING_TAB(l_table_index);
295            l_position1 := INSTRB( l_string, G_SPECIAL_STRING, 1, 1 );
296            IF SUBSTRB( l_string, l_position1 + G_LENGTH ) = userenv('LANG') THEN
297              -- This stores the meaning
298              x_lookup_meaning := SUBSTRB( l_string, 1, l_position1 - 1 );
299              RETURN TRUE;
300            END IF;
301            l_cache := FALSE;
302          END IF;
303        END IF;
304     END IF;
305         --Can't find the value in the table; look in the database
306         IF p_category = 'LOOKUP' THEN
307 
308             l_position1 := INSTRB( p_val, G_SPECIAL_STRING, 1, 1 );
309             l_lookup_table := SUBSTRB( p_val, 1, l_position1 - 1 );
310             l_position2 := INSTRB( p_val, G_SPECIAL_STRING, 1, 2 );
311             l_lookup_type := SUBSTRB( p_val, l_position1 + G_LENGTH,
312                                      l_position2  - l_position1 - G_LENGTH );
313             l_lookup_code := SUBSTRB( p_val, l_position2 + G_LENGTH );
314 
315             IF UPPER( l_lookup_table ) = 'AR_LOOKUPS' THEN
316             BEGIN
317                 SELECT meaning INTO x_lookup_meaning
318                 FROM   AR_LOOKUPS
319                 WHERE  LOOKUP_TYPE = l_lookup_type
320                 AND    LOOKUP_CODE = l_lookup_code
321                 AND    ( ENABLED_FLAG = 'Y' AND
322                          TRUNC( SYSDATE ) BETWEEN
323                          TRUNC(NVL( START_DATE_ACTIVE,SYSDATE ) ) AND
324                          TRUNC(NVL( END_DATE_ACTIVE,SYSDATE ) ) );
325 
326                 l_return := TRUE;
327             EXCEPTION
328                 WHEN NO_DATA_FOUND THEN
329                     l_return := FALSE;
330             END;
331             ELSIF UPPER( l_lookup_table ) = 'SO_LOOKUPS' THEN
332             BEGIN
333                 SELECT meaning INTO x_lookup_meaning
334                 FROM   SO_LOOKUPS
335                 WHERE  LOOKUP_TYPE = l_lookup_type
336                 AND    LOOKUP_CODE = l_lookup_code
337                 AND    ( ENABLED_FLAG = 'Y' AND
338                          TRUNC( SYSDATE ) BETWEEN
339                          TRUNC(NVL( START_DATE_ACTIVE,SYSDATE ) ) AND
340                          TRUNC(NVL( END_DATE_ACTIVE,SYSDATE ) ) );
341 
342                 l_return := TRUE;
343             EXCEPTION
344                 WHEN NO_DATA_FOUND THEN
345                     l_return := FALSE;
346             END;
347             ELSIF UPPER( l_lookup_table ) = 'OE_SHIP_METHODS_V' THEN
348             BEGIN
349                 SELECT meaning INTO x_lookup_meaning
350                 FROM   OE_SHIP_METHODS_V
351                 WHERE  LOOKUP_TYPE = l_lookup_type
352                 AND    LOOKUP_CODE = l_lookup_code
353                 AND    ( ENABLED_FLAG = 'Y' AND
354                          TRUNC( SYSDATE ) BETWEEN
355                          TRUNC(NVL( START_DATE_ACTIVE,SYSDATE ) ) AND
356                          TRUNC(NVL( END_DATE_ACTIVE,SYSDATE ) ) )
357                 AND    ROWNUM = 1;
358 
359                 l_return := TRUE;
360             EXCEPTION
361                 WHEN NO_DATA_FOUND THEN
362                     l_return := FALSE;
363             END;
364             ELSIF UPPER( l_lookup_table ) = 'FND_LOOKUP_VALUES' THEN
365             BEGIN
366                 SELECT meaning INTO x_lookup_meaning
367                 FROM   FND_LOOKUP_VALUES
368                 WHERE  LOOKUP_TYPE = l_lookup_type
369                 AND    LOOKUP_CODE = l_lookup_code
370                 AND    ( ENABLED_FLAG = 'Y' AND
371                          TRUNC( SYSDATE ) BETWEEN
372                          TRUNC(NVL( START_DATE_ACTIVE,SYSDATE ) ) AND
373                          TRUNC(NVL( END_DATE_ACTIVE,SYSDATE ) ) )
374                 -- Bug 4112157
375                 --AND    ROWNUM = 1;
376                 AND LANGUAGE= userenv('LANG')
377                 AND VIEW_APPLICATION_ID=222
378                 AND SECURITY_GROUP_ID=0;
379 
380                 l_return := TRUE;
381             EXCEPTION
382                 WHEN NO_DATA_FOUND THEN
383                     l_return := FALSE;
384             END;
385             ELSIF UPPER( l_lookup_table ) = 'FND_LANGUAGES' THEN
386             BEGIN
387                 SELECT nls_language INTO x_lookup_meaning
388                 FROM   FND_LANGUAGES
389                 WHERE  LANGUAGE_CODE = l_lookup_code;
390 
391                 l_return := TRUE;
392             EXCEPTION
393                 WHEN NO_DATA_FOUND THEN
394                     l_return := FALSE;
395             END;
396 
397             ELSE
398                 l_return := FALSE;
399             END IF;
400 
401         -- added the following section for caching of incl_unrelated_entities
402         -- column value for hz_relationship_types records.
403         ELSIF p_category = 'RELATIONSHIP_TYPE' THEN
404 
405             l_position1 := INSTRB( p_val, G_SPECIAL_STRING, 1, 1 );
406             l_relationship_type := SUBSTRB( p_val, 1, l_position1 - 1 );
407 
408             BEGIN
409                 SELECT INCL_UNRELATED_ENTITIES INTO l_dummy
410                 FROM   HZ_RELATIONSHIP_TYPES
411                 WHERE  RELATIONSHIP_TYPE = l_relationship_type
412                 AND    ROWNUM = 1;
413 
414                 IF l_dummy = 'Y' THEN
415                     l_return := TRUE;
416                 ELSE
417                     l_return := FALSE;
418                 END IF;
419 
420             EXCEPTION
421                 WHEN NO_DATA_FOUND THEN
422                     l_return := FALSE;
423             END;
424 
425         END IF;
426 
427         --Cache the value
428         IF l_return THEN
429            IF l_cache THEN
430              l_table_index := put( p_val || G_SPECIAL_STRING || p_category );
431            END IF;
432            IF p_category = 'LOOKUP' THEN
433                --  Bug 5398089 : concat meanign with langauge
434                LOOKUP_MEANING_TAB(l_table_index) := x_lookup_meaning || G_SPECIAL_STRING || userenv('LANG');
435            END IF;
436         END IF;
437 
438     RETURN l_return;
439 
440 END search;
441 
442 /**
443  * PRIVATE FUNCTION search
444  *
445  * DESCRIPTION
446  *     Find value with a specified category, for instance, lookup.
447  *
448  * EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
449  *
450  * ARGUMENTS
451  *   IN:
452  *     p_val                          Specified value.
453  *     p_category                     Value category. We only support
454  *                                    category LOOKUP for now.
455  * NOTES
456  *
457  * MODIFICATION HISTORY
458  *
459  *   03-04-2002    Jianying Huang      o Added new parameter to return
460  *                                       lookup meaning.
461  *
462  */
463 
464 FUNCTION search (
465     p_val                               IN     VARCHAR2,
466     p_category                          IN     VARCHAR2
467 ) RETURN BOOLEAN IS
468 
469     l_lookup_meaning                    VARCHAR2(100);
470 
471 BEGIN
472     RETURN search(p_val, p_category, l_lookup_meaning, 'search');
473 END search;
474 
475 /**
476  * PRIVATE PROCEDURE enable_file_debug
477  *
478  * DESCRIPTION
479  *     Enable file debug.
480  *
481  * EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
482  *
483  * ARGUMENTS
484  *
485  * NOTES
486  *
487  * MODIFICATION HISTORY
488  *
489  *   07-23-2001    Jianying Huang      o Created.
490  *
491  */
492 
493 PROCEDURE enable_file_debug IS
494 
495 BEGIN
496 
497     -- Open log file in 'append' mode.
498     IF NOT UTL_FILE.is_open( G_FILE ) THEN
499         G_FILE := UTL_FILE.fopen( G_FILE_PATH, G_FILE_NAME, 'a' );
500     END IF;
501 
502     G_FILE_DEBUG := TRUE;
503 
504 EXCEPTION
505     WHEN UTL_FILE.INVALID_PATH THEN
506         FND_MESSAGE.SET_NAME( 'FND', 'CONC-TEMPFILE_INVALID_PATH' );
507         FND_MESSAGE.SET_TOKEN( 'FILE_DIR', G_FILE_PATH );
508         FND_MSG_PUB.ADD;
509         G_FILE_DEBUG := FALSE;
510         G_COUNT := 0;
511         RAISE FND_API.G_EXC_ERROR;
512 
513     WHEN UTL_FILE.INVALID_MODE THEN
514         FND_MESSAGE.SET_NAME( 'FND', 'CONC-TEMPFILE_INVALID_MODE' );
515         FND_MESSAGE.SET_TOKEN( 'TEMP_FILE', G_FILE_NAME );
516         FND_MESSAGE.SET_TOKEN( 'FILE_MODE', 'w' );
517         FND_MSG_PUB.ADD;
518         G_FILE_DEBUG := FALSE;
519         G_COUNT := 0;
520         RAISE FND_API.G_EXC_ERROR;
521 
522     WHEN UTL_FILE.INVALID_OPERATION THEN
523         FND_MESSAGE.SET_NAME( 'FND', 'CONC-TEMPFILE_INVALID_OPERATN' );
524         FND_MESSAGE.SET_TOKEN( 'TEMP_FILE', G_FILE_NAME );
525         FND_MESSAGE.SET_TOKEN( 'TEMP_DIR', G_FILE_PATH );
526         FND_MSG_PUB.ADD;
527         G_FILE_DEBUG := FALSE;
528         G_COUNT := 0;
529         RAISE FND_API.G_EXC_ERROR;
530 
531 END enable_file_debug;
532 
533 --------------------------------------
534 -- public procedures and functions
535 --------------------------------------
536 
537 /**
538  * PROCEDURE validate_mandatory
539  *
540  * DESCRIPTION
541  *     Validate mandatory field.
542  *
543  * EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
544  *
545  * ARGUMENTS
546  *   IN:
547  *     p_create_update_flag           'C' ( create mode ), 'U' ( update mode )
548  *     p_column                       Column name you want to validate.
549  *     p_column_value                 Column value
550  *     p_restriced                    If set to 'Y', p_column_value should be passed
551  *                                    in with some value in both create and update
552  *                                    mode. If set to 'N', p_column_value can be
553  *                                    NULL in update mode. Default is 'N'.
554  *   IN/OUT:
555  *     x_return_status                Return status.
556  *
557  * NOTES
558  *     The procedure is overloaded for different column type, i.e. VARCHAR2,
559  *     NUMBER, and DATE.
560  *
561  * MODIFICATION HISTORY
562  *
563  *   07-23-2001    Jianying Huang      o Created.
564  *
565  */
566 
567 PROCEDURE validate_mandatory (
568     p_create_update_flag                    IN     VARCHAR2,
569     p_column                                IN     VARCHAR2,
570     p_column_value                          IN     VARCHAR2,
571     p_restricted                            IN     VARCHAR2,
572     x_return_status                         IN OUT NOCOPY VARCHAR2
573 ) IS
574 
575     l_error                                 BOOLEAN := FALSE;
576 
577 BEGIN
578 
579     IF p_restricted = 'N' THEN
580         IF ( p_create_update_flag = 'C' AND
581              ( p_column_value IS NULL OR
582                p_column_value = FND_API.G_MISS_CHAR ) ) OR
583            ( p_create_update_flag = 'U' AND
584              p_column_value = FND_API.G_MISS_CHAR )
585         THEN
586             l_error := TRUE;
587         END IF;
588     ELSE
589         IF ( p_column_value IS NULL OR
590              p_column_value = FND_API.G_MISS_CHAR )
591         THEN
592             l_error := TRUE;
593         END IF;
594     END IF;
595 
596     IF l_error THEN
597         FND_MESSAGE.SET_NAME( 'AR', 'HZ_API_MISSING_COLUMN' );
598         FND_MESSAGE.SET_TOKEN( 'COLUMN', p_column );
599         FND_MSG_PUB.ADD;
600         x_return_status := FND_API.G_RET_STS_ERROR;
601     END IF;
602 
603 END validate_mandatory;
604 
605 PROCEDURE validate_mandatory (
606     p_create_update_flag                    IN     VARCHAR2,
607     p_column                                IN     VARCHAR2,
608     p_column_value                          IN     NUMBER,
609     p_restricted                            IN     VARCHAR2,
610     x_return_status                         IN OUT NOCOPY VARCHAR2
611 ) IS
612 
613     l_error                                 BOOLEAN := FALSE;
614 
615 BEGIN
616 
617     IF p_restricted = 'N' THEN
618         IF ( p_create_update_flag = 'C' AND
619              ( p_column_value IS NULL OR
620                p_column_value = FND_API.G_MISS_NUM ) ) OR
621            ( p_create_update_flag = 'U' AND
622              p_column_value = FND_API.G_MISS_NUM )
623         THEN
624             l_error := TRUE;
625         END IF;
626     ELSE
627         IF ( p_column_value IS NULL OR
628              p_column_value = FND_API.G_MISS_NUM )
629         THEN
630             l_error := TRUE;
631         END IF;
632     END IF;
633 
634     IF l_error THEN
635         FND_MESSAGE.SET_NAME( 'AR', 'HZ_API_MISSING_COLUMN' );
636         FND_MESSAGE.SET_TOKEN( 'COLUMN', p_column );
637         FND_MSG_PUB.ADD;
638         x_return_status := FND_API.G_RET_STS_ERROR;
639     END IF;
640 
641 END validate_mandatory;
642 
643 PROCEDURE validate_mandatory (
644     p_create_update_flag                    IN     VARCHAR2,
645     p_column                                IN     VARCHAR2,
646     p_column_value                          IN     DATE,
647     p_restricted                            IN     VARCHAR2,
648     x_return_status                         IN OUT NOCOPY VARCHAR2
649 ) IS
650 
651     l_error                                 BOOLEAN := FALSE;
652 
653 BEGIN
654 
655     IF p_restricted = 'N' THEN
656         IF ( p_create_update_flag = 'C' AND
657              ( p_column_value IS NULL OR
658                p_column_value = FND_API.G_MISS_DATE ) ) OR
659            ( p_create_update_flag = 'U' AND
660              p_column_value = FND_API.G_MISS_DATE )
661         THEN
662             l_error := TRUE;
663         END IF;
664     ELSE
665         IF ( p_column_value IS NULL OR
666              p_column_value = FND_API.G_MISS_DATE )
667         THEN
668             l_error := TRUE;
669         END IF;
670     END IF;
671 
672     IF l_error THEN
673         FND_MESSAGE.SET_NAME( 'AR', 'HZ_API_MISSING_COLUMN' );
674         FND_MESSAGE.SET_TOKEN( 'COLUMN', p_column );
675         FND_MSG_PUB.ADD;
676         x_return_status := FND_API.G_RET_STS_ERROR;
677     END IF;
678 
679 END validate_mandatory;
680 
681 /**
682  * PROCEDURE validate_nonupdateable
683  *
684  * DESCRIPTION
685  *     Validate nonupdateable field.
686  *
687  * EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
688  *
689  * ARGUMENTS
690  *   IN:
691  *     p_column                       Column name you want to validate.
692  *     p_column_value                 Column value
693  *     p_old_column_value             Current database column value
694  *     p_restriced                    If set to 'Y', column can not be updated
695  *                                    even the database value is null. This is
696  *                                    default value and as long as p_column_value
697  *                                    is not equal to p_old_column_error, return
698  *                                    status will be set to error.
699  *                                    If set to 'N', if database value is null,
700  *                                    we can update it to a value. If database value
701  *                                    is not null and if p_column_value is not equal
702  *                                    to p_old_column_value, return status will be
703  *                                    set to error.
704  *   IN/OUT:
705  *     x_return_status                Return status.
706  *
707  * NOTES
708  *     The procedure is overloaded for different column type, i.e. VARCHAR2,
709  *     NUMBER, and DATE. The procedure should be called in update mode.
710  *
711  *     For example:
712  *         IF p_create_update_flag = 'U' THEN
713  *             validate_nonupdateable( ... );
714  *         END IF;
715  *
716  * MODIFICATION HISTORY
717  *
718  *   07-23-2001    Jianying Huang      o Created.
719  *
720  */
721 
722 PROCEDURE validate_nonupdateable (
723     p_column                                IN     VARCHAR2,
724     p_column_value                          IN     VARCHAR2,
725     p_old_column_value                      IN     VARCHAR2,
726     p_restricted                            IN     VARCHAR2,
727     x_return_status                         IN OUT NOCOPY VARCHAR2
728 ) IS
729 
730     l_old_column_value                      VARCHAR2(2000);
731     l_error                                 BOOLEAN := FALSE;
732 
733 BEGIN
734 
735     IF p_column_value IS NOT NULL THEN
736       l_old_column_value := NVL(p_old_column_value, FND_API.G_MISS_CHAR);
737 
738       IF p_restricted = 'Y' THEN
739         IF p_column_value <> l_old_column_value THEN
740           l_error := TRUE;
741         END IF;
742       ELSE
743         IF l_old_column_value <> FND_API.G_MISS_CHAR AND
744            (p_column_value = FND_API.G_MISS_CHAR OR
745             p_column_value <> l_old_column_value)
746         THEN
747           l_error := TRUE;
748         END IF;
749       END IF;
750     END IF;
751 
752     IF l_error THEN
753       FND_MESSAGE.SET_NAME( 'AR', 'HZ_API_NONUPDATEABLE_COLUMN' );
754       FND_MESSAGE.SET_TOKEN( 'COLUMN', p_column );
755       FND_MSG_PUB.ADD;
756       x_return_status := FND_API.G_RET_STS_ERROR;
757     END IF;
758 
759 END validate_nonupdateable;
760 
761 PROCEDURE validate_nonupdateable (
762     p_column                                IN     VARCHAR2,
763     p_column_value                          IN     NUMBER,
764     p_old_column_value                      IN     NUMBER,
765     p_restricted                            IN     VARCHAR2,
766     x_return_status                         IN OUT NOCOPY VARCHAR2
767 ) IS
768 
769     l_old_column_value                      NUMBER;
770     l_error                                 BOOLEAN := FALSE;
771 
772 BEGIN
773 
774     IF p_column_value IS NOT NULL THEN
775       l_old_column_value := NVL(p_old_column_value, FND_API.G_MISS_NUM);
776 
777       IF p_restricted = 'Y' THEN
778         IF p_column_value <> l_old_column_value THEN
779           l_error := TRUE;
780         END IF;
781       ELSE
782         IF l_old_column_value <> FND_API.G_MISS_NUM AND
783            (p_column_value = FND_API.G_MISS_NUM OR
784             p_column_value <> l_old_column_value)
785         THEN
786           l_error := TRUE;
787         END IF;
788       END IF;
789     END IF;
790 
791     IF l_error THEN
792       FND_MESSAGE.SET_NAME( 'AR', 'HZ_API_NONUPDATEABLE_COLUMN' );
793       FND_MESSAGE.SET_TOKEN( 'COLUMN', p_column );
794       FND_MSG_PUB.ADD;
795       x_return_status := FND_API.G_RET_STS_ERROR;
796     END IF;
797 
798 END validate_nonupdateable;
799 
800 PROCEDURE validate_nonupdateable (
801     p_column                                IN     VARCHAR2,
802     p_column_value                          IN     DATE,
803     p_old_column_value                      IN     DATE,
804     p_restricted                            IN     VARCHAR2,
805     x_return_status                         IN OUT NOCOPY VARCHAR2
806 ) IS
807 
808     l_old_column_value                      DATE;
809     l_error                                 BOOLEAN := FALSE;
810 
811 BEGIN
812 
816       IF p_restricted = 'Y' THEN
813     IF p_column_value IS NOT NULL THEN
814       l_old_column_value := NVL(p_old_column_value, FND_API.G_MISS_DATE);
815 
817         IF p_column_value <> l_old_column_value THEN
818           l_error := TRUE;
819         END IF;
820       ELSE
821         IF l_old_column_value <> FND_API.G_MISS_DATE AND
822            (p_column_value = FND_API.G_MISS_DATE OR
823             p_column_value <> l_old_column_value)
824         THEN
825           l_error := TRUE;
826         END IF;
827       END IF;
828     END IF;
829 
830     IF l_error THEN
831       FND_MESSAGE.SET_NAME( 'AR', 'HZ_API_NONUPDATEABLE_COLUMN' );
832       FND_MESSAGE.SET_TOKEN( 'COLUMN', p_column );
833       FND_MSG_PUB.ADD;
834       x_return_status := FND_API.G_RET_STS_ERROR;
835     END IF;
836 
837 END validate_nonupdateable;
838 
839 /**
840  * PROCEDURE validate_start_end_date
841  *
842  * DESCRIPTION
843  *     Validate start data can not be earlier than end date.
844  *
845  * EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
846  *
847  * ARGUMENTS
848  *   IN:
849  *     p_create_update_flag           'C' ( create mode ), 'U' ( update mode )
850  *     p_start_date_column_name       Column name of start date
851  *     p_start_date                   New start date
852  *     p_old_start_date               Database start date in update mode
853  *     p_end_date_column_name         Column name of end date
854  *     p_end_date                     New end date
855  *     p_old_end_date                 Database end date in update mode
856  *   IN/OUT:
857  *     x_return_status                Return status.
858  *
859  * NOTES
860  *
861  * MODIFICATION HISTORY
862  *
863  *   07-23-2001    Jianying Huang      o Created.
864  *
865  */
866 
867 PROCEDURE validate_start_end_date (
868     p_create_update_flag                    IN     VARCHAR2,
869     p_start_date_column_name                IN     VARCHAR2,
870     p_start_date                            IN     DATE,
871     p_old_start_date                        IN     DATE,
872     p_end_date_column_name                  IN     VARCHAR2,
873     p_end_date                              IN     DATE,
874     p_old_end_date                          IN     DATE,
875     x_return_status                         IN OUT NOCOPY VARCHAR2
876 ) IS
877 
878     l_start_date                            DATE := p_old_start_date;
879     l_end_date                              DATE := p_old_end_date;
880 
881 BEGIN
882 
883     IF p_create_update_flag = 'C' THEN
884         l_start_date := p_start_date;
885         l_end_date := p_end_date;
886     ELSIF p_create_update_flag = 'U' THEN
887         IF p_start_date IS NOT NULL
888         THEN
889             IF p_start_date = FND_API.G_MISS_DATE THEN
890                 l_start_date := NULL;
891             ELSE
892                 l_start_date := p_start_date;
893             END IF;
894         END IF;
895 
896         IF p_end_date IS NOT NULL
897         THEN
898             IF p_end_date = FND_API.G_MISS_DATE THEN
899                 l_end_date := NULL;
900             ELSE
901                 l_end_date := p_end_date;
902             END IF;
903         END IF;
904     END IF;
905 
906     IF l_end_date IS NOT NULL AND
907        l_end_date <> FND_API.G_MISS_DATE AND
908        ( l_start_date IS NULL OR
909          l_start_date = FND_API.G_MISS_DATE OR
910          l_start_date > l_end_date )
911     THEN
912         FND_MESSAGE.SET_NAME( 'AR', 'HZ_API_DATE_GREATER' );
913         FND_MESSAGE.SET_TOKEN( 'DATE2', p_end_date_column_name );
914         FND_MESSAGE.SET_TOKEN( 'DATE1', p_start_date_column_name );
915         FND_MSG_PUB.ADD;
916         x_return_status := FND_API.G_RET_STS_ERROR;
917     END IF;
918 
919 END validate_start_end_date;
920 
921 /**
922  * PROCEDURE validate_cannot_update_to_null
923  *
924  * DESCRIPTION
925  *     Validate column cannot be updated to null.
926  *
927  * EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
928  *
929  * ARGUMENTS
930  *   IN:
931  *     p_column                       Column name you want to validate.
932  *     p_column_value                 Column value
933  *   IN/OUT:
934  *     x_return_status                Return status.
935  *
936  * NOTES
937  *     The procedure is overloaded for different column type, i.e. VARCHAR2,
938  *     NUMBER, and DATE. The procedure should be called in update mode.
939  *
940  *     For example:
941  *         IF p_create_update_flag = 'U' THEN
942  *             validate_cannot_update_to_null( ... );
943  *         END IF;
944  *
945  * MODIFICATION HISTORY
946  *
947  *   07-23-2001    Jianying Huang      o Created.
948  *
949  */
950 
951 PROCEDURE validate_cannot_update_to_null (
952     p_column                                IN     VARCHAR2,
953     p_column_value                          IN     VARCHAR2,
954     x_return_status                         IN OUT NOCOPY VARCHAR2
955 ) IS
956 
957 BEGIN
958 
959     IF p_column_value = FND_API.G_MISS_CHAR THEN
960         FND_MESSAGE.SET_NAME( 'AR', 'HZ_API_NONUPDATEABLE_TO_NULL' );
961         FND_MESSAGE.SET_TOKEN( 'COLUMN', p_column );
962         FND_MSG_PUB.ADD;
963         x_return_status := FND_API.G_RET_STS_ERROR;
964     END IF;
965 
966 END validate_cannot_update_to_null;
967 
968 PROCEDURE validate_cannot_update_to_null (
969     p_column                                IN     VARCHAR2,
970     p_column_value                          IN     NUMBER,
971     x_return_status                         IN OUT NOCOPY VARCHAR2
972 ) IS
973 
974 BEGIN
975 
976     IF p_column_value = FND_API.G_MISS_NUM THEN
977         FND_MESSAGE.SET_NAME( 'AR', 'HZ_API_NONUPDATEABLE_TO_NULL' );
978         FND_MESSAGE.SET_TOKEN( 'COLUMN', p_column );
979         FND_MSG_PUB.ADD;
980         x_return_status := FND_API.G_RET_STS_ERROR;
981     END IF;
982 
983 END validate_cannot_update_to_null;
984 
985 PROCEDURE validate_cannot_update_to_null (
986     p_column                                IN     VARCHAR2,
987     p_column_value                          IN     DATE,
988     x_return_status                         IN OUT NOCOPY VARCHAR2
989 ) IS
990 
991 BEGIN
992 
993     IF p_column_value = FND_API.G_MISS_DATE THEN
994         FND_MESSAGE.SET_NAME( 'AR', 'HZ_API_NONUPDATEABLE_TO_NULL' );
995         FND_MESSAGE.SET_TOKEN( 'COLUMN', p_column );
996         FND_MSG_PUB.ADD;
997         x_return_status := FND_API.G_RET_STS_ERROR;
998     END IF;
999 
1000 END validate_cannot_update_to_null;
1001 
1002 /**
1003  * PROCEDURE validate_cannot_update_to_null
1004  *
1005  * DESCRIPTION
1006  *     Validate column cannot be updated to null.
1007  *
1008  * EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
1009  *
1010  * ARGUMENTS
1011  *   IN:
1012  *     p_column                       Column name you want to validate.
1013  *     p_lookup_table                 Table/view name you want to validate against to.
1014  *                                    For now, we are supporting
1015  *                                       AR_LOOKUPS
1016  *                                       SO_LOOKUPS
1017  *                                       OE_SHIP_METHODS_V
1018  *                                       FND_LOOKUP_VALUES
1019  *                                    Default value is AR_LOOKUPS
1020  *     p_lookup_type                  FND lookup type
1021  *     p_column_value                 Column value
1022  *   IN/OUT:
1023  *     x_return_status                Return status.
1024  *
1025  * NOTES
1026  *     The procedure is using cache strategy for performance improvement.
1027  *
1028  * MODIFICATION HISTORY
1029  *
1030  *   07-23-2001    Jianying Huang      o Created.
1031  *
1032  */
1033 
1034 PROCEDURE validate_lookup (
1035     p_column                                IN     VARCHAR2,
1036     p_lookup_table                          IN     VARCHAR2,
1037     p_lookup_type                           IN     VARCHAR2,
1038     p_column_value                          IN     VARCHAR2,
1039     x_return_status                         IN OUT NOCOPY VARCHAR2
1040 ) IS
1041 
1042     l_error                                 BOOLEAN := FALSE;
1043 
1044 BEGIN
1045 
1046     IF p_column_value IS NOT NULL AND
1047        p_column_value <> FND_API.G_MISS_CHAR THEN
1048 
1049         IF p_lookup_type = 'YES/NO' THEN
1050             IF p_column_value NOT IN ('Y', 'N') THEN
1051                 l_error := TRUE;
1052             END IF;
1053         ELSE
1054             IF NOT search(p_lookup_table || G_SPECIAL_STRING ||
1055                           p_lookup_type || G_SPECIAL_STRING || p_column_value,
1056                           'LOOKUP')
1057             THEN
1058                 l_error := TRUE;
1059             END IF;
1060         END IF;
1061 
1062         IF l_error THEN
1063             FND_MESSAGE.SET_NAME( 'AR', 'HZ_API_INVALID_LOOKUP' );
1064             FND_MESSAGE.SET_TOKEN( 'COLUMN', p_column );
1065             FND_MESSAGE.SET_TOKEN( 'LOOKUP_TYPE', p_lookup_type );
1066             FND_MSG_PUB.ADD;
1067             x_return_status := FND_API.G_RET_STS_ERROR;
1068         END IF;
1069     END IF;
1070 
1071 END validate_lookup;
1072 
1073 /**
1074  * PROCEDURE enable_debug
1075  *
1076  * DESCRIPTION
1077  *     Enable file or dbms debug based on profile options.
1078  *     HZ_API_FILE_DEBUG_ON : Turn on/off file debug, i.e. debug message
1079  *                            will be written to a user specified file.
1080  *                            The file name and file path is stored in
1081  *                            profiles HZ_API_DEBUG_FILE_PATH and
1082  *                            HZ_API_DEBUG_FILE_NAME. File path must be
1083  *                            database writable.
1084  *     HZ_API_DBMS_DEBUG_ON : Turn on/off dbms debug.
1085  *
1086  * EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
1087  *
1088  * ARGUMENTS
1089  *
1090  * NOTES
1091  *
1092  * MODIFICATION HISTORY
1093  *
1094  *   07-23-2001    Jianying Huang      o Created.
1095  *
1096  */
1097 
1098 PROCEDURE enable_debug IS
1099 
1100 BEGIN
1101 
1102     G_COUNT := G_COUNT + 1;
1103 
1104     IF G_COUNT > 1 THEN
1105         RETURN;
1106     END IF;
1107 
1108     IF FND_PROFILE.value( 'HZ_API_FILE_DEBUG_ON' ) = 'Y' THEN
1109 
1110         G_FILE_NAME := FND_PROFILE.value( 'HZ_API_DEBUG_FILE_NAME' );
1111         G_FILE_PATH := FND_PROFILE.value( 'HZ_API_DEBUG_FILE_PATH' );
1112         enable_file_debug;
1113 /*
1114     ELSIF FND_PROFILE.value( 'HZ_API_DBMS_DEBUG_ON' ) = 'Y' THEN
1115 
1116         -- Enable calls to dbms_output.
1117         DBMS_OUTPUT.enable( G_BUFFER_SIZE );
1118         G_DBMS_DEBUG := TRUE;
1119 */
1120     END IF;
1121 
1122 END enable_debug;
1123 
1124 /**
1125  * PROCEDURE disable_debug
1126  *
1127  * DESCRIPTION
1128  *     Disable file or dbms debug.
1129  *
1130  * EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
1131  *
1132  * ARGUMENTS
1133  *
1134  * NOTES
1135  *
1136  * MODIFICATION HISTORY
1137  *
1138  *   07-23-2001    Jianying Huang      o Created.
1139  *
1140  */
1141 
1142 PROCEDURE disable_debug IS
1143 
1144 BEGIN
1145 
1146     G_COUNT := G_COUNT - 1;
1147 
1148     IF G_COUNT > 0 THEN
1149         RETURN;
1150     END IF;
1151 
1152     IF G_FILE_DEBUG THEN
1153         IF UTL_FILE.is_open( G_FILE ) THEN
1154         BEGIN
1155             UTL_FILE.fclose( G_FILE );
1156             G_FILE_DEBUG := FALSE;
1157         EXCEPTION
1158             WHEN UTL_FILE.INVALID_FILEHANDLE THEN
1159                 FND_MESSAGE.SET_NAME( 'FND', 'CONC-TEMPFILE_INVALID_HANDLE' );
1160                 FND_MESSAGE.SET_TOKEN( 'TEMP_FILE', G_FILE_NAME );
1161                 FND_MSG_PUB.ADD;
1162                 G_FILE_DEBUG := FALSE;
1163                 G_COUNT := 0;
1164                 RAISE FND_API.G_EXC_ERROR;
1165 
1166             WHEN UTL_FILE.WRITE_ERROR THEN
1167                 FND_MESSAGE.SET_NAME( 'FND', 'CONC-TEMPFILE_WRITE_ERROR' );
1168                 FND_MESSAGE.SET_TOKEN( 'TEMP_FILE', G_FILE_NAME );
1169                 FND_MSG_PUB.ADD;
1170                 G_FILE_DEBUG := FALSE;
1171                 G_COUNT := 0;
1172                 RAISE FND_API.G_EXC_ERROR;
1173         END;
1174         END IF;
1175 /*
1176     ELSIF G_DBMS_DEBUG THEN
1177         G_DBMS_DEBUG := FALSE;
1178 */
1179     END IF;
1180 
1181 END disable_debug;
1182 
1183 /**
1184  * PROCEDURE debug
1185  *
1186  * DESCRIPTION
1187  *     Put debug message.
1188  *
1189  * EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
1190  *
1191  * ARGUMENTS
1192  *   IN:
1193  *     p_message                      Message you want to put in log.
1194  *     p_prefix                       Prefix of the message. Default value is
1195  *                                    DEBUG.
1196  *     p_msg_level                    Message Level.Default value is 1 and the value should be between
1197  *                                    1 and 6 corresponding to FND_LOG's
1198  *                                    LEVEL_UNEXPECTED CONSTANT NUMBER  := 6;
1199  *                                    LEVEL_ERROR      CONSTANT NUMBER  := 5;
1200  *                                    LEVEL_EXCEPTION  CONSTANT NUMBER  := 4;
1201  *                                    LEVEL_EVENT      CONSTANT NUMBER  := 3;
1202  *                                    LEVEL_PROCEDURE  CONSTANT NUMBER  := 2;
1203  *                                    LEVEL_STATEMENT  CONSTANT NUMBER  := 1;
1204  *     p_module_prefix                Module prefix to store package name,form name.Default value is
1205  *                                    HZ_Package.
1206  *     p_module                       Module to store Procedure Name. Default value is HZ_Module.
1207  * NOTES
1208  *
1209  * MODIFICATION HISTORY
1210  *
1211  *   07-23-2001    Jianying Huang      o Created.
1212  *   09-10-2001    Jianying Huang      o Bug 1986499: Modified 'debug' procedure to take care of
1213  *                                       p_message is passed as NULL: Initilized l_len, l_times to
1214  *                                       0 and added NVL around l_len.
1215  *   10-Dec-2003   Ramesh Ch           Added p_msg_level,p_module_prefix,p_module parameters
1216  *                                     with default values as part of Common Logging Infrastrycture Uptake.
1217  *                                     Also modified the logic to call FND_LOG.STRING procedure to store the
1218  *                                     messages in FND_LOG_MESSAGES.
1219  */
1220 
1221 PROCEDURE debug (
1222     p_message                               IN     VARCHAR2,
1223     p_prefix                                IN     VARCHAR2 DEFAULT 'DEBUG',
1224     p_msg_level                             IN     NUMBER   DEFAULT FND_LOG.LEVEL_STATEMENT,
1225     p_module_prefix                         IN     VARCHAR2 DEFAULT 'HZ_Package',
1226     p_module                                IN     VARCHAR2 DEFAULT 'HZ_Module'
1227 ) IS
1228 
1229     l_message                               VARCHAR2(4000);
1230     l_module                                VARCHAR2(255);
1231 
1232 BEGIN
1233 
1234     l_module  :=SUBSTRB('ar.hz.plsql.'||p_module_prefix||'.'||p_module,1,255);
1235 
1236     IF p_prefix IS NOT NULL THEN
1237       l_message :=SUBSTRB(p_prefix||'-'||p_message,1,4000);
1238     ELSE
1239       l_message :=SUBSTRB(p_message,1,4000);
1240     END IF;
1241 
1242   if( p_msg_level >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) then
1243     FND_LOG.STRING(p_msg_level,l_module,l_message);
1244   end if;
1245 
1246 END debug;
1247 
1248 /**
1249  * PROCEDURE debug_return_messages
1250  *
1251  * DESCRIPTION
1252  *     Put debug messages based on message count in message stack.
1253  *
1254  * EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
1255  *
1256  * ARGUMENTS
1257  *   IN:
1258  *     p_msg_count                    Message count in message stack.
1259  *     p_msg_data                     Message data if message count is 1.
1260  *     p_msg_type                     Message type used as prefix of the message.
1261  *     p_msg_level                    Message Level.Default value is 1 and the value should be between
1262  *                                    1 and 6 corresponding to FND_LOG's
1263  *                                    LEVEL_UNEXPECTED CONSTANT NUMBER  := 6;
1264  *                                    LEVEL_ERROR      CONSTANT NUMBER  := 5;
1265  *                                    LEVEL_EXCEPTION  CONSTANT NUMBER  := 4;
1266  *                                    LEVEL_EVENT      CONSTANT NUMBER  := 3;
1267  *                                    LEVEL_PROCEDURE  CONSTANT NUMBER  := 2;
1268  *                                    LEVEL_STATEMENT  CONSTANT NUMBER  := 1;
1272  *
1269  *     p_module_prefix                Module prefix to store package name,form name.Default value is
1270  *                                    HZ_Package.
1271  *     p_module                       Module to store Procedure Name. Default value is HZ_Module.
1273  * NOTES
1274  *
1275  * MODIFICATION HISTORY
1276  *
1277  *   07-23-2001    Jianying Huang      o Created.
1278  *   10-Dec-2003   Ramesh Ch           Added p_msg_level,p_module_prefix,p_module parameters
1279  *                                     with default values as part of Common Logging Infrastrycture Uptake.
1280  *                                     Also passed in the additional parameters when calling debug procedure.
1281  *
1282  *
1283  */
1284 
1285 PROCEDURE debug_return_messages (
1286     p_msg_count                             IN     NUMBER,
1287     p_msg_data                              IN     VARCHAR2,
1288     p_msg_type                              IN     VARCHAR2 DEFAULT 'ERROR',
1289     p_msg_level                             IN     NUMBER   DEFAULT FND_LOG.LEVEL_STATEMENT,
1290     p_module_prefix                         IN     VARCHAR2 DEFAULT 'HZ_Package',
1291     p_module                                IN     VARCHAR2 DEFAULT 'HZ_Module'
1292 ) IS
1293 
1294     i                                       NUMBER;
1295 
1296 BEGIN
1297 
1298     IF (p_msg_count <= 0) or p_msg_count is null THEN
1299         RETURN;
1300     END IF;
1301 
1302     IF p_msg_count = 1 THEN
1303         debug( p_msg_data, p_msg_type,p_msg_level,p_module_prefix,p_module);
1304     ELSE
1305         FOR i IN 1..p_msg_count LOOP
1306             debug( FND_MSG_PUB.Get( p_encoded => FND_API.G_FALSE ), p_msg_type,p_msg_level,p_module_prefix,p_module);
1307         END LOOP;
1308     END IF;
1309 
1310 END debug_return_messages;
1311 
1312 /**
1313  * FUNCTION get_session_process_id
1314  *
1315  * DESCRIPTION
1316  *     Return OS process id of current session.
1317  *
1318  * EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
1319  *
1320  * ARGUMENTS
1321  *   IN:
1322  *
1323  * NOTES
1324  *
1325  * MODIFICATION HISTORY
1326  *
1327  *   07-23-2001    Jianying Huang      o Created.
1328  *
1329  */
1330 
1331 FUNCTION get_session_process_id RETURN VARCHAR2 IS
1332 
1333     l_spid                                  V$PROCESS.spid%TYPE;
1334 
1335 BEGIN
1336 
1337     SELECT SPID INTO l_spid
1338     FROM V$PROCESS
1339     WHERE ADDR = (
1340         SELECT PADDR
1341         FROM V$SESSION
1342         WHERE AUDSID = USERENV('SESSIONID') );
1343 
1344     RETURN ( l_spid );
1345 
1346 END get_session_process_id;
1347 
1348 /**
1349  * FUNCTION
1350  *     created_by
1351  *     creation_date
1352  *     last_updated_by
1353  *     last_update_date
1354  *     last_update_login
1355  *     request_id
1356  *     program_id
1357  *     program_application_id
1358  *     program_update_date
1359  *     user_id
1360  *     application_id
1361  *
1362  * DESCRIPTION
1363  *     Return standard who value.
1364  *
1365  * EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
1366  *
1367  * ARGUMENTS
1368  *   IN:
1369  *
1370  * NOTES
1371  *
1372  * MODIFICATION HISTORY
1373  *
1374  *   07-23-2001    Jianying Huang      o Created.
1375  *   01-27-2003    Sreedhar Mohan      o Added application_id.
1376  *
1377  */
1378 
1379 FUNCTION created_by RETURN NUMBER IS
1380 BEGIN
1381 
1382     RETURN NVL(FND_GLOBAL.user_id,-1);
1383 
1384 END created_by;
1385 
1386 FUNCTION creation_date RETURN DATE IS
1387 BEGIN
1388 
1389     RETURN SYSDATE;
1390 
1391 END creation_date;
1392 
1393 FUNCTION last_updated_by RETURN NUMBER IS
1394 BEGIN
1395 
1396     RETURN NVL(FND_GLOBAL.user_id,-1);
1397 
1398 END last_updated_by;
1399 
1400 FUNCTION last_update_date RETURN DATE IS
1401 BEGIN
1402 
1403     RETURN SYSDATE;
1404 
1405 END last_update_date;
1406 
1407 FUNCTION last_update_login RETURN NUMBER IS
1408 BEGIN
1409 
1410     IF FND_GLOBAL.conc_login_id = -1 OR
1411        FND_GLOBAL.conc_login_id IS NULL
1412     THEN
1413         RETURN FND_GLOBAL.login_id;
1414     ELSE
1415         RETURN FND_GLOBAL.conc_login_id;
1416     END IF;
1417 
1418 END last_update_login;
1419 
1420 FUNCTION request_id RETURN NUMBER IS
1421 BEGIN
1422 
1423     IF FND_GLOBAL.conc_request_id = -1 OR
1424        FND_GLOBAL.conc_request_id IS NULL
1425     THEN
1426         RETURN NULL;
1427     ELSE
1428         RETURN FND_GLOBAL.conc_request_id;
1429     END IF;
1430 
1431 END request_id;
1432 
1433 FUNCTION program_id RETURN NUMBER IS
1434 BEGIN
1435 
1436     IF FND_GLOBAL.conc_program_id = -1 OR
1437        FND_GLOBAL.conc_program_id IS NULL
1438     THEN
1439         RETURN NULL;
1440     ELSE
1441         RETURN FND_GLOBAL.conc_program_id;
1442     END IF;
1443 
1444 END program_id;
1445 
1446 FUNCTION program_application_id RETURN NUMBER IS
1447 BEGIN
1448 
1449     IF FND_GLOBAL.prog_appl_id = -1 OR
1450        FND_GLOBAL.prog_appl_id IS NULL
1451     THEN
1452         RETURN NULL;
1453     ELSE
1454         RETURN FND_GLOBAL.prog_appl_id;
1455     END IF;
1456 
1457 END program_application_id;
1458 
1459 FUNCTION application_id RETURN NUMBER IS
1460 BEGIN
1461 
1465         RETURN NULL;
1462     IF FND_GLOBAL.resp_appl_id = -1 OR
1463        FND_GLOBAL.resp_appl_id IS NULL
1464     THEN
1466     ELSE
1467         RETURN FND_GLOBAL.resp_appl_id;
1468     END IF;
1469 
1470 END application_id;
1471 
1472 FUNCTION program_update_date RETURN DATE IS
1473 BEGIN
1474 
1475     IF program_id IS NULL THEN
1476         RETURN NULL;
1477     ELSE
1478         RETURN SYSDATE;
1479     END IF;
1480 
1481 END program_update_date;
1482 
1483 FUNCTION user_id RETURN NUMBER IS
1484 BEGIN
1485 
1486     RETURN NVL(FND_GLOBAL.user_id,-1);
1487 
1488 END user_id;
1489 
1490 /**
1491  * FUNCTION incl_unrelated_entities
1492  *
1493  * DESCRIPTION
1494  *   Function to check the value of incl_unrelated_entities flag
1495  *   for a relationship type. the procedure has been put here to
1496  *   cache the values so that program does not hit database if the
1497  *   same relationship type has already been read.
1498  *
1499  * EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
1500  *
1501  * ARGUMENTS
1502  *   IN:
1503  *     p_relationship_type            Relationship type.
1504  *
1505  * NOTES
1506  *
1507  * MODIFICATION HISTORY
1508  *
1509  *   02-02-2002    Indrajit Sen        o Created.
1510  *
1511  */
1512 
1513 FUNCTION incl_unrelated_entities (
1514     p_relationship_type                     IN     VARCHAR2
1515 ) RETURN VARCHAR2 IS
1516 
1517     l_error                                 BOOLEAN := FALSE;
1518 
1519 BEGIN
1520 
1521     IF p_relationship_type IS NOT NULL AND
1522        p_relationship_type <> FND_API.G_MISS_CHAR THEN
1523 
1524         IF NOT search(p_relationship_type || G_SPECIAL_STRING,
1525                       'RELATIONSHIP_TYPE')
1526         THEN
1527             l_error := TRUE;
1528         END IF;
1529     END IF;
1530 
1531     IF l_error THEN
1532         RETURN 'N';
1533     ELSE
1534         RETURN 'Y';
1535     END IF;
1536 
1537 END incl_unrelated_entities;
1538 
1539 /**
1540  * FUNCTION Get_SchemaName
1541  *
1542  * DESCRIPTION
1543  *     Return Schema's Name By Given The Application's Short Name.
1544  *     The function will raise fnd_api.g_exc_unexpected_error if
1545  *     the short name can not be found in installation and put a
1546  *     message '<p_app_short_name> is not a valid oracle schema name.'
1547  *     in the message stack.
1548  *
1549  * EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
1550  *
1551  * ARGUMENTS
1552  *   IN:
1553  *     p_app_short_name               Application short name.
1554  *
1555  * NOTES
1556  *
1557  * MODIFICATION HISTORY
1558  *
1559  *   03-01-2002    Jianying Huang      o Created.
1560  *
1561  */
1562 
1563 FUNCTION Get_SchemaName (
1564     p_app_short_name             IN     VARCHAR2
1565 ) RETURN VARCHAR2 IS
1566 
1567     l_status                     VARCHAR2(30);
1568     l_industry                   VARCHAR2(30);
1569     l_schema_name                VARCHAR2(30);
1570     l_return_value               BOOLEAN;
1571 
1572 BEGIN
1573 
1574     l_return_value := fnd_installation.get_app_info(
1575         p_app_short_name, l_status, l_industry, l_schema_name);
1576 
1577     IF l_schema_name IS NULL THEN
1578       fnd_message.set_name('FND','FND_NO_SCHEMA_NAME');
1579       fnd_message.set_token('SCHEMA_NAME',p_app_short_name);
1580       fnd_msg_pub.add;
1581       RAISE fnd_api.g_exc_unexpected_error;
1582     ELSE
1583       RETURN l_schema_name;
1584     END IF;
1585 
1586 END Get_SchemaName;
1587 
1588 /**
1589  * FUNCTION Get_AppsSchemaName
1590  *
1591  * DESCRIPTION
1592  *     Return APPS Schema's Name
1593  *     The function will raise fnd_api.g_exc_unexpected_error if
1594  *     the 'FND' as a short name can not be found in installation.
1595  *     and put a message 'FND is not a valid oracle schema name.'
1596  *     in the message stack.
1597  *
1598  * EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
1599  *
1600  * ARGUMENTS
1601  *   IN:
1602  *
1603  * NOTES
1604  *
1605  * MODIFICATION HISTORY
1606  *
1607  *   03-01-2002    Jianying Huang      o Created.
1608  *
1609  */
1610 
1611 FUNCTION Get_AppsSchemaName RETURN VARCHAR2 IS
1612 
1613     l_aol_schema                 VARCHAR2(30);
1614     l_apps_schema                VARCHAR2(30);
1615     l_apps_mls_schema            VARCHAR2(30);
1616 
1617 BEGIN
1618 
1619     l_aol_schema := Get_SchemaName('FND');
1620     system.ad_apps_private.get_apps_schema_name(
1621         1, l_aol_schema, l_apps_schema, l_apps_mls_schema);
1622 
1623     RETURN l_apps_schema;
1624 
1625 END Get_AppsSchemaName;
1626 
1627 /**
1628  * FUNCTION Get_LookupMeaning
1629  *
1630  * DESCRIPTION
1631  *     Get lookup meaning. Return NULL if lookup code does
1632  *     not exist.
1633  *
1634  * EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
1635  *
1636  * ARGUMENTS
1637  *   IN:
1638  *     p_lookup_table                 Table/view name you want to validate against to.
1639  *                                    For now, we are supporting
1640  *                                       AR_LOOKUPS
1641  *                                       SO_LOOKUPS
1642  *                                       OE_SHIP_METHODS_V
1643  *                                       FND_LOOKUP_VALUES
1644  *                                    Default value is AR_LOOKUPS
1645  *     p_lookup_type                  FND lookup type
1646  *     p_lookup_code                  FND lookup code
1647  *
1648  * NOTES
1652  *   03-01-2002    Jianying Huang      o Created.
1649  *
1650  * MODIFICATION HISTORY
1651  *
1653  *
1654  */
1655 
1656 FUNCTION Get_LookupMeaning (
1657     p_lookup_table                          IN     VARCHAR2,
1658     p_lookup_type                           IN     VARCHAR2,
1659     p_lookup_code                           IN     VARCHAR2
1660 ) RETURN VARCHAR2 IS
1661 
1662     l_return                                BOOLEAN;
1663     l_lookup_meaning                        VARCHAR2(100);
1664 
1665 BEGIN
1666     l_return := search(p_lookup_table || G_SPECIAL_STRING ||
1667                   p_lookup_type || G_SPECIAL_STRING || p_lookup_code,
1668                   'LOOKUP', l_lookup_meaning, 'Get_LookupMeaning');
1669     RETURN l_lookup_meaning;
1670 
1671 END Get_LookupMeaning;
1672 
1673 /**
1674  * FUNCTION isColumnHasValue
1675  *
1676  * DESCRIPTION
1677  *    Return 'Y' if user populates the column with some value.
1678  *    Return 'N' if user does not.
1679  *    The function supports both V1 and V2 column style. It is
1680  *    helpful when obsolete a column and raise exception in
1681  *    development site based on if the column is populated.
1682  *
1683  * EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
1684  *
1685  * ARGUMENTS
1686  *   IN:
1687  *     p_api_version                  'V1' is for V1 API. 'V2' is for V2 API.
1688  *     p_create_update_flag           'C' is for create. 'U' is for update.
1689  *     p_column_value                 Value of the column.
1690  *     p_default_value                Default value of the column. Please note,
1691  *                                    for V1 API, most columns are defaulted to
1692  *                                    FND_API.G_MISS_XXX and for V2 API, we do
1693  *                                    not have default value for most columns.
1694  *     p_old_column_value             Database value of the column. Only used
1695  *                                    in update mode.
1696  *
1697  * NOTES
1698  *   I am not making the function as public for now because it is used only by
1699  *   obsoleting content_source_type.
1700  *
1701  * MODIFICATION HISTORY
1702  *
1703  *   03-01-2002    Jianying Huang      o Created.
1704  */
1705 
1706 FUNCTION isColumnHasValue (
1707     p_api_version                           IN     VARCHAR2,
1708     p_create_update_flag                    IN     VARCHAR2,
1709     p_column_value                          IN     VARCHAR2,
1710     p_default_value                         IN     VARCHAR2,
1711     p_old_column_value                      IN     VARCHAR2
1712 ) RETURN VARCHAR2 IS
1713 
1714     l_column_value                          VARCHAR2(2000);
1715     l_old_column_value                      VARCHAR2(2000);
1716 
1717 BEGIN
1718 
1719     l_column_value := NVL(p_column_value, FND_API.G_MISS_CHAR);
1720 
1721     IF p_create_update_flag = 'C' AND
1722        l_column_value <> FND_API.G_MISS_CHAR AND
1723        l_column_value <> NVL(p_default_value, FND_API.G_MISS_CHAR)
1724     THEN
1725       RETURN 'Y';
1726     ELSE
1727       l_old_column_value := NVL(p_old_column_value, FND_API.G_MISS_CHAR);
1728 
1729       IF l_column_value <> l_old_column_value AND
1730          l_column_value <> NVL(p_default_value, FND_API.G_MISS_CHAR)
1731       THEN
1732         RETURN 'Y';
1733       END IF;
1734     END IF;
1735 
1736     RETURN 'N';
1737 
1738 END isColumnHasValue;
1739 
1740 FUNCTION isColumnHasValue (
1741     p_api_version                           IN     VARCHAR2,
1742     p_create_update_flag                    IN     VARCHAR2,
1743     p_column_value                          IN     NUMBER,
1744     p_default_value                         IN     NUMBER,
1745     p_old_column_value                      IN     NUMBER
1746 ) RETURN VARCHAR2 IS
1747 
1748     l_column_value                          NUMBER;
1749     l_old_column_value                      NUMBER;
1750 
1751 BEGIN
1752 
1753     l_column_value := NVL(p_column_value, FND_API.G_MISS_NUM);
1754 
1755     IF p_create_update_flag = 'C' AND
1756        l_column_value <> FND_API.G_MISS_NUM AND
1757        l_column_value <> NVL(p_default_value, FND_API.G_MISS_NUM)
1758     THEN
1759       RETURN 'Y';
1760     ELSE
1761       l_old_column_value := NVL(p_old_column_value, FND_API.G_MISS_NUM);
1762 
1763       IF l_column_value <> l_old_column_value AND
1764          l_column_value <> NVL(p_default_value, FND_API.G_MISS_NUM)
1765       THEN
1766         RETURN 'Y';
1767       END IF;
1768     END IF;
1769 
1770     RETURN 'N';
1771 
1772 END isColumnHasValue;
1773 
1774 FUNCTION isColumnHasValue (
1775     p_api_version                           IN     VARCHAR2,
1776     p_create_update_flag                    IN     VARCHAR2,
1777     p_column_value                          IN     DATE,
1778     p_default_value                         IN     DATE,
1779     p_old_column_value                      IN     DATE
1780 ) RETURN VARCHAR2 IS
1781 
1782     l_column_value                          DATE;
1783     l_old_column_value                      DATE;
1784 
1785 BEGIN
1786 
1787     l_column_value := NVL(p_column_value, FND_API.G_MISS_DATE);
1788 
1789     IF p_create_update_flag = 'C' AND
1790        l_column_value <> FND_API.G_MISS_DATE AND
1791        l_column_value <> NVL(p_default_value, FND_API.G_MISS_DATE)
1792     THEN
1793       RETURN 'Y';
1794     ELSE
1795       l_old_column_value := NVL(p_old_column_value, FND_API.G_MISS_DATE);
1796 
1797       IF l_column_value <> l_old_column_value AND
1798          l_column_value <> NVL(p_default_value, FND_API.G_MISS_DATE) AND
1799          ((p_api_version = 'V1' AND
1800            (p_column_value IS NULL)) OR
1804         RETURN 'Y';
1801           (p_api_version = 'V2' AND
1802            p_column_value IS NOT NULL))
1803       THEN
1805       END IF;
1806     END IF;
1807 
1808     RETURN 'N';
1809 
1810 END isColumnHasValue;
1811 
1812 /**
1813  * FUNCTION Check_ObsoleteColumn
1814  *
1815  * DESCRIPTION
1816  *    Internal use only!!
1817  *    Set x_return_status to FND_API.G_RET_STS_ERROR when
1818  *    user is trying to pass value into an obsolete column
1819  *    in development site.
1820  *
1821  * EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
1822  *
1823  * ARGUMENTS
1824  *   IN:
1825  *     p_api_version                  'V1' is for V1 API. 'V2' is for V2 API.
1826  *     p_create_update_flag           'C' is for create. 'U' is for update.
1827  *     p_column                       Column name.
1828  *     p_column_value                 Value of the column.
1829  *     p_default_value                Default value of the column. Please note,
1830  *                                    for V1 API, most columns are defaulted to
1831  *                                    FND_API.G_MISS_XXX and for V2 API, we do
1832  *                                    not have default value for most columns.
1833  *     p_old_column_value             Database value of the column. Only used
1834  *                                    in update mode.
1835  *   OUT:
1836  *     x_return_status                Return FND_API.G_RET_STS_ERROR if user
1837  *                                    is trying to pass value into an obsolete
1838  *                                    column in development site.
1839  *
1840  * NOTES
1841  *   I am not making the function as public for now because it is used only by
1842  *   obsoleting content_source_type. It is worth to call this function only when
1843  *   you obsolete one column. If you are obsoleting more than one columns, it
1844  *   is better to cancat them and then decide if need to raise exception. For
1845  *   this limitation, it is not worth to provide the function for NUMBER and
1846  *   DATE type of column.
1847  *
1848  * MODIFICATION HISTORY
1849  *
1850  *   03-01-2002    Jianying Huang      o Created.
1851  */
1852 
1853 PROCEDURE Check_ObsoleteColumn (
1854     p_api_version                           IN     VARCHAR2,
1855     p_create_update_flag                    IN     VARCHAR2,
1856     p_column                                IN     VARCHAR2,
1857     p_column_value                          IN     VARCHAR2,
1858     p_default_value                         IN     VARCHAR2,
1859     p_old_column_value                      IN     VARCHAR2,
1860     x_return_status                         IN OUT NOCOPY VARCHAR2
1861 ) IS
1862 BEGIN
1863 
1864     IF FND_PROFILE.value('HZ_API_ERR_ON_OBSOLETE_COLUMN') = 'Y' AND
1865        isColumnHasValue (
1866          p_api_version, p_create_update_flag,
1867          p_column_value, p_default_value, p_old_column_value) = 'Y'
1868     THEN
1869       FND_MESSAGE.SET_NAME( 'AR', 'HZ_API_OBSOLETE_COLUMN' );
1870       FND_MESSAGE.SET_TOKEN( 'COLUMN', p_column );
1871       FND_MSG_PUB.ADD;
1872       x_return_status := FND_API.G_RET_STS_ERROR;
1873     END IF;
1874 
1875 END Check_ObsoleteColumn;
1876 
1877 FUNCTION is_active (
1878    start_date_active  IN  date,
1879    end_date_active IN date)
1880    RETURN VARCHAR2 IS
1881 
1882    active varchar2(10) := 'Yes';
1883    BEGIN
1884       if ((start_date_active > sysdate) OR (sysdate > end_date_active)) then
1885          active := 'No';
1886        end if;
1887       return active;
1888    END;
1889 
1890 /**
1891  * FUNCTION get_site_use_purpose
1892  *
1893  * DESCRIPTION
1894  *    used by common party UI .
1895  *    will return the first three site use type
1896 
1897  * ARGUMENTS
1898  *   IN:
1899  *     p_party_site_id               party site id used to retrieve the site use purpose.
1900  *
1901  *   RETURNS    : VARCHAR2
1902  *
1903 **/
1904 function get_site_use_purpose (
1905     p_party_site_id                         IN     NUMBER)
1906 RETURN VARCHAR2 IS
1907 
1908   l_site_use_purpose    VARCHAR2(100);
1909   l_top3_site_use_purposes    VARCHAR2(100) := '';
1910   l_count                     NUMBER := 0;
1911 
1912   cursor c_site_use_purposes (l_party_site_id IN NUMBER) is
1913     select al.MEANING
1914 --           psu.site_use_type,
1915 --           psu.primary_per_type
1916     from hz_party_sites ps,
1917          hz_party_site_uses psu,
1918          ar_lookups  al
1919     where
1920          ps.party_site_id = l_party_site_id and
1921          psu.party_site_id = ps.party_site_id and
1922          psu.status = 'A' and
1923          al.lookup_type  = 'PARTY_SITE_USE_CODE' and
1924          al.lookup_code  =  psu.SITE_USE_TYPE
1925          order by primary_per_type DESC;
1926 
1927 BEGIN
1928 
1929   OPEN c_site_use_purposes(p_party_site_id);
1930   LOOP
1931   FETCH c_site_use_purposes INTO l_site_use_purpose;
1932 
1933     IF c_site_use_purposes%NOTFOUND THEN
1934       EXIT;
1935     END IF;
1936 
1937 
1938     IF l_count = 3 THEN
1939       l_top3_site_use_purposes := concat(l_top3_site_use_purposes, ', ...');
1940       EXIT;
1941     END IF;
1942 
1943     IF l_top3_site_use_purposes is not null THEN
1944       l_top3_site_use_purposes := concat(l_top3_site_use_purposes, ', ');
1945     END IF;
1946 
1947     l_top3_site_use_purposes := concat(l_top3_site_use_purposes, l_site_use_purpose);
1948 
1949     l_count := l_count + 1;
1950   END LOOP;
1951   CLOSE c_site_use_purposes;
1952 
1953   RETURN l_top3_site_use_purposes;
1954 END get_site_use_purpose;
1955 
1956 /**
1957  * FUNCTION get_all_purposes
1961  *    will return all site use types
1958  *
1959  * DESCRIPTION
1960  *    used by common party UI .
1962 
1963  * ARGUMENTS
1964  *   IN:
1965  *     p_party_site_id               party site id used to retrieve the site use purpose.
1966  *
1967  *   RETURNS    : VARCHAR2
1968  *
1969 **/
1970 function get_all_purposes (
1971     p_party_site_id                         IN     NUMBER)
1972 RETURN VARCHAR2 IS
1973 
1974   l_site_use_purpose    VARCHAR2(100);
1975   l_all_site_use_purposes    VARCHAR2(1000) := '';
1976 
1977   cursor c_site_use_purposes (l_party_site_id IN NUMBER) is
1978     select al.MEANING
1979     from hz_party_sites ps,
1980          hz_party_site_uses psu,
1981          ar_lookups  al
1982     where
1983          ps.party_site_id = l_party_site_id and
1984          psu.party_site_id = ps.party_site_id and
1985          psu.status = 'A' and
1986          al.lookup_type  = 'PARTY_SITE_USE_CODE' and
1987          al.lookup_code  =  psu.SITE_USE_TYPE
1988          order by primary_per_type DESC;
1989 
1990 BEGIN
1991 
1992   OPEN c_site_use_purposes(p_party_site_id);
1993   LOOP
1994   FETCH c_site_use_purposes INTO l_site_use_purpose;
1995 
1996     IF c_site_use_purposes%NOTFOUND THEN
1997       EXIT;
1998     END IF;
1999 
2000     IF l_all_site_use_purposes is not null THEN
2001       l_all_site_use_purposes := concat(l_all_site_use_purposes, ', ');
2002     END IF;
2003 
2004     l_all_site_use_purposes := concat(l_all_site_use_purposes, l_site_use_purpose);
2005 
2006   END LOOP;
2007   CLOSE c_site_use_purposes;
2008 
2009   RETURN l_all_site_use_purposes;
2010 END get_all_purposes;
2011 
2012 /**
2013  * FUNCTION get_acct_site_purposes
2014  *
2015  * DESCRIPTION
2016  *    used by common party UI .
2017  *    will return all acct site uses
2018 
2019  * ARGUMENTS
2020  *   IN:
2021  *     p_acct_site_id               acct site id used to retrieve the site use purpose.
2022  *
2023  *   RETURNS    : VARCHAR2
2024  *
2025  *  09-Sep-2010    Nishant Singhai     o Bug 10040575: Modified get_acct_site_purposes function to
2026  *                                       limit the return value to 1000 chars
2027  *
2028 **/
2029 function get_acct_site_purposes (
2030     p_acct_site_id                         IN     NUMBER)
2031 RETURN VARCHAR2 IS
2032 
2033   l_site_use_purpose    VARCHAR2(100);
2034   l_all_site_use_purposes    VARCHAR2(1000) := '';
2035 
2036   cursor c_site_use_purposes (l_acct_site_id IN NUMBER) is
2037     select al.MEANING
2038     from hz_cust_acct_sites s,
2039          hz_cust_site_uses u,
2040          ar_lookups  al
2041     where
2042          s.cust_acct_site_id = l_acct_site_id and
2043          u.cust_acct_site_id = s.cust_acct_site_id and
2044          u.status = 'A' and
2045          al.lookup_type  = 'SITE_USE_CODE' and
2046          al.lookup_code  =  u.SITE_USE_CODE
2047          ORDER BY  U.PRIMARY_FLAG DESC, u.creation_date, AL.MEANING;
2048 
2049 BEGIN
2050 
2051   OPEN c_site_use_purposes(p_acct_site_id);
2052   LOOP
2053   FETCH c_site_use_purposes INTO l_site_use_purpose;
2054 
2055     IF c_site_use_purposes%NOTFOUND THEN
2056       EXIT;
2057     END IF;
2058 
2059     -- Nishant Singhai (Bug 10040575 -- limit the fetch to 1000 chars)
2060     --(check random number 950 which is less than 1000 but should be sufficenit to accomodate
2061     -- a big site use value till 980 -990 char - assumption )
2062     IF length(l_all_site_use_purposes) > 950 THEN
2063       l_all_site_use_purposes := concat(l_all_site_use_purposes, ', ...');
2064       EXIT;
2065     END IF;
2066     -- End of fix for Bug 10040575
2067 
2068     IF l_all_site_use_purposes is not null THEN
2069       l_all_site_use_purposes := concat(l_all_site_use_purposes, ', ');
2070     END IF;
2071 
2072     l_all_site_use_purposes := concat(l_all_site_use_purposes, l_site_use_purpose);
2073 
2074   END LOOP;
2075   CLOSE c_site_use_purposes;
2076 
2077   RETURN l_all_site_use_purposes;
2078 END get_acct_site_purposes;
2079 
2080 
2081 /**
2082  * FUNCTION validate_flex_address
2083  *
2084  * DESCRIPTION
2085  *    used by common party UI .
2086  *    will validate the flex address
2087  *    and return 'Y'/'N'
2088  * ARGUMENTS
2089  *   IN:
2090  *     p_context_value : context_value
2091  *     p_address1 :      address1
2092  *     p_address2 :      address2
2093  *     p_address3 :      address3
2094  *     p_address4 :      address4
2095  *     p_address_lines_phonetic: address_lines_phonetic
2096  *     p_city :          city
2097  *     p_county :        county
2098  *     p_postal_code :   postal_code
2099  *     p_province :      province
2100  *     p_state :         state
2101  *     p_attribute1 :    attribute1
2102  *     p_attribute2 :    attribute2
2103  *     p_attribute3 :    attribute3
2104  *     p_attribute4 :    attribute4
2105  *     p_attribute5 :    attribute5
2106  *     p_attribute6 :    attribute6
2107  *     p_attribute7 :    attribute7
2108  *     p_attribute8 :    attribute8
2109  *     p_attribute9 :    attribute9
2110  *     p_attribute10:    attribute10
2111  *     p_attribute11:    attribute11
2112  *     p_attribute12:    attribute12
2113  *     p_attribute13:    attribute13
2114  *     p_attribute14:    attribute14
2115  *     p_attribute15:    attribute15
2116  *     p_attribute16:    attribute16
2117  *     p_attribute17:    attribute17
2118  *     p_attribute18:    attribute18
2119  *     p_attribute19:    attribute19
2120  *     p_attribute20:    attribute20
2121  *     p_postal_plu4_code :   postal_plu4_code --added against bug 7671107
2122  *
2126 FUNCTION validate_flex_address (
2123  *   RETURNS    : VARCHAR2
2124  *
2125 **/
2127     p_context_value                               IN     VARCHAR2,
2128     p_address1                                    IN     VARCHAR2,
2129     p_address2                                    IN     VARCHAR2,
2130     p_address3                                    IN     VARCHAR2,
2131     p_address4                                    IN     VARCHAR2,
2132     p_address_lines_phonetic                      IN     VARCHAR2,
2133     p_city                                        IN     VARCHAR2,
2134     p_county                                      IN     VARCHAR2,
2135     p_postal_code                                 IN     VARCHAR2,
2136     p_province                                    IN     VARCHAR2,
2137     p_state                                       IN     VARCHAR2,
2138     p_attribute1                                  IN     VARCHAR2,
2139     p_attribute2                                  IN     VARCHAR2,
2140     p_attribute3                                  IN     VARCHAR2,
2141     p_attribute4                                  IN     VARCHAR2,
2142     p_attribute5                                  IN     VARCHAR2,
2143     p_attribute6                                  IN     VARCHAR2,
2144     p_attribute7                                  IN     VARCHAR2,
2145     p_attribute8                                  IN     VARCHAR2,
2146     p_attribute9                                  IN     VARCHAR2,
2147     p_attribute10                                 IN     VARCHAR2,
2148     p_attribute11                                 IN     VARCHAR2,
2149     p_attribute12                                 IN     VARCHAR2,
2150     p_attribute13                                 IN     VARCHAR2,
2151     p_attribute14                                 IN     VARCHAR2,
2152     p_attribute15                                 IN     VARCHAR2,
2153     p_attribute16                                 IN     VARCHAR2,
2154     p_attribute17                                 IN     VARCHAR2,
2155     p_attribute18                                 IN     VARCHAR2,
2156     p_attribute19                                 IN     VARCHAR2,
2157     p_attribute20                                 IN     VARCHAR2,
2158     p_postal_plu4_code                            IN     VARCHAR2 --added against bug 7671107
2159 
2160 ) RETURN VARCHAR2 IS
2161 
2162     l_return                            VARCHAR2(1) := 'N';
2163     appl_short_name         varchar2(30) := 'AR';
2164     desc_flex_name          varchar2(30) := 'Remit Address HZ';
2165     values_or_ids           varchar2(10) := 'I'; --FND BUG 4220582
2166     validation_date         DATE         := SYSDATE;
2167     error_msg               VARCHAR2(5000);
2168     errors_received        EXCEPTION;
2169 
2170 BEGIN
2171 
2172 --*********************************************************
2173 --* set the context value                                 *
2174 --*********************************************************
2175 FND_FLEX_DESCVAL.set_context_value(p_context_value);
2176 --*********************************************************
2177 --* set the address attributes value                      *
2178 --*********************************************************
2179 fnd_flex_descval.set_column_value('ADDRESS1', p_address1 );
2180 fnd_flex_descval.set_column_value('ADDRESS2', p_address2 );
2181 fnd_flex_descval.set_column_value('ADDRESS3', p_address3 );
2182 fnd_flex_descval.set_column_value('ADDRESS4', p_address4 );
2183 fnd_flex_descval.set_column_value('ADDRESS_LINES_PHONETIC', p_address_lines_phonetic );
2184 fnd_flex_descval.set_column_value('CITY', p_city );
2185 fnd_flex_descval.set_column_value('COUNTY', p_county );
2186 fnd_flex_descval.set_column_value('STATE', p_state );
2187 fnd_flex_descval.set_column_value('PROVINCE', p_province );
2188 fnd_flex_descval.set_column_value('POSTAL_CODE', p_postal_code);
2189 fnd_flex_descval.set_column_value('ATTRIBUTE1', p_attribute1 );
2190 fnd_flex_descval.set_column_value('ATTRIBUTE2', p_attribute2 );
2191 fnd_flex_descval.set_column_value('ATTRIBUTE3', p_attribute3 );
2192 fnd_flex_descval.set_column_value('ATTRIBUTE4', p_attribute4 );
2193 fnd_flex_descval.set_column_value('ATTRIBUTE5', p_attribute5 );
2194 fnd_flex_descval.set_column_value('ATTRIBUTE6', p_attribute6 );
2195 fnd_flex_descval.set_column_value('ATTRIBUTE7', p_attribute7 );
2196 fnd_flex_descval.set_column_value('ATTRIBUTE8', p_attribute8 );
2197 fnd_flex_descval.set_column_value('ATTRIBUTE9', p_attribute9 );
2198 fnd_flex_descval.set_column_value('ATTRIBUTE10', p_attribute10 );
2199 fnd_flex_descval.set_column_value('ATTRIBUTE11', p_attribute11 );
2200 fnd_flex_descval.set_column_value('ATTRIBUTE12', p_attribute12 );
2201 fnd_flex_descval.set_column_value('ATTRIBUTE13', p_attribute13 );
2202 fnd_flex_descval.set_column_value('ATTRIBUTE14', p_attribute14 );
2203 fnd_flex_descval.set_column_value('ATTRIBUTE15', p_attribute15 );
2204 fnd_flex_descval.set_column_value('ATTRIBUTE16', p_attribute16 );
2205 fnd_flex_descval.set_column_value('ATTRIBUTE17', p_attribute17 );
2206 fnd_flex_descval.set_column_value('ATTRIBUTE18', p_attribute18 );
2207 fnd_flex_descval.set_column_value('ATTRIBUTE19', p_attribute19 );
2208 fnd_flex_descval.set_column_value('ATTRIBUTE20', p_attribute20 );
2209 fnd_flex_descval.set_column_value('POSTAL_PLUS4_CODE', p_postal_plu4_code); -- added against bug 7671107
2210 
2211 IF  FND_FLEX_DESCVAL.validate_desccols(
2212       appl_short_name,
2213       desc_flex_name,
2214       values_or_ids,
2215       validation_date)
2216 THEN
2217       l_return := 'Y';
2218       return l_return;
2219 ELSE
2220    RAISE errors_received;
2221 END IF;
2222 
2223 EXCEPTION
2224  WHEN errors_received THEN
2225    error_msg := fnd_flex_descval.encoded_error_message;
2226    FND_MESSAGE.SET_ENCODED(error_msg);
2227    FND_MSG_PUB.Add;
2228    return l_return;
2229  WHEN others THEN
2230    return l_return;
2231 
2232 END validate_flex_address;
2233 
2234 /**
2238  *    used by common party UI .
2235  * FUNCTION validate_desc_flex
2236  *
2237  * DESCRIPTION
2239  *    will validate the descriptive flex
2240  *    and return 'Y'/'N'
2241  * ARGUMENTS
2242  *   IN:
2243  *     p_appl_short_name:appl_short_name
2244  *     p_desc_flex_name :desc_flex_name
2245  *     p_context_value : context_value
2246  *     p_attribute1 :    attribute1
2247  *     p_attribute2 :    attribute2
2248  *     p_attribute3 :    attribute3
2249  *     p_attribute4 :    attribute4
2250  *     p_attribute5 :    attribute5
2251  *     p_attribute6 :    attribute6
2252  *     p_attribute7 :    attribute7
2253  *     p_attribute8 :    attribute8
2254  *     p_attribute9 :    attribute9
2255  *     p_attribute10:    attribute10
2256  *     p_attribute11:    attribute11
2257  *     p_attribute12:    attribute12
2258  *     p_attribute13:    attribute13
2259  *     p_attribute14:    attribute14
2260  *     p_attribute15:    attribute15
2261  *     p_attribute16:    attribute16
2262  *     p_attribute17:    attribute17
2263  *     p_attribute18:    attribute18
2264  *     p_attribute19:    attribute19
2265  *     p_attribute20:    attribute20
2266  *     p_attribute21:    attribute21
2267  *     p_attribute22:    attribute22
2268  *     p_attribute23:    attribute23
2269  *     p_attribute24:    attribute24
2270  *   RETURNS    : VARCHAR2
2271  *
2272 **/
2273 FUNCTION validate_desc_flex (
2274     p_appl_short_name                             IN     VARCHAR2,
2275     p_desc_flex_name                              IN     VARCHAR2,
2276     p_context_value                               IN     VARCHAR2,
2277     p_attribute1                                  IN     VARCHAR2,
2278     p_attribute2                                  IN     VARCHAR2,
2279     p_attribute3                                  IN     VARCHAR2,
2280     p_attribute4                                  IN     VARCHAR2,
2281     p_attribute5                                  IN     VARCHAR2,
2282     p_attribute6                                  IN     VARCHAR2,
2283     p_attribute7                                  IN     VARCHAR2,
2284     p_attribute8                                  IN     VARCHAR2,
2285     p_attribute9                                  IN     VARCHAR2,
2286     p_attribute10                                 IN     VARCHAR2,
2287     p_attribute11                                 IN     VARCHAR2,
2288     p_attribute12                                 IN     VARCHAR2,
2289     p_attribute13                                 IN     VARCHAR2,
2290     p_attribute14                                 IN     VARCHAR2,
2291     p_attribute15                                 IN     VARCHAR2,
2292     p_attribute16                                 IN     VARCHAR2,
2293     p_attribute17                                 IN     VARCHAR2,
2294     p_attribute18                                 IN     VARCHAR2,
2295     p_attribute19                                 IN     VARCHAR2,
2296     p_attribute20                                 IN     VARCHAR2,
2297     p_attribute21                                 IN     VARCHAR2,
2298     p_attribute22                                 IN     VARCHAR2,
2299     p_attribute23                                 IN     VARCHAR2,
2300     p_attribute24                                 IN     VARCHAR2
2301 ) RETURN VARCHAR2 IS
2302 
2303     l_return                            VARCHAR2(1) := 'N';
2304     appl_short_name         varchar2(30) := p_appl_short_name;
2305     desc_flex_name          varchar2(30) := p_desc_flex_name;
2306     values_or_ids           varchar2(10) := 'I'; --Bug 5356950
2307     validation_date         DATE         := SYSDATE;
2308     error_msg               VARCHAR2(5000);
2309     errors_received        EXCEPTION;
2310 
2311 BEGIN
2312 
2313 --*********************************************************
2314 --* set the context value                                 *
2315 --*********************************************************
2316 FND_FLEX_DESCVAL.set_context_value(p_context_value);
2317 --*********************************************************
2318 --* set the attributes value                                 *
2319 --*********************************************************
2320 fnd_flex_descval.set_column_value('ATTRIBUTE1', p_attribute1 );
2321 fnd_flex_descval.set_column_value('ATTRIBUTE2', p_attribute2 );
2322 fnd_flex_descval.set_column_value('ATTRIBUTE3', p_attribute3 );
2323 fnd_flex_descval.set_column_value('ATTRIBUTE4', p_attribute4 );
2324 fnd_flex_descval.set_column_value('ATTRIBUTE5', p_attribute5 );
2325 fnd_flex_descval.set_column_value('ATTRIBUTE6', p_attribute6 );
2326 fnd_flex_descval.set_column_value('ATTRIBUTE7', p_attribute7 );
2327 fnd_flex_descval.set_column_value('ATTRIBUTE8', p_attribute8 );
2328 fnd_flex_descval.set_column_value('ATTRIBUTE9', p_attribute9 );
2329 fnd_flex_descval.set_column_value('ATTRIBUTE10', p_attribute10 );
2330 fnd_flex_descval.set_column_value('ATTRIBUTE11', p_attribute11 );
2331 fnd_flex_descval.set_column_value('ATTRIBUTE12', p_attribute12 );
2332 fnd_flex_descval.set_column_value('ATTRIBUTE13', p_attribute13 );
2333 fnd_flex_descval.set_column_value('ATTRIBUTE14', p_attribute14 );
2334 fnd_flex_descval.set_column_value('ATTRIBUTE15', p_attribute15 );
2335 fnd_flex_descval.set_column_value('ATTRIBUTE16', p_attribute16 );
2336 fnd_flex_descval.set_column_value('ATTRIBUTE17', p_attribute17 );
2337 fnd_flex_descval.set_column_value('ATTRIBUTE18', p_attribute18 );
2338 fnd_flex_descval.set_column_value('ATTRIBUTE19', p_attribute19 );
2339 fnd_flex_descval.set_column_value('ATTRIBUTE20', p_attribute20 );
2340 IF p_desc_flex_name <> 'HZ_PARTY_SITES' THEN
2341 fnd_flex_descval.set_column_value('ATTRIBUTE21', p_attribute21 );
2342 fnd_flex_descval.set_column_value('ATTRIBUTE22', p_attribute22 );
2343 fnd_flex_descval.set_column_value('ATTRIBUTE23', p_attribute23 );
2344 fnd_flex_descval.set_column_value('ATTRIBUTE24', p_attribute24 );
2345 END IF;
2346 
2347 IF  FND_FLEX_DESCVAL.validate_desccols(
2351       validation_date)
2348       appl_short_name,
2349       desc_flex_name,
2350       values_or_ids,
2352 THEN
2353       l_return := 'Y';
2354       return l_return;
2355 ELSE
2356    RAISE errors_received;
2357 END IF;
2358 
2359 EXCEPTION
2360  WHEN errors_received THEN
2361    error_msg := fnd_flex_descval.encoded_error_message;
2362    FND_MESSAGE.SET_ENCODED(error_msg);
2363    FND_MSG_PUB.Add;
2364    return l_return;
2365  WHEN others THEN
2366    return l_return;
2367 
2368 END validate_desc_flex;
2369 
2370 /**
2371  * FUNCTION get_org_contact_role
2372  *
2373  * DESCRIPTION
2374  *    used by common party UI .
2375  *    added by albert (tsli)
2376  *    will return the first three org contact roles
2377 
2378  * ARGUMENTS
2379  *   IN:
2380  *     p_org_contact_id               org contact id used to retrieve the org contact roles.
2381  *
2382  *   RETURNS    : VARCHAR2
2383  *
2384 **/
2385 
2386 FUNCTION get_org_contact_role (
2387     p_org_contact_id              IN     NUMBER
2388 ) RETURN VARCHAR2 IS
2389 
2390     TYPE varchar2_table IS TABLE OF VARCHAR2(80); --5960623
2391     org_contact_roles_tab         varchar2_table;
2392 
2393     l_top3_org_contact_roles      VARCHAR2(100);
2394     l_count                       NUMBER;
2395 
2396     CURSOR c_org_contact_roles IS
2397     SELECT lu.meaning
2398     FROM   hz_org_contact_roles ocr,
2399            fnd_lookup_values lu
2400     WHERE  ocr.org_contact_id = p_org_contact_id
2401     AND    ocr.status = 'A'
2402     AND    lu.view_application_id = 222
2403     AND    lu.language = userenv('LANG')
2404     AND    lu.lookup_type = 'CONTACT_ROLE_TYPE'
2405     AND    lu.lookup_code = ocr.role_type;
2406 
2407 BEGIN
2408 
2409     OPEN c_org_contact_roles;
2410     FETCH c_org_contact_roles BULK COLLECT INTO org_contact_roles_tab;
2411 
2412     l_top3_org_contact_roles := '';
2413 
2414     IF org_contact_roles_tab.count > 0 THEN
2415       l_count := 1;
2416 
2417       WHILE (l_count <= 3 AND l_count <= org_contact_roles_tab.count)
2418       LOOP
2419         IF l_count > 1 THEN
2420           l_top3_org_contact_roles := l_top3_org_contact_roles || ', ';
2421         END IF;
2422 
2423         l_top3_org_contact_roles := l_top3_org_contact_roles ||
2424                                     org_contact_roles_tab(l_count);
2425 
2426 
2427         l_count := l_count + 1;
2428       END LOOP;
2429 
2430       IF org_contact_roles_tab.count > 3 THEN
2431         l_top3_org_contact_roles := l_top3_org_contact_roles || ', ...';
2432       END IF;
2433     END IF;
2434     CLOSE c_org_contact_roles;
2435 
2436     RETURN l_top3_org_contact_roles;
2437 
2438 END get_org_contact_role;
2439 
2440 /**
2441  * FUNCTION get_primary_phone
2442  *
2443  * DESCRIPTION
2444  *    used by common party UI .
2445  *    added by albert (tsli)
2446  *    will return the primary phone
2447  * ARGUMENTS
2448  *   IN:
2449  *     p_party_id               party id used to retrieve the primary phone
2450  *
2451  *   RETURNS    : VARCHAR2
2452  *
2453 **/
2454 
2455 function get_primary_phone (
2456     p_party_id                         IN     NUMBER,
2457     p_display_purpose                  IN     VARCHAR2 := fnd_api.g_true)
2458 RETURN VARCHAR2 IS
2459 l_contact_point_id NUMBER;
2460 BEGIN
2461 
2462     BEGIN
2463     select
2464         contact_point_id
2465     INTO l_contact_point_id
2466     from hz_contact_points CPPH
2467     where contact_point_type = 'PHONE'
2468     and primary_flag = 'Y'
2469     and status = 'A'
2470     and OWNER_TABLE_NAME = 'HZ_PARTIES'
2471     and OWNER_TABLE_ID = p_party_id
2472     and rownum = 1;
2473 
2474     EXCEPTION
2475     WHEN NO_DATA_FOUND THEN
2476       RETURN NULL;
2477     END;
2478 
2479     RETURN hz_format_phone_v2pub.get_formatted_phone(l_contact_point_id,p_display_purpose);
2480 END get_primary_phone;
2481 
2482 /**
2483  * FUNCTION get_primary_email
2484  *
2485  * DESCRIPTION
2486  *    used by common party UI .
2487  *    added by albert (tsli)
2488  *    will return the primary email
2489  * ARGUMENTS
2490  *   IN:
2491  *     p_party_id               party id used to retrieve the primary email
2492  *
2493  *   RETURNS    : VARCHAR2
2494  *
2495 **/
2496 function get_primary_email (
2497     p_party_id                         IN     NUMBER)
2498 RETURN VARCHAR2 IS
2499 l_primary_email VARCHAR2(2000);
2500 BEGIN
2501 
2502     select email_address
2503     INTO l_primary_email
2504     from hz_contact_points
2505     where contact_point_type = 'EMAIL'
2506     and primary_flag = 'Y'
2507     and status = 'A'
2508     and OWNER_TABLE_NAME = 'HZ_PARTIES'
2509     and OWNER_TABLE_ID = p_party_id
2510     and rownum = 1;
2511 
2512     RETURN l_primary_email;
2513 END get_primary_email;
2514 
2515 PROCEDURE find_index_name(
2516                         p_index_name OUT NOCOPY VARCHAR2) IS
2517   tmp_errm VARCHAR2(500);
2518   n NUMBER;
2519   m NUMBER;
2520   i NUMBER;
2521   BEGIN
2522    n := INSTR(sqlerrm, '(', 1,1) ;
2523    m := INSTR(sqlerrm, ')', 1,1) ;
2524    i := m -n;
2525    tmp_errm := SUBSTRB(sqlerrm, n, i);
2526    n := INSTR(tmp_errm, '.', 1,1) ;
2527    p_index_name := SUBSTRB(tmp_errm, n+1, i-1);
2528 END find_index_name;
2529 
2530 
2531 /**
2532  * FUNCTION GET_YAHOO_MAP_URL
2533  *
2534  * DESCRIPTION
2535  *    function that would return a html link tag which
2536  *    will contain the address formatted for Yahoo Maps.
2537  * ARGUMENTS
2538  *   IN:
2539  *        address1                IN VARCHAR2,
2540  *        address2                IN VARCHAR2,
2541  *        address3                IN VARCHAR2,
2542  *        address4                IN VARCHAR2,
2543  *        city                    IN VARCHAR2,
2544  *        country                 IN VARCHAR2,
2545  *        state                   IN VARCHAR2,
2546  *        postal_code             IN VARCHAR2
2547  *
2548  *   RETURNS    : VARCHAR2
2549  *
2550 **/
2551 
2552 FUNCTION GET_YAHOO_MAP_URL(address1                IN VARCHAR2,
2553                            address2                IN VARCHAR2,
2554                            address3                IN VARCHAR2,
2555                            address4                IN VARCHAR2,
2556                            city                    IN VARCHAR2,
2557                            country                 IN VARCHAR2,
2558                            state                   IN VARCHAR2,
2559                            postal_code             IN VARCHAR2)
2560 RETURN VARCHAR2 AS
2561     url VARCHAR2(200);
2562     url2 VARCHAR2(700);
2563     country_code VARCHAR2(20);
2564     amp VARCHAR2(01) := '&';
2565     staticURL VARCHAR2(100) := 'http://maps.yahoo.com/py/maps.py?BFCat=' || amp || 'Pyt=Tmap' || amp || 'newFL=Use+Address+Below' || amp || 'Get Map=Get+Map';
2566 
2567 BEGIN
2568 
2569 -- Since TCA validates the country code of UK to GB and Yahoo Maps expects 'uk'
2570 -- we resort to this work around
2571     IF upper(rtrim(country)) = 'GB'
2572     THEN
2573        country_code := 'UK';
2574     ELSE
2575        country_code := rtrim(country);
2576     END IF;
2577 
2578     URL2 := staticURL ||
2579            amp || 'addr=' || REPLACE(address1, ' ', '+') ||
2580            amp || 'csz=' || REPLACE(city, ' ', '+') || '+' || RTRIM(state) || '+' || RTRIM(postal_code) ||
2581            amp || 'country=' || country_code;
2582 
2583     URL := substrb(URL2, 1, 200);
2584     RETURN url;
2585 END GET_YAHOO_MAP_URL;
2586 
2587 /**
2588  * FUNCTION IS_PARTY_ID_IN_REQUEST_LOG
2589  *
2590  * DESCRIPTION
2591  *    function that would return a 'Y' if this party_id exist in hz_dnb_request_log
2592  *    return 'N' if not.
2593  * ARGUMENTS
2594  *     party_id             IN     NUMBER
2595  *
2596  *   RETURNS    : VARCHAR2
2597 */
2598 
2599 FUNCTION IS_PARTY_ID_IN_REQUEST_LOG(
2600               p_party_id             IN     NUMBER)
2601 
2602 RETURN VARCHAR2 AS
2603 
2604   l_exist      varchar2(1)  := 'N';
2605 
2606 /* Bug 3301467 : Comment the cursor code
2607 
2608   CURSOR c IS
2609         select 'N'
2610         from hz_dnb_request_log log, hz_organization_profiles org
2611         where log.party_id= p_party_id
2612         and org.party_id=log.party_id
2613         and org.actual_content_source='DNB'
2614         and org.effective_end_date is NULL
2615         and trunc(org.last_update_date) > trunc(log.last_update_date)
2616         and rownum =1
2617         UNION
2618         select 'Y'
2619         from hz_dnb_request_log log, hz_organization_profiles org
2620         where log.party_id= p_party_id
2621         and org.party_id=log.party_id
2622         and org.actual_content_source='DNB'
2623         and org.effective_end_date is NULL
2624         and trunc(org.last_update_date) = trunc(log.last_update_date)
2625         and rownum =1;
2626 */
2627 
2628 BEGIN
2629 
2630    select 'E' into l_exist
2631    from hz_dnb_request_log
2632    where party_id = p_party_id
2633      and rownum = 1;
2634 
2635      if l_exist = 'E'  then
2636 /*
2637            open c;
2638            fetch c into l_exist;
2639            close c;
2640 */
2641 
2642 -- Bug 3301467 : Add below statement to check if the last purchased package for
2643 --               a party is through online mode or batch mode.
2644 --               If it is online mode, return 'Y' else 'N'
2645         Begin
2646                 select 'Y' into l_exist from hz_organization_profiles org
2647                 where org.party_id = p_party_id
2648                     and  org.actual_content_source='DNB'
2649                     and  org.effective_end_date is NULL
2650                     and  trunc(org.last_update_date) =
2651                         (select trunc(max(log.last_update_date)) from hz_dnb_request_log log
2652                          where log.party_id = p_party_id);
2653         Exception
2654                 when no_data_found then
2655                         l_exist := 'N';
2656         end;
2657      end if;
2658 
2659    return l_exist;
2660 
2661 
2662 EXCEPTION
2663    WHEN NO_DATA_FOUND THEN
2664      return l_exist;
2665 END IS_PARTY_ID_IN_REQUEST_LOG;
2666 
2667 
2668 /**
2669  * FUNCTION get_message
2670  *
2671  * DESCRIPTION
2672  *    returns the translated message
2673  * ARGUMENTS
2674  *     message_name
2675  *     token1_name, token1_value
2676  *     token2_name, token2_value
2677  *     token3_name, token3_value
2678  *     token4_name, token4_value
2679  *     token5_name, token5_value
2680  *
2681  *   RETURNS    : VARCHAR2: token sustituted, translated message
2682 */
2683 FUNCTION get_message(
2684    app_short_name IN VARCHAR2,
2685    message_name IN varchar2,
2686    token1_name  IN VARCHAR2,
2687    token1_value IN VARCHAR2,
2688    token2_name  IN VARCHAR2,
2689    token2_value IN VARCHAR2,
2690    token3_name  IN VARCHAR2,
2691    token3_value IN VARCHAR2,
2692    token4_name  IN VARCHAR2,
2693    token4_value IN VARCHAR2,
2694    token5_name  IN VARCHAR2,
2695    token5_value IN VARCHAR2)
2696 RETURN VARCHAR2 AS
2697 BEGIN
2698  -- Flow
2699  -- 1. Set the Message Name
2700  -- 2. Set the token(s).
2701  -- 3. get translated message and return it.
2702 
2703  FND_MESSAGE.SET_NAME(app_short_name,message_name);
2704  -- not using the CASE statement to make it backward compatible.
2705  IF token1_name IS NOT NULL THEN
2706         FND_MESSAGE.SET_TOKEN(token1_name,token1_value);
2707  END IF;
2708  IF token2_name IS NOT NULL THEN
2709         FND_MESSAGE.SET_TOKEN(token2_name,token2_value);
2710  END IF;
2711  IF token3_name IS NOT NULL THEN
2712         FND_MESSAGE.SET_TOKEN(token3_name,token3_value);
2713  END IF;
2714  IF token4_name IS NOT NULL THEN
2715         FND_MESSAGE.SET_TOKEN(token4_name,token4_value);
2716  END IF;
2717  IF token5_name IS NOT NULL THEN
2718         FND_MESSAGE.SET_TOKEN(token5_name,token5_value);
2719  END IF;
2720 
2721  return FND_MESSAGE.get;
2722 
2723 EXCEPTION
2724    WHEN NO_DATA_FOUND THEN
2725      return 'NO MESSAGE FOUND';
2726    WHEN OTHERS THEN
2727      return 'NO MESSAGE FOUND';
2728 END get_message;
2729 
2730 
2731 /**
2732  * FUNCTION is_restriction_exist
2733  *
2734  * DESCRIPTION
2735  *    used by common party UI .
2736  *    will return a flag to indicate if contact preference exist
2737  * ARGUMENTS
2738  *   IN:
2739  *     p_contact_level_table     contact level table
2740  *     p_contact_level_table_id  contact level table id
2741  *     p_preference_code         preference code
2742  *
2743  *   RETURNS    : VARCHAR2
2744  *
2745 **/
2746 
2747 FUNCTION is_restriction_exist (
2748     p_contact_level_table              IN     VARCHAR2,
2749     p_contact_level_table_id           IN     NUMBER,
2750     p_preference_code                  IN     VARCHAR2
2751 ) RETURN VARCHAR2 IS
2752 
2753     CURSOR c_restriction IS
2754     SELECT null
2755     FROM   hz_contact_preferences
2756     WHERE  contact_level_table = p_contact_level_table
2757     AND    contact_level_table_id = p_contact_level_table_id
2758     AND    preference_code = p_preference_code
2759     AND    status = 'A'
2760     AND    (preference_end_date IS NULL OR
2761             TRUNC(preference_end_date) >= TRUNC(sysdate))
2762     AND    TRUNC(preference_start_date) <= TRUNC(sysdate)
2763     AND    ROWNUM = 1;
2764 
2765     l_dummy                            VARCHAR2(1);
2766     l_return                           VARCHAR2(1);
2767 
2768 BEGIN
2769 
2770     IF p_contact_level_table_id IS NULL THEN
2771       RETURN 'N';
2772     END IF;
2773 
2774    OPEN c_restriction;
2775    FETCH c_restriction INTO l_dummy;
2776    IF c_restriction%NOTFOUND THEN
2777      l_return := 'N';
2778    ELSE
2779      l_return := 'Y';
2780    END IF;
2781    CLOSE c_restriction;
2782 
2783    RETURN l_return;
2784 
2785 END is_restriction_exist;
2786 
2787 /**
2788  * FUNCTION is_purchased_content_source
2789  *
2790  * DESCRIPTION
2791  *    This function will return 'Y' if the source system is a purchased one.
2792  *    (i.e HZ_ORIG_SYSTEMS_B.orig_system_type = 'PURCHASED')
2793  *
2794  * ARGUMENTS
2795  *   IN:
2796  *     p_content_source
2797  *
2798  *   RETURNS    : VARCHAR2
2799  *
2800  * NOTES
2801  *
2802  * MODIFICATION HISTORY
2803  *
2804  *  01-03-2005  Rajib Ranjan Borah   o SSM SST Integration and Extension. Created.
2805  *
2806 **/
2807 FUNCTION is_purchased_content_source (
2808 p_content_source                        IN    VARCHAR2
2809 ) RETURN VARCHAR2 IS
2810 
2811     CURSOR c_content_source IS
2812         SELECT 'Y'
2813         FROM   HZ_ORIG_SYSTEMS_B
2814         WHERE  orig_system = p_content_source
2815           AND  orig_system_type = 'PURCHASED'
2816 --        AND  status = 'A'
2817           AND  rownum = 1;
2818 
2819     l_return_value       VARCHAR2(1);
2820 
2821 BEGIN
2822 
2823     OPEN  c_content_source;
2827     END IF;
2824     FETCH c_content_source INTO l_return_value;
2825     IF c_content_source%NOTFOUND THEN
2826         l_return_value := 'N';
2828     CLOSE c_content_source;
2829 
2830     RETURN l_return_value;
2831 
2832 END is_purchased_content_source;
2833 
2834 /**
2835  * FUNCTION get_lookupMeaning_lang
2836  *
2837  * DESCRIPTION
2838  *     This function will return the meaning in FND_LOOKUP_VALUES for the given combination
2839  *     of lookup_type, lookup_code and language.
2840  *
2841  * ARGUMENTS
2842  *   IN:
2843  *     p_lookup_type
2844  *     p_lookup_code
2845  *     p_language
2846  *
2847  *   RETURNS    : VARCHAR2 (FND_LOOKUP_VALUES.Meaning)
2848  *
2849  * NOTES
2850  *
2851  * MODIFICATION HISTORY
2852  *
2853  *  09-Jan-2005  Rajib Ranjan Borah   o SSM SST Integration and Extension. Created.
2854  *
2855 **/
2856 FUNCTION get_lookupMeaning_lang (
2857 p_lookup_type                        IN    VARCHAR2,
2858 p_lookup_code                        IN    VARCHAR2,
2859 p_language                           IN    VARCHAR2
2860 ) RETURN VARCHAR2 IS
2861 
2862     CURSOR c_lookup_meaning_for_lang IS
2863         SELECT meaning
2864         FROM   FND_LOOKUP_VALUES
2865         WHERE  lookup_type = p_lookup_type
2866           AND  lookup_code = p_lookup_code
2867           AND  language    = p_language
2868           AND  enabled_flag = 'Y'
2869           AND  (end_date_active IS NULL
2870                 OR end_date_active >= sysdate);
2871 
2872     l_return_value       VARCHAR2(80);
2873 
2874 BEGIN
2875 
2876     OPEN  c_lookup_meaning_for_lang;
2877     FETCH c_lookup_meaning_for_lang INTO l_return_value;
2878     IF c_lookup_meaning_for_lang%NOTFOUND THEN
2879         l_return_value := NULL ;
2880     END IF;
2881     CLOSE c_lookup_meaning_for_lang;
2882 
2883     RETURN l_return_value;
2884 
2885 END get_lookupMeaning_lang;
2886 
2887 /**
2888  * FUNCTION get_lookupDesc_lang
2889  *
2890  * DESCRIPTION
2891  *     This function will return the description in FND_LOOKUP_VALUES for the given combination
2892  *     of lookup_type, lookup_code and language.
2893  *
2894  * ARGUMENTS
2895  *   IN:
2896  *     p_lookup_type
2897  *     p_lookup_code
2898  *     p_language
2899  *
2900  *   RETURNS    : VARCHAR2 (FND_LOOKUP_VALUES.Description)
2901  *
2902  * NOTES
2903  *
2904  * MODIFICATION HISTORY
2905  *
2906  *  09-Jan-2005  Rajib Ranjan Borah   o SSM SST Integration and Extension. Created.
2907  *
2908 **/
2909 FUNCTION get_lookupDesc_lang (
2910 p_lookup_type                        IN    VARCHAR2,
2911 p_lookup_code                        IN    VARCHAR2,
2912 p_language                           IN    VARCHAR2
2913 ) RETURN VARCHAR2 IS
2914 
2915     CURSOR c_lookup_desc_for_lang IS
2916         SELECT description
2917         FROM   FND_LOOKUP_VALUES
2918         WHERE  lookup_type = p_lookup_type
2919           AND  lookup_code = p_lookup_code
2920           AND  language    = p_language
2921           AND  enabled_flag = 'Y'
2922           AND  (end_date_active IS NULL
2923                 OR end_date_active >= sysdate);
2924 
2925     l_return_value       VARCHAR2(240);
2926 
2927 BEGIN
2928 
2929     OPEN  c_lookup_desc_for_lang;
2930     FETCH c_lookup_desc_for_lang INTO l_return_value;
2931     IF c_lookup_desc_for_lang%NOTFOUND THEN
2932         l_return_value := NULL ;
2933     END IF;
2934     CLOSE c_lookup_desc_for_lang;
2935 
2936     RETURN l_return_value;
2937 
2938 END get_lookupDesc_lang;
2939 
2940 
2941 
2942 /**
2943  * FUNCTION check_prim_bill_to_site
2944  *
2945  * DESCRIPTION
2946  *    used by common party UI .
2947  *    will return Y if the party site is the primary Bill_To site.
2948  *    will return N in other cases
2949 
2950  * ARGUMENTS
2951  *   IN:
2952  *     p_party_site_id               party site id used to retrieve the site use purpose.
2953  *
2954  *   RETURNS    : VARCHAR2
2955  *
2956 **/
2957 function check_prim_bill_to_site (
2958     p_party_site_id                         IN     NUMBER)
2959 RETURN VARCHAR2 IS
2960 
2961 
2962   l_bill_to_primary   VARCHAR2(1000);
2963   l_primary           VARCHAR2(10);
2964   cursor c_site_bill_to (l_party_site_id IN NUMBER) is
2965     select psu.primary_per_type
2966     from hz_party_site_uses psu
2967     where
2968          psu.party_site_id = l_party_site_id  and
2969          psu.status = 'A' and
2970          psu.site_use_type = 'BILL_TO' and
2971          psu.primary_per_type = 'Y'
2972 order by primary_per_type DESC;
2973 
2974 BEGIN
2975 
2976   l_bill_to_primary := 'N';
2977   OPEN c_site_bill_to(p_party_site_id);
2978   LOOP
2979   FETCH c_site_bill_to INTO l_primary;
2980 
2981     IF c_site_bill_to%NOTFOUND THEN
2982       EXIT;
2983     END IF;
2984 
2985     IF l_primary = 'Y' THEN
2986        l_bill_to_primary := 'Y';
2987        exit;
2988     END IF;
2989 
2990   END LOOP;
2991   CLOSE c_site_bill_to;
2992 
2993   RETURN l_bill_to_primary;
2994 END check_prim_bill_to_site;
2995 
2996 
2997 /**
2998  * FUNCTION check_prim_ship_to_site
2999  *
3000  * DESCRIPTION
3001  *    used by common party UI .
3002  *    will return Y if the party site is the primary Ship_To site.
3003  *    will return N in other cases
3007  *     p_party_site_id               party site id used to retrieve the site use purpose.
3004 
3005  * ARGUMENTS
3006  *   IN:
3008  *
3009  *   RETURNS    : VARCHAR2
3010  *
3011 **/
3012 function check_prim_ship_to_site (
3013     p_party_site_id                         IN     NUMBER)
3014 RETURN VARCHAR2 IS
3015 
3016 
3017   l_ship_to_primary   VARCHAR2(1000);
3018   l_primary           VARCHAR2(10);
3019   cursor c_site_ship_to (l_party_site_id IN NUMBER) is
3020     select psu.primary_per_type
3021     from hz_party_site_uses psu
3022     where
3023          psu.party_site_id = l_party_site_id  and
3024          psu.status = 'A' and
3025          psu.site_use_type = 'SHIP_TO' and
3026          psu.primary_per_type = 'Y'
3027 order by primary_per_type DESC;
3028 
3029 BEGIN
3030 
3031   l_ship_to_primary := 'N';
3032   OPEN c_site_ship_to(p_party_site_id);
3033   LOOP
3034   FETCH c_site_ship_to INTO l_primary;
3035 
3036     IF c_site_ship_to%NOTFOUND THEN
3037       EXIT;
3038     END IF;
3039 
3040     IF l_primary = 'Y' THEN
3041        l_ship_to_primary := 'Y';
3042        exit;
3043     END IF;
3044 
3045   END LOOP;
3046   CLOSE c_site_ship_to;
3047 
3048   RETURN l_ship_to_primary;
3049 END check_prim_ship_to_site;
3050 
3051 
3052 /**
3053  * PROCEDURE validate_created_by_module
3054  *
3055  * DESCRIPTION
3056  *    validate created by module
3057  * ARGUMENTS
3058  *   IN:
3059  *     p_create_update_flag      create update flag
3060  *     p_created_by_module       created by module
3061  *     p_old_created_by_module   old value of created by module
3062  *     x_return_status           return status
3063  */
3064 
3065 PROCEDURE validate_created_by_module (
3066     p_create_update_flag          IN     VARCHAR2,
3067     p_created_by_module           IN     VARCHAR2,
3068     p_old_created_by_module       IN     VARCHAR2,
3069     x_return_status               IN OUT NOCOPY VARCHAR2
3070 ) IS
3071 
3072 BEGIN
3073 
3074     -- skip mandatory and non-updateable check from logical API
3075     IF G_CALLING_API IS NULL THEN
3076       -- created_by_module is mandatory field
3077       -- Since created_by_module is non-updateable, we only need to check mandatory
3078       -- during creation.
3079 
3080       IF p_create_update_flag = 'C' THEN
3081         validate_mandatory (
3082           p_create_update_flag     => p_create_update_flag,
3083           p_column                 => 'created_by_module',
3084           p_column_value           => p_created_by_module,
3085           x_return_status          => x_return_status);
3086 
3087         IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3088           debug(
3089             p_prefix               => '',
3090             p_message              => 'created_by_module is mandatory. ' ||
3091                                       'x_return_status = ' || x_return_status,
3092             p_msg_level            => fnd_log.level_statement);
3093         END IF;
3094       END IF;
3095 
3096       -- created_by_module is non-updateable field. But it can be updated from
3097       -- NULL to some value.
3098 
3099       IF p_create_update_flag = 'U' AND
3100          p_created_by_module IS NOT NULL
3101       THEN
3102         validate_nonupdateable (
3103           p_column                 => 'created_by_module',
3104           p_column_value           => p_created_by_module,
3105           p_old_column_value       => p_old_created_by_module,
3106           p_restricted             => 'N',
3107           x_return_status          => x_return_status);
3108 
3109         IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3110           debug(
3111             p_prefix               => '',
3112             p_message              => 'created_by_module is non-updateable. It can be updated from NULL to a value. ' ||
3113                                       'x_return_status = ' || x_return_status,
3114             p_msg_level            => fnd_log.level_statement);
3115         END IF;
3116       END IF;
3117     END IF;
3118 
3119     -- created_by_module is lookup code in lookup type HZ_CREATED_BY_MODULES
3120     IF p_created_by_module IS NOT NULL AND
3121        p_created_by_module <> fnd_api.g_miss_char AND
3122        (p_create_update_flag = 'C' OR
3123         (p_create_update_flag = 'U' AND
3124          (p_old_created_by_module IS NULL OR
3125           p_created_by_module <> p_old_created_by_module)))
3126     THEN
3127       validate_lookup (
3128         p_column                   => 'created_by_module',
3129         p_lookup_type              => 'HZ_CREATED_BY_MODULES',
3130         p_column_value             => p_created_by_module,
3131         x_return_status            => x_return_status);
3132 
3133       IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3134         debug(
3135           p_prefix                 => '',
3136           p_message                => 'created_by_module is lookup code in lookup type HZ_CREATED_BY_MODULES. ' ||
3137                                       'x_return_status = ' || x_return_status,
3138           p_msg_level              => fnd_log.level_statement);
3139       END IF;
3140     END IF;
3141 
3142     IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3143       debug(
3144         p_prefix                   => '',
3145         p_message                  => 'after validate created_by_module ... ' ||
3146                                       'x_return_status = ' || x_return_status,
3147         p_msg_level                => fnd_log.level_statement);
3148     END IF;
3149 
3150 END validate_created_by_module;
3151 
3152 
3153 /**
3154  * PROCEDURE validate_application_id
3155  *
3156  * DESCRIPTION
3157  *    validate application id
3158  * ARGUMENTS
3159  *   IN:
3160  *     p_create_update_flag      create update flag
3161  *     p_application_id          application id
3162  *     p_old_application_id      old value of application id
3163  *     x_return_status           return status
3164  */
3165 
3166 PROCEDURE validate_application_id (
3167     p_create_update_flag          IN     VARCHAR2,
3168     p_application_id              IN     NUMBER,
3169     p_old_application_id          IN     NUMBER,
3170     x_return_status               IN OUT NOCOPY VARCHAR2
3171 ) IS
3172 
3173     l_column                      CONSTANT VARCHAR2(30) := 'application_id';
3174 
3175 BEGIN
3176 
3177     -- skip non-updateable check from logical API
3178     IF G_CALLING_API IS NULL THEN
3179       -- application_id is non-updateable field. But it can be updated from NULL
3180       -- to some value.
3181 
3182       IF p_create_update_flag = 'U' AND
3183          p_application_id IS NOT NULL
3184       THEN
3185         validate_nonupdateable (
3186           p_column                 => l_column,
3187           p_column_value           => p_application_id,
3188           p_old_column_value       => p_old_application_id,
3189           p_restricted             => 'N',
3190           x_return_status          => x_return_status);
3191 
3192         IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3193           debug(
3194             p_prefix               => '',
3195             p_message              => l_column || ' is non-updateable. It can be updated from NULL to a value. ' ||
3196                                       'x_return_status = ' || x_return_status,
3197             p_msg_level            => fnd_log.level_statement);
3198         END IF;
3199       END IF;
3200     END IF;
3201 
3202     IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3203       debug(
3204         p_prefix                   => '',
3205         p_message                  => 'after validate ' || l_column || ' ... ' ||
3206                                       'x_return_status = ' || x_return_status,
3207         p_msg_level                => fnd_log.level_statement);
3208     END IF;
3209 
3210 END validate_application_id;
3211 
3212 
3213 /**
3214  * FUNCTION is_role_in_relationship_group
3215  *
3216  * DESCRIPTION
3217  *    return if a role exists in a relationship group
3218  * ARGUMENTS
3219  *   IN:
3220  *     p_relationship_type_id    relationship type id
3221  *     p_relationship_group_code relationship group code
3222  */
3223 
3224 FUNCTION is_role_in_relationship_group (
3225     p_relationship_type_id        IN     NUMBER,
3226     p_relationship_group_code     IN     VARCHAR2
3227 ) RETURN VARCHAR2 IS
3228 
3229     CURSOR c_groups IS
3230     SELECT null
3231     FROM   hz_code_assignments c
3232     WHERE  c.owner_table_name = 'HZ_RELATIONSHIP_TYPES'
3233     AND    c.class_category = 'RELATIONSHIP_TYPE_GROUP'
3234     AND    c.class_code = p_relationship_group_code
3235     AND    sysdate between c.start_date_active and nvl(c.end_date_active, sysdate+1)
3236     AND    c.status = 'A'
3237     AND    c.owner_table_id = p_relationship_type_id
3238     AND    ROWNUM = 1;
3239 
3240     l_dummy                       VARCHAR2(1);
3241     l_return                      VARCHAR2(1);
3242 
3243 BEGIN
3244 
3245     OPEN c_groups;
3246     FETCH c_groups INTO l_dummy;
3247     IF c_groups%NOTFOUND THEN
3248       l_return := 'N';
3249     ELSE
3250       l_return := 'Y';
3251     END IF;
3252     CLOSE c_groups;
3253 
3254     RETURN l_return;
3255 
3256 END is_role_in_relationship_group;
3257 
3258 --Bug15942984
3259 /**
3260  * FUNCTION G_EXECUTE_API_CALLOUTS
3261  *
3262  * DESCRIPTION
3263  *    Return Profile 'HZ_EXECUTE_API_CALLOUTS' value.
3264  */
3265 FUNCTION g_execute_api_callouts RETURN VARCHAR2 IS
3266 BEGIN
3267 
3268         RETURN FND_PROFILE.VALUE('HZ_EXECUTE_API_CALLOUTS');
3269 
3270 END g_execute_api_callouts;
3271 
3272 
3273 END HZ_UTILITY_V2PUB;