1 PACKAGE BODY HZ_UTILITY_V2PUB AS
2 /*$Header: ARH2UTSB.pls 120.45 2008/02/05 20:02:33 awu 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
278 -- Bug 5398089 : Added variables
279 l_string VARCHAR2(255);
280 l_cache BOOLEAN;
281
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 *
566
563 * 07-23-2001 Jianying Huang o Created.
564 *
565 */
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
705 * x_return_status Return status.
702 * to p_old_column_value, return status will be
703 * set to error.
704 * IN/OUT:
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
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
816 IF p_restricted = 'Y' THEN
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
854 * p_end_date New end 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
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;
1000 END validate_cannot_update_to_null;
997 x_return_status := FND_API.G_RET_STS_ERROR;
998 END IF;
999
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
1162 G_FILE_DEBUG := FALSE;
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;
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;
1269 * p_module_prefix Module prefix to store package name,form name.Default value is
1270 * HZ_Package.
1274 *
1271 * p_module Module to store Procedure Name. Default value is HZ_Module.
1272 *
1273 * NOTES
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;
1458
1455 END IF;
1456
1457 END program_application_id;
1459 FUNCTION application_id RETURN NUMBER IS
1460 BEGIN
1461
1462 IF FND_GLOBAL.resp_appl_id = -1 OR
1463 FND_GLOBAL.resp_appl_id IS NULL
1464 THEN
1465 RETURN NULL;
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
1640 * AR_LOOKUPS
1637 * IN:
1638 * p_lookup_table Table/view name you want to validate against to.
1639 * For now, we are supporting
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
1649 *
1650 * MODIFICATION HISTORY
1651 *
1652 * 03-01-2002 Jianying Huang o Created.
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;
1771
1768 END IF;
1769
1770 RETURN 'N';
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
1801 (p_api_version = 'V2' AND
1802 p_column_value IS NOT NULL))
1803 THEN
1804 RETURN 'Y';
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 (
1908 l_site_use_purpose VARCHAR2(100);
1905 p_party_site_id IN NUMBER)
1906 RETURN VARCHAR2 IS
1907
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
1958 *
1959 * DESCRIPTION
1960 * used by common party UI .
1961 * will return all site use types
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 **/
2026 function get_acct_site_purposes (
2027 p_acct_site_id IN NUMBER)
2028 RETURN VARCHAR2 IS
2029
2030 l_site_use_purpose VARCHAR2(100);
2031 l_all_site_use_purposes VARCHAR2(1000) := '';
2032
2033 cursor c_site_use_purposes (l_acct_site_id IN NUMBER) is
2034 select al.MEANING
2035 from hz_cust_acct_sites s,
2036 hz_cust_site_uses u,
2037 ar_lookups al
2038 where
2039 s.cust_acct_site_id = l_acct_site_id and
2040 u.cust_acct_site_id = s.cust_acct_site_id and
2041 u.status = 'A' and
2042 al.lookup_type = 'SITE_USE_CODE' and
2043 al.lookup_code = u.SITE_USE_CODE
2044 order by al.MEANING;
2045
2046 BEGIN
2047
2048 OPEN c_site_use_purposes(p_acct_site_id);
2049 LOOP
2050 FETCH c_site_use_purposes INTO l_site_use_purpose;
2051
2052 IF c_site_use_purposes%NOTFOUND THEN
2053 EXIT;
2054 END IF;
2055
2056 IF l_all_site_use_purposes is not null THEN
2057 l_all_site_use_purposes := concat(l_all_site_use_purposes, ', ');
2058 END IF;
2059
2060 l_all_site_use_purposes := concat(l_all_site_use_purposes, l_site_use_purpose);
2061
2062 END LOOP;
2063 CLOSE c_site_use_purposes;
2064
2065 RETURN l_all_site_use_purposes;
2066 END get_acct_site_purposes;
2067
2068
2069 /**
2073 * used by common party UI .
2070 * FUNCTION validate_flex_address
2071 *
2072 * DESCRIPTION
2074 * will validate the flex address
2075 * and return 'Y'/'N'
2076 * ARGUMENTS
2077 * IN:
2078 * p_context_value : context_value
2079 * p_address1 : address1
2080 * p_address2 : address2
2081 * p_address3 : address3
2082 * p_address4 : address4
2083 * p_address_lines_phonetic: address_lines_phonetic
2084 * p_city : city
2085 * p_county : county
2086 * p_postal_code : postal_code
2087 * p_province : province
2088 * p_state : state
2089 * p_attribute1 : attribute1
2090 * p_attribute2 : attribute2
2091 * p_attribute3 : attribute3
2092 * p_attribute4 : attribute4
2093 * p_attribute5 : attribute5
2094 * p_attribute6 : attribute6
2095 * p_attribute7 : attribute7
2096 * p_attribute8 : attribute8
2097 * p_attribute9 : attribute9
2098 * p_attribute10: attribute10
2099 * p_attribute11: attribute11
2100 * p_attribute12: attribute12
2101 * p_attribute13: attribute13
2102 * p_attribute14: attribute14
2103 * p_attribute15: attribute15
2104 * p_attribute16: attribute16
2105 * p_attribute17: attribute17
2106 * p_attribute18: attribute18
2107 * p_attribute19: attribute19
2108 * p_attribute20: attribute20
2109 *
2110 * RETURNS : VARCHAR2
2111 *
2112 **/
2113 FUNCTION validate_flex_address (
2114 p_context_value IN VARCHAR2,
2115 p_address1 IN VARCHAR2,
2116 p_address2 IN VARCHAR2,
2117 p_address3 IN VARCHAR2,
2118 p_address4 IN VARCHAR2,
2119 p_address_lines_phonetic IN VARCHAR2,
2120 p_city IN VARCHAR2,
2121 p_county IN VARCHAR2,
2122 p_postal_code IN VARCHAR2,
2123 p_province IN VARCHAR2,
2124 p_state IN VARCHAR2,
2125 p_attribute1 IN VARCHAR2,
2126 p_attribute2 IN VARCHAR2,
2127 p_attribute3 IN VARCHAR2,
2128 p_attribute4 IN VARCHAR2,
2129 p_attribute5 IN VARCHAR2,
2130 p_attribute6 IN VARCHAR2,
2131 p_attribute7 IN VARCHAR2,
2132 p_attribute8 IN VARCHAR2,
2133 p_attribute9 IN VARCHAR2,
2134 p_attribute10 IN VARCHAR2,
2135 p_attribute11 IN VARCHAR2,
2136 p_attribute12 IN VARCHAR2,
2137 p_attribute13 IN VARCHAR2,
2138 p_attribute14 IN VARCHAR2,
2139 p_attribute15 IN VARCHAR2,
2140 p_attribute16 IN VARCHAR2,
2141 p_attribute17 IN VARCHAR2,
2142 p_attribute18 IN VARCHAR2,
2143 p_attribute19 IN VARCHAR2,
2144 p_attribute20 IN VARCHAR2
2145 ) RETURN VARCHAR2 IS
2146
2147 l_return VARCHAR2(1) := 'N';
2148 appl_short_name varchar2(30) := 'AR';
2149 desc_flex_name varchar2(30) := 'Remit Address HZ';
2150 values_or_ids varchar2(10) := 'I'; --FND BUG 4220582
2151 validation_date DATE := SYSDATE;
2152 error_msg VARCHAR2(5000);
2153 errors_received EXCEPTION;
2154
2155 BEGIN
2156
2157 --*********************************************************
2158 --* set the context value *
2159 --*********************************************************
2160 FND_FLEX_DESCVAL.set_context_value(p_context_value);
2161 --*********************************************************
2162 --* set the address attributes value *
2163 --*********************************************************
2164 fnd_flex_descval.set_column_value('ADDRESS1', p_address1 );
2165 fnd_flex_descval.set_column_value('ADDRESS2', p_address2 );
2166 fnd_flex_descval.set_column_value('ADDRESS3', p_address3 );
2167 fnd_flex_descval.set_column_value('ADDRESS4', p_address4 );
2168 fnd_flex_descval.set_column_value('ADDRESS_LINES_PHONETIC', p_address_lines_phonetic );
2169 fnd_flex_descval.set_column_value('CITY', p_city );
2170 fnd_flex_descval.set_column_value('COUNTY', p_county );
2171 fnd_flex_descval.set_column_value('STATE', p_state );
2172 fnd_flex_descval.set_column_value('PROVINCE', p_province );
2173 fnd_flex_descval.set_column_value('POSTAL_CODE', p_postal_code);
2174 fnd_flex_descval.set_column_value('ATTRIBUTE1', p_attribute1 );
2175 fnd_flex_descval.set_column_value('ATTRIBUTE2', p_attribute2 );
2176 fnd_flex_descval.set_column_value('ATTRIBUTE3', p_attribute3 );
2177 fnd_flex_descval.set_column_value('ATTRIBUTE4', p_attribute4 );
2178 fnd_flex_descval.set_column_value('ATTRIBUTE5', p_attribute5 );
2179 fnd_flex_descval.set_column_value('ATTRIBUTE6', p_attribute6 );
2180 fnd_flex_descval.set_column_value('ATTRIBUTE7', p_attribute7 );
2181 fnd_flex_descval.set_column_value('ATTRIBUTE8', p_attribute8 );
2182 fnd_flex_descval.set_column_value('ATTRIBUTE9', p_attribute9 );
2183 fnd_flex_descval.set_column_value('ATTRIBUTE10', p_attribute10 );
2184 fnd_flex_descval.set_column_value('ATTRIBUTE11', p_attribute11 );
2185 fnd_flex_descval.set_column_value('ATTRIBUTE12', p_attribute12 );
2186 fnd_flex_descval.set_column_value('ATTRIBUTE13', p_attribute13 );
2187 fnd_flex_descval.set_column_value('ATTRIBUTE14', p_attribute14 );
2188 fnd_flex_descval.set_column_value('ATTRIBUTE15', p_attribute15 );
2189 fnd_flex_descval.set_column_value('ATTRIBUTE16', p_attribute16 );
2190 fnd_flex_descval.set_column_value('ATTRIBUTE17', p_attribute17 );
2191 fnd_flex_descval.set_column_value('ATTRIBUTE18', p_attribute18 );
2192 fnd_flex_descval.set_column_value('ATTRIBUTE19', p_attribute19 );
2193 fnd_flex_descval.set_column_value('ATTRIBUTE20', p_attribute20 );
2194
2195 IF FND_FLEX_DESCVAL.validate_desccols(
2196 appl_short_name,
2197 desc_flex_name,
2198 values_or_ids,
2199 validation_date)
2200 THEN
2201 l_return := 'Y';
2202 return l_return;
2203 ELSE
2204 RAISE errors_received;
2205 END IF;
2206
2207 EXCEPTION
2208 WHEN errors_received THEN
2209 error_msg := fnd_flex_descval.encoded_error_message;
2210 FND_MESSAGE.SET_ENCODED(error_msg);
2211 FND_MSG_PUB.Add;
2212 return l_return;
2213 WHEN others THEN
2214 return l_return;
2215
2216 END validate_flex_address;
2217
2218 /**
2219 * FUNCTION validate_desc_flex
2220 *
2221 * DESCRIPTION
2222 * used by common party UI .
2223 * will validate the descriptive flex
2224 * and return 'Y'/'N'
2225 * ARGUMENTS
2226 * IN:
2227 * p_appl_short_name:appl_short_name
2228 * p_desc_flex_name :desc_flex_name
2229 * p_context_value : context_value
2230 * p_attribute1 : attribute1
2231 * p_attribute2 : attribute2
2232 * p_attribute3 : attribute3
2233 * p_attribute4 : attribute4
2234 * p_attribute5 : attribute5
2235 * p_attribute6 : attribute6
2236 * p_attribute7 : attribute7
2237 * p_attribute8 : attribute8
2238 * p_attribute9 : attribute9
2239 * p_attribute10: attribute10
2240 * p_attribute11: attribute11
2241 * p_attribute12: attribute12
2242 * p_attribute13: attribute13
2243 * p_attribute14: attribute14
2244 * p_attribute15: attribute15
2245 * p_attribute16: attribute16
2246 * p_attribute17: attribute17
2247 * p_attribute18: attribute18
2248 * p_attribute19: attribute19
2249 * p_attribute20: attribute20
2250 * p_attribute21: attribute21
2251 * p_attribute22: attribute22
2252 * p_attribute23: attribute23
2253 * p_attribute24: attribute24
2254 * RETURNS : VARCHAR2
2255 *
2256 **/
2257 FUNCTION validate_desc_flex (
2258 p_appl_short_name IN VARCHAR2,
2259 p_desc_flex_name IN VARCHAR2,
2260 p_context_value IN VARCHAR2,
2261 p_attribute1 IN VARCHAR2,
2262 p_attribute2 IN VARCHAR2,
2263 p_attribute3 IN VARCHAR2,
2264 p_attribute4 IN VARCHAR2,
2265 p_attribute5 IN VARCHAR2,
2266 p_attribute6 IN VARCHAR2,
2267 p_attribute7 IN VARCHAR2,
2268 p_attribute8 IN VARCHAR2,
2269 p_attribute9 IN VARCHAR2,
2270 p_attribute10 IN VARCHAR2,
2271 p_attribute11 IN VARCHAR2,
2275 p_attribute15 IN VARCHAR2,
2272 p_attribute12 IN VARCHAR2,
2273 p_attribute13 IN VARCHAR2,
2274 p_attribute14 IN VARCHAR2,
2276 p_attribute16 IN VARCHAR2,
2277 p_attribute17 IN VARCHAR2,
2278 p_attribute18 IN VARCHAR2,
2279 p_attribute19 IN VARCHAR2,
2280 p_attribute20 IN VARCHAR2,
2281 p_attribute21 IN VARCHAR2,
2282 p_attribute22 IN VARCHAR2,
2283 p_attribute23 IN VARCHAR2,
2284 p_attribute24 IN VARCHAR2
2285 ) RETURN VARCHAR2 IS
2286
2287 l_return VARCHAR2(1) := 'N';
2288 appl_short_name varchar2(30) := p_appl_short_name;
2289 desc_flex_name varchar2(30) := p_desc_flex_name;
2290 values_or_ids varchar2(10) := 'I'; --Bug 5356950
2291 validation_date DATE := SYSDATE;
2292 error_msg VARCHAR2(5000);
2293 errors_received EXCEPTION;
2294
2295 BEGIN
2296
2297 --*********************************************************
2298 --* set the context value *
2299 --*********************************************************
2300 FND_FLEX_DESCVAL.set_context_value(p_context_value);
2301 --*********************************************************
2302 --* set the attributes value *
2303 --*********************************************************
2304 fnd_flex_descval.set_column_value('ATTRIBUTE1', p_attribute1 );
2305 fnd_flex_descval.set_column_value('ATTRIBUTE2', p_attribute2 );
2306 fnd_flex_descval.set_column_value('ATTRIBUTE3', p_attribute3 );
2307 fnd_flex_descval.set_column_value('ATTRIBUTE4', p_attribute4 );
2308 fnd_flex_descval.set_column_value('ATTRIBUTE5', p_attribute5 );
2309 fnd_flex_descval.set_column_value('ATTRIBUTE6', p_attribute6 );
2310 fnd_flex_descval.set_column_value('ATTRIBUTE7', p_attribute7 );
2311 fnd_flex_descval.set_column_value('ATTRIBUTE8', p_attribute8 );
2312 fnd_flex_descval.set_column_value('ATTRIBUTE9', p_attribute9 );
2313 fnd_flex_descval.set_column_value('ATTRIBUTE10', p_attribute10 );
2314 fnd_flex_descval.set_column_value('ATTRIBUTE11', p_attribute11 );
2315 fnd_flex_descval.set_column_value('ATTRIBUTE12', p_attribute12 );
2316 fnd_flex_descval.set_column_value('ATTRIBUTE13', p_attribute13 );
2317 fnd_flex_descval.set_column_value('ATTRIBUTE14', p_attribute14 );
2318 fnd_flex_descval.set_column_value('ATTRIBUTE15', p_attribute15 );
2319 fnd_flex_descval.set_column_value('ATTRIBUTE16', p_attribute16 );
2320 fnd_flex_descval.set_column_value('ATTRIBUTE17', p_attribute17 );
2321 fnd_flex_descval.set_column_value('ATTRIBUTE18', p_attribute18 );
2322 fnd_flex_descval.set_column_value('ATTRIBUTE19', p_attribute19 );
2323 fnd_flex_descval.set_column_value('ATTRIBUTE20', p_attribute20 );
2324 IF p_desc_flex_name <> 'HZ_PARTY_SITES' THEN
2325 fnd_flex_descval.set_column_value('ATTRIBUTE21', p_attribute21 );
2326 fnd_flex_descval.set_column_value('ATTRIBUTE22', p_attribute22 );
2327 fnd_flex_descval.set_column_value('ATTRIBUTE23', p_attribute23 );
2328 fnd_flex_descval.set_column_value('ATTRIBUTE24', p_attribute24 );
2329 END IF;
2330
2331 IF FND_FLEX_DESCVAL.validate_desccols(
2332 appl_short_name,
2333 desc_flex_name,
2334 values_or_ids,
2335 validation_date)
2336 THEN
2337 l_return := 'Y';
2338 return l_return;
2339 ELSE
2340 RAISE errors_received;
2341 END IF;
2342
2343 EXCEPTION
2344 WHEN errors_received THEN
2345 error_msg := fnd_flex_descval.encoded_error_message;
2346 FND_MESSAGE.SET_ENCODED(error_msg);
2347 FND_MSG_PUB.Add;
2348 return l_return;
2349 WHEN others THEN
2350 return l_return;
2351
2352 END validate_desc_flex;
2353
2354 /**
2355 * FUNCTION get_org_contact_role
2356 *
2357 * DESCRIPTION
2358 * used by common party UI .
2359 * added by albert (tsli)
2360 * will return the first three org contact roles
2361
2362 * ARGUMENTS
2363 * IN:
2364 * p_org_contact_id org contact id used to retrieve the org contact roles.
2365 *
2366 * RETURNS : VARCHAR2
2367 *
2368 **/
2369
2370 FUNCTION get_org_contact_role (
2371 p_org_contact_id IN NUMBER
2372 ) RETURN VARCHAR2 IS
2373
2374 TYPE varchar2_table IS TABLE OF VARCHAR2(80); --5960623
2375 org_contact_roles_tab varchar2_table;
2376
2377 l_top3_org_contact_roles VARCHAR2(100);
2378 l_count NUMBER;
2379
2380 CURSOR c_org_contact_roles IS
2381 SELECT lu.meaning
2382 FROM hz_org_contact_roles ocr,
2383 fnd_lookup_values lu
2384 WHERE ocr.org_contact_id = p_org_contact_id
2385 AND ocr.status = 'A'
2386 AND lu.view_application_id = 222
2387 AND lu.language = userenv('LANG')
2388 AND lu.lookup_type = 'CONTACT_ROLE_TYPE'
2389 AND lu.lookup_code = ocr.role_type;
2390
2391 BEGIN
2392
2393 OPEN c_org_contact_roles;
2397
2394 FETCH c_org_contact_roles BULK COLLECT INTO org_contact_roles_tab;
2395
2396 l_top3_org_contact_roles := '';
2398 IF org_contact_roles_tab.count > 0 THEN
2399 l_count := 1;
2400
2401 WHILE (l_count <= 3 AND l_count <= org_contact_roles_tab.count)
2402 LOOP
2403 IF l_count > 1 THEN
2404 l_top3_org_contact_roles := l_top3_org_contact_roles || ', ';
2405 END IF;
2406
2407 l_top3_org_contact_roles := l_top3_org_contact_roles ||
2408 org_contact_roles_tab(l_count);
2409
2410
2411 l_count := l_count + 1;
2412 END LOOP;
2413
2414 IF org_contact_roles_tab.count > 3 THEN
2415 l_top3_org_contact_roles := l_top3_org_contact_roles || ', ...';
2416 END IF;
2417 END IF;
2418 CLOSE c_org_contact_roles;
2419
2420 RETURN l_top3_org_contact_roles;
2421
2422 END get_org_contact_role;
2423
2424 /**
2425 * FUNCTION get_primary_phone
2426 *
2427 * DESCRIPTION
2428 * used by common party UI .
2429 * added by albert (tsli)
2430 * will return the primary phone
2431 * ARGUMENTS
2432 * IN:
2433 * p_party_id party id used to retrieve the primary phone
2434 *
2435 * RETURNS : VARCHAR2
2436 *
2437 **/
2438
2439 function get_primary_phone (
2440 p_party_id IN NUMBER,
2441 p_display_purpose IN VARCHAR2 := fnd_api.g_true)
2442 RETURN VARCHAR2 IS
2443 l_contact_point_id NUMBER;
2444 BEGIN
2445
2446 BEGIN
2447 select
2448 contact_point_id
2449 INTO l_contact_point_id
2450 from hz_contact_points CPPH
2451 where contact_point_type = 'PHONE'
2452 and primary_flag = 'Y'
2453 and status = 'A'
2454 and OWNER_TABLE_NAME = 'HZ_PARTIES'
2455 and OWNER_TABLE_ID = p_party_id
2456 and rownum = 1;
2457
2458 EXCEPTION
2459 WHEN NO_DATA_FOUND THEN
2460 RETURN NULL;
2461 END;
2462
2463 RETURN hz_format_phone_v2pub.get_formatted_phone(l_contact_point_id,p_display_purpose);
2464 END get_primary_phone;
2465
2466 /**
2467 * FUNCTION get_primary_email
2468 *
2469 * DESCRIPTION
2470 * used by common party UI .
2471 * added by albert (tsli)
2472 * will return the primary email
2473 * ARGUMENTS
2474 * IN:
2475 * p_party_id party id used to retrieve the primary email
2476 *
2477 * RETURNS : VARCHAR2
2478 *
2479 **/
2480 function get_primary_email (
2481 p_party_id IN NUMBER)
2482 RETURN VARCHAR2 IS
2483 l_primary_email VARCHAR2(2000);
2484 BEGIN
2485
2486 select email_address
2487 INTO l_primary_email
2488 from hz_contact_points
2489 where contact_point_type = 'EMAIL'
2490 and primary_flag = 'Y'
2491 and status = 'A'
2492 and OWNER_TABLE_NAME = 'HZ_PARTIES'
2493 and OWNER_TABLE_ID = p_party_id
2494 and rownum = 1;
2495
2496 RETURN l_primary_email;
2497 END get_primary_email;
2498
2499 PROCEDURE find_index_name(
2500 p_index_name OUT NOCOPY VARCHAR2) IS
2501 tmp_errm VARCHAR2(500);
2502 n NUMBER;
2503 m NUMBER;
2504 i NUMBER;
2505 BEGIN
2506 n := INSTR(sqlerrm, '(', 1,1) ;
2507 m := INSTR(sqlerrm, ')', 1,1) ;
2508 i := m -n;
2509 tmp_errm := SUBSTRB(sqlerrm, n, i);
2510 n := INSTR(tmp_errm, '.', 1,1) ;
2511 p_index_name := SUBSTRB(tmp_errm, n+1, i-1);
2512 END find_index_name;
2513
2514
2515 /**
2516 * FUNCTION GET_YAHOO_MAP_URL
2517 *
2518 * DESCRIPTION
2519 * function that would return a html link tag which
2520 * will contain the address formatted for Yahoo Maps.
2521 * ARGUMENTS
2522 * IN:
2523 * address1 IN VARCHAR2,
2524 * address2 IN VARCHAR2,
2525 * address3 IN VARCHAR2,
2526 * address4 IN VARCHAR2,
2527 * city IN VARCHAR2,
2528 * country IN VARCHAR2,
2529 * state IN VARCHAR2,
2530 * postal_code IN VARCHAR2
2531 *
2532 * RETURNS : VARCHAR2
2533 *
2534 **/
2535
2536 FUNCTION GET_YAHOO_MAP_URL(address1 IN VARCHAR2,
2537 address2 IN VARCHAR2,
2538 address3 IN VARCHAR2,
2539 address4 IN VARCHAR2,
2540 city IN VARCHAR2,
2541 country IN VARCHAR2,
2542 state IN VARCHAR2,
2543 postal_code IN VARCHAR2)
2544 RETURN VARCHAR2 AS
2545 url VARCHAR2(200);
2546 url2 VARCHAR2(700);
2547 country_code VARCHAR2(20);
2548 amp VARCHAR2(01) := '&';
2549 staticURL VARCHAR2(100) := 'http://maps.yahoo.com/py/maps.py?BFCat=' || amp || 'Pyt=Tmap' || amp || 'newFL=Use+Address+Below' || amp || 'Get Map=Get+Map';
2550
2551 BEGIN
2552
2556 THEN
2553 -- Since TCA validates the country code of UK to GB and Yahoo Maps expects 'uk'
2554 -- we resort to this work around
2555 IF upper(rtrim(country)) = 'GB'
2557 country_code := 'UK';
2558 ELSE
2559 country_code := rtrim(country);
2560 END IF;
2561
2562 URL2 := staticURL ||
2563 amp || 'addr=' || REPLACE(address1, ' ', '+') ||
2564 amp || 'csz=' || REPLACE(city, ' ', '+') || '+' || RTRIM(state) || '+' || RTRIM(postal_code) ||
2565 amp || 'country=' || country_code;
2566
2567 URL := substrb(URL2, 1, 200);
2568 RETURN url;
2569 END GET_YAHOO_MAP_URL;
2570
2571 /**
2572 * FUNCTION IS_PARTY_ID_IN_REQUEST_LOG
2573 *
2574 * DESCRIPTION
2575 * function that would return a 'Y' if this party_id exist in hz_dnb_request_log
2576 * return 'N' if not.
2577 * ARGUMENTS
2578 * party_id IN NUMBER
2579 *
2580 * RETURNS : VARCHAR2
2581 */
2582
2583 FUNCTION IS_PARTY_ID_IN_REQUEST_LOG(
2584 p_party_id IN NUMBER)
2585
2586 RETURN VARCHAR2 AS
2587
2588 l_exist varchar2(1) := 'N';
2589
2590 /* Bug 3301467 : Comment the cursor code
2591
2592 CURSOR c IS
2593 select 'N'
2594 from hz_dnb_request_log log, hz_organization_profiles org
2595 where log.party_id= p_party_id
2596 and org.party_id=log.party_id
2597 and org.actual_content_source='DNB'
2598 and org.effective_end_date is NULL
2599 and trunc(org.last_update_date) > trunc(log.last_update_date)
2600 and rownum =1
2601 UNION
2602 select 'Y'
2603 from hz_dnb_request_log log, hz_organization_profiles org
2604 where log.party_id= p_party_id
2605 and org.party_id=log.party_id
2606 and org.actual_content_source='DNB'
2607 and org.effective_end_date is NULL
2608 and trunc(org.last_update_date) = trunc(log.last_update_date)
2609 and rownum =1;
2610 */
2611
2612 BEGIN
2613
2614 select 'E' into l_exist
2615 from hz_dnb_request_log
2616 where party_id = p_party_id
2617 and rownum = 1;
2618
2619 if l_exist = 'E' then
2620 /*
2621 open c;
2622 fetch c into l_exist;
2623 close c;
2624 */
2625
2626 -- Bug 3301467 : Add below statement to check if the last purchased package for
2627 -- a party is through online mode or batch mode.
2628 -- If it is online mode, return 'Y' else 'N'
2629 Begin
2630 select 'Y' into l_exist from hz_organization_profiles org
2631 where org.party_id = p_party_id
2632 and org.actual_content_source='DNB'
2633 and org.effective_end_date is NULL
2634 and trunc(org.last_update_date) =
2635 (select trunc(max(log.last_update_date)) from hz_dnb_request_log log
2636 where log.party_id = p_party_id);
2637 Exception
2638 when no_data_found then
2639 l_exist := 'N';
2640 end;
2641 end if;
2642
2643 return l_exist;
2644
2645
2646 EXCEPTION
2647 WHEN NO_DATA_FOUND THEN
2648 return l_exist;
2649 END IS_PARTY_ID_IN_REQUEST_LOG;
2650
2651
2652 /**
2653 * FUNCTION get_message
2654 *
2655 * DESCRIPTION
2656 * returns the translated message
2657 * ARGUMENTS
2658 * message_name
2659 * token1_name, token1_value
2660 * token2_name, token2_value
2661 * token3_name, token3_value
2662 * token4_name, token4_value
2663 * token5_name, token5_value
2664 *
2665 * RETURNS : VARCHAR2: token sustituted, translated message
2666 */
2667 FUNCTION get_message(
2668 app_short_name IN VARCHAR2,
2669 message_name IN varchar2,
2670 token1_name IN VARCHAR2,
2671 token1_value IN VARCHAR2,
2672 token2_name IN VARCHAR2,
2673 token2_value IN VARCHAR2,
2674 token3_name IN VARCHAR2,
2675 token3_value IN VARCHAR2,
2676 token4_name IN VARCHAR2,
2677 token4_value IN VARCHAR2,
2678 token5_name IN VARCHAR2,
2679 token5_value IN VARCHAR2)
2680 RETURN VARCHAR2 AS
2681 BEGIN
2682 -- Flow
2683 -- 1. Set the Message Name
2684 -- 2. Set the token(s).
2685 -- 3. get translated message and return it.
2686
2687 FND_MESSAGE.SET_NAME(app_short_name,message_name);
2688 -- not using the CASE statement to make it backward compatible.
2689 IF token1_name IS NOT NULL THEN
2690 FND_MESSAGE.SET_TOKEN(token1_name,token1_value);
2691 END IF;
2692 IF token2_name IS NOT NULL THEN
2693 FND_MESSAGE.SET_TOKEN(token2_name,token2_value);
2694 END IF;
2695 IF token3_name IS NOT NULL THEN
2696 FND_MESSAGE.SET_TOKEN(token3_name,token3_value);
2697 END IF;
2698 IF token4_name IS NOT NULL THEN
2699 FND_MESSAGE.SET_TOKEN(token4_name,token4_value);
2700 END IF;
2701 IF token5_name IS NOT NULL THEN
2702 FND_MESSAGE.SET_TOKEN(token5_name,token5_value);
2703 END IF;
2704
2705 return FND_MESSAGE.get;
2706
2710 WHEN OTHERS THEN
2707 EXCEPTION
2708 WHEN NO_DATA_FOUND THEN
2709 return 'NO MESSAGE FOUND';
2711 return 'NO MESSAGE FOUND';
2712 END get_message;
2713
2714
2715 /**
2716 * FUNCTION is_restriction_exist
2717 *
2718 * DESCRIPTION
2719 * used by common party UI .
2720 * will return a flag to indicate if contact preference exist
2721 * ARGUMENTS
2722 * IN:
2723 * p_contact_level_table contact level table
2724 * p_contact_level_table_id contact level table id
2725 * p_preference_code preference code
2726 *
2727 * RETURNS : VARCHAR2
2728 *
2729 **/
2730
2731 FUNCTION is_restriction_exist (
2732 p_contact_level_table IN VARCHAR2,
2733 p_contact_level_table_id IN NUMBER,
2734 p_preference_code IN VARCHAR2
2735 ) RETURN VARCHAR2 IS
2736
2737 CURSOR c_restriction IS
2738 SELECT null
2739 FROM hz_contact_preferences
2740 WHERE contact_level_table = p_contact_level_table
2741 AND contact_level_table_id = p_contact_level_table_id
2742 AND preference_code = p_preference_code
2743 AND status = 'A'
2744 AND (preference_end_date IS NULL OR
2745 TRUNC(preference_end_date) >= TRUNC(sysdate))
2746 AND TRUNC(preference_start_date) <= TRUNC(sysdate)
2747 AND ROWNUM = 1;
2748
2749 l_dummy VARCHAR2(1);
2750 l_return VARCHAR2(1);
2751
2752 BEGIN
2753
2754 IF p_contact_level_table_id IS NULL THEN
2755 RETURN 'N';
2756 END IF;
2757
2758 OPEN c_restriction;
2759 FETCH c_restriction INTO l_dummy;
2760 IF c_restriction%NOTFOUND THEN
2761 l_return := 'N';
2762 ELSE
2763 l_return := 'Y';
2764 END IF;
2765 CLOSE c_restriction;
2766
2767 RETURN l_return;
2768
2769 END is_restriction_exist;
2770
2771 /**
2772 * FUNCTION is_purchased_content_source
2773 *
2774 * DESCRIPTION
2775 * This function will return 'Y' if the source system is a purchased one.
2776 * (i.e HZ_ORIG_SYSTEMS_B.orig_system_type = 'PURCHASED')
2777 *
2778 * ARGUMENTS
2779 * IN:
2780 * p_content_source
2781 *
2782 * RETURNS : VARCHAR2
2783 *
2784 * NOTES
2785 *
2786 * MODIFICATION HISTORY
2787 *
2788 * 01-03-2005 Rajib Ranjan Borah o SSM SST Integration and Extension. Created.
2789 *
2790 **/
2791 FUNCTION is_purchased_content_source (
2792 p_content_source IN VARCHAR2
2793 ) RETURN VARCHAR2 IS
2794
2795 CURSOR c_content_source IS
2796 SELECT 'Y'
2797 FROM HZ_ORIG_SYSTEMS_B
2798 WHERE orig_system = p_content_source
2799 AND orig_system_type = 'PURCHASED'
2800 -- AND status = 'A'
2801 AND rownum = 1;
2802
2803 l_return_value VARCHAR2(1);
2804
2805 BEGIN
2806
2807 OPEN c_content_source;
2808 FETCH c_content_source INTO l_return_value;
2809 IF c_content_source%NOTFOUND THEN
2810 l_return_value := 'N';
2811 END IF;
2812 CLOSE c_content_source;
2813
2814 RETURN l_return_value;
2815
2816 END is_purchased_content_source;
2817
2818 /**
2819 * FUNCTION get_lookupMeaning_lang
2820 *
2821 * DESCRIPTION
2822 * This function will return the meaning in FND_LOOKUP_VALUES for the given combination
2823 * of lookup_type, lookup_code and language.
2824 *
2825 * ARGUMENTS
2826 * IN:
2827 * p_lookup_type
2828 * p_lookup_code
2829 * p_language
2830 *
2831 * RETURNS : VARCHAR2 (FND_LOOKUP_VALUES.Meaning)
2832 *
2833 * NOTES
2834 *
2835 * MODIFICATION HISTORY
2836 *
2837 * 09-Jan-2005 Rajib Ranjan Borah o SSM SST Integration and Extension. Created.
2838 *
2839 **/
2840 FUNCTION get_lookupMeaning_lang (
2841 p_lookup_type IN VARCHAR2,
2842 p_lookup_code IN VARCHAR2,
2843 p_language IN VARCHAR2
2844 ) RETURN VARCHAR2 IS
2845
2846 CURSOR c_lookup_meaning_for_lang IS
2847 SELECT meaning
2848 FROM FND_LOOKUP_VALUES
2849 WHERE lookup_type = p_lookup_type
2850 AND lookup_code = p_lookup_code
2851 AND language = p_language
2852 AND enabled_flag = 'Y'
2853 AND (end_date_active IS NULL
2854 OR end_date_active >= sysdate);
2855
2856 l_return_value VARCHAR2(80);
2857
2858 BEGIN
2859
2860 OPEN c_lookup_meaning_for_lang;
2861 FETCH c_lookup_meaning_for_lang INTO l_return_value;
2862 IF c_lookup_meaning_for_lang%NOTFOUND THEN
2863 l_return_value := NULL ;
2864 END IF;
2865 CLOSE c_lookup_meaning_for_lang;
2866
2867 RETURN l_return_value;
2868
2869 END get_lookupMeaning_lang;
2870
2871 /**
2872 * FUNCTION get_lookupDesc_lang
2873 *
2874 * DESCRIPTION
2875 * This function will return the description in FND_LOOKUP_VALUES for the given combination
2876 * of lookup_type, lookup_code and language.
2877 *
2878 * ARGUMENTS
2882 * p_language
2879 * IN:
2880 * p_lookup_type
2881 * p_lookup_code
2883 *
2884 * RETURNS : VARCHAR2 (FND_LOOKUP_VALUES.Description)
2885 *
2886 * NOTES
2887 *
2888 * MODIFICATION HISTORY
2889 *
2890 * 09-Jan-2005 Rajib Ranjan Borah o SSM SST Integration and Extension. Created.
2891 *
2892 **/
2893 FUNCTION get_lookupDesc_lang (
2894 p_lookup_type IN VARCHAR2,
2895 p_lookup_code IN VARCHAR2,
2896 p_language IN VARCHAR2
2897 ) RETURN VARCHAR2 IS
2898
2899 CURSOR c_lookup_desc_for_lang IS
2900 SELECT description
2901 FROM FND_LOOKUP_VALUES
2902 WHERE lookup_type = p_lookup_type
2903 AND lookup_code = p_lookup_code
2904 AND language = p_language
2905 AND enabled_flag = 'Y'
2906 AND (end_date_active IS NULL
2907 OR end_date_active >= sysdate);
2908
2909 l_return_value VARCHAR2(240);
2910
2911 BEGIN
2912
2913 OPEN c_lookup_desc_for_lang;
2914 FETCH c_lookup_desc_for_lang INTO l_return_value;
2915 IF c_lookup_desc_for_lang%NOTFOUND THEN
2916 l_return_value := NULL ;
2917 END IF;
2918 CLOSE c_lookup_desc_for_lang;
2919
2920 RETURN l_return_value;
2921
2922 END get_lookupDesc_lang;
2923
2924
2925
2926 /**
2927 * FUNCTION check_prim_bill_to_site
2928 *
2929 * DESCRIPTION
2930 * used by common party UI .
2931 * will return Y if the party site is the primary Bill_To site.
2932 * will return N in other cases
2933
2934 * ARGUMENTS
2935 * IN:
2936 * p_party_site_id party site id used to retrieve the site use purpose.
2937 *
2938 * RETURNS : VARCHAR2
2939 *
2940 **/
2941 function check_prim_bill_to_site (
2942 p_party_site_id IN NUMBER)
2943 RETURN VARCHAR2 IS
2944
2945
2946 l_bill_to_primary VARCHAR2(1000);
2947 l_primary VARCHAR2(10);
2948 cursor c_site_bill_to (l_party_site_id IN NUMBER) is
2949 select psu.primary_per_type
2950 from hz_party_site_uses psu
2951 where
2952 psu.party_site_id = l_party_site_id and
2953 psu.status = 'A' and
2954 psu.site_use_type = 'BILL_TO' and
2955 psu.primary_per_type = 'Y'
2956 order by primary_per_type DESC;
2957
2958 BEGIN
2959
2960 l_bill_to_primary := 'N';
2961 OPEN c_site_bill_to(p_party_site_id);
2962 LOOP
2963 FETCH c_site_bill_to INTO l_primary;
2964
2965 IF c_site_bill_to%NOTFOUND THEN
2966 EXIT;
2967 END IF;
2968
2969 IF l_primary = 'Y' THEN
2970 l_bill_to_primary := 'Y';
2971 exit;
2972 END IF;
2973
2974 END LOOP;
2975 CLOSE c_site_bill_to;
2976
2977 RETURN l_bill_to_primary;
2978 END check_prim_bill_to_site;
2979
2980
2981 /**
2982 * FUNCTION check_prim_ship_to_site
2983 *
2984 * DESCRIPTION
2985 * used by common party UI .
2986 * will return Y if the party site is the primary Ship_To site.
2987 * will return N in other cases
2988
2989 * ARGUMENTS
2990 * IN:
2991 * p_party_site_id party site id used to retrieve the site use purpose.
2992 *
2993 * RETURNS : VARCHAR2
2994 *
2995 **/
2996 function check_prim_ship_to_site (
2997 p_party_site_id IN NUMBER)
2998 RETURN VARCHAR2 IS
2999
3000
3001 l_ship_to_primary VARCHAR2(1000);
3002 l_primary VARCHAR2(10);
3003 cursor c_site_ship_to (l_party_site_id IN NUMBER) is
3004 select psu.primary_per_type
3005 from hz_party_site_uses psu
3006 where
3007 psu.party_site_id = l_party_site_id and
3008 psu.status = 'A' and
3009 psu.site_use_type = 'SHIP_TO' and
3010 psu.primary_per_type = 'Y'
3011 order by primary_per_type DESC;
3012
3013 BEGIN
3014
3015 l_ship_to_primary := 'N';
3016 OPEN c_site_ship_to(p_party_site_id);
3017 LOOP
3018 FETCH c_site_ship_to INTO l_primary;
3019
3020 IF c_site_ship_to%NOTFOUND THEN
3021 EXIT;
3022 END IF;
3023
3024 IF l_primary = 'Y' THEN
3025 l_ship_to_primary := 'Y';
3026 exit;
3027 END IF;
3028
3029 END LOOP;
3030 CLOSE c_site_ship_to;
3031
3032 RETURN l_ship_to_primary;
3033 END check_prim_ship_to_site;
3034
3035
3036 /**
3037 * PROCEDURE validate_created_by_module
3038 *
3039 * DESCRIPTION
3040 * validate created by module
3041 * ARGUMENTS
3042 * IN:
3043 * p_create_update_flag create update flag
3044 * p_created_by_module created by module
3045 * p_old_created_by_module old value of created by module
3046 * x_return_status return status
3047 */
3048
3049 PROCEDURE validate_created_by_module (
3050 p_create_update_flag IN VARCHAR2,
3051 p_created_by_module IN VARCHAR2,
3055
3052 p_old_created_by_module IN VARCHAR2,
3053 x_return_status IN OUT NOCOPY VARCHAR2
3054 ) IS
3056 BEGIN
3057
3058 -- skip mandatory and non-updateable check from logical API
3059 IF G_CALLING_API IS NULL THEN
3060 -- created_by_module is mandatory field
3061 -- Since created_by_module is non-updateable, we only need to check mandatory
3062 -- during creation.
3063
3064 IF p_create_update_flag = 'C' THEN
3065 validate_mandatory (
3066 p_create_update_flag => p_create_update_flag,
3067 p_column => 'created_by_module',
3068 p_column_value => p_created_by_module,
3069 x_return_status => x_return_status);
3070
3071 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3072 debug(
3073 p_prefix => '',
3074 p_message => 'created_by_module is mandatory. ' ||
3075 'x_return_status = ' || x_return_status,
3076 p_msg_level => fnd_log.level_statement);
3077 END IF;
3078 END IF;
3079
3080 -- created_by_module is non-updateable field. But it can be updated from
3081 -- NULL to some value.
3082
3083 IF p_create_update_flag = 'U' AND
3084 p_created_by_module IS NOT NULL
3085 THEN
3086 validate_nonupdateable (
3087 p_column => 'created_by_module',
3088 p_column_value => p_created_by_module,
3089 p_old_column_value => p_old_created_by_module,
3090 p_restricted => 'N',
3091 x_return_status => x_return_status);
3092
3093 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3094 debug(
3095 p_prefix => '',
3096 p_message => 'created_by_module is non-updateable. It can be updated from NULL to a value. ' ||
3097 'x_return_status = ' || x_return_status,
3098 p_msg_level => fnd_log.level_statement);
3099 END IF;
3100 END IF;
3101 END IF;
3102
3103 -- created_by_module is lookup code in lookup type HZ_CREATED_BY_MODULES
3104 IF p_created_by_module IS NOT NULL AND
3105 p_created_by_module <> fnd_api.g_miss_char AND
3106 (p_create_update_flag = 'C' OR
3107 (p_create_update_flag = 'U' AND
3108 (p_old_created_by_module IS NULL OR
3109 p_created_by_module <> p_old_created_by_module)))
3110 THEN
3111 validate_lookup (
3112 p_column => 'created_by_module',
3113 p_lookup_type => 'HZ_CREATED_BY_MODULES',
3114 p_column_value => p_created_by_module,
3115 x_return_status => x_return_status);
3116
3117 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3118 debug(
3119 p_prefix => '',
3120 p_message => 'created_by_module is lookup code in lookup type HZ_CREATED_BY_MODULES. ' ||
3121 'x_return_status = ' || x_return_status,
3122 p_msg_level => fnd_log.level_statement);
3123 END IF;
3124 END IF;
3125
3126 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3127 debug(
3128 p_prefix => '',
3129 p_message => 'after validate created_by_module ... ' ||
3130 'x_return_status = ' || x_return_status,
3131 p_msg_level => fnd_log.level_statement);
3132 END IF;
3133
3134 END validate_created_by_module;
3135
3136
3137 /**
3138 * PROCEDURE validate_application_id
3139 *
3140 * DESCRIPTION
3141 * validate application id
3142 * ARGUMENTS
3143 * IN:
3144 * p_create_update_flag create update flag
3145 * p_application_id application id
3146 * p_old_application_id old value of application id
3147 * x_return_status return status
3148 */
3149
3150 PROCEDURE validate_application_id (
3151 p_create_update_flag IN VARCHAR2,
3152 p_application_id IN NUMBER,
3153 p_old_application_id IN NUMBER,
3154 x_return_status IN OUT NOCOPY VARCHAR2
3155 ) IS
3156
3157 l_column CONSTANT VARCHAR2(30) := 'application_id';
3158
3159 BEGIN
3160
3161 -- skip non-updateable check from logical API
3162 IF G_CALLING_API IS NULL THEN
3163 -- application_id is non-updateable field. But it can be updated from NULL
3164 -- to some value.
3165
3166 IF p_create_update_flag = 'U' AND
3167 p_application_id IS NOT NULL
3168 THEN
3169 validate_nonupdateable (
3170 p_column => l_column,
3171 p_column_value => p_application_id,
3172 p_old_column_value => p_old_application_id,
3173 p_restricted => 'N',
3174 x_return_status => x_return_status);
3175
3176 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3177 debug(
3178 p_prefix => '',
3179 p_message => l_column || ' is non-updateable. It can be updated from NULL to a value. ' ||
3180 'x_return_status = ' || x_return_status,
3181 p_msg_level => fnd_log.level_statement);
3182 END IF;
3183 END IF;
3184 END IF;
3185
3186 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3187 debug(
3188 p_prefix => '',
3189 p_message => 'after validate ' || l_column || ' ... ' ||
3190 'x_return_status = ' || x_return_status,
3191 p_msg_level => fnd_log.level_statement);
3192 END IF;
3193
3194 END validate_application_id;
3195
3196
3197 /**
3198 * FUNCTION is_role_in_relationship_group
3199 *
3200 * DESCRIPTION
3201 * return if a role exists in a relationship group
3202 * ARGUMENTS
3203 * IN:
3204 * p_relationship_type_id relationship type id
3205 * p_relationship_group_code relationship group code
3206 */
3207
3208 FUNCTION is_role_in_relationship_group (
3209 p_relationship_type_id IN NUMBER,
3210 p_relationship_group_code IN VARCHAR2
3211 ) RETURN VARCHAR2 IS
3212
3213 CURSOR c_groups IS
3214 SELECT null
3215 FROM hz_code_assignments c
3216 WHERE c.owner_table_name = 'HZ_RELATIONSHIP_TYPES'
3217 AND c.class_category = 'RELATIONSHIP_TYPE_GROUP'
3218 AND c.class_code = p_relationship_group_code
3219 AND sysdate between c.start_date_active and nvl(c.end_date_active, sysdate+1)
3220 AND c.status = 'A'
3221 AND c.owner_table_id = p_relationship_type_id
3222 AND ROWNUM = 1;
3223
3224 l_dummy VARCHAR2(1);
3225 l_return VARCHAR2(1);
3226
3227 BEGIN
3228
3229 OPEN c_groups;
3230 FETCH c_groups INTO l_dummy;
3231 IF c_groups%NOTFOUND THEN
3232 l_return := 'N';
3233 ELSE
3234 l_return := 'Y';
3235 END IF;
3236 CLOSE c_groups;
3237
3238 RETURN l_return;
3239
3240 END is_role_in_relationship_group;
3241
3242
3243 END HZ_UTILITY_V2PUB;