DBA Data[Home] [Help]

PACKAGE BODY: APPS.OKE_UTILS

Source


1 PACKAGE BODY OKE_UTILS AS
2 /* $Header: OKEUTILB.pls 120.3 2006/01/17 12:13:35 ausmani noship $ */
3 
4 --
5 -- Private Global Variables
6 --
7 G_Emp_ID        per_all_people_f.person_id%type := NULL;
8 G_Emp_Name      per_all_people_f.full_name%type := NULL;
9 G_User_ID       fnd_user.user_id%type           := NULL;
10 G_Yes           VARCHAR2(80)                    := NULL;
11 G_No            VARCHAR2(80)                    := NULL;
12 
13 G_K_Hdr_ID_Curr NUMBER                          := NULL;
14 G_Fmt_Length    NUMBER                          := NULL;
15 G_Fmt_Mask      VARCHAR2(80)                    := NULL;
16 
17 --
18 -- This is a body global variable storing the value of
19 -- USERENV('LANG').  The value is cached into this variable so that
20 -- calling functions do not have to hit the database to determine this
21 -- value.
22 --
23 G_Userenv_Lang  fnd_languages.language_code%TYPE;
24 
25 --
26 -- Multi-Org Security Globals
27 --
28 G_Access        VARCHAR2(1)                     := NULL;
29 
30 
31 
32 --
33 --  Name          : Curr_Emp_ID
34 --  Pre-reqs      : FND_GLOBAL.INITIALIZE
35 --  Function      : This function returns the employee ID derived from
36 --                  the current user
37 --
38 --
39 --  Parameters    :
40 --  IN            : None
41 --  OUT           : None
42 --
43 --  Returns       : NUMBER
44 --
45 
46 FUNCTION Curr_Emp_ID
47 RETURN NUMBER IS
48 
49 CURSOR csr ( c_user_id number ) IS
50   SELECT employee_id
51   FROM   fnd_user
52   WHERE  user_id = c_user_id;
53 
54 BEGIN
55   --
56   -- Result is cached into a global variable to speed up repeated
57   -- lookups.  In the extreme rare case when the USER_ID changed
58   -- midstream, the last used USER_ID used to retrieve the
59   -- employee ID is also cached to check for mismatch
60   --
61   IF (  G_Emp_ID IS NULL
62      OR G_User_ID <> FND_GLOBAL.User_ID ) THEN
63 /*
64     OPEN csr ( FND_GLOBAL.user_id );
65     FETCH csr INTO G_Emp_ID;
66     CLOSE csr;
67 */
68     G_Emp_ID := FND_GLOBAL.Employee_ID;
69     G_User_ID := FND_GLOBAL.User_ID;
70 
71   END IF;
72 
73   RETURN ( G_Emp_ID );
74 
75 EXCEPTION
76   WHEN OTHERS THEN
77     RETURN ( TO_NUMBER(NULL) );
78 
79 END Curr_Emp_ID;
80 
81 --
82 --  Name          : Curr_Emp_Name
83 --  Pre-reqs      : FND_GLOBAL.INITIALIZE
84 --  Function      : This function returns the employee name derived from
85 --                  the current user
86 --
87 --
88 --  Parameters    :
89 --  IN            : None
90 --  OUT           : None
91 --
92 --  Returns       : VARCHAR2
93 --
94 
95 FUNCTION Curr_Emp_Name
96 RETURN VARCHAR2 IS
97 
98 CURSOR csr ( c_person_id number ) IS
99   SELECT full_name
100   FROM   per_all_people_f
101   WHERE  person_id = c_person_id;
102 
103 BEGIN
104   --
105   -- Result is cached into a global variable to speed up repeated
106   -- lookups.  In the extreme rare case when the USER_ID changed
107   -- midstream, the last used USER_ID used to retrieve the
108   -- employee name is also cached to check for mismatch
109   --
110   IF (  G_Emp_Name IS NULL
111      OR G_User_ID <> FND_GLOBAL.User_ID ) THEN
112 
113     OPEN csr ( Curr_Emp_ID );
114     FETCH csr INTO G_Emp_Name;
115     CLOSE csr;
116 
117     G_User_ID := FND_GLOBAL.User_ID;
118 
119   END IF;
120 
121   RETURN ( G_Emp_Name );
122 
123 EXCEPTION
124   WHEN OTHERS THEN
125     RETURN ( NULL );
126 
127 END Curr_Emp_Name;
128 
129 
130 --
131 --  Name          : Yes_No / Sys_Yes_No
132 --  Pre-reqs      : None
133 --  Function      : This function returns the yes/no string based on the
134 --                  lookups YES_NO and SYS_YES_NO.
135 --
136 --
137 --  Parameters    :
138 --  IN            : None
139 --  OUT           : None
140 --
141 --  Returns       : VARCHAR2
142 --
143 --  Note          : The cached values are shared between Yes_No and
144 --                  Sys_Yes_No as the text is extremely unlikely to
145 --                  differ between the two lookups.
146 --
147 
148 FUNCTION Yes_No
149 ( X_Lookup_Code    IN VARCHAR2
150 ) return varchar2 IS
151 
152 CURSOR c IS
153   SELECT meaning
154   FROM   fnd_lookups
155   WHERE  lookup_type = 'YES_NO'
156   AND    lookup_code = X_Lookup_Code;
157 
158 BEGIN
159 
160   IF ( X_Lookup_Code = 'Y' ) THEN
161     IF ( G_Yes IS NULL ) THEN
162       OPEN c;
163       FETCH c INTO G_Yes;
164       CLOSE c;
165     END IF;
166     RETURN ( G_Yes );
167   ELSIF ( X_Lookup_Code = 'N' ) THEN
168     IF ( G_No IS NULL ) THEN
169       OPEN c;
170       FETCH c INTO G_No;
171       CLOSE c;
172     END IF;
173     RETURN ( G_No );
174   ELSE
175     RETURN ( NULL );
176   END IF;
177 
178 EXCEPTION
179 WHEN OTHERS THEN
180   IF ( c%ISOPEN ) THEN
181     CLOSE c;
182   END IF;
183   RETURN ( NULL );
184 
185 END Yes_No;
186 
187 
188 FUNCTION Sys_Yes_No
189 ( X_Lookup_Code    IN NUMBER
190 ) return varchar2 IS
191 
192 CURSOR c IS
193   SELECT meaning
194   FROM   mfg_lookups
195   WHERE  lookup_type = 'SYS_YES_NO'
196   AND    lookup_code = X_Lookup_Code;
197 
198 BEGIN
199 
200   IF ( X_Lookup_Code = 'Y' ) THEN
201     IF ( G_Yes IS NULL ) THEN
202       OPEN c;
203       FETCH c INTO G_Yes;
204       CLOSE c;
205     END IF;
206     RETURN ( G_Yes );
207   ELSIF ( X_Lookup_Code = 'N' ) THEN
208     IF ( G_No IS NULL ) THEN
209       OPEN c;
210       FETCH c INTO G_No;
211       CLOSE c;
212     END IF;
213     RETURN ( G_No );
214   ELSE
215     RETURN ( NULL );
216   END IF;
217 
218 EXCEPTION
219 WHEN OTHERS THEN
220   IF ( c%ISOPEN ) THEN
221     CLOSE c;
222   END IF;
223   RETURN ( NULL );
224 
225 END Sys_Yes_No;
226 
227 
228 --
229 --  Name          : Chg_Request_Num
230 --  Pre-reqs      : None
231 --  Function      : This function returns the related Change Request
232 --                  Number and Change Status for the given contract
233 --		    either for the current version or a specific
234 --		    major version.
235 --
236 --
237 --  Parameters    :
238 --  IN            : X_K_Header_ID           NUMBER
239 --                  X_Major_Version         NUMBER
240 --                  X_History_Use           VARCHAR2
241 --                  X_Curr_Indicator        VARCHAR2
242 --                  X_Current_Only          VARCHAR2
243 --  OUT           : X_Change_Request	    VARCHAR2
244 --		    X_Change_Status	    VARCHAR2
245 --
246 
247 PROCEDURE Chg_Request_Num
248 ( X_K_Header_ID           IN     NUMBER
249 , X_Major_Version         IN     NUMBER
250 , X_Current_Only          IN     VARCHAR2
251 , X_Curr_Indicator        IN     VARCHAR2
252 , X_Change_Request	  OUT NOCOPY	 VARCHAR2
253 , X_Change_Status	  OUT NOCOPY    VARCHAR2
254 , X_History_Use           IN     VARCHAR2
255 ) IS
256 
257 BEGIN
258   --
259   -- Logic moved to OKE_CHG_REQ_UTILS.GET_CHG_REQUEST
260   --
261   OKE_CHG_REQ_UTILS.Get_Chg_Request
262   ( X_K_Header_ID
263   , X_Major_Version
264   , X_Change_Request
265   , X_Change_Status
266   , X_History_Use
267   );
268 
269 END;
270 
271 
272 --
273 --  Name          : Item_Number
274 --  Pre-reqs      : None
275 --  Function      : This function returns the item number for a given
276 --                  inventory organization and item ID.
277 --
278 --
279 --  Parameters    :
280 --  IN            : X_Inventory_Org_ID      NUMBER
281 --                  X_Item_ID               NUMBER
282 --  OUT           : None
283 --
284 --  Returns       : VARCHAR2
285 --
286 
287 FUNCTION Item_Number
288 ( X_Inventory_Org_ID      IN     NUMBER
289 , X_Item_ID               IN     NUMBER
290 ) RETURN VARCHAR2 IS
291 
292 CURSOR ItemNum IS
293   SELECT Item_Number
294   FROM   mtl_item_flexfields
295   WHERE  organization_id = X_Inventory_Org_ID
296   AND    inventory_item_id = X_Item_ID;
297 
298 L_Item_Number   VARCHAR2(2000);
299 
300 BEGIN
301 
302   IF ( X_Inventory_Org_ID IS NULL OR X_Item_ID IS NULL ) THEN
303     RETURN ( NULL );
304   END IF;
305 
306   OPEN ItemNum;
307   FETCH ItemNum INTO L_Item_Number;
308   CLOSE ItemNum;
309 
310   RETURN ( L_Item_Number );
311 
312 EXCEPTION
313 WHEN OTHERS THEN
314   RETURN ( NULL );
315 END Item_Number;
316 
317 
318 --
319 --  Name          : Item_Description
320 --  Pre-reqs      : None
321 --  Function      : This function returns the item description for a given
322 --                  inventory organization and item ID.
323 --
324 --
325 --  Parameters    :
326 --  IN            : X_Inventory_Org_ID      NUMBER
327 --                  X_Item_ID               NUMBER
328 --  OUT           : None
329 --
330 --  Returns       : VARCHAR2
331 --
332 
333 FUNCTION Item_Description
334 ( X_Inventory_Org_ID      IN     NUMBER
335 , X_Item_ID               IN     NUMBER
336 ) RETURN VARCHAR2 IS
337 
338 CURSOR ItemDesc IS
339   SELECT Description
340   FROM   mtl_system_items
341   WHERE  organization_id = X_Inventory_Org_ID
342   AND    inventory_item_id = X_Item_ID;
343 
344 L_Item_Description   VARCHAR2(2000);
345 
346 BEGIN
347 
348   IF ( X_Inventory_Org_ID IS NULL OR X_Item_ID IS NULL ) THEN
349     RETURN ( NULL );
350   END IF;
351 
352   OPEN ItemDesc;
353   FETCH ItemDesc INTO L_Item_Description;
354   CLOSE ItemDesc;
355 
356   RETURN ( L_Item_Description );
357 
358 EXCEPTION
359 WHEN OTHERS THEN
360   RETURN ( NULL );
361 END Item_Description;
362 
363 
364 --
365 --  Name          : Check_Unique
366 --  Pre-reqs      : None
367 --  Function      : This function checks uniqueness of a column
368 --                  value in the given table.
369 --
370 --  Parameters    :
371 --  IN            : X_K_Header_ID           NUMBER
372 --                  X_Major_Version         NUMBER
373 --                  X_Current_Only          VARCHAR2 DEFAULT Y
374 --                  X_Curr_Indicator        VARCHAR2 DEFAULT N
375 --  OUT           : None
376 --
377 --  Returns       : BOOLEAN
378 --
379 
380 FUNCTION Check_Unique
381 ( X_Table_Name      IN     VARCHAR2
382 , X_Column_Name     IN     VARCHAR2
383 , X_Column_Value    IN     VARCHAR2
384 , X_ROWID_Column    IN     VARCHAR2
385 , X_Row_ID          IN     VARCHAR2
386 , X_Translated      IN     VARCHAR2
387 ) RETURN BOOLEAN IS
388 
389 TYPE chk_unq_rc IS REF CURSOR;
390 
391 c              chk_unq_rc;
392 stmt           VARCHAR2(2000);
393 dummy          NUMBER := 0;
394 
395 BEGIN
396 
397   stmt := 'SELECT 1 FROM ' || X_Table_Name ||
398           ' WHERE ' || X_Column_Name || ' = :column_value';
399 
400   IF ( X_Row_ID IS NOT NULL ) THEN
401     stmt := stmt || ' AND ' || X_ROWID_Column || ' <> :row_id';
402   END IF;
403 
404   IF ( X_Translated = 'Y' ) THEN
405     stmt := stmt || ' AND LANGUAGE = USERENV(''LANG'')';
406   END IF;
407 
408   --
409   -- Check for existing records using NDS
410   --
411   IF ( X_Row_ID IS NOT NULL ) THEN
412     OPEN c FOR stmt USING X_Column_Value , X_Row_ID;
413   ELSE
414     OPEN c FOR stmt USING X_Column_Value;
415   END IF;
416   FETCH c INTO dummy;
417 
418   IF ( c%notfound ) THEN
419     CLOSE c;
420     RETURN ( TRUE );
421   END IF;
422 
423   RETURN ( FALSE );
424 
425 EXCEPTION
426   WHEN OTHERS THEN
427     CLOSE c;
428     RAISE;
429 
430 END Check_Unique;
431 
432 
433 
434 -- Function     get_location_description
435 -- Purpose:
436 --              returns location name by location_id
437 --
438 --
439 --
440 FUNCTION get_location_description(id NUMBER)
441 RETURN VARCHAR2  IS
442 
443 l_return_val VARCHAR2(240);
444 
445 CURSOR c_hr IS
446 SELECT nvl(description,'')
447 FROM hr_locations_all
448 WHERE location_id=id;
449 
450 CURSOR c_hz IS
451 SELECT substr(address1,1,240)
452 FROM hz_locations
453 WHERE location_id=id;
454 
455 CURSOR c_both IS
456 SELECT description
457 FROM hr_locations
458 WHERE location_id=id;
459 
460 BEGIN
461 
462 OPEN c_hr;
463 FETCH c_hr INTO l_return_val;
464 IF c_hr%NOTFOUND THEN
465  OPEN c_hz;
466  FETCH c_hz INTO l_return_val;
467  IF c_hz%NOTFOUND THEN
468   l_return_val:='ERROR-NO SUCH LOCATION_ID';
469  END IF;
470  CLOSE c_hz;
471 END IF;
472 CLOSE c_hr;
473 RETURN l_return_val;
474 
475 END get_location_description;
476 
477 
478 
479 
480 -- Function     get_term_values
481 -- Purpose:
482 --              to be used by view definition oke_k_terms_v only
483 --
484 --
485 --
486 FUNCTION get_term_values(p_term_code VARCHAR2, p_term_value_pk1 VARCHAR2,
487 			p_term_value_pk2 VARCHAR2,p_call_option VARCHAR2 )
488 RETURN VARCHAR2  IS
489 
490 v_chr1 varchar2(240);
491 v_chr2 varchar2(240);
492 v_date1 date;
493 v_date2 date;
494 
495 begin
496 
497 if p_term_code = 'AP_PAYMENT_TERMS' then
498 
499   SELECT NAME , DESCRIPTION , START_DATE_ACTIVE , END_DATE_ACTIVE
500   INTO v_chr1 , v_chr2 , v_date1 , v_date2
501   FROM AP_TERMS
502   WHERE TERM_ID = to_number(p_term_value_pk1);
503 
504 elsif p_term_code='IB_SHIPPING_METHOD' then
505 
506   SELECT DESCRIPTION , DESCRIPTION , TO_DATE(NULL) , DISABLE_DATE
507   into v_chr1 , v_chr2 , v_date1 , v_date2
508   FROM ORG_FREIGHT
509   WHERE ORGANIZATION_ID = to_number(p_term_value_pk1)
510   AND   FREIGHT_CODE = p_term_value_pk2;
511 
512 elsif p_term_code='RA_PAYMENT_TERMS' then
513 
514   SELECT NAME , DESCRIPTION , START_DATE_ACTIVE , END_DATE_ACTIVE
515   INTO v_chr1 , v_chr2 , v_date1 , v_date2
516   FROM RA_TERMS
517   WHERE TERM_ID = to_number(p_term_value_pk1);
518 
519 else
520 
521   SELECT LU.MEANING , LU.DESCRIPTION , LU.START_DATE_ACTIVE , LU.END_DATE_ACTIVE
522   INTO v_chr1 , v_chr2 , v_date1 , v_date2
523   FROM FND_LOOKUP_VALUES_VL LU
524   ,    OKE_TERMS_B T
525   WHERE T.TERM_CODE = p_term_code
526   AND   LU.VIEW_APPLICATION_ID = T.VIEW_APPLICATION_ID
527   AND   LU.LOOKUP_TYPE = T.LOOKUP_TYPE
528   AND   LU.LOOKUP_CODE = p_term_value_pk1;
529 
530 end if;
531 
532 if p_call_option='MEANING' then
533   return v_chr1;
534 elsif p_call_option='DESCRIPTION' then
535   return v_chr2;
536 elsif p_call_option='START_DATE_ACTIVE' then
537   return v_date1;
538 elsif p_call_option='END_DATE_ACTIVE' then
539   return v_date2;
540 else return 'ERROR';
541 end if;
542 
543 
544 END get_term_values;
545 
546 
547 -- Function     get_ob_terms
548 -- Purpose:     See specs in OKEUTILS.pls
549 --
550 
551 FUNCTION get_term_value (p_id NUMBER,p_term_code VARCHAR2) RETURN VARCHAR2 IS
552     l_term_value varchar2(80) := null;
553     cursor c_term_value(id number,code varchar2) is
554         select term_value_pk1
555               from oke_k_terms
556               where k_header_id = p_id
557               and term_code = p_term_code
558               and rownum=1;
559 BEGIN
560     if p_term_code is not null then
561         open c_term_value(p_id,p_term_code);
562         fetch c_term_value into l_term_value;
563         close c_term_value;
564     end if;
565 
566     return l_term_value;
567 Exception
568 When others then
569  if c_term_value%ISOPEN then
570     close c_term_value;
571  end if;
572  return null;
573 END get_term_value;
574 
575 
576 
577 -- Function     get_userenv_lang
578 -- Purpose:     See specs in OKEUTILS.pls
579 --              Briefly: This caches the value of userenv('lang') so
580 --              that subsequent calls do not result in a database hit
581 --
582 --
583 FUNCTION get_userenv_lang RETURN VARCHAR2  IS
584 
585 BEGIN
586 
587 -- Determine if this was determined before by examining the global
588 -- variable g_userenv_lang. If this is NOT null, return the value,
589 -- otherwise, determine the value, populate the global variable and
590 -- return the value.
591 
592   IF g_userenv_lang IS NULL
593   THEN
594 	 g_userenv_lang := USERENV('LANG');
595   END IF;
596 
597   RETURN g_userenv_lang;
598 
599 END get_userenv_lang;
600 
601 
602 --
603 --  Name          : Get_K_Curr_Fmt_Mask
604 --  Pre-reqs      : None
605 --  Function      : This function returns the format mask for the
606 --                  currency of the given contract.  This is used in
607 --                  the flowdown view to speed up format time as the
608 --                  return value is cached.
609 --
610 --  Parameters    :
611 --  IN            : X_K_Header_ID           NUMBER
612 --                  X_Field_Length          NUMBER
613 --  OUT           : None
614 --
615 --  Returns       : VARCHAR2
616 --
617 
618 FUNCTION Get_K_Curr_Fmt_Mask
619 ( X_K_Header_ID     IN     NUMBER
620 , X_Field_Length    IN     NUMBER
621 ) RETURN VARCHAR2 IS
622 
623 CURSOR csr ( C_K_Header_ID   NUMBER
624            , C_Field_Length  NUMBER ) IS
625   SELECT FND_CURRENCY_CACHE.Get_Format_Mask
626          ( Currency_Code , C_Field_Length )
627   FROM   okc_k_headers_b
628   WHERE  id = C_K_Header_ID;
629 
630 BEGIN
631   --
632   -- Result is cached into a global variable to speed up repeated
633   -- lookups.
634   --
635   IF (  G_K_Hdr_ID_Curr IS NULL
636      OR G_Fmt_Mask IS NULL
637      OR G_K_Hdr_ID_Curr <> X_K_Header_ID
638      OR G_Fmt_Length <> X_Field_Length ) THEN
639 
640     OPEN csr ( X_K_Header_ID , X_Field_Length );
641     FETCH csr INTO G_Fmt_Mask;
642     CLOSE csr;
643 
644     G_K_Hdr_ID_Curr := X_K_Header_ID;
645     G_Fmt_Length    := X_Field_Length;
646 
647   END IF;
648 
649   RETURN ( G_Fmt_Mask );
650 
651 EXCEPTION
652   WHEN OTHERS THEN
653     RETURN ( FND_CURRENCY_CACHE.GET_FORMAT_MASK( 'USD' , 38 ) );
654 
655 END Get_K_Curr_Fmt_Mask;
656 
657 
658 -- -------------------------------------------------------------------
659 -- Multi-Org Security
660 -- -------------------------------------------------------------------
661 PROCEDURE Set_Org_Context
662 ( X_Org_ID       NUMBER
663 , X_Inv_Org_ID   NUMBER
664 ) IS
665 
666   is_multi_org  VARCHAR2(1);
667 
668 BEGIN
669 
670 --   select nvl(multi_org_flag , 'N')
671 --   into   is_multi_org
672 --   from   fnd_product_groups
673 --   where  rownum = 1;
674 --
675 --   if ( is_multi_org = 'Y' and X_Org_ID <> -99 ) then
676 --     FND_CLIENT_INFO.Set_Org_Context(X_Org_ID);
677 --   end if;
678   OKC_CONTEXT.Set_OKC_Org_Context(X_Org_ID , X_Inv_Org_ID);
679 
680 END Set_Org_Context;
681 
682 
683 FUNCTION Org_ID
684 RETURN NUMBER IS
685 BEGIN
686 
687   -- RETURN nvl( to_number(rtrim(substr( userenv('CLIENT_INFO') , 1 , 10 ))) , -99 );
688 
689   RETURN nvl(mo_global.get_current_org_id,-99);
690 
691 END Org_ID;
692 
693 
694 FUNCTION Cross_Org_Access
695 RETURN VARCHAR2 IS
696 BEGIN
697 
698   IF ( G_Access IS NULL ) THEN
699     G_Access := nvl( fnd_profile.value('OKE_CROSS_ORG_ACCESS') , 'Y' );
700   END IF;
701   RETURN ( G_Access );
702 
703 END Cross_Org_Access;
704 
705 
706 -- -------------------------------------------------------------------
707 -- PL/SQL Server Debugger
708 -- -------------------------------------------------------------------
709 
710 --
711 -- All functions have been moved to OKE_DEBUG.  Procedures retained
712 -- for compilation dependencies only.
713 --
714 PROCEDURE Enable_Debug IS
715 BEGIN
716   NULL;
717 END Enable_Debug;
718 
719 PROCEDURE Disable_Debug IS
720 BEGIN
721   NULL;
722 END Disable_Debug;
723 
724 FUNCTION Debug_Mode
725 RETURN VARCHAR2 IS
726 BEGIN
727   RETURN ( 'N' );
728 END Debug_Mode;
729 
730 PROCEDURE Debug ( text  IN  VARCHAR2 ) IS
731 BEGIN
732   NULL;
733 END Debug;
734 
735 FUNCTION  IS_VALID_DATE_RANGE (P_DATE_FROM        IN  DATE
736  		              ,P_DATE_TO          IN  DATE
737  			      ,P_PROJECT_ID       IN  NUMBER
738                               ) return number
739 IS
740    d_proj_start_date      date;
741    d_proj_end_date        date;
742    n_valid                number :=1;
743    n_invalid              number :=0;
744 
745 BEGIN
746 
747   IF P_DATE_FROM IS NULL OR P_DATE_TO IS NULL OR p_project_id IS NULL THEN
748      RETURN n_invalid;
749   END IF;
750 
751   BEGIN
752      select ppa.start_date
753            ,ppa.completion_date
754        into d_proj_start_date
755            ,d_proj_end_date
756        from pa_projects_all                ppa
757       where ppa.project_id                =p_project_id
758            ;
759   EXCEPTION
760      when no_data_found then
761         RETURN n_invalid;
762      when too_many_rows then
763         RETURN n_invalid;
764      when others then
765         RETURN n_invalid;
766   END;
767 
768   IF (P_DATE_FROM >= nvl(d_proj_start_date,P_DATE_FROM)) AND (P_DATE_TO <= nvl(d_proj_end_date,P_DATE_TO)) THEN
769      RETURN n_valid;
770   ELSE
771      RETURN n_invalid;
772   END IF;
773 
774 END IS_VALID_DATE_RANGE;
775 
776 
777 
778 FUNCTION Retrieve_Article_Text (P_id  		IN	NUMBER
779 				,P_position	IN	NUMBER
780 				,P_next_pos	OUT NOCOPY	NUMBER)return VARCHAR2
781 
782 IS
783     l_article_text	  CLOB;
784     l_article_length	  NUMBER;
785     l_append_text         VARCHAR2(32000);
786     l_position		  NUMBER;
787     l_read_length	  NUMBER := 10000;
788 
789 
790 CURSOR c_text IS
791 	select text
792 	from okc_k_articles_v where id = P_id;
793 
794 BEGIN
795 
796 OPEN c_text;
797 FETCH c_text INTO l_article_text;
798 CLOSE c_text;
799 
800 l_article_length :=  dbms_lob.getlength(l_article_text);
801 l_position := p_position;
802 
803 if l_article_length >= (l_position) then
804 
805 	dbms_lob.read(l_article_text,l_read_length,l_position,l_append_text);
806 	p_next_pos := l_position + l_read_length;
807 end if;
808 
809 return l_append_text;
810 
811 END;
812 
813 
814 FUNCTION Retrieve_WF_Role_Name (P_header_id		IN NUMBER,
815 				P_role_id   		IN NUMBER)
816 return VARCHAR2 is
817 
818   Cursor Get_WF_User (person_id NUMBER)
819   IS
820   SELECT r.name
821   FROM wf_roles r
822   WHERE r.orig_system ='PER'
823   AND   r.orig_system_id = person_id;
824 
825   Cursor Get_Header_Assignments
826   IS
827   SELECT Resource_source_id
828   FROM PA_Project_Parties
829   WHERE Resource_type_id = 101          -- employees only
830   AND   Object_type = 'OKE_K_HEADERS'   -- header assignments only
831   AND   Object_id   = P_header_id       -- for the requested header id only
832   AND   Project_role_id = P_role_id     -- for the requested role
833   AND   Trunc(SYSDATE) >= Trunc(Start_Date_Active)
834   AND   (End_Date_Active IS NULL  OR  Trunc(SYSDATE) <= Trunc(End_Date_Active));
835 Cursor Get_Program_Assignments
836   IS
837   SELECT Resource_source_id
838   FROM PA_Project_Parties pr, OKE_K_Headers
839   WHERE Resource_type_id = 101         -- employees only
840   AND   Object_type = 'OKE_PROGRAMS'   -- program  assignments only
841   AND   Object_id   = program_id       -- for the program id
842   AND   K_Header_id = P_header_id      -- related to the requested header id
843   AND   Project_role_id = P_role_id    -- for the requested role
844   AND   Trunc(SYSDATE) >= Trunc(Start_Date_Active)
845   AND   (End_Date_Active IS NULL  OR  Trunc(SYSDATE) <= Trunc(End_Date_Active))
846   and not exists ( -- Same Person shouldnot exist at contract level in any other role
847   SELECT 'x'
848   FROM PA_Project_Parties pr1
849   WHERE Resource_type_id = 101
850   AND   Object_type = 'OKE_K_HEADERS'
851   AND   Object_id   = P_header_id
852   AnD   pr.resource_id = pr1.resource_id
853   AND   Trunc(SYSDATE) >= Trunc(Start_Date_Active)
854   AND   (End_Date_Active IS NULL  OR  Trunc(SYSDATE) <= Trunc(End_Date_Active)))
855   order by pr.creation_date;
856 
857   Cursor Get_Site_Assignments
858   IS
859   SELECT Resource_source_id
860   FROM PA_Project_Parties pr
861   WHERE Resource_type_id = 101         -- employees only
862   AND   Object_type = 'OKE_PROGRAMS'   -- site assignments only
863   AND   Object_id   = 0                -- for the program id is 0 for site
864   AND   Project_role_id = P_role_id    -- for the requested role
865   AND   Trunc(SYSDATE) >= Trunc(Start_Date_Active)
866   AND   (End_Date_Active IS NULL  OR  Trunc(SYSDATE) <= Trunc(End_Date_Active))
867   and not exists ( -- Same Person shouldnot exist at contract level in any other role
868   SELECT 'x'
869   FROM PA_Project_Parties pr1
870   WHERE Resource_type_id = 101
871   AND   Object_type = 'OKE_K_HEADERS'
872   AND   Object_id   = P_header_id
873   AnD   pr.resource_id = pr1.resource_id
874   AND   Trunc(SYSDATE) >= Trunc(Start_Date_Active)
875   AND   (End_Date_Active IS NULL  OR  Trunc(SYSDATE) <= Trunc(End_Date_Active)))
876   and not exists ( -- Same Person shouldnot exist at program level in any other role
877   SELECT 'x'
878   FROM PA_Project_Parties pr2, OKE_K_Headers
879   WHERE Resource_type_id = 101
880   AND   Object_type = 'OKE_PROGRAMS'
881   AND   Object_id   = program_id
882   AND   K_Header_id = P_header_id
883   AND   pr.resource_id = pr2.resource_id
884   AND   Trunc(SYSDATE) >= Trunc(Start_Date_Active)
885   AND   (End_Date_Active IS NULL  OR  Trunc(SYSDATE) <= Trunc(End_Date_Active)))
886   order by pr.creation_date;
887 
888   l_person_id  NUMBER := -1;
889   l_wf_user    VARCHAR2(200);
890 
891 BEGIN
892 
893  OPEN Get_Header_Assignments;
894  FETCH Get_Header_Assignments INTO l_person_id;
895  IF Get_Header_Assignments%NOTFOUND THEN
896    OPEN Get_Program_Assignments;
897    FETCH Get_Program_Assignments INTO l_person_id;
898    IF Get_Program_Assignments%NOTFOUND THEN
899      OPEN Get_Site_Assignments;
900      FETCH Get_Site_Assignments INTO l_person_id;
901      IF Get_Site_Assignments%NOTFOUND THEN
902 	CLOSE Get_Site_Assignments;
903 	CLOSE Get_Program_Assignments;
904 	CLOSE Get_Header_Assignments;
905 	return NULL;
906      END IF;
907      CLOSE Get_Site_Assignments;
908    END IF;
909    CLOSE Get_Program_Assignments;
910  END IF;
911  CLOSE Get_Header_Assignments;
912 
913  OPEN Get_WF_User(l_person_id);
914  FETCH Get_WF_User INTO l_wf_user;
915  IF Get_WF_User%NOTFOUND THEN
916    CLOSE Get_WF_User;
917    return NULL;
918  END IF;
919  CLOSE Get_WF_User;
920 
921 return l_wf_user;
922 
923 END Retrieve_WF_Role_Name;
924 
925 PROCEDURE Set_Multi_org_Access IS
926 BEGIN
927  If nvl(fnd_profile.value('XLA_MO_SECURITY_PROFILE_LEVEL'),'N')='N'
928      and nvl( fnd_profile.value('OKE_CROSS_ORG_ACCESS') , 'Y' ) ='Y' then
929         mo_global.set_policy_context('B', NULL);
930  End if;
931 END Set_Multi_org_Access;
932 
933 
934 
935 END OKE_UTILS;