DBA Data[Home] [Help]

PACKAGE BODY: APPS.ENG_WORKFLOW_UTIL

Source


1 PACKAGE BODY Eng_Workflow_Util AS
2 /* $Header: ENGUWKFB.pls 120.32 2007/05/11 16:05:54 asjohal ship $ */
3 
4     G_PKG_NAME  CONSTANT VARCHAR2(30):= 'Eng_Workflow_Util' ;
5 
6     -- For Debug
7     g_debug_file      UTL_FILE.FILE_TYPE ;
8     g_debug_flag      BOOLEAN      := FALSE ;  -- For Debug, set TRUE
9     g_output_dir      VARCHAR2(240) := NULL ;
10     g_debug_filename  VARCHAR2(30) := 'EngChangeWorkflowUtil.log' ;
11     g_debug_errmesg   VARCHAR2(400);
12 
13     G_BO_IDENTIFIER         VARCHAR2(30) := 'ENG_WORKFLOW_UTIL';
14     G_ERRFILE_PATH_AND_NAME VARCHAR2(10000);
15     g_profile_debug_option  VARCHAR2(10) ;
16     g_profile_debug_level   VARCHAR2(10) ;
17 
18 
19 /********************************************************************
20 * Debug APIs    : Open_Debug_Session, Close_Debug_Session,
21 *                 Write_Debug
22 * Parameters IN :
23 * Parameters OUT:
24 * Purpose       : These procedures are for test and debug
25 *********************************************************************/
26 -- Open_Debug_Session
27 PROCEDURE Open_Debug_Session
28 (  p_output_dir IN VARCHAR2 := NULL
29 ,  p_file_name  IN VARCHAR2 := NULL
30 )
31 IS
32     --local variables
33     l_utl_file_dir    VARCHAR2(2000);
34     l_error_mesg      VARCHAR2(2000) ;
35 
36     CURSOR c_get_utl_file_dir IS
37        SELECT VALUE
38         FROM V$PARAMETER
39         WHERE NAME = 'utl_file_dir';
40 
41     l_found                NUMBER;
42 
43     l_log_output_dir       VARCHAR2(512);
44     l_log_return_status    VARCHAR2(99);
45     l_errbuff              VARCHAR2(2000);
46 
47 
48 BEGIN
49 
50      IF p_output_dir IS NOT NULL THEN
51         g_output_dir := p_output_dir ;
52 
53      END IF ;
54 
55      IF p_file_name IS NOT NULL THEN
56         g_debug_filename := p_file_name ;
57      END IF ;
58 
59 
60      OPEN c_get_utl_file_dir;
61      FETCH c_get_utl_file_dir INTO l_log_output_dir;
62 
63      IF c_get_utl_file_dir%FOUND THEN
64 
65        IF g_output_dir IS NOT NULL
66        THEN
67          l_found := INSTR(l_log_output_dir, g_output_dir);
68          IF l_found = 0
69          THEN
70              g_output_dir := NULL ;
71          END IF;
72        END IF;
73 
74        ------------------------------------------------------
75        -- Trim to get only the first directory in the list --
76        ------------------------------------------------------
77        IF INSTR(l_log_output_dir,',') <> 0 THEN
78          l_log_output_dir := SUBSTR(l_log_output_dir, 1, INSTR(l_log_output_dir, ',') - 1);
79        END IF;
80 
81 
82        IF g_output_dir IS NULL
83        THEN
84          g_output_dir := l_log_output_dir ;
85        END IF ;
86 
87 
88        IF g_debug_filename IS NULL
89        THEN
90           g_debug_filename := G_BO_IDENTIFIER ||'_' || to_char(sysdate, 'DDMONYYYY_HH24MISS')||'.log';
91        END IF ;
92 
93        -----------------------------------------------------------------------
94        -- To open the Debug Session to write the Debug Log.                 --
95        -- This sets Debug value so that Error_Handler.Get_Debug returns 'Y' --
96        -----------------------------------------------------------------------
97        Error_Handler.Open_Debug_Session(
98          p_debug_filename   => g_debug_filename
99         ,p_output_dir       => g_output_dir
100         ,x_return_status    => l_log_return_status
101         ,x_error_mesg       => l_errbuff
102         );
103 
104        FND_FILE.put_line(FND_FILE.LOG, 'Log file location --> '||l_log_output_dir||'/'||g_debug_filename ||' created with status '|| l_log_return_status);
105 
106        IF (l_log_return_status <> FND_API.G_RET_STS_SUCCESS)
107        THEN
108           FND_FILE.put_line(FND_FILE.LOG, 'Unable to open error log file. Error => '||l_errbuff) ;
109        END IF;
110 
111      END IF; --IF c_get_utl_file_dir%FOUND THEN
112      -- Bug : 4099546
113      CLOSE c_get_utl_file_dir;
114 
115      -- Set Global Debug Flag
116 
117      g_debug_flag := TRUE ;
118 
119 
120      /**********************************************************
121      IF g_output_dir IS NULL
122      THEN
123 
124          g_output_dir := FND_PROFILE.VALUE('ECX_UTL_LOG_DIR') ;
125 
126      END IF;
127 
128      select  value
129      INTO l_utl_file_dir
130      FROM v$parameter
131      WHERE name = 'utl_file_dir';
132 
133      l_found := INSTR(l_utl_file_dir, g_output_dir);
134 
135      IF l_found = 0
136      THEN
137           l_error_mesg := 'Debug Session could not be started. ' ||
138                           'The output directory is invalid.';
139 
140           --  'Debug Session could not be started because the ' ||
141           --  ' output directory name is invalid. '             ||
142           --  ' Output directory must be one of the directory ' ||
143           --  ' value in v$parameter for name = utl_file_dir ';
144 
145           -- FND_MSG_PUB.Add_Exc_Msg
146           -- (  G_PKG_NAME           ,
147           --    'Open_Debug_Session' ,
148           --    l_error_mesg  ) ;
149           -- RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
150 
151           FND_FILE.put_line(FND_FILE.LOG, G_PKG_NAME || ' Open_Debug_Session: LOGGING ERROR > '||l_error_mesg);
152           g_debug_flag := FALSE;
153           RETURN;
154 
155      END IF;
156 
157      g_debug_file := utl_file.fopen(  g_output_dir
158                                     , g_debug_filename
159                                     , 'w');
160      g_debug_flag := TRUE ;
161      **************************************************************/
162 
163 EXCEPTION
164     WHEN OTHERS THEN
165        g_debug_errmesg := Substr(To_Char(SQLCODE)||'/'||SQLERRM,1,240);
166        FND_FILE.put_line(FND_FILE.LOG, 'LOGGING SQL ERROR => '||g_debug_errmesg);
167        g_debug_flag := FALSE;
168        -- RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
169 
170 END Open_Debug_Session ;
171 
172 
173 
174 -----------------------------------------------------------
175 -- Open the Debug Session, conditionally if the profile: --
176 -- INV Debug Trace is set to TRUE                        --
177 -----------------------------------------------------------
178 PROCEDURE Check_And_Open_Debug_Session
179 (    p_debug_flag IN VARCHAR2
180   ,  p_output_dir IN VARCHAR2 := NULL
181   ,  p_file_name  IN VARCHAR2 := NULL
182 )
183 IS
184 
185 
186 BEGIN
187     ----------------------------------------------------------------
188     -- Open the Debug Log Session, p_debug_flag is TRUE or
189     -- if Profile is set to TRUE: INV_DEBUG_TRACE Yes, INV_DEBUG_LEVEL 20
190     ----------------------------------------------------------------
191     g_profile_debug_option := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'), TO_CHAR(0));
192     g_profile_debug_level := NVL(FND_PROFILE.VALUE('INV_DEBUG_LEVEL'), TO_CHAR(0));
193 
194     IF (g_profile_debug_option = '1' AND TO_NUMBER(g_profile_debug_level) >= 20)
195        OR FND_API.to_Boolean(p_debug_flag)
196     THEN
197 
198        ----------------------------------------------------------------------------------
199        -- Opens Error_Handler debug session, only if Debug session is not already open.
200        -- Suggested by RFAROOK, so that multiple debug sessions are not open PER
201        -- Concurrent Request.
202        ----------------------------------------------------------------------------------
203        IF (Error_Handler.Get_Debug <> 'Y') THEN
204 
205 FND_FILE.put_line(FND_FILE.LOG, G_PKG_NAME || ' Error_Handler.Get_Debug is not Y, calling Open_Debug_Session  ');
206          Open_Debug_Session(p_output_dir => p_output_dir, p_file_name => p_file_name) ;
207        END IF;
208 
209     END IF;
210 
211 EXCEPTION
212     WHEN OTHERS THEN
213          g_debug_errmesg := Substr(To_Char(SQLCODE)||'/'||SQLERRM,1,240);
214          FND_FILE.put_line(FND_FILE.LOG, G_PKG_NAME || ' Check_And_Open_Debug_Session LOGGING SQL ERROR => '||g_debug_errmesg);
215          g_debug_flag := FALSE;
216 END Check_And_Open_Debug_Session;
217 
218 
219 -- Close Debug_Session
220 PROCEDURE Close_Debug_Session
221 IS
222      l_error_mesg      VARCHAR2(2000) ;
223 BEGIN
224     IF utl_file.is_open(g_debug_file)
225     THEN
226       utl_file.fclose(g_debug_file);
227     END IF ;
228 
229 EXCEPTION
230     WHEN OTHERS THEN
231        g_debug_errmesg := Substr(To_Char(SQLCODE)||'/'||SQLERRM,1,240);
232        g_debug_flag := FALSE;
233 
234        l_error_mesg := 'Debug Session could not be closed because the ' ||
235                        Substr(To_Char(SQLCODE)||'/'||SQLERRM,1,240) ;
236 
237        FND_FILE.put_line(FND_FILE.LOG, G_PKG_NAME || '.Close_Debug_Session  LOGGING ERROR => '||l_error_mesg);
238 
239        -- FND_MSG_PUB.Add_Exc_Msg
240        -- (  G_PKG_NAME           ,
241        --   'Close_Debug_Session' ,
242        --   l_error_mesg  ) ;
243        --
244        -- RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
245 
246 END Close_Debug_Session ;
247 
248 -- Test Debug
249 PROCEDURE Write_Debug
250 (  p_debug_message      IN  VARCHAR2 )
251 IS
252      l_error_mesg      VARCHAR2(2000) ;
253 BEGIN
254 
255 
256     -- Sometimes Error_Handler.Write_Debug would not write
257     -- the debug message properly
258     -- So as workaround, I added special developer debug mode here
259     -- to write debug message forcedly
260     IF (TO_NUMBER(g_profile_debug_level) = 999)
261     THEN
262         FND_FILE.put_line(FND_FILE.LOG
263                         , G_PKG_NAME
264                           || '['||TO_CHAR(SYSDATE,'DD-MON-YYYY HH24:MI:SS')||'] '
265                           || p_debug_message
266                          );
267 
268     END IF ;
269 
270     Error_Handler.Write_Debug('['||TO_CHAR(SYSDATE,'DD-MON-YYYY HH24:MI:SS')||'] '|| p_debug_message);
271 
272     /*****
273     IF utl_file.is_open(g_debug_file)
274     THEN
275         utl_file.put_line(g_debug_file, p_debug_message);
276     END IF ;
277     ***/
278 
279 
280 
281 EXCEPTION
282     WHEN OTHERS THEN
283        g_debug_errmesg := Substr(To_Char(SQLCODE)||'/'||SQLERRM,1,240);
284        g_debug_flag := FALSE;
285        l_error_mesg := 'In Debug Mode, Write_Debug procedure faild closed because the ' ||
286                        Substr(To_Char(SQLCODE)||'/'||SQLERRM,1,240) ;
287 
288 
289        FND_FILE.put_line(FND_FILE.LOG, G_PKG_NAME || '.Write_Debug LOGGING ERROR => '||l_error_mesg);
290 
291        --
292        -- FND_MSG_PUB.Add_Exc_Msg
293        -- (  G_PKG_NAME           ,
294        --   'Write_Debug' ,
295        --   l_error_mesg  ) ;
296        --
297        -- RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
298 
299 END Write_Debug;
300 
301 PROCEDURE Get_Debug_Mode
302 (   p_item_type         IN  VARCHAR2
303  ,  p_item_key          IN  VARCHAR2
304  ,  x_debug_flag        OUT NOCOPY BOOLEAN
305  ,  x_output_dir        OUT NOCOPY VARCHAR2
306  ,  x_debug_filename    OUT NOCOPY VARCHAR2
307 )
308 IS
309 
310     l_debug_flag VARCHAR2(1) ;
311     l_error_mesg      VARCHAR2(2000) ;
312 
313 BEGIN
314 
315     -- Get Debug Flag
316     l_debug_flag := WF_ENGINE.GetItemAttrText
317                             (  p_item_type
318                              , p_item_key
319                              , '.DEBUG_FLAG'
320                              );
321 
322     IF FND_API.to_Boolean( l_debug_flag ) THEN
323        x_debug_flag := TRUE ;
324     END IF ;
325 
326 
327     -- Get Debug Output Directory
328     x_output_dir  := WF_ENGINE.GetItemAttrText
329                             (  p_item_type
330                              , p_item_key
331                              , '.DEBUG_OUTPUT_DIR'
332                              );
333 
334 
335     -- Get Debug File Name
336     x_debug_filename := WF_ENGINE.GetItemAttrText
337                             (  p_item_type
338                              , p_item_key
339                              , '.DEBUG_FILE_NAME'
340                              );
341 
342 EXCEPTION
343     WHEN OTHERS THEN
344        g_debug_errmesg := Substr(To_Char(SQLCODE)||'/'||SQLERRM,1,240);
345        g_debug_flag := FALSE;
346 
347        l_error_mesg := 'In Debug Mode, Get_Debug_Mode procedure faild closed because the ' ||
348                        Substr(To_Char(SQLCODE)||'/'||SQLERRM,1,240) ;
349 
350 
351        FND_FILE.put_line(FND_FILE.LOG, G_PKG_NAME || '.Get_Debug_Mode LOGGING ERROR => '||l_error_mesg);
352 
353 
354 END Get_Debug_Mode ;
355 
356 
357 
358 /********************************************************************
359 * API Type      : Local APIs
360 * Purpose       : Those APIs are private
361 *********************************************************************/
362 FUNCTION GetDefaultResponseComment
363  RETURN VARCHAR2
364 IS
365 
366 BEGIN
367 
368     FND_MESSAGE.SET_NAME('ENG', 'ENG_NO_VALUE_SPECIFIED') ;
369     RETURN FND_MESSAGE.GET ;
370 
371 END  GetDefaultResponseComment ;
372 
373 FUNCTION DefaultNoValueFilter( p_text IN VARCHAR2 )
374  RETURN VARCHAR2
375 IS
376 
377     l_default_novalue VARCHAR2(2000) ;
378 
379 BEGIN
380 
381      l_default_novalue := GetDefaultResponseComment ;
382 
383     IF l_default_novalue = p_text THEN
384         return NULL ;
385     ELSE
386         return p_text ;
387     END IF ;
388 
389 END DefaultNoValueFilter ;
390 
391 
392 FUNCTION GetUserRole
393 ( p_user_id      IN   NUMBER)
394  RETURN VARCHAR2
395 IS
396 
397     l_user_name  varchar2(100) ;
398 
399 BEGIN
400 
401     IF p_user_id = G_ACT_SYSTEM_USER_ID THEN
402 
403        -- We are not sure which user role we should return.
404        NULL ;
405 
406     ELSE
407 
408        SELECT user_name
409        INTO   l_user_name
410        FROM   FND_USER
411        WHERE  user_id = p_user_id ;
412 
413     END IF ;
414 
415     RETURN l_user_name ;
416 
417 END  GetUserRole ;
418 
419 
420 FUNCTION GetNewItemKey
421 RETURN VARCHAR2
422 IS
423     l_rev_seq      NUMBER         := NULL;
424     l_new_item_key VARCHAR2(240)  := NULL;
425 BEGIN
426 
427     -- Generate Item Key from ENG_WORKFLOW_REVISION_S.NEXTVAL
428     -- and return the value
429     SELECT ENG_WORKFLOW_REVISION_S.NEXTVAL
430     INTO   l_rev_seq
431     FROM DUAL;
432 
433     l_new_item_key := TO_CHAR(l_rev_seq) ;
434 
435     RETURN l_new_item_key ;
436 
437 END GetNewItemKey ;
438 
439 
440 
441 -- Get Parent Change Id for  Change Line
442 FUNCTION GetParentChangeId
443 (  p_change_line_id IN  NUMBER
444 ) RETURN NUMBER
445 IS
446 
447     l_change_id NUMBER ;
448 
449     CURSOR  c_line  (p_change_line_id NUMBER)
450     IS
451         SELECT change_id
452           FROM ENG_CHANGE_LINES
453          WHERE change_line_id = p_change_line_id ;
454 BEGIN
455 
456     FOR l_rec IN c_line(p_change_line_id => p_change_line_id)
457     LOOP
458         l_change_id :=  l_rec.change_id ;
459 
460     END LOOP ;
461 
462     RETURN l_change_id ;
463 
464 END GetParentChangeId ;
465 
466 
467 FUNCTION GetChangeObjectNotice
468 (  p_change_id        IN  NUMBER)
469  RETURN VARCHAR2
470 IS
471     l_change_notice   VARCHAR2(20) ;
472 
473     CURSOR  c_change  (p_change_id NUMBER)
474     IS
475         SELECT change_notice
476         FROM ENG_ENGINEERING_CHANGES
477         WHERE change_id = p_change_id;
478 
479 BEGIN
480 
481     FOR l_rec IN c_change(p_change_id => p_change_id)
482     LOOP
483         l_change_notice :=  l_rec.change_notice ;
484     END LOOP ;
485 
486     RETURN l_change_notice;
487 
488 END GetChangeObjectNotice ;
489 
490 
491 -- Get Change Line Object Seq No
492 FUNCTION GetChangeLineObjectSequence
493 (  p_change_line_id        IN  NUMBER
494 ) RETURN NUMBER
495 IS
496 
497     x_line_sequence_number   NUMBER;
498 
499     CURSOR  c_line  (p_change_line_id NUMBER)
500     IS
501         SELECT ecl.sequence_number
502         FROM ENG_CHANGE_LINES  ecl
503         WHERE ecl.change_line_id = p_change_line_id ;
504 
505 BEGIN
506 
507     FOR l_rec IN c_line(p_change_line_id => p_change_line_id)
508     LOOP
509         x_line_sequence_number :=  l_rec.sequence_number;
510 
511     END LOOP ;
512 
513     RETURN x_line_sequence_number;
514 
515 END GetChangeLineObjectSequence ;
516 
517 
518 
519 FUNCTION GetItemUserKey
520 (   p_item_type         IN  VARCHAR2
521  ,  p_item_key          IN  VARCHAR2
522  ,  p_change_id         IN  NUMBER    := NULL
523  ,  p_change_line_id    IN  NUMBER    := NULL
524  ,  p_object_name       IN  VARCHAR2  := NULL
525  ,  p_object_id1        IN  NUMBER    := NULL
526  ,  p_object_id2        IN  NUMBER    := NULL
527  ,  p_object_id3        IN  NUMBER    := NULL
528  ,  p_object_id4        IN  NUMBER    := NULL
529  ,  p_object_id5        IN  NUMBER    := NULL
530  ,  p_parent_object_name IN  VARCHAR2  := NULL
531  ,  p_parent_object_id1  IN  NUMBER    := NULL
532 )
533 RETURN VARCHAR2
534 IS
535     l_item_user_key       VARCHAR2(240);
536     l_change_notice       VARCHAR2(20) ;
537     l_change_line_seq_num NUMBER ;
538 
539     l_parent_change_id    NUMBER ;
540 BEGIN
541 
542    IF p_change_id IS NOT NULL AND p_change_id > 0
543    THEN
544 
545        l_change_notice := GetChangeObjectNotice(p_change_id);
546        l_item_user_key := l_change_notice || ':' || TO_CHAR(p_change_id);
547 
548    END IF ;
549 
550    IF p_change_line_id IS NOT NULL AND p_change_line_id > 0
551    THEN
552 
553         l_change_line_seq_num := GetChangeLineObjectSequence(p_change_line_id);
554 
555         IF l_change_notice IS NULL THEN
556            l_parent_change_id := GetParentChangeId(p_change_line_id);
557            l_change_notice := GetChangeObjectNotice(l_parent_change_id);
558         END IF ;
559 
560         l_item_user_key := l_change_notice || ':' || TO_CHAR(l_change_line_seq_num) || ':' || TO_CHAR(p_change_line_id);
561 
562 
563    END IF ;
564 
565    IF l_item_user_key IS NOT NULL THEN
566 
567       l_item_user_key := l_item_user_key || '-' ;
568 
569    END IF ;
570 
571    l_item_user_key := l_item_user_key || p_item_key ;
572 
573    RETURN l_item_user_key ;
574 
575 
576 END GetItemUserKey ;
577 
578 FUNCTION GetWFAdhocRoleName
579 (   p_role_prefix       IN  VARCHAR2
580  ,  p_item_type         IN  VARCHAR2
581  ,  p_item_key          IN  VARCHAR2
582 )
583 RETURN VARCHAR2
584 IS
585     l_adhoc_role_name VARCHAR2(320)  := NULL;
586 
587 BEGIN
588 
589     l_adhoc_role_name := p_role_prefix ||
590                          p_item_type   || '-' ||
591                          p_item_key ;
592 
593    RETURN l_adhoc_role_name ;
594 
595 END GetWFAdhocRoleName ;
596 
597 
598 -- Get Organization Info
599 PROCEDURE GetOrgInfo
600 (  p_organization_id   IN  NUMBER
601  , x_organization_code OUT NOCOPY VARCHAR2
602  , x_organization_name OUT NOCOPY VARCHAR2
603 )
604 IS
605 
606 BEGIN
607 
608    -- in 115.10 org id may be -1
609    IF p_organization_id > 0 THEN
610 
611      SELECT
612        MP.organization_code organization_code,
613        HAOTL.name organization_name
614       INTO    x_organization_code
615             , x_organization_name
616      FROM
617        HR_ALL_ORGANIZATION_UNITS_TL HAOTL,
618        MTL_PARAMETERS MP
619      WHERE
620        HAOTL.organization_id = p_organization_id
621        AND HAOTL.organization_id = MP.ORGANIZATION_ID
622        AND HAOTL.LANGUAGE = USERENV('LANG');
623 
624    END IF ;
625 
626 END GetOrgInfo ;
627 
628 FUNCTION GetPartyType
629 (   p_party_id        IN  NUMBER )
630 RETURN VARCHAR2
631 IS
632     l_party_type VARCHAR2(30)  := NULL;
633 
634 BEGIN
635 
636    SELECT party_type
637    INTO   l_party_type
638    FROM   HZ_PARTIES
639    WHERE party_id = p_party_id ;
640 
641    RETURN l_party_type ;
642 
643 END GetPartyType ;
644 
645 
646 
647 
648 FUNCTION CheckRoleExistence( p_role_name IN VARCHAR2 )
649 RETURN BOOLEAN
650 IS
651 
652 
653     CURSOR c_role (p_role_name VARCHAR2 )
654     IS
655         SELECT 'Role Exists'
656         FROM DUAL
657         WHERE EXISTS ( SELECT null
658                        from WF_LOCAL_ROLES
659                        WHERE NAME = p_role_name
660                        AND ORIG_SYSTEM = 'WF_LOCAL_ROLES'
661                        AND ORIG_SYSTEM_ID = 0
662                       ) ;
663 
664      l_existence BOOLEAN  := FALSE ;
665 
666 BEGIN
667 
668     begin
669 
670        --
671        -- if p_role does not exist, it throws exception
672        -- So we should not write sql to check AdhocRole existence directly
673        -- For safety purpose we just don't care about this execption
674        WF_DIRECTORY.SetAdHocRoleStatus( role_name => p_role_name
675                                       , status => 'ACTIVE') ;
676 
677        -- l_existence := TRUE ;
678        -- OWF.G Bug3490260
679        -- Added additoinal check because WF_DIRECTORY.SetAdHocRoleStatus
680        -- does not raise exception correctly
681        -- Once the bug is fixed need to remove
682        FOR l_rec IN  c_role(p_role_name => p_role_name)
683        LOOP
684 
685          l_existence := TRUE ;
686 
687        END LOOP ;
688 
689     exception
690         when others then
691             null ;
692 
693     end ;
694 
695     RETURN l_existence ;
696 
697 END CheckRoleExistence ;
698 
699 
700 
701 PROCEDURE DeleteRoleAndUsers
702 (   p_role_name         IN  VARCHAR2)
703 IS
704 
705 
706 BEGIN
707 
708 
709     /* This might NOT be following standard
710     -- Deleting these adhoc role and user roles
711     -- should be done by WF Purge Program
712     -- Instead of this, Set Adhoc Role Expiration
713     -- using WF API. Then once user run WF Purge progam
714     -- deleting these role and user roles is taken care of.
715 
716     -- DELETE FROM wf_local_roles
717     -- WHERE  name = p_role_name ;
718 
719     -- DELETE FROM wf_local_user_roles
720     -- WHERE  role_name = p_role_name ;
721     */
722 
723     begin
724 
725        --
726        -- if p_role does not exist, it throws exception
727        -- since we don't have workflow pre-req in plm115.9
728        -- we are not sure whether the customer have applied/will apply
729        -- OWF.G patchset
730        -- So we can not write correct sql to check AdhocRole existence
731        -- before calling SetAdhocRoleExpiration
732        -- For safety purpose we just don't care about this execption
733        --
734        WF_DIRECTORY.SetAdhocRoleExpiration
735        ( role_name => p_role_name
736        , expiration_date => SYSDATE) ;
737 
738     exception
739        when others then
740            null ;
741     end ;
742 
743 
744 END DeleteRoleAndUsers ;
745 
746 -------------------------------------------------------------------
747 -- WF Directory related OBSOLETE APIs for Bug4532263
748 -- Replaced with new APIs with post_fix 2
749 -- Keep APIs here for any customization
750 -------------------------------------------------------------------
751 -- Set User to Role Users
752 PROCEDURE SetUserToRoleUsers
753 (  p_party_id    IN  NUMBER
754  , x_role_users  IN  OUT NOCOPY VARCHAR2
755 )
756 IS
757 
758     l_user_role VARCHAR2(320) ;
759 
760     CURSOR c_party  (p_party_id NUMBER)
761     IS
762         SELECT EngSecPeople.user_name user_role
763         FROM   ENG_SECURITY_PEOPLE_V EngSecPeople
764         WHERE  EngSecPeople.person_id =  p_party_id ;
765 
766 BEGIN
767 
768 
769     FOR person_rec IN c_party(p_party_id => p_party_id)
770     LOOP
771 
772         l_user_role := person_rec.user_role ;
773 
774         IF (WF_DIRECTORY.UserActive(l_user_role ))
775         THEN
776 
777             -- Prevent duplicate user
778             IF  x_role_users IS NULL OR
779                ( INSTR(x_role_users || ','  , l_user_role || ',' ) = 0 )
780             THEN
781 
782                 IF (x_role_users IS NOT NULL) THEN
783                     x_role_users := x_role_users || ',';
784                 END IF;
785 
786                 x_role_users := x_role_users || l_user_role ;
787 
788             END IF ;
789 
790         END IF ;
791 
792     END LOOP ;
793 
794 EXCEPTION
795    WHEN NO_DATA_FOUND THEN
796         null ;
797 
798 END SetUserToRoleUsers ;
799 
800 
801 -- Set AppsUser to Role Users
802 PROCEDURE SetAppsUserToRoleUsers
803 (  p_user_id     IN  NUMBER
804  , x_role_users  IN OUT NOCOPY  VARCHAR2
805 )
806 IS
807 
808     l_user_role VARCHAR2(320) ;
809 
810 BEGIN
811 
812     l_user_role := GetUserRole(p_user_id => p_user_id ) ;
813 
814     IF (WF_DIRECTORY.UserActive(l_user_role ))
815     THEN
816 
817         -- Prevent duplicate user
818         IF  x_role_users IS NULL OR
819            ( INSTR(x_role_users || ','  , l_user_role || ',' ) = 0 )
820         THEN
821 
822 
823             IF (x_role_users IS NOT NULL) THEN
824                 x_role_users := x_role_users || ',';
825             END IF;
826 
827             x_role_users := x_role_users || l_user_role ;
828 
829         END IF ;
830 
831     END IF ;
832 
833 END SetAppsUserToRoleUsers ;
834 
835 
836 -- Set User to Role Users
837 PROCEDURE SetGroupToRoleUsers
838 (  p_group_id    IN NUMBER
839  , x_role_users  IN OUT NOCOPY  VARCHAR2
840 )
841 IS
842 
843     --
844     -- CURSOR c_grp_members  (p_group_id NUMBER)
845     -- IS
846     --   SELECT member.user_name user_role
847     --   FROM   EGO_PEOPLE_V member
848     --        , HZ_RELATIONSHIPS member_group
849     --        , HZ_PARTIES grp
850     --   WHERE member_group.object_id = grp.party_id
851     --   AND member_group.subject_id = member.person_id
852     --   AND member_group.subject_type = 'PERSON'
853     --   AND member_group.object_type = 'GROUP'
854     --   AND member_group.relationship_type = 'MEMBERSHIP'
855     --   AND member_group.status = 'A'
856     --   AND member_group.start_date <= SYSDATE
857     --   AND (member_group.end_date IS NULL OR member_group.end_date >= SYSDATE)
858     --   AND grp.party_id = p_group_id ;
859     --
860 
861     -- Replaced above sql to use ENG_SECURITY_GROUP_MEMBERS_V
862     CURSOR c_grp_members  (p_group_id NUMBER)
863     IS
864        SELECT member.member_user_name user_role
865        FROM   ENG_SECURITY_GROUP_MEMBERS_V member
866        WHERE  member.group_id = p_group_id  ;
867 
868 
869 BEGIN
870 
871     FOR grp_member_rec in c_grp_members (p_group_id => p_group_id )
872     LOOP
873 
874         IF (WF_DIRECTORY.UserActive(grp_member_rec.user_role ))
875         THEN
876 
877             -- Prevent duplicate user
878             IF  x_role_users IS NULL OR
879                ( INSTR(x_role_users || ','  , grp_member_rec.user_role || ',' ) = 0 )
880             THEN
881 
882                 IF (x_role_users IS NOT NULL) THEN
883                     x_role_users := x_role_users || ',';
884                 END IF;
885 
886                 x_role_users := x_role_users || grp_member_rec.user_role ;
887 
888             END IF ;
889 
890         END IF ;
891 
892     END LOOP ;
893 
894 END SetGroupToRoleUsers ;
895 
896 -- Set Assignee to Role Users
897 PROCEDURE SetAssigneeToRoleUsers
898 (  p_assignee_party_id    IN NUMBER
899  , x_role_users           IN OUT NOCOPY VARCHAR2
900 )
901 IS
902     l_party_type          VARCHAR2(30) ;
903 
904 BEGIN
905 
906     IF p_assignee_party_id IS NOT NULL  THEN
907 
908         l_party_type  := GetPartyType(p_party_id => p_assignee_party_id ) ;
909 
910         IF l_party_type = 'PERSON' THEN
911 
912             SetUserToRoleUsers( p_party_id   => p_assignee_party_id
913                               , x_role_users => x_role_users
914                               ) ;
915 
916         ELSIF l_party_type = 'GROUP' THEN
917 
918             SetGroupToRoleUsers( p_group_id   => p_assignee_party_id
919                                , x_role_users => x_role_users
920                                ) ;
921 
922         END IF ;
923 
924     END IF ; -- if p_assignee_party_id is not null
925 
926 END SetAssigneeToRoleUsers ;
927 
928 
929 
930 
931 -- Set Creator to Role Users
932 PROCEDURE SetCreatorToRoleUsers
933 (  p_creator_user_id      IN NUMBER
934  , x_role_users           IN OUT NOCOPY VARCHAR2
935 )
936 IS
937     l_party_type          VARCHAR2(30) ;
938 
939 BEGIN
940 
941     IF p_creator_user_id IS NOT NULL  THEN
942 
943 
944         SetAppsUserToRoleUsers( p_user_id    => p_creator_user_id
945                               , x_role_users => x_role_users
946                               ) ;
947 
948     END IF ; -- if p_creator_user_id is not null
949 
950 END SetCreatorToRoleUsers ;
951 
952 
953 -- Set Requestor to Role Users
954 PROCEDURE SetRequestorToRoleUsers
955 (  p_requestor_party_id IN NUMBER
956  , x_role_users         IN OUT NOCOPY VARCHAR2
957 )
958 IS
959     l_party_type          VARCHAR2(30) ;
960 
961 BEGIN
962 
963     IF p_requestor_party_id IS NOT NULL  THEN
964 
965         l_party_type  := GetPartyType(p_party_id => p_requestor_party_id ) ;
966 
967         IF l_party_type = 'PERSON' THEN
968 
969             SetUserToRoleUsers( p_party_id   => p_requestor_party_id
970                               , x_role_users => x_role_users
971                               ) ;
972 
973         ELSIF l_party_type = 'GROUP' THEN
974 
975             SetGroupToRoleUsers( p_group_id   => p_requestor_party_id
976                                , x_role_users => x_role_users
977                                ) ;
978 
979         END IF ;
980 
981     END IF ; -- if p_requestor_party_id is not null
982 
983 END SetRequestorToRoleUsers ;
984 
985 -- Set Step People to Role Users
986 PROCEDURE SetRoutePeopleToRoleUsers
987 (  p_route_id IN NUMBER
988  , x_role_users    IN OUT NOCOPY VARCHAR2
989 )
990 IS
991 
992     l_user_role VARCHAR2(320) ;
993 
994 
995     CURSOR c_route_people (p_route_id NUMBER)
996     IS
997         SELECT EngSecPeople.user_name user_role
998         FROM   ENG_SECURITY_PEOPLE_V EngSecPeople
999              , ENG_CHANGE_ROUTE_PEOPLE step_people
1000              , ENG_CHANGE_ROUTE_STEPS  step
1001         WHERE  EngSecPeople.person_id =  step_people.assignee_id
1002         AND    step_people.assignee_type_code = Eng_Workflow_Util.G_PERSON
1003         AND    step_people.assignee_id <> -1
1004         AND    step_people.step_id = step.step_id
1005         AND    step.step_status_code <> Eng_Workflow_Util.G_RT_NOT_STARTED
1006         AND    step.step_start_date   IS NOT NULL
1007         AND    step.route_id  = p_route_id ;
1008 
1009 BEGIN
1010 
1011 
1012     FOR l_rec in c_route_people (p_route_id => p_route_id)
1013     LOOP
1014 
1015         IF (WF_DIRECTORY.UserActive(l_rec.user_role ))
1016         THEN
1017 
1018             -- Prevent duplicate user
1019             IF  x_role_users IS NULL OR
1020                ( INSTR(x_role_users || ','  , l_rec.user_role || ',' ) = 0 )
1021             THEN
1022 
1023                 IF (x_role_users IS NOT NULL) THEN
1024                     x_role_users := x_role_users || ',';
1025                 END IF;
1026 
1027                 x_role_users := x_role_users || l_rec.user_role ;
1028 
1029             END IF ;
1030 
1031         END IF ;
1032 
1033     END LOOP ;
1034 
1035 END SetRoutePeopleToRoleUsers ;
1036 
1037 
1038 -- Set Step People to Role Users
1039 PROCEDURE SetStepPeopleToRoleUsers
1040 (  p_route_step_id IN NUMBER
1041  , x_role_users    IN OUT NOCOPY VARCHAR2
1042 )
1043 IS
1044 
1045     l_user_role VARCHAR2(320) ;
1046 
1047 
1048     -- In case of Instance Route, Assignee Id is always person's party id
1049     CURSOR c_step_people (p_route_step_id NUMBER)
1050     IS
1051         SELECT EngSecPeople.user_name user_role
1052         FROM   ENG_SECURITY_PEOPLE_V EngSecPeople
1053              , ENG_CHANGE_ROUTE_PEOPLE step_people
1054         WHERE  EngSecPeople.person_id =  step_people.assignee_id
1055         AND    step_people.assignee_id <> -1
1056         AND    step_people.assignee_type_code = Eng_Workflow_Util.G_PERSON
1057         AND    step_people.step_id = p_route_step_id
1058         AND    ( step_people.response_code IS NULL
1059                  OR step_people.response_code = Eng_Workflow_Util.G_RT_SUBMITTED
1060                  OR step_people.response_code = Eng_Workflow_Util.G_RT_NOT_RECEIVED
1061                 ) ;
1062 
1063 
1064 BEGIN
1065 
1066 
1067     FOR l_rec in c_step_people (p_route_step_id => p_route_step_id)
1068     LOOP
1069 
1070         IF (WF_DIRECTORY.UserActive(l_rec.user_role ))
1071         THEN
1072 
1073             -- Prevent duplicate user
1074             IF  x_role_users IS NULL OR
1075                ( INSTR(x_role_users || ','  , l_rec.user_role || ',' ) = 0 )
1076             THEN
1077 
1078                 IF (x_role_users IS NOT NULL) THEN
1079                     x_role_users := x_role_users || ',';
1080                 END IF;
1081 
1082                 x_role_users := x_role_users || l_rec.user_role ;
1083 
1084             END IF ;
1085 
1086         END IF ;
1087 
1088     END LOOP ;
1089 
1090 END SetStepPeopleToRoleUsers ;
1091 
1092 
1093 
1094 PROCEDURE SetWFAdhocRole (p_role_name           IN OUT NOCOPY VARCHAR2,
1095                           p_role_display_name   IN OUT NOCOPY VARCHAR2,
1096                           p_role_users          IN VARCHAR2 DEFAULT NULL,
1097                           p_expiration_date     IN DATE DEFAULT SYSDATE)
1098 IS
1099 
1100 BEGIN
1101 
1102     -- Check if the Role already exists
1103     IF CheckRoleExistence(p_role_name => p_role_name )  THEN
1104 
1105         -- Replacing existing Users in this Adhoc Role
1106         WF_DIRECTORY.RemoveUsersFromAdhocRole
1107         ( role_name  => p_role_name
1108         , role_users => NULL ) ;
1109 
1110 
1111         WF_DIRECTORY.AddUsersToAdhocRole
1112         ( role_name  => p_role_name
1113         , role_users => p_role_users ) ;
1114 
1115 
1116     ELSE
1117 
1118         WF_DIRECTORY.CreateAdHocRole( role_name         => p_role_name
1119                                     , role_display_name => p_role_display_name
1120                                     , role_users        => p_role_users
1121                                     , expiration_date   => p_expiration_date
1122                                     );
1123     END IF;
1124 
1125 
1126 
1127     -- The following is Original Logic
1128     -- We changed this logic
1129     -- because of DeleteRoleAndUsers change
1130         -- Check if the Role already exists
1131         -- IF CheckRoleExistence(p_role_name => l_role_name )  THEN
1132 
1133             -- if exists, delete it for duplicate role error.
1134             -- DeleteRoleAndUsers
1135             -- (  p_role_name  => l_role_name);
1136 
1137         -- END IF;
1138         --
1139         -- WF_DIRECTORY.CreateAdHocRole( role_name         => l_role_name
1140         --                             , role_display_name => l_role_name
1141         --                             , role_users        => l_role_users
1142         --                             , expiration_date   => NULL
1143         --                             );
1144 
1145 
1146 END SetWFAdhocRole ;
1147 
1148 -------------------------------------------------------------------
1149 -- WF Directory related OBSOLETE APIs for Bug4532263
1150 -- End of WF Directory related OBSOLETE APIs for Bug4532263
1151 -------------------------------------------------------------------
1152 
1153 
1154 -------------------------------------------------------------------
1155 -- New WF Directory related APIs for CM Bug4532263
1156 -------------------------------------------------------------------
1157 
1158 -- Add Role to WF_DIRECTORY.UserTable
1159 PROCEDURE AddRoleToRoleUserTable
1160 (  p_role_name    IN  VARCHAR2
1161  , x_role_users   IN  OUT NOCOPY WF_DIRECTORY.UserTable
1162 )
1163 IS
1164    l_index NUMBER ;
1165    l_dup_flag BOOLEAN ;
1166    l_new_index NUMBER ;
1167 
1168 BEGIN
1169 
1170 
1171 IF g_debug_flag THEN
1172    Write_Debug('AddRoleToRoleUserTable:  ' || p_role_name );
1173 END IF ;
1174 
1175 
1176     -- First, check the user role is Active
1177     IF (WF_DIRECTORY.UserActive(p_role_name))
1178     THEN
1179 
1180 IF g_debug_flag THEN
1181    Write_Debug('After WF_DIRECTORY.UserActive:  ' || p_role_name );
1182 END IF ;
1183 
1184         l_dup_flag := FALSE ;
1185         l_new_index := 0 ;
1186 
1187         -- Second, check the user role is duplicate
1188         IF (x_role_users IS NOT NULL AND x_role_users.COUNT > 0)
1189         THEN
1190 
1191 IF g_debug_flag THEN
1192    Write_Debug('x_role_users IS NOT NULL AND x_role_users.COUNT > 0 .. . ' );
1193    Write_Debug('x_role_users.COUNT ' || to_char(x_role_users.COUNT) );
1194    Write_Debug('x_role_users.FIRST ' || to_char(x_role_users.FIRST) );
1195    Write_Debug('x_role_users.LAST ' || to_char(x_role_users.LAST) );
1196 END IF ;
1197 
1198             l_index := x_role_users.FIRST;
1199             l_new_index := x_role_users.LAST + 1;
1200 
1201             WHILE (l_index IS NOT NULL AND NOT l_dup_flag )
1202             LOOP
1203 
1204 IF g_debug_flag THEN
1205    Write_Debug('x_role_users: Index ' || to_char(l_index) ||  '=' || x_role_users(l_index)  );
1206 END IF ;
1207 
1208                 IF p_role_name = x_role_users(l_index)
1209                 THEN
1210                     l_dup_flag := TRUE ;
1211                 END IF ;
1212                 l_index := x_role_users.NEXT(l_index);
1213             END LOOP ;
1214 
1215         END IF ;
1216 
1217 
1218         IF NOT l_dup_flag
1219         THEN
1220 IF g_debug_flag THEN
1221    Write_Debug('Duplicate Check is OK  ' );
1222    Write_Debug('New Index ' || to_char(l_new_index) );
1223 END IF ;
1224             x_role_users(l_new_index) := p_role_name ;
1225 
1226         END IF ;
1227 
1228     END IF ;
1229 
1230 END AddRoleToRoleUserTable ;
1231 
1232 -- Set User to Role Users2
1233 PROCEDURE SetUserToRoleUsers2
1234 (  p_party_id    IN  NUMBER
1235  , x_role_users  IN  OUT NOCOPY WF_DIRECTORY.UserTable
1236 )
1237 IS
1238 
1239     l_user_role VARCHAR2(320) ;
1240 
1241     CURSOR c_party  (p_party_id NUMBER)
1242     IS
1243         SELECT EngSecPeople.user_name user_role
1244         FROM   ENG_SECURITY_PEOPLE_V EngSecPeople
1245         WHERE  EngSecPeople.person_id =  p_party_id ;
1246 
1247 BEGIN
1248 
1249     FOR person_rec IN c_party(p_party_id => p_party_id)
1250     LOOP
1251         l_user_role := person_rec.user_role ;
1252         AddRoleToRoleUserTable(l_user_role, x_role_users) ;
1253     END LOOP ;
1254 
1255 EXCEPTION
1256    WHEN NO_DATA_FOUND THEN
1257         null ;
1258 
1259 END SetUserToRoleUsers2 ;
1260 
1261 
1262 -- Set AppsUser to Role Users
1263 PROCEDURE SetAppsUserToRoleUsers2
1264 (  p_user_id     IN  NUMBER
1265  , x_role_users  IN OUT NOCOPY  WF_DIRECTORY.UserTable
1266 )
1267 IS
1268 
1269     l_user_role VARCHAR2(320) ;
1270 
1271 BEGIN
1272 
1273     l_user_role := GetUserRole(p_user_id => p_user_id ) ;
1274     AddRoleToRoleUserTable(l_user_role, x_role_users) ;
1275 
1276 END SetAppsUserToRoleUsers2 ;
1277 
1278 
1279 -- Set User to Role Users
1280 PROCEDURE SetGroupToRoleUsers2
1281 (  p_group_id    IN NUMBER
1282  , x_role_users  IN OUT NOCOPY  WF_DIRECTORY.UserTable
1283 )
1284 IS
1285     CURSOR c_grp_members  (p_group_id NUMBER)
1286     IS
1287        SELECT member.member_user_name user_role
1288        FROM   ENG_SECURITY_GROUP_MEMBERS_V member
1289        WHERE  member.group_id = p_group_id  ;
1290 
1291 
1292 BEGIN
1293 
1294     FOR grp_member_rec in c_grp_members (p_group_id => p_group_id )
1295     LOOP
1296         AddRoleToRoleUserTable(grp_member_rec.user_role, x_role_users) ;
1297     END LOOP ;
1298 
1299 END SetGroupToRoleUsers2 ;
1300 
1301 
1302 -- Set Assignee to Role Users
1303 PROCEDURE SetAssigneeToRoleUsers2
1304 (  p_assignee_party_id    IN NUMBER
1305  , x_role_users           IN OUT NOCOPY WF_DIRECTORY.UserTable
1306 )
1307 IS
1308     l_party_type          VARCHAR2(30) ;
1309 
1310 BEGIN
1311 
1312     IF p_assignee_party_id IS NOT NULL  THEN
1313 
1314         l_party_type  := GetPartyType(p_party_id => p_assignee_party_id ) ;
1315 
1316         IF l_party_type = 'PERSON' THEN
1317 
1318             SetUserToRoleUsers2( p_party_id   => p_assignee_party_id
1319                               , x_role_users => x_role_users
1320                               ) ;
1321 
1322         ELSIF l_party_type = 'GROUP' THEN
1323 
1324             SetGroupToRoleUsers2( p_group_id   => p_assignee_party_id
1325                                , x_role_users => x_role_users
1326                                ) ;
1327 
1328         END IF ;
1329 
1330     END IF ; -- if p_assignee_party_id is not null
1331 
1332 END SetAssigneeToRoleUsers2 ;
1333 
1334 
1335 -- Set Creator to Role Users2
1336 PROCEDURE SetCreatorToRoleUsers2
1337 (  p_creator_user_id      IN NUMBER
1338  , x_role_users           IN  OUT NOCOPY WF_DIRECTORY.UserTable
1339 )
1340 IS
1341     l_party_type          VARCHAR2(30) ;
1342 
1343 BEGIN
1344 
1345     IF p_creator_user_id IS NOT NULL  THEN
1346 
1347 
1348         SetAppsUserToRoleUsers2( p_user_id    => p_creator_user_id
1349                               , x_role_users => x_role_users
1350                               ) ;
1351 
1352     END IF ; -- if p_creator_user_id is not null
1353 
1354 END SetCreatorToRoleUsers2 ;
1355 
1356 
1357 -- Set Requestor to Role Users2
1358 PROCEDURE SetRequestorToRoleUsers2
1359 (  p_requestor_party_id IN NUMBER
1360  , x_role_users           IN  OUT NOCOPY WF_DIRECTORY.UserTable
1361 )
1362 IS
1363     l_party_type          VARCHAR2(30) ;
1364 
1365 BEGIN
1366 
1367     IF p_requestor_party_id IS NOT NULL  THEN
1368 
1369         l_party_type  := GetPartyType(p_party_id => p_requestor_party_id ) ;
1370 
1371         IF l_party_type = 'PERSON' THEN
1372 
1373             SetUserToRoleUsers2( p_party_id   => p_requestor_party_id
1374                               , x_role_users => x_role_users
1375                               ) ;
1376 
1377         ELSIF l_party_type = 'GROUP' THEN
1378 
1379             SetGroupToRoleUsers2( p_group_id   => p_requestor_party_id
1380                                , x_role_users => x_role_users
1381                                ) ;
1382 
1383         END IF ;
1384 
1385     END IF ; -- if p_requestor_party_id is not null
1386 
1387 END SetRequestorToRoleUsers2 ;
1388 
1389 -- Set Step People to Role Users2
1390 PROCEDURE SetRoutePeopleToRoleUsers2
1391 (  p_route_id             IN NUMBER
1392  , x_role_users           IN  OUT NOCOPY WF_DIRECTORY.UserTable
1393 )
1394 IS
1395 
1396     l_user_role VARCHAR2(320) ;
1397 
1398     CURSOR c_route_people (p_route_id NUMBER)
1399     IS
1400         SELECT EngSecPeople.user_name user_role
1401         FROM   ENG_SECURITY_PEOPLE_V EngSecPeople
1402              , ENG_CHANGE_ROUTE_PEOPLE step_people
1403              , ENG_CHANGE_ROUTE_STEPS  step
1404         WHERE  EngSecPeople.person_id =  step_people.assignee_id
1405         AND    step_people.assignee_type_code = Eng_Workflow_Util.G_PERSON
1406         AND    step_people.assignee_id <> -1
1407         AND    step_people.step_id = step.step_id
1408         AND    step.step_status_code <> Eng_Workflow_Util.G_RT_NOT_STARTED
1409         AND    step.step_start_date   IS NOT NULL
1410         AND    step.route_id  = p_route_id ;
1411 
1412 BEGIN
1413 
1414 
1415     FOR l_rec in c_route_people (p_route_id => p_route_id)
1416     LOOP
1417         AddRoleToRoleUserTable(l_rec.user_role, x_role_users) ;
1418     END LOOP ;
1419 
1420 END SetRoutePeopleToRoleUsers2 ;
1421 
1422 
1423 -- Set Step People to Role Users2
1424 PROCEDURE SetStepPeopleToRoleUsers2
1425 (  p_route_step_id IN NUMBER
1426  , x_role_users    IN  OUT NOCOPY WF_DIRECTORY.UserTable
1427 )
1428 IS
1429 
1430     l_user_role VARCHAR2(320) ;
1431 
1432 
1433     -- In case of Instance Route, Assignee Id is always person's party id
1434     CURSOR c_step_people (p_route_step_id NUMBER)
1435     IS
1436         SELECT EngSecPeople.user_name user_role
1437         FROM   ENG_SECURITY_PEOPLE_V EngSecPeople
1438              , ENG_CHANGE_ROUTE_PEOPLE step_people
1439         WHERE  EngSecPeople.person_id =  step_people.assignee_id
1440         AND    step_people.assignee_id <> -1
1441         AND    step_people.assignee_type_code = Eng_Workflow_Util.G_PERSON
1442         AND    step_people.step_id = p_route_step_id
1443         AND    ( step_people.response_code IS NULL
1444                  OR step_people.response_code = Eng_Workflow_Util.G_RT_SUBMITTED
1445                  OR step_people.response_code = Eng_Workflow_Util.G_RT_NOT_RECEIVED
1446                 ) ;
1447 
1448 BEGIN
1449 
1450 
1451     FOR l_rec in c_step_people (p_route_step_id => p_route_step_id)
1452     LOOP
1453         AddRoleToRoleUserTable(l_rec.user_role, x_role_users) ;
1454 
1455     END LOOP ;
1456 
1457 END SetStepPeopleToRoleUsers2 ;
1458 
1459 
1460 -- Bug4532263
1461 --
1462 -- 4258267 9.2.0.5.0 MAILER 11.5.10 PRODID-174 PORTID-110 3623217
1463 -- Abstract: UNABLE TO SEND NOTIFICATION FOR USER WHOSE NAME HAS SPACES
1464 -- Need to call CreateAdHocRole2 which accepts
1465 -- WF_DIRECTORY.UserTable as role_users.
1466 -- WF base bug3623217 of wf bug4258267:
1467 --
1468 PROCEDURE SetWFAdhocRole2 (p_role_name           IN OUT NOCOPY VARCHAR2,
1469                            p_role_display_name   IN OUT NOCOPY VARCHAR2,
1470                            p_role_users          IN WF_DIRECTORY.UserTable,
1471                            p_expiration_date     IN DATE DEFAULT SYSDATE)
1472 IS
1473 
1474 BEGIN
1475 
1476     -- Check if the Role already exists
1477     IF CheckRoleExistence(p_role_name => p_role_name )  THEN
1478 
1479         -- Replacing existing Users in this Adhoc Role
1480         WF_DIRECTORY.RemoveUsersFromAdhocRole
1481         ( role_name  => p_role_name
1482         , role_users => NULL ) ;
1483 
1484 
1485         --
1486         -- WF_DIRECTORY.AddUsersToAdHocRole2(role_name         in varchar2,
1487         --                      role_users        in WF_DIRECTORY.UserTable);
1488         WF_DIRECTORY.AddUsersToAdhocRole2
1489         ( role_name  => p_role_name
1490         , role_users => p_role_users ) ;
1491 
1492 
1493     ELSE
1494         --    WF_DIRECTORY.CreateAdHocRole2(role_name          in out nocopy varchar2,
1495         --                role_display_name       in out nocopy  varchar2,
1496         --                language                in  varchar2 default null,
1497         --                territory               in  varchar2 default null,
1498         --                role_description        in  varchar2 default null,
1499         --                notification_preference in  varchar2 default 'MAILHTML',
1500         --                role_users              in  WF_DIRECTORY.UserTable,
1501         --                email_address           in  varchar2 default null,
1502         --                fax                     in  varchar2 default null,
1503         --                status                  in  varchar2 default 'ACTIVE',
1504         --                expiration_date         in  date default null,
1505         --                parent_orig_system      in  varchar2 default null,
1506         --                parent_orig_system_id   in  number default null,
1507         --                owner_tag               in  varchar2 default null);
1508 
1509         WF_DIRECTORY.CreateAdHocRole2( role_name         => p_role_name
1510                                      , role_display_name => p_role_display_name
1511                                      , role_users        => p_role_users
1512                                      , expiration_date   => p_expiration_date
1513                                      );
1514     END IF;
1515 
1516 END SetWFAdhocRole2 ;
1517 
1518 -------------------------------------------------------------------
1519 -- End of New WF Directory related APIs for CM Bug4532263
1520 -------------------------------------------------------------------
1521 
1522 
1523 
1524 -- Get Change Object (FND Object) Name
1525 FUNCTION GetChangeObjectName
1526 (  p_change_id        IN  NUMBER)
1527  RETURN VARCHAR2
1528 IS
1529 
1530 BEGIN
1531 
1532     RETURN G_ENG_CHANGE ;
1533 
1534 END GetChangeObjectName ;
1535 
1536 
1537 -- Get Change Line Object (FND Object) Name
1538 FUNCTION GetChangeLineObjectName
1539 (  p_change_line_id        IN  NUMBER)
1540  RETURN VARCHAR2
1541 IS
1542 
1543 BEGIN
1544 
1545     RETURN G_ENG_CHANGE_LINE ;
1546 
1547 END GetChangeLineObjectName ;
1548 
1549 
1550 
1551 -- Get Change Object Party
1552 PROCEDURE GetChangeObjectParty
1553 (  p_change_id               IN  NUMBER
1554  , x_assignee_party_id       OUT NOCOPY NUMBER
1555  , x_requestor_party_id      OUT NOCOPY NUMBER
1556  , x_creator_user_id         OUT NOCOPY NUMBER
1557 )
1558 IS
1559 
1560 BEGIN
1561 
1562     SELECT eec.assignee_id
1563          , eec.requestor_id
1564          , eec.created_by
1565       INTO x_assignee_party_id
1566          , x_requestor_party_id
1567          , x_creator_user_id
1568       FROM ENG_ENGINEERING_CHANGES    eec
1569      WHERE eec.change_id = p_change_id ;
1570 
1571 END GetChangeObjectParty ;
1572 
1573 
1574 -- Get Change Line Object Party
1575 PROCEDURE GetChangeLineObjectParty
1576 (  p_change_line_id          IN  NUMBER
1577  , x_assignee_party_id       OUT NOCOPY NUMBER
1578  , x_creator_user_id         OUT NOCOPY NUMBER
1579 )
1580 IS
1581 
1582 BEGIN
1583 
1584     SELECT ecl.assignee_id
1585          , ecl.created_by
1586       INTO x_assignee_party_id
1587          , x_creator_user_id
1588       FROM ENG_CHANGE_LINES ecl
1589      WHERE ecl.change_line_id = p_change_line_id ;
1590 
1591 END GetChangeLineObjectParty ;
1592 
1593 
1594 -- Get Change Object Party
1595 PROCEDURE GetChangeCurrentRev
1596 (  p_change_id               IN  NUMBER
1597  , x_revision                OUT NOCOPY VARCHAR2
1598 )
1599 IS
1600 
1601 
1602     -- Added turnc for end_date condition
1603     -- requested by Revisino Entity
1604     CURSOR c_rev(p_change_id NUMBER)
1605     IS
1606           SELECT revision_id
1607                , revision
1608           FROM   ENG_CHANGE_ORDER_REVISIONS
1609           WHERE  start_date <= SYSDATE
1610           AND    (end_date >= TRUNC(SYSDATE) OR end_date IS NULL)
1611           AND    change_id = p_change_id
1612           ORDER BY revision  ;
1613 
1614 BEGIN
1615 
1616 
1617     FOR rev_rec IN c_rev(p_change_id => p_change_id)
1618     LOOP
1619 
1620         x_revision := rev_rec.revision ;
1621 
1622     END LOOP ;
1623 
1624 END GetChangeCurrentRev;
1625 
1626 
1627 PROCEDURE GetAttachmentChangeDetails
1628 (  p_change_id               IN  NUMBER
1629  , x_source_media_id_tbl       OUT NOCOPY FND_TABLE_OF_NUMBER
1630  , x_attached_document_id_tbl  OUT NOCOPY FND_TABLE_OF_NUMBER
1631  , x_repository_id_tbl         OUT NOCOPY FND_TABLE_OF_NUMBER
1632  , x_creator_user_id           OUT NOCOPY NUMBER
1633 )
1634 IS
1635 CURSOR doc_details(p_change_id NUMBER)
1636 is
1637 SELECT ATTACHMENT_ID
1638          , SOURCE_MEDIA_ID
1639          , REPOSITORY_ID
1640          , CREATED_BY
1641       FROM ENG_ATTACHMENT_CHANGES    eec
1642      WHERE eec.change_id = p_change_id ;
1643 l_index  NUMBER :=0;
1644 
1645 BEGIN
1646    x_attached_document_id_tbl := new  FND_TABLE_OF_NUMBER();
1647    x_source_media_id_tbl := new  FND_TABLE_OF_NUMBER();
1648    x_repository_id_tbl := new  FND_TABLE_OF_NUMBER();
1649    for doc_detail in doc_details( p_change_id)
1650    loop
1651           l_index := l_index + 1;
1652           x_attached_document_id_tbl.EXTEND ;
1653           x_attached_document_id_tbl(l_index) := doc_detail.ATTACHMENT_ID ;
1654 
1655           x_source_media_id_tbl.EXTEND ;
1656           x_source_media_id_tbl(l_index) := doc_detail.SOURCE_MEDIA_ID ;
1657 
1658           x_repository_id_tbl.EXTEND ;
1659           x_repository_id_tbl(l_index) := doc_detail.REPOSITORY_ID ;
1660           if ( x_creator_user_id is null) then
1661            x_creator_user_id:= doc_detail.CREATED_BY ;
1662           end if;
1663    end loop;
1664 
1665 END GetAttachmentChangeDetails ;
1666 
1667 /*
1668 -- OBSOLETE in 115.10
1669 -- Get Change Object Child Enable Flags
1670 PROCEDURE GetEnableChildFlags
1671 (  p_change_id               IN  NUMBER
1672  , x_enable_rev_items_flag   OUT NOCOPY VARCHAR2
1673  , x_enable_tasks_flag       OUT NOCOPY VARCHAR2
1674 )
1675 IS
1676     CURSOR c_change(p_change_id NUMBER)
1677     IS
1678           -- Modified sql for 115.10 case change, also need additional changes
1679            SELECT 'Y' AS enable_rev_items_flag -- ecmt.enable_rev_items_flag
1680                 , 'Y' AS enable_tasks_flag  -- ecmt.enable_tasks_flag
1681            FROM   ENG_CHANGE_MGMT_TYPES   ecmt,
1682                   ENG_ENGINEERING_CHANGES eec
1683            WHERE ecmt.change_mgmt_type_code = eec.change_mgmt_type_code
1684             AND   eec.change_id       = p_change_id ;
1685 
1686           -- SELECT 'Y' AS enable_rev_items_flag -- ecmt.enable_rev_items_flag
1687           --     , 'Y' AS enable_tasks_flag     -- ecmt.enable_tasks_flag
1688           -- FROM   ENG_CHANGE_ORDER_TYPES  ecmt,
1689           --       ENG_ENGINEERING_CHANGES eec
1690           -- WHERE ecmt.change_mgmt_type_code = eec.change_mgmt_type_code
1691           -- AND   type_classification = 'CATEGORY'
1692           -- AND   eec.change_id       = p_change_id ;
1693 
1694 BEGIN
1695 
1696 
1697     FOR change_rec IN c_change(p_change_id => p_change_id)
1698     LOOP
1699 
1700         x_enable_rev_items_flag := change_rec.enable_rev_items_flag ;
1701         x_enable_tasks_flag := change_rec.enable_tasks_flag ;
1702 
1703     END LOOP ;
1704 
1705 END GetEnableChildFlags ;
1706 */
1707 
1708 
1709 -- Get Ntf Message PL/SQL Document API Info
1710 PROCEDURE GetNtfMessageDocumentAPI
1711 (   p_item_type         IN  VARCHAR2
1712  ,  p_item_key          IN  VARCHAR2
1713  ,  p_process_name      IN  VARCHAR2
1714  ,  x_message_text_body OUT NOCOPY VARCHAR2
1715  ,  x_message_html_body OUT NOCOPY VARCHAR2
1716 )
1717 IS
1718 
1719 BEGIN
1720 
1721     -- Message Text Body Document API
1722     x_message_text_body := 'PLSQLCLOB:ENG_WORKFLOW_NTF_UTIL.GetMessageTextBody/'
1723                          || p_item_type ||':'||p_item_key ||':&#NID' ;
1724 
1725     -- Message HTML Body Document API
1726     x_message_html_body := 'PLSQLCLOB:ENG_WORKFLOW_NTF_UTIL.GetMessageHTMLBody/'
1727                          || p_item_type ||':'||p_item_key ||':&#NID' ;
1728 
1729 
1730 END GetNtfMessageDocumentAPI ;
1731 
1732 
1733 PROCEDURE GetNtfAttachmentLink
1734 (   p_data_object_code         IN  VARCHAR2
1735  ,  p_pk1_value                IN  VARCHAR2
1736  ,  p_pk2_value                IN  VARCHAR2 := NULL
1737  ,  p_pk3_value                IN  VARCHAR2 := NULL
1738  ,  p_pk4_value                IN  VARCHAR2 := NULL
1739  ,  p_pk5_value                IN  VARCHAR2 := NULL
1740  ,  x_ntf_attachment_link  OUT NOCOPY VARCHAR2
1741 )
1742 IS
1743 
1744 
1745      CURSOR c_doc_entity (p_data_object_code VARCHAR2 )
1746      IS
1747          SELECT document_entity_id
1748               , pk1_column
1749               , pk2_column
1750               , pk3_column
1751               , pk4_column
1752               , pk5_column
1753          FROM fnd_document_entities
1754          WHERE data_object_code = p_data_object_code ;
1755 
1756 BEGIN
1757 
1758 
1759     -- Get Attachment Link Info from FND_DOCUMENT_ENTITIES
1760     -- then construct Ntf Attachmet Link for the standard
1761     -- FND:entity=<DATA_OBJECT_CODE> &pk1name=<Key Name>&pk1value=<Key  Value>
1762     -- e.g.
1763     -- FND:entity=ENG_ENGINEERING_CHANGES&pk1name=CHANGE_ID&pk1value=9999
1764     --
1765     FOR doc_entity_rec IN c_doc_entity (p_data_object_code => p_data_object_code)
1766     LOOP
1767 
1768         x_ntf_attachment_link := 'FND:entity=' || p_data_object_code ;
1769 
1770         IF p_pk1_value IS NOT NULL THEN
1771 
1772            x_ntf_attachment_link
1773            := x_ntf_attachment_link || '&pk1name=' || doc_entity_rec.pk1_column
1774                                     || '&pk1value=' || p_pk1_value ;
1775 
1776 
1777         END IF ;
1778 
1779         IF p_pk2_value IS NOT NULL THEN
1780 
1781            x_ntf_attachment_link
1782            := x_ntf_attachment_link || '&pk2name=' || doc_entity_rec.pk2_column
1783                                     || '&pk2value=' || p_pk2_value ;
1784 
1785 
1786         END IF ;
1787 
1788         IF p_pk3_value IS NOT NULL THEN
1789 
1790            x_ntf_attachment_link
1791            := x_ntf_attachment_link || '&pk3name=' || doc_entity_rec.pk3_column
1792                                     || '&pk3value=' || p_pk3_value ;
1793 
1794 
1795         END IF ;
1796 
1797         IF p_pk4_value IS NOT NULL THEN
1798 
1799            x_ntf_attachment_link
1800            := x_ntf_attachment_link || '&pk4name=' || doc_entity_rec.pk4_column
1801                                     || '&pk4value=' || p_pk4_value ;
1802 
1803 
1804         END IF ;
1805 
1806 
1807         IF p_pk5_value IS NOT NULL THEN
1808 
1809            x_ntf_attachment_link
1810            := x_ntf_attachment_link || '&pk5name=' || doc_entity_rec.pk5_column
1811                                     || '&pk5value=' || p_pk5_value ;
1812 
1813 
1814         END IF ;
1815 
1816 
1817 
1818     END LOOP ;
1819 
1820 
1821 END GetNtfAttachmentLink ;
1822 
1823 
1824 /*
1825 PROCEDURE SetWorkflowRevision
1826 (   p_item_type         IN  VARCHAR2
1827  ,  p_item_key          IN  VARCHAR2
1828  ,  p_process_name      IN  VARCHAR2
1829  ,  p_change_notice     IN  VARCHAR2
1830  ,  p_organization_id   IN  NUMBER
1831  ,  p_wf_user_id        IN  NUMBER
1832  ,  p_action_id         IN  NUMBER    := NULL
1833  ,  p_route_id          IN  NUMBER    := NULL
1834  ,  p_route_step_id     IN  NUMBER    := NULL
1835 )
1836 IS
1837 
1838 
1839 BEGIN
1840 
1841         INSERT INTO ENG_ECO_SUBMIT_REVISIONS
1842                     ( change_notice
1843                     , organization_id
1844                     , process_name
1845                     , revision_id
1846                     , request_id
1847                     , submit_date
1848                     , last_update_date
1849                     , last_updated_by
1850                     , creation_date
1851                     , created_by
1852                     , last_update_login
1853                      )
1854         VALUES
1855                      ( p_change_notice
1856                      , p_organization_id
1857                      , p_Process_Name
1858                      , p_item_key
1859                      , ''
1860                      , SYSDATE
1861                      , SYSDATE
1862                      , p_wf_user_id
1863                      , SYSDATE
1864                      , p_wf_user_id
1865                      , p_wf_user_id
1866                      );
1867 
1868 END SetWorkflowRevision ;
1869 */
1870 
1871 
1872 PROCEDURE CheckWFActivityStatus
1873 (   p_item_type          IN  VARCHAR2
1874  ,  p_item_key           IN  VARCHAR2
1875  ,  p_process_name       IN  VARCHAR2 := NULL
1876  ,  p_activity_item_type IN  VARCHAR2 := Eng_Workflow_Util.G_STD_ITEM_TYPE
1877  ,  p_activity_name      IN  VARCHAR2
1878  ,  x_activity_status    OUT NOCOPY VARCHAR2
1879 )
1880 IS
1881 
1882    l_begin_date DATE ;
1883    l_process_name VARCHAR2(30) ;
1884 
1885 BEGIN
1886 
1887 
1888     select  WI.BEGIN_DATE
1889           , WI.ROOT_ACTIVITY
1890     into    l_begin_date
1891           , l_process_name
1892     from    WF_ITEMS WI
1893     where   WI.ITEM_TYPE  = p_item_type
1894     and     WI.ITEM_KEY   = p_item_key ;
1895 
1896 
1897 
1898     IF p_process_name IS NOT NULL
1899     THEN
1900 
1901        l_process_name := p_process_name ;
1902 
1903     END IF ;
1904 
1905 
1906     select WIAS.ACTIVITY_STATUS
1907          -- , PA.ACTIVITY_NAME
1908          -- , WIAS.ACTIVITY_RESULT_CODE,
1909          -- , WIAS.ASSIGNED_USER,
1910          -- , WIAS.NOTIFICATION_ID,
1911          -- , WIAS.BEGIN_DATE, WIAS.END_DATE,
1912          -- , WIAS.DUE_DATE,
1913          -- , WIAS.ERROR_NAME, WIAS.ERROR_MESSAGE,
1914          -- , WIAS.ERROR_STACK
1915     into x_activity_status
1916     from  WF_ITEM_ACTIVITY_STATUSES WIAS
1917         , WF_PROCESS_ACTIVITIES PA
1918         , WF_ACTIVITIES A
1919     where WIAS.ITEM_TYPE = p_item_type
1920     and WIAS.ITEM_KEY = p_item_key
1921     and WIAS.PROCESS_ACTIVITY = PA.INSTANCE_ID
1922     and PA.PROCESS_ITEM_TYPE = p_item_type
1923     and PA.PROCESS_NAME = l_process_name
1924     and PA.ACTIVITY_NAME = A.NAME
1925     and PA.ACTIVITY_ITEM_TYPE = A.ITEM_TYPE
1926     and A.ITEM_TYPE = p_activity_item_type
1927     and A.NAME = p_activity_name
1928     and l_begin_date >= A.BEGIN_DATE
1929     and l_begin_date < NVL(A.END_DATE, l_begin_date + 1) ;
1930 
1931 
1932 EXCEPTION
1933     WHEN OTHERS THEN
1934         x_activity_status := NULL;
1935 
1936 
1937 END CheckWFActivityStatus ;
1938 
1939 
1940 -- Get Party Info
1941 PROCEDURE GetPartyInfo
1942 (   p_party_id          IN  NUMBER
1943  ,  x_party_name        OUT NOCOPY VARCHAR2
1944  ,  x_party_company     OUT NOCOPY VARCHAR2
1945 )
1946 IS
1947 
1948     l_party_type          VARCHAR2(30) ;
1949 
1950 BEGIN
1951 
1952      IF p_party_id IS NOT NULL THEN
1953 
1954          l_party_type  := GetPartyType(p_party_id => p_party_id ) ;
1955 
1956          IF l_party_type = 'GROUP' THEN
1957 
1958              begin
1959 
1960              /*
1961              SELECT  grp.party_name party_name
1962                    , company.party_name comp_name
1963              INTO    x_party_name
1964                    , x_party_company
1965              FROM    HZ_RELATIONSHIPS emp_cmpy,
1966                      HZ_PARTIES company,
1967                      HZ_RELATIONSHIPS owner_group_rel,
1968                      HZ_PARTIES owner ,
1969                      HZ_PARTIES grp
1970              WHERE  emp_cmpy.subject_type (+)= 'PERSON'
1971              AND    emp_cmpy.subject_table_name (+)= 'HZ_PARTIES'
1972              AND    emp_cmpy.object_type  (+)= 'ORGANIZATION'
1973              AND    emp_cmpy.relationship_code (+)= 'EMPLOYEE_OF'
1974              AND    emp_cmpy.object_table_name(+)= 'HZ_PARTIES'
1975              AND    emp_cmpy.status (+)= 'A'
1976              AND    emp_cmpy.start_date (+)<= SYSDATE
1977              AND    ( emp_cmpy.end_date IS NULL OR emp_cmpy.end_date >= SYSDATE)
1978              AND    company.party_id (+)= emp_cmpy.object_id
1979              AND    company.status (+)= 'A'
1980              AND    emp_cmpy.subject_id (+)= owner.party_id
1981              -- AND    owner.status='A'
1982              AND    owner.party_id = owner_group_rel.subject_id
1983              AND    owner_group_rel.subject_type = 'PERSON'
1984              AND    owner_group_rel.subject_table_name = 'HZ_PARTIES'
1985              AND    owner_group_rel.object_type  = 'GROUP'
1986              AND    owner_group_rel.object_table_name = 'HZ_PARTIES'
1987              AND    owner_group_rel.relationship_code = 'OWNER_OF'
1988              AND    owner_group_rel.status = 'A'
1989              AND    owner_group_rel.start_date <= SYSDATE
1990              AND    ( owner_group_rel.end_date IS NULL OR owner_group_rel.end_date >= SYSDATE)
1991              AND    owner_group_rel.object_id = grp.party_id
1992              -- AND    grp.status = 'A'
1993              AND    grp.party_id  = p_party_id ;
1994              */
1995 
1996              -- Replaced above sql to use EGO_GROUPS_V
1997              SELECT  grp.group_name party_name
1998                    , '' comp_name
1999              INTO    x_party_name
2000                    , x_party_company
2001              FROM    EGO_GROUPS_V grp
2002              WHERE  grp.group_id  = p_party_id ;
2003 
2004              exception
2005                when no_data_found then
2006                      null ;
2007              end ;
2008 
2009          ELSIF  l_party_type = 'PERSON'  THEN
2010 
2011              begin
2012 
2013              /* Comment out for bug3038792
2014               --  Decide to use EGO_PEOPLE_V to prevent from future change
2015               -- Sicne the EGO_PEOPLE_V may return multi recs per person id,
2016               --  we just pick first fetched rec
2017              SELECT  employee.party_name party_name
2018                    , company.party_name comp_name
2019              INTO    x_party_name
2020                    , x_party_company
2021              FROM    hz_parties employee
2022                    , hz_relationships emp_cmpy
2023                    , hz_parties company
2024              WHERE  emp_cmpy.subject_type (+)= 'PERSON'
2025              AND    emp_cmpy.subject_table_name (+)= 'HZ_PARTIES'
2026              AND    emp_cmpy.object_type  (+)= 'ORGANIZATION'
2027              AND    emp_cmpy.relationship_code (+)= 'EMPLOYEE_OF'
2028              AND    emp_cmpy.object_table_name (+)= 'HZ_PARTIES'
2029              AND    emp_cmpy.status (+)= 'A'
2030              AND    emp_cmpy.start_date (+) <= SYSDATE
2031              AND   (emp_cmpy.end_date IS NULL OR emp_cmpy.end_date >= SYSDATE)
2032              -- AND    employee.status = 'A'
2033              AND    company.party_id (+) = emp_cmpy.object_id
2034              AND    company.status (+)= 'A'
2035              AND    emp_cmpy.subject_id (+)= employee.party_id
2036              AND    employee.party_id =  p_party_id ;
2037              */
2038 
2039              SELECT  person_name party_name
2040                    , company_name comp_name
2041              INTO    x_party_name
2042                    , x_party_company
2043              FROM   EGO_PEOPLE_V
2044              WHERE  person_id = p_party_id
2045              AND    ROWNUM = 1 ;
2046 
2047              exception
2048                when no_data_found then
2049                      null ;
2050              end ;
2051 
2052          END IF ;
2053 
2054       END IF ; -- party id is not null
2055 
2056 END GetPartyInfo ;
2057 
2058 
2059 -- Get Step Activity Attributes
2060 PROCEDURE GetStepActAttributes
2061 (   p_step_id                 IN  NUMBER
2062  ,  x_default_role_name       OUT NOCOPY VARCHAR2
2063  ,  x_activity_condition_code OUT NOCOPY VARCHAR2
2064 )
2065 IS
2066 
2067      CURSOR c_step_act_attr (p_step_id NUMBER)
2068      IS
2069            SELECT WfActAttr.TEXT_DEFAULT  DEFAULT_ROLE_NAME,
2070                   WfActAttr2.TEXT_DEFAULT ACTIVITY_CONDITION_CODE
2071            FROM   WF_ACTIVITIES WfAct,
2072                   WF_ACTIVITY_ATTRIBUTES WfActAttr,
2073                   WF_ACTIVITY_ATTRIBUTES WfActAttr2,
2074                   ENG_CHANGE_ROUTE_STEPS RouteStep
2075            WHERE WfActAttr.NAME (+)= 'DEFAULT_CHANGE_ROLE'
2076            AND WfActAttr.ACTIVITY_VERSION (+)= WfAct.VERSION
2077            AND WfActAttr.ACTIVITY_ITEM_TYPE (+)= WfAct.ITEM_TYPE
2078            AND WfActAttr.ACTIVITY_NAME (+)= WfAct.NAME
2079            AND WfActAttr2.NAME (+)= 'ACTIVITY_CONDITION_CODE'
2080            AND WfActAttr2.ACTIVITY_VERSION (+)= WfAct.VERSION
2081            AND WfActAttr2.ACTIVITY_ITEM_TYPE (+)= WfAct.ITEM_TYPE
2082            AND WfActAttr2.ACTIVITY_NAME (+)= WfAct.NAME
2083            AND WfAct.TYPE = 'PROCESS'
2084            AND WfAct.BEGIN_DATE <= SYSDATE
2085            AND (WfAct.END_DATE >= SYSDATE OR WfAct.END_DATE IS NULL)
2086            AND WfAct.ITEM_TYPE = RouteStep.wf_item_type
2087            AND WfAct.NAME = RouteStep.wf_process_name
2088            AND RouteStep.step_id = p_step_id ;
2089 
2090 
2091 BEGIN
2092 
2093     FOR step_attr_rec IN c_step_act_attr(p_step_id => p_step_id )
2094     LOOP
2095 
2096          x_default_role_name       :=  step_attr_rec.default_role_name ;
2097          x_activity_condition_code :=  step_attr_rec.activity_condition_code ;
2098 
2099     END LOOP ;
2100 
2101 END GetStepActAttributes ;
2102 
2103 
2104 -- R12B
2105 -- Get Step Activity Attributes for Auto Grants
2106 PROCEDURE GetStepAutoGranatRoles
2107 (   p_step_id                 IN  NUMBER
2108  ,  x_document_role_id        OUT NOCOPY NUMBER
2109  ,  x_ocs_role                OUT NOCOPY VARCHAR2
2110 )
2111 IS
2112 
2113      CURSOR c_step_act_attr (c_step_id NUMBER)
2114      IS
2115            SELECT document_role_attr.TEXT_DEFAULT  DOCUMENT_ROLE
2116                 , doc_role.MENU_ID                 DOCUMENT_ROLE_ID
2117                 , cs_role_attr.TEXT_DEFAULT        OCS_ROLE
2118            FROM   FND_MENUS     doc_role
2119                 , WF_ACTIVITIES WfAct
2120                 , WF_ACTIVITY_ATTRIBUTES document_role_attr
2121                 , WF_ACTIVITY_ATTRIBUTES cs_role_attr
2122                 , ENG_CHANGE_ROUTE_STEPS RouteStep
2123            WHERE doc_role.MENU_NAME (+)= document_role_attr.TEXT_DEFAULT
2124            AND   document_role_attr.NAME (+)= 'AUTO_GRANT_DOCUMENT_ROLE'
2125            AND document_role_attr.ACTIVITY_VERSION (+)= WfAct.VERSION
2126            AND document_role_attr.ACTIVITY_ITEM_TYPE (+)= WfAct.ITEM_TYPE
2127            AND document_role_attr.ACTIVITY_NAME (+)= WfAct.NAME
2128            AND cs_role_attr.NAME (+)= 'AUTO_GRANT_OCS_ROLE'
2129            AND cs_role_attr.ACTIVITY_VERSION (+)= WfAct.VERSION
2130            AND cs_role_attr.ACTIVITY_ITEM_TYPE (+)= WfAct.ITEM_TYPE
2131            AND cs_role_attr.ACTIVITY_NAME (+)= WfAct.NAME
2132            AND WfAct.TYPE = 'PROCESS'
2133            AND WfAct.BEGIN_DATE <= SYSDATE
2134            AND (WfAct.END_DATE >= SYSDATE OR WfAct.END_DATE IS NULL)
2135            AND WfAct.ITEM_TYPE = RouteStep.wf_item_type
2136            AND WfAct.NAME = RouteStep.wf_process_name
2137            AND RouteStep.step_id = c_step_id ;
2138 
2139 BEGIN
2140 
2141     FOR step_attr_rec IN c_step_act_attr(c_step_id => p_step_id )
2142     LOOP
2143          x_document_role_id  :=  step_attr_rec.DOCUMENT_ROLE_ID ;
2144          x_ocs_role          :=  step_attr_rec.OCS_ROLE ;
2145     END LOOP ;
2146 
2147 END GetStepAutoGranatRoles ;
2148 
2149 -- R12B
2150 -- Get Additional Step Voting Option If Response Condition for Step is All
2151 -- to support Request Response process in Line Workflow
2152 PROCEDURE GetStepVoteOptionForAllResp
2153 (   p_step_id                   IN  NUMBER
2154  ,  x_vote_option_for_step_all  OUT NOCOPY VARCHAR2
2155 )
2156 IS
2157 
2158      CURSOR c_step_act_attr (c_step_id NUMBER)
2159      IS
2160            SELECT vote_option_attr.TEXT_DEFAULT    VOTE_OPTION
2161            FROM   WF_ACTIVITIES WfAct
2162                 , WF_ACTIVITY_ATTRIBUTES vote_option_attr
2163                 , ENG_CHANGE_ROUTE_STEPS RouteStep
2164            WHERE vote_option_attr.NAME (+)= 'VOTE_OPTION_FOR_STEP_ALL'
2165            AND vote_option_attr.ACTIVITY_VERSION (+)= WfAct.VERSION
2166            AND vote_option_attr.ACTIVITY_ITEM_TYPE (+)= WfAct.ITEM_TYPE
2167            AND vote_option_attr.ACTIVITY_NAME (+)= WfAct.NAME
2168            AND WfAct.TYPE = 'PROCESS'
2169            AND WfAct.BEGIN_DATE <= SYSDATE
2170            AND (WfAct.END_DATE >= SYSDATE OR WfAct.END_DATE IS NULL)
2171            AND WfAct.ITEM_TYPE = RouteStep.wf_item_type
2172            AND WfAct.NAME = RouteStep.wf_process_name
2173            AND RouteStep.step_id = c_step_id ;
2174 
2175 BEGIN
2176 
2177     FOR step_attr_rec IN c_step_act_attr(c_step_id => p_step_id )
2178     LOOP
2179          x_vote_option_for_step_all  :=  step_attr_rec.VOTE_OPTION ;
2180     END LOOP ;
2181 
2182 END GetStepVoteOptionForAllResp ;
2183 
2184 
2185 -- R12B
2186 -- Get Step Assignee Default Response Code
2187 -- to support Request Response process in Line Workflow
2188 PROCEDURE GetStepDefaultRespCode
2189 (   p_step_id                   IN  NUMBER
2190  ,  x_default_resp_code         OUT NOCOPY VARCHAR2
2191 )
2192 IS
2193 
2194      CURSOR c_step_act_attr (c_step_id NUMBER)
2195      IS
2196            SELECT vote_option_attr.TEXT_DEFAULT    VOTE_OPTION
2197            FROM   WF_ACTIVITIES WfAct
2198                 , WF_ACTIVITY_ATTRIBUTES vote_option_attr
2199                 , ENG_CHANGE_ROUTE_STEPS RouteStep
2200            WHERE vote_option_attr.NAME (+)= 'DEFAULT_ASSIGNEE_RESP_CODE'
2201            AND vote_option_attr.ACTIVITY_VERSION (+)= WfAct.VERSION
2202            AND vote_option_attr.ACTIVITY_ITEM_TYPE (+)= WfAct.ITEM_TYPE
2203            AND vote_option_attr.ACTIVITY_NAME (+)= WfAct.NAME
2204            AND WfAct.TYPE = 'PROCESS'
2205            AND WfAct.BEGIN_DATE <= SYSDATE
2206            AND (WfAct.END_DATE >= SYSDATE OR WfAct.END_DATE IS NULL)
2207            AND WfAct.ITEM_TYPE = RouteStep.wf_item_type
2208            AND WfAct.NAME = RouteStep.wf_process_name
2209            AND RouteStep.step_id = c_step_id ;
2210 
2211 BEGIN
2212 
2213 
2214     FOR step_attr_rec IN c_step_act_attr(c_step_id => p_step_id )
2215     LOOP
2216          x_default_resp_code :=  step_attr_rec.VOTE_OPTION ;
2217     END LOOP ;
2218 
2219 
2220    IF x_default_resp_code IS NULL THEN
2221        x_default_resp_code := Eng_Workflow_Util.G_RT_SUBMITTED ;
2222    END IF ;
2223 
2224 END GetStepDefaultRespCode ;
2225 
2226 
2227 
2228 -- Get Step Required Date
2229 FUNCTION GetStepRequiredDate
2230 (   p_step_id                 IN  NUMBER
2231 ) RETURN DATE
2232 IS
2233 
2234      l_required_date DATE ;
2235 
2236      CURSOR c_step (p_step_id NUMBER)
2237      IS
2238            SELECT required_relative_days
2239            FROM   ENG_CHANGE_ROUTE_STEPS RouteStep
2240            WHERE  RouteStep.step_id = p_step_id ;
2241 
2242 
2243 BEGIN
2244 
2245     FOR step_rec IN c_step(p_step_id => p_step_id )
2246     LOOP
2247          IF step_rec.required_relative_days IS NOT NULL
2248          THEN
2249 
2250              -- Bug3456536
2251              -- For Different Timezon Support, we decided not to
2252              -- trucate the date so that we can display Date Time correctly
2253              -- l_required_date := TRUNC(SYSDATE + step_rec.required_relative_days) ;
2254              l_required_date := SYSDATE + step_rec.required_relative_days ;
2255 
2256          END IF ;
2257 
2258     END LOOP ;
2259 
2260     RETURN l_required_date ;
2261 
2262 END GetStepRequiredDate ;
2263 
2264 
2265 -- Get Workflow Signature Policy from Lifecycle Phase
2266 FUNCTION GetWfSigPolicyFromLCPhase
2267 (   p_change_id                 IN  NUMBER
2268 ,   p_route_id                  IN  NUMBER
2269 ) RETURN VARCHAR2
2270 IS
2271 
2272      l_wf_sig_policy VARCHAR2(30) ;
2273 
2274      CURSOR c_wfsigpolicy ( p_route_id NUMBER )
2275      IS
2276         SELECT TempLCStatus.WF_SIG_POLICY
2277         FROM   ENG_LIFECYCLE_STATUSES TempLCStatus,
2278                ENG_CHANGE_ROUTES Route,
2279                ENG_ENGINEERING_CHANGES EngChange
2280         WHERE  TempLCStatus.ENTITY_NAME = 'ENG_CHANGE_TYPE'
2281         AND    TempLCStatus.ENTITY_ID1 = EngChange.CHANGE_ORDER_TYPE_ID
2282         AND    TO_CHAR(TempLCStatus.STATUS_CODE) = Route.CLASSIFICATION_CODE
2283         AND    EngChange.CHANGE_ID = Route.OBJECT_ID1
2284         AND    Route.OBJECT_NAME = 'ENG_CHANGE'
2285         AND    Route.ROUTE_ID = p_route_id ;
2286 
2287 
2288 
2289 BEGIN
2290 
2291     FOR l_rec IN c_wfsigpolicy (p_route_id => p_route_id)
2292     LOOP
2293 
2294          IF   l_rec.WF_SIG_POLICY IS NOT NULL
2295          AND  l_rec.WF_SIG_POLICY = G_SIG_POLICY_PSIG_ONLY
2296          THEN
2297 
2298              l_wf_sig_policy := G_SIG_POLICY_PSIG_ONLY ;
2299 
2300          ELSIF   l_rec.WF_SIG_POLICY IS NOT NULL
2301          AND  l_rec.WF_SIG_POLICY = G_SIG_POLICY_PKCS7X509_ONLY
2302          THEN
2303 
2304              l_wf_sig_policy := G_SIG_POLICY_PKCS7X509_ONLY ;
2305 
2306          END IF ;
2307 
2308     END LOOP ;
2309 
2310     RETURN l_wf_sig_policy ;
2311 
2312 END GetWfSigPolicyFromLCPhase ;
2313 
2314 
2315 -- Get Workflow Signature Policy from Lifecycle Phase
2316 PROCEDURE RespondToDuplicateNtf
2317 (   p_dupllicate_ntf_id      IN  NUMBER
2318 ,   p_orig_ntf_id            IN  NUMBER
2319 ,   p_responder              IN  VARCHAR2
2320 )
2321 IS
2322 
2323     CURSOR  c_orig_ntf_resp (p_orig_ntf_id        NUMBER )
2324     IS
2325         SELECT na.NAME
2326              , na.TEXT_VALUE
2327              , na.NUMBER_VALUE
2328              , na.DATE_VALUE
2329          FROM WF_NOTIFICATION_ATTRIBUTES na,
2330               WF_MESSAGE_ATTRIBUTES ma,
2331               WF_NOTIFICATIONS ntf
2332          WHERE ntf.NOTIFICATION_ID = p_orig_ntf_id
2333          AND   na.NOTIFICATION_ID = ntf.NOTIFICATION_ID
2334          AND   ma.MESSAGE_NAME = ntf.MESSAGE_NAME
2335          AND   ma.MESSAGE_TYPE = ntf.MESSAGE_TYPE
2336          AND   ma.NAME = na.NAME
2337          AND   ma.SUBTYPE = 'RESPOND' ;
2338 
2339 BEGIN
2340 
2341 
2342 IF g_debug_flag THEN
2343    Write_Debug('Eng_Workflow_Util.RespondToDuplicateNtf Log');
2344    Write_Debug('-----------------------------------------------------');
2345    Write_Debug('Target Dup Notification Id  : ' || TO_CHAR(p_dupllicate_ntf_id));
2346    Write_Debug('Original Notification Id  : ' || TO_CHAR(p_orig_ntf_id));
2347    Write_Debug('-----------------------------------------------------');
2348 END IF ;
2349 
2350     -- Get the response attribute for original ntf id.
2351     -- Set attribute for target Duplicate Notificaiton Id
2352     FOR ntf_resp_rec IN c_orig_ntf_resp (p_orig_ntf_id => p_orig_ntf_id)
2353     LOOP
2354 
2355         IF ntf_resp_rec.TEXT_VALUE IS NOT NULL
2356         THEN
2357 
2358 
2359             WF_NOTIFICATION.SetAttrText
2360                              ( nid    => p_dupllicate_ntf_id
2361                              , aname  => ntf_resp_rec.NAME
2362                              , avalue => ntf_resp_rec.TEXT_VALUE
2363                              );
2364 
2365         END IF ;
2366 
2367         IF ntf_resp_rec.NUMBER_VALUE IS NOT NULL
2368         THEN
2369 
2370             WF_NOTIFICATION.SetAttrNumber
2371                              ( nid    => p_dupllicate_ntf_id
2372                              , aname  => ntf_resp_rec.NAME
2373                              , avalue => ntf_resp_rec.NUMBER_VALUE
2374                              );
2375 
2376         END IF ;
2377 
2378         IF ntf_resp_rec.DATE_VALUE IS NOT NULL
2379         THEN
2380 
2381             WF_NOTIFICATION.SetAttrDate
2382                              ( nid    => p_dupllicate_ntf_id
2383                              , aname  => ntf_resp_rec.NAME
2384                              , avalue => ntf_resp_rec.DATE_VALUE
2385                              );
2386 
2387         END IF ;
2388 
2389     END LOOP ;
2390 
2391 IF g_debug_flag THEN
2392    Write_Debug('Calling WF_NOTIFICATION.RESPOND for Target Dup Ntf ');
2393 END IF ;
2394 
2395     WF_NOTIFICATION.RESPOND
2396     ( nid => p_dupllicate_ntf_id -- nid in number
2397     , responder => p_responder  -- responder in varchar2 default null
2398     ) ;
2399 
2400 END RespondToDuplicateNtf ;
2401 
2402 
2403 -- R12B
2404 -- Check if this workflow routing is Line Notificaiton Worklfow
2405 FUNCTION Is_Line_Ntf_WF
2406 ( p_route_id  IN  NUMBER)
2407 RETURN BOOLEAN
2408 IS
2409 
2410     l_route_type_code   VARCHAR2(30) ;
2411 
2412 BEGIN
2413 
2414     Eng_Workflow_Util.GetRouteTypeCode( p_route_id        => p_route_id
2415                                       , x_route_type_code => l_route_type_code
2416                                       ) ;
2417 
2418     IF Eng_Workflow_Util.G_LINE_RT_TYPE_NOTIFICATION = l_route_type_code
2419     THEN
2420         RETURN  TRUE ;
2421     ELSE
2422         RETURN  FALSE ;
2423     END IF ;
2424 
2425 
2426 END Is_Line_Ntf_WF ;
2427 
2428 
2429 /********************************************************************
2430 * API Type      : Private APIs
2431 * Purpose       : Internal Use Only
2432 *********************************************************************/
2433 FUNCTION GetBaseChangeMgmtTypeCode
2434 ( p_change_id         IN     NUMBER)
2435 RETURN VARCHAR2
2436 IS
2437    -- return SUMMARY or DETAIL
2438     l_base_cm_code VARCHAR2(30) ;
2439 
2440     CURSOR  c_base_cm_code(p_change_id NUMBER)
2441     IS
2442         SELECT ChangeCategory.BASE_CHANGE_MGMT_TYPE_CODE
2443         FROM ENG_ENGINEERING_CHANGES EngineeringChangeEO,
2444              ENG_CHANGE_ORDER_TYPES ChangeCategory
2445         WHERE  ChangeCategory.type_classification = 'CATEGORY'
2446         AND ChangeCategory.change_mgmt_type_code = EngineeringChangeEO.change_mgmt_type_code
2447         AND EngineeringChangeEO.change_id = p_change_id  ;
2448 
2449 BEGIN
2450     FOR l_rec IN c_base_cm_code  (p_change_id => p_change_id)
2451     LOOP
2452         l_base_cm_code :=  l_rec.BASE_CHANGE_MGMT_TYPE_CODE  ;
2453     END LOOP ;
2454 
2455     RETURN l_base_cm_code ;
2456 
2457 END  GetBaseChangeMgmtTypeCode ;
2458 
2459 
2460 -- Get Change Object Identifier
2461 PROCEDURE GetChangeObject
2462 (   p_item_type         IN  VARCHAR2
2463  ,  p_item_key          IN  VARCHAR2
2464  ,  x_change_id         OUT NOCOPY NUMBER
2465 )
2466 IS
2467 
2468 BEGIN
2469 
2470     -- Get Change Object Id
2471     x_change_id := WF_ENGINE.GetItemAttrNumber
2472                             (  p_item_type
2473                              , p_item_key
2474                              , 'CHANGE_ID'
2475                              );
2476 
2477 END GetChangeObject ;
2478 
2479 
2480 -- Get Change Line Object Identifier
2481 PROCEDURE GetChangeLineObject
2482 (   p_item_type         IN  VARCHAR2
2483  ,  p_item_key          IN  VARCHAR2
2484  ,  x_change_line_id    OUT NOCOPY NUMBER
2485 )
2486 IS
2487 
2488 BEGIN
2489 
2490     -- Bug 3823830
2491     -- For upgrade, suppress the exception
2492     begin
2493 
2494     -- Get Change Line Object Id
2495     x_change_line_id := WF_ENGINE.GetItemAttrNumber
2496                             (  p_item_type
2497                              , p_item_key
2498                              , 'CHANGE_LINE_ID'
2499                              );
2500 
2501     exception
2502         when others then
2503             null ;
2504     end  ;
2505 
2506 END GetChangeLineObject ;
2507 
2508 
2509 
2510 -- Get Change Object Identifier
2511 PROCEDURE GetChangeObject
2512 (   p_item_type         IN  VARCHAR2
2513  ,  p_item_key          IN  VARCHAR2
2514  ,  x_change_id         OUT NOCOPY NUMBER
2515  ,  x_change_notice     OUT NOCOPY VARCHAR2
2516  ,  x_organization_id   OUT NOCOPY NUMBER
2517 )
2518 IS
2519 
2520 BEGIN
2521 
2522 
2523     -- Get Change Object Id
2524     x_change_id := WF_ENGINE.GetItemAttrNumber
2525                             (  p_item_type
2526                              , p_item_key
2527                              , 'CHANGE_ID'
2528                              );
2529 
2530 
2531     -- Get Change Org Id
2532     x_organization_id := WF_ENGINE.GetItemAttrNumber
2533                             (  p_item_type
2534                              , p_item_key
2535                              , 'ORGANIZATION_ID'
2536                              );
2537 
2538     -- Get Change Notice
2539     x_change_notice := WF_ENGINE.GetItemAttrText
2540                             (  p_item_type
2541                              , p_item_key
2542                              , 'CHANGE_NOTICE'
2543                              );
2544 
2545 END GetChangeObject ;
2546 
2547 
2548 
2549 PROCEDURE GetHostURL
2550 (   p_item_type         IN  VARCHAR2
2551  ,  p_item_key          IN  VARCHAR2
2552  ,  x_host_url          OUT NOCOPY VARCHAR2
2553 )
2554 IS
2555 
2556 BEGIN
2557 
2558     -- Get Host URL
2559     x_host_url := WF_ENGINE.GetItemAttrText
2560                   ( p_item_type
2561                   , p_item_key
2562                   , 'HOST_URL'
2563                   );
2564 
2565     IF x_host_url  IS NULL THEN
2566 
2567        x_host_url := GetFrameWorkAgentURL ;
2568 
2569     END IF ;
2570 
2571 END GetHostURL;
2572 
2573 FUNCTION GetFrameWorkAgentURL
2574 RETURN VARCHAR2
2575 IS
2576 
2577    apps_fwk_agent VARCHAR2(256);
2578 
2579 BEGIN
2580 
2581     apps_fwk_agent := rtrim(FND_PROFILE.VALUE('APPS_FRAMEWORK_AGENT'), '/');
2582 
2583     RETURN apps_fwk_agent ;
2584 
2585 END GetFrameWorkAgentURL ;
2586 
2587 
2588 
2589 PROCEDURE SetWFUserId
2590 (   p_item_type         IN  VARCHAR2
2591  ,  p_item_key          IN  VARCHAR2
2592  ,  p_wf_user_id        IN  NUMBER
2593 )
2594 IS
2595 
2596 BEGIN
2597 
2598     -- Set Workflow User Id
2599     WF_ENGINE.SetItemAttrNumber
2600                   ( p_item_type
2601                   , p_item_key
2602                   , 'WF_USER_ID'
2603                   , p_wf_user_id
2604                   );
2605 
2606 END SetWFUserId ;
2607 
2608 
2609 PROCEDURE SetWFUserRole
2610 (   p_item_type         IN  VARCHAR2
2611  ,  p_item_key          IN  VARCHAR2
2612  ,  p_wf_user_role      IN  VARCHAR2
2613 )
2614 IS
2615 
2616 BEGIN
2617 
2618     -- Set WF Owner's User Role
2619     WF_ENGINE.SetItemAttrText
2620                   ( p_item_type
2621                   , p_item_key
2622                   , 'WF_USER_ROLE'
2623                   , p_wf_user_role
2624                   );
2625 
2626 END SetWFUserRole ;
2627 
2628 
2629 PROCEDURE SetNTFFromRole
2630 (   p_item_type         IN  VARCHAR2
2631  ,  p_item_key          IN  VARCHAR2
2632  ,  p_ntf_from_role     IN  VARCHAR2
2633 )
2634 IS
2635 
2636 BEGIN
2637 
2638     -- Set Ntf From Role
2639     WF_ENGINE.SetItemAttrText
2640                   ( p_item_type
2641                   , p_item_key
2642                   , 'FROM_ROLE'
2643                   , p_ntf_from_role
2644                   );
2645 
2646 END SetNTFFromRole ;
2647 
2648 PROCEDURE GetWFUserId
2649 (   p_item_type         IN  VARCHAR2
2650  ,  p_item_key          IN  VARCHAR2
2651  ,  x_wf_user_id        OUT NOCOPY NUMBER
2652 )
2653 IS
2654 
2655 BEGIN
2656 
2657     -- Get Workflow User Id
2658     x_wf_user_id := WF_ENGINE.GetItemAttrNumber
2659                   ( p_item_type
2660                   , p_item_key
2661                   , 'WF_USER_ID'
2662                   );
2663 
2664 END GetWFUserId ;
2665 
2666 
2667 PROCEDURE GetWFItemOwnerRole
2668 (   p_item_type         IN  VARCHAR2
2669  ,  p_item_key          IN  VARCHAR2
2670  ,  x_item_owner_role   OUT NOCOPY VARCHAR2
2671 )
2672 IS
2673 
2674 BEGIN
2675 
2676     -- Fnd User's User Name
2677     SELECT owner_role
2678       INTO x_item_owner_role
2679       FROM WF_ITEMS
2680      WHERE item_type = p_item_type
2681        AND item_key  = p_item_key ;
2682 
2683 
2684 END GetWFItemOwnerRole ;
2685 
2686 
2687 
2688 PROCEDURE GetRouteId
2689 (   p_item_type         IN  VARCHAR2
2690  ,  p_item_key          IN  VARCHAR2
2691  ,  x_route_id          OUT NOCOPY NUMBER
2692 )
2693 IS
2694 
2695 BEGIN
2696 
2697     -- Get Route Id
2698     x_route_id := WF_ENGINE.GetItemAttrNumber
2699                   ( p_item_type
2700                   , p_item_key
2701                   , 'ROUTE_ID'
2702                   );
2703 
2704 END GetRouteId ;
2705 
2706 PROCEDURE GetRouteObject
2707 (   p_item_type         IN  VARCHAR2
2708  ,  p_item_key          IN  VARCHAR2
2709  ,  x_route_object      OUT NOCOPY VARCHAR2
2710 )
2711 IS
2712 
2713 BEGIN
2714 
2715     -- Get Route Object
2716     x_route_object := WF_ENGINE.GetItemAttrText
2717                   ( p_item_type
2718                   , p_item_key
2719                   , 'OBJECT_NAME'
2720                   , TRUE -- ignore_notfound
2721                   );
2722 
2723     IF x_route_object IS  NULL
2724     THEN
2725        x_route_object := G_ENG_CHANGE ;
2726 
2727     END IF ;
2728 
2729 END GetRouteObject ;
2730 
2731 
2732 PROCEDURE GetRouteTypeCode
2733 (   p_route_id          IN  NUMBER
2734  ,  x_route_type_code   OUT NOCOPY VARCHAR2
2735 )
2736 IS
2737 
2738     CURSOR  c_route  (p_route_id NUMBER)
2739     IS
2740         SELECT ROUTE_TYPE_CODE
2741           FROM ENG_CHANGE_ROUTES
2742          WHERE ROUTE_ID = p_route_id ;
2743 
2744 BEGIN
2745 
2746 
2747 IF g_debug_flag THEN
2748    Write_Debug('Eng_Workflow_Util.GetRouteTypeCode Log');
2749    Write_Debug('-----------------------------------------------------');
2750    Write_Debug('Route Id  : ' || TO_CHAR(p_route_id));
2751    Write_Debug('-----------------------------------------------------');
2752 END IF ;
2753 
2754 
2755     -- Get Route WF Info
2756     FOR l_route_rec IN c_route (p_route_id => p_route_id )
2757     LOOP
2758 
2759         x_route_type_code := l_route_rec.ROUTE_TYPE_CODE ;
2760 
2761     END LOOP ;
2762 
2763 IF g_debug_flag THEN
2764    Write_Debug('Route Type Code  : ' || x_route_type_code);
2765 END IF ;
2766 
2767 
2768 END GetRouteTypeCode ;
2769 
2770 
2771 PROCEDURE GetRouteComplStatusCode
2772 (   p_route_id                IN  NUMBER
2773  ,  p_route_type_code         IN  VARCHAR2 := NULL
2774  ,  x_route_compl_status_code OUT NOCOPY VARCHAR2
2775 )
2776 IS
2777 
2778     l_route_type_code VARCHAR2(30) ;
2779 
2780 BEGIN
2781 
2782     l_route_type_code := p_route_type_code ;
2783 
2784     IF l_route_type_code IS NULL THEN
2785 
2786 
2787        GetRouteTypeCode( p_route_id => p_route_id
2788                        , x_route_type_code => l_route_type_code ) ;
2789 
2790     END IF ;
2791 
2792     IF l_route_type_code IN (G_RT_TYPE_APPROVAL, G_RT_TYPE_DEFINITION_APPROVAL)
2793     THEN
2794 
2795         x_route_compl_status_code := G_RT_APPROVED ;
2796 
2797     ELSE
2798 
2799         x_route_compl_status_code := G_RT_COMPLETED ;
2800 
2801     END IF ; -- Check Route Type Code and set Route Completion Status
2802 
2803 
2804 END GetRouteComplStatusCode ;
2805 
2806 
2807 PROCEDURE GetRouteStepId
2808 (   p_item_type         IN  VARCHAR2
2809  ,  p_item_key          IN  VARCHAR2
2810  ,  x_route_step_id     OUT NOCOPY NUMBER
2811 )
2812 IS
2813 
2814 BEGIN
2815 
2816     -- Get Change Route Step Id
2817     x_route_step_id := WF_ENGINE.GetItemAttrNumber
2818                   ( p_item_type
2819                   , p_item_key
2820                   , 'STEP_ID'
2821                   );
2822 
2823 END GetRouteStepId ;
2824 
2825 
2826 
2827 
2828 PROCEDURE SetRouteStepId
2829 (   p_item_type         IN  VARCHAR2
2830  ,  p_item_key          IN  VARCHAR2
2831  ,  p_route_step_id     IN  NUMBER
2832 )
2833 IS
2834 
2835 BEGIN
2836 
2837     -- Set Change Route Step Id
2838     WF_ENGINE.SetItemAttrNumber
2839                   ( p_item_type
2840                   , p_item_key
2841                   , 'STEP_ID'
2842                   , p_route_step_id
2843                   );
2844 
2845 END SetRouteStepId ;
2846 
2847 
2848 PROCEDURE GetStyleSheet
2849 (   p_item_type         IN  VARCHAR2
2850  ,  p_item_key          IN  VARCHAR2
2851  ,  x_style_sheet       OUT NOCOPY VARCHAR2
2852 )
2853 IS
2854 
2855 BEGIN
2856 
2857     -- Get Style Sheet
2858     x_style_sheet := WF_ENGINE.GetItemAttrText
2859                   (  p_item_type
2860                   , p_item_key
2861                   , 'DEFAULT_STYLE_SHEET'
2862                   );
2863 
2864 END GetStyleSheet ;
2865 
2866 PROCEDURE SetActionId
2867 (   p_item_type         IN  VARCHAR2
2868  ,  p_item_key          IN  VARCHAR2
2869  ,  p_action_id         IN  NUMBER
2870 )
2871 IS
2872 
2873 BEGIN
2874 
2875     -- Set Action Id
2876     WF_ENGINE.SetItemAttrNumber
2877               ( p_item_type
2878               , p_item_key
2879               , 'ACTION_ID'
2880               , p_action_id
2881               );
2882 
2883 END SetActionId ;
2884 
2885 
2886 PROCEDURE GetActionId
2887 (   p_item_type         IN  VARCHAR2
2888  ,  p_item_key          IN  VARCHAR2
2889  ,  x_action_id         OUT NOCOPY NUMBER
2890 )
2891 IS
2892 
2893 BEGIN
2894 
2895     -- Get Action Id
2896     x_action_id  :=  WF_ENGINE.GetItemAttrNumber
2897                           ( p_item_type
2898                           , p_item_key
2899                           , 'ACTION_ID'
2900                           );
2901 
2902 END GetActionId ;
2903 
2904 
2905 PROCEDURE GetNtfResponseTimeOut
2906 (   p_item_type         IN  VARCHAR2
2907  ,  p_item_key          IN  VARCHAR2
2908  ,  x_timeout_min       OUT NOCOPY NUMBER
2909 )
2910 IS
2911 
2912 BEGIN
2913 
2914 
2915     -- Get Response Timeout Min
2916     x_timeout_min :=  WF_ENGINE.GetItemAttrNumber
2917                           ( p_item_type
2918                           , p_item_key
2919                           , 'RESPONSE_TIMEOUT'
2920                           );
2921 
2922 END GetNtfResponseTimeOut ;
2923 
2924 
2925 -- This response by date version of SetNtfResponseTimeOut
2926 -- is intended to be used for Request Comment Action
2927 PROCEDURE SetNtfResponseTimeOut
2928 (   p_item_type         IN  VARCHAR2
2929  ,  p_item_key          IN  VARCHAR2
2930  ,  p_response_by_date  IN  DATE
2931 )
2932 IS
2933 
2934     l_timeout_min    NUMBER ;
2935 
2936 BEGIN
2937 
2938     -- calculate min by timeout date
2939     IF  p_response_by_date IS NOT NULL
2940     THEN
2941         l_timeout_min := trunc(((p_response_by_date + 1 - 0.0000001) - SYSDATE )
2942                                *  24 * 60 ) ;
2943 
2944         IF l_timeout_min < 1 THEN
2945             l_timeout_min := 1 ; -- Minimum TimeOut One Min
2946         END IF ;
2947 
2948     ELSE
2949 
2950         l_timeout_min := 0 ;
2951 
2952     END IF ;
2953 
2954     -- Set the timeout min to Item Attribute for ntf time out
2955     WF_ENGINE.SetItemAttrNumber( p_item_type
2956                                , p_item_key
2957                                , 'RESPONSE_TIMEOUT'
2958                                , l_timeout_min
2959                                );
2960 
2961 END SetNtfResponseTimeOut ;
2962 
2963 -- This p_required_relative_days version of SetNtfResponseTimeOut
2964 -- is used for Workflow Routing Ntf
2965 PROCEDURE SetNtfResponseTimeOut
2966 (   p_item_type              IN  VARCHAR2
2967  ,  p_item_key               IN  VARCHAR2
2968  ,  p_required_relative_days IN  NUMBER
2969 )
2970 IS
2971 
2972     l_timeout_min    NUMBER ;
2973 
2974 BEGIN
2975 
2976     -- calculate min by timeout date
2977     IF  p_required_relative_days IS NOT NULL
2978     THEN
2979         l_timeout_min := p_required_relative_days *  24 * 60 ;
2980 
2981         IF l_timeout_min < 1 THEN
2982             l_timeout_min := 1 ; -- Minimum TimeOut One Min
2983         END IF ;
2984 
2985     ELSE
2986 
2987         l_timeout_min := 0 ;
2988 
2989     END IF ;
2990 
2991     -- Set the timeout min to Item Attribute for ntf time out
2992     WF_ENGINE.SetItemAttrNumber( p_item_type
2993                                , p_item_key
2994                                , 'RESPONSE_TIMEOUT'
2995                                , l_timeout_min
2996                                );
2997 
2998 END SetNtfResponseTimeOut ;
2999 
3000 
3001 
3002 PROCEDURE SetStepActVotingOption
3003 (   p_item_type           IN  VARCHAR2
3004  ,  p_item_key            IN  VARCHAR2
3005  ,  p_condition_type_code IN  VARCHAR2
3006 )
3007 IS
3008 
3009     l_step_voting_option        VARCHAR2(30) ;
3010     l_yes_percentage            NUMBER ;
3011     l_no_percentage             NUMBER ;
3012 
3013     -- R12B
3014     l_vote_option_for_step_all  VARCHAR2(30) ;
3015     l_route_step_id             NUMBER ;
3016 
3017 BEGIN
3018 
3019 
3020      -- Get Route Step Id
3021      Eng_Workflow_Util.GetRouteStepId
3022      (   p_item_type         => p_item_type
3023       ,  p_item_key          => p_item_key
3024       ,  x_route_step_id     => l_route_step_id
3025      ) ;
3026 
3027 
3028 
3029     -- Set Step Voting Option based on Step Activity Condition
3030     IF  p_condition_type_code = Eng_Workflow_Util.G_ALL THEN
3031 
3032 
3033         -- R12B
3034         -- Need to get Additional Vote Option for All
3035         -- to support Request Response process in Line Notification Workflow.
3036         -- In case of the process (Notifcation is Request Response Notification),
3037         -- we need to wait for the all response until all the notification recipient
3038         -- respond to the notification.
3039         -- By default, REQUEST_RESPONSE process has process level attribute
3040         -- VOTE_OPTION_FOR_STEP_ALL. ( the value is REQUIRE_ALL_VOTES)
3041         -- We will use the option which defined in VOTE_OPTION_FOR_STEP_ALL
3042         -- instead of G_TALLY_ON_EVERY_VOTE
3043         --
3044         GetStepVoteOptionForAllResp( p_step_id => l_route_step_id
3045                                    ,  x_vote_option_for_step_all => l_vote_option_for_step_all
3046                                     ) ;
3047 
3048         IF ( l_vote_option_for_step_all IS NULL
3049              OR (     Eng_Workflow_Util.G_WAIT_FOR_ALL_VOTES <> l_vote_option_for_step_all
3050                   AND Eng_Workflow_Util.G_TALLY_ON_EVERY_VOTE <> l_vote_option_for_step_all
3051                   AND Eng_Workflow_Util.G_REQUIRE_ALL_VOTES <> l_vote_option_for_step_all
3052                  )
3053             )
3054         THEN
3055              l_vote_option_for_step_all := Eng_Workflow_Util.G_TALLY_ON_EVERY_VOTE;
3056 
3057         END IF ;
3058 
3059         l_step_voting_option := l_vote_option_for_step_all ;
3060         -- Bug 5254686
3061         IF ( l_step_voting_option = Eng_Workflow_Util.G_REQUIRE_ALL_VOTES )
3062         THEN
3063 
3064            l_yes_percentage     := NULL ;
3065            l_no_percentage      := NULL  ;
3066 
3067         ELSE
3068 
3069            l_yes_percentage     := 100 ;
3070            l_no_percentage      := 0 ;
3071         END IF ;
3072 
3073     ELSIF p_condition_type_code = Eng_Workflow_Util.G_ONE THEN
3074 
3075         l_step_voting_option := Eng_Workflow_Util.G_TALLY_ON_EVERY_VOTE ;
3076         l_yes_percentage     := 0 ;
3077         l_no_percentage      := 0 ;
3078 
3079     ELSIF p_condition_type_code = Eng_Workflow_Util.G_PEOPLE THEN
3080 
3081         l_step_voting_option := Eng_Workflow_Util.G_PEOPLE;
3082         l_yes_percentage     := 100 ;
3083         l_no_percentage      := 0 ;
3084 
3085 
3086     /* For future ref
3087     ELSIF p_condition_type_code = Eng_Workflow_Util.G_WAIT_ALL THEN
3088 
3089         l_step_voting_option := Eng_Workflow_Util.G_WAIT_FOR_ALL_VOTES ;
3090         l_yes_percentage     := 100 ;
3091         l_no_percentage      := 0 ;
3092     */
3093 
3094 
3095     END IF ;
3096 
3097     -- Set Step Activity Condition to Item Attr
3098     WF_ENGINE.SetItemAttrText( p_item_type
3099                              , p_item_key
3100                              , 'STEP_CONDITION'
3101                              , p_condition_type_code );
3102 
3103 
3104     -- Set Step Activity Voting Option
3105     -- for Notification
3106     WF_ENGINE.SetItemAttrText( p_item_type
3107                              , p_item_key
3108                              , 'STEP_VOTING_OPTION'
3109                              , l_step_voting_option);
3110 
3111 
3112     -- Set Yes response percentage of votes
3113     -- for Notification
3114     WF_ENGINE.SetItemAttrNumber( p_item_type
3115                                , p_item_key
3116                              , 'YES_RESPONSE_PERCENT'
3117                              , l_yes_percentage );
3118 
3119     -- Set No response percentage of votes
3120     -- for Notification
3121     WF_ENGINE.SetItemAttrNumber( p_item_type
3122                                , p_item_key
3123                              , 'NO_RESPONSE_PERCENT'
3124                              , l_no_percentage );
3125 
3126 
3127 
3128 END SetStepActVotingOption ;
3129 
3130 
3131 
3132 -- Get Item Info
3133 PROCEDURE GetItemInfo
3134 (  p_organization_id         IN  NUMBER
3135  , p_item_id                 IN  NUMBER
3136  , p_item_revision_id        IN  NUMBER
3137  , x_item_name               OUT NOCOPY VARCHAR2
3138  , x_item_revision           OUT NOCOPY VARCHAR2
3139  , x_item_revision_label     OUT NOCOPY VARCHAR2
3140 )
3141 IS
3142 
3143     CURSOR c_item_info (p_item_id         NUMBER ,
3144                         p_organization_id NUMBER )
3145     IS
3146           SELECT item.concatenated_segments item_name
3147           FROM   MTL_SYSTEM_ITEMS_KFV item
3148           WHERE item.organization_id  = p_organization_id
3149           AND   item.inventory_item_id = p_item_id ;
3150 
3151 
3152 
3153     CURSOR c_item_rev_info (p_item_id           NUMBER ,
3154                             p_organization_id   NUMBER ,
3155                             p_item_revision_id  NUMBER )
3156     IS
3157           SELECT rev.revision item_revision
3158                , rev.revision_label item_revision_label
3159           FROM   MTL_ITEM_REVISIONS rev
3160           WHERE  rev.organization_id = p_organization_id
3161           AND    rev.inventory_item_id = p_item_id
3162           AND    rev.revision_id = p_item_revision_id ;
3163 
3164 
3165 BEGIN
3166 
3167 
3168     FOR item_rec IN c_item_info ( p_item_id         => p_item_id
3169                                 , p_organization_id => p_organization_id)
3170     LOOP
3171 
3172          x_item_name :=  item_rec.item_name ;
3173 
3174     END LOOP ;
3175 
3176 
3177     IF p_item_revision_id IS NOT NULL THEN
3178 
3179 
3180         FOR item_rev_rec IN c_item_rev_info ( p_item_id          => p_item_id
3181                                             , p_organization_id  => p_organization_id
3182                                             , p_item_revision_id => p_item_revision_id)
3183         LOOP
3184 
3185              x_item_revision :=  item_rev_rec.item_revision ;
3186              x_item_revision_label := item_rev_rec.item_revision_label ;
3187 
3188         END LOOP ;
3189 
3190 
3191     END IF ;
3192 
3193 END GetItemInfo ;
3194 
3195 
3196 -- Get Change Object Item Subject Info
3197 PROCEDURE GetChangeItemSubjectInfo
3198 (  p_change_id               IN  NUMBER
3199  , x_organization_id         OUT NOCOPY NUMBER
3200  , x_item_id                 OUT NOCOPY NUMBER
3201  , x_item_name               OUT NOCOPY VARCHAR2
3202  , x_item_revision_id        OUT NOCOPY NUMBER
3203  , x_item_revision           OUT NOCOPY VARCHAR2
3204  , x_item_revision_label     OUT NOCOPY VARCHAR2
3205 )
3206 IS
3207 
3208     CURSOR c_subj_item(p_change_id NUMBER, p_entity_name VARCHAR2)
3209     IS
3210           -- Modified for 115.10 Case Change
3211           -- SELECT TO_NUMBER(subject.pk2_value) organization_id
3212           --     , TO_NUMBER(subject.pk1_value) item_id
3213           --     , TO_NUMBER(subject.pk3_value) item_revision_id
3214           -- FROM   ENG_CHANGE_LINES subject
3215           --      , FND_OBJECTS          obj
3216           -- WHERE subject.pk1_value IS NOT NULL
3217           -- AND   subject.pk2_value IS NOT NULL
3218           -- AND   subject.sequence_number = -1
3219           -- AND   subject.object_id = obj.object_id
3220           -- AND   obj.obj_name IN ('EGO_ITEM', 'EGO_ITEM_REVISION')
3221           -- AND   subject.change_id = p_change_id ;
3222 
3223           SELECT TO_NUMBER(subject.pk2_value) organization_id
3224                , TO_NUMBER(subject.pk1_value) item_id
3225                , TO_NUMBER(subject.pk3_value) item_revision_id
3226           FROM   ENG_CHANGE_SUBJECTS subject
3227           WHERE subject.pk1_value IS NOT NULL
3228           AND   subject.pk2_value IS NOT NULL
3229           AND   subject.entity_name = p_entity_name
3230           AND   subject.change_line_id IS NULL
3231           AND   subject.change_id = p_change_id ;
3232 
3233     l_item_rev_found BOOLEAN := FALSE ;
3234 
3235 BEGIN
3236 
3237     FOR subj_item_rec IN c_subj_item(p_change_id => p_change_id,
3238                                      p_entity_name => 'EGO_ITEM_REVISION' )
3239     LOOP
3240 
3241          x_organization_id         :=  subj_item_rec.organization_id ;
3242          x_item_id                 :=  subj_item_rec.item_id ;
3243          x_item_revision_id        :=  subj_item_rec.item_revision_id ;
3244 
3245          GetItemInfo( p_organization_id   => x_organization_id ,
3246                       p_item_id           => x_item_id ,
3247                       p_item_revision_id  => x_item_revision_id ,
3248                       x_item_name         => x_item_name ,
3249                       x_item_revision     => x_item_revision ,
3250                       x_item_revision_label => x_item_revision_label ) ;
3251 
3252          l_item_rev_found := TRUE ;
3253 
3254     END LOOP ;
3255 
3256     IF NOT l_item_rev_found
3257     THEN
3258 
3259         FOR subj_item_rec IN c_subj_item(p_change_id => p_change_id,
3260                                          p_entity_name => 'EGO_ITEM' )
3261         LOOP
3262 
3263              x_organization_id         :=  subj_item_rec.organization_id ;
3264              x_item_id                 :=  subj_item_rec.item_id ;
3265              x_item_revision_id        :=  subj_item_rec.item_revision_id ;
3266 
3267              GetItemInfo( p_organization_id   => x_organization_id ,
3268                           p_item_id           => x_item_id ,
3269                           p_item_revision_id  => x_item_revision_id ,
3270                           x_item_name         => x_item_name ,
3271                           x_item_revision     => x_item_revision ,
3272                           x_item_revision_label => x_item_revision_label ) ;
3273 
3274 
3275         END LOOP ;
3276 
3277     END IF ;
3278 
3279 
3280 END GetChangeItemSubjectInfo ;
3281 
3282 
3283 -- Get Change Line Item Subject Info
3284 PROCEDURE GetChangeLineItemSubjectInfo
3285 (  p_change_id               IN  NUMBER
3286  , p_change_line_id          IN  NUMBER
3287  , x_organization_id         OUT NOCOPY NUMBER
3288  , x_item_id                 OUT NOCOPY NUMBER
3289  , x_item_name               OUT NOCOPY VARCHAR2
3290  , x_item_revision_id        OUT NOCOPY NUMBER
3291  , x_item_revision           OUT NOCOPY VARCHAR2
3292  , x_item_revision_label     OUT NOCOPY VARCHAR2
3293 )
3294 IS
3295 
3296     -- Need to modify
3297     CURSOR c_subj_item(p_change_id NUMBER, p_change_line_id NUMBER, p_entity_name VARCHAR2)
3298     IS
3299           -- SELECT TO_NUMBER(subject.pk2_value) organization_id
3300           --      , TO_NUMBER(subject.pk1_value) item_id
3301           --      , TO_NUMBER(subject.pk3_value) item_revision_id
3302           -- FROM   ENG_CHANGE_LINES subject
3303           --      , FND_OBJECTS          obj
3304           -- WHERE subject.pk1_value IS NOT NULL
3305           -- AND   subject.pk2_value IS NOT NULL
3306           -- AND   subject.object_id = obj.object_id
3307           -- AND   obj.obj_name IN ('EGO_ITEM', 'EGO_ITEM_REVISION')
3308           -- AND   subject.change_line_id = p_change_line_id ;
3309 
3310           SELECT TO_NUMBER(subject.pk2_value) organization_id
3311                , TO_NUMBER(subject.pk1_value) item_id
3312                , TO_NUMBER(subject.pk3_value) item_revision_id
3313           FROM   ENG_CHANGE_SUBJECTS subject
3314           WHERE subject.pk1_value IS NOT NULL
3315           AND   subject.pk2_value IS NOT NULL
3316           AND   subject.entity_name = p_entity_name
3317           AND   subject.change_line_id = p_change_line_id
3318           AND   subject.change_id = p_change_id ;
3319 
3320     l_item_rev_found BOOLEAN := FALSE ;
3321 
3322 
3323 BEGIN
3324 
3325     FOR subj_item_rec IN c_subj_item(p_change_id => p_change_id ,
3326                                      p_change_line_id => p_change_line_id ,
3327                                      p_entity_name => 'EGO_ITEM_REVISION' )
3328     LOOP
3329 
3330          x_organization_id         :=  subj_item_rec.organization_id ;
3331          x_item_id                 :=  subj_item_rec.item_id ;
3332          x_item_revision_id        :=  subj_item_rec.item_revision_id ;
3333 
3334 
3335          GetItemInfo( p_organization_id   => x_organization_id ,
3336                       p_item_id           => x_item_id ,
3337                       p_item_revision_id  => x_item_revision_id ,
3338                       x_item_name         => x_item_name ,
3339                       x_item_revision     => x_item_revision ,
3340                       x_item_revision_label => x_item_revision_label ) ;
3341 
3342 
3343     END LOOP ;
3344 
3345     IF NOT l_item_rev_found
3346     THEN
3347 
3348         FOR subj_item_rec IN c_subj_item(p_change_id => p_change_id ,
3349                                          p_change_line_id => p_change_line_id ,
3350                                          p_entity_name => 'EGO_ITEM' )
3351         LOOP
3352 
3353              x_organization_id         :=  subj_item_rec.organization_id ;
3354              x_item_id                 :=  subj_item_rec.item_id ;
3355              x_item_revision_id        :=  subj_item_rec.item_revision_id ;
3356 
3357              GetItemInfo( p_organization_id   => x_organization_id ,
3358                           p_item_id           => x_item_id ,
3359                           p_item_revision_id  => x_item_revision_id ,
3360                           x_item_name         => x_item_name ,
3361                           x_item_revision     => x_item_revision ,
3362                           x_item_revision_label => x_item_revision_label ) ;
3363 
3364 
3365         END LOOP ;
3366 
3367     END IF ;
3368 
3369 
3370 END GetChangeLineItemSubjectInfo ;
3371 
3372 -- Get Lifecycle Phase Display Text
3373 FUNCTION GetChangeLCPhaseDisplayText
3374 (  p_change_id               IN NUMBER
3375  , p_status_type             IN NUMBER
3376  , p_status_code             IN NUMBER
3377  , p_phase_status_type       IN NUMBER
3378  , p_status_type_meaning     IN VARCHAR2
3379  , p_status_code_meaning     IN VARCHAR2
3380 ) RETURN VARCHAR2
3381 IS
3382 BEGIN
3383 
3384     -- Bug Fix 3463308
3385     -- Check if Change Object's STATUS_TYPE and STATUS_TYPE of
3386     -- Change Object's Phase(STATUS_CODE)
3387     -- If it's matched, then Change LC Phase Text
3388     -- is Phase's Meaning
3389     -- Otherwise "<Phase Meaning>(<STATUS_TYPE's meaning>)"
3390     -- e.g "Open(Implementaion in progress)"
3391     IF p_status_type <> p_phase_status_type
3392     THEN
3393 
3394         FND_MESSAGE.SET_NAME('ENG', 'ENG_LC_PHASE_STATUS_CONTEXT') ;
3395         FND_MESSAGE.SET_TOKEN('PHASE', p_status_code_meaning ) ;
3396         FND_MESSAGE.SET_TOKEN('STATUS', p_status_type_meaning) ;
3397         RETURN FND_MESSAGE.GET ;
3398 
3399     ELSE
3400 
3401         RETURN p_status_code_meaning ;
3402 
3403     END IF ;
3404 
3405 
3406 END GetChangeLCPhaseDisplayText ;
3407 
3408 
3409 
3410 -- Get Change Object Info
3411 PROCEDURE GetChangeObjectInfo
3412 (  p_change_id               IN  NUMBER
3413  , x_change_notice           OUT NOCOPY VARCHAR2
3414  , x_organization_id         OUT NOCOPY NUMBER
3415  , x_change_name             OUT NOCOPY VARCHAR2
3416  , x_description             OUT NOCOPY VARCHAR2
3417  , x_change_status           OUT NOCOPY VARCHAR2
3418  , x_change_lc_phase         OUT NOCOPY VARCHAR2
3419  , x_approval_status         OUT NOCOPY VARCHAR2
3420  , x_priority                OUT NOCOPY VARCHAR2
3421  , x_reason                  OUT NOCOPY VARCHAR2
3422  , x_change_managemtent_type OUT NOCOPY VARCHAR2
3423  , x_change_order_type       OUT NOCOPY VARCHAR2
3424  , x_eco_department          OUT NOCOPY VARCHAR2
3425  , x_assignee                OUT NOCOPY VARCHAR2
3426  , x_assignee_company        OUT NOCOPY VARCHAR2
3427 )
3428 IS
3429 
3430 
3431     l_assignee_id         NUMBER ;
3432     l_party_type          VARCHAR2(30) ;
3433     l_change_status_code  NUMBER ;
3434     l_change_status_type  NUMBER ;
3435     l_phase_status_type   NUMBER ;
3436 
3437 BEGIN
3438 
3439     -- Modified for 115.10 Case Change
3440     SELECT eec.change_notice ,
3441            eec.organization_id ,
3442            eec.change_name ,
3443            eec.description ,
3444            ecs.meaning change_status ,
3445            eclf.status_name change_lc_phase,
3446            -- eec.status_type ,
3447            mlu.meaning  approval_status ,
3448            -- eec.approval_status_type ,
3449            -- eec.approval_date ,
3450            -- eec.approval_list_id ,
3451            eec.priority_code priority ,
3452            -- priority.description priority,
3453            eec.reason_code reason,
3454            -- reason.description reason ,
3455            ecmt_tl.type_name change_managemtent_type ,
3456            --  eec.change_mgmt_type_code ,
3457            ecot.type_name change_order_type ,
3458            -- eec.change_order_type_id ,
3459            -- ecot.description change_order_type_description,
3460            hou.name eco_department ,
3461            -- eec.responsible_organization_id
3462            eec.assignee_id ,
3463            eec.status_type ,
3464            eec.status_code ,
3465            eclf.status_type phase_status_type
3466       INTO x_change_notice
3467          , x_organization_id
3468          , x_change_name
3469          , x_description
3470          , x_change_status
3471          , x_change_lc_phase
3472          , x_approval_status
3473          , x_priority
3474          , x_reason
3475          , x_change_managemtent_type
3476          , x_change_order_type
3477          , x_eco_department
3478          , l_assignee_id
3479          , l_change_status_type
3480          , l_change_status_code
3481          , l_phase_status_type
3482       FROM ENG_CHANGE_ORDER_TYPES_TL  ecot,
3483            -- ENG_CHANGE_PRIORITIES      priority,
3484            -- ENG_CHANGE_REASONS         reason,
3485            MFG_LOOKUPS                ecs,
3486            ENG_CHANGE_STATUSES_VL     eclf,
3487            MFG_LOOKUPS                mlu,
3488            HR_ORGANIZATION_UNITS      hou,
3489            ENG_CHANGE_ORDER_TYPES     ecmt,
3490            ENG_CHANGE_ORDER_TYPES_TL  ecmt_tl,
3491            -- ENG_CHANGE_ORDER_TYPES_VL ecmt,
3492            ENG_ENGINEERING_CHANGES    eec
3493      WHERE eec.change_order_type_id = ecot.change_order_type_id
3494      AND   ecot.language = userenv('LANG')
3495      -- AND   eec.priority_code   = priority.eng_change_priority_code(+)
3496      -- AND   priority.organization_id(+)= -1
3497      -- AND   eec.reason_code  =  reason.eng_change_reason_code(+)
3498      -- AND   reason.organization_id(+) = -1
3499      AND   eec.responsible_organization_id = hou.organization_id(+)
3500      AND   ecs.lookup_code  (+)=  eec.status_type
3501      AND   ecs.lookup_type   (+)= 'ECG_ECN_STATUS'
3502      AND   eclf.status_code    =  eec.status_code
3503      AND   mlu.lookup_code   (+)=  eec.approval_status_type
3504      AND   mlu.lookup_type   (+)= 'ENG_ECN_APPROVAL_STATUS'
3505      AND   ecmt_tl.language = userenv('LANG')
3506      AND   ecmt_tl.change_order_type_id = ecmt.change_order_type_id
3507      AND   ecmt.type_classification = 'CATEGORY'
3508      AND   ecmt.change_mgmt_type_code = eec.change_mgmt_type_code
3509      AND   eec.change_id       = p_change_id ;
3510 
3511 
3512      /* Comment Out: THIS SQL modified by Sachin/Mani
3513      SELECT eec.change_notice ,
3514                 eec.organization_id ,
3515                 eec.change_name ,
3516                 eec.description ,
3517                 ecs.status_name  change_status ,
3518                 -- eec.status_type ,
3519                 mlu.meaning  approval_status ,
3520                 -- eec.approval_status_type ,
3521                 -- eec.approval_date ,
3522                 -- eec.approval_list_id ,
3523                 eec.priority_code priority ,
3524                 -- priority.description priority,
3525                 eec.reason_code reason,
3526                 -- reason.description reason ,
3527                 ecmt.name change_managemtent_type ,
3528                 --  eec.change_mgmt_type_code ,
3529                 ecot.change_order_type change_order_type ,
3530                 -- eec.change_order_type_id ,
3531                 -- ecot.description change_order_type_description,
3532                 hou.name eco_department ,
3533                 -- eec.responsible_organization_id
3534                 eec.assignee_id
3535            INTO x_change_notice
3536               , x_organization_id
3537               , x_change_name
3538               , x_description
3539               , x_change_status
3540               , x_approval_status
3541               , x_priority
3542               , x_reason
3543               , x_change_managemtent_type
3544               , x_change_order_type
3545               , x_eco_department
3546               , l_assignee_id
3547            FROM ENG_CHANGE_ORDER_TYPES     ecot,
3548                 -- ENG_CHANGE_PRIORITIES      priority,
3549                 -- ENG_CHANGE_REASONS         reason,
3550                 ENG_CHANGE_STATUSES_TL     ecs,
3551                 MFG_LOOKUPS                mlu,
3552                 HR_ORGANIZATION_UNITS      hou,
3553                 ENG_CHANGE_MGMT_TYPES_TL   ecmt,
3554                 ENG_ENGINEERING_CHANGES    eec
3555           WHERE eec.change_order_type_id = ecot.change_order_type_id
3556           -- AND   eec.priority_code   = priority.eng_change_priority_code(+)
3557           -- AND   priority.organization_id(+)= -1
3558           -- AND   eec.reason_code  =  reason.eng_change_reason_code(+)
3559           -- AND   reason.organization_id(+) = -1
3560           AND   eec.responsible_organization_id = hou.organization_id(+)
3561           AND   ecs.status_code    =  eec.status_type
3562           AND   ecs.language = userenv('LANG')
3563           AND   mlu.lookup_code   (+)=  eec.approval_status_type
3564           AND   mlu.lookup_type   (+)= 'ENG_ECN_APPROVAL_STATUS'
3565           AND   ecmt.language       = userenv('LANG')
3566           AND   ecmt.change_mgmt_type_code = eec.change_mgmt_type_code
3567           AND   eec.change_id       = p_change_id ;
3568      */
3569 
3570 
3571 
3572      x_change_lc_phase := GetChangeLCPhaseDisplayText
3573                           (  p_change_id             => p_change_id
3574                            , p_status_type           => l_change_status_type
3575                            , p_status_code           => l_change_status_code
3576                            , p_phase_status_type     => l_phase_status_type
3577                            , p_status_type_meaning   => x_change_status
3578                            , p_status_code_meaning   => x_change_lc_phase
3579                           ) ;
3580 
3581 
3582      IF l_assignee_id IS NOT NULL THEN
3583 
3584         GetPartyInfo
3585         ( p_party_id          => l_assignee_id
3586         , x_party_name        => x_assignee
3587         , x_party_company     => x_assignee_company
3588         ) ;
3589 
3590      END IF ; -- assignee is not null
3591 
3592 
3593 END GetChangeObjectInfo ;
3594 
3595 
3596 -- Get Change Line Object Info
3597 PROCEDURE GetChangeLineObjectInfo
3598 (  p_change_line_id        IN  NUMBER
3599  , x_change_id             OUT NOCOPY NUMBER
3600  , x_line_sequence_number  OUT NOCOPY NUMBER
3601  , x_line_name             OUT NOCOPY VARCHAR2
3602  , x_line_description      OUT NOCOPY VARCHAR2
3603  , x_line_status           OUT NOCOPY VARCHAR2
3604  , x_line_approval_status  OUT NOCOPY VARCHAR2
3605  , x_line_assignee         OUT NOCOPY VARCHAR2
3606  , x_line_assignee_company OUT NOCOPY VARCHAR2
3607 )
3608 IS
3609 
3610 
3611     l_assignee_id      NUMBER ;
3612     l_party_type       VARCHAR2(30) ;
3613     l_route_type_code  VARCHAR2(30) ;
3614     l_list_dist_status VARCHAR2(80) ;
3615 
3616 BEGIN
3617 
3618     SELECT ecl.change_id ,
3619            ecl.sequence_number ,
3620            ecl.name ,
3621            ecl.description ,
3622            flu.meaning line_status ,
3623            mlu.meaning line_approval_status ,
3624            ecl.assignee_id,
3625            dist_stat_flu.meaning dist_line_status ,
3626            line_wf.route_type_code
3627      INTO  x_change_id
3628          , x_line_sequence_number
3629          , x_line_name
3630          , x_line_description
3631          , x_line_status
3632          , x_line_approval_status
3633          , l_assignee_id
3634          , l_list_dist_status
3635          , l_route_type_code
3636       FROM FND_LOOKUPS          dist_stat_flu,
3637            FND_LOOKUPS          flu,
3638            MFG_LOOKUPS          mlu,
3639            ENG_CHANGE_ROUTES    line_wf,
3640            ENG_CHANGE_LINES_VL  ecl
3641      WHERE line_wf.route_id (+)=  ecl.route_id
3642      AND   dist_stat_flu.lookup_code  (+)=  ecl.status_code
3643      AND   dist_stat_flu.lookup_type  (+)= 'ENG_DIST_LINE_STATUSES'
3644      AND   flu.lookup_code  (+)=  ecl.status_code
3645      AND   flu.lookup_type  (+)= 'ENG_CHANGE_LINE_STATUSES'
3646      AND   mlu.lookup_code  (+)=  ecl.approval_status_type
3647      AND   mlu.lookup_type  (+)= 'ENG_ECN_APPROVAL_STATUS'
3648      AND   ecl.change_line_id = p_change_line_id ;
3649 
3650 
3651      -- R12B for Distribution Line Enh
3652      -- If the Line is attached to Line Workflow
3653      -- Line Status Display Name should be
3654      -- the value defined in lookup type: ENG_DIST_LINE_STATUSES
3655      IF l_route_type_code = Eng_Workflow_Util.G_LINE_RT_TYPE_NOTIFICATION
3656      THEN
3657 
3658           x_line_status := l_list_dist_status;
3659 
3660      END IF ;
3661 
3662 
3663      IF l_assignee_id IS NOT NULL THEN
3664 
3665         GetPartyInfo
3666         ( p_party_id          => l_assignee_id
3667         , x_party_name        => x_line_assignee
3668         , x_party_company     => x_line_assignee_company
3669         ) ;
3670 
3671      END IF ; -- assignee is not null
3672 
3673 END GetChangeLineObjectInfo ;
3674 
3675 
3676 
3677 -- Get Change Line Object Info
3678 PROCEDURE GetDocumentLCInfo
3679 (  p_change_id                 IN  NUMBER
3680  , x_document_id               OUT NOCOPY NUMBER
3681  , x_document_revision_id      OUT NOCOPY NUMBER
3682  , x_document_number           OUT NOCOPY VARCHAR2
3683  , x_document_revision         OUT NOCOPY VARCHAR2
3684  , x_documnet_name             OUT NOCOPY VARCHAR2
3685  , x_document_detail_page_url  OUT NOCOPY VARCHAR2
3686 )
3687 IS
3688 
3689 
3690 BEGIN
3691 
3692      ENG_DOCUMENT_UTIL.Get_Document_Revision_Id
3693      ( p_change_id             =>  p_change_id
3694      , x_document_id           =>  x_document_id
3695      , x_document_revision_id  =>  x_document_revision_id
3696      ) ;
3697 
3698 
3699      IF (x_document_revision_id IS NOT NULL )
3700      THEN
3701          -- Get Dom Document Revision Object Info
3702          ENG_DOCUMENT_UTIL.Get_Document_Rev_Info
3703          ( p_document_revision_id     => x_document_revision_id
3704          , x_document_id              => x_document_id
3705          , x_document_number          => x_document_number
3706          , x_document_revision        => x_document_revision
3707          , x_documnet_name            => x_documnet_name
3708          , x_document_detail_page_url => x_document_detail_page_url
3709          ) ;
3710 
3711      END IF ;
3712 
3713 
3714 END GetDocumentLCInfo ;
3715 
3716 
3717 -- Get Workflow Change Object Info
3718 PROCEDURE GetWFChangeObjectInfo
3719 (  p_item_type               IN  VARCHAR2
3720  , p_item_key                IN  VARCHAR2
3721  , x_change_name             OUT NOCOPY VARCHAR2
3722  , x_description             OUT NOCOPY VARCHAR2
3723  , x_change_status           OUT NOCOPY VARCHAR2
3724  , x_approval_status         OUT NOCOPY VARCHAR2
3725  , x_priority                OUT NOCOPY VARCHAR2
3726  , x_reason                  OUT NOCOPY VARCHAR2
3727  , x_change_managemtent_type OUT NOCOPY VARCHAR2
3728  , x_change_order_type       OUT NOCOPY VARCHAR2
3729  , x_eco_department          OUT NOCOPY VARCHAR2
3730  , x_assignee                OUT NOCOPY VARCHAR2
3731  , x_assignee_company        OUT NOCOPY VARCHAR2
3732 )
3733 IS
3734 
3735 BEGIN
3736 
3737     -- Change Object Name
3738     x_change_name := WF_ENGINE.GetItemAttrText
3739                   (  p_item_type
3740                    , p_item_key
3741                    , 'CHANGE_NAME'
3742                   );
3743 
3744     -- Change Management Type
3745     x_change_managemtent_type := WF_ENGINE.GetItemAttrText
3746                   (  p_item_type
3747                    , p_item_key
3748                    , 'CHANGE_MANAGEMENT_TYPE'
3749                   );
3750 
3751 
3752     -- Description
3753     x_description := WF_ENGINE.GetItemAttrText
3754                   (  p_item_type
3755                    , p_item_key
3756                    , 'DESCRIPTION'
3757                   );
3758 
3759     -- Status
3760     x_change_status := WF_ENGINE.GetItemAttrText
3761                   (  p_item_type
3762                    , p_item_key
3763                    , 'STATUS'
3764                   );
3765 
3766 
3767 
3768     -- Approval Status
3769     x_approval_status := WF_ENGINE.GetItemAttrText
3770                   (  p_item_type
3771                    , p_item_key
3772                    , 'APPROVAL_STATUS'
3773                   );
3774 
3775 
3776     -- Assignee Name
3777     x_assignee := WF_ENGINE.GetItemAttrText
3778                   (  p_item_type
3779                    , p_item_key
3780                    , 'ASSIGNEE_NAME'
3781                   );
3782 
3783 
3784     -- Assignee Company
3785     x_assignee_company := WF_ENGINE.GetItemAttrText
3786                   (  p_item_type
3787                    , p_item_key
3788                    , 'ASSIGNEE_COMPANY'
3789                   );
3790 
3791     -- Priority
3792     x_priority := WF_ENGINE.GetItemAttrText
3793                   (  p_item_type
3794                    , p_item_key
3795                    , 'PRIORITY'
3796                   );
3797 
3798 
3799     -- Reason
3800     x_reason := WF_ENGINE.GetItemAttrText
3801                   (  p_item_type
3802                    , p_item_key
3803                    , 'REASON'
3804                   );
3805 
3806 
3807 END GetWFChangeObjectInfo ;
3808 
3809 
3810 -- Get WF Change Line Object Info
3811 PROCEDURE GetWFChangeLineObjectInfo
3812 (  p_item_type             IN  VARCHAR2
3813  , p_item_key              IN  VARCHAR2
3814  , x_line_sequence_number  OUT NOCOPY NUMBER
3815  , x_line_name             OUT NOCOPY VARCHAR2
3816  , x_line_description      OUT NOCOPY VARCHAR2
3817  , x_line_status           OUT NOCOPY VARCHAR2
3818  , x_line_assignee         OUT NOCOPY VARCHAR2
3819  , x_line_assignee_company OUT NOCOPY VARCHAR2
3820 )
3821 IS
3822 
3823 BEGIN
3824 
3825     -- Line Sequence Number
3826     x_line_sequence_number := WF_ENGINE.GetItemAttrNumber
3827                   (  p_item_type
3828                    , p_item_key
3829                    , 'LINE_SEQUENCE_NUMBER'
3830                   );
3831 
3832     -- Line Object Name
3833     x_line_name := WF_ENGINE.GetItemAttrText
3834                   (  p_item_type
3835                    , p_item_key
3836                    , 'LINE_NAME'
3837                   );
3838 
3839     -- Line Description
3840     x_line_description := WF_ENGINE.GetItemAttrText
3841                   (  p_item_type
3842                    , p_item_key
3843                    , 'LINE_DESCRIPTION'
3844                   );
3845 
3846     -- Line Status
3847     x_line_status := WF_ENGINE.GetItemAttrText
3848                   (  p_item_type
3849                    , p_item_key
3850                    , 'LINE_STATUS'
3851                   );
3852 
3853     -- Line Assignee Name
3854     x_line_assignee := WF_ENGINE.GetItemAttrText
3855                   (  p_item_type
3856                    , p_item_key
3857                    , 'LINE_ASSIGNEE_NAME'
3858                   );
3859 
3860     -- Line Assignee Company
3861     x_line_assignee_company := WF_ENGINE.GetItemAttrText
3862                   (  p_item_type
3863                    , p_item_key
3864                    , 'LINE_ASSIGNEE_COMPANY'
3865                   );
3866 
3867 
3868 END  GetWFChangeLineObjectInfo ;
3869 
3870 PROCEDURE GetActionTypeCode
3871 (  p_action_id                 IN  NUMBER
3872  , x_action_type_code          OUT NOCOPY VARCHAR2
3873 )
3874 IS
3875     CURSOR c_action(p_action_id  NUMBER)
3876     IS
3877           SELECT ecav.ACTION_TYPE
3878           FROM   ENG_CHANGE_ACTIONS ecav
3879           WHERE  ecav.action_id = p_action_id ;
3880 BEGIN
3881 
3882 
3883     FOR l_action_rec IN c_action (p_action_id)
3884     LOOP
3885 
3886         x_action_type_code := l_action_rec.ACTION_TYPE;
3887 
3888     END LOOP ;
3889 
3890 
3891 END GetActionTypeCode ;
3892 
3893 
3894 
3895 PROCEDURE GetActionInfo
3896 (  p_action_id                 IN  NUMBER
3897  , x_action_desc               OUT NOCOPY VARCHAR2
3898  , x_action_party_id           OUT NOCOPY VARCHAR2
3899  , x_action_party_name         OUT NOCOPY VARCHAR2
3900  , x_action_party_company_name OUT NOCOPY VARCHAR2
3901 )
3902 IS
3903 
3904     -- Need to modify
3905     CURSOR c_action(p_action_id  NUMBER)
3906     IS
3907           SELECT ecav.action_id
3908                 --  ,ecav.ACTION_TYPE
3909                , ecav.created_by    created_by
3910                , ecav.creation_date creation_date
3911                , ecav.description   description
3912                , EgoPeople.person_name     person_name
3913                , EgoPeople.company_name     company_name
3914           FROM   ENG_CHANGE_ACTIONS_VL ecav
3915                , EGO_PEOPLE_V EgoPeople
3916           WHERE EgoPeople.user_id = ecav.created_by
3917           AND   ecav.action_id = p_action_id ;
3918 
3919 
3920 BEGIN
3921 
3922 
3923     FOR l_action_rec IN c_action (p_action_id)
3924     LOOP
3925 
3926         x_action_desc               := l_action_rec.description ;
3927         x_action_party_id           := l_action_rec.created_by ;
3928         x_action_party_name         := l_action_rec.person_name ;
3929         x_action_party_company_name := l_action_rec.company_name ;
3930 
3931     END LOOP ;
3932 
3933 
3934 END GetActionInfo ;
3935 
3936 PROCEDURE GetRouteStepInfo
3937 (  p_route_step_id             IN  NUMBER
3938  , x_step_seq_num              OUT NOCOPY NUMBER
3939  , x_required_date             OUT NOCOPY DATE
3940  , x_condition_type            OUT NOCOPY VARCHAR2
3941  , x_step_instrunction         OUT NOCOPY VARCHAR2
3942 )
3943 IS
3944 
3945     CURSOR c_step(p_route_step_id  NUMBER)
3946     IS
3947         SELECT  Step.step_seq_num
3948               , TRUNC(Step.required_date)  required_date
3949               , ConditionTypeLookup.meaning condition_type
3950               , Step.instruction
3951         FROM FND_LOOKUPS               ConditionTypeLookup ,
3952              ENG_CHANGE_ROUTE_STEPS_VL Step
3953         WHERE ConditionTypeLookup.lookup_code = Step.condition_type_code
3954         AND   ConditionTypeLookup.lookup_type = 'ENG_CHANGE_ROUTE_CONDITIONS'
3955         AND   Step.step_id = p_route_step_id ;
3956 
3957 
3958 BEGIN
3959 
3960 
3961     FOR l_step_rec IN c_step (p_route_step_id)
3962     LOOP
3963 
3964         x_step_seq_num         := l_step_rec.step_seq_num ;
3965         x_required_date        := l_step_rec.required_date ;
3966         x_condition_type       := l_step_rec.condition_type ;
3967         x_step_instrunction    := l_step_rec.instruction ;
3968 
3969     END LOOP ;
3970 
3971 END GetRouteStepInfo ;
3972 
3973 
3974 /*************************************************
3975 --  in 115.10, Workflow Routing will not update
3976 -- OBSOLETE
3977 -- PROCEDURE SetChangeApprovalStatus
3978 (   x_return_status        OUT NOCOPY VARCHAR2
3979  ,  x_msg_count            OUT NOCOPY NUMBER
3980  ,  x_msg_data             OUT NOCOPY VARCHAR2
3981  ,  p_item_type            IN  VARCHAR2 := NULL
3982  ,  p_item_key             IN  VARCHAR2 := NULL
3983  ,  p_change_id            IN  NUMBER
3984  ,  p_change_line_id       IN  NUMBER   := NULL
3985  ,  p_sync_lines           IN  NUMBER   := NULL -- Yes: greater than 0
3986  ,  p_wf_user_id           IN  NUMBER
3987  ,  p_new_appr_status_type IN  NUMBER
3988 )
3989 IS
3990 
3991     l_api_name         CONSTANT VARCHAR2(30) := 'SetChangeApprovalStatus';
3992 
3993     l_user_id               NUMBER;
3994     l_login_id              NUMBER;
3995     l_request_id            NUMBER;
3996     l_approval_status       VARCHAR2(80) ;
3997 
3998     l_enable_rev_items_flag VARCHAR2(1) ;
3999     l_enable_tasks_flag     VARCHAR2(1) ;
4000 
4001 
4002     l_header BOOLEAN := TRUE ;
4003 
4004 BEGIN
4005 
4006     x_return_status := FND_API.G_RET_STS_SUCCESS;
4007     l_user_id := p_wf_user_id ;
4008 
4009     SELECT meaning
4010     INTO   l_approval_status
4011     FROM   MFG_LOOKUPS
4012     WHERE  lookup_code   =  p_new_appr_status_type
4013     AND    lookup_type   = 'ENG_ECN_APPROVAL_STATUS' ;
4014 
4015     -- Comment Out
4016     -- Due to some patch dependencies issue
4017     --
4018     -- Call Eng ECO/Change Header Util
4019     -- ENG_Eco_Util.Perform_Approval_Status_Change
4020     -- (   p_change_id            => p_change_id
4021     --  ,  p_user_id              => p_wf_user_id
4022     --  ,  p_approval_status_type => p_new_appr_status_type
4023     --  ,  p_caller_type          => 'WF'
4024     --  ,  x_return_status        => x_return_status
4025     --  ,  x_err_text             => x_msg_data
4026     -- );
4027     --
4028 
4029     IF p_change_line_id IS NOT NULL AND p_change_line_id > 0
4030     THEN
4031 
4032         l_header := FALSE ;
4033 
4034     END IF ;
4035 
4036 
4037     -- The following logic is copied
4038     -- from ENG_Eco_Util.Perform_Approval_Status_Change
4039     -- Approve Change
4040 
4041     -- For Change Object Header
4042     IF l_header THEN
4043 
4044         IF p_new_appr_status_type = 5 THEN
4045 
4046              -- Approve ECO/Change Object
4047              UPDATE eng_engineering_changes
4048                 SET approval_status_type = p_new_appr_status_type ,
4049                     approval_date = sysdate ,
4050                     request_id = l_request_id ,
4051                     last_update_date = SYSDATE ,
4052                     last_updated_by = l_user_id ,
4053                     last_update_login = l_login_id
4054               WHERE change_id = p_change_id ;
4055 
4056 
4057               GetEnableChildFlags
4058               (  p_change_id            => p_change_id
4059                , x_enable_rev_items_flag => l_enable_rev_items_flag
4060                , x_enable_tasks_flag     => l_enable_tasks_flag
4061               ) ;
4062 
4063 
4064              --
4065              -- If this change object category enables Rev Items Child
4066              -- we will update status to Scheduled automatically
4067              IF l_enable_rev_items_flag = 'Y'
4068              THEN
4069 
4070                  -- Set Open Rev Item to Scheduled
4071                  UPDATE eng_revised_items
4072                     SET status_type = 4 ,  -- Set Rev Item Status: Scheduled
4073                         request_id = l_request_id ,
4074                         last_update_date = SYSDATE ,
4075                         last_updated_by = l_user_id ,
4076                         last_update_login = l_login_id
4077                   WHERE change_id = p_change_id
4078                     AND status_type = 1;  -- Rev Item Status: Open
4079 
4080 
4081                  -- If ECO is Open, Set Status to Scheduled (bug 2307416)
4082                  UPDATE eng_engineering_changes
4083                     SET status_type = 4 ,    -- Scheduled
4084                         request_id = l_request_id ,
4085                         last_update_date = SYSDATE ,
4086                         last_updated_by = l_user_id ,
4087                         last_update_login = l_login_id
4088                   WHERE change_id = p_change_id
4089                     AND status_type = 1;   -- Open
4090 
4091 
4092              END IF ;
4093 
4094          -- In case we need paticular business logic, put here
4095          -- Reject Change, Processing error or Timeout
4096          -- ELSIF p_new_appr_status_type IN (4, 7, 8)  THEN
4097 
4098 
4099              -- Reject ECO/Change Object or set Processing Error
4100              -- UPDATE eng_engineering_changes
4101                 -- SET approval_status_type = p_new_appr_status_type ,
4102                 --     approval_date = NULL ,
4103                 --     request_id = l_request_id ,
4104                 --     last_update_date = SYSDATE ,
4105                 --     last_updated_by = l_user_id ,
4106                 --     last_update_login = l_login_id
4107              --  WHERE change_id = p_change_id ;
4108          --
4109 
4110          -- Others
4111         ELSE
4112 
4113              -- Update Approval Status
4114              UPDATE eng_engineering_changes
4115                 SET approval_status_type = p_new_appr_status_type,
4116                     approval_date = NULL ,
4117                     approval_request_date = DECODE(p_new_appr_status_type
4118                                                  , Eng_Workflow_Util.G_REQUESTED
4119                                                  , sysdate
4120                                                  , approval_request_date) ,
4121                     request_id = l_request_id ,
4122                     last_update_date = SYSDATE ,
4123                     last_updated_by = l_user_id ,
4124                     last_update_login = l_login_id
4125               WHERE change_id = p_change_id ;
4126 
4127 
4128         END IF ;
4129 
4130 
4131         --
4132         -- Set New Approval Status to Item Attr
4133         --
4134         IF p_item_type IS NOT NULL AND p_item_key IS NOT NULL
4135         THEN
4136 
4137             WF_ENGINE.SetItemAttrText( p_item_type
4138                                      , p_item_key
4139                                      , 'APPROVAL_STATUS'
4140                                      , l_approval_status );
4141 
4142         END IF ;
4143 
4144 
4145         IF p_sync_lines > 0 THEN
4146 
4147             -- Sync child line approval status
4148             Eng_Workflow_Util.SyncLineApprovalStatus
4149            (  x_return_status        => x_return_status
4150            ,  x_msg_count            => x_msg_count
4151            ,  x_msg_data             => x_msg_data
4152            ,  p_change_id            => p_change_id
4153            ,  p_wf_user_id           => p_wf_user_id
4154            ,  p_header_appr_status_type => p_new_appr_status_type
4155            ) ;
4156 
4157 
4158         END IF ;
4159 
4160     -- For Change Object Line
4161     ELSE
4162 
4163         IF p_new_appr_status_type = 5 THEN
4164 
4165              -- Approve Change Line
4166              UPDATE eng_change_lines
4167                 SET approval_status_type = p_new_appr_status_type ,
4168                     approval_date = sysdate ,
4169                     request_id = l_request_id ,
4170                     last_update_date = SYSDATE ,
4171                     last_updated_by = l_user_id ,
4172                     last_update_login = l_login_id
4173               WHERE change_line_id = p_change_line_id ;
4174 
4175 
4176          -- In case we need paticular business logic, put here
4177          -- Reject Change, Processing error or Timeout
4178          -- ELSIF p_new_appr_status_type IN (4, 7, 8)  THEN
4179 
4180 
4181              -- Reject ECO/Change Object or set Processing Error
4182              -- UPDATE eng_change_lines
4183              --    SET approval_status_type = p_new_appr_status_type ,
4184              --        approval_date = NULL ,
4185              --        request_id = l_request_id ,
4186              --        last_update_date = SYSDATE ,
4187              --        last_updated_by = l_user_id ,
4188              --        last_update_login = l_login_id
4189              --  WHERE change_line_id = p_change_line_id ;
4190          --
4191 
4192          -- Others
4193         ELSE
4194 
4195              -- Update Approval Status
4196              UPDATE eng_change_lines
4197                 SET approval_status_type = p_new_appr_status_type,
4198                     approval_date = NULL ,
4199                     approval_request_date = DECODE(p_new_appr_status_type
4200                                                  , Eng_Workflow_Util.G_REQUESTED
4201                                                  , sysdate
4202                                                  , approval_request_date) ,
4203                     request_id = l_request_id ,
4204                     last_update_date = SYSDATE ,
4205                     last_updated_by = l_user_id ,
4206                     last_update_login = l_login_id
4207               WHERE change_line_id = p_change_line_id ;
4208 
4209 
4210         END IF ;
4211 
4212         --
4213         -- Set New Approval Status to Item Attr
4214         --
4215         IF p_item_type IS NOT NULL AND p_item_key IS NOT NULL
4216         THEN
4217 
4218             WF_ENGINE.SetItemAttrText( p_item_type
4219                                      , p_item_key
4220                                      , 'LINE_APPROVAL_STATUS'
4221                                      , l_approval_status );
4222 
4223         END IF ;
4224 
4225 
4226 
4227     END IF ; -- Header or Line
4228 
4229 EXCEPTION
4230     WHEN OTHERS THEN
4231 
4232 IF g_debug_flag THEN
4233    Write_Debug('When Others in SetChangeApprovalStatus ' || SQLERRM );
4234 END IF ;
4235 
4236     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
4237     IF  FND_MSG_PUB.Check_Msg_Level
4238       (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
4239     THEN
4240             FND_MSG_PUB.Add_Exc_Msg
4241               ( G_PKG_NAME        ,
4242                 l_api_name
4243             );
4244     END IF;
4245 
4246 
4247 END SetChangeApprovalStatus ;
4248 *************************************************/
4249 
4250 
4251 /*************************************************
4252 -- OBSOLETE in 115.10
4253 PROCEDURE SyncLineApprovalStatus
4254 (   x_return_status           OUT NOCOPY VARCHAR2
4255  ,  x_msg_count               OUT NOCOPY NUMBER
4256  ,  x_msg_data                OUT NOCOPY VARCHAR2
4257  ,  p_change_id               IN  NUMBER
4258  ,  p_wf_user_id              IN  NUMBER
4259  ,  p_header_appr_status_type IN  NUMBER
4260 )
4261 IS
4262 
4263     l_api_name         CONSTANT VARCHAR2(30) := 'SyncLineApprovalStatus';
4264 
4265     l_msg_count         NUMBER ;
4266     l_msg_data          VARCHAR2(2000) ;
4267     l_return_status     VARCHAR2(1) ;
4268 
4269     l_updatable_flag    BOOLEAN;
4270 
4271     --
4272     -- Select lines those approval status should be syncronized with Header
4273     -- Line Approval Status: not approved or requested
4274     --
4275     CURSOR  c_lines  (p_change_id NUMBER)
4276     IS
4277         SELECT ecl.change_line_id
4278           FROM ENG_CHANGE_LINES  ecl
4279              -- , ENG_CHANGE_ROUTES ecr
4280          WHERE  ( ecl.approval_status_type <> Eng_Workflow_Util.G_APPROVED
4281                  AND ecl.approval_status_type <> Eng_Workflow_Util.G_REQUESTED )
4282            -- AND  ( ecl.status_code <> Eng_Workflow_Util.G_CL_COMPLETED
4283            --    AND ecl.status_code <> Eng_Workflow_Util.G_CL_CANCELLED )
4284            AND ecl.sequence_number <> -1
4285            AND ecl.change_type_id <> -1
4286            -- AND ecl.parent_line_id IS NULL
4287            -- AND ecr.status_code = Eng_Workflow_Util.G_RT_NOT_STARTED
4288            -- AND ecl.route_id  = ecr.route_id
4289            AND ecl.change_id = p_change_id ;
4290 
4291 BEGIN
4292 
4293     --  Initialize API return status to success
4294     l_return_status := FND_API.G_RET_STS_SUCCESS;
4295     x_return_status := FND_API.G_RET_STS_SUCCESS;
4296 
4297 
4298     -- Get Lines for this Header
4299     FOR l_line_rec IN c_lines (p_change_id)
4300     LOOP
4301 
4302         -- Initializse updateable flag for this line approval status
4303         l_updatable_flag := TRUE ;
4304 
4305         --
4306         -- Currently there is no paticular condition
4307         --
4308 
4309         IF l_updatable_flag THEN
4310 
4311             -- Set Approval Status
4312             Eng_Workflow_Util.SetChangeApprovalStatus
4313             (  x_return_status        => l_return_status
4314             ,  x_msg_count            => l_msg_count
4315             ,  x_msg_data             => l_msg_data
4316             ,  p_item_type            => null
4317             ,  p_item_key             => null
4318             ,  p_change_id            => p_change_id
4319             ,  p_change_line_id       => l_line_rec.change_line_id
4320             ,  p_wf_user_id           => p_wf_user_id
4321             ,  p_new_appr_status_type => p_header_appr_status_type
4322             ) ;
4323 
4324             IF l_return_status <>  FND_API.G_RET_STS_SUCCESS
4325             THEN
4326 
4327                  x_return_status := l_return_status ;
4328 
4329             END IF ;
4330 
4331         END IF ;
4332 
4333     END LOOP ;
4334 
4335 
4336 EXCEPTION
4337     WHEN OTHERS THEN
4338 
4339 IF g_debug_flag THEN
4340    Write_Debug('When Others in SyncLineApprovalStatus ' || SQLERRM );
4341 END IF ;
4342 
4343     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
4344     IF  FND_MSG_PUB.Check_Msg_Level
4345       (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
4346     THEN
4347             FND_MSG_PUB.Add_Exc_Msg
4348               ( G_PKG_NAME        ,
4349                 l_api_name
4350             );
4351     END IF;
4352 
4353 END SyncLineApprovalStatus ;
4354 *************************************************/
4355 
4356 
4357 PROCEDURE SetRouteStatus
4358 (   p_item_type         IN  VARCHAR2
4359  ,  p_item_key          IN  VARCHAR2
4360  ,  p_wf_user_id        IN  NUMBER
4361  ,  p_route_id          IN  NUMBER
4362  ,  p_new_status_code   IN  VARCHAR2
4363  ,  p_init_route        IN  VARCHAR2 := FND_API.G_FALSE
4364  ,  p_change_id         IN  NUMBER   := NULL
4365  ,  p_change_line_id    IN  NUMBER   := NULL
4366 )
4367 IS
4368 
4369     l_set_start_date_flag NUMBER := 0 ;
4370     l_set_end_date_flag   NUMBER := 0 ;
4371     l_set_rev             NUMBER := 0 ;
4372     l_change_revision     VARCHAR2(10) ;
4373 
4374     -- R12B
4375     l_dist_line_ntf_wf_flag    BOOLEAN ;
4376     l_dist_line_status_code    VARCHAR2(30) ;
4377 
4378     l_line_stat_chg_act_id     NUMBER ;
4379     l_line_stat_chg_wf_key     VARCHAR2(240) ;
4380     l_return_status            VARCHAR2(1);
4381     l_msg_count                NUMBER;
4382     l_msg_data                 VARCHAR2(3000);
4383 
4384 BEGIN
4385 
4386 
4387 
4388 IF g_debug_flag THEN
4389    Write_Debug('Set Route Status . . .');
4390 END IF ;
4391 
4392 
4393     IF p_new_status_code = Eng_Workflow_Util.G_RT_IN_PROGRESS
4394     THEN
4395 
4396         l_set_start_date_flag := 1 ;
4397 
4398     ELSIF p_new_status_code IN ( Eng_Workflow_Util.G_RT_REJECTED
4399                                , Eng_Workflow_Util.G_RT_APPROVED
4400                                , Eng_Workflow_Util.G_RT_COMPLETED
4401                                , Eng_Workflow_Util.G_RT_TIME_OUT
4402                                , Eng_Workflow_Util.G_RT_ABORTED )
4403     THEN
4404 
4405         l_set_end_date_flag := 1 ;
4406 
4407     END IF ;
4408 
4409 
4410     -- Check if this call is to initialize Route Process
4411     IF FND_API.To_Boolean( p_init_route )
4412     AND p_change_id IS NOT NULL
4413     AND p_change_id > 0
4414     THEN
4415         -- Get Current Change Revision
4416         l_set_rev := 1 ;
4417         GetChangeCurrentRev( p_change_id => p_change_id
4418                            , x_revision => l_change_revision  ) ;
4419 IF g_debug_flag THEN
4420    Write_Debug('Got current revision: ' || l_change_revision );
4421 END IF ;
4422 
4423 
4424     END IF;
4425 
4426 IF g_debug_flag THEN
4427    Write_Debug('Updating Route Table ... Route Id: ' || to_Char(p_route_id) );
4428 END IF ;
4429 
4430 
4431     update ENG_CHANGE_ROUTES set
4432       OWNER_ID = DECODE(l_set_start_date_flag, 1, p_wf_user_id, OWNER_ID) ,
4433       WF_ITEM_TYPE = p_item_type ,
4434       WF_ITEM_KEY = p_item_key,
4435       STATUS_CODE = p_new_status_code ,
4436       ROUTE_START_DATE = DECODE(l_set_start_date_flag, 1, SYSDATE, ROUTE_START_DATE),
4437       ROUTE_END_DATE = DECODE(l_set_end_date_flag, 1, SYSDATE, ROUTE_END_DATE),
4438       LAST_UPDATE_DATE = SYSDATE,
4439       LAST_UPDATED_BY = p_wf_user_id,
4440       LAST_UPDATE_LOGIN = '',
4441       CHANGE_REVISION = DECODE(l_set_rev, 1, l_change_revision, CHANGE_REVISION)
4442     where ROUTE_ID = p_route_id ;
4443 
4444     if (sql%notfound) then
4445         raise no_data_found;
4446     end if;
4447 
4448 
4449     -- R12B
4450     -- Check If this is Line Notification Workflow Routing
4451     -- Need to sync up with Line Status automatically
4452     --
4453     l_dist_line_ntf_wf_flag := FALSE ;
4454     IF ( Eng_Workflow_Util.Is_Line_Ntf_WF(p_route_id => p_route_id))
4455     THEN
4456 
4457 IF g_debug_flag THEN
4458    Write_Debug('Set Route Status for Line Notification Workflow Routing  Flag. . .') ;
4459 END IF ;
4460         l_dist_line_ntf_wf_flag := TRUE ;
4461 
4462     END IF ;
4463 
4464 
4465     IF (l_dist_line_ntf_wf_flag) THEN
4466 
4467         l_dist_line_status_code := Eng_Workflow_Util.ConvNtfWFStatToDistLNStat
4468                           ( p_route_status_code =>  p_new_status_code
4469                           , p_convert_type      =>  'WF_PROCESS' ) ;
4470 
4471 
4472         -- 1. Update Line Status
4473 IF g_debug_flag THEN
4474    Write_Debug('Updating Line Status : ' || l_dist_line_status_code || ' for Line ' || to_char(p_change_line_id) );
4475 END IF ;
4476 
4477 
4478         IF (p_change_line_id IS NOT NULL AND p_change_line_id > 0 )
4479         THEN
4480             update ENG_CHANGE_LINES set
4481               STATUS_CODE = l_dist_line_status_code ,
4482               LAST_UPDATE_DATE = SYSDATE,
4483               LAST_UPDATED_BY = p_wf_user_id,
4484               LAST_UPDATE_LOGIN = ''
4485             where ROUTE_ID = p_route_id
4486             and   CHANGE_LINE_ID = p_change_line_id;
4487 
4488             if (sql%notfound) then
4489               raise no_data_found;
4490             end if;
4491 
4492 
4493             -- 2. Create Line Status Action Log
4494 IF g_debug_flag THEN
4495    Write_Debug('Create Line Status Action Log. . ..  '  );
4496 END IF ;
4497 
4498             ENG_CHANGE_ACTIONS_UTIL.Create_Change_Action
4499             (  p_api_version           => 1.0
4500              , x_return_status         => l_return_status
4501              , x_msg_count             => l_msg_count
4502              , x_msg_data              => l_msg_data
4503              , p_init_msg_list         => FND_API.G_FALSE
4504              , p_commit                => FND_API.G_FALSE
4505              , p_action_type           => Eng_Workflow_Util.G_LINE_ACT_CHG_STATUS
4506              , p_object_name           => Eng_Workflow_Util.G_ENG_CHANGE_LINE
4507              , p_object_id1            => p_change_id
4508              , p_object_id2            => p_change_line_id
4509              , p_object_id3            => NULL
4510              , p_object_id4            => NULL
4511              , p_object_id5            => NULL
4512              , p_parent_action_id      => NULL
4513              , p_action_date           => SYSDATE
4514              , p_change_description    => NULL
4515              , p_user_id               => p_wf_user_id
4516              , p_api_caller            => G_WF_CALL
4517              , p_status_code           => l_dist_line_status_code
4518              , x_change_action_id      => l_line_stat_chg_act_id
4519             );
4520 
4521 
4522 IF g_debug_flag THEN
4523    Write_Debug('After Creating Line Status Action Log: return status ' ||  l_return_status
4524                                                                        || '- Act Id:' || to_char(l_line_stat_chg_act_id) );
4525 END IF ;
4526 
4527             IF l_return_status <> FND_API.G_RET_STS_SUCCESS
4528             THEN
4529                 RAISE FND_API.G_EXC_ERROR ;
4530             END IF ;
4531 
4532 
4533             -- 3. Start Line Status Change Workflow
4534 IF g_debug_flag THEN
4535    Write_Debug('Start Line Status Change Workflow. . ..  '  );
4536 END IF ;
4537 
4538             -- Create and Start Line Status Change Workflow to send Resp FYI ntf
4539             Eng_Workflow_Util.StartWorkflow
4540             (   p_api_version       =>       1.0
4541              ,  p_init_msg_list     =>       FND_API.G_FALSE
4542              ,  p_commit            =>       FND_API.G_FALSE
4543              ,  p_validation_level  =>       FND_API.G_VALID_LEVEL_FULL
4544              ,  x_return_status     =>       l_return_status
4545              ,  x_msg_count         =>       l_msg_count
4546              ,  x_msg_data          =>       l_msg_data
4547              ,  p_item_type         =>       Eng_Workflow_Util.G_CHANGE_LINE_ACTION_ITEM_TYPE
4548              ,  x_item_key          =>       l_line_stat_chg_wf_key
4549              ,  p_process_name      =>       Eng_Workflow_Util.G_STATUS_CHANGE_PROC
4550              ,  p_change_id         =>       p_change_id
4551              ,  p_change_line_id    =>       p_change_line_id
4552              ,  p_wf_user_id        =>       p_wf_user_id
4553              ,  p_host_url          =>       NULL
4554              ,  p_action_id         =>       l_line_stat_chg_act_id
4555              ,  p_route_id          =>       0
4556              ,  p_route_step_id     =>       0
4557              ,  p_debug             =>       FND_API.G_FALSE
4558              ,  p_output_dir        =>       NULL
4559              ,  p_debug_filename    =>       'Eng_LineStatChg_Start.log'
4560             ) ;
4561 
4562 IF g_debug_flag THEN
4563    Write_Debug('Starting Line Status Change Workflow: return status ' ||  l_return_status
4564                                                                       || '- Item Key:' || l_line_stat_chg_wf_key);
4565 END IF ;
4566 
4567 
4568 IF g_debug_flag THEN
4569    Write_Debug('After Starting Line Status Change Workflow. . ..  '  );
4570 END IF ;
4571        END IF ; -- Line Id is not null
4572 
4573 
4574     END IF ; -- l_dist_line_ntf_wf_flag is TRUE
4575 
4576 
4577 
4578 END SetRouteStatus ;
4579 
4580 
4581 PROCEDURE SetRouteStepStatus
4582 (   p_item_type         IN  VARCHAR2
4583  ,  p_item_key          IN  VARCHAR2
4584  ,  p_wf_user_id        IN  NUMBER
4585  ,  p_route_id          IN  NUMBER
4586  ,  p_route_step_id     IN  NUMBER
4587  ,  p_new_status_code   IN  VARCHAR2
4588 )
4589 IS
4590 
4591     l_set_start_date_flag NUMBER ;
4592     l_set_end_date_flag   NUMBER ;
4593     l_required_date       DATE ;
4594 
4595     -- R12B
4596     l_default_assignee_resp  VARCHAR2(30) ;
4597 
4598 BEGIN
4599 
4600     -- Init Vars
4601     l_set_start_date_flag := 0 ;
4602     l_set_end_date_flag   := 0 ;
4603 
4604 
4605     IF p_new_status_code = Eng_Workflow_Util.G_RT_IN_PROGRESS
4606     THEN
4607 
4608         l_set_start_date_flag := 1 ;
4609         l_required_date := GetStepRequiredDate(p_step_id => p_route_step_id) ;
4610 
4611     ELSIF p_new_status_code IN ( Eng_Workflow_Util.G_RT_REJECTED
4612                                , Eng_Workflow_Util.G_RT_APPROVED
4613                                , Eng_Workflow_Util.G_RT_COMPLETED
4614                                , Eng_Workflow_Util.G_RT_TIME_OUT)
4615     THEN
4616 
4617         l_set_end_date_flag := 1 ;
4618 
4619     END IF ;
4620 
4621     update ENG_CHANGE_ROUTE_STEPS set
4622       WF_ITEM_TYPE = p_item_type ,
4623       WF_ITEM_KEY = p_item_key,
4624       STEP_STATUS_CODE = p_new_status_code,
4625       STEP_START_DATE = DECODE(l_set_start_date_flag, 1, SYSDATE,STEP_START_DATE),
4626       STEP_END_DATE = DECODE(l_set_end_date_flag, 1, SYSDATE,STEP_END_DATE),
4627       REQUIRED_DATE = DECODE(l_set_start_date_flag, 1, l_required_date, REQUIRED_DATE) ,
4628       LAST_UPDATE_DATE = SYSDATE,
4629       LAST_UPDATED_BY = p_wf_user_id,
4630       LAST_UPDATE_LOGIN = ''
4631     where STEP_ID = p_route_step_id ;
4632 
4633     if (sql%notfound) then
4634         raise no_data_found;
4635     end if;
4636 
4637 
4638     IF p_new_status_code = Eng_Workflow_Util.G_RT_IN_PROGRESS
4639     THEN
4640 
4641           -- R12B
4642           -- Check If this is Line Notification Workflow Routing
4643           -- Need to update assignee response code 'Not Received'
4644           --
4645           IF ( p_item_type = Eng_Workflow_Util.G_CHANGE_ROUTE_LINE_STEP_TYPE
4646                AND Eng_Workflow_Util.Is_Line_Ntf_WF(p_route_id => p_route_id)
4647              )
4648           THEN
4649 
4650 IF g_debug_flag THEN
4651     Write_Debug('Calling GetStepDefaultRespCode  ' ) ;
4652 END IF ;
4653 
4654               Eng_Workflow_Util.GetStepDefaultRespCode
4655               (  p_step_id  => p_route_step_id
4656               ,  x_default_resp_code  => l_default_assignee_resp
4657               ) ;
4658 
4659 IF g_debug_flag THEN
4660     Write_Debug('Get Route Assignee Response : ' || l_default_assignee_resp ) ;
4661 END IF ;
4662 
4663           ELSE
4664 
4665               l_default_assignee_resp := Eng_Workflow_Util.G_RT_SUBMITTED ;
4666 
4667           END IF ;
4668 
4669 
4670 
4671          update ENG_CHANGE_ROUTE_PEOPLE set
4672            response_code = l_default_assignee_resp,
4673            last_update_date = SYSDATE ,
4674            last_updated_by = p_wf_user_id,
4675            last_update_login = ''
4676          where step_id = p_route_step_id
4677          and   assignee_id <> -1
4678          and   response_code IS NULL ;
4679 
4680     ELSIF p_new_status_code IN ( Eng_Workflow_Util.G_RT_REJECTED
4681                                , Eng_Workflow_Util.G_RT_APPROVED
4682                                , Eng_Workflow_Util.G_RT_COMPLETED
4683                                , Eng_Workflow_Util.G_RT_TIME_OUT
4684                                , Eng_Workflow_Util.G_RT_ABORTED
4685                                )
4686     THEN
4687 
4688          update ENG_CHANGE_ROUTE_PEOPLE set
4689            response_code = '',
4690            last_update_date = SYSDATE ,
4691            last_updated_by = p_wf_user_id,
4692            last_update_login = ''
4693          where step_id = p_route_step_id
4694          and   assignee_id <> -1
4695          and   ( response_code = Eng_Workflow_Util.G_RT_SUBMITTED
4696                OR response_code = Eng_Workflow_Util.G_RT_NOT_RECEIVED ) ;
4697 
4698     END IF ;
4699 
4700 END SetRouteStepStatus ;
4701 
4702 
4703 
4704 PROCEDURE GetRouteStepStatus
4705 (   p_item_type         IN  VARCHAR2
4706  ,  p_item_key          IN  VARCHAR2
4707  ,  p_route_step_id     IN  NUMBER
4708  ,  x_status_code       OUT NOCOPY VARCHAR2
4709 )
4710 IS
4711 
4712 
4713     CURSOR  c_step (p_route_step_id NUMBER)
4714     IS
4715       SELECT step_status_code
4716         FROM ENG_CHANGE_ROUTE_STEPS
4717        WHERE step_id = p_route_step_id ;
4718 
4719     recinfo c_step%rowtype;
4720 
4721 
4722 BEGIN
4723 
4724     -- Get Next Route Step Info
4725     OPEN c_step(p_route_step_id => p_route_step_id) ;
4726     FETCH c_step into recinfo;
4727     IF (c_step%notfound) THEN
4728         CLOSE c_step ;
4729         RAISE no_data_found;
4730 
4731     END IF;
4732 
4733     IF (c_step%ISOPEN) THEN
4734 
4735        CLOSE c_step ;
4736 
4737     END IF ;
4738 
4739 
4740     x_status_code := recinfo.step_status_code ;
4741 
4742 END GetRouteStepStatus ;
4743 
4744 
4745 PROCEDURE SetAttributes
4746 (   x_return_status     OUT NOCOPY VARCHAR2
4747  ,  x_msg_count         OUT NOCOPY NUMBER
4748  ,  x_msg_data          OUT NOCOPY VARCHAR2
4749  ,  p_item_type         IN  VARCHAR2
4750  ,  p_item_key          IN  VARCHAR2
4751  ,  p_process_name      IN  VARCHAR2
4752  ,  p_change_id         IN OUT NOCOPY  NUMBER
4753  ,  p_change_line_id    IN  NUMBER    := NULL
4754  ,  p_wf_user_id        IN  NUMBER
4755  ,  p_wf_user_role      IN  VARCHAR2  := NULL
4756  ,  p_host_url          IN  VARCHAR2
4757  ,  p_action_id         IN  NUMBER    := NULL
4758  ,  p_adhoc_party_list  IN  VARCHAR2  := NULL
4759  ,  p_route_id          IN  NUMBER    := NULL
4760  ,  p_route_step_id     IN  NUMBER    := NULL
4761  ,  p_parent_item_type  IN  VARCHAR2  := NULL
4762  ,  p_parent_item_key   IN  VARCHAR2  := NULL
4763  ,  p_object_name       IN  VARCHAR2  := NULL
4764  ,  p_object_id1        IN  NUMBER    := NULL
4765  ,  p_object_id2        IN  NUMBER    := NULL
4766  ,  p_object_id3        IN  NUMBER    := NULL
4767  ,  p_object_id4        IN  NUMBER    := NULL
4768  ,  p_object_id5        IN  NUMBER    := NULL
4769  ,  p_parent_object_name IN  VARCHAR2  := NULL
4770  ,  p_parent_object_id1  IN  NUMBER    := NULL
4771 )
4772 IS
4773 
4774     l_api_name         CONSTANT VARCHAR2(30) := 'SetAttributes';
4775 
4776     -- PL/SQL Table Type Column Datatype Definition
4777     -- PL/SQL Table Type     Column DataType Definition
4778     -- WF_ENGINE.NameTabTyp  Wf_Item_Attribute_Values.NAME%TYPE
4779     -- WF_ENGINE.TextTabTyp  Wf_Item_Attribute_Values.TEXT_VALUE%TYPE
4780     -- WF_ENGINE.NumTabTyp   Wf_Item_Attribute_Values.NUMBER_VALUE%TYPE
4781     -- WF_ENGINE.DateTabTyp  Wf_Item_Attribute_Values.DATE_VALUE%TYPE
4782 
4783     l_text_attr_name_tbl   WF_ENGINE.NameTabTyp;
4784     l_text_attr_value_tbl  WF_ENGINE.TextTabTyp;
4785 
4786     l_num_attr_name_tbl    WF_ENGINE.NameTabTyp;
4787     l_num_attr_value_tbl   WF_ENGINE.NumTabTyp;
4788 
4789     l_date_attr_name_tbl   WF_ENGINE.NameTabTyp;
4790     l_date_attr_value_tbl  WF_ENGINE.DateTabTyp;
4791 
4792     I PLS_INTEGER ;
4793 
4794     l_change_id                 NUMBER ;
4795     l_change_notice             VARCHAR2(10) ;
4796     l_organization_id           NUMBER ;
4797     l_organization_code         VARCHAR2(3) ;
4798     l_change_managemtent_type   VARCHAR2(80) ;
4799     l_base_cm_type_code         VARCHAR2(30) ;
4800     l_change_name               VARCHAR2(240) ;
4801     l_description               VARCHAR2(2000) ;
4802     l_change_order_type         VARCHAR2(80) ;
4803     l_organization_name         VARCHAR2(60) ;
4804     l_eco_department            VARCHAR2(60) ;
4805     l_change_status             VARCHAR2(80) ;
4806     l_change_lc_phase           VARCHAR2(80) ;
4807     l_approval_status           VARCHAR2(80) ;
4808     l_priority                  VARCHAR2(50) ;
4809     l_reason                    VARCHAR2(50) ;
4810     l_assignee                  VARCHAR2(360) ;
4811     l_assignee_company          VARCHAR2(360) ;
4812     l_wf_user_role              VARCHAR2(320) ;
4813     l_message_text_body         VARCHAR2(4000) ;
4814     l_message_html_body         VARCHAR2(4000) ;
4815     l_attachments               VARCHAR2(240) ;
4816     l_line_attachments          VARCHAR2(240) ;
4817     l_default_novalue           VARCHAR2(2000) ;
4818     l_host_url                  VARCHAR2(256) ;
4819     l_action_type_msg           VARCHAR2(360) ;
4820     l_action_type_code          VARCHAR2(30) ;
4821     l_wf_sig_policy             VARCHAR2(30) ;
4822 
4823     l_line_sequence_number      NUMBER ;
4824     l_line_name                 VARCHAR2(240) ;
4825     l_line_description          VARCHAR2(4000) ;
4826     l_line_status               VARCHAR2(80) ;
4827     l_line_approval_status      VARCHAR2(80) ;
4828     l_line_assignee             VARCHAR2(360) ;
4829     l_line_assignee_company     VARCHAR2(360) ;
4830 
4831 
4832     l_change_detail_url         VARCHAR2(800) ;
4833     l_change_line_detail_url    VARCHAR2(800) ;
4834     l_change_subj_detail_url    VARCHAR2(800) ;
4835 
4836 
4837     -- R12B Doucmnet LC Phase Workflow Routing
4838     l_document_id               NUMBER ;
4839     l_document_revision_id      NUMBER ;
4840     l_document_number           VARCHAR2(50) ;
4841     l_document_revision         VARCHAR2(25) ;
4842     l_documnet_name             VARCHAR2(50) ;
4843     l_document_detail_page_url  VARCHAR2(800) ;
4844 
4845 
4846 
4847 BEGIN
4848 
4849     --  Initialize API return status to success
4850     x_return_status := FND_API.G_RET_STS_SUCCESS;
4851 
4852     l_change_id := p_change_id ;
4853 
4854 IF g_debug_flag THEN
4855    Write_Debug('SetAttribute Private API . . .');
4856    Write_Debug('-----------------------------------------------------');
4857    Write_Debug('Item Type         : ' || p_item_type );
4858    Write_Debug('Change Id         : ' || TO_CHAR(l_change_id) );
4859    Write_Debug('Change Line Id    : ' || TO_CHAR(p_change_line_id) );
4860    Write_Debug('-----------------------------------------------------');
4861 
4862 END IF ;
4863 
4864     --
4865     -- Get Item Attribute Info
4866     --
4867     IF p_change_line_id IS NOT NULL AND  p_change_line_id > 0
4868     THEN
4869 
4870         -- Get Change Line Object Info
4871         GetChangeLineObjectInfo
4872         ( p_change_line_id          => p_change_line_id
4873         , x_change_id               => l_change_id
4874         , x_line_sequence_number    => l_line_sequence_number
4875         , x_line_name               => l_line_name
4876         , x_line_description        => l_line_description
4877         , x_line_status             => l_line_status
4878         , x_line_approval_status    => l_line_approval_status
4879         , x_line_assignee           => l_line_assignee
4880         , x_line_assignee_company   => l_line_assignee_company
4881         ) ;
4882 
4883 IF g_debug_flag THEN
4884    Write_Debug('Got Change Line Object Info . . .');
4885    Write_Debug('Change Id         : ' || TO_CHAR(l_change_id) );
4886    Write_Debug('Line Seq Num      : ' || TO_CHAR(l_line_sequence_number));
4887    Write_Debug('Line Status       : ' || l_line_status);
4888    Write_Debug('Line Assignee     : ' || l_line_assignee);
4889 END IF ;
4890 
4891         -- Set out param for Change Id
4892         p_change_id := l_change_id ;
4893 
4894     END IF ;
4895 
4896     IF l_change_id IS NOT NULL AND l_change_id > 0
4897     THEN
4898 
4899        -- Get Change Object Info
4900        GetChangeObjectInfo
4901        ( p_change_id               => l_change_id
4902        , x_change_notice           => l_change_notice
4903        , x_organization_id         => l_organization_id
4904        , x_change_name             => l_change_name
4905        , x_description             => l_description
4906        , x_change_status           => l_change_status
4907        , x_change_lc_phase         => l_change_lc_phase
4908        , x_approval_status         => l_approval_status
4909        , x_priority                => l_priority
4910        , x_reason                  => l_reason
4911        , x_change_managemtent_type => l_change_managemtent_type
4912        , x_change_order_type       => l_change_order_type
4913        , x_eco_department          => l_eco_department
4914        , x_assignee                => l_assignee
4915        , x_assignee_company        => l_assignee_company
4916        ) ;
4917 
4918 IF g_debug_flag THEN
4919    Write_Debug('Got Change Object Info . . .');
4920 END IF ;
4921 
4922        -- Get Organization Info
4923        GetOrgInfo
4924        ( p_organization_id   => l_organization_id
4925        , x_organization_code => l_organization_code
4926        , x_organization_name => l_organization_name ) ;
4927 
4928 IF g_debug_flag THEN
4929    Write_Debug('Got Org Info . . .' || l_organization_code);
4930 END IF ;
4931 
4932 
4933        l_base_cm_type_code := GetBaseChangeMgmtTypeCode(l_change_id) ;
4934 
4935 
4936 IF g_debug_flag THEN
4937    Write_Debug('Get Base CM Type Code ' || l_base_cm_type_code );
4938 END IF ;
4939 
4940 
4941    END IF ;
4942 
4943 
4944     -- Get User Info
4945     IF p_wf_user_role IS NULL THEN
4946 
4947         l_wf_user_role := GetUserRole(p_user_id => p_wf_user_id ) ;
4948 
4949     ELSE
4950 
4951         l_wf_user_role := p_wf_user_role ;
4952 
4953     END IF ;
4954 
4955 IF g_debug_flag THEN
4956    Write_Debug('Got User Info . . .');
4957 END IF ;
4958 
4959 
4960 
4961     -- R12B
4962     -- Get Document Info for Document Lifecyel Change Object
4963     IF ENG_DOCUMENT_UTIL.Is_Dom_Document_Lifecycle( p_change_id => l_change_id
4964                                                   , p_base_change_mgmt_type_code => l_base_cm_type_code
4965                                                   )
4966     THEN
4967 
4968 IF g_debug_flag THEN
4969    Write_Debug('Change Object is  Document Lifecycle. . .');
4970 END IF ;
4971 
4972        -- Get Change Object Info
4973        GetDocumentLCInfo
4974        ( p_change_id                => l_change_id
4975        , x_document_id              => l_document_id
4976        , x_document_revision_id     => l_document_revision_id
4977        , x_document_number          => l_document_number
4978        , x_document_revision        => l_document_revision
4979        , x_documnet_name            => l_documnet_name
4980        , x_document_detail_page_url => l_document_detail_page_url
4981        ) ;
4982 
4983 IF g_debug_flag THEN
4984    Write_Debug('Got Documetn Info . . .');
4985    Write_Debug('-----------------------------------------------------');
4986    Write_Debug('Item Type         : ' || p_item_type );
4987    Write_Debug('Doc Id            : ' || TO_CHAR(l_document_id) );
4988    Write_Debug('Doc Revision Id   : ' || TO_CHAR(l_document_revision_id) );
4989    Write_Debug('Doc Number        : ' || l_document_number );
4990    Write_Debug('Doc Revision      : ' || l_document_revision );
4991    Write_Debug('Doc Name          : ' || l_documnet_name );
4992    Write_Debug('Doc Rev Page URL  : ' || l_document_detail_page_url );
4993    Write_Debug('-----------------------------------------------------');
4994 
4995 END IF ;
4996 
4997     END IF ;
4998 
4999 
5000     -- Get Ntf Message PL/SQL Document API Info
5001     GetNtfMessageDocumentAPI
5002     ( p_item_type         => p_item_type
5003     , p_item_key          => p_item_key
5004     , p_process_name      => p_process_name
5005     , x_message_text_body => l_message_text_body
5006     , x_message_html_body => l_message_html_body
5007     ) ;
5008 
5009 
5010 
5011     --
5012     -- MK Comment:
5013     -- In R12B, we may not need this link any more
5014     --
5015     IF l_change_id IS NOT NULL AND l_change_id > 0
5016     THEN
5017 
5018         -- BugFix: 3804170
5019         -- Check if this CO is  Doc Review or Approval by base cm type code
5020         -- if this is not Doc Review or Approval
5021         -- Call Get Change Notification Attachment Link Info
5022         IF  l_base_cm_type_code <>  'ATTACHMENT_APPROVAL'
5023         AND l_base_cm_type_code <>  'ATTACHMENT_REVIEW'
5024         THEN
5025 
5026             GetNtfAttachmentLink
5027              ( p_data_object_code    => 'ENG_ENGINEERING_CHANGES'
5028              , p_pk1_value          => TO_CHAR(l_change_id)
5029              , x_ntf_attachment_link => l_attachments ) ;
5030 
5031         END IF ;
5032     END IF ;
5033 
5034 
5035     IF p_change_line_id IS NOT NULL AND  p_change_line_id > 0
5036     THEN
5037 
5038         -- Get Change Line Notification Attachment Link Info
5039         GetNtfAttachmentLink
5040         ( p_data_object_code    => 'ENG_CHANGE_LINES'
5041         , p_pk1_value           => TO_CHAR(p_change_line_id)
5042         , x_ntf_attachment_link => l_line_attachments ) ;
5043 
5044     END IF ;
5045 
5046     -- Get Default No Value Comment for Response Field
5047     l_default_novalue :=  GetDefaultResponseComment ;
5048 
5049 IF g_debug_flag THEN
5050    Write_Debug('Got Worklfow Item Attribute Info . . .');
5051 END IF ;
5052 
5053     -- Comment Out for 115.9 code
5054     -- because this URL does not work 510 OA Fwk
5055     -- Get Change Detail Page URL
5056     -- l_change_detail_url  := 'JSP:/OA_HTML/'
5057     --                             || Eng_Workflow_Util.GetFunctionWebHTMLCall
5058     --                               (p_function_name => 'ENG_CHANGE_DETAIL_PAGE' )
5059     --                             || '&changeId=-&CHANGE_ID-'
5060     --                             || '&OAFunc=ENG_CHANGE_DETAIL_PAGE' ;
5061     --
5062 
5063 
5064 
5065 
5066     -- Get Change Detail Page URL using RF.jsp version
5067     l_change_detail_url := Eng_Workflow_Ntf_Util.GetRunFuncURL
5068                           ( p_function_name => 'ENG_CHANGE_DETAIL_PAGE'
5069                           , p_parameters    => '&changeId=' || TO_CHAR(l_change_id) ) ;
5070 
5071 
5072     IF p_change_line_id IS NOT NULL AND  p_change_line_id > 0
5073     THEN
5074 
5075         -- Comment Out for 115.9 code
5076          -- because this URL does not work 510 OA Fwk
5077         -- l_change_line_detail_url  := 'JSP:/OA_HTML/'
5078         --                         || Eng_Workflow_Util.GetFunctionWebHTMLCall
5079         --                            (p_function_name => 'ENG_CHANGE_LINE_DETAIL_PAGE' )
5080         --                         || '&changeLineId=-&CHANGE_LINE_ID-'
5081         --                         || '&OAFunc=ENG_CHANGE_LINE_DETAIL_PAGE'  ;
5082         --
5083 
5084         -- Get Change Detail Page URL using RF.jsp version
5085         l_change_line_detail_url := Eng_Workflow_Ntf_Util.GetRunFuncURL
5086                           ( p_function_name => 'ENG_CHANGE_LINE_DETAIL_PAGE'
5087                           , p_parameters    => '&changeLineId=' || TO_CHAR(p_change_line_id) ) ;
5088 
5089     END IF ;
5090 
5091 
5092     -- Set the values of an array of item type attributes
5093     -- Use the correct procedure for your attribute type. All attribute types
5094     -- except number and date use SetItemAttrTextArray.
5095 
5096     -- Text Item Attributes
5097     -- Using SetItemAttrTextArray():
5098     I := 0 ;
5099 
5100     -- Change Object Number
5101     I := I + 1  ;
5102     l_text_attr_name_tbl(I)  := 'CHANGE_NOTICE' ;
5103     l_text_attr_value_tbl(I) := l_change_notice ;
5104 
5105     -- Change Object Name
5106     I := I + 1  ;
5107     l_text_attr_name_tbl(I)  := 'CHANGE_NAME' ;
5108     l_text_attr_value_tbl(I) := l_change_name ;
5109 
5110     -- Organization Code
5111     I := I + 1  ;
5112     l_text_attr_name_tbl(I)  := 'ORGANIZATION_CODE' ;
5113     l_text_attr_value_tbl(I) := l_organization_code ;
5114 
5115     -- Organization Name
5116     -- I := I + 1  ;
5117     -- l_text_attr_name_tbl(I)  := 'ORGANIZATION_NAME' ;
5118     -- l_text_attr_value_tbl(I) := l_organization_name ;
5119 
5120     -- Change Management Type
5121     I := I + 1  ;
5122     l_text_attr_name_tbl(I)  := 'CHANGE_MANAGEMENT_TYPE' ;
5123     l_text_attr_value_tbl(I) := l_change_managemtent_type ;
5124 
5125     -- Description
5126     I := I + 1  ;
5127     l_text_attr_name_tbl(I)  := 'DESCRIPTION' ;
5128     l_text_attr_value_tbl(I) := l_description ;
5129 
5130     -- Change Order Type
5131     -- I := I + 1  ;
5132     -- l_text_attr_name_tbl(I)  := 'CHANGE_ORDER_TYPE' ;
5133     -- l_text_attr_value_tbl(I) := l_change_order_type ;
5134 
5135     -- Eco Department Name
5136     -- I := I + 1  ;
5137     -- l_text_attr_name_tbl(I)  := 'ECO_DEPARTMENT' ;
5138     -- l_text_attr_value_tbl(I) := l_eco_department ;
5139 
5140     -- OBJSOLETE in 115.10
5141     -- Status
5142     -- I := I + 1  ;
5143     -- l_text_attr_name_tbl(I)  := 'STATUS' ;
5144     -- l_text_attr_value_tbl(I) := l_change_status ;
5145 
5146     -- LC Phase
5147     I := I + 1  ;
5148     l_text_attr_name_tbl(I)  := 'STATUS' ;
5149     l_text_attr_value_tbl(I) := l_change_lc_phase ;
5150 
5151     -- Approval Status
5152     I := I + 1  ;
5153     l_text_attr_name_tbl(I)  := 'APPROVAL_STATUS' ;
5154     l_text_attr_value_tbl(I) := l_approval_status ;
5155 
5156     -- Assignee Name
5157     I := I + 1  ;
5158     l_text_attr_name_tbl(I)  := 'ASSIGNEE_NAME' ;
5159     l_text_attr_value_tbl(I) := l_assignee ;
5160 
5161     -- Assignee Company
5162     I := I + 1  ;
5163     l_text_attr_name_tbl(I)  := 'ASSIGNEE_COMPANY' ;
5164     l_text_attr_value_tbl(I) := l_assignee_company ;
5165 
5166     -- Priority
5167     I := I + 1  ;
5168     l_text_attr_name_tbl(I)  := 'PRIORITY' ;
5169     l_text_attr_value_tbl(I) := l_priority ;
5170 
5171     -- Reason
5172     I := I + 1  ;
5173     l_text_attr_name_tbl(I)  := 'REASON' ;
5174     l_text_attr_value_tbl(I) := l_reason ;
5175 
5176     -- WF Owner's User Role
5177     I := I + 1  ;
5178     l_text_attr_name_tbl(I)  := 'WF_USER_ROLE' ;
5179     l_text_attr_value_tbl(I) := l_wf_user_role ;
5180 
5181     -- Ntf Default From Role
5182     I := I + 1  ;
5183     l_text_attr_name_tbl(I)  := 'FROM_ROLE' ;
5184     l_text_attr_value_tbl(I) := l_wf_user_role ;
5185 
5186     -- Host URL
5187     I := I + 1  ;
5188 
5189     IF p_host_url  IS NULL THEN
5190 
5191        l_host_url := NULL ;
5192        -- Set NULL always to get Host URL from GetFrameWorkAgentURL
5193        -- in GetHostURL if p_host_url is not passed
5194        -- l_host_url := GetFrameWorkAgentURL ;
5195 
5196     ELSE
5197 
5198        l_host_url := p_host_url ;
5199 
5200     END IF ;
5201 
5202     l_text_attr_name_tbl(I)  := 'HOST_URL' ;
5203     l_text_attr_value_tbl(I) := l_host_url ;
5204 
5205     -- Message Text Body
5206     I := I + 1  ;
5207     l_text_attr_name_tbl(I)  := 'MESSAGE_TEXT_BODY' ;
5208     l_text_attr_value_tbl(I) := l_message_text_body ;
5209 
5210     -- Message HTML Body
5211     I := I + 1  ;
5212     l_text_attr_name_tbl(I)  := 'MESSAGE_HTML_BODY' ;
5213     l_text_attr_value_tbl(I) := l_message_html_body ;
5214 
5215 
5216     -- Ntf Attachemnts
5217     I := I + 1  ;
5218     l_text_attr_name_tbl(I)  := 'ATTACHMENTS' ;
5219     l_text_attr_value_tbl(I) := l_attachments ;
5220 
5221 
5222     -- Change Reviewer Role
5223     I := I + 1  ;
5224     l_text_attr_name_tbl(I)  := 'REVIEWERS_ROLE' ;
5225     l_text_attr_value_tbl(I) := GetWFAdhocRoleName
5226                                 ( p_role_prefix => Eng_Workflow_Util.G_REV_ROLE
5227                                 , p_item_type   => p_item_type
5228                                 , p_item_key    => p_item_key ) ;
5229 
5230 
5231     -- Change Assignee Role
5232     I := I + 1  ;
5233     l_text_attr_name_tbl(I)  := 'ASSIGNEE_ROLE' ;
5234     l_text_attr_value_tbl(I) := GetWFAdhocRoleName
5235                                 ( p_role_prefix => Eng_Workflow_Util.G_ASSIGNEE_ROLE
5236                                 , p_item_type   => p_item_type
5237                                 , p_item_key    => p_item_key ) ;
5238 
5239 
5240     -- Response Comment
5241     I := I + 1  ;
5242     l_text_attr_name_tbl(I)  := 'RESPONSE_COMMENT' ;
5243     l_text_attr_value_tbl(I) := l_default_novalue ;
5244 
5245 
5246     -- Change Detail Page URL
5247     I := I + 1  ;
5248     l_text_attr_name_tbl(I)  := 'CHANGE_DETAIL_PAGE_URL' ;
5249     l_text_attr_value_tbl(I) := l_change_detail_url ;
5250 
5251 
5252     -- Change Action Worklfow Specific Attributes
5253     IF p_item_type = G_CHANGE_ACTION_ITEM_TYPE  THEN
5254 
5255         -- Change Adhoc Party List
5256         I := I + 1  ;
5257         l_text_attr_name_tbl(I)  := 'ADHOC_PARTY_LIST' ;
5258         l_text_attr_value_tbl(I) := p_adhoc_party_list ;
5259 
5260         -- Change Adhoc Party Role
5261         I := I + 1  ;
5262         l_text_attr_name_tbl(I)  := 'ADHOC_PARTY_ROLE' ;
5263         l_text_attr_value_tbl(I) := GetWFAdhocRoleName
5264                                     ( p_role_prefix => Eng_Workflow_Util.G_ADHOC_PARTY_ROLE
5265                                     , p_item_type   => p_item_type
5266                                     , p_item_key    => p_item_key ) ;
5267 
5268 
5269         --
5270         -- 115.10 LC Phase Change
5271         -- Set to PROMOTE or DEMOTE For Notification Subject
5272         -- Action Type
5273 
5274         IF  p_process_name = G_STATUS_CHANGE_PROC
5275         THEN
5276 
5277             --
5278             -- Get Message for Ntf Subject
5279             -- Like:
5280             -- has been promoted to &STATUS Phase ENG_PHASE_PROMOTED_TO_NTF
5281             -- has been demoted to &STATUS Phase  ENG_PHASE_DEMOTED_TO_NTF
5282             --
5283             GetActionTypeCode(p_action_id        => p_action_id
5284                             , x_action_type_code => l_action_type_code) ;
5285 
5286             IF l_action_type_code = G_ACT_PROMOTE
5287             THEN
5288 
5289                 FND_MESSAGE.SET_NAME('ENG', 'ENG_PHASE_PROMOTED_TO_NTF') ;
5290                 FND_MESSAGE.SET_TOKEN('STATUS', l_change_lc_phase) ;
5291                 l_action_type_msg :=  FND_MESSAGE.GET ;
5292 
5293             ELSIF l_action_type_code = G_ACT_DEMOTE
5294             THEN
5295 
5296                 FND_MESSAGE.SET_NAME('ENG', 'ENG_PHASE_DEMOTED_TO_NTF') ;
5297                 FND_MESSAGE.SET_TOKEN('STATUS', l_change_lc_phase) ;
5298                 l_action_type_msg :=  FND_MESSAGE.GET ;
5299 
5300             END IF ;
5301 
5302             I := I + 1  ;
5303             l_text_attr_name_tbl(I)  := 'ACTION_TYPE' ;
5304             l_text_attr_value_tbl(I) := l_action_type_msg ;
5305 
5306         END IF ; -- End Of p_process_name = G_STATUS_CHANGE_PROC
5307 
5308 
5309 
5310     -- Change Route Worklfow Specific Attributes
5311     ELSIF p_item_type = G_CHANGE_ROUTE_ITEM_TYPE  THEN
5312 
5313         -- Change Route People Party Role
5314         I := I + 1  ;
5315         l_text_attr_name_tbl(I)  := 'ROUTE_PEOPLE_ROLE' ;
5316         l_text_attr_value_tbl(I) := GetWFAdhocRoleName
5317                                     ( p_role_prefix => Eng_Workflow_Util.G_ROUTE_PEOPLE_ROLE
5318                                     , p_item_type   => p_item_type
5319                                     , p_item_key    => p_item_key ) ;
5320 
5321 
5322         -- Change Route Object Name
5323         I := I + 1  ;
5324         l_text_attr_name_tbl(I)  := 'OBJECT_NAME' ;
5325         l_text_attr_value_tbl(I) := p_object_name ;
5326 
5327         -- Change Route Parent Object Name
5328         I := I + 1  ;
5329         l_text_attr_name_tbl(I)  := 'PARENT_OBJECT_NAME' ;
5330         l_text_attr_value_tbl(I) := p_parent_object_name ;
5331 
5332 
5333         -- Workflow Signature Policy
5334         l_wf_sig_policy := GetWfSigPolicyFromLCPhase
5335                            ( p_change_id => l_change_id
5336                            , p_route_id => p_route_id ) ;
5337         I := I + 1  ;
5338         l_text_attr_name_tbl(I)  := 'WF_SIG_POLICY' ;
5339         l_text_attr_value_tbl(I) := l_wf_sig_policy ;
5340 
5341 
5342     -- Change Route Step Worklfow Specific Attributes
5343     -- R12B added new Line Workflow and Documet Workflow Route Step Type
5344     ELSIF (  p_item_type = G_CHANGE_ROUTE_STEP_ITEM_TYPE
5345           OR p_item_type = G_CHANGE_ROUTE_LINE_STEP_TYPE
5346           OR p_item_type = G_CHANGE_ROUTE_DOC_STEP_TYPE
5347           )
5348     THEN
5349 
5350         -- Change Route People Party Role
5351         I := I + 1  ;
5352         l_text_attr_name_tbl(I)  := 'ROUTE_PEOPLE_ROLE' ;
5353         l_text_attr_value_tbl(I) := GetWFAdhocRoleName
5354                                     ( p_role_prefix => Eng_Workflow_Util.G_ROUTE_PEOPLE_ROLE
5355                                     , p_item_type   => p_item_type
5356                                     , p_item_key    => p_item_key ) ;
5357 
5358 
5359         -- Change Route Step People Role
5360         I := I + 1  ;
5361         l_text_attr_name_tbl(I)  := 'STEP_PEOPLE_ROLE' ;
5362         l_text_attr_value_tbl(I) := GetWFAdhocRoleName
5363                                     ( p_role_prefix => Eng_Workflow_Util.G_STEP_PEOPLE_ROLE
5364                                     , p_item_type   => p_item_type
5365                                     , p_item_key    => p_item_key ) ;
5366 
5367 
5368         -- Workflow Signature Policy
5369         l_wf_sig_policy := GetWfSigPolicyFromLCPhase
5370                            ( p_change_id => l_change_id
5371                            , p_route_id => p_route_id ) ;
5372         I := I + 1  ;
5373         l_text_attr_name_tbl(I)  := 'WF_SIG_POLICY' ;
5374         l_text_attr_value_tbl(I) := l_wf_sig_policy ;
5375 
5376 
5377         -- R12B
5378         -- Change Route Object Name
5379         I := I + 1  ;
5380         l_text_attr_name_tbl(I)  := 'OBJECT_NAME' ;
5381         l_text_attr_value_tbl(I) := p_object_name ;
5382 
5383         -- Change Route Parent Object Name
5384         I := I + 1  ;
5385         l_text_attr_name_tbl(I)  := 'PARENT_OBJECT_NAME' ;
5386         l_text_attr_value_tbl(I) := p_parent_object_name ;
5387 
5388 
5389 
5390     END IF ;
5391 
5392 
5393 
5394     -- Change Line Action Worklfow/Line Workflow Routing Specific Attributes
5395     -- R12B added new Line Workflow Route Step Type
5396     IF ( p_item_type = G_CHANGE_LINE_ACTION_ITEM_TYPE
5397          OR p_item_type = G_CHANGE_ROUTE_LINE_STEP_TYPE
5398          OR ( p_change_line_id IS NOT NULL AND  p_change_line_id > 0 )
5399        )
5400     THEN
5401 
5402 
5403 IF g_debug_flag THEN
5404    Write_Debug('Setting Change Line Item Attribute Info . . .');
5405 END IF ;
5406 
5407         -- Line Ntf Attachemnts
5408         I := I + 1  ;
5409         l_text_attr_name_tbl(I)  := 'LINE_ATTACHMENTS' ;
5410         l_text_attr_value_tbl(I) := l_line_attachments ;
5411 
5412         -- Line Reviewer Role
5413         I := I + 1  ;
5414         l_text_attr_name_tbl(I)  := 'LINE_REVIEWERS_ROLE' ;
5415         l_text_attr_value_tbl(I) := GetWFAdhocRoleName
5416                                     ( p_role_prefix => Eng_Workflow_Util.G_LINE_REV_ROLE
5417                                     , p_item_type   => p_item_type
5418                                     , p_item_key    => p_item_key ) ;
5419 
5420         -- Line Assignee Role
5421         I := I + 1  ;
5422         l_text_attr_name_tbl(I)  := 'LINE_ASSIGNEE_ROLE' ;
5423         l_text_attr_value_tbl(I) := GetWFAdhocRoleName
5424                                     ( p_role_prefix => Eng_Workflow_Util.G_LINE_ASSIGNEE_ROLE
5425                                     , p_item_type   => p_item_type
5426                                     , p_item_key    => p_item_key ) ;
5427 
5428         -- Line Object Name
5429         I := I + 1  ;
5430         l_text_attr_name_tbl(I)  := 'LINE_NAME' ;
5431         l_text_attr_value_tbl(I) := l_line_name ;
5432 
5433         -- Line Description
5434         I := I + 1  ;
5435         l_text_attr_name_tbl(I)  := 'LINE_DESCRIPTION' ;
5436         l_text_attr_value_tbl(I) := l_line_description ;
5437 
5438         -- Line Status
5439         I := I + 1  ;
5440         l_text_attr_name_tbl(I)  := 'LINE_APPROVAL_STATUS' ;
5441         l_text_attr_value_tbl(I) := l_line_approval_status ;
5442 
5443         -- Line Status
5444         I := I + 1  ;
5445         l_text_attr_name_tbl(I)  := 'LINE_STATUS' ;
5446         l_text_attr_value_tbl(I) := l_line_status ;
5447 
5448         -- Line Assignee Name
5449         I := I + 1  ;
5450         l_text_attr_name_tbl(I)  := 'LINE_ASSIGNEE_NAME' ;
5451         l_text_attr_value_tbl(I) := l_line_assignee ;
5452 
5453         -- Line Assignee Company
5454         I := I + 1  ;
5455         l_text_attr_name_tbl(I)  := 'LINE_ASSIGNEE_COMPANY' ;
5456         l_text_attr_value_tbl(I) := l_line_assignee_company ;
5457 
5458 
5459         -- Line Detal Page URL
5460         I := I + 1  ;
5461         l_text_attr_name_tbl(I)  := 'LINE_DETAIL_PAGE_URL' ;
5462         l_text_attr_value_tbl(I) := l_change_line_detail_url ;
5463 
5464 
5465     END IF ;
5466     -- End of Change Line Action Worklfow/Line Workflow Routing Specific Attributes
5467 
5468 
5469 
5470     -- Document Lifecycle Workflow Routing Specific Attributes
5471     IF p_item_type = G_CHANGE_ROUTE_DOC_STEP_TYPE
5472     THEN
5473 
5474 IF g_debug_flag THEN
5475    Write_Debug('Setting Document Lifecycle Workflow Routing Item Attribute Info . . .');
5476 END IF ;
5477 
5478         -- Document Number
5479         I := I + 1  ;
5480         l_text_attr_name_tbl(I)  := 'DOCUMENT_NUMBER' ;
5481         l_text_attr_value_tbl(I) := l_document_number ;
5482 
5483 
5484         -- Document Revision
5485         I := I + 1  ;
5486         l_text_attr_name_tbl(I)  := 'DOCUMENT_REVISION' ;
5487         l_text_attr_value_tbl(I) := l_document_revision ;
5488 
5489         -- Document Name
5490         I := I + 1  ;
5491         l_text_attr_name_tbl(I)  := 'DOCUMNET_NAME' ;
5492         l_text_attr_value_tbl(I) := l_documnet_name ;
5493 
5494 
5495         -- Line Detal Page URL
5496         I := I + 1  ;
5497         l_text_attr_name_tbl(I)  := 'DOCUMENT_DETAIL_PAGE_URL' ;
5498         l_text_attr_value_tbl(I) := l_document_detail_page_url ;
5499 
5500 
5501     END IF ;
5502     -- End of Document Lifecycle Workflow Routing Specific Attributes
5503 
5504 
5505 
5506 IF g_debug_flag THEN
5507    Write_Debug('Call WF_ENGINE.SetItemAttrTextArray . . .');
5508 END IF ;
5509 
5510 
5511     -- Set Text Attributes
5512     WF_ENGINE.SetItemAttrTextArray
5513     ( itemtype     => p_item_type
5514     , itemkey      => p_item_key
5515     , aname        => l_text_attr_name_tbl
5516     , avalue       => l_text_attr_value_tbl
5517     ) ;
5518 
5519     -- Number Item Attributes
5520     -- Using SetItemAttrNumberArray():
5521     I := 0 ;
5522 
5523     -- Change Id
5524     I := I + 1  ;
5525     l_num_attr_name_tbl(I)  := 'CHANGE_ID' ;
5526     l_num_attr_value_tbl(I) := l_change_id ;
5527 
5528     -- Organization Id
5529     I := I + 1  ;
5530     l_num_attr_name_tbl(I)  := 'ORGANIZATION_ID' ;
5531     l_num_attr_value_tbl(I) := l_organization_id  ;
5532 
5533     -- Worklfow Owner User Id
5534     I := I + 1  ;
5535     l_num_attr_name_tbl(I)  := 'WF_USER_ID' ;
5536     l_num_attr_value_tbl(I) := p_wf_user_id ;
5537 
5538     -- Change Action Worklfow Specific Attributes
5539     IF p_item_type = G_CHANGE_ACTION_ITEM_TYPE
5540        OR p_item_type = G_CHANGE_LINE_ACTION_ITEM_TYPE THEN
5541 
5542         I := I + 1  ;
5543         l_num_attr_name_tbl(I)  := 'ACTION_ID' ;
5544         l_num_attr_value_tbl(I) := p_action_id ;
5545 
5546     -- Change Route Worklfow Specific Attributes
5547     ELSIF p_item_type = G_CHANGE_ROUTE_ITEM_TYPE  THEN
5548 
5549         I := I + 1  ;
5550         l_num_attr_name_tbl(I)  := 'ROUTE_ID' ;
5551         l_num_attr_value_tbl(I) := p_route_id ;
5552 
5553         I := I + 1  ;
5554         l_num_attr_name_tbl(I)  := 'ACTION_ID' ;
5555         l_num_attr_value_tbl(I) := p_action_id ;
5556 
5557         I := I + 1  ;
5558         l_num_attr_name_tbl(I)  := 'OBJECT_ID1' ;
5559         l_num_attr_value_tbl(I) := p_object_id1 ;
5560 
5561         I := I + 1  ;
5562         l_num_attr_name_tbl(I)  := 'OBJECT_ID2' ;
5563         l_num_attr_value_tbl(I) := p_object_id2 ;
5564 
5565         I := I + 1  ;
5566         l_num_attr_name_tbl(I)  := 'OBJECT_ID3' ;
5567         l_num_attr_value_tbl(I) := p_object_id3 ;
5568 
5569         I := I + 1  ;
5570         l_num_attr_name_tbl(I)  := 'OBJECT_ID4' ;
5571         l_num_attr_value_tbl(I) := p_object_id4 ;
5572 
5573         I := I + 1  ;
5574         l_num_attr_name_tbl(I)  := 'OBJECT_ID5' ;
5575         l_num_attr_value_tbl(I) := p_object_id5 ;
5576 
5577         I := I + 1  ;
5578         l_num_attr_name_tbl(I)  := 'PARENT_OBJECT_ID1' ;
5579         l_num_attr_value_tbl(I) := p_parent_object_id1 ;
5580 
5581     -- Change Route Worklfow Specific Attributes
5582     -- R12B added new Line Workflow and Documet Workflow Route Step Type
5583     ELSIF (  p_item_type = G_CHANGE_ROUTE_STEP_ITEM_TYPE
5584           OR p_item_type = G_CHANGE_ROUTE_LINE_STEP_TYPE
5585           OR p_item_type = G_CHANGE_ROUTE_DOC_STEP_TYPE
5586           )
5587     THEN
5588 
5589         I := I + 1  ;
5590         l_num_attr_name_tbl(I)  := 'ROUTE_ID' ;
5591         l_num_attr_value_tbl(I) := p_route_id ;
5592 
5593         I := I + 1  ;
5594         l_num_attr_name_tbl(I)  := 'STEP_ID' ;
5595         l_num_attr_value_tbl(I) := p_route_step_id ;
5596 
5597         I := I + 1  ;
5598         l_num_attr_name_tbl(I)  := 'ACTION_ID' ;
5599         l_num_attr_value_tbl(I) := p_action_id ;
5600 
5601 
5602         -- R12B
5603         I := I + 1  ;
5604         l_num_attr_name_tbl(I)  := 'OBJECT_ID1' ;
5605         l_num_attr_value_tbl(I) := p_object_id1 ;
5606 
5607         I := I + 1  ;
5608         l_num_attr_name_tbl(I)  := 'OBJECT_ID2' ;
5609         l_num_attr_value_tbl(I) := p_object_id2 ;
5610 
5611         I := I + 1  ;
5612         l_num_attr_name_tbl(I)  := 'OBJECT_ID3' ;
5613         l_num_attr_value_tbl(I) := p_object_id3 ;
5614 
5615         I := I + 1  ;
5616         l_num_attr_name_tbl(I)  := 'OBJECT_ID4' ;
5617         l_num_attr_value_tbl(I) := p_object_id4 ;
5618 
5619         I := I + 1  ;
5620         l_num_attr_name_tbl(I)  := 'OBJECT_ID5' ;
5621         l_num_attr_value_tbl(I) := p_object_id5 ;
5622 
5623         I := I + 1  ;
5624         l_num_attr_name_tbl(I)  := 'PARENT_OBJECT_ID1' ;
5625         l_num_attr_value_tbl(I) := p_parent_object_id1 ;
5626 
5627     END IF ;
5628 
5629 
5630 
5631     -- Change Line Action Worklfow/Line Workflow Routing Specific Attributes
5632     -- R12B added new Line Workflow Route Step Type
5633     IF ( p_item_type = G_CHANGE_LINE_ACTION_ITEM_TYPE
5634          OR p_item_type = G_CHANGE_ROUTE_LINE_STEP_TYPE
5635          OR ( p_change_line_id IS NOT NULL AND  p_change_line_id > 0 )
5636        )
5637     THEN
5638 
5639         I := I + 1  ;
5640         l_num_attr_name_tbl(I)  := 'CHANGE_LINE_ID' ;
5641         l_num_attr_value_tbl(I) := p_change_line_id ;
5642 
5643         I := I + 1  ;
5644         l_num_attr_name_tbl(I)  := 'LINE_SEQUENCE_NUMBER' ;
5645         l_num_attr_value_tbl(I) := l_line_sequence_number ;
5646 
5647     END IF ;
5648     -- End of Change Line Action Worklfow/Line Workflow Routing Specific Attributes
5649 
5650 
5651 
5652     -- Document Lifecycle Workflow Routing Specific Attributes
5653     IF p_item_type = G_CHANGE_ROUTE_DOC_STEP_TYPE
5654     THEN
5655 
5656 IF g_debug_flag THEN
5657    Write_Debug('Setting Document Lifecycle Workflow Routing Item Attribute Info . . .');
5658 END IF ;
5659 
5660         -- Document Id
5661         I := I + 1  ;
5662         l_num_attr_name_tbl(I)  := 'DOCUMENT_ID' ;
5663         l_num_attr_value_tbl(I) := l_document_id ;
5664 
5665         -- Document Revision Id
5666         I := I + 1  ;
5667         l_num_attr_name_tbl(I)  := 'DOCUMENT_REVISION_ID' ;
5668         l_num_attr_value_tbl(I) := l_document_revision_id ;
5669 
5670 
5671     END IF ;
5672     -- End of Document Lifecycle Workflow Routing Specific Attributes
5673 
5674 
5675 
5676 IF g_debug_flag THEN
5677    Write_Debug('Call WF_ENGINE.SetItemAttrNumberArray . . .');
5678 END IF ;
5679 
5680     -- Set Number Attributes
5681     WF_ENGINE.SetItemAttrNumberArray
5682     ( itemtype     => p_item_type
5683     , itemkey      => p_item_key
5684     , aname        => l_num_attr_name_tbl
5685     , avalue       => l_num_attr_value_tbl
5686     ) ;
5687 
5688 
5689     -- Date Item Attributes
5690     -- Using SetItemAttrDateArray():
5691     I := 0 ;
5692 
5693     -- I := I + 1  ;
5694     -- l_date_attr_name_tbl(I)  := '' ;
5695     -- l_date_attr_value_tbl(I) := '' ;
5696 
5697 
5698     IF l_date_attr_name_tbl.EXISTS(1) THEN
5699 
5700 IF g_debug_flag THEN
5701    Write_Debug('Call WF_ENGINE.SetItemAttrDateArray . . .');
5702 END IF ;
5703 
5704         -- Set Date Attributes
5705         WF_ENGINE.SetItemAttrDateArray
5706         ( itemtype     => p_item_type
5707         , itemkey      => p_item_key
5708         , aname        => l_date_attr_name_tbl
5709         , avalue       => l_date_attr_value_tbl
5710         ) ;
5711 
5712     END IF ;
5713 
5714 
5715 EXCEPTION
5716     WHEN OTHERS THEN
5717 
5718 IF g_debug_flag THEN
5719    Write_Debug('When Others in SetAttributes ' || SQLERRM );
5720 END IF ;
5721 
5722 
5723     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
5724     IF  FND_MSG_PUB.Check_Msg_Level
5725       (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
5726     THEN
5727             FND_MSG_PUB.Add_Exc_Msg
5728               ( G_PKG_NAME        ,
5729                 l_api_name
5730             );
5731     END IF;
5732 
5733 
5734 END SetAttributes ;
5735 
5736 
5737 FUNCTION CheckRouteStepRequiredDate(p_route_id IN NUMBER )
5738 RETURN BOOLEAN
5739 IS
5740 
5741     CURSOR c_route_req_date (p_route_id NUMBER)
5742     IS
5743 
5744        SELECT step_seq_num
5745             , required_date
5746        FROM   ENG_CHANGE_ROUTE_STEPS
5747        WHERE  route_id = p_route_id
5748        AND    required_date IS NOT NULL
5749        ORDER BY step_seq_num ;
5750 
5751     l_return_status     VARCHAR2(1) ;
5752     l_pre_require_date  DATE ;
5753 
5754 
5755 
5756 BEGIN
5757 
5758     --  Initialize API return status to success
5759     l_return_status := FND_API.G_RET_STS_SUCCESS;
5760 
5761 
5762     FOR step_rec IN  c_route_req_date(p_route_id => p_route_id)
5763     LOOP
5764 
5765         -- IF step_rec.required_date < TRUNC(SYSDATE) THEN
5766         -- We do not trucate required_date anymore
5767         -- for bug fix3456536
5768         IF step_rec.required_date < SYSDATE THEN
5769 
5770 
5771             l_return_status := FND_API.G_RET_STS_ERROR ;
5772 
5773             FND_MESSAGE.SET_NAME('ENG', 'ENG_ROUTE_REQDATE_INVALID') ;
5774             FND_MESSAGE.SET_TOKEN('STEP_SEQ_NUM', step_rec.step_seq_num );
5775             FND_MSG_PUB.Add ;
5776 
5777         END IF ;
5778 
5779         -- Step Req Date should be greater than or equal to
5780         -- req date in previous step
5781         IF step_rec.required_date < l_pre_require_date
5782         THEN
5783 
5784 
5785             l_return_status := FND_API.G_RET_STS_ERROR ;
5786 
5787             FND_MESSAGE.SET_NAME('ENG', 'ENG_ROUTE_REQDATE_LESS') ;
5788             FND_MESSAGE.SET_TOKEN('STEP_SEQ_NUM', step_rec.step_seq_num );
5789             FND_MSG_PUB.Add ;
5790 
5791 
5792         END IF ;
5793 
5794 
5795         -- Set current Required Date as Previous Required
5796         -- if it's not null
5797         IF step_rec.required_date IS NOT NULL  AND
5798            step_rec.required_date > NVL(l_pre_require_date, TRUNC(SYSDATE))
5799         THEN
5800 
5801             l_pre_require_date := step_rec.required_date ;
5802 
5803         END IF ;
5804 
5805 
5806     END LOOP ;
5807 
5808     IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
5809 
5810        RETURN  FALSE ;
5811 
5812     END IF ;
5813 
5814     RETURN TRUE ;
5815 
5816 END  CheckRouteStepRequiredDate ;
5817 
5818 FUNCTION CheckRouteStatus( p_route_id        IN NUMBER
5819                          , p_change_id       IN NUMBER
5820                          , p_change_line_id  IN  NUMBER )
5821 RETURN BOOLEAN
5822 IS
5823 
5824     CURSOR c_route_status (p_route_id NUMBER)
5825     IS
5826 
5827        SELECT 'Can not be started'
5828        FROM   ENG_CHANGE_ROUTES
5829        WHERE  route_id = p_route_id
5830        AND    status_code <> Eng_Workflow_Util.G_RT_NOT_STARTED ;
5831 
5832     CURSOR c_route_instance (p_route_id NUMBER)
5833     IS
5834 
5835        SELECT 'Can not be started'
5836        FROM   ENG_CHANGE_ROUTES
5837        WHERE  route_id = p_route_id
5838        AND    template_flag <> Eng_Workflow_Util.G_RT_INSTANCE ;
5839 
5840 
5841     l_return_status     VARCHAR2(1) ;
5842 
5843     l_change_id                 NUMBER ;
5844     l_line_sequence_number      NUMBER ;
5845     l_line_name                 VARCHAR2(240) ;
5846     l_line_description          VARCHAR2(4000) ;
5847     l_line_status               VARCHAR2(80) ;
5848     l_line_approval_status      VARCHAR2(80) ;
5849     l_line_assignee             VARCHAR2(360) ;
5850     l_line_assignee_company     VARCHAR2(360) ;
5851 
5852 
5853 
5854 BEGIN
5855     l_return_status := FND_API.G_RET_STS_SUCCESS;
5856 
5857 
5858     -- Check Route Status
5859     FOR route_rec IN  c_route_status(p_route_id => p_route_id)
5860     LOOP
5861 
5862         l_return_status := FND_API.G_RET_STS_ERROR ;
5863 
5864         IF p_change_line_id IS NOT NULL AND  p_change_line_id > 0
5865         THEN
5866 
5867             -- Set Error Message for Line
5868 
5869             -- Get Change Line Object Info
5870             GetChangeLineObjectInfo
5871             ( p_change_line_id          => p_change_line_id
5872             , x_change_id               => l_change_id
5873             , x_line_sequence_number    => l_line_sequence_number
5874             , x_line_name               => l_line_name
5875             , x_line_description        => l_line_description
5876             , x_line_status             => l_line_status
5877             , x_line_approval_status    => l_line_approval_status
5878             , x_line_assignee           => l_line_assignee
5879             , x_line_assignee_company   => l_line_assignee_company
5880             ) ;
5881 
5882             FND_MESSAGE.SET_NAME('ENG', 'ENG_ROUTE_LN_NOT_ABLE_TO_START') ;
5883             FND_MESSAGE.SET_TOKEN('LINE_SEQ_NUM', l_line_sequence_number );
5884             FND_MSG_PUB.Add ;
5885 
5886         ELSE
5887 
5888             -- Set Error Message for Header
5889             FND_MESSAGE.SET_NAME('ENG', 'ENG_ROUTE_NOT_ABLE_TO_START') ;
5890             FND_MSG_PUB.Add ;
5891 
5892         END IF ;
5893 
5894     END LOOP ;
5895 
5896 
5897     IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
5898 
5899        RETURN  FALSE ;
5900 
5901     END IF ;
5902 
5903     -- Check Route is instance
5904     FOR route_rec IN  c_route_instance(p_route_id => p_route_id)
5905     LOOP
5906 
5907         l_return_status := FND_API.G_RET_STS_ERROR ;
5908 
5909         -- Set Error Message for Header
5910         FND_MESSAGE.SET_NAME('ENG', 'ENG_ROUTE_NOT_INSTANCE') ;
5911         FND_MSG_PUB.Add ;
5912 
5913     END LOOP ;
5914 
5915 
5916     IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
5917 
5918        RETURN  FALSE ;
5919 
5920     END IF ;
5921 
5922     RETURN TRUE ;
5923 
5924 END  CheckRouteStatus ;
5925 
5926 
5927 FUNCTION CheckRouteAssignees( p_route_id        IN NUMBER
5928                             , p_change_id       IN NUMBER
5929                             , p_change_line_id  IN  NUMBER )
5930 
5931 RETURN BOOLEAN
5932 IS
5933 
5934     CURSOR c_route_assignees (p_route_id NUMBER)
5935     IS
5936 
5937         SELECT step.step_seq_num
5938         FROM   ENG_CHANGE_ROUTE_STEPS  step
5939         WHERE  EXISTS (SELECT 'Invalid Assignee Exists'
5940                        FROM   ENG_CHANGE_ROUTE_PEOPLE  people
5941                        WHERE  people.assignee_id = -1
5942                        AND    people.assignee_type_code = Eng_Workflow_Util.G_PERSON
5943                        AND    people.step_id = step.step_id )
5944         AND    step.route_id  = p_route_id ;
5945 
5946 
5947     l_return_status     VARCHAR2(1) ;
5948 
5949     l_change_id                 NUMBER ;
5950     l_line_sequence_number      NUMBER ;
5951     l_line_name                 VARCHAR2(240) ;
5952     l_line_description          VARCHAR2(4000) ;
5953     l_line_status               VARCHAR2(80) ;
5954     l_line_approval_status      VARCHAR2(80) ;
5955     l_line_assignee             VARCHAR2(360) ;
5956     l_line_assignee_company     VARCHAR2(360) ;
5957 
5958 
5959 
5960 BEGIN
5961 
5962     --  Initialize API return status to success
5963     l_return_status := FND_API.G_RET_STS_SUCCESS;
5964 
5965 
5966     FOR route_rec IN  c_route_assignees(p_route_id => p_route_id)
5967     LOOP
5968 
5969         l_return_status := FND_API.G_RET_STS_ERROR ;
5970 
5971         IF p_change_line_id IS NOT NULL AND  p_change_line_id > 0
5972         THEN
5973 
5974             -- Set Error Message for Line
5975 
5976             -- Get Change Line Object Info
5977             GetChangeLineObjectInfo
5978             ( p_change_line_id          => p_change_line_id
5979             , x_change_id               => l_change_id
5980             , x_line_sequence_number    => l_line_sequence_number
5981             , x_line_name               => l_line_name
5982             , x_line_description        => l_line_description
5983             , x_line_status             => l_line_status
5984             , x_line_approval_status    => l_line_approval_status
5985             , x_line_assignee           => l_line_assignee
5986             , x_line_assignee_company   => l_line_assignee_company
5987             ) ;
5988 
5989             FND_MESSAGE.SET_NAME('ENG', 'ENG_ROUTE_LN_INVALID_ASSIGNEE') ;
5990             FND_MESSAGE.SET_TOKEN('LINE_SEQ_NUM', l_line_sequence_number );
5991             FND_MESSAGE.SET_TOKEN('STEP_SEQ_NUM', route_rec.step_seq_num );
5992             FND_MSG_PUB.Add ;
5993 
5994         ELSE
5995 
5996             -- Set Error Message for Header
5997             FND_MESSAGE.SET_NAME('ENG', 'ENG_ROUTE_INVALID_ASSIGNEE') ;
5998             FND_MESSAGE.SET_TOKEN('STEP_SEQ_NUM', route_rec.step_seq_num );
5999             FND_MSG_PUB.Add ;
6000 
6001         END IF ;
6002 
6003 
6004     END LOOP ;
6005 
6006     IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
6007 
6008        RETURN  FALSE ;
6009 
6010     END IF ;
6011 
6012     RETURN TRUE ;
6013 
6014 END  CheckRouteAssignees ;
6015 
6016 FUNCTION CheckMandatoryAssignee( p_route_id        IN NUMBER)
6017 RETURN BOOLEAN
6018 IS
6019     CURSOR c_Mandatory_route_assignees (p_route_id NUMBER)
6020     IS
6021         SELECT steps.STEP_SEQ_NUM   ,steps.step_id
6022         FROM ENG_CHANGE_ROUTE_STEPS steps ,
6023              ENG_CHANGE_ROUTE_PEOPLE PEOPLE
6024         WHERE CONDITION_TYPE_CODE = 'PEOPLE'
6025           AND STEPS.STEP_ID = PEOPLE.STEP_ID
6026                          AND PEOPLE.RESPONSE_CONDITION_CODE = 'MANDATORY'
6027                          AND PEOPLE.ASSIGNEE_ID=-1
6028                          AND STEPS.route_id=p_route_id;
6029 
6030      l_return_status     VARCHAR2(1) ;
6031     route_rec c_Mandatory_route_assignees%rowtype;
6032 BEGIN
6033 
6034     --  Initialize API return status to success
6035     l_return_status := FND_API.G_RET_STS_SUCCESS;
6036 
6037     OPEN c_Mandatory_route_assignees(p_route_id => p_route_id) ;
6038     FETCH c_Mandatory_route_assignees into route_rec;
6039 
6040     IF (c_Mandatory_route_assignees%found) THEN
6041         l_return_status := FND_API.G_RET_STS_ERROR ;
6042 
6043             FND_MESSAGE.SET_NAME('ENG', 'ENG_ROUTE_MANDAT_ASSIGN_MISS') ;
6044             --fnd_message.SET_TOKEN ('STEP_NO',route_rec.STEP_SEQ_NUM , TRUE);
6045             FND_MSG_PUB.Add ;
6046 
6047     END IF ;
6048 
6049     IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
6050 
6051        RETURN  FALSE ;
6052 
6053     END IF ;
6054 
6055     RETURN TRUE ;
6056 
6057 END  CheckMandatoryAssignee ;
6058 
6059 
6060 
6061 PROCEDURE ValidateProcess
6062 (   p_validation_level  IN  NUMBER   := FND_API.G_VALID_LEVEL_FULL
6063  ,  x_return_status     OUT NOCOPY VARCHAR2
6064  ,  x_msg_count         OUT NOCOPY NUMBER
6065  ,  x_msg_data          OUT NOCOPY VARCHAR2
6066  ,  p_item_type         IN  VARCHAR2
6067  ,  p_process_name      IN  VARCHAR2
6068  ,  p_change_id         IN  NUMBER    := NULL
6069  ,  p_change_line_id    IN  NUMBER    := NULL
6070  ,  p_wf_user_id        IN  NUMBER
6071  ,  p_host_url          IN  VARCHAR2
6072  ,  p_action_id         IN  NUMBER    := NULL
6073  ,  p_adhoc_party_list  IN  VARCHAR2  := NULL
6074  ,  p_route_id          IN  NUMBER    := NULL
6075  ,  p_route_step_id     IN  NUMBER    := NULL
6076  ,  p_parent_item_type  IN  VARCHAR2  := NULL
6077  ,  p_parent_item_key   IN  VARCHAR2  := NULL
6078  ,  p_object_name       IN  VARCHAR2  := NULL
6079  ,  p_object_id1        IN  NUMBER    := NULL
6080  ,  p_object_id2        IN  NUMBER    := NULL
6081  ,  p_object_id3        IN  NUMBER    := NULL
6082  ,  p_object_id4        IN  NUMBER    := NULL
6083  ,  p_object_id5        IN  NUMBER    := NULL
6084  ,  p_parent_object_name IN  VARCHAR2  := NULL
6085  ,  p_parent_object_id1  IN  NUMBER    := NULL
6086 )
6087 IS
6088 
6089     l_api_name         CONSTANT VARCHAR2(30) := 'ValidateProcess';
6090 
6091 
6092 
6093     -- R12B for DOM API
6094     l_return_status    VARCHAR2(1);
6095     l_msg_count        NUMBER;
6096     l_msg_data         VARCHAR2(3000);
6097 
6098 
6099 BEGIN
6100 
6101     --  Initialize API return status to success
6102     x_return_status := FND_API.G_RET_STS_SUCCESS;
6103 
6104     IF p_validation_level <= FND_API.G_VALID_LEVEL_NONE THEN
6105        RETURN ;
6106     END IF ;
6107 
6108     -- Item Type: ALL
6109     -- p_wf_user_id should not be null
6110     -- p_host_url should not be null
6111     -- p_process_name should not be null
6112 
6113 
6114 
6115     -- Item Type: ALL except G_CHANGE_LINE_ACTION_ITEM_TYPE
6116     -- p_change_id should not be null
6117 
6118     -- Item type: G_CHANGE_ACTION_ITEM_TYPE
6119     -- Change Action Workflow Processes
6120     -- Validation Logic
6121     -- p_action_id should not be null
6122 
6123     -- Item type: G_CHANGE_LINE_ACTION_ITEM_TYPE
6124     -- Change Line Action Workflow Processes
6125     -- Validation Logic
6126     -- p_action_id should not be null
6127     -- p_change_line_id should not be null
6128 
6129 
6130     -- Item type: G_CHANGE_ROUTE_ITEM_TYPE
6131     -- Change Route Workflow Processes
6132     -- Validation Logic:
6133     --
6134     -- OA Page:
6135     -- p_route_id should not be null
6136     -- At least, should have one 'Not Started' route step
6137     -- The Route Status should be NOT_STARTED
6138     -- There should be no running Change Route Proc for the Change Object
6139     -- Should not be Route Template
6140     --
6141     --
6142     IF p_item_type = G_CHANGE_ROUTE_ITEM_TYPE THEN
6143 
6144         --
6145         -- R12 DOM LC Phase Workflow Support
6146         --
6147         IF ( ENG_DOCUMENT_UTIL.Is_Dom_Document_Lifecycle( p_change_id => p_change_id) )
6148         THEN
6149 
6150 IF g_debug_flag THEN
6151     Write_Debug('Change Object is a Doc LC Object, calling API. . . . ');
6152     Write_Debug('Calling ENG_DOCUMENT_UTIL.Start_Doc_LC_Phase_WF. . .' );
6153 END IF ;
6154 
6155             ENG_DOCUMENT_UTIL.Start_Doc_LC_Phase_WF
6156             (   p_api_version               => 1.0
6157              ,  p_init_msg_list             => FND_API.G_FALSE        --
6158              ,  p_commit                    => FND_API.G_FALSE        --
6159              ,  p_validation_level          => FND_API.G_VALID_LEVEL_FULL
6160              ,  x_return_status             => l_return_status
6161              ,  x_msg_count                 => l_msg_count
6162              ,  x_msg_data                  => l_msg_data
6163              ,  p_change_id                 => p_change_id        -- Change Id
6164              ,  p_route_id                  => p_route_id         -- WF Route ID
6165             ) ;
6166 
6167 
6168 IF g_debug_flag THEN
6169   Write_Debug('After calling ENG_DOCUMENT_UTIL.Start_Doc_LC_Phase_WF: ' || l_return_status );
6170 END IF ;
6171             IF l_return_status <> FND_API.G_RET_STS_SUCCESS
6172             THEN
6173                 x_return_status :=  l_return_status ;
6174             END IF ;
6175 
6176         END IF ;
6177 
6178 
6179 
6180 
6181         IF NOT CheckMandatoryAssignee(p_route_id => p_route_id)
6182         THEN
6183            x_return_status := FND_API.G_RET_STS_ERROR ;
6184         END IF;
6185 
6186 
6187         /*
6188         -- Check Required Date is not passed due
6189         -- No longer used
6190         -- because we changed the logic to that
6191         -- Required Date is generated when the step wf is started
6192         --
6193         -- Verify this route step required dates
6194         -- 1. equal to or greater than SYSDATE
6195         -- 2. the greater step num, the later required date
6196         IF NOT CheckRouteStepRequiredDate(p_route_id => p_route_id)
6197         THEN
6198 
6199             x_return_status := FND_API.G_RET_STS_ERROR ;
6200 
6201         END IF ;
6202         */
6203 
6204         -- Verify Route Status is NOT_STARTED
6205         -- Verify Route is instance (neither tempalte or history
6206         IF NOT CheckRouteStatus( p_route_id       => p_route_id
6207                                , p_change_id      => p_change_id
6208                                , p_change_line_id => p_change_line_id )
6209         THEN
6210 
6211 IF g_debug_flag THEN
6212    Write_Debug('Verify Route Status is NOT_STARTED . . .');
6213    Write_Debug('Verify Route is Instance . . .');
6214 END IF ;
6215 
6216 
6217             x_return_status := FND_API.G_RET_STS_ERROR ;
6218 
6219         END IF ;
6220 
6221 
6222 
6223         /* Comment Out: We decided to igonore this assignee
6224         -- rather than returning an error
6225         -- Verify that not evaluated assignee does not exist
6226         IF NOT CheckRouteAssignees( p_route_id       => p_route_id
6227                                   , p_change_id      => p_change_id
6228                                   , p_change_line_id => p_change_line_id )
6229         THEN
6230 
6231 IF g_debug_flag THEN
6232    Write_Debug('Verify there is not missing assignee . . .');
6233 END IF ;
6234 
6235             x_return_status := FND_API.G_RET_STS_ERROR ;
6236 
6237         END IF ;
6238         */
6239 
6240 
6241     END IF ;
6242 
6243 
6244 
6245     -- Item type: G_CHANGE_ROUTE_STEP_ITEM_TYPE
6246     -- Change Route Step Workflow Processes
6247     -- Validation Logic
6248     -- p_route_id should not be null
6249     -- p_route_step_id should not be null
6250     -- The Route Step Status should be 'NOT_STARTED'
6251 
6252 
6253 
6254 EXCEPTION
6255     WHEN OTHERS THEN
6256 
6257     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
6258     IF  FND_MSG_PUB.Check_Msg_Level
6259       (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
6260     THEN
6261             FND_MSG_PUB.Add_Exc_Msg
6262               ( G_PKG_NAME        ,
6263                 l_api_name
6264             );
6265     END IF;
6266 
6267 END ValidateProcess;
6268 
6269 
6270 PROCEDURE ValidateAbortingProcess
6271 (   p_validation_level  IN  NUMBER   := FND_API.G_VALID_LEVEL_FULL
6272  ,  x_return_status     OUT NOCOPY VARCHAR2
6273  ,  x_msg_count         OUT NOCOPY NUMBER
6274  ,  x_msg_data          OUT NOCOPY VARCHAR2
6275  ,  p_item_type         IN  VARCHAR2
6276  ,  p_item_key          IN  VARCHAR2
6277  ,  p_process_name      IN  VARCHAR2
6278  ,  p_wf_user_id        IN  NUMBER
6279 )
6280 IS
6281     l_api_name       CONSTANT VARCHAR2(30) := 'ValidateAbortingProcess';
6282     l_status         VARCHAR2(8) ;
6283     l_result         VARCHAR2(30) ;
6284 
6285 BEGIN
6286 
6287     --  Initialize API return status to success
6288     x_return_status := FND_API.G_RET_STS_SUCCESS;
6289 
6290     IF p_validation_level <= FND_API.G_VALID_LEVEL_NONE THEN
6291        RETURN ;
6292     END IF ;
6293 
6294 
6295     -- Item Type: ALL
6296     -- p_item_type should not be null
6297     -- p_item_key should not be null
6298     -- p_wf_user_id should not be null
6299 
6300 
6301     -- Check Process Status
6302     WF_ENGINE.ItemStatus
6303     (  itemtype    => p_item_type
6304     ,  itemkey     => p_item_key
6305     ,  status      => l_status
6306     ,  result      => l_result
6307     ) ;
6308 
6309 IF g_debug_flag THEN
6310    Write_Debug('Process Status : ' ||  l_status || ' Result: ' ||  l_result );
6311 END IF ;
6312 
6313 
6314 
6315    IF l_status = G_WF_COMPLETE
6316    THEN
6317 
6318        x_return_status := FND_API.G_RET_STS_ERROR ;
6319 
6320        FND_MESSAGE.SET_NAME('ENG', 'ENG_ROUTE_WF_NOT_RUNNING') ;
6321        FND_MSG_PUB.Add ;
6322 
6323    END IF ;
6324 
6325 EXCEPTION
6326     WHEN OTHERS THEN
6327 
6328     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
6329     IF  FND_MSG_PUB.Check_Msg_Level
6330       (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
6331     THEN
6332             FND_MSG_PUB.Add_Exc_Msg
6333               ( G_PKG_NAME        ,
6334                 l_api_name
6335             );
6336     END IF;
6337 
6338 END ValidateAbortingProcess;
6339 
6340 
6341 
6342 PROCEDURE SetAdhocPartyRole
6343 (   x_return_status     OUT NOCOPY VARCHAR2
6344  ,  x_msg_count         OUT NOCOPY NUMBER
6345  ,  x_msg_data          OUT NOCOPY VARCHAR2
6346  ,  p_item_type         IN  VARCHAR2
6347  ,  p_item_key          IN  VARCHAR2
6348  ,  p_adhoc_party_list  IN  VARCHAR2
6349 )
6350 IS
6351 
6352     l_api_name         CONSTANT VARCHAR2(30) := 'SetAdhocPartyRole';
6353 
6354     -- Role And Users And Privileges
6355     l_party_id            NUMBER ;
6356     l_party_type          VARCHAR2(30) ;
6357     l_role_name           VARCHAR2(320) ;
6358     l_role_display_name   VARCHAR2(320) ;
6359     -- Bug4532263
6360     -- l_role_users       VARCHAR2(2000) ;
6361     l_role_users          WF_DIRECTORY.UserTable ;
6362 
6363 
6364 
6365     c1        PLS_INTEGER;
6366     list_rest VARCHAR2(2000);
6367 
6368 BEGIN
6369 
6370     --  Initialize API return status to success
6371     x_return_status := FND_API.G_RET_STS_SUCCESS;
6372 
6373     -- Get Adhoc Party List
6374     list_rest := LTRIM(p_adhoc_party_list) ;
6375     LOOP
6376 
6377         c1 := INSTR(list_rest, ',');
6378         IF (c1 = 0) THEN
6379             c1 := INSTR(list_rest, ' ');
6380             IF (c1 = 0) THEN
6381                l_party_id := TO_NUMBER(list_rest) ;
6382             ELSE
6383                l_party_id := TO_NUMBER(substr(list_rest, 1, c1-1));
6384             END IF;
6385         ELSE
6386                l_party_id := TO_NUMBER(substr(list_rest, 1, c1-1));
6387         END IF;
6388 
6389         IF l_party_id IS NOT NULL  THEN
6390 
6391             l_party_type  := GetPartyType(p_party_id => l_party_id) ;
6392 
6393             IF l_party_type = 'PERSON' THEN
6394 
6395 
6396                SetUserToRoleUsers2( p_party_id   => l_party_id
6397                                  , x_role_users => l_role_users
6398                                  ) ;
6399 
6400             ELSIF l_party_type = 'GROUP' THEN
6401 
6402                SetGroupToRoleUsers2( p_group_id   => l_party_id
6403                                   , x_role_users => l_role_users
6404                                   ) ;
6405 
6406             END IF ;
6407 
6408         END IF ; -- if l_party_id is not null
6409 
6410         exit when (c1 = 0);
6411         list_rest := LTRIM(SUBSTR(list_rest, c1+1));
6412 
6413     END LOOP ;
6414 
6415     -- Create adhoc role and add users to role
6416     IF ( l_role_users IS NOT NULL AND l_role_users.COUNT > 0 ) THEN
6417 
6418         l_role_name := WF_ENGINE.GetItemAttrText( p_item_type
6419                                                 , p_item_key
6420                                                 , 'ADHOC_PARTY_ROLE');
6421 
6422         l_role_display_name := l_role_name ;
6423 
6424         -- Set Adhoc Role and Users in WF Directory Adhoc Role
6425         SetWFAdhocRole2( p_role_name         => l_role_name
6426                       , p_role_display_name => l_role_display_name
6427                       , p_role_users        => l_role_users
6428                       , p_expiration_date   => NULL
6429                       );
6430 
6431 
6432     ELSE
6433 
6434         -- Return N as None
6435         x_return_status := Eng_Workflow_Util.G_RET_STS_NONE;
6436 
6437     END IF;
6438 
6439 EXCEPTION
6440     WHEN OTHERS THEN
6441 
6442     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
6443     IF  FND_MSG_PUB.Check_Msg_Level
6444       (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
6445     THEN
6446             FND_MSG_PUB.Add_Exc_Msg
6447               ( G_PKG_NAME        ,
6448                 l_api_name
6449             );
6450     END IF;
6451 
6452 END SetAdhocPartyRole ;
6453 
6454 PROCEDURE SetAssigneeRole
6455 (   x_return_status     OUT NOCOPY VARCHAR2
6456  ,  x_msg_count         OUT NOCOPY NUMBER
6457  ,  x_msg_data          OUT NOCOPY VARCHAR2
6458  ,  p_item_type         IN  VARCHAR2
6459  ,  p_item_key          IN  VARCHAR2
6460 )
6461 IS
6462 
6463     l_api_name            CONSTANT VARCHAR2(30) := 'SetAssigneeRole';
6464 
6465     l_change_id           NUMBER ;
6466     l_assignee_party_id   NUMBER ;
6467     l_requestor_party_id  NUMBER ;
6468     l_creator_user_id     NUMBER ;
6469     l_role_name           VARCHAR2(320) ;
6470     l_role_display_name   VARCHAR2(320) ;
6471 
6472     -- Bug4532263
6473     -- l_role_users       VARCHAR2(2000) ;
6474     l_role_users          WF_DIRECTORY.UserTable ;
6475 
6476 
6477 
6478 BEGIN
6479 
6480 
6481 IF g_debug_flag THEN
6482    Write_Debug('Eng_Workflow_Util.SetAssigneeRole Log');
6483    Write_Debug('-----------------------------------------------------');
6484    Write_Debug('Item Type         : ' || p_item_type );
6485    Write_Debug('Item Key          : ' || p_item_key );
6486    Write_Debug('-----------------------------------------------------');
6487 END IF ;
6488 
6489 
6490     --  Initialize API return status to success
6491     x_return_status := FND_API.G_RET_STS_SUCCESS;
6492 
6493     -- Get Change Object Identifier
6494     GetChangeObject
6495     (   p_item_type         => p_item_type
6496      ,  p_item_key          => p_item_key
6497      ,  x_change_id         => l_change_id
6498     ) ;
6499 
6500 IF g_debug_flag THEN
6501    Write_Debug('Get Change Object Identifier . . . ' );
6502 END IF ;
6503 
6504 
6505     -- Get Change Object Party
6506     GetChangeObjectParty
6507     ( p_change_id               => l_change_id
6508     , x_assignee_party_id       => l_assignee_party_id
6509     , x_requestor_party_id      => l_requestor_party_id
6510     , x_creator_user_id         => l_creator_user_id
6511     ) ;
6512 
6513 IF g_debug_flag THEN
6514    Write_Debug('Get Change Object Party . . . Assignee Party Id: ' || to_char(l_assignee_party_id) );
6515 END IF ;
6516 
6517     -- Set Assignee to Role Users
6518     SetAssigneeToRoleUsers2( p_assignee_party_id => l_assignee_party_id
6519                             , x_role_users        => l_role_users
6520                             ) ;
6521 
6522 
6523 IF g_debug_flag THEN
6524    Write_Debug('Set Assignee to Role Users . . . ' );
6525 END IF ;
6526 
6527 
6528     -- Create adhoc role and add users to role
6529     IF ( l_role_users IS NOT NULL AND l_role_users.COUNT > 0 ) THEN
6530 
6531 
6532         l_role_name := WF_ENGINE.GetItemAttrText( p_item_type
6533                                                 , p_item_key
6534                                                 , 'ASSIGNEE_ROLE');
6535 
6536         l_role_display_name := l_role_name ;
6537 
6538         -- Set Adhoc Role and Users in WF Directory Adhoc Role
6539         SetWFAdhocRole2( p_role_name         => l_role_name
6540                       , p_role_display_name => l_role_display_name
6541                       , p_role_users        => l_role_users
6542                       , p_expiration_date   => NULL
6543                       );
6544 
6545 
6546 
6547     ELSE
6548 
6549         -- Return N as None
6550         x_return_status := Eng_Workflow_Util.G_RET_STS_NONE ;
6551 
6552     END IF;
6553 
6554 EXCEPTION
6555     WHEN OTHERS THEN
6556 
6557     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
6558     IF  FND_MSG_PUB.Check_Msg_Level
6559       (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
6560     THEN
6561             FND_MSG_PUB.Add_Exc_Msg
6562               ( G_PKG_NAME        ,
6563                 l_api_name
6564             );
6565     END IF;
6566 
6567 IF g_debug_flag THEN
6568    Write_Debug('Exception in SetAssigneeRole: '
6569                || Substr(To_Char(SQLCODE)||'/'||SQLERRM,1,240));
6570    Close_Debug_Session ;
6571 END IF ;
6572 
6573 END SetAssigneeRole ;
6574 
6575 PROCEDURE SetReviewersRole
6576 (   x_return_status     OUT NOCOPY VARCHAR2
6577  ,  x_msg_count         OUT NOCOPY NUMBER
6578  ,  x_msg_data          OUT NOCOPY VARCHAR2
6579  ,  p_item_type         IN  VARCHAR2
6580  ,  p_item_key          IN  VARCHAR2
6581  ,  p_reviewer_type     IN  VARCHAR2 := 'STD'
6582 )
6583 IS
6584 
6585     l_api_name            CONSTANT VARCHAR2(30) := 'SetReviewersRole';
6586 
6587     l_change_id           NUMBER ;
6588     l_assignee_party_id   NUMBER ;
6589     l_requestor_party_id  NUMBER ;
6590     l_creator_user_id     NUMBER ;
6591     l_role_name           VARCHAR2(320) ;
6592     l_role_display_name   VARCHAR2(320) ;
6593     -- Bug4532263
6594     -- l_role_users       VARCHAR2(2000) ;
6595     l_role_users          WF_DIRECTORY.UserTable ;
6596 
6597 
6598 BEGIN
6599 
6600 
6601 IF g_debug_flag THEN
6602    Write_Debug('Eng_Workflow_Util.SetReviewersRole Log');
6603    Write_Debug('-----------------------------------------------------');
6604    Write_Debug('Item Type         : ' || p_item_type );
6605    Write_Debug('Item Key          : ' || p_item_key );
6606    Write_Debug('Reviewer Type     : ' || p_reviewer_type );
6607    Write_Debug('-----------------------------------------------------');
6608 END IF ;
6609 
6610 
6611 
6612     --  Initialize API return status to success
6613     x_return_status := FND_API.G_RET_STS_SUCCESS;
6614 
6615 IF g_debug_flag THEN
6616    Write_Debug('Get Change Object Identifier . . . ' );
6617 END IF ;
6618 
6619 
6620     -- Get Change Object Identifier
6621     GetChangeObject
6622     (   p_item_type         => p_item_type
6623      ,  p_item_key          => p_item_key
6624      ,  x_change_id         => l_change_id
6625     ) ;
6626 
6627 
6628 IF g_debug_flag THEN
6629    Write_Debug('Get Change Object Party . . . ' );
6630 END IF ;
6631 
6632 
6633 
6634     -- Get Change Object Party
6635     GetChangeObjectParty
6636     ( p_change_id               => l_change_id
6637     , x_assignee_party_id       => l_assignee_party_id
6638     , x_requestor_party_id      => l_requestor_party_id
6639     , x_creator_user_id         => l_creator_user_id
6640     ) ;
6641 
6642 
6643 IF g_debug_flag THEN
6644    Write_Debug('Assignee Party Id: ' || TO_CHAR(l_assignee_party_id) );
6645    Write_Debug('Requestor Party Id: ' || TO_CHAR(l_requestor_party_id) );
6646    Write_Debug('Creator Party Id: ' || TO_CHAR(l_creator_user_id) );
6647 END IF ;
6648 
6649 
6650     IF p_reviewer_type <> 'NO_ASSIGNEE' THEN
6651 
6652 IF g_debug_flag THEN
6653    Write_Debug('Calling SetAssigneeToRoleUsers2. . . ' );
6654 END IF ;
6655 
6656         -- Set Assignee to Role Users
6657         SetAssigneeToRoleUsers2( p_assignee_party_id => l_assignee_party_id
6658                                , x_role_users        => l_role_users
6659                                ) ;
6660 
6661 IF g_debug_flag THEN
6662    Write_Debug('After Set Assignee to Role Users . . . ' );
6663 END IF ;
6664 
6665 
6666     END IF ;
6667 
6668 
6669 IF g_debug_flag THEN
6670    Write_Debug('Calling SetCreatorToRoleUsers2. . . ' );
6671 END IF ;
6672 
6673     -- Set Creator to Role Users
6674     SetCreatorToRoleUsers2(  p_creator_user_id   => l_creator_user_id
6675                            , x_role_users        => l_role_users
6676                            ) ;
6677 
6678 
6679 IF g_debug_flag THEN
6680    Write_Debug('After Set Creator to Role Users . . . ' );
6681    Write_Debug('Calling SetRequestorToRoleUsers2. . . ' );
6682 END IF ;
6683 
6684 
6685 
6686     -- Set Requestor to Role Users
6687     SetRequestorToRoleUsers2(p_requestor_party_id => l_requestor_party_id
6688                            , x_role_users         => l_role_users
6689                            ) ;
6690 
6691 
6692 
6693 IF g_debug_flag THEN
6694    Write_Debug('After Set Requstor to Role Users . . . ' );
6695 END IF ;
6696 
6697 
6698     -- Create adhoc role and add users to role
6699     IF ( l_role_users IS NOT NULL AND l_role_users.COUNT > 0 ) THEN
6700 
6701         l_role_name := WF_ENGINE.GetItemAttrText( p_item_type
6702                                                 , p_item_key
6703                                                 , 'REVIEWERS_ROLE');
6704 
6705 
6706         l_role_display_name := l_role_name ;
6707 
6708         -- Set Adhoc Role and Users in WF Directory Adhoc Role
6709         SetWFAdhocRole2( p_role_name         => l_role_name
6710                       , p_role_display_name => l_role_display_name
6711                       , p_role_users        => l_role_users
6712                       , p_expiration_date   => NULL
6713                       );
6714 
6715 
6716     ELSE
6717 
6718         -- Return N as None
6719         x_return_status := Eng_Workflow_Util.G_RET_STS_NONE ;
6720 
6721     END IF;
6722 
6723 EXCEPTION
6724     WHEN OTHERS THEN
6725 
6726     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
6727     IF  FND_MSG_PUB.Check_Msg_Level
6728       (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
6729     THEN
6730             FND_MSG_PUB.Add_Exc_Msg
6731               ( G_PKG_NAME        ,
6732                 l_api_name
6733             );
6734     END IF;
6735 
6736 IF g_debug_flag THEN
6737    Write_Debug('Exception in SetReviewersRole: '
6738                || Substr(To_Char(SQLCODE)||'/'||SQLERRM,1,240));
6739    Close_Debug_Session ;
6740 END IF ;
6741 
6742 END SetReviewersRole ;
6743 
6744 
6745 
6746 
6747 PROCEDURE StartAllLineWorkflows
6748 (   x_return_status     OUT NOCOPY VARCHAR2
6749  ,  x_msg_count         OUT NOCOPY NUMBER
6750  ,  x_msg_data          OUT NOCOPY VARCHAR2
6751  ,  p_item_type         IN  VARCHAR2
6752  ,  p_item_key          IN  VARCHAR2
6753  ,  p_change_id         IN  NUMBER
6754  ,  p_wf_user_id        IN  NUMBER
6755  ,  p_host_url          IN  VARCHAR2 := NULL
6756  ,  p_line_item_type    IN  VARCHAR2
6757  ,  p_line_process_name IN  VARCHAR2
6758 )
6759 IS
6760 
6761     -- PRAGMA  AUTONOMOUS_TRANSACTION;
6762     l_api_name          CONSTANT VARCHAR2(30) := 'StartAllLineWorkflows';
6763 
6764     l_return_status     VARCHAR2(1) ;
6765     l_line_item_key     VARCHAR2(240)  ;
6766     l_change_id         NUMBER ;
6767     l_debug             VARCHAR2(1)    := FND_API.G_FALSE ;
6768     l_output_dir        VARCHAR2(240)  := '' ;
6769     l_debug_filename    VARCHAR2(200)  := 'StartAllLineWorkflows.log' ;
6770 
6771     CURSOR  c_lines  (p_change_id NUMBER)
6772     IS
6773         SELECT change_line_id
6774           FROM ENG_CHANGE_LINES
6775          WHERE change_id = p_change_id
6776            AND change_type_id <> -1  -- excluding change task
6777            AND sequence_number <> -1 ;
6778 
6779 BEGIN
6780 
6781 
6782 IF g_debug_flag THEN
6783    Write_Debug('Eng_Workflow_Util.StartAllLineWorkflows');
6784    Write_Debug('-----------------------------------------------------');
6785    Write_Debug('Item Type   : ' || p_item_type );
6786    Write_Debug('Item Key    : ' || p_item_key );
6787    Write_Debug('Change Id   : ' || TO_CHAR(p_change_id) );
6788    Write_Debug('WF User Id  : ' || TO_CHAR(p_wf_user_id) );
6789    Write_Debug('Line Item Type : ' || p_line_item_type );
6790    Write_Debug('Line Item Key  : ' || p_line_process_name);
6791    Write_Debug('-----------------------------------------------------');
6792 END IF ;
6793 
6794     --  Initialize API return status to success
6795     l_return_status := FND_API.G_RET_STS_SUCCESS;
6796     x_return_status := FND_API.G_RET_STS_SUCCESS;
6797 
6798 
6799     --
6800     -- Don't try to get Parent Item Attributes from this procedure
6801     -- because this proc is setting PRAGMA  AUTONOMOUS_TRANSACTION
6802     -- If the user modify the Cost info to '0' in Worklfow Definition,
6803     -- the process can not get the Item Attributes because the parent item
6804     -- attr is not saved yet and here is in different session
6805     --
6806 
6807     -- Get Change Lines
6808     FOR line_rec IN c_lines (p_change_id => p_change_id)
6809     LOOP
6810 
6811         -- Initialize Line Item Key
6812         l_line_item_key := null ;
6813 
6814         -- Start Change Line Workflows
6815         --  FND_MSG_PUB.initialize ;
6816         Eng_Workflow_Util.StartWorkflow
6817         (  p_api_version       => 1.0
6818         ,  p_init_msg_list     => FND_API.G_FALSE
6819         ,  p_commit            => FND_API.G_FALSE
6820         ,  p_validation_level  => FND_API.G_VALID_LEVEL_FULL
6821         ,  x_return_status     => l_return_status
6822         ,  x_msg_count         => x_msg_count
6823         ,  x_msg_data          => x_msg_data
6824         ,  p_item_type         => p_line_item_type
6825         ,  x_item_key          => l_line_item_key
6826         ,  p_process_name      => p_line_process_name
6827         ,  p_change_line_id    => line_rec.change_line_id
6828         ,  p_wf_user_id        => p_wf_user_id
6829         ,  p_host_url          => p_host_url
6830         ,  p_parent_item_type  => p_item_type
6831         ,  p_parent_item_key   => p_item_key
6832         ,  p_debug             => l_debug
6833         ,  p_output_dir        => l_output_dir
6834         ,  p_debug_filename    => l_debug_filename || TO_CHAR(line_rec.change_line_id)
6835         ) ;
6836 
6837         IF l_return_status <>  FND_API.G_RET_STS_SUCCESS
6838         THEN
6839 
6840            x_return_status := l_return_status ;
6841 
6842         END IF ;
6843 
6844 IF g_debug_flag THEN
6845    Write_Debug('After call Eng_Workflow_Util.StartWorkflow' ) ;
6846    Write_Debug('Return Status: '     || l_return_status ) ;
6847    Write_Debug('Return Message: '    || x_msg_data ) ;
6848    Write_Debug('Started Change Line Id : ' || TO_CHAR(line_rec.change_line_id) ) ;
6849    Write_Debug('Started CL WF Item Type: ' || p_line_item_type ) ;
6850    Write_Debug('Started CL WF Item Kye: ' || l_line_item_key ) ;
6851    Write_Debug('Started CL WF Process Name: ' || p_line_process_name ) ;
6852 END IF ;
6853 
6854 
6855     END LOOP ;
6856 
6857 
6858 
6859     IF x_return_status =  FND_API.G_RET_STS_SUCCESS
6860     THEN
6861 
6862         -- COMMENT OUT  PRAGMA  AUTONOMOUS_TRANSACTION
6863         -- COMMIT ;
6864         NULL ;
6865 
6866     ELSE
6867 
6868         -- COMMENT OUT  PRAGMA  AUTONOMOUS_TRANSACTION
6869         -- ROLLBACK ;
6870         RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
6871 
6872     END IF ;
6873 
6874 
6875 EXCEPTION
6876     WHEN OTHERS THEN
6877     -- ROLLBACK ;
6878     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
6879 
6880     IF  FND_MSG_PUB.Check_Msg_Level
6881       (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
6882     THEN
6883             FND_MSG_PUB.Add_Exc_Msg
6884             ( G_PKG_NAME
6885             , l_api_name
6886             );
6887     END IF;
6888 
6889 END StartAllLineWorkflows ;
6890 
6891 
6892 
6893 PROCEDURE SetLineAssigneeRole
6894 (   x_return_status     OUT NOCOPY VARCHAR2
6895  ,  x_msg_count         OUT NOCOPY NUMBER
6896  ,  x_msg_data          OUT NOCOPY VARCHAR2
6897  ,  p_item_type         IN  VARCHAR2
6898  ,  p_item_key          IN  VARCHAR2
6899 )
6900 IS
6901 
6902     l_api_name            CONSTANT VARCHAR2(30) := 'SetLineAssigneeRole';
6903 
6904     l_change_line_id           NUMBER ;
6905     l_line_assignee_party_id   NUMBER ;
6906     l_line_creator_user_id     NUMBER ;
6907     l_role_name                VARCHAR2(320) ;
6908     l_role_display_name        VARCHAR2(320) ;
6909     -- Bug4532263
6910     -- l_role_users       VARCHAR2(2000) ;
6911     l_role_users          WF_DIRECTORY.UserTable ;
6912 
6913 BEGIN
6914 
6915 
6916 IF g_debug_flag THEN
6917    Write_Debug('Eng_Workflow_Util.SetLineAssigneeRole Log');
6918    Write_Debug('-----------------------------------------------------');
6919    Write_Debug('Item Type         : ' || p_item_type );
6920    Write_Debug('Item Key          : ' || p_item_key );
6921    Write_Debug('-----------------------------------------------------');
6922 END IF ;
6923 
6924     --  Initialize API return status to success
6925     x_return_status := FND_API.G_RET_STS_SUCCESS;
6926 
6927     -- Get Change Line Object Identifier
6928     GetChangeLineObject
6929     (   p_item_type         => p_item_type
6930      ,  p_item_key          => p_item_key
6931      ,  x_change_line_id    => l_change_line_id
6932     ) ;
6933 
6934 IF g_debug_flag THEN
6935    Write_Debug('Get Change Line Object Identifier . . . ' );
6936 END IF ;
6937 
6938     -- Get Change Object Party
6939     GetChangeLineObjectParty
6940     ( p_change_line_id          => l_change_line_id
6941     , x_assignee_party_id       => l_line_assignee_party_id
6942     , x_creator_user_id         => l_line_creator_user_id
6943     ) ;
6944 
6945 IF g_debug_flag THEN
6946    Write_Debug('Get Line Change Object Party . . . Assignee Party Id: ' || to_char(l_line_assignee_party_id) );
6947 END IF ;
6948 
6949     -- Set Assignee to Role Users
6950     SetAssigneeToRoleUsers2( p_assignee_party_id => l_line_assignee_party_id
6951                            , x_role_users        => l_role_users
6952                             ) ;
6953 
6954 
6955 IF g_debug_flag THEN
6956    Write_Debug('Set Assignee to Role Users . . . ' );
6957 END IF ;
6958 
6959 
6960     -- Create adhoc role and add users to role
6961     IF ( l_role_users IS NOT NULL AND l_role_users.COUNT > 0 ) THEN
6962 
6963         l_role_name := WF_ENGINE.GetItemAttrText( p_item_type
6964                                                 , p_item_key
6965                                                 , 'LINE_ASSIGNEE_ROLE');
6966 
6967         l_role_display_name := l_role_name ;
6968 
6969         -- Set Adhoc Role and Users in WF Directory Adhoc Role
6970         SetWFAdhocRole2( p_role_name         => l_role_name
6971                       , p_role_display_name => l_role_display_name
6972                       , p_role_users        => l_role_users
6973                       , p_expiration_date   => NULL
6974                       );
6975 
6976 
6977     ELSE
6978 
6979         -- Return N as None
6980         x_return_status := Eng_Workflow_Util.G_RET_STS_NONE ;
6981 
6982     END IF;
6983 
6984 EXCEPTION
6985     WHEN OTHERS THEN
6986 
6987     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
6988     IF  FND_MSG_PUB.Check_Msg_Level
6989       (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
6990     THEN
6991             FND_MSG_PUB.Add_Exc_Msg
6992               ( G_PKG_NAME        ,
6993                 l_api_name
6994             );
6995     END IF;
6996 
6997 IF g_debug_flag THEN
6998    Write_Debug('Exception in SetLineAssigneeRole: '
6999                || Substr(To_Char(SQLCODE)||'/'||SQLERRM,1,240));
7000    Close_Debug_Session ;
7001 END IF ;
7002 
7003 END SetLineAssigneeRole ;
7004 
7005 
7006 PROCEDURE SetLineReviewersRole
7007 (   x_return_status     OUT NOCOPY VARCHAR2
7008  ,  x_msg_count         OUT NOCOPY NUMBER
7009  ,  x_msg_data          OUT NOCOPY VARCHAR2
7010  ,  p_item_type         IN  VARCHAR2
7011  ,  p_item_key          IN  VARCHAR2
7012  ,  p_reviewer_type     IN  VARCHAR2 := 'STD'
7013 )
7014 IS
7015 
7016     l_api_name            CONSTANT VARCHAR2(30) := 'SetLineReviewersRole';
7017 
7018     l_change_id                NUMBER ;
7019     l_change_line_id           NUMBER ;
7020     l_assignee_party_id        NUMBER ;
7021     l_requestor_party_id       NUMBER ;
7022     l_creator_user_id          NUMBER ;
7023     l_line_assignee_party_id   NUMBER ;
7024     l_line_creator_user_id     NUMBER ;
7025     l_role_name                VARCHAR2(320) ;
7026     l_role_display_name        VARCHAR2(320) ;
7027     -- Bug4532263
7028     -- l_role_users       VARCHAR2(2000) ;
7029     l_role_users          WF_DIRECTORY.UserTable ;
7030 
7031 BEGIN
7032 
7033 
7034 IF g_debug_flag THEN
7035    Write_Debug('Eng_Workflow_Util.SetLineReviewersRole Log');
7036    Write_Debug('-----------------------------------------------------');
7037    Write_Debug('Item Type         : ' || p_item_type );
7038    Write_Debug('Item Key          : ' || p_item_key );
7039    Write_Debug('Reviewer Type     : ' || p_reviewer_type );
7040    Write_Debug('-----------------------------------------------------');
7041 END IF ;
7042 
7043 
7044     --  Initialize API return status to success
7045     x_return_status := FND_API.G_RET_STS_SUCCESS;
7046 
7047 IF g_debug_flag THEN
7048    Write_Debug('Get Change Header and Line Object Identifier . . . ' );
7049 END IF ;
7050 
7051     -- Get Change Object Identifier
7052     GetChangeObject
7053     (   p_item_type         => p_item_type
7054      ,  p_item_key          => p_item_key
7055      ,  x_change_id         => l_change_id
7056     ) ;
7057 
7058     -- Get Change Line Object Identifier
7059     GetChangeLineObject
7060     (   p_item_type         => p_item_type
7061      ,  p_item_key          => p_item_key
7062      ,  x_change_line_id    => l_change_line_id
7063     ) ;
7064 
7065 
7066 IF g_debug_flag THEN
7067    Write_Debug('Get Change Object Party . . . ' );
7068 END IF ;
7069 
7070 
7071     -- Get Change Object Party
7072     GetChangeObjectParty
7073     ( p_change_id               => l_change_id
7074     , x_assignee_party_id       => l_assignee_party_id
7075     , x_requestor_party_id      => l_requestor_party_id
7076     , x_creator_user_id         => l_creator_user_id
7077     ) ;
7078 
7079 
7080     -- Get Change Line Object Party
7081     GetChangeLineObjectParty
7082     ( p_change_line_id          => l_change_line_id
7083     , x_assignee_party_id       => l_line_assignee_party_id
7084     , x_creator_user_id         => l_line_creator_user_id
7085     ) ;
7086 
7087 
7088     IF p_reviewer_type <> 'NO_ASSIGNEE' THEN
7089 
7090         -- Set Assignee to Role Users
7091         SetAssigneeToRoleUsers2( p_assignee_party_id => l_line_assignee_party_id
7092                                , x_role_users        => l_role_users
7093                                ) ;
7094 
7095 IF g_debug_flag THEN
7096    Write_Debug('Set Line_Assignee to Role Users . . . ' );
7097 END IF ;
7098 
7099     END IF ;
7100 
7101 
7102     -- Set Line Creator to Role Users
7103     SetCreatorToRoleUsers2(  p_creator_user_id   => l_line_creator_user_id
7104                            , x_role_users        => l_role_users
7105                            ) ;
7106 
7107 IF g_debug_flag THEN
7108    Write_Debug('Set Line Creator to Role Users . . . ' );
7109 END IF ;
7110 
7111 
7112     -- Set Header Assignee to Role Users
7113     SetAssigneeToRoleUsers2( p_assignee_party_id => l_line_assignee_party_id
7114                            , x_role_users        => l_role_users
7115                             ) ;
7116 
7117 IF g_debug_flag THEN
7118    Write_Debug('Set Header Assignee to Role Users . . . ' );
7119 END IF ;
7120 
7121     -- Set Header Creator to Role Users
7122     SetCreatorToRoleUsers2(  p_creator_user_id   => l_creator_user_id
7123                            , x_role_users        => l_role_users
7124                            ) ;
7125 
7126 IF g_debug_flag THEN
7127    Write_Debug('Set Creator to Role Users . . . ' );
7128 END IF ;
7129 
7130     -- Set Header Requestor to Role Users
7131     SetRequestorToRoleUsers2(p_requestor_party_id => l_requestor_party_id
7132                            , x_role_users         => l_role_users
7133                            ) ;
7134 
7135 
7136 
7137 IF g_debug_flag THEN
7138    Write_Debug('Set Requstor to Role Users . . . ' );
7139 END IF ;
7140 
7141     -- Create adhoc role and add users to role
7142     IF ( l_role_users IS NOT NULL AND l_role_users.COUNT > 0 ) THEN
7143 
7144 
7145         l_role_name := WF_ENGINE.GetItemAttrText( p_item_type
7146                                                 , p_item_key
7147                                                 , 'LINE_REVIEWERS_ROLE');
7148 
7149         l_role_display_name := l_role_name ;
7150 
7151         -- Set Adhoc Role and Users in WF Directory Adhoc Role
7152         SetWFAdhocRole2( p_role_name         => l_role_name
7153                       , p_role_display_name => l_role_display_name
7154                       , p_role_users        => l_role_users
7155                       , p_expiration_date   => NULL
7156                       );
7157 
7158 
7159     ELSE
7160 
7161         -- Return N as None
7162         x_return_status := Eng_Workflow_Util.G_RET_STS_NONE ;
7163 
7164     END IF;
7165 
7166 EXCEPTION
7167     WHEN OTHERS THEN
7168 
7169     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
7170     IF  FND_MSG_PUB.Check_Msg_Level
7171       (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
7172     THEN
7173             FND_MSG_PUB.Add_Exc_Msg
7174               ( G_PKG_NAME        ,
7175                 l_api_name
7176             );
7177     END IF;
7178 
7179 IF g_debug_flag THEN
7180    Write_Debug('Exception in SetLineReviewersRole: '
7181                || Substr(To_Char(SQLCODE)||'/'||SQLERRM,1,240));
7182    Close_Debug_Session ;
7183 END IF ;
7184 
7185 END SetLineReviewersRole ;
7186 
7187 
7188 PROCEDURE SetRoutePeopleRole
7189 (   x_return_status     OUT NOCOPY VARCHAR2
7190  ,  x_msg_count         OUT NOCOPY NUMBER
7191  ,  x_msg_data          OUT NOCOPY VARCHAR2
7192  ,  p_item_type         IN  VARCHAR2
7193  ,  p_item_key          IN  VARCHAR2
7194  ,  p_option            IN  VARCHAR2 := NULL
7195 )
7196 IS
7197 
7198     l_api_name            CONSTANT VARCHAR2(30) := 'SetRoutePeopleRole';
7199 
7200     l_route_id            NUMBER ;
7201     l_route_step_id       NUMBER ;
7202     l_change_id           NUMBER ;
7203     l_assignee_party_id   NUMBER ;
7204     l_requestor_party_id  NUMBER ;
7205     l_creator_user_id     NUMBER ;
7206     l_role_name           VARCHAR2(320) ;
7207     l_role_display_name   VARCHAR2(320) ;
7208     -- Bug4532263
7209     -- l_role_users       VARCHAR2(2000) ;
7210     l_role_users          WF_DIRECTORY.UserTable ;
7211 
7212 BEGIN
7213 
7214 
7215 IF g_debug_flag THEN
7216    Write_Debug('Eng_Workflow_Util.SetRoutePeopleRole Log');
7217    Write_Debug('-----------------------------------------------------');
7218    Write_Debug('Item Type         : ' || p_item_type );
7219    Write_Debug('Item Key          : ' || p_item_key );
7220    Write_Debug('-----------------------------------------------------');
7221 END IF ;
7222 
7223 
7224     --  Initialize API return status to success
7225     x_return_status := FND_API.G_RET_STS_SUCCESS;
7226 
7227     -- Get Route Route Id
7228     GetRouteId
7229     (   p_item_type         => p_item_type
7230      ,  p_item_key          => p_item_key
7231      ,  x_route_id          => l_route_id
7232     ) ;
7233 
7234 IF g_debug_flag THEN
7235    Write_Debug('Get Route Id . . .  ' || to_char(l_route_id) );
7236 END IF ;
7237 
7238     -- Get Route Step Id
7239     GetRouteStepId
7240     (   p_item_type         => p_item_type
7241      ,  p_item_key          => p_item_key
7242      ,  x_route_step_id     => l_route_step_id
7243     ) ;
7244 
7245 IF g_debug_flag THEN
7246    Write_Debug('Get Route Step Id . . .  ' || to_char(l_route_step_id) );
7247 END IF ;
7248 
7249 
7250 IF g_debug_flag THEN
7251    Write_Debug('Get Change Route People ');
7252 END IF ;
7253 
7254     -- Set Route People to Role Users
7255     -- all people in the approval workflow that have already
7256     -- been notified (i.e. completed or in process steps)
7257     SetRoutePeopleToRoleUsers2( p_route_id     => l_route_id
7258                               , x_role_users   => l_role_users
7259                               ) ;
7260 
7261 
7262 IF g_debug_flag THEN
7263    Write_Debug('Set Step People to Role Users . . . ' );
7264 END IF ;
7265 
7266 
7267     -- Create adhoc role and add users to role
7268     IF ( l_role_users IS NOT NULL AND l_role_users.COUNT > 0 ) THEN
7269 
7270 
7271         l_role_name := WF_ENGINE.GetItemAttrText( p_item_type
7272                                                 , p_item_key
7273                                                 , 'ROUTE_PEOPLE_ROLE');
7274 
7275         l_role_display_name := l_role_name ;
7276 
7277         -- Set Adhoc Role and Users in WF Directory Adhoc Role
7278         SetWFAdhocRole2( p_role_name         => l_role_name
7279                       , p_role_display_name => l_role_display_name
7280                       , p_role_users        => l_role_users
7281                       , p_expiration_date   => NULL
7282                       );
7283 
7284 
7285     ELSE
7286 
7287         -- Return N as None
7288         x_return_status := Eng_Workflow_Util.G_RET_STS_NONE;
7289 
7290     END IF;
7291 
7292 EXCEPTION
7293     WHEN OTHERS THEN
7294 
7295     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
7296     IF  FND_MSG_PUB.Check_Msg_Level
7297       (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
7298     THEN
7299             FND_MSG_PUB.Add_Exc_Msg
7300               ( G_PKG_NAME        ,
7301                 l_api_name
7302             );
7303     END IF;
7304 
7305 IF g_debug_flag THEN
7306    Write_Debug('Exception in SetRoutePeopleRole: '
7307                || Substr(To_Char(SQLCODE)||'/'||SQLERRM,1,240));
7308    Close_Debug_Session ;
7309 END IF ;
7310 
7311 END SetRoutePeopleRole ;
7312 
7313 
7314 
7315 
7316 PROCEDURE SetStepPeopleRole
7317 (   x_return_status     OUT NOCOPY VARCHAR2
7318  ,  x_msg_count         OUT NOCOPY NUMBER
7319  ,  x_msg_data          OUT NOCOPY VARCHAR2
7320  ,  p_item_type         IN  VARCHAR2
7321  ,  p_item_key          IN  VARCHAR2
7322 )
7323 IS
7324 
7325     l_api_name            CONSTANT VARCHAR2(30) := 'SetStepPeopleRole';
7326 
7327     l_route_step_id       NUMBER ;
7328     l_change_id           NUMBER ;
7329     l_assignee_party_id   NUMBER ;
7330     l_requestor_party_id  NUMBER ;
7331     l_creator_user_id     NUMBER ;
7332     l_role_name           VARCHAR2(320) ;
7333     l_role_display_name   VARCHAR2(320) ;
7334     -- Bug4532263
7335     -- l_role_users       VARCHAR2(2000) ;
7336     l_role_users          WF_DIRECTORY.UserTable ;
7337 
7338 BEGIN
7339 
7340 
7341 IF g_debug_flag THEN
7342    Write_Debug('Eng_Workflow_Util.SetStepPeopleRole Log');
7343    Write_Debug('-----------------------------------------------------');
7344    Write_Debug('Item Type         : ' || p_item_type );
7345    Write_Debug('Item Key          : ' || p_item_key );
7346    Write_Debug('-----------------------------------------------------');
7347 END IF ;
7348 
7349 
7350     --  Initialize API return status to success
7351     x_return_status := FND_API.G_RET_STS_SUCCESS;
7352 
7353     -- Get Route Step Id
7354     GetRouteStepId
7355     (   p_item_type         => p_item_type
7356      ,  p_item_key          => p_item_key
7357      ,  x_route_step_id     => l_route_step_id
7358     ) ;
7359 
7360 IF g_debug_flag THEN
7361    Write_Debug('Get Route Step Id . . .  ' || to_char(l_route_step_id) );
7362 END IF ;
7363 
7364 
7365 IF g_debug_flag THEN
7366    Write_Debug('Get Change Route Step People ');
7367 END IF ;
7368 
7369     -- Set Step People to Role Users
7370     SetStepPeopleToRoleUsers2( p_route_step_id     => l_route_step_id
7371                              , x_role_users        => l_role_users
7372                               ) ;
7373 
7374 
7375 IF g_debug_flag THEN
7376    Write_Debug('Set Step People to Role Users . . . ' );
7377 END IF ;
7378 
7379 
7380     -- Create adhoc role and add users to role
7381     IF ( l_role_users IS NOT NULL AND l_role_users.COUNT > 0 ) THEN
7382 
7383 
7384         l_role_name := WF_ENGINE.GetItemAttrText( p_item_type
7385                                                 , p_item_key
7386                                                 , 'STEP_PEOPLE_ROLE');
7387 
7388         l_role_display_name := l_role_name ;
7389 
7390         -- Set Adhoc Role and Users in WF Directory Adhoc Role
7391         SetWFAdhocRole2( p_role_name         => l_role_name
7392                       , p_role_display_name => l_role_display_name
7393                       , p_role_users        => l_role_users
7394                       , p_expiration_date   => NULL
7395                       );
7396 
7397     ELSE
7398 
7399         -- Return N as None
7400         x_return_status := Eng_Workflow_Util.G_RET_STS_NONE;
7401 
7402     END IF;
7403 
7404 EXCEPTION
7405     WHEN OTHERS THEN
7406 
7407     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
7408     IF  FND_MSG_PUB.Check_Msg_Level
7409       (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
7410     THEN
7411             FND_MSG_PUB.Add_Exc_Msg
7412               ( G_PKG_NAME        ,
7413                 l_api_name
7414             );
7415     END IF;
7416 
7417 IF g_debug_flag THEN
7418    Write_Debug('Exception in SetStepPeopleRole: '
7419                || Substr(To_Char(SQLCODE)||'/'||SQLERRM,1,240));
7420    Close_Debug_Session ;
7421 END IF ;
7422 
7423 END SetStepPeopleRole ;
7424 
7425 
7426 PROCEDURE DeleteAdhocRolesAndUsers
7427 (   x_return_status     OUT NOCOPY VARCHAR2
7428  ,  x_msg_count         OUT NOCOPY NUMBER
7429  ,  x_msg_data          OUT NOCOPY VARCHAR2
7430  ,  p_item_type         IN  VARCHAR2
7431  ,  p_item_key          IN  VARCHAR2
7432 )
7433 IS
7434 
7435     l_api_name            CONSTANT VARCHAR2(30) := 'DeleteAdhocRolesAndUsers';
7436 
7437 
7438     TYPE Del_Roles IS TABLE OF VARCHAR2(320)
7439     INDEX BY BINARY_INTEGER ;
7440 
7441     l_role_names Del_Roles ;
7442     I PLS_INTEGER := 0 ;
7443 
7444 
7445 BEGIN
7446 
7447     --  Initialize API return status to success
7448     x_return_status := FND_API.G_RET_STS_SUCCESS;
7449 
7450 
7451     -- Eng Workflow Adhoc Roles Pre-Fix
7452     -- G_ADHOC_PARTY_ROLE
7453     -- G_REV_ROLE
7454     -- G_ASSIGNEE_ROLE
7455     -- G_OWNER_ROLE
7456     -- G_ROUTE_PEOPLE_ROLE
7457     -- G_STEP_PEOPLE_ROLE
7458     -- G_LINE_REV_ROLE
7459     -- G_LINE_ASSIGNEE_ROLE
7460 
7461     I := I + 1 ;
7462     l_role_names(I) := GetWFAdhocRoleName
7463                        ( p_role_prefix => Eng_Workflow_Util.G_ADHOC_PARTY_ROLE
7464                        , p_item_type   => p_item_type
7465                        , p_item_key    => p_item_key ) ;
7466 
7467     I := I + 1 ;
7468     l_role_names(I) := GetWFAdhocRoleName
7469                        ( p_role_prefix => Eng_Workflow_Util.G_REV_ROLE
7470                        , p_item_type   => p_item_type
7471                        , p_item_key    => p_item_key ) ;
7472 
7473 
7474     I := I + 1 ;
7475     l_role_names(I) := GetWFAdhocRoleName
7476                        ( p_role_prefix => Eng_Workflow_Util.G_ASSIGNEE_ROLE
7477                        , p_item_type   => p_item_type
7478                        , p_item_key    => p_item_key ) ;
7479 
7480     I := I + 1 ;
7481     l_role_names(I) := GetWFAdhocRoleName
7482                        ( p_role_prefix => Eng_Workflow_Util.G_OWNER_ROLE
7483                        , p_item_type   => p_item_type
7484                        , p_item_key    => p_item_key ) ;
7485 
7486     I := I + 1 ;
7487     l_role_names(I) := GetWFAdhocRoleName
7488                        ( p_role_prefix => Eng_Workflow_Util.G_ROUTE_PEOPLE_ROLE
7489                        , p_item_type   => p_item_type
7490                        , p_item_key    => p_item_key ) ;
7491 
7492 
7493     I := I + 1 ;
7494     l_role_names(I) := GetWFAdhocRoleName
7495                        ( p_role_prefix => Eng_Workflow_Util.G_STEP_PEOPLE_ROLE
7496                        , p_item_type   => p_item_type
7497                        , p_item_key    => p_item_key ) ;
7498 
7499     I := I + 1 ;
7500     l_role_names(I) := GetWFAdhocRoleName
7501                        ( p_role_prefix => Eng_Workflow_Util.G_LINE_REV_ROLE
7502                        , p_item_type   => p_item_type
7503                        , p_item_key    => p_item_key ) ;
7504 
7505     I := I + 1 ;
7506     l_role_names(I) := GetWFAdhocRoleName
7507                        ( p_role_prefix => Eng_Workflow_Util.G_LINE_ASSIGNEE_ROLE
7508                        , p_item_type   => p_item_type
7509                        , p_item_key    => p_item_key ) ;
7510 
7511 
7512 
7513     FOR i IN l_role_names.FIRST..l_role_names.LAST
7514     LOOP
7515 
7516         DeleteRoleAndUsers(p_role_name => l_role_names(i) ) ;
7517 
7518     END LOOP ;
7519 
7520 
7521 EXCEPTION
7522     WHEN OTHERS THEN
7523 
7524     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
7525     IF  FND_MSG_PUB.Check_Msg_Level
7526       (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
7527     THEN
7528             FND_MSG_PUB.Add_Exc_Msg
7529               ( G_PKG_NAME        ,
7530                 l_api_name
7531             );
7532     END IF;
7533 
7534 END DeleteAdhocRolesAndUsers ;
7535 
7536 
7537 PROCEDURE CreateAction
7538 (   x_return_status     OUT NOCOPY VARCHAR2
7539  ,  x_msg_count         OUT NOCOPY NUMBER
7540  ,  x_msg_data          OUT NOCOPY VARCHAR2
7541  ,  p_item_type         IN  VARCHAR2
7542  ,  p_item_key          IN  VARCHAR2
7543  ,  p_notification_id   IN  NUMBER
7544  ,  p_action_type       IN  VARCHAR2
7545  ,  p_comment           IN  VARCHAR2 := NULL
7546  ,  x_action_id         OUT NOCOPY NUMBER
7547  ,  p_assignee_id       IN  NUMBER    := NULL
7548  ,  p_raise_event_flag  IN  VARCHAR2 := FND_API.G_FALSE -- R12
7549  )
7550 IS
7551 
7552     l_api_name            CONSTANT VARCHAR2(30) := 'CreateAction';
7553 
7554     l_change_id           NUMBER ;
7555     l_object_name         VARCHAR2(30);
7556     l_comment             VARCHAR2(4000);
7557 
7558     l_performer_user_id   NUMBER;
7559     l_parent_action_id    NUMBER ;
7560 
7561 
7562     -- R12B
7563     l_route_object_name   VARCHAR2(30) ;
7564     l_change_line_id      NUMBER ;
7565 
7566 
7567     CURSOR  c_ntf  (p_notification_id NUMBER)
7568     IS
7569         SELECT fu.user_id
7570           FROM FND_USER fu
7571              , WF_NOTIFICATIONS wn
7572          WHERE fu.user_name = wn.recipient_role
7573            AND wn.notification_id = p_notification_id ;
7574 
7575 
7576 BEGIN
7577 
7578 --IF g_debug_flag THEN
7579 --   Write_Debug('Eng_Workflow_Util.CreateAction Log');
7580 --   Write_Debug('-----------------------------------------------------');
7581 --   Write_Debug('Item Type         : ' || p_item_type );
7582 --   Write_Debug('Item Key          : ' || p_item_key );
7583 --   Write_Debug('Action Type       : ' || p_action_type );
7584 --   Write_Debug('Comment           : ' || SUBSTR(p_comment,200));
7585 --   Write_Debug('-----------------------------------------------------');
7586 --END IF ;
7587 
7588      --  Initialize API return status to success
7589      x_return_status := FND_API.G_RET_STS_SUCCESS;
7590 
7591      -- Get Change Object Identifier
7592      GetChangeObject
7593      (   p_item_type         => p_item_type
7594      ,  p_item_key          => p_item_key
7595      ,  x_change_id         => l_change_id
7596      ) ;
7597 
7598 
7599      -- Get Action Id and set this as parent action id
7600      Eng_Workflow_Util.GetActionId
7601      (   p_item_type         => p_item_type
7602       ,  p_item_key          => p_item_key
7603       ,  x_action_id         => l_parent_action_id
7604      ) ;
7605 
7606 
7607      -- Get Object Type
7608      -- l_object_name :=  GetChangeObjectName
7609      -- ( p_change_id           => l_change_id ) ;
7610 
7611      -- R12B
7612      -- Get Route Object Name
7613      Eng_Workflow_Util.GetRouteObject
7614      (   p_item_type         => p_item_type
7615       ,  p_item_key          => p_item_key
7616       ,  x_route_object      => l_object_name
7617      ) ;
7618 
7619 
7620      -- Get Change Line Object Identifier
7621      Eng_Workflow_Util.GetChangeLineObject
7622      (   p_item_type         => p_item_type
7623       ,  p_item_key          => p_item_key
7624       ,  x_change_line_id    => l_change_line_id
7625      ) ;
7626 
7627 
7628      IF ( l_change_line_id <= 0 OR l_object_name = G_ENG_CHANGE)
7629      THEN
7630 
7631          l_change_line_id := NULL ;
7632      END IF ;
7633 
7634 -- IF g_debug_flag THEN
7635 --   Debug('Set this as parent action id : ' || to_char(l_parent_action_id) );
7636 --END IF ;
7637 
7638 
7639     IF p_comment IS NULL THEN
7640 
7641          /*
7642          l_comment :=  WF_NOTIFICATION.GetAttrText
7643                        ( nid   => p_notification_id
7644                        , aname => 'RESPONSE_COMMENT');
7645          */
7646 
7647          l_comment :=  WF_NOTIFICATION.GetAttrText
7648                        ( nid   => p_notification_id
7649                        , aname => 'WF_NOTE');
7650 
7651 IF g_debug_flag THEN
7652    Write_Debug('Responded Comment: ' || SUBSTR(l_comment, 1, 200));
7653 END IF ;
7654 
7655 
7656     ELSE
7657 
7658          l_comment := p_comment ;
7659 
7660     END IF ;
7661 
7662      -- Filter default value :  no value specified
7663      l_comment := DefaultNoValueFilter(p_text => l_comment ) ;
7664 
7665 
7666 IF g_debug_flag THEN
7667    Write_Debug('Get Action Desc after filering: ' || SUBSTR(l_comment, 1, 200) );
7668 END IF ;
7669 
7670      --
7671      -- We need to get the party id and the user id
7672      -- of the person adding the comments.  We are
7673      -- using the recipient role since the responder column
7674      -- sometimes contains the email address (or variation of it)
7675      -- rather than the user name when a user
7676      -- responds from an email client.
7677      --
7678      FOR ntf_rec  IN c_ntf (p_notification_id)
7679      LOOP
7680          l_performer_user_id  := ntf_rec.user_id ;
7681 
7682      END LOOP ;
7683 IF g_debug_flag THEN
7684    Write_Debug('Before call ENG_CHANGE_ACTIONS_UTIL.Create_Change_Action ' ) ;
7685 END IF ;
7686 
7687 
7688      ENG_CHANGE_ACTIONS_UTIL.Create_Change_Action
7689      ( p_api_version           => 1.0
7690      , x_return_status         => x_return_status
7691      , x_msg_count             => x_msg_count
7692      , x_msg_data              => x_msg_data
7693      -- , p_init_msg_list         => FND_API.g_FALSE
7694      -- , p_commit                => FND_API.g_FALSE
7695      , p_action_type           => p_action_type
7696      , p_object_name           => l_object_name
7697      , p_object_id1            => l_change_id
7698      , p_object_id2            => l_change_line_id
7699      , p_object_id3            => NULL
7700      , p_object_id4            => NULL
7701      , p_object_id5            => NULL
7702      , p_parent_action_id      => l_parent_action_id
7703      , p_action_date           => SYSDATE
7704      , p_change_description    => l_comment
7705      , p_user_id               => l_performer_user_id
7706      , p_api_caller            => G_WF_CALL
7707      , x_change_action_id      => x_action_id
7708      , p_assignee_id           => p_assignee_id
7709      , p_raise_event_flag      => p_raise_event_flag -- R12
7710      );
7711 
7712 
7713 IF g_debug_flag THEN
7714    Write_Debug('After call ENG_CHANGE_ACTIONS_UTIL.Create_Change_Action ' ) ;
7715    Write_Debug('Return Status: '     || x_return_status ) ;
7716    Write_Debug('Return Message: '    || x_msg_data ) ;
7717    Write_Debug('Created Action id: ' || to_char(x_action_id ) ) ;
7718 END IF ;
7719 
7720 
7721 
7722 EXCEPTION
7723     WHEN OTHERS THEN
7724 
7725     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
7726 
7727     IF  FND_MSG_PUB.Check_Msg_Level
7728       (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
7729     THEN
7730             FND_MSG_PUB.Add_Exc_Msg
7731             ( G_PKG_NAME
7732             , l_api_name
7733             );
7734     END IF;
7735 
7736 END CreateAction ;
7737 
7738 
7739 PROCEDURE CreateRouteAction
7740 (   x_return_status     OUT NOCOPY VARCHAR2
7741  ,  x_msg_count         OUT NOCOPY NUMBER
7742  ,  x_msg_data          OUT NOCOPY VARCHAR2
7743  ,  p_change_id         IN  NUMBER   := NULL
7744  ,  p_change_line_id    IN  NUMBER   := NULL
7745  ,  p_action_type       IN  VARCHAR2
7746  ,  p_user_id           IN  NUMBER
7747  ,  p_parent_action_id  IN  NUMBER   := NULL
7748  ,  p_route_id          IN  NUMBER   := NULL
7749  ,  p_comment           IN  VARCHAR2 := NULL
7750  ,  x_action_id         OUT NOCOPY NUMBER
7751  ,  p_object_name       IN  VARCHAR2  := NULL
7752  ,  p_object_id1        IN  NUMBER    := NULL
7753  ,  p_object_id2        IN  NUMBER    := NULL
7754  ,  p_object_id3        IN  NUMBER    := NULL
7755  ,  p_object_id4        IN  NUMBER    := NULL
7756  ,  p_object_id5        IN  NUMBER    := NULL
7757  ,  p_parent_object_name IN  VARCHAR2  := NULL
7758  ,  p_parent_object_id1  IN  NUMBER    := NULL
7759  ,  p_raise_event_flag  IN  VARCHAR2 := FND_API.G_FALSE -- R12
7760  )
7761 IS
7762 
7763     l_api_name            CONSTANT VARCHAR2(30) := 'CreateRouteAction';
7764 
7765     l_object_name         VARCHAR2(30);
7766     l_comment             VARCHAR2(4000);
7767     l_change_line_id      NUMBER ;
7768 
7769 
7770     l_classification_code          VARCHAR2(30) ;
7771     l_status_code                  NUMBER ;
7772 
7773     CURSOR  c_route  (p_route_id NUMBER)
7774     IS
7775         SELECT STATUS_CODE
7776              , CLASSIFICATION_CODE
7777              , OBJECT_NAME
7778              , OBJECT_ID1
7779           FROM ENG_CHANGE_ROUTES
7780          WHERE ROUTE_ID = p_route_id
7781            AND TEMPLATE_FLAG = Eng_Workflow_Util.G_RT_INSTANCE ;
7782 
7783 BEGIN
7784 
7785 IF g_debug_flag THEN
7786    Write_Debug('Eng_Workflow_Util.CreateRouteAction Log');
7787    Write_Debug('-----------------------------------------------------');
7788    Write_Debug('Change Id         : ' || TO_CHAR(p_change_id));
7789    Write_Debug('Change Line Id    : ' || TO_CHAR(p_change_line_id));
7790    Write_Debug('Action Type       : ' || p_action_type );
7791    Write_Debug('User Id           : ' || TO_CHAR(p_user_id));
7792    Write_Debug('Parent Action Id  : ' || TO_CHAR(p_parent_action_id));
7793    Write_Debug('Route Id          : ' || TO_CHAR(p_route_id));
7794    Write_Debug('Comment           : ' || SUBSTR(p_comment,200));
7795    Write_Debug('-----------------------------------------------------');
7796 END IF ;
7797 
7798     --  Initialize API return status to success
7799     x_return_status := FND_API.G_RET_STS_SUCCESS;
7800 
7801 
7802     IF p_change_line_id IS NOT NULL AND p_change_line_id > 0
7803     THEN
7804 
7805         -- Get Change Line Object Name
7806         l_object_name := GetChangeLineObjectName
7807         ( p_change_line_id  => p_change_line_id ) ;
7808 
7809         l_change_line_id := p_change_line_id ;
7810 
7811     ELSE
7812 
7813         -- Get Change Object Name
7814         l_object_name :=  GetChangeObjectName
7815         ( p_change_id  => p_change_id ) ;
7816         l_change_line_id := NULL ;
7817 
7818     END IF ;
7819 
7820 
7821     -- Filter default value :  no value specified
7822     l_comment := DefaultNoValueFilter(p_text => p_comment ) ;
7823 
7824 IF g_debug_flag THEN
7825    Write_Debug('Get Action Desc after filering: ' || SUBSTR(l_comment, 1, 200) );
7826 END IF ;
7827 
7828 
7829     IF p_change_id IS NOT NULL THEN
7830 
7831         -- Need to get status code in 115.10 Action Log UI
7832         -- and pass it to Action Log Util
7833         -- Get Route WF Info
7834         FOR l_route_rec IN c_route (p_route_id => p_route_id )
7835         LOOP
7836 
7837             l_classification_code := l_route_rec.CLASSIFICATION_CODE ;
7838 
7839         END LOOP ;
7840 
7841 IF g_debug_flag THEN
7842    Write_Debug('Status Code/Classification Code: ' || l_classification_code);
7843 END IF ;
7844 
7845         l_status_code := TO_NUMBER(l_classification_code) ;
7846 
7847     END IF ;
7848 
7849 
7850 IF g_debug_flag THEN
7851    Write_Debug('Before call ENG_CHANGE_ACTIONS_UTIL.Create_Change_Action ' ) ;
7852 END IF ;
7853 
7854     ENG_CHANGE_ACTIONS_UTIL.Create_Change_Action
7855     (  p_api_version           => 1.0
7856      , x_return_status         => x_return_status
7857      , x_msg_count             => x_msg_count
7858      , x_msg_data              => x_msg_data
7859      -- , p_init_msg_list         => FND_API.g_FALSE
7860      -- , p_commit                => FND_API.g_FALSE
7861      , p_action_type           => p_action_type
7862      , p_object_name           => l_object_name
7863      , p_object_id1            => p_change_id
7864      , p_object_id2            => l_change_line_id
7865      , p_object_id3            => NULL
7866      , p_object_id4            => NULL
7867      , p_object_id5            => NULL
7868      , p_parent_action_id      => p_parent_action_id
7869      , p_action_date           => SYSDATE
7870      , p_change_description    => l_comment
7871      , p_user_id               => p_user_id
7872      , p_api_caller            => G_WF_CALL
7873      , p_route_id              => p_route_id
7874      , p_status_code           => l_status_code
7875      , x_change_action_id      => x_action_id
7876      , p_raise_event_flag      => p_raise_event_flag
7877     );
7878 
7879 
7880 IF g_debug_flag THEN
7881    Write_Debug('After call ENG_CHANGE_ACTIONS_UTIL.Create_Change_Action ' ) ;
7882    Write_Debug('Return Status: '     || x_return_status ) ;
7883    Write_Debug('Return Message: '    || x_msg_data ) ;
7884    Write_Debug('Created Action id: ' || to_char(x_action_id ) ) ;
7885 END IF ;
7886 
7887 
7888 EXCEPTION
7889     WHEN OTHERS THEN
7890 
7891     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
7892 
7893     IF  FND_MSG_PUB.Check_Msg_Level
7894       (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
7895     THEN
7896             FND_MSG_PUB.Add_Exc_Msg
7897             ( G_PKG_NAME
7898             , l_api_name
7899             );
7900     END IF;
7901 
7902 END CreateRouteAction ;
7903 
7904 
7905 
7906 PROCEDURE SyncChangeLCPhase
7907 (   x_return_status     OUT NOCOPY VARCHAR2
7908  ,  x_msg_count         OUT NOCOPY NUMBER
7909  ,  x_msg_data          OUT NOCOPY VARCHAR2
7910  ,  p_route_id          IN  NUMBER
7911  ,  p_api_caller        IN  VARCHAR2 := NULL -- or G_WF_CALL:'WF'
7912  )
7913 IS
7914 
7915     -- PRAGMA  AUTONOMOUS_TRANSACTION;
7916     l_api_name                     CONSTANT VARCHAR2(30) := 'SyncChangeLCPhase';
7917     l_route_status                 VARCHAR2(30);
7918     l_change_id                    NUMBER ;
7919     l_classification_code          VARCHAR2(30) ;
7920     l_status_code                  NUMBER ;
7921 
7922     l_msg_count         NUMBER ;
7923     l_msg_data          VARCHAR2(2000) ;
7924     l_return_status     VARCHAR2(1) ;
7925 
7926     CURSOR  c_route  (p_route_id NUMBER)
7927     IS
7928         SELECT STATUS_CODE
7929              , CLASSIFICATION_CODE
7930              , OBJECT_NAME
7931              , OBJECT_ID1
7932           FROM ENG_CHANGE_ROUTES
7933          WHERE ROUTE_ID = p_route_id
7934            AND TEMPLATE_FLAG = Eng_Workflow_Util.G_RT_INSTANCE ;
7935 
7936 BEGIN
7937 
7938 IF g_debug_flag THEN
7939    Write_Debug('Eng_Workflow_Util.SyncChangeLCPhase Log');
7940    Write_Debug('-----------------------------------------------------');
7941    Write_Debug('Route Id          : ' || TO_CHAR(p_route_id));
7942    Write_Debug('-----------------------------------------------------');
7943 END IF ;
7944 
7945     --  Initialize API return status to success
7946     x_return_status := FND_API.G_RET_STS_SUCCESS;
7947 
7948 
7949     -- In case that we have to use PRAGMA AUTONOMOUS_TRANSACTION,
7950     -- DON'T try to get Data/Item Attributes updated
7951     -- in previous wf activity from this procedure
7952     -- because this proc is setting PRAGMA  AUTONOMOUS_TRANSACTION
7953     -- If the user modify the Cost info to '0' in Worklfow Definition,
7954     -- the process can not get the updated DB/Item Attributes
7955     -- because the prev sessioin may not be saved yet
7956     -- and here is in different session
7957     --
7958 
7959     -- Need to modify this logic in original caller side
7960     -- or make the previous one is PRAGMA too
7961     -- Get Route WF Info
7962     FOR l_route_rec IN c_route (p_route_id => p_route_id )
7963     LOOP
7964 
7965         l_route_status := l_route_rec.STATUS_CODE ;
7966         l_change_id := l_route_rec.OBJECT_ID1 ;
7967         l_classification_code := l_route_rec.CLASSIFICATION_CODE ;
7968 
7969     END LOOP ;
7970 
7971     IF l_change_id IS NOT NULL THEN
7972 
7973 IF g_debug_flag THEN
7974    Write_Debug('Before call LC Phase API:  ' ) ;
7975    Write_Debug('Change Id          : ' || TO_CHAR(l_change_id));
7976    Write_Debug('Route Status       : ' || l_route_status );
7977    Write_Debug('Status Code/Classification Code: ' || l_classification_code);
7978 
7979 END IF ;
7980        l_status_code := TO_NUMBER(l_classification_code) ;
7981 
7982 
7983        -- Procedure to be called by WF to update lifecycle states of the change header,
7984        -- revised items, tasks and lines lifecycle states
7985        -- Bug4741642 fix
7986        -- We will not return the status to the caller
7987        -- even if ENG_CHANGE_LIFECYCLE_UTIL.Update_Lifecycle_States
7988        -- return status error
7989        -- otherwise the Approval Status will not be updated
7990        -- properly if it return error based on some validation
7991        -- like Mandatory task is not completed on Auto Promotion
7992        ENG_CHANGE_LIFECYCLE_UTIL.Update_Lifecycle_States
7993        (  p_api_version           => 1.0
7994         , p_commit                => FND_API.g_FALSE
7995         , p_init_msg_list         => FND_API.g_FALSE
7996         , p_validation_level      => FND_API.G_VALID_LEVEL_FULL
7997         , p_debug                 => FND_API.G_FALSE
7998         , p_output_dir            => NULL -- '/appslog/bis_top/utl/plm115dv/log'
7999         , p_debug_filename        => NULL -- 'UpdateLCStatesFromWF.log' || to_char(p_route_id)
8000         , x_return_status         => l_return_status
8001         , x_msg_count             => l_msg_count
8002         , x_msg_data              => l_msg_data
8003         , p_change_id             => l_change_id
8004         , p_api_caller            => p_api_caller
8005         , p_wf_route_id           => p_route_id
8006         , p_status_code           => l_status_code
8007         , p_route_status          => l_route_status
8008        );
8009 
8010 IF g_debug_flag THEN
8011    Write_Debug('After call LC Phase API:   ' ) ;
8012    Write_Debug('Return Status: '     || l_return_status ) ;
8013    Write_Debug('Return Message: '    || l_msg_data ) ;
8014 END IF ;
8015 
8016     END IF ;
8017 
8018 
8019     -- Comment Out Here
8020     -- IF x_return_status =  FND_API.G_RET_STS_SUCCESS
8021     -- THEN
8022     --    COMMIT ;
8023     -- ELSE
8024     --   ROLLBACK ;
8025     -- END IF ;
8026 
8027 
8028 
8029 EXCEPTION
8030     WHEN OTHERS THEN
8031 
8032     -- ROLLBACK ;
8033 
8034     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
8035 
8036     IF  FND_MSG_PUB.Check_Msg_Level
8037       (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
8038     THEN
8039             FND_MSG_PUB.Add_Exc_Msg
8040             ( G_PKG_NAME
8041             , l_api_name
8042             );
8043     END IF;
8044 
8045 END SyncChangeLCPhase ;
8046 
8047 
8048 PROCEDURE SetRouteParentChild
8049 (   x_return_status     OUT NOCOPY VARCHAR2
8050  ,  x_msg_count         OUT NOCOPY NUMBER
8051  ,  x_msg_data          OUT NOCOPY VARCHAR2
8052  ,  p_change_id         IN  NUMBER
8053  ,  p_change_line_id    IN  NUMBER   := NULL
8054  ,  p_route_id          IN  NUMBER
8055  ,  p_item_type         IN  VARCHAR2
8056  ,  p_item_key          IN  VARCHAR2
8057  ,  p_parent_item_type  IN  VARCHAR2 := NULL
8058  ,  p_parent_item_key   IN  VARCHAR2 := NULL
8059  )
8060 IS
8061 
8062     l_api_name            CONSTANT VARCHAR2(30) := 'SetRouteParentChild';
8063 
8064     l_object_name         VARCHAR2(30);
8065     l_comment             VARCHAR2(4000);
8066     l_change_line_id      NUMBER ;
8067 
8068     l_hdr_route_item_type VARCHAR2(30);
8069     l_hdr_route_item_key  VARCHAR2(240);
8070 
8071     TYPE Line_Route_WF_Rec_Type  IS RECORD
8072     ( item_type VARCHAR2(30)
8073     , item_key  VARCHAR2(240)
8074     ) ;
8075 
8076     TYPE Line_Route_WF_Tbl_Type IS TABLE OF Line_Route_WF_Rec_Type
8077     INDEX BY BINARY_INTEGER ;
8078 
8079     I    PLS_INTEGER := 0 ;
8080 
8081     l_line_route_wf_tbl Line_Route_WF_Tbl_Type ;
8082 
8083     CURSOR  c_header_route_wf  (p_change_id NUMBER)
8084     IS
8085         SELECT wi.item_type
8086              , wi.item_key
8087           FROM ENG_ENGINEERING_CHANGES eec
8088              , ENG_CHANGE_ROUTES ecr
8089              , WF_ITEMS          wi
8090          WHERE wi.end_date IS NULL
8091            AND wi.item_key = ecr.wf_item_key
8092            AND wi.item_type = ecr.wf_item_type
8093            AND ecr.status_code = Eng_Workflow_Util.G_RT_IN_PROGRESS
8094            AND ecr.route_id  = eec.route_id
8095            AND eec.approval_status_type = Eng_Workflow_Util.G_REQUESTED
8096            AND eec.change_id = p_change_id ;
8097 
8098 
8099     CURSOR  c_line_route_wf  (p_change_id NUMBER)
8100     IS
8101         SELECT wi.item_type
8102              , wi.item_key
8103           FROM ENG_CHANGE_LINES  ecl
8104              , ENG_CHANGE_ROUTES ecr
8105              , WF_ITEMS          wi
8106          WHERE wi.end_date IS NULL
8107            AND wi.item_key = ecr.wf_item_key
8108            AND wi.item_type = ecr.wf_item_type
8109            AND ecr.status_code = Eng_Workflow_Util.G_RT_IN_PROGRESS
8110            AND ecr.route_id  = ecl.route_id
8111            -- AND ecl.parent_line_id IS NULL
8112            AND ecl.approval_status_type = Eng_Workflow_Util.G_REQUESTED
8113            AND ecl.sequence_number <> -1
8114            AND ecl.change_type_id <> -1
8115            AND ecl.change_id = p_change_id ;
8116 
8117 
8118 
8119 BEGIN
8120 
8121 IF g_debug_flag THEN
8122    Write_Debug('Eng_Workflow_Util.CreateRouteAction Log');
8123    Write_Debug('-----------------------------------------------------');
8124    Write_Debug('Change Id         : ' || TO_CHAR(p_change_id));
8125    Write_Debug('Change Line Id    : ' || TO_CHAR(p_change_line_id));
8126    Write_Debug('Route Id          : ' || TO_CHAR(p_route_id));
8127    Write_Debug('Item Type         : ' || p_item_type );
8128    Write_Debug('Item Key          : ' || p_item_key );
8129    Write_Debug('Parent Item Type  : ' || p_parent_item_type );
8130    Write_Debug('Parent Item Key   : ' || p_parent_item_key );
8131    Write_Debug('-----------------------------------------------------');
8132 END IF ;
8133 
8134     --  Initialize API return status to success
8135     x_return_status := FND_API.G_RET_STS_SUCCESS;
8136 
8137 
8138     -- Check if this is setting header or line
8139     IF p_change_line_id IS NOT NULL AND p_change_line_id > 0
8140     THEN
8141 
8142         -- Get Header Route Workflow Info
8143         IF p_parent_item_type IS NOT NULL AND p_parent_item_key IS NOT NULL
8144         THEN
8145 
8146             l_hdr_route_item_type := p_parent_item_type ;
8147             l_hdr_route_item_key  := p_parent_item_key ;
8148 
8149         ELSE
8150             -- Get Header Route WF Info
8151             FOR hdr_wf_rec IN c_header_route_wf (p_change_id => p_change_id)
8152             LOOP
8153 
8154                 l_hdr_route_item_type := hdr_wf_rec.item_type ;
8155                 l_hdr_route_item_key  := hdr_wf_rec.item_key ;
8156 
8157             END LOOP ;
8158 
8159 
8160         END IF ;
8161 
8162         I := I + 1 ;
8163         l_line_route_wf_tbl(I).item_type :=  p_item_type ;
8164         l_line_route_wf_tbl(I).item_key  :=  p_item_key ;
8165 
8166     ELSE
8167 
8168         -- Get Header Route Workflow Info
8169         l_hdr_route_item_type := p_item_type ;
8170         l_hdr_route_item_key  := p_item_key ;
8171 
8172         -- Get Line Route Workflows
8173         FOR line_wf_rec IN c_line_route_wf (p_change_id => p_change_id)
8174         LOOP
8175 
8176             I := I + 1 ;
8177             l_line_route_wf_tbl(I).item_type :=  line_wf_rec.item_type ;
8178             l_line_route_wf_tbl(I).item_key  :=  line_wf_rec.item_key ;
8179 
8180         END LOOP ;
8181 
8182 
8183 
8184     END IF ;
8185 
8186 
8187     IF l_hdr_route_item_type IS NOT NULL AND l_hdr_route_item_key IS NOT NULL
8188     THEN
8189 
8190        FOR i IN 1..l_line_route_wf_tbl.COUNT LOOP
8191 
8192            -- Set Parent Worklfow Process
8193            WF_ENGINE.SetItemParent
8194             ( itemtype        => l_line_route_wf_tbl(i).item_type
8195             , itemkey         => l_line_route_wf_tbl(i).item_key
8196             , parent_itemtype => l_hdr_route_item_type
8197             , parent_itemkey  => l_hdr_route_item_key
8198             , parent_context  => NULL
8199             );
8200 
8201        END LOOP ;
8202 
8203     END IF ;
8204 
8205 
8206 EXCEPTION
8207     WHEN OTHERS THEN
8208 
8209     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
8210 
8211     IF  FND_MSG_PUB.Check_Msg_Level
8212       (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
8213     THEN
8214             FND_MSG_PUB.Add_Exc_Msg
8215             ( G_PKG_NAME
8216             , l_api_name
8217             );
8218     END IF;
8219 
8220 END SetRouteParentChild ;
8221 
8222 
8223 -- R12B
8224 PROCEDURE SetRouteResponse
8225 (   x_return_status     OUT NOCOPY VARCHAR2
8226  ,  x_msg_count         OUT NOCOPY NUMBER
8227  ,  x_msg_data          OUT NOCOPY VARCHAR2
8228  ,  p_item_type         IN  VARCHAR2
8229  ,  p_item_key          IN  VARCHAR2
8230  ,  p_notification_id   IN  NUMBER
8231  ,  p_response_code     IN  VARCHAR2
8232  ,  p_comment           IN  VARCHAR2 := NULL
8233  ,  p_actid             IN  NUMBER   := NULL  -- added in R12B
8234  ,  p_funcmode          IN  VARCHAR2 := NULL  -- added in R12B
8235 )
8236 IS
8237 
8238     l_api_name            CONSTANT VARCHAR2(30) := 'SetRouteResponse';
8239 
8240     l_change_id           NUMBER ;
8241     l_object_name         VARCHAR2(30);
8242     l_comment             VARCHAR2(4000);
8243     l_step_id             NUMBER ;
8244 
8245     l_route_people_id              NUMBER ;
8246     -- l_assignee_type_code           VARCHAR2(30);
8247     -- l_original_assignee_id         NUMBER ;
8248     -- l_original_assignee_type_code  VARCHAR2(30);
8249     -- l_response_condition_code      VARCHAR2(30);
8250     -- l_adhoc_people_flag            VARCHAR2(1) ;
8251 
8252     l_performer_user_id   NUMBER;
8253     l_performer_party_id  NUMBER;
8254 
8255     -- For Action Log
8256     l_action_type         VARCHAR2(30) ;
8257     l_created_action_id   NUMBER ;
8258 
8259     l_return_status       VARCHAR2(1);
8260     l_msg_count           NUMBER ;
8261     l_msg_data            VARCHAR2(200);
8262 
8263     l_result              VARCHAR2(4000) ;
8264 
8265 
8266     -- R12B
8267     l_auto_revoke_resp    VARCHAR2(30) ;
8268 
8269     -- R12B
8270     l_route_id            NUMBER;
8271     l_change_line_id      NUMBER;
8272     l_target_obj_tbl      FND_TABLE_OF_VARCHAR2_30;
8273     l_obj_index           PLS_INTEGER ;
8274     l_person_id_tbl       FND_TABLE_OF_NUMBER ;
8275     l_person_idx          PLS_INTEGER ;
8276 
8277     l_base_change_mgmt_type_code VARCHAR2(30);
8278     l_message_text               VARCHAR2(400);
8279 
8280     CURSOR  c_route_person ( p_step_id            NUMBER
8281                            , p_notification_id    NUMBER )
8282     IS
8283         SELECT EngSecPeople.user_id
8284              , EngSecPeople.person_id
8285              , RoutePeople.route_people_id
8286              , RoutePeople.adhoc_people_flag
8287              , RoutePeople.assignee_type_code
8288              , RoutePeople.original_assignee_id
8289              , RoutePeople.original_assignee_type_code
8290              , RoutePeople.response_condition_code
8291         FROM   ENG_CHANGE_ROUTE_PEOPLE RoutePeople
8292              , ENG_SECURITY_PEOPLE_V EngSecPeople
8293              , WF_NOTIFICATIONS wn
8294         WHERE RoutePeople.assignee_id = EngSecPeople.person_id
8295         -- AND   RoutePeople.assignee_type_code = p_assignee_type_code
8296         AND   RoutePeople.step_id = p_step_id
8297         AND   EngSecPeople.user_name = wn.recipient_role
8298         AND   wn.notification_id = p_notification_id ;
8299 
8300 
8301     CURSOR  c_duplicate_ntf ( p_item_type          VARCHAR2
8302                             , p_item_key           VARCHAR2
8303                             , p_orig_ntf_id        NUMBER )
8304     IS
8305         SELECT ntf.NOTIFICATION_ID,
8306                ntf.RECIPIENT_ROLE,
8307                ntf.MESSAGE_NAME,
8308                ntf.message_type
8309         FROM   WF_ITEM_ACTIVITY_STATUSES wias,
8310                WF_NOTIFICATIONS  ntf ,
8311                WF_NOTIFICATIONS  orig_ntf
8312         WHERE ntf.STATUS = 'OPEN'
8313         AND   wias.NOTIFICATION_ID = ntf.group_id
8314         AND   wias.NOTIFICATION_ID IS NOT NULL
8315         AND (wias.ACTIVITY_STATUS = 'NOTIFIED' OR wias.ACTIVITY_STATUS = 'ERROR')
8316         AND wias.ITEM_TYPE = p_item_type
8317         AND wias.ITEM_KEY = p_item_key
8318         AND ntf.RECIPIENT_ROLE = orig_ntf.RECIPIENT_ROLE
8319         AND ntf.GROUP_ID = orig_ntf.GROUP_ID
8320         AND ntf.NOTIFICATION_ID <> orig_ntf.NOTIFICATION_ID
8321         AND orig_ntf.NOTIFICATION_ID = p_orig_ntf_id
8322         AND EXISTS  (SELECT 1
8323                      FROM WF_NOTIFICATION_ATTRIBUTES na,
8324                           WF_MESSAGE_ATTRIBUTES ma
8325                      WHERE na.NOTIFICATION_ID = ntf.NOTIFICATION_ID
8326                      AND   ma.MESSAGE_NAME = ntf.MESSAGE_NAME
8327                      AND   ma.MESSAGE_TYPE = ntf.MESSAGE_TYPE
8328                      AND   ma.NAME = na.NAME
8329                      AND   ma.SUBTYPE = 'RESPOND') ;
8330 
8331 
8332 
8333 BEGIN
8334 
8335    -- For Test/Debug
8336    Check_And_Open_Debug_Session(p_debug_flag      => FND_API.G_FALSE
8337                               , p_output_dir      => NULL
8338                               , p_file_name       => NULL
8339                               ) ;
8340 
8341 
8342 IF g_debug_flag THEN
8343    Write_Debug('Eng_Workflow_Util.SetRouteResponse Log');
8344    Write_Debug('-----------------------------------------------------');
8345    Write_Debug('Item Type         : ' || p_item_type );
8346    Write_Debug('Item Key          : ' || p_item_key );
8347    Write_Debug('NTF Id            : ' || to_char(p_notification_id) );
8348    Write_Debug('Response Code     : ' || p_response_code );
8349    Write_Debug('Comment           : ' || SUBSTR(p_comment,200));
8350    Write_Debug('-----------------------------------------------------');
8351 END IF ;
8352 
8353     --  Initialize API return status to success
8354     x_return_status := FND_API.G_RET_STS_SUCCESS;
8355 
8356     -- Initialize Table var
8357     l_target_obj_tbl := FND_TABLE_OF_VARCHAR2_30();
8358     l_person_id_tbl := FND_TABLE_OF_NUMBER();
8359 
8360     -- Get Change Object Identifier
8361     GetChangeObject
8362     (   p_item_type         => p_item_type
8363      ,  p_item_key          => p_item_key
8364      ,  x_change_id         => l_change_id
8365     ) ;
8366 
8367     -- Get Object Type
8368     l_object_name :=  GetChangeObjectName
8369     ( p_change_id           => l_change_id ) ;
8370 
8371     -- Get Current Route Step Id
8372     GetRouteStepId
8373     (   p_item_type         => p_item_type
8374      ,  p_item_key          => p_item_key
8375      ,  x_route_step_id     => l_step_id
8376     ) ;
8377 
8378 
8379      -- R12B
8380      -- Get Route Id
8381      GetRouteId
8382      (  p_item_type         => p_item_type
8383      ,  p_item_key          => p_item_key
8384      ,  x_route_id          => l_route_id
8385      ) ;
8386 
8387      -- Get Change Object Identifier
8388      GetChangeLineObject
8389      (   p_item_type         => p_item_type
8390       ,  p_item_key          => p_item_key
8391       ,  x_change_line_id    => l_change_line_id
8392      ) ;
8393 
8394 
8395    l_base_change_mgmt_type_code := GetBaseChangeMgmtTypeCode(p_change_id  =>l_change_id);
8396 
8397    if l_base_change_mgmt_type_code = 'NEW_ITEM_REQUEST'
8398 	AND p_response_code ='APPROVED'
8399 	AND ENG_NIR_UTIL_PKG.checkNIRValidForApproval(p_change_id => l_change_id)
8400    then
8401 	-- fnd_message.set_name('ENG','ENG_NIR_CANNOT_APPROVE');
8402    --       app_exception.raise_exception;
8403 
8404     l_message_text := fnd_message.get_String('ENG','ENG_NIR_CANNOT_APPROVE');
8405     wf_core.token('ERRCODE', l_message_text);
8406     wf_core.raise('WFENG_NOTIFICATION_FUNCTION');
8407 
8408    end if;
8409 
8410 
8411 
8412     IF p_comment IS NULL THEN
8413 
8414          /*
8415          l_comment :=  WF_NOTIFICATION.GetAttrText
8416                        ( nid   => p_notification_id
8417                        , aname => 'RESPONSE_COMMENT');
8418          */
8419 
8420          l_comment :=  WF_NOTIFICATION.GetAttrText
8421                        ( nid   => p_notification_id
8422                        , aname => 'WF_NOTE');
8423 
8424 
8425 IF g_debug_flag THEN
8426    Write_Debug('Responded Comment: ' || SUBSTR(l_comment, 1, 200));
8427 END IF ;
8428 
8429     ELSE
8430 
8431          l_comment := p_comment ;
8432 
8433     END IF ;
8434 
8435      -- Filter default value :  no value specified
8436      l_comment := DefaultNoValueFilter(p_text => l_comment ) ;
8437 
8438 
8439 IF g_debug_flag THEN
8440    Write_Debug('Get Action Desc after filering: ' || SUBSTR(l_comment, 1, 200) );
8441 END IF ;
8442 
8443      -- In this reslease assignee type is only 'PERSON' for Workflow Routing Instance
8444      -- l_assignee_type_code := 'PERSON' ;
8445 
8446 IF g_debug_flag THEN
8447    Write_Debug('Getting corresponding route people info ' ) ;
8448    Write_Debug('step_id : ' ||  to_char(l_step_id) ) ;
8449    Write_Debug('notification_id : ' || to_char(p_notification_id) ) ;
8450 END IF ;
8451 
8452     FOR rtp_rec  IN c_route_person (  p_step_id => l_step_id
8453                                      , p_notification_id => p_notification_id )
8454     LOOP
8455          l_performer_user_id            := rtp_rec.user_id ;
8456          l_performer_party_id           := rtp_rec.person_id ;
8457          l_route_people_id              := rtp_rec.route_people_id ;
8458 
8459          --
8460          -- Comment Out: Not Used
8461          -- l_adhoc_people_flag            := rtp_rec.adhoc_people_flag ;
8462          -- l_assignee_type_code           := rtp_rec.assignee_type_code ;
8463          -- l_original_assignee_id         := rtp_rec.original_assignee_id ;
8464          -- l_original_assignee_type_code  := rtp_rec.original_assignee_type_code ;
8465          -- l_response_condition_code      := rtp_rec.response_condition_code ;
8466 
8467          /* COMMENT OUT
8468           * There is issue if user uses different session lang
8469           * between responding to ntf and viewing response
8470           * if we use UPDATE_ROW api, the response is only updated with
8471           * the lang record used while responding to ntf
8472 
8473 IF g_debug_flag THEN
8474    Write_Debug('Calling Eng_Change_Route_People_Util.UPDATE_ROW - Route People Id: ' || l_route_people_id ) ;
8475 END IF ;
8476 
8477          Eng_Change_Route_People_Util.UPDATE_ROW
8478          ( X_ROUTE_PEOPLE_ID => l_route_people_id ,
8479            X_REQUEST_ID => null ,
8480            X_ORIGINAL_SYSTEM_REFERENCE => null ,
8481            X_ASSIGNEE_ID => l_performer_party_id ,
8482            X_RESPONSE_DATE => SYSDATE ,
8483            X_STEP_ID => l_step_id,
8484            X_ASSIGNEE_TYPE_CODE => l_assignee_type_code,
8485            X_ADHOC_PEOPLE_FLAG => l_adhoc_people_flag,
8486            X_WF_NOTIFICATION_ID => p_notification_id,
8487            X_RESPONSE_CODE => p_response_code,
8488            X_RESPONSE_DESCRIPTION => l_comment ,
8489            X_LAST_UPDATE_DATE => SYSDATE ,
8490            X_LAST_UPDATED_BY => l_performer_user_id ,
8491            X_LAST_UPDATE_LOGIN => null,
8492            X_PROGRAM_ID        => null,
8493            X_PROGRAM_APPLICATION_ID => null ,
8494            X_PROGRAM_UPDATE_DATE    => null ,
8495            X_ORIGINAL_ASSIGNEE_ID   => l_original_assignee_id  ,
8496            X_ORIGINAL_ASSIGNEE_TYPE_CODE => l_original_assignee_type_code ,
8497            X_RESPONSE_CONDITION_CODE => l_response_condition_code
8498          ) ;
8499          */
8500 
8501          update ENG_CHANGE_ROUTE_PEOPLE set
8502            WF_NOTIFICATION_ID = p_notification_id,
8503            RESPONSE_CODE = p_response_code ,
8504            RESPONSE_DATE = SYSDATE ,
8505            LAST_UPDATE_DATE = SYSDATE ,
8506            LAST_UPDATED_BY = l_performer_user_id ,
8507            LAST_UPDATE_LOGIN = null
8508          where ROUTE_PEOPLE_ID = l_route_people_id ;
8509 
8510          update ENG_CHANGE_ROUTE_PEOPLE_TL set
8511            RESPONSE_DESCRIPTION = l_comment,
8512            LAST_UPDATE_DATE = SYSDATE ,
8513            LAST_UPDATED_BY = l_performer_user_id ,
8514            LAST_UPDATE_LOGIN = null ,
8515            SOURCE_LANG = userenv('LANG')
8516          where ROUTE_PEOPLE_ID = l_route_people_id ;
8517 
8518 
8519     END LOOP ;
8520 
8521 
8522     -- In case that Route Object is Change Object
8523     IF l_change_id IS NOT NULL AND l_change_id > 0
8524     THEN
8525 
8526         l_action_type := Eng_Workflow_Util.ConvertRouteStatusToActionType
8527                          ( p_route_status_code =>  p_response_code
8528                          , p_convert_type      =>  'RESPONSE' ) ;
8529 
8530         -- Record Action
8531         Eng_Workflow_Util.CreateAction
8532         ( x_return_status         =>  l_return_status
8533         , x_msg_count             =>  l_msg_count
8534         , x_msg_data              =>  l_msg_data
8535         , p_item_type             =>  p_item_type
8536         , p_item_key              =>  p_item_key
8537         , p_notification_id       =>  p_notification_id
8538         , p_action_type           =>  l_action_type
8539         , x_action_id             =>  l_created_action_id
8540         ) ;
8541 
8542         IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
8543 
8544             x_return_status  :=   l_return_status ;
8545             x_msg_count      :=   l_msg_count ;
8546             x_msg_data       :=   l_msg_data ;
8547         END IF ;
8548 
8549     END IF ; -- changeId is not null
8550 
8551 
8552     -- Added in 115.10E
8553     -- To support closing duplicate ntf for same assignee, which is
8554     -- inserted by Ntf Reassignement etc
8555     FOR dup_ntf_rec  IN c_duplicate_ntf (  p_item_type => p_item_type
8556                                         ,  p_item_key  => p_item_key
8557                                         ,  p_orig_ntf_id => p_notification_id )
8558     LOOP
8559 
8560 IF g_debug_flag THEN
8561    Write_Debug('Duplicate Ntf Exists and call RespondToDuplicateNtf: ' || dup_ntf_rec.NOTIFICATION_ID ) ;
8562 END IF ;
8563 
8564 
8565         begin
8566 
8567            -- Check Notifiation Result to make sure
8568            -- this notifiaction has not been responded
8569            -- WF Code has cache mechanism
8570            -- So just querying table is not enough
8571            l_result := WF_NOTIFICATION.GetAttrText(nid => dup_ntf_rec.notification_id
8572                                                   ,aname => 'RESULT' ) ;
8573 
8574 IF g_debug_flag THEN
8575    Write_Debug('Duplicate Ntf Result : ' || l_result ) ;
8576 END IF ;
8577            IF l_result IS NULL THEN
8578 
8579 IF g_debug_flag THEN
8580    Write_Debug('Result is null and call RespondToDuplicateNtf: ' || dup_ntf_rec.NOTIFICATION_ID ) ;
8581 END IF ;
8582 
8583                Eng_Workflow_Util.RespondToDuplicateNtf( p_dupllicate_ntf_id => dup_ntf_rec.notification_id
8584                                                       , p_orig_ntf_id => p_notification_id
8585                                                       , p_responder => dup_ntf_rec.RECIPIENT_ROLE
8586                                                       ) ;
8587            END IF ;
8588 
8589         exception
8590             when others then
8591             -- The exception may be thrown for Digisig Enabled Ntf
8592             -- Ignore this
8593             -- The user has to respond to each ntf in that case
8594 IF g_debug_flag THEN
8595    Write_Debug('RespondToDuplicateNtf Exception: ' || SQLERRM ) ;
8596 END IF ;
8597 
8598         end ;
8599 
8600     END LOOP ; -- duplicate_ntf loop
8601 
8602 
8603     --
8604     -- R12B Modified to support AUTO_REVOKE_RESPONSE NTF Attribute
8605     -- If the response is the value specified in AUTO_REVOKE_RESPONSE NTF Attribute
8606     -- we will revoke roles on this wf assignee
8607     -- Record Route Response
8608     IF  ( p_funcmode = 'RESPOND'
8609           AND (   p_item_type = Eng_Workflow_Util.G_CHANGE_ROUTE_STEP_ITEM_TYPE
8610                OR p_item_type = Eng_Workflow_Util.G_CHANGE_ROUTE_DOC_STEP_TYPE
8611                OR p_item_type = Eng_Workflow_Util.G_CHANGE_ROUTE_LINE_STEP_TYPE
8612               )
8613         )
8614     THEN
8615 
8616 IF g_debug_flag THEN
8617    Write_Debug('Getting AUTO_REVOKE_RESPONSE NTF Attribute . . . '  ) ;
8618 END IF ;
8619 
8620         -- R12B
8621         -- Need to revoke auto grant if the response is DECLIEND.
8622         l_auto_revoke_resp := WF_ENGINE.GetActivityAttrText
8623                                      (  p_item_type
8624                                       , p_item_key
8625                                       , p_actid
8626                                       , G_ATTR_AUTO_REVOKE_RESPONSE  -- aname
8627                                       , TRUE -- ignore_notfound
8628                                       ) ;
8629 
8630 
8631 IF g_debug_flag THEN
8632    Write_Debug('AUTO_REVOKE_RESPONSE NTF Attribute : ' || l_auto_revoke_resp  ) ;
8633 END IF ;
8634 
8635         IF ( l_auto_revoke_resp IS NOT NULL AND p_response_code = l_auto_revoke_resp )
8636         THEN
8637 
8638             l_obj_index := 0 ;
8639             l_person_idx := 0 ;
8640             IF ( p_item_type = Eng_Workflow_Util.G_CHANGE_ROUTE_DOC_STEP_TYPE )
8641             THEN
8642                 l_obj_index := l_obj_index + 1 ;
8643                 l_target_obj_tbl.EXTEND ;
8644                 l_target_obj_tbl(l_obj_index) := G_DOM_DOCUMENT_REVISION ;
8645             END IF ;
8646 
8647 
8648             l_person_id_tbl.EXTEND ;
8649             l_person_id_tbl(l_person_idx + 1) := l_performer_party_id ;
8650 
8651 
8652 IF g_debug_flag THEN
8653     Write_Debug('Calling Eng_Workflow_Util.RevokeObjectRoles for this assignee: ' || l_performer_party_id );
8654 END IF ;
8655 
8656 
8657             Eng_Workflow_Util.RevokeObjectRoles
8658             (   p_api_version               => 1.0
8659              ,  p_init_msg_list             => FND_API.G_FALSE        --
8660              ,  p_commit                    => FND_API.G_FALSE        --
8661              ,  p_validation_level          => FND_API.G_VALID_LEVEL_FULL
8662              ,  p_debug                     => FND_API.G_FALSE
8663              ,  p_output_dir                => NULL
8664              ,  p_debug_filename            => NULL
8665              ,  x_return_status             => l_return_status
8666              ,  x_msg_count                 => l_msg_count
8667              ,  x_msg_data                  => l_msg_data
8668              ,  p_change_id                 => l_change_id
8669              ,  p_change_line_id            => l_change_line_id
8670              ,  p_route_id                  => l_route_id
8671              ,  p_step_id                   => l_step_id
8672              ,  p_person_ids                => l_person_id_tbl
8673              ,  p_target_objects            => l_target_obj_tbl
8674              ,  p_api_caller                => G_WF_CALL
8675              ,  p_revoke_option             => NULL
8676             ) ;
8677 
8678 IF g_debug_flag THEN
8679     Write_Debug('After Eng_Workflow_Util.RevokeObjectRoles.' || l_return_status );
8680 END IF ;
8681 
8682            --
8683            -- IF l_return_status <> FND_API.G_RET_STS_SUCCESS
8684            -- THEN
8685            --     RAISE FND_API.G_EXC_ERROR ;
8686            -- END IF ;
8687 
8688         END IF ; -- ( l_auto_revoke_resp IS NOT NULL AND p_response_code = l_auto_revoke_resp )
8689 
8690 
8691      END IF ;
8692 
8693 
8694 EXCEPTION
8695     WHEN OTHERS THEN
8696 
8697 IF g_debug_flag THEN
8698     Write_Debug('Eng_Workflow_Util.SetRouteResponse Unxexpected Error.' || SQLERRM);
8699 END IF ;
8700 
8701     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
8702 
8703     IF  FND_MSG_PUB.Check_Msg_Level
8704       (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
8705     THEN
8706             FND_MSG_PUB.Add_Exc_Msg
8707             ( G_PKG_NAME
8708             , l_api_name
8709             );
8710     END IF;
8711 
8712 END SetRouteResponse ;
8713 
8714 
8715 
8716 
8717 
8718 PROCEDURE FindNextRouteStep
8719 (   x_return_status     OUT NOCOPY VARCHAR2
8720  ,  x_msg_count         OUT NOCOPY NUMBER
8721  ,  x_msg_data          OUT NOCOPY VARCHAR2
8722  ,  p_route_id          IN  NUMBER
8723  ,  x_step_id           OUT NOCOPY NUMBER
8724  ,  x_step_item_type    OUT NOCOPY VARCHAR2
8725  ,  x_step_process_name OUT NOCOPY VARCHAR2
8726  )
8727 IS
8728 
8729     l_api_name          CONSTANT VARCHAR2(30) := 'FindNextRouteStep';
8730 
8731     CURSOR  c_next_step (p_route_id NUMBER)
8732     IS
8733       SELECT step_id,
8734              step_seq_num,
8735              wf_item_type,
8736              wf_process_name
8737         FROM ENG_CHANGE_ROUTE_STEPS
8738        WHERE route_id = p_route_id
8739          AND step_status_code = Eng_Workflow_Util.G_RT_NOT_STARTED
8740          AND step_start_date   IS NULL
8741          AND step_end_date    IS NULL
8742        ORDER BY 2 ASC ;
8743 
8744     recinfo c_next_step%rowtype;
8745 
8746 
8747 BEGIN
8748 
8749     --  Initialize API return status to success
8750     x_return_status := FND_API.G_RET_STS_SUCCESS;
8751 
8752 
8753     OPEN c_next_step(p_route_id => p_route_id) ;
8754     FETCH c_next_step into recinfo;
8755     IF (c_next_step%notfound) THEN
8756         CLOSE c_next_step ;
8757 
8758     END IF;
8759 
8760     IF c_next_step%ISOPEN THEN
8761         CLOSE c_next_step ;
8762     END IF ;
8763 
8764     x_step_id           := recinfo.step_id ;
8765     x_step_item_type    := recinfo.wf_item_type ;
8766     x_step_process_name := recinfo.wf_process_name ;
8767 
8768 
8769 
8770 
8771 EXCEPTION
8772     WHEN OTHERS THEN
8773 
8774     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
8775 
8776     IF  FND_MSG_PUB.Check_Msg_Level
8777       (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
8778     THEN
8779             FND_MSG_PUB.Add_Exc_Msg
8780             ( G_PKG_NAME
8781             , l_api_name
8782             );
8783     END IF;
8784 
8785 END FindNextRouteStep ;
8786 
8787 
8788 PROCEDURE StartNextRouteStep
8789 (   x_return_status     OUT NOCOPY VARCHAR2
8790  ,  x_msg_count         OUT NOCOPY NUMBER
8791  ,  x_msg_data          OUT NOCOPY VARCHAR2
8792  ,  p_route_item_type   IN  VARCHAR2
8793  ,  p_route_item_key    IN  VARCHAR2
8794  ,  p_route_id          IN  NUMBER
8795  ,  p_change_id         IN  NUMBER    := NULL
8796  ,  p_change_line_id    IN  NUMBER    := NULL
8797  ,  p_wf_user_id        IN  NUMBER
8798  ,  p_host_url          IN  VARCHAR2
8799  ,  x_step_id           OUT NOCOPY NUMBER
8800  ,  x_step_item_type    OUT NOCOPY VARCHAR2
8801  ,  x_step_item_key     OUT NOCOPY VARCHAR2
8802  ,  p_object_name       IN  VARCHAR2  := NULL
8803  ,  p_object_id1        IN  NUMBER    := NULL
8804  ,  p_object_id2        IN  NUMBER    := NULL
8805  ,  p_object_id3        IN  NUMBER    := NULL
8806  ,  p_object_id4        IN  NUMBER    := NULL
8807  ,  p_object_id5        IN  NUMBER    := NULL
8808  ,  p_parent_object_name IN  VARCHAR2 := NULL
8809  ,  p_parent_object_id1  IN  NUMBER   := NULL
8810  ,  p_route_action_id   IN  NUMBER    := NULL
8811  )
8812 IS
8813 
8814     -- PRAGMA  AUTONOMOUS_TRANSACTION;
8815     l_api_name          CONSTANT VARCHAR2(30) := 'StartNextRouteStep';
8816 
8817     l_step_process_name VARCHAR2(30) ;
8818     -- l_change_id         NUMBER ;
8819     -- l_change_notice     VARCHAR2(10) ;
8820     -- l_organization_id   NUMBER ;
8821     -- l_wf_user_id        NUMBER ;
8822     -- l_host_url          VARCHAR2(256) ;
8823     l_debug             VARCHAR2(1)    := FND_API.G_FALSE ;
8824     l_output_dir        VARCHAR2(240)  := NULL ;
8825     l_debug_filename    VARCHAR2(200)  := 'StartNextRouteStep.log' ;
8826 
8827 
8828 BEGIN
8829 
8830 IF g_debug_flag THEN
8831    Write_Debug('Eng_Workflow_Util.StartNextRouteStep Log');
8832    Write_Debug('-----------------------------------------------------');
8833    Write_Debug('Route Item Type   : ' || p_route_item_type );
8834    Write_Debug('Route Item Key    : ' || p_route_item_key );
8835    Write_Debug('Route Id          : ' || TO_CHAR(p_route_id) );
8836    Write_Debug('Change Id         : ' || TO_CHAR(p_change_id) );
8837    Write_Debug('Change Line Id    : ' || TO_CHAR(p_change_line_id) );
8838    Write_Debug('-----------------------------------------------------');
8839 END IF ;
8840 
8841     --  Initialize API return status to success
8842     x_return_status := FND_API.G_RET_STS_SUCCESS;
8843 
8844     --
8845     -- Don't try to get Parent Item Attributes from this procedure
8846     -- because this proc is setting PRAGMA  AUTONOMOUS_TRANSACTION
8847     -- If the user modify the Cost info to '0' in Worklfow Definition,
8848     -- the process can not get the Item Attributes because the parent item
8849     -- attr is not saved yet and here is in different session
8850     --
8851 
8852     -- Get Next Route Step Info
8853     FindNextRouteStep
8854     (  x_return_status     => x_return_status
8855     ,  x_msg_count         => x_msg_count
8856     ,  x_msg_data          => x_msg_data
8857     ,  p_route_id          => p_route_id
8858     ,  x_step_id           => x_step_id
8859     ,  x_step_item_type    => x_step_item_type
8860     ,  x_step_process_name => l_step_process_name
8861     ) ;
8862 
8863 
8864     IF x_step_id IS NULL THEN
8865 
8866        x_return_status := Eng_Workflow_Util.G_RET_STS_NONE ;
8867        RETURN ;
8868 
8869     END IF ;
8870 
8871 
8872     --  FND_MSG_PUB.initialize ;
8873     Eng_Workflow_Util.StartWorkflow
8874     (  p_api_version       => 1.0
8875     ,  p_init_msg_list     => FND_API.G_FALSE
8876     ,  p_commit            => FND_API.G_FALSE
8877     ,  p_validation_level  => FND_API.G_VALID_LEVEL_FULL
8878     ,  x_return_status     => x_return_status
8879     ,  x_msg_count         => x_msg_count
8880     ,  x_msg_data          => x_msg_data
8881     ,  p_item_type         => x_step_item_type
8882     ,  x_item_key          => x_step_item_key
8883     ,  p_process_name      => l_step_process_name
8884     ,  p_change_id         => p_change_id
8885     ,  p_change_line_id    => p_change_line_id
8886     ,  p_wf_user_id        => p_wf_user_id
8887     ,  p_host_url          => p_host_url
8888     ,  p_route_id          => p_route_id
8889     ,  p_route_step_id     => x_step_id
8890     ,  p_parent_item_type  => p_route_item_type
8891     ,  p_parent_item_key   => p_route_item_key
8892     ,  p_action_id         => p_route_action_id
8893     ,  p_debug             => l_debug
8894     ,  p_output_dir        => l_output_dir
8895     ,  p_debug_filename    => l_debug_filename
8896     ) ;
8897 
8898     IF x_return_status =  FND_API.G_RET_STS_SUCCESS
8899     THEN
8900 
8901         -- COMMENT OUT  PRAGMA  AUTONOMOUS_TRANSACTION
8902         -- COMMIT ;
8903         NULL ;
8904 
8905     ELSE
8906 
8907         -- COMMENT OUT  PRAGMA  AUTONOMOUS_TRANSACTION
8908         -- ROLLBACK ;
8909         RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
8910 
8911     END IF ;
8912 
8913 IF g_debug_flag THEN
8914    Write_Debug('After call Eng_Workflow_Util.StartWorkflow' ) ;
8915    Write_Debug('Return Status: '     || x_return_status ) ;
8916    Write_Debug('Return Message: '    || x_msg_data ) ;
8917    Write_Debug('Started Step Id : ' || x_step_id ) ;
8918    Write_Debug('Started Step WF Item Type: ' || x_step_item_type ) ;
8919    Write_Debug('Started Step WF Item Kye: ' || x_step_item_key ) ;
8920    Write_Debug('Started Step WF Process Name: ' || l_step_process_name ) ;
8921 END IF ;
8922 
8923 
8924 EXCEPTION
8925     WHEN OTHERS THEN
8926 
8927     -- ROLLBACK ;
8928 
8929     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
8930 
8931     IF  FND_MSG_PUB.Check_Msg_Level
8932       (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
8933     THEN
8934             FND_MSG_PUB.Add_Exc_Msg
8935             ( G_PKG_NAME
8936             , l_api_name
8937             );
8938     END IF;
8939 
8940 END StartNextRouteStep ;
8941 
8942 
8943 PROCEDURE AbortRouteSteps
8944 (   x_return_status     OUT NOCOPY VARCHAR2
8945  ,  x_msg_count         OUT NOCOPY NUMBER
8946  ,  x_msg_data          OUT NOCOPY VARCHAR2
8947  ,  p_route_item_type   IN  VARCHAR2
8948  ,  p_route_item_key    IN  VARCHAR2
8949  ,  p_wf_user_id        IN  NUMBER
8950  )
8951 IS
8952     l_api_name          CONSTANT VARCHAR2(30) := 'AbortRouteSteps';
8953 
8954     l_msg_count         NUMBER ;
8955     l_msg_data          VARCHAR2(2000) ;
8956     l_return_status     VARCHAR2(1) ;
8957 
8958     l_debug             VARCHAR2(1)    := FND_API.G_FALSE ;
8959     l_output_dir        VARCHAR2(240)  := NULL ;
8960     l_debug_filename    VARCHAR2(200)  := 'AbortRouteSteps.log' ;
8961 
8962 
8963     CURSOR  c_abort_step ( p_route_item_type VARCHAR2
8964                          , p_route_item_key  VARCHAR2 )
8965     IS
8966 
8967       SELECT wi.item_type     wf_item_type
8968            , wi.item_key      wf_item_key
8969            , wi.root_activity wf_process_name
8970       FROM   WF_ITEMS  wi
8971       WHERE  wi.parent_item_type = p_route_item_type
8972       AND    wi.parent_item_key = p_route_item_key
8973       AND    wi.item_type IN ( Eng_Workflow_Util.G_CHANGE_ROUTE_STEP_ITEM_TYPE
8974                              , Eng_Workflow_Util.G_CHANGE_ROUTE_DOC_STEP_TYPE
8975                              , Eng_Workflow_Util.G_CHANGE_ROUTE_LINE_STEP_TYPE )
8976       AND    wi.end_date IS NULL ;
8977 
8978 BEGIN
8979 
8980 IF g_debug_flag THEN
8981    Write_Debug('Eng_Workflow_Util.AbortRouteStepsLog');
8982    Write_Debug('-----------------------------------------------------');
8983    Write_Debug('Route Item Type   : ' || p_route_item_type );
8984    Write_Debug('Route Item Key    : ' || p_route_item_key );
8985    Write_Debug('-----------------------------------------------------');
8986 END IF ;
8987 
8988     --  Initialize API return status to success
8989     x_return_status := FND_API.G_RET_STS_SUCCESS;
8990 
8991     FOR abort_step_rec IN c_abort_step (  p_route_item_type => p_route_item_type
8992                                         , p_route_item_key => p_route_item_key )
8993     LOOP
8994 
8995 
8996 IF g_debug_flag THEN
8997    Write_Debug('Aborting Route Step Worklfow . . . ') ;
8998    Write_Debug('Step Item Type   : ' || abort_step_rec.wf_item_type);
8999    Write_Debug('Step Item Key    : ' || abort_step_rec.wf_item_key);
9000 END IF ;
9001 
9002 
9003         Eng_Workflow_Util.AbortWorkflow
9004         (  p_api_version       => 1.0
9005         ,  p_init_msg_list     => FND_API.G_FALSE
9006         ,  p_commit            => FND_API.G_FALSE
9007         ,  p_validation_level  => FND_API.G_VALID_LEVEL_FULL
9008         ,  x_return_status     => l_return_status
9009         ,  x_msg_count         => l_msg_count
9010         ,  x_msg_data          => l_msg_data
9011         ,  p_item_type         => abort_step_rec.wf_item_type
9012         ,  p_item_key          => abort_step_rec.wf_item_key
9013         ,  p_process_name      => abort_step_rec.wf_process_name
9014         ,  p_wf_user_id        => p_wf_user_id
9015         ,  p_debug             => l_debug
9016         ,  p_output_dir        => l_output_dir
9017         ,  p_debug_filename    => l_debug_filename
9018         ) ;
9019 
9020 
9021         IF ( l_return_status <> FND_API.G_RET_STS_SUCCESS )
9022         THEN
9023 
9024             x_return_status := l_return_status ;
9025             x_msg_count     := NVL(l_msg_count, 0) + NVL(l_msg_count,0) ;
9026             x_msg_data      := l_msg_data ;
9027 
9028         END IF ;
9029 
9030     END LOOP ;
9031 
9032 IF g_debug_flag THEN
9033    Write_Debug('After call Eng_Workflow_Util.AbortWorkflow' ) ;
9034    Write_Debug('Return Status: '     || x_return_status ) ;
9035    Write_Debug('Return Message: '    || x_msg_data ) ;
9036 END IF ;
9037 
9038 
9039 EXCEPTION
9040     WHEN OTHERS THEN
9041 
9042     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
9043 
9044     IF  FND_MSG_PUB.Check_Msg_Level
9045       (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
9046     THEN
9047             FND_MSG_PUB.Add_Exc_Msg
9048             ( G_PKG_NAME
9049             , l_api_name
9050             );
9051     END IF;
9052 
9053 END AbortRouteSteps ;
9054 
9055 
9056 
9057 PROCEDURE GrantChangeRoleToParty
9058 (   x_return_status     OUT NOCOPY VARCHAR2
9059  ,  x_msg_count         OUT NOCOPY NUMBER
9060  ,  x_msg_data          OUT NOCOPY VARCHAR2
9061  ,  p_role_name         IN  VARCHAR2
9062  ,  p_change_id         IN  NUMBER
9063  ,  p_party_id          IN  NUMBER
9064  ,  p_start_date        IN  DATE
9065  ,  p_end_date          IN  DATE := NULL
9066  )
9067 IS
9068 
9069     l_api_name      CONSTANT VARCHAR2(30) := 'GrantChangeRoleToParty';
9070 
9071     l_grant_guid    FND_GRANTS.GRANT_GUID%TYPE ;
9072     l_return_status VARCHAR2(3) ;
9073 
9074 
9075 BEGIN
9076 
9077     --  Initialize API return status to success
9078     x_return_status := FND_API.G_RET_STS_SUCCESS;
9079 
9080 
9081 
9082     EGO_SECURITY_PUB.grant_role_guid
9083           ( p_api_version        => 1.0 ,
9084             p_role_name          => p_role_name ,
9085             p_object_name        => GetChangeObjectName(p_change_id)  ,
9086             p_instance_type      => 'INSTANCE' ,
9087             p_instance_set_id    => NULL ,
9088             p_instance_pk1_value => TO_CHAR(p_change_id) ,
9089             p_instance_pk2_value => NULL ,
9090             p_instance_pk3_value => NULL ,
9091             p_instance_pk4_value => NULL ,
9092             p_instance_pk5_value => NULL ,
9093             p_party_id           => p_party_id ,
9094             p_start_date         => NVL(p_start_date,SYSDATE) ,
9095             p_end_date           => p_end_date ,
9096             x_return_status      => l_return_status ,
9097             x_errorcode          => x_msg_data ,
9098             x_grant_guid         => l_grant_guid
9099             );
9100 
9101 
9102     --
9103     -- EGO Security pub returns T if the action is success
9104     -- and  F on failure
9105     --
9106     IF ( l_return_status = FND_API.G_TRUE OR
9107          l_return_status = FND_API.G_FALSE )
9108     THEN
9109 
9110         x_return_status := FND_API.G_RET_STS_SUCCESS;
9111 
9112     ELSE
9113 
9114         x_return_status := FND_API.G_RET_STS_ERROR ;
9115 
9116     END IF ;
9117 
9118 
9119 EXCEPTION
9120     WHEN OTHERS THEN
9121 
9122     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
9123 
9124     IF  FND_MSG_PUB.Check_Msg_Level
9125       (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
9126     THEN
9127             FND_MSG_PUB.Add_Exc_Msg
9128             ( G_PKG_NAME
9129             , l_api_name
9130             );
9131     END IF;
9132 
9133 END GrantChangeRoleToParty ;
9134 
9135 
9136 PROCEDURE StartLineRoutes
9137 (   x_return_status     OUT NOCOPY VARCHAR2
9138  ,  x_msg_count         OUT NOCOPY NUMBER
9139  ,  x_msg_data          OUT NOCOPY VARCHAR2
9140  ,  p_item_type         IN  VARCHAR2
9141  ,  p_item_key          IN  VARCHAR2
9142  ,  p_change_id         IN  NUMBER
9143  ,  p_wf_user_id        IN  NUMBER
9144  ,  p_host_url          IN  VARCHAR2 := NULL
9145 )
9146 IS
9147 
9148     PRAGMA  AUTONOMOUS_TRANSACTION;
9149     l_api_name          CONSTANT VARCHAR2(30) := 'StartLineRoutes';
9150 
9151     l_return_status     VARCHAR2(1) ;
9152     l_line_item_key     VARCHAR2(240)  ;
9153     l_change_id         NUMBER ;
9154 
9155     l_debug             VARCHAR2(1)    := FND_API.G_FALSE ;
9156     l_output_dir        VARCHAR2(240)  := '' ;
9157     l_debug_filename    VARCHAR2(200)  := 'StartLineRoutes.log' ;
9158 
9159 
9160     -- Targe Change Line Route
9161     -- Change Line Object
9162     -- Approval Status: NOT Approved and Approva Requested
9163     -- Status:  Not Cancelled or Completed
9164     -- Main Line
9165     -- Not Header Line
9166     -- Line Route: NOT_STARTED or throw exception from StartWorkflow API
9167     --             At least, we should refres route at OA Page level
9168     CURSOR  c_lines  (p_change_id NUMBER)
9169     IS
9170         SELECT ecl.change_line_id
9171              , ecl.route_id
9172              , ecr.wf_item_type
9173              , ecr.wf_process_name
9174           FROM ENG_CHANGE_LINES  ecl
9175              , ENG_CHANGE_ROUTES ecr
9176          WHERE  ( ecl.status_code <> Eng_Workflow_Util.G_CL_COMPLETED
9177                 AND ecl.status_code <> Eng_Workflow_Util.G_CL_CANCELLED )
9178            AND ( ecl.approval_status_type <> Eng_Workflow_Util.G_APPROVED
9179                  AND ecl.approval_status_type <> Eng_Workflow_Util.G_REQUESTED )
9180            AND ecl.sequence_number <> -1
9181            -- AND ecl.parent_line_id IS NULL
9182            -- AND ecr.status_code = Eng_Workflow_Util.G_RT_NOT_STARTED
9183            AND ecl.change_type_id <> -1
9184            AND ecl.route_id  = ecr.route_id
9185            AND ecl.change_id = p_change_id ;
9186 
9187 
9188 BEGIN
9189 
9190 IF g_debug_flag THEN
9191    Write_Debug('Eng_Workflow_Util.StartLineRoutes');
9192    Write_Debug('-----------------------------------------------------');
9193    Write_Debug('Item Type   : ' || p_item_type );
9194    Write_Debug('Item Key    : ' || p_item_key );
9195    Write_Debug('Change Id   : ' || TO_CHAR(p_change_id) );
9196    Write_Debug('-----------------------------------------------------');
9197 END IF ;
9198 
9199     --  Initialize API return status to None:N
9200     l_return_status := Eng_Workflow_Util.G_RET_STS_NONE ;
9201     x_return_status := Eng_Workflow_Util.G_RET_STS_NONE ;
9202 
9203     --
9204     -- Don't try to get Parent Item Attributes from this procedure
9205     -- because this proc is setting PRAGMA  AUTONOMOUS_TRANSACTION
9206     -- If the user modify the Cost info to '0' in Worklfow Definition,
9207     -- the process can not get the Item Attributes because the parent item
9208     -- attr is not saved yet and here is in different session
9209     --
9210 
9211     -- Get Change Lines
9212     FOR line_rec IN c_lines (p_change_id => p_change_id)
9213     LOOP
9214 
9215         -- Initialize Line Item Key
9216         l_line_item_key := null ;
9217 
9218         -- Start Change Line Workflows
9219         --  FND_MSG_PUB.initialize ;
9220         Eng_Workflow_Util.StartWorkflow
9221         (  p_api_version       => 1.0
9222         ,  p_init_msg_list     => FND_API.G_FALSE
9223         ,  p_commit            => FND_API.G_FALSE
9224         ,  p_validation_level  => FND_API.G_VALID_LEVEL_FULL
9225         ,  x_return_status     => l_return_status
9226         ,  x_msg_count         => x_msg_count
9227         ,  x_msg_data          => x_msg_data
9228         ,  p_item_type         => line_rec.wf_item_type
9229         ,  x_item_key          => l_line_item_key
9230         ,  p_process_name      => line_rec.wf_process_name
9231         ,  p_change_line_id    => line_rec.change_line_id
9232         ,  p_wf_user_id        => p_wf_user_id
9233         ,  p_host_url          => p_host_url
9234         ,  p_parent_item_type  => p_item_type
9235         ,  p_parent_item_key   => p_item_key
9236         ,  p_debug             => l_debug
9237         ,  p_output_dir        => l_output_dir
9238         ,  p_debug_filename    => l_debug_filename || TO_CHAR(line_rec.change_line_id)
9239         ) ;
9240 
9241         IF l_return_status <>  FND_API.G_RET_STS_SUCCESS
9242         THEN
9243 
9244            x_return_status := l_return_status ;
9245 
9246         END IF ;
9247 
9248 IF g_debug_flag THEN
9249    Write_Debug('After call Eng_Workflow_Util.StartWorkflow' ) ;
9250    Write_Debug('Return Status: '     || l_return_status ) ;
9251    Write_Debug('Return Message: '    || x_msg_data ) ;
9252    Write_Debug('Started Change Line Id : ' || TO_CHAR(line_rec.change_line_id) ) ;
9253    Write_Debug('Started CL WF Item Type: ' || line_rec.wf_item_type) ;
9254    Write_Debug('Started CL WF Item Kye: ' || l_line_item_key ) ;
9255    Write_Debug('Started CL WF Process Name: ' || line_rec.wf_process_name ) ;
9256 END IF ;
9257 
9258 
9259     END LOOP ;
9260 
9261 
9262 
9263     IF x_return_status =  FND_API.G_RET_STS_SUCCESS
9264        OR x_return_status = Eng_Workflow_Util.G_RET_STS_NONE
9265     THEN
9266 
9267         COMMIT ;
9268 
9269     ELSE
9270 
9271         ROLLBACK ;
9272         RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
9273 
9274     END IF ;
9275 
9276 
9277 EXCEPTION
9278     WHEN OTHERS THEN
9279 
9280     ROLLBACK ;
9281 
9282     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
9283 
9284     IF  FND_MSG_PUB.Check_Msg_Level
9285       (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
9286     THEN
9287             FND_MSG_PUB.Add_Exc_Msg
9288             ( G_PKG_NAME
9289             , l_api_name
9290             );
9291     END IF;
9292 
9293 END StartLineRoutes ;
9294 
9295 PROCEDURE CheckAllLineApproved
9296 (   x_return_status        OUT NOCOPY VARCHAR2
9297  ,  x_msg_count            OUT NOCOPY NUMBER
9298  ,  x_msg_data             OUT NOCOPY VARCHAR2
9299  ,  p_change_id            IN  NUMBER
9300  ,  x_line_approval_status OUT NOCOPY NUMBER
9301 )
9302 IS
9303 
9304     l_api_name          CONSTANT VARCHAR2(30) := 'CheckAllLineApproved';
9305 
9306     -- Targe Change Line Route
9307     -- Change Line Object
9308     -- Status:  'OPEN'
9309     -- Main Line
9310     -- Not Header Line
9311     -- Line Route: Exists
9312     CURSOR c_approved_line (p_change_id NUMBER )
9313     IS
9314         SELECT 'Non Approved Line Exists'
9315         FROM DUAL
9316         WHERE EXISTS ( SELECT null
9317                        FROM   ENG_CHANGE_LINES ecl
9318                        WHERE  ( ecl.status_code <> Eng_Workflow_Util.G_CL_COMPLETED
9319                                 AND ecl.status_code <> Eng_Workflow_Util.G_CL_CANCELLED )
9320                        AND    ecl.approval_status_type <> Eng_Workflow_Util.G_APPROVED
9321                        AND    ecl.change_type_id <> -1
9322                        AND    ecl.sequence_number <> -1
9323                        -- AND ecl.parent_line_id IS NULL
9324                        AND    ecl.route_id IS NOT NULL
9325                        AND    ecl.change_id = p_change_id
9326                      ) ;
9327 
9328 
9329 BEGIN
9330 
9331     --  Initialize API return status to success
9332     x_return_status := FND_API.G_RET_STS_SUCCESS;
9333 
9334     x_line_approval_status := Eng_Workflow_Util.G_APPROVED ;
9335 
9336     FOR l_approved_line_rec IN c_approved_line (p_change_id )
9337     LOOP
9338 
9339         x_line_approval_status := Eng_Workflow_Util.G_REQUESTED ;
9340 
9341     END LOOP ;
9342 
9343 
9344 EXCEPTION
9345     WHEN OTHERS THEN
9346 
9347     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
9348 
9349     IF  FND_MSG_PUB.Check_Msg_Level
9350       (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
9351     THEN
9352             FND_MSG_PUB.Add_Exc_Msg
9353             ( G_PKG_NAME
9354             , l_api_name
9355             );
9356     END IF;
9357 
9358 END CheckAllLineApproved ;
9359 
9360 
9361 
9362 FUNCTION GetFunctionWebHTMLCall (p_function_name IN  VARCHAR2)
9363 RETURN VARCHAR2
9364 IS
9365 
9366     l_web_html_call   VARCHAR2(240) ;
9367 
9368     c1_OAHP PLS_INTEGER ;
9369     c2_OAHP PLS_INTEGER ;
9370     OAHP_param VARCHAR2(100) ;
9371     c1_OASF PLS_INTEGER ;
9372     c2_OASF PLS_INTEGER ;
9373     OASF_param VARCHAR2(100) ;
9374 
9375     CURSOR  c_func ( p_function_name VARCHAR2)
9376     IS
9377 
9378       SELECT web_html_call
9379       FROM   FND_FORM_FUNCTIONS
9380       WHERE  function_name = p_function_name ;
9381 
9382 BEGIN
9383 
9384     FOR func_rec IN c_func (p_function_name)
9385     LOOP
9386 
9387         l_web_html_call := func_rec.web_html_call;
9388 
9389     END LOOP ;
9390 
9391     /*
9392     -- No need to remove OAHP and OASF
9393     -- Comment Out:
9394     -- Remvoed OAHP Param from web_html_call
9395     -- Otherwise OAFrameWork throws NPE
9396     c1_OAHP := INSTR(l_web_html_call, '&OAHP' ) ;
9397     IF ( c1_OAHP <> 0 ) THEN
9398         c2_OAHP := INSTR(l_web_html_call,  '&', c1_OAHP + 1 ) ;
9399 
9400         IF (c2_OAHP = 0) THEN
9401            c2_OAHP := LENGTH(l_web_html_call) + 1  ;
9402         END IF ;
9403 
9404         OAHP_param :=  SUBSTR( l_web_html_call, c1_OAHP, (c2_OAHP - c1_OAHP)) ;
9405 
9406         l_web_html_call := REPLACE(l_web_html_call, OAHP_param , '') ;
9407 
9408     END IF ;
9409 
9410     c1_OASF := INSTR(l_web_html_call, '&OASF' ) ;
9411 
9412     IF ( c1_OASF <> 0 ) THEN
9413         c2_OASF := INSTR(l_web_html_call,  '&', c1_OASF + 1 ) ;
9414 
9415         IF (c2_OASF = 0) THEN
9416 
9417             c2_OASF := LENGTH(l_web_html_call) + 1  ;
9418 
9419         END IF ;
9420 
9421         OASF_param :=  SUBSTR( l_web_html_call, c1_OASF, (c2_OASF - c1_OASF)) ;
9422 
9423         l_web_html_call := REPLACE(l_web_html_call, OASF_param , '') ;
9424 
9425     END IF ;
9426     */
9427 
9428     RETURN l_web_html_call ;
9429 
9430 
9431 END GetFunctionWebHTMLCall;
9432 
9433 
9434 
9435 -- OBSOLETE
9436 -- NOT USED
9437 -- Called from Eng_Workflow_Pub.GRANT_ROLE_TO_STEP_PEOPLE
9438 -- Moved to instance set grant approach
9439 PROCEDURE GrantChangeRoleToStepPeople
9440 (   x_return_status     OUT NOCOPY VARCHAR2
9441  ,  x_msg_count         OUT NOCOPY NUMBER
9442  ,  x_msg_data          OUT NOCOPY VARCHAR2
9443  ,  p_item_type         IN  VARCHAR2
9444  ,  p_item_key          IN  VARCHAR2
9445  ,  p_change_id         IN  NUMBER
9446  ,  p_step_id           IN  NUMBER
9447 )
9448 IS
9449 
9450     l_api_name                CONSTANT VARCHAR2(30) := 'GrantChangeRoleToStepPeople';
9451 
9452     l_msg_count               NUMBER ;
9453     l_msg_data                VARCHAR2(2000) ;
9454     l_return_status           VARCHAR2(1) ;
9455 
9456 
9457     l_assignee_id             NUMBER ;
9458     l_assignee_type_code      VARCHAR2(30);
9459     l_adhoc_people_flag       VARCHAR2(1) ;
9460     l_default_role_name       VARCHAR2(30);
9461     l_activity_condition_code VARCHAR2(30);
9462     l_performer_party_id      NUMBER;
9463 
9464 
9465 
9466     CURSOR  c_route_person ( p_step_id            NUMBER
9467                            , p_assignee_type_code VARCHAR2 )
9468     IS
9469 
9470         SELECT RoutePeople.assignee_id
9471              , RoutePeople.adhoc_people_flag
9472           FROM ENG_CHANGE_ROUTE_PEOPLE RoutePeople
9473          WHERE RoutePeople.assignee_type_code = p_assignee_type_code
9474            AND RoutePeople.assignee_id <> -1
9475            AND RoutePeople.step_id = p_step_id ;
9476 
9477 BEGIN
9478 
9479     --  Initialize API return status to success
9480     x_return_status := FND_API.G_RET_STS_SUCCESS;
9481 
9482 
9483     -- Get Step Activity Attributes
9484     GetStepActAttributes
9485     ( p_step_id                 => p_step_id
9486     , x_default_role_name       => l_default_role_name
9487     , x_activity_condition_code => l_activity_condition_code ) ;
9488 
9489 
9490     -- In this reslease assignee type is only 'PERSON' for Worklfow Routing Instance
9491     l_assignee_type_code := 'PERSON' ;
9492 
9493 
9494     IF l_default_role_name IS NOT NULL
9495     THEN
9496 
9497         FOR rtp_rec  IN c_route_person (  p_step_id => p_step_id
9498                                         , p_assignee_type_code => l_assignee_type_code )
9499         LOOP
9500             l_assignee_id   := rtp_rec.assignee_id ;
9501             l_adhoc_people_flag := rtp_rec.adhoc_people_flag ;
9502 
9503             GrantChangeRoleToParty
9504             (   x_return_status     => l_return_status
9505              ,  x_msg_count         => l_msg_count
9506              ,  x_msg_data          => l_msg_data
9507              ,  p_role_name         => l_default_role_name
9508              ,  p_change_id         => p_change_id
9509              ,  p_party_id          => l_assignee_id
9510              ,  p_start_date        => SYSDATE
9511              ,  p_end_date          => NULL
9512              ) ;
9513 
9514 
9515             IF l_return_status <>  FND_API.G_RET_STS_SUCCESS
9516             THEN
9517 
9518                 x_return_status := l_return_status ;
9519                 x_msg_count     := NVL(l_msg_count, 0) + NVL(l_msg_count,0) ;
9520                 x_msg_data      := l_msg_data ;
9521 
9522             END IF ;
9523 
9524         END LOOP ;
9525 
9526     END IF ;
9527 
9528 
9529 EXCEPTION
9530     WHEN OTHERS THEN
9531 
9532     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
9533 
9534     IF  FND_MSG_PUB.Check_Msg_Level
9535       (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
9536     THEN
9537             FND_MSG_PUB.Add_Exc_Msg
9538             ( G_PKG_NAME
9539             , l_api_name
9540             );
9541     END IF;
9542 
9543 END GrantChangeRoleToStepPeople ;
9544 
9545 
9546 --
9547 -- VoteForResultType
9548 -- Because of bug2885157,
9549 -- copied from WF_STANDARD.VoteForResultType 115.46
9550 -- and put Wf_Item_Activity_Status.ClearCache before calling
9551 -- Wf_Item_Activity_Status.Notification_Status to get notification group id correctly
9552 --
9553 --
9554 -- Standard Voting Function
9555 -- IN
9556 --   itemtype  - A valid item type from (WF_ITEM_TYPES table).
9557 --   itemkey   - A string generated from the application object's primary key.
9558 --   actid     - The process activity(instance id).
9559 --   funcmode  - Run/Cancel
9560 -- OUT
9561 --   result    -
9562 --
9563 -- USED BY ACTIVITIES
9564 --
9565 --   WFSTD.VoteForResultType
9566 --
9567 -- ACTIVITY ATTRIBUTES REFERENCED
9568 --      VOTING_OPTION
9569 --          - WAIT_FOR_ALL_VOTES  - Evaluate voting after all votes are cast
9570 --                                - or a Timeout condition closes the voting
9571 --                                - polls.  When a Timeout occurs the
9572 --                                - voting percentages are calculated as a
9573 --                                - percentage ofvotes cast.
9574 --
9575 --          - REQUIRE_ALL_VOTES   - Evaluate voting after all votes are cast.
9576 --                                - If a Timeout occurs and all votes have not
9577 --                                - been cast then the standard timeout
9578 --                                - transition is taken.  Votes are calculated
9579 --                                - as a percenatage of users notified to vote.
9580 --
9581 --          - TALLY_ON_EVERY_VOTE - Evaluate voting after every vote or a
9582 --                                - Timeout condition closes the voting polls.
9583 --                                - After every vote voting percentages are
9584 --                                - calculated as a percentage of user notified
9585 --                                - to vote.  After a timeout voting
9586 --                                - percentages are calculated as a percentage
9587 --                                - of votes cast.
9588 --
9589 --      "One attribute for each of the activities result type codes"
9590 --
9591 --          - The standard Activity VOTEFORRESULTTYPE has the WFSTD_YES_NO
9592 --          - result type assigned.
9593 --          - Thefore activity has two activity attributes.
9594 --
9595 --                  Y       - Percenatage required for Yes transition
9596 --                  N       - Percentage required for No transition
9597 --
9598 PROCEDURE VoteForResultType
9599 (   itemtype  in varchar2,
9600     itemkey   in varchar2,
9601     actid     in number,
9602     funcmode  in varchar2,
9603     resultout in out NOCOPY varchar2)
9604 IS
9605 
9606   -- Select all lookup codes for an activities result type
9607   cursor result_codes is
9608   select  wfl.lookup_code result_code
9609   from    wf_lookups wfl,
9610           wf_activities wfa,
9611           wf_process_activities wfpa,
9612           wf_items wfi
9613   where   wfl.lookup_type         = wfa.result_type
9614   and     wfa.name                = wfpa.activity_name
9615   and     wfi.begin_date          >= wfa.begin_date
9616   and     wfi.begin_date          < nvl(wfa.end_date,wfi.begin_date+1)
9617   and     wfpa.activity_item_type = wfa.item_type
9618   and     wfpa.instance_id        = actid
9619   and     wfi.item_key            = itemkey
9620   and     wfi.item_type           = itemtype;
9621 
9622   l_code_count    pls_integer;
9623   l_group_id      pls_integer;
9624   l_user          varchar2(320);
9625   l_voting_option varchar2(30);
9626   l_per_of_total  number;
9627   l_per_of_vote   number;
9628   l_per_code      number;
9629   per_success     number;
9630   max_default     pls_integer := 0;
9631   default_result  varchar2(30) := '';
9632   result          varchar2(30) := '';
9633 
9634   wf_invalid_command exception;
9635 
9636 begin
9637 
9638 
9639 IF g_debug_flag THEN
9640    Write_Debug('Start VoteForResultType ...' );
9641 END IF ;
9642 
9643   -- Do nothing unless in RUN or TIMEOUT modes
9644   if  (funcmode <> wf_engine.eng_run)
9645   and (funcmode <> wf_engine.eng_timeout) then
9646     resultout := wf_engine.eng_null;
9647     return;
9648   end if;
9649 
9650   -- SYNCHMODE: Not allowed
9651   if (itemkey = wf_engine.eng_synch) then
9652     Wf_Core.Token('OPERATION', 'Wf_Standard.VotForResultType');
9653     Wf_Core.Raise('WFENG_SYNCH_DISABLED');
9654   end if;
9655 
9656   -- Always clear the cache first
9657   -- Bug2885157
9658   -- so it should be safe to force reading from
9659   -- the database.
9660   Wf_Item_Activity_Status.ClearCache;
9661 
9662   -- Get Notifications group_id for activity
9663   Wf_Item_Activity_Status.Notification_Status(itemtype,itemkey,actid,
9664       l_group_id,l_user);
9665   l_voting_option := Wf_Engine.GetActivityAttrText(itemtype,itemkey,
9666                          actid,'VOTING_OPTION');
9667 
9668 IF g_debug_flag THEN
9669    Write_Debug('Got Ntf Group Id: ' || to_char(l_group_id) );
9670    Write_Debug('Got Voting Option : ' || l_voting_option );
9671 END IF ;
9672 
9673 
9674   if (l_voting_option not in ('REQUIRE_ALL_VOTES', 'WAIT_FOR_ALL_VOTES',
9675                                'TALLY_ON_EVERY_VOTE')) then
9676     raise wf_invalid_command;
9677   end if;
9678 
9679   -- If here, then the mode is one of:
9680   --   a. TALLY_ON_ALL_VOTES
9681   --   b. WAIT_FOR_ALL_VOTES and timeout has occurred
9682   --   c. WAIT_FOR_ALL_VOTES and all votes are cast
9683   --   d. REQUIRE_ALL_VOTES and all votes are cast
9684   -- Tally votes.
9685   for result_rec in result_codes loop
9686     -- Tally Vote Count for this result code
9687     Wf_Notification.VoteCount(l_group_id,result_rec.result_code,
9688         l_code_count,l_per_of_total,l_per_of_vote);
9689 
9690 IF g_debug_flag THEN
9691    Write_Debug('Couting result code : ' || result_rec.result_code  );
9692    Write_Debug('Code Count  : ' || to_char(l_code_count) );
9693    Write_Debug('Total percent : ' || to_char(l_per_of_total) );
9694    Write_Debug('Percent of vote  : ' || to_char(l_per_of_vote) );
9695 END IF ;
9696 
9697 
9698     -- If this is timeout mode, then use the percent of votes cast so far.
9699     -- If this is run mode, then use the percent of total votes possible.
9700     if (funcmode = wf_engine.eng_timeout) then
9701       l_per_code := l_per_of_vote;
9702     else
9703       l_per_code := l_per_of_total;
9704     end if;
9705 
9706 IF g_debug_flag THEN
9707    Write_Debug('Percent of code  : ' || to_char(l_per_code) );
9708 END IF ;
9709 
9710 
9711     -- Get percent vote needed for this result to succeed
9712     per_success := Wf_Engine.GetActivityAttrNumber(itemtype,itemkey,
9713                        actid,result_rec.result_code);
9714 
9715 
9716 IF g_debug_flag THEN
9717    Write_Debug('Percent of Success  : ' || to_char(per_success) );
9718 END IF ;
9719 
9720 
9721     if (per_success is null) then
9722 
9723 IF g_debug_flag THEN
9724    Write_Debug('Percent of Success  IS NULL  '  );
9725 END IF ;
9726 
9727       -- Null value means this is a default result.
9728       -- Save the default result with max code_count.
9729       if (l_code_count > max_default) then
9730         max_default := l_code_count;
9731         default_result := result_rec.result_code;
9732       elsif (l_code_count = max_default) then
9733         -- Tie for default result.
9734         default_result := wf_engine.eng_tie;
9735       end if;
9736     else
9737 
9738 IF g_debug_flag THEN
9739    Write_Debug('Percent of Success  IS NOT NULL  '  );
9740 END IF ;
9741 
9742       -- If:
9743       --   a. % vote for this result > % needed for success OR
9744       --   b. % vote is 100% AND
9745       --   c. at least 1 vote for this result
9746       -- then this result succeeds.
9747       if (((l_per_code > per_success) or (l_per_code = 100)) and
9748           (l_code_count > 0))
9749       then
9750         if (result is null) then
9751           -- Save satisfied result.
9752           result := result_rec.result_code;
9753 
9754 IF g_debug_flag THEN
9755    Write_Debug('Satisfied result ' || result  );
9756 END IF ;
9757 
9758         else
9759           -- This is the second result to be satisfied.  Return a tie.
9760           resultout := wf_engine.eng_completed||':'||wf_engine.eng_tie;
9761 
9762 IF g_debug_flag THEN
9763    Write_Debug('This is the second result to be satisfied ' );
9764 END IF ;
9765 
9766           return;
9767         end if;
9768       end if;
9769     end if;
9770   end loop;
9771 
9772 IF g_debug_flag THEN
9773    Write_Debug('Voting Count Result: ' || result );
9774 END IF ;
9775 
9776 
9777   if (result is not null) then
9778 
9779 IF g_debug_flag THEN
9780    Write_Debug('Satisfied result IS NOT NULL ' );
9781 END IF ;
9782 
9783     -- Return the satisfied result code.
9784     resultout := wf_engine.eng_completed||':'||result;
9785   else
9786 
9787 IF g_debug_flag THEN
9788    Write_Debug('Satisfied result IS NULL ' );
9789 END IF ;
9790 
9791 
9792     -- If we get here no non-default results were satisfied.
9793     if (funcmode = wf_engine.eng_run and
9794         wf_notification.OpenNotificationsExist(l_group_id)) then
9795       -- Not timed out and still open notifications.
9796       -- Return waiting to continue voting.
9797 
9798 IF g_debug_flag THEN
9799    Write_Debug('Not timed out and still open notifications. Return waiting to continue voting ' );
9800 END IF ;
9801 
9802       resultout := wf_engine.eng_waiting;
9803     elsif (default_result is not null) then
9804       -- Either timeout or all notifications closed
9805       -- Return default result if one found.
9806       resultout := wf_engine.eng_completed||':'||default_result;
9807 
9808 IF g_debug_flag THEN
9809    Write_Debug('Either timeout or all notifications closed. Return default result if one found ' );
9810 END IF ;
9811 
9812     else
9813       -- Timeout or all notifications closed, and no default.
9814       -- Return nomatch
9815 
9816 IF g_debug_flag THEN
9817    Write_Debug('Timeout or all notifications closed, and no default. Return nomatch ' );
9818 END IF ;
9819 
9820       resultout := wf_engine.eng_completed||':'||wf_engine.eng_nomatch;
9821     end if;
9822   end if;
9823   return;
9824 
9825 exception
9826   when wf_invalid_command then
9827     Wf_Core.Context('Wf_Standard', 'VoteForResultType', itemtype,
9828                     itemkey, to_char(actid), funcmode);
9829     Wf_Core.Token('COMMAND', l_voting_option);
9830     Wf_Core.Raise('WFSQL_COMMAND');
9831   when others then
9832     Wf_Core.Context('Wf_Standard', 'VoteForResultType',itemtype,
9833                     itemkey, to_char(actid), funcmode);
9834     raise;
9835 
9836 
9837 end VoteForResultType ;
9838 
9839 --
9840 -- PeopleLevelVoteCount
9841 --      Count the number of responses for a result_code
9842 -- IN:
9843 --      Gid -  Notification group id
9844 --      ResultCode - Result code to be tallied
9845 --      MandatoryResultCode - Result code to be tallied amang mandatory resonses
9846 -- OUT:
9847 --      ResultCount - Number of responses for ResultCode
9848 --      PercentOfTotalPop - % ResultCode ( As a % of total population )
9849 --      PercentOfVotes - % ResultCode ( As a % of votes cast )
9850 --
9851 procedure PeopleLevelVoteCount
9852                        (Gid                     in  number,
9853                         ResultCode              in  varchar2,
9854                         MandatoryResultCode     in  varchar2,
9855                         StepId                  in  number,
9856                         ResultCount             out nocopy number,
9857                         PercentOfTotalPop       out nocopy number,
9858                         PercentOfVotes          out nocopy number )
9859 is
9860         l_code_count    pls_integer;
9861         l_total_pop     pls_integer;
9862         l_total_voted   pls_integer;
9863 begin
9864 
9865 
9866 IF g_debug_flag THEN
9867    Write_Debug('Start PeopleLevelVoteCount. . . for Step  '  || to_char(StepId) );
9868    Write_Debug('ResultCode '  || ResultCode );
9869    Write_Debug('MandatoryResultCode '  || MandatoryResultCode );
9870 END IF ;
9871 
9872     IF  MandatoryResultCode IS NOT NULL AND
9873         ( MandatoryResultCode = ResultCode
9874           OR Eng_Workflow_Util.G_MANDATORY_RESP_ANY = MandatoryResultCode
9875         )  -- Added for Route
9876     THEN
9877 
9878         --
9879         --
9880         --
9881         SELECT COUNT(*)
9882         INTO   l_total_pop
9883         FROM   ENG_CHANGE_ROUTE_PEOPLE RoutePeople
9884              , EGO_USER_V  UserV
9885              , WF_NOTIFICATIONS wn
9886         WHERE RoutePeople.assignee_id = UserV.party_id
9887         AND   RoutePeople.response_condition_code = 'MANDATORY'
9888         AND   RoutePeople.step_id = StepId
9889         AND   UserV.user_name = wn.recipient_role
9890         AND   wn.group_id = Gid;
9891 
9892 
9893         SELECT COUNT(*)
9894         INTO   l_total_voted
9895         FROM   ENG_CHANGE_ROUTE_PEOPLE RoutePeople
9896              , EGO_USER_V  UserV
9897              , WF_NOTIFICATIONS wn
9898         WHERE RoutePeople.assignee_id = UserV.party_id
9899         AND   RoutePeople.response_condition_code = 'MANDATORY'
9900         AND   RoutePeople.step_id = StepId
9901         AND   UserV.user_name = wn.recipient_role
9902         AND   wn.status  = 'CLOSED'
9903         AND   wn.group_id = Gid;
9904 
9905 
9906         SELECT COUNT(*)
9907         INTO   l_code_count
9908         FROM   ENG_CHANGE_ROUTE_PEOPLE RoutePeople
9909              , EGO_USER_V  UserV
9910              , WF_NOTIFICATION_ATTRIBUTES wfna
9911              , WF_NOTIFICATIONS wn
9912         WHERE RoutePeople.assignee_id = UserV.party_id
9913         AND   RoutePeople.response_condition_code = 'MANDATORY'
9914         AND   RoutePeople.step_id = StepId
9915         AND   UserV.user_name = wn.recipient_role
9916         AND   wfna.name              = 'RESULT'
9917         AND   wfna.text_value        = ResultCode
9918         AND   wn.notification_id     = wfna.notification_id
9919         AND   wn.status              = 'CLOSED'
9920         AND   wn.group_id            = Gid;
9921 
9922         ResultCount := l_code_count;
9923 
9924 
9925 
9926 IF g_debug_flag THEN
9927    Write_Debug('After Query Data for Step Assigness. . .'  );
9928    Write_Debug('l_total_pop: '  || to_char(l_total_pop) );
9929    Write_Debug('l_total_voted: '  || to_char(l_total_voted) );
9930    Write_Debug('l_code_count: '  || to_char(l_code_count) );
9931 END IF ;
9932 
9933         IF ( Eng_Workflow_Util.G_MANDATORY_RESP_ANY = MandatoryResultCode )
9934         THEN
9935 
9936 IF g_debug_flag THEN
9937    Write_Debug('In case Mandaotry Response Code is ANY. . .'  );
9938 END IF ;
9939 
9940             --
9941             -- Prevent division by zero if group has no notifications
9942             --
9943             if ( l_total_pop = 0 ) then
9944                 --
9945                 PercentOfTotalPop := 0;
9946                 --
9947             else
9948                 --
9949                 PercentOfTotalPop := l_code_count/l_total_pop*100;
9950                 --
9951             end if;
9952 
9953             --
9954             -- Prevent division by zero if nobody votes
9955             --
9956             if ( l_total_voted = 0 ) then
9957                 --
9958                 PercentOfVotes := 0;
9959                 --
9960             else
9961                 -- Need to wait until all mandatory assignees repond
9962                 IF l_total_voted = l_total_pop THEN
9963 
9964 IF g_debug_flag THEN
9965    Write_Debug('Total Vote and Total Pop is same.  PercentOfVotes is 100. . .'  );
9966 END IF ;
9967                     PercentOfVotes := 100;
9968 
9969                 ELSE
9970 IF g_debug_flag THEN
9971    Write_Debug('Total Vote and Total Pop is NOT  same.  PercentOfVotes is 0. . .'  );
9972 END IF ;
9973 
9974                     PercentOfVotes := 0 ;
9975 
9976                 END IF ;
9977                 --
9978             end if;
9979 
9980 
9981         ELSE
9982 
9983             --
9984             -- Prevent division by zero if group has no notifications
9985             --
9986             if ( l_total_pop = 0 ) then
9987                 --
9988                 PercentOfTotalPop := 0;
9989                 --
9990             else
9991                 --
9992                 PercentOfTotalPop := l_code_count/l_total_pop*100;
9993                 --
9994             end if;
9995             --
9996             -- Prevent division by zero if nobody votes
9997             --
9998             if ( l_total_voted = 0 ) then
9999                 --
10000                 PercentOfVotes := 0;
10001                 --
10002             else
10003                 --
10004                 PercentOfVotes := l_code_count/l_total_voted*100;
10005                 --
10006             end if;
10007 
10008         END IF ;
10009 
10010 
10011     ELSE
10012 
10013         Wf_Notification.VoteCount
10014                        (Gid                     => Gid ,
10015                         ResultCode              => ResultCode ,
10016                         ResultCount             => ResultCount,
10017                         PercentOfTotalPop       => PercentOfTotalPop,
10018                         PercentOfVotes          => PercentOfVotes) ;
10019 
10020 
10021     END IF ;
10022 
10023 
10024 exception
10025     when others then
10026         wf_core.context('Eng_Workflow_Util',
10027                         'PeopleLevelVoteCount',
10028                          to_char(gid),
10029                           ResultCode );
10030         raise;
10031 end PeopleLevelVoteCount;
10032 
10033 
10034 --
10035 -- PeopleLevelVoteForResultType
10036 --
10037 -- Route People Level Standard Voting Function
10038 -- IN
10039 --   itemtype  - A valid item type from (WF_ITEM_TYPES table).
10040 --   itemkey   - A string generated from the application object's primary key.
10041 --   actid     - The process activity(instance id).
10042 --   funcmode  - Run/Cancel
10043 -- OUT
10044 --   result    -
10045 --
10046 -- USED BY ACTIVITIES
10047 --
10048 --   Route Notofication Call Back Functions
10049 --
10050 -- ACTIVITY ATTRIBUTES REFERENCED
10051 --   VOTING_OPTION
10052 --   Eng_Workflow_Util.G_PEOPLE   - Evaluate voting after every vote.
10053 --                                - After every vote voting percentages are
10054 --                                - calculated as a percentage of user specified as
10055 --                                - mandatory notified to vote.  voting
10056 --                                - percentages are calculated as a percentage
10057 --                                - of votes cast.
10058 --
10059 --   "One attribute for each of the activities result type codes"
10060 --   MANDATORY                    -- Specified MANDATORY result type code
10061 --
10062 --
10063 PROCEDURE PeopleLevelVoteForResultType
10064 (   itemtype  in varchar2,
10065     itemkey   in varchar2,
10066     actid     in number,
10067     funcmode  in varchar2,
10068     resultout in out NOCOPY varchar2)
10069 IS
10070 
10071   -- Select all lookup codes for an activities result type
10072   cursor result_codes is
10073   select  wfl.lookup_code result_code
10074   from    wf_lookups wfl,
10075           wf_activities wfa,
10076           wf_process_activities wfpa,
10077           wf_items wfi
10078   where   wfl.lookup_type         = wfa.result_type
10079   and     wfa.name                = wfpa.activity_name
10080   and     wfi.begin_date          >= wfa.begin_date
10081   and     wfi.begin_date          < nvl(wfa.end_date,wfi.begin_date+1)
10082   and     wfpa.activity_item_type = wfa.item_type
10083   and     wfpa.instance_id        = actid
10084   and     wfi.item_key            = itemkey
10085   and     wfi.item_type           = itemtype;
10086 
10087   l_code_count    pls_integer;
10088   l_group_id      pls_integer;
10089   l_user          varchar2(320);
10090   l_voting_option varchar2(30);
10091   l_per_of_total  number;
10092   l_per_of_vote   number;
10093   l_per_code      number;
10094   per_success     number;
10095   max_default     pls_integer := 0;
10096   default_result  varchar2(30) := '';
10097   result          varchar2(30) := '';
10098 
10099   l_mandatory_result  varchar2(30);
10100   l_route_step_id     number;
10101 
10102   wf_invalid_command exception;
10103 
10104 begin
10105 
10106 
10107 IF g_debug_flag THEN
10108    Write_Debug('Start PeopleLevelVoteForResultType...' );
10109 END IF ;
10110 
10111   -- Do nothing unless in RUN or TIMEOUT modes
10112   if  (funcmode <> wf_engine.eng_run)
10113   and (funcmode <> wf_engine.eng_timeout) then
10114     resultout := wf_engine.eng_null;
10115     return;
10116   end if;
10117 
10118   -- SYNCHMODE: Not allowed
10119   if (itemkey = wf_engine.eng_synch) then
10120     Wf_Core.Token('OPERATION', 'Eng_Workflow_Util.PeopleLevelVoteForResultType');
10121     Wf_Core.Raise('WFENG_SYNCH_DISABLED');
10122   end if;
10123 
10124   -- Always clear the cache first
10125   -- Bug2885157
10126   -- so it should be safe to force reading from
10127   -- the database.
10128   Wf_Item_Activity_Status.ClearCache;
10129 
10130 
10131   -- Get Notifications group_id for activity
10132   Wf_Item_Activity_Status.Notification_Status(itemtype,itemkey,actid,
10133       l_group_id,l_user);
10134 
10135   -- Get Voting Option
10136   l_voting_option := Wf_Engine.GetActivityAttrText(itemtype,itemkey,
10137                          actid,'VOTING_OPTION');
10138 
10139   l_mandatory_result := Wf_Engine.GetActivityAttrText(itemtype,itemkey,
10140                          actid,'MANDATORY', true);
10141 
10142 
10143 IF g_debug_flag THEN
10144    Write_Debug('Got Ntf Group Id: ' || to_char(l_group_id) );
10145    Write_Debug('Got Voting Option : ' || l_voting_option );
10146    Write_Debug('Got Mandotory Result Option : ' || l_mandatory_result );
10147 END IF ;
10148 
10149 
10150   if (l_voting_option not in ('REQUIRE_ALL_VOTES', 'WAIT_FOR_ALL_VOTES',
10151                                'TALLY_ON_EVERY_VOTE'))
10152      AND (l_voting_option <> Eng_Workflow_Util.G_PEOPLE ) -- Added for Route
10153   then
10154     raise wf_invalid_command;
10155   end if;
10156 
10157   -- If here, then the mode is one of:
10158   --   a. TALLY_ON_ALL_VOTES
10159   --   b. WAIT_FOR_ALL_VOTES and timeout has occurred
10160   --   c. WAIT_FOR_ALL_VOTES and all votes are cast
10161   --   d. REQUIRE_ALL_VOTES and all votes are cast
10162   -- Tally votes.
10163   for result_rec in result_codes loop
10164 
10165     IF (l_voting_option = Eng_Workflow_Util.G_PEOPLE
10166         AND ( ( l_mandatory_result IS NOT NULL
10167                 AND l_mandatory_result = result_rec.result_code )
10168             OR  l_mandatory_result =  Eng_Workflow_Util.G_MANDATORY_RESP_ANY
10169            )
10170         )
10171     THEN
10172 
10173 
10174 IF g_debug_flag THEN
10175    Write_Debug('Calling Eng_Workflow_Util.PeopleLevelVoteCount . . .' );
10176    Write_Debug('Step Id : ' || to_char(l_route_step_id) );
10177 END IF ;
10178 
10179         -- Get Route Step Id
10180         GetRouteStepId
10181         (   p_item_type         => itemtype
10182          ,  p_item_key          => itemkey
10183          ,  x_route_step_id     => l_route_step_id
10184         ) ;
10185 
10186         -- Tally Vote Count for this result code
10187         -- in case that Votion Option is Assignee Level(PEOPLE)
10188         -- and it is reponse code should be tallied among mandatory responses
10189         Eng_Workflow_Util.PeopleLevelVoteCount
10190                        (Gid                     => l_group_id,
10191                         ResultCode              => result_rec.result_code,
10192                         MandatoryResultCode     => l_mandatory_result,
10193                         ResultCount             => l_code_count,
10194                         StepId                  => l_route_step_id,
10195                         PercentOfTotalPop       => l_per_of_total,
10196                         PercentOfVotes          => l_per_of_vote ) ;
10197 
10198 
10199     ELSE
10200 
10201         -- Tally Vote Count for this result code
10202         Wf_Notification.VoteCount(l_group_id,result_rec.result_code,
10203             l_code_count,l_per_of_total,l_per_of_vote);
10204 
10205     END IF ;
10206 
10207 
10208 IF g_debug_flag THEN
10209    Write_Debug('Couting result code : ' || result_rec.result_code  );
10210    Write_Debug('Code Count  : ' || to_char(l_code_count) );
10211    Write_Debug('Total percent : ' || to_char(l_per_of_total) );
10212    Write_Debug('Percent of vote  : ' || to_char(l_per_of_vote) );
10213 END IF ;
10214 
10215 
10216     -- If this is timeout mode, then use the percent of votes cast so far.
10217     -- If this is run mode, then use the percent of total votes possible.
10218     if (funcmode = wf_engine.eng_timeout) then
10219       l_per_code := l_per_of_vote;
10220     else
10221       l_per_code := l_per_of_total;
10222     end if;
10223 
10224 IF g_debug_flag THEN
10225    Write_Debug('Percent of code  : ' || to_char(l_per_code) );
10226 END IF ;
10227 
10228 
10229     -- Get percent vote needed for this result to succeed
10230     per_success := Wf_Engine.GetActivityAttrNumber(itemtype,itemkey,
10231                        actid,result_rec.result_code);
10232 
10233 
10234 IF g_debug_flag THEN
10235    Write_Debug('Percent of Success  : ' || to_char(per_success) );
10236 END IF ;
10237 
10238 
10239     if (per_success is null) then
10240 
10241 IF g_debug_flag THEN
10242    Write_Debug('Percent of Success  IS NULL  '  );
10243 END IF ;
10244 
10245       -- Null value means this is a default result.
10246       -- Save the default result with max code_count.
10247       if (l_code_count > max_default) then
10248         max_default := l_code_count;
10249         default_result := result_rec.result_code;
10250       elsif (l_code_count = max_default) then
10251         -- Tie for default result.
10252         default_result := wf_engine.eng_tie;
10253       end if;
10254     else
10255 
10256 IF g_debug_flag THEN
10257    Write_Debug('Percent of Success  IS NOT NULL  '  );
10258 END IF ;
10259 
10260       -- If:
10261       --   a. % vote for this result > % needed for success OR
10262       --   b. % vote is 100% AND
10263       --   c. at least 1 vote for this result
10264       -- then this result succeeds.
10265       if (((l_per_code > per_success) or (l_per_code = 100)) and
10266           (l_code_count > 0))
10267       then
10268         if (result is null) then
10269           -- Save satisfied result.
10270           result := result_rec.result_code;
10271 
10272 IF g_debug_flag THEN
10273    Write_Debug('Satisfied result ' || result  );
10274 END IF ;
10275 
10276         else
10277           -- This is the second result to be satisfied.  Return a tie.
10278           resultout := wf_engine.eng_completed||':'||wf_engine.eng_tie;
10279 
10280 IF g_debug_flag THEN
10281    Write_Debug('This is the second result to be satisfied ' );
10282 END IF ;
10283 
10284           return;
10285         end if;
10286       end if;
10287     end if;
10288   end loop;
10289 
10290 IF g_debug_flag THEN
10291    Write_Debug('Voting Count Result: ' || result );
10292 END IF ;
10293 
10294 
10295   if (result is not null) then
10296 
10297 IF g_debug_flag THEN
10298    Write_Debug('Satisfied result IS NOT NULL ' );
10299 END IF ;
10300 
10301     -- Return the satisfied result code.
10302     resultout := wf_engine.eng_completed||':'||result;
10303   else
10304 
10305 IF g_debug_flag THEN
10306    Write_Debug('Satisfied result IS NULL ' );
10307 END IF ;
10308 
10309 
10310     -- If we get here no non-default results were satisfied.
10311     if (funcmode = wf_engine.eng_run and
10312         wf_notification.OpenNotificationsExist(l_group_id)) then
10313       -- Not timed out and still open notifications.
10314       -- Return waiting to continue voting.
10315 
10316 IF g_debug_flag THEN
10317    Write_Debug('Not timed out and still open notifications. Return waiting to continue voting ' );
10318 END IF ;
10319 
10320       resultout := wf_engine.eng_waiting;
10321     elsif (default_result is not null) then
10322       -- Either timeout or all notifications closed
10323       -- Return default result if one found.
10324       resultout := wf_engine.eng_completed||':'||default_result;
10325 
10326 IF g_debug_flag THEN
10327    Write_Debug('Either timeout or all notifications closed. Return default result if one found ' );
10328 END IF ;
10329 
10330     else
10331       -- Timeout or all notifications closed, and no default.
10332       -- Return nomatch
10333 
10334 IF g_debug_flag THEN
10335    Write_Debug('Timeout or all notifications closed, and no default. Return nomatch ' );
10336 END IF ;
10337 
10338       resultout := wf_engine.eng_completed||':'||wf_engine.eng_nomatch;
10339     end if;
10340   end if;
10341   return;
10342 
10343 
10344 exception
10345   when wf_invalid_command then
10346     Wf_Core.Context('Eng_Workflow_Util', 'PeopleLevelVoteForResultType', itemtype,
10347                     itemkey, to_char(actid), funcmode);
10348     Wf_Core.Token('COMMAND', l_voting_option);
10349     Wf_Core.Raise('WFSQL_COMMAND');
10350   when others then
10351     Wf_Core.Context('Eng_Workflow_Util', 'PeopleLevelVoteForResultType',itemtype,
10352                     itemkey, to_char(actid), funcmode);
10353     raise;
10354 
10355 
10356 END PeopleLevelVoteForResultType ;
10357 
10358 
10359 PROCEDURE RouteStepVoteForResultType
10360 (   itemtype  in varchar2,
10361     itemkey   in varchar2,
10362     actid     in number,
10363     funcmode  in varchar2,
10364     resultout in out NOCOPY varchar2)
10365 IS
10366 
10367   l_voting_option  VARCHAR2(30);
10368 
10369 BEGIN
10370 
10371 
10372 IF g_debug_flag THEN
10373    Write_Debug('Start RouteStepVoteForResultType...' );
10374    Write_Debug('-----------------------------------------------------');
10375    Write_Debug('Item Type         : ' || itemtype );
10376    Write_Debug('Item Key          : ' || itemkey );
10377    Write_Debug('Acttivity Id      : ' || to_char(actid));
10378    Write_Debug('-----------------------------------------------------');
10379 END IF ;
10380 
10381   -- Get Voting Option
10382   l_voting_option := Wf_Engine.GetActivityAttrText(itemtype,itemkey,
10383                          actid,'VOTING_OPTION');
10384 
10385 
10386 
10387 IF g_debug_flag THEN
10388    Write_Debug('Voting Option: ' || l_voting_option );
10389 END IF ;
10390 
10391   if (l_voting_option in (Eng_Workflow_Util.G_WAIT_FOR_ALL_VOTES,
10392                           Eng_Workflow_Util.G_REQUIRE_ALL_VOTES,
10393                           Eng_Workflow_Util.G_TALLY_ON_EVERY_VOTE)
10394      )
10395   then
10396 
10397 
10398 IF g_debug_flag THEN
10399    Write_Debug('Calling Eng_Workflow_Util.VoteForResultType . . . ' );
10400 END IF ;
10401 
10402     Eng_Workflow_Util.VoteForResultType
10403                       ( itemtype
10404                       , itemkey
10405                       , actid
10406                       , funcmode
10407                       , resultout ) ;
10408 
10409   elsif (l_voting_option = Eng_Workflow_Util.G_PEOPLE)
10410   then
10411 
10412 
10413 IF g_debug_flag THEN
10414    Write_Debug('Calling Eng_Workflow_Util.Eng_Workflow_Util.PeopleLevelVoteForResultType . . . ' );
10415 END IF ;
10416 
10417     Eng_Workflow_Util.PeopleLevelVoteForResultType
10418                       ( itemtype
10419                       , itemkey
10420                       , actid
10421                       , funcmode
10422                       , resultout ) ;
10423 
10424   end if;
10425 
10426 
10427 IF g_debug_flag THEN
10428    Write_Debug('RouteStepVoteForResultType Result: '  || resultout );
10429 END IF ;
10430 
10431 
10432 END RouteStepVoteForResultType ;
10433 
10434 
10435 PROCEDURE ContinueHeaderRoute
10436 (   x_return_status           OUT NOCOPY VARCHAR2
10437  ,  x_msg_count               OUT NOCOPY NUMBER
10438  ,  x_msg_data                OUT NOCOPY VARCHAR2
10439  ,  p_item_type               IN  VARCHAR2
10440  ,  p_item_key                IN  VARCHAR2
10441  ,  p_actid                   IN  NUMBER
10442  ,  p_waiting_activity        IN  VARCHAR2
10443  ,  p_waiting_flow_type       IN  VARCHAR2
10444  ,  x_resultout               IN OUT NOCOPY VARCHAR2
10445 )
10446 IS
10447 
10448     l_change_id            NUMBER ;
10449     l_line_approval_status NUMBER ;
10450 
10451     l_return_status        VARCHAR2(1);
10452     l_msg_count            NUMBER ;
10453     l_msg_data             VARCHAR2(200);
10454 
10455     l_parent_itemtype      varchar2(8);
10456     l_parent_itemkey       varchar2(240);
10457     dummy varchar2(240);
10458 
10459     CURSOR c_header_route_wf (p_change_id NUMBER)
10460     IS
10461         SELECT ecr.wf_item_type parent_item_type
10462              , ecr.wf_item_key  parent_item_key
10463         FROM ENG_CHANGE_ROUTES ecr
10464            , ENG_ENGINEERING_CHANGES eec
10465            , WF_ITEMS wi
10466         WHERE wi.item_type = ecr.wf_item_type
10467         AND   wi.item_key  = ecr.wf_item_key
10468         AND   wi.end_date IS NULL
10469         AND   ecr.route_id  = eec.route_id
10470         AND   eec.change_id = p_change_id  ;
10471 
10472 
10473     l_debug             VARCHAR2(1)    := FND_API.G_FALSE ;
10474     l_output_dir        VARCHAR2(240)  := NULL ;
10475     l_debug_filename    VARCHAR2(200)  := 'ContinueHeaderRoute.log' ;
10476 
10477 
10478 
10479 BEGIN
10480 
10481 
10482 
10483 IF g_debug_flag THEN
10484    Write_Debug('Eng_Workflow_Util.ContinueHeaderRouteLog');
10485    Write_Debug('-----------------------------------------------------');
10486    Write_Debug('Item Type         : ' || p_item_type );
10487    Write_Debug('Item Key          : ' || p_item_key );
10488    Write_Debug('Acttivity Id      : ' || to_char(p_actid));
10489    Write_Debug('Waiting Activity  : ' || p_waiting_activity );
10490    Write_Debug('Waiting Flow Type : ' || p_waiting_flow_type);
10491    Write_Debug('-----------------------------------------------------');
10492 END IF ;
10493 
10494     --  Initialize API return status to success
10495     x_return_status := FND_API.G_RET_STS_SUCCESS;
10496 
10497 
10498   if  (p_waiting_flow_type = 'APPROVAL') then
10499 
10500     -- Get Change Object Identifier
10501     Eng_Workflow_Util.GetChangeObject
10502     (   p_item_type         => p_item_type
10503      ,  p_item_key          => p_item_key
10504      ,  x_change_id         => l_change_id
10505     ) ;
10506 
10507     --
10508     -- Get Header Route worklfow parent details
10509     --
10510     FOR l_header_wf_rec IN c_header_route_wf(p_change_id => l_change_id )
10511     LOOP
10512 
10513         l_parent_itemtype := l_header_wf_rec.parent_item_type ;
10514         l_parent_itemkey  := l_header_wf_rec.parent_item_key ;
10515 
10516 
10517 IF g_debug_flag THEN
10518    Write_Debug('Header Item Type         : ' || l_parent_itemtype );
10519    Write_Debug('Header Item Key          : ' || l_parent_itemkey);
10520 END IF ;
10521 
10522 
10523     END LOOP ;
10524 
10525     IF l_parent_itemtype IS NOT NULL AND l_parent_itemkey IS NOT NULL
10526     THEN
10527 
10528 IF g_debug_flag THEN
10529    Write_Debug('lock the parent item, so only one child can execute this at the time. ' );
10530 END IF ;
10531 
10532 
10533         -- lock the parent item, so only one child can execute this at the time.
10534         SELECT  item_key
10535         INTO    dummy
10536         FROM    wf_items
10537         WHERE   item_type = l_parent_itemtype
10538         AND     item_key  = l_parent_itemkey
10539         FOR UPDATE ;
10540 
10541         Eng_Workflow_Util.CheckAllLineApproved
10542         (  x_return_status        => x_return_status
10543         ,  x_msg_count            => x_msg_count
10544         ,  x_msg_data             => x_msg_data
10545         ,  p_change_id            => l_change_id
10546         ,  x_line_approval_status => l_line_approval_status
10547         ) ;
10548 
10549 
10550 IF g_debug_flag THEN
10551    Write_Debug('After calling CheckAllLineApproved, line appr status: ' || to_char(l_line_approval_status)  );
10552 END IF ;
10553 
10554         IF l_line_approval_status = Eng_Workflow_Util.G_APPROVED
10555         THEN
10556 
10557 
10558             begin
10559 
10560 IF g_debug_flag THEN
10561    Write_Debug('calling CompleteActivity . . . ');
10562 END IF ;
10563 
10564                wf_engine.CompleteActivity
10565                (  l_parent_itemtype
10566                 , l_parent_itemkey
10567                 , p_waiting_activity
10568                 , wf_engine.eng_null );
10569 
10570             exception
10571                when others then
10572                 --
10573                 -- If call to CompleteActivity cannot find activity, return null
10574                 -- and wait for master flow
10575                 --
10576                 if ( wf_core.error_name = 'WFENG_NOT_NOTIFIED' ) then
10577                     wf_core.clear;
10578                     x_resultout := wf_engine.eng_null;
10579 IF g_debug_flag THEN
10580    Write_Debug('call to CompleteActivity cannot find activity. . . ');
10581 END IF ;
10582                 else
10583                     raise;
10584                 end if;
10585             end;
10586 
10587         END IF ;
10588 
10589     END IF ; -- parent item type and key are not null
10590 
10591     x_resultout := wf_engine.eng_null;
10592     return ;
10593 
10594   else
10595   -- p_waiting_flow is not APPROVAL
10596     null ;
10597 
10598   end if ; -- p_waiting_flow condition
10599 
10600 
10601 END ContinueHeaderRoute ;
10602 
10603 
10604 PROCEDURE WaitForLineRoute
10605 (   x_return_status           OUT NOCOPY VARCHAR2
10606  ,  x_msg_count               OUT NOCOPY NUMBER
10607  ,  x_msg_data                OUT NOCOPY VARCHAR2
10608  ,  p_item_type               IN  VARCHAR2
10609  ,  p_item_key                IN  VARCHAR2
10610  ,  p_actid                   IN  NUMBER
10611  ,  p_continuation_activity   IN  VARCHAR2
10612  ,  p_continuation_flow_type  IN  VARCHAR2
10613  ,  x_resultout               IN OUT NOCOPY VARCHAR2
10614 )
10615 IS
10616 
10617     l_change_id            NUMBER ;
10618     l_line_approval_status NUMBER ;
10619 
10620     l_return_status       VARCHAR2(1);
10621     l_msg_count           NUMBER ;
10622     l_msg_data            VARCHAR2(200);
10623 
10624 BEGIN
10625 
10626 
10627     --  Initialize API return status to success
10628     x_return_status := FND_API.G_RET_STS_SUCCESS;
10629 
10630 
10631   if  (p_continuation_flow_type = 'APPROVAL') then
10632 
10633     -- Get Change Object Identifier
10634     Eng_Workflow_Util.GetChangeObject
10635     (   p_item_type         => p_item_type
10636      ,  p_item_key          => p_item_key
10637      ,  x_change_id         => l_change_id
10638     ) ;
10639 
10640     Eng_Workflow_Util.CheckAllLineApproved
10641     (  x_return_status     => x_return_status
10642     ,  x_msg_count         => x_msg_count
10643     ,  x_msg_data          => x_msg_data
10644     ,  p_change_id         => l_change_id
10645     ,  x_line_approval_status => l_line_approval_status
10646     ) ;
10647 
10648 
10649     IF l_line_approval_status <> Eng_Workflow_Util.G_APPROVED
10650     THEN
10651         x_resultout := wf_engine.eng_notified ||':'||
10652                        wf_engine.eng_null ||':'||
10653                        wf_engine.eng_null;
10654     ELSE
10655         x_resultout := wf_engine.eng_null;
10656     END IF ;
10657 
10658     return ;
10659 
10660   else
10661 
10662     null ;
10663 
10664   end if ;
10665 
10666 END WaitForLineRoute ;
10667 
10668 
10669 PROCEDURE  START_RESPONSE_FYI_PROCESS
10670 ( p_itemtype                IN  VARCHAR2
10671 , p_itemkey                 IN  VARCHAR2
10672 , p_orig_response_option    IN  VARCHAR2  := NULL  -- ALL or ONE
10673 , p_responded_ntf_id        IN  NUMBER
10674 , p_responded_comment_id    IN  NUMBER    := NULL
10675 , x_msg_count               OUT NOCOPY   NUMBER
10676 , x_msg_data                OUT NOCOPY   VARCHAR2
10677 , x_return_status           OUT NOCOPY   VARCHAR2
10678 )
10679 IS
10680     lUserId            NUMBER ;
10681 
10682     l_adhoc_party      VARCHAR2(30000);
10683     l_orig_adhoc_role  VARCHAR2(100) ;
10684 
10685     l_orig_user_id     NUMBER ;
10686     l_orig_party_id    NUMBER ;
10687     l_change_id        NUMBER ;
10688     l_item_key         NUMBER;
10689 
10690 
10691     CURSOR c_ntf_info (p_ntf_id NUMBER)
10692     IS
10693 
10694         SELECT UserV.user_id      user_id
10695         FROM   EGO_USER_V UserV
10696              , WF_NOTIFICATIONS wf
10697         WHERE  UserV.user_name = wf.recipient_role
10698         AND    wf.notification_id = p_ntf_id ;
10699 
10700 
10701     CURSOR c_person_id (p_user_id NUMBER)
10702     IS
10703         SELECT UserV.party_id  person_id
10704         FROM   EGO_USER_V UserV
10705         WHERE  UserV.user_id = p_user_id ;
10706 
10707 BEGIN
10708 
10709 
10710     FOR ntf_info_rec IN c_ntf_info (p_ntf_id => p_responded_ntf_id)
10711     LOOP
10712 
10713         lUserId  := ntf_info_rec.user_id ;
10714 
10715     END LOOP ;
10716 
10717 
10718     -- Get Original user_id and party_id who launched workflow
10719     l_orig_user_id := wf_engine.GetItemAttrNumber
10720                                       ( p_itemtype
10721                                       , p_itemkey
10722                                       , 'WF_USER_ID'
10723                                       );
10724 
10725 
10726     FOR l_rec IN c_person_id (l_orig_user_id)
10727     LOOP
10728 
10729         l_orig_party_id := l_rec.person_Id ;
10730 
10731     END LOOP ;
10732 
10733 
10734     Eng_Workflow_util.GetChangeObject( p_item_type  => p_itemtype
10735                                      , p_item_key   => p_itemKey
10736                                      , x_change_id  => l_change_Id
10737                                      );
10738 
10739 
10740     -- create and start Response FYI process to send Resp FYI ntf
10741     Eng_Workflow_Util.StartWorkflow
10742     (   p_api_version       =>       1.0
10743      ,  p_init_msg_list     =>       FND_API.G_FALSE
10744      ,  p_commit            =>       FND_API.G_FALSE
10745      ,  p_validation_level  =>       FND_API.G_VALID_LEVEL_FULL
10746      ,  x_return_status     =>       x_return_status
10747      ,  x_msg_count         =>       x_msg_count
10748      ,  x_msg_data          =>       x_msg_data
10749      ,  p_item_type         =>       G_CHANGE_ACTION_ITEM_TYPE
10750      ,  x_item_key          =>       l_item_key
10751      ,  p_process_name      =>       G_RESPONSE_FYI_PROC
10752      ,  p_change_id         =>       l_change_id
10753      ,  p_change_line_id    =>       0
10754      ,  p_wf_user_id        =>       lUserId
10755      ,  p_host_url          =>       NULL
10756      ,  p_action_id         =>       p_responded_comment_id
10757      ,  p_adhoc_party_list  =>       l_orig_party_id
10758      ,  p_route_id          =>       0
10759      ,  p_route_step_id     =>       0
10760      ,  p_parent_item_type  =>       p_itemtype
10761      ,  p_parent_item_key   =>       p_itemkey
10762      ,  p_debug             =>       FND_API.G_FALSE
10763      ,  p_output_dir        =>       NULL
10764      ,  p_debug_filename    =>       'Eng_ChangeWF_Start.log'
10765     ) ;
10766 
10767 
10768 END START_RESPONSE_FYI_PROCESS ;
10769 
10770 
10771 PROCEDURE  StartValidateDefProcess
10772 (   x_msg_count              OUT  NOCOPY  NUMBER
10773  ,  x_msg_data               OUT  NOCOPY  VARCHAR2
10774  ,  x_return_status          OUT  NOCOPY  VARCHAR2
10775  ,  x_val_def_item_key       OUT  NOCOPY  VARCHAR2
10776  ,  p_step_item_type         IN   VARCHAR2
10777  ,  p_step_item_key          IN   VARCHAR2
10778  ,  p_responded_ntf_id       IN   NUMBER
10779  ,  p_route_id               IN   NUMBER
10780  ,  p_route_step_id          IN   NUMBER
10781  ,  p_val_def_item_type      IN   VARCHAR2
10782  ,  p_val_def_process_name   IN   VARCHAR2
10783  ,  p_orig_response          IN   VARCHAR2  := NULL
10784  ,  p_host_url               IN   VARCHAR2  := NULL
10785 )
10786 IS
10787     PRAGMA  AUTONOMOUS_TRANSACTION;
10788 
10789     l_api_name          CONSTANT VARCHAR2(30) := 'StartValidateDefProcess';
10790 
10791     l_debug             VARCHAR2(1)    := FND_API.G_FALSE ;
10792     l_output_dir        VARCHAR2(240)  := NULL ;
10793     l_debug_filename    VARCHAR2(200)  := 'StartValidateDefProcess.log' ;
10794 
10795     l_resp_user_id     NUMBER ;
10796     l_adhoc_party      VARCHAR2(30000);
10797     l_orig_adhoc_role  VARCHAR2(100) ;
10798 
10799     l_orig_user_id     NUMBER ;
10800     l_orig_party_id    NUMBER ;
10801     l_change_id        NUMBER ;
10802     l_item_key         NUMBER;
10803 
10804     l_msg_count         NUMBER ;
10805     l_msg_data          VARCHAR2(2000) ;
10806     l_return_status     VARCHAR2(1) ;
10807 
10808     CURSOR c_ntf_info (p_ntf_id NUMBER)
10809     IS
10810 
10811         SELECT UserV.user_id      user_id
10812         FROM   EGO_USER_V UserV
10813              , WF_NOTIFICATIONS wf
10814         WHERE  UserV.user_name = wf.recipient_role
10815         AND    wf.notification_id = p_ntf_id ;
10816 
10817 
10818      CURSOR c_person_id (p_user_id NUMBER)
10819      IS
10820         SELECT UserV.party_id person_id
10821         FROM   EGO_USER_V UserV
10822         WHERE  UserV.user_id = p_user_id ;
10823 
10824 BEGIN
10825 
10826    x_return_status :=  FND_API.G_RET_STS_SUCCESS ;
10827 
10828 
10829 IF g_debug_flag THEN
10830    Write_Debug('Eng_Workflow_Util.StartValidateDefProcess Log');
10831    Write_Debug('-----------------------------------------------------');
10832    Write_Debug('Step Item Type   : ' || p_step_item_type );
10833    Write_Debug('Step Item Key    : ' || p_step_item_key );
10834    Write_Debug('Route Id         : ' || TO_CHAR(p_route_id) );
10835    Write_Debug('Step Id          : ' || TO_CHAR(p_route_step_id) );
10836    Write_Debug('Responded Ntf Id : ' || TO_CHAR(p_responded_ntf_id) );
10837    Write_Debug('-----------------------------------------------------');
10838 END IF ;
10839 
10840     FOR ntf_info_rec IN c_ntf_info (p_ntf_id => p_responded_ntf_id)
10841     LOOP
10842         l_resp_user_id := ntf_info_rec.user_id ;
10843     END LOOP ;
10844 
10845     BEGIN
10846         l_return_status :=  FND_API.G_RET_STS_SUCCESS ;
10847 
10848         --  FND_MSG_PUB.initialize ;
10849         Eng_Workflow_Util.StartWorkflow
10850         (  p_api_version       => 1.0
10851         ,  p_init_msg_list     => FND_API.G_FALSE
10852         ,  p_commit            => FND_API.G_FALSE
10853         ,  p_validation_level  => FND_API.G_VALID_LEVEL_FULL
10854         ,  x_return_status     => l_return_status
10855         ,  x_msg_count         => l_msg_count
10856         ,  x_msg_data          => l_msg_data
10857         ,  p_item_type         => p_val_def_item_type
10858         ,  x_item_key          => x_val_def_item_key
10859         ,  p_process_name      => p_val_def_process_name
10860         ,  p_wf_user_id        => l_resp_user_id
10861         ,  p_host_url          => p_host_url
10862         ,  p_route_id          => p_route_id
10863         ,  p_route_step_id     => p_route_step_id
10864         ,  p_adhoc_party_list  => l_resp_user_id
10865         ,  p_parent_item_type  => p_step_item_type
10866         ,  p_parent_item_key   => p_step_item_key
10867         ,  p_debug             => l_debug
10868         ,  p_output_dir        => l_output_dir
10869         ,  p_debug_filename    => l_debug_filename
10870         ) ;
10871 
10872 
10873 IF g_debug_flag THEN
10874    Write_Debug('After call Eng_Workflow_Util.StartWorkflow' ) ;
10875    Write_Debug('Return Status: '     || l_return_status ) ;
10876    Write_Debug('Return Message: '    || l_msg_data ) ;
10877    Write_Debug('Started Val Def WF Item Type: ' || p_val_def_item_type ) ;
10878    Write_Debug('Started Val Def WF Item Kye: ' || x_val_def_item_key ) ;
10879    Write_Debug('Started Val Def WF Process Name: ' || p_val_def_process_name ) ;
10880 END IF ;
10881 
10882 
10883         IF l_return_status =  FND_API.G_RET_STS_SUCCESS
10884         THEN
10885 
10886             COMMIT ;
10887 
10888         ELSE
10889 
10890             ROLLBACK ;
10891 
10892         END IF ;
10893 
10894     EXCEPTION
10895        WHEN OTHERS THEN
10896          -- Since the Def Validation Process is kind of
10897          -- just place folder for customization, we will not handle
10898          -- any exception here
10899          NULL ;
10900 
10901     END ;
10902 
10903 
10904 EXCEPTION
10905     WHEN OTHERS THEN
10906 
10907     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
10908 
10909     IF  FND_MSG_PUB.Check_Msg_Level
10910       (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
10911     THEN
10912             FND_MSG_PUB.Add_Exc_Msg
10913             ( G_PKG_NAME
10914             , l_api_name
10915             );
10916     END IF;
10917 
10918 END StartValidateDefProcess ;
10919 
10920 
10921 
10922 FUNCTION ConvertRouteStatusToActionType
10923 ( p_route_status_code IN   VARCHAR2
10924 , p_convert_type      IN   VARCHAR2 := 'RESPONSE' -- 'RESPONSE' or 'WF_PROCESS'
10925 )
10926 RETURN VARCHAR2
10927 IS
10928 
10929     l_action_type VARCHAR2(30) ;
10930 
10931 
10932 BEGIN
10933 
10934     IF  p_convert_type = 'RESPONSE' THEN
10935 
10936         -- Convert Route Status to Action Type for User Response in Route
10937         IF p_route_status_code = Eng_Workflow_Util.G_RT_APPROVED
10938         THEN
10939 
10940             l_action_type := Eng_Workflow_Util.G_ACT_APPROVED ;
10941 
10942         ELSIF p_route_status_code = Eng_Workflow_Util.G_RT_REJECTED
10943         THEN
10944 
10945             l_action_type := Eng_Workflow_Util.G_ACT_REJECTED ;
10946 
10947         ELSIF  p_route_status_code = Eng_Workflow_Util.G_RT_COMPLETED
10948         THEN
10949 
10950             l_action_type := Eng_Workflow_Util.G_ACT_COMPLETED ;
10951 
10952         ELSIF  p_route_status_code = Eng_Workflow_Util.G_RT_REPLIED
10953         THEN
10954 
10955             l_action_type := Eng_Workflow_Util.G_ACT_REPLIED;
10956 
10957 
10958         ELSIF  p_route_status_code = Eng_Workflow_Util.G_RT_TIME_OUT
10959         THEN
10960 
10961             l_action_type := Eng_Workflow_Util.G_ACT_TIMEOUT_WF;
10962 
10963         ELSIF  p_route_status_code = Eng_Workflow_Util.G_RT_FORWARDED
10964         THEN
10965 
10966             l_action_type := Eng_Workflow_Util.G_ACT_DELEGATED;
10967 
10968         ELSIF  p_route_status_code = Eng_Workflow_Util.G_RT_TRANSFERRED
10969         THEN
10970 
10971             l_action_type := Eng_Workflow_Util.G_ACT_TRANSFERRED;
10972 
10973 
10974         -- R12B
10975         -- Added for Line Workflow Request Response
10976         ELSIF  p_route_status_code = Eng_Workflow_Util.G_RT_RECEIVED
10977         THEN
10978 
10979             l_action_type := Eng_Workflow_Util.G_ACT_RECEIVED;
10980 
10981         ELSIF  p_route_status_code = Eng_Workflow_Util.G_RT_DECLINED
10982         THEN
10983 
10984             l_action_type := Eng_Workflow_Util.G_ACT_DECLINED;
10985 
10986 
10987         ELSE
10988 
10989             l_action_type := Eng_Workflow_Util.G_ACT_COMPLETED ;
10990         END IF ;
10991 
10992     ELSIF p_convert_type = 'WF_PROCESS' THEN
10993         -- Convert Route Status to Action Type for Workflow Process Status
10994 
10995         IF p_route_status_code = Eng_Workflow_Util.G_RT_IN_PROGRESS
10996         THEN
10997 
10998             l_action_type := Eng_Workflow_Util.G_ACT_WF_STARTED;
10999 
11000         ELSIF p_route_status_code = Eng_Workflow_Util.G_RT_APPROVED
11001         THEN
11002 
11003             l_action_type := Eng_Workflow_Util.G_ACT_WF_APPROVED ;
11004 
11005 
11006         ELSIF p_route_status_code = Eng_Workflow_Util.G_RT_REJECTED
11007         THEN
11008 
11009             l_action_type := Eng_Workflow_Util.G_ACT_WF_REJECTED;
11010 
11011         ELSIF  p_route_status_code = Eng_Workflow_Util.G_RT_COMPLETED
11012         THEN
11013 
11014             l_action_type := Eng_Workflow_Util.G_ACT_WF_COMPLETED;
11015 
11016         ELSIF  p_route_status_code = Eng_Workflow_Util.G_RT_ABORTED
11017         THEN
11018 
11019             l_action_type := Eng_Workflow_Util.G_ACT_WF_ABORTED;
11020 
11021 
11022         ELSIF  p_route_status_code = Eng_Workflow_Util.G_RT_TIME_OUT
11023         THEN
11024 
11025             l_action_type := Eng_Workflow_Util.G_ACT_WF_TIME_OUT;
11026 
11027         ELSIF  p_route_status_code = Eng_Workflow_Util.G_RT_ERROR -- Not Stupported yet
11028         THEN
11029 
11030             l_action_type := Eng_Workflow_Util.G_ACT_WF_PROCESS_ERROR ;
11031 
11032         ELSE
11033 
11034             l_action_type := Eng_Workflow_Util.G_ACT_WF_COMPLETED ;
11035 
11036         END IF ;
11037 
11038     END IF ;
11039 
11040     RETURN l_action_type ;
11041 
11042 END ConvertRouteStatusToActionType ;
11043 
11044 
11045 
11046 FUNCTION ConvNtfWFStatToDistLNStat
11047 ( p_route_status_code IN   VARCHAR2
11048 , p_convert_type      IN   VARCHAR2 := NULL -- Future use, 'WF_PROCESS'
11049 )
11050 RETURN VARCHAR2
11051 IS
11052 
11053     l_dist_line_status_code VARCHAR2(30) ;
11054 
11055 BEGIN
11056 
11057     -- Convert Notification Line Route Status to Distribution Line Status
11058     IF p_route_status_code = Eng_Workflow_Util.G_RT_IN_PROGRESS
11059     THEN
11060 
11061         l_dist_line_status_code := Eng_Workflow_Util.G_DIST_CL_DIST_IN_PROGRESS;
11062 
11063     ELSIF p_route_status_code = Eng_Workflow_Util.G_RT_APPROVED
11064     THEN
11065 
11066         l_dist_line_status_code := Eng_Workflow_Util.G_DIST_CL_DISTRIBUTED ;
11067 
11068 
11069     ELSIF p_route_status_code = Eng_Workflow_Util.G_RT_REJECTED
11070     THEN
11071 
11072         l_dist_line_status_code := Eng_Workflow_Util.G_DIST_CL_NOT_DISTRIBUTED;
11073 
11074     ELSIF  p_route_status_code = Eng_Workflow_Util.G_RT_COMPLETED
11075     THEN
11076 
11077         l_dist_line_status_code := Eng_Workflow_Util.G_DIST_CL_DISTRIBUTED;
11078 
11079     ELSIF  p_route_status_code = Eng_Workflow_Util.G_RT_ABORTED
11080     THEN
11081 
11082         l_dist_line_status_code := Eng_Workflow_Util.G_DIST_CL_NOT_DISTRIBUTED;
11083 
11084 
11085     ELSIF  p_route_status_code = Eng_Workflow_Util.G_RT_TIME_OUT
11086     THEN
11087 
11088         l_dist_line_status_code := Eng_Workflow_Util.G_DIST_CL_NOT_DISTRIBUTED;
11089 
11090     ELSIF  p_route_status_code = Eng_Workflow_Util.G_RT_ERROR -- Not Stupported yet
11091     THEN
11092 
11093         l_dist_line_status_code := Eng_Workflow_Util.G_ACT_WF_PROCESS_ERROR ;
11094 
11095     ELSE
11096 
11097         l_dist_line_status_code := Eng_Workflow_Util.G_DIST_CL_NOT_DISTRIBUTED ;
11098 
11099     END IF ;
11100 
11101     RETURN l_dist_line_status_code ;
11102 
11103 
11104 END ConvNtfWFStatToDistLNStat ;
11105 
11106 
11107 
11108 PROCEDURE RespondToActReqCommentFromUI
11109 (   x_return_status     OUT  NOCOPY VARCHAR2
11110  ,  x_msg_count         OUT  NOCOPY NUMBER
11111  ,  x_msg_data          OUT  NOCOPY VARCHAR2
11112  ,  x_processed_ntf_id  OUT  NOCOPY NUMBER
11113  ,  p_item_type         IN   VARCHAR2
11114  ,  p_item_key          IN   VARCHAR2
11115  ,  p_responder         IN   VARCHAR2
11116  ,  p_response_comment  IN   VARCHAR2  := NULL
11117  ,  p_action_source     IN   VARCHAR2  := NULL
11118 )
11119 IS
11120 
11121     l_api_name          CONSTANT VARCHAR2(30) := 'RespondToActReqCommentFromUI';
11122 
11123     CURSOR c_ntf_info (p_item_type  VARCHAR2
11124                      , p_item_key   VARCHAR2
11125                      , p_responder  VARCHAR2)
11126     IS
11127 
11128         SELECT ntf.NOTIFICATION_ID,
11129                ntf.RECIPIENT_ROLE,
11130                ntf.MESSAGE_NAME,
11131                ntf.message_type
11132         FROM   WF_ITEM_ACTIVITY_STATUSES wias,
11133                WF_NOTIFICATIONS  ntf
11134         WHERE ntf.STATUS = 'OPEN'
11135         AND   wias.NOTIFICATION_ID = ntf.group_id
11136         AND   wias.NOTIFICATION_ID IS NOT NULL
11137         AND (wias.ACTIVITY_STATUS = 'NOTIFIED' OR wias.ACTIVITY_STATUS = 'ERROR')
11138         AND wias.ITEM_TYPE = p_item_type
11139         AND wias.ITEM_KEY = p_item_key
11140         AND ntf.RECIPIENT_ROLE = p_responder
11141         AND EXISTS  (SELECT 1
11142                      FROM WF_NOTIFICATION_ATTRIBUTES na,
11143                           WF_MESSAGE_ATTRIBUTES ma
11144                      WHERE na.NOTIFICATION_ID = ntf.NOTIFICATION_ID
11145                      AND   ma.MESSAGE_NAME = ntf.MESSAGE_NAME
11146                      AND   ma.MESSAGE_TYPE = ntf.MESSAGE_TYPE
11147                      AND   ma.NAME = na.NAME
11148                      AND   ma.SUBTYPE = 'RESPOND') ;
11149 
11150 
11151 BEGIN
11152 
11153     --  Initialize API return status to success
11154     x_return_status := FND_API.G_RET_STS_SUCCESS;
11155 
11156 IF g_debug_flag THEN
11157    Write_Debug('Eng_Workflow_Util.RespondToActReqCommentFromUI Log');
11158    Write_Debug('-----------------------------------------------------');
11159    Write_Debug('Item Type   : ' || p_item_type );
11160    Write_Debug('Item Key    : ' || p_item_key );
11161    Write_Debug('Responder         : ' || p_responder );
11162    Write_Debug('Response Comment  : ' || p_response_comment );
11163    Write_Debug('-----------------------------------------------------');
11164 END IF ;
11165 
11166     -- Init processed_ntf_id
11167     x_processed_ntf_id := 0 ;
11168 
11169     -- Get the corresponding ntf Id for this workflow and responder
11170     -- At this time, we are not checking message name and message
11171     -- type cause cutomer may create a cutom message
11172     -- If customer customizes action request comment workflow process
11173     -- there is small chance this logic does not work
11174     FOR ntf_info_rec IN c_ntf_info (p_item_type => p_item_type
11175                                   , p_item_key   => p_item_key
11176                                   , p_responder  => p_responder)
11177     LOOP
11178         x_processed_ntf_id := ntf_info_rec.NOTIFICATION_ID ;
11179     END LOOP ;
11180 
11181 IF g_debug_flag THEN
11182    Write_Debug('Notification Id  : ' || TO_CHAR(x_processed_ntf_id));
11183 END IF ;
11184 
11185 
11186 IF g_debug_flag THEN
11187    Write_Debug('Calling WF_NOTIFICATION.SetAttrText for RESULT' );
11188 END IF ;
11189 
11190 
11191     IF x_processed_ntf_id IS NOT NULL AND  x_processed_ntf_id > 0
11192     THEN
11193         WF_NOTIFICATION.SetAttrText
11194                              ( nid    => x_processed_ntf_id
11195                              , aname  => 'RESULT'
11196                              , avalue => G_REPLY
11197                              );
11198 
11199 IF g_debug_flag THEN
11200    Write_Debug('Calling WF_NOTIFICATION.SetAttrText for WF_NOTE' );
11201 END IF ;
11202 
11203         WF_NOTIFICATION.SetAttrText
11204                            ( nid   => x_processed_ntf_id
11205                            , aname => 'WF_NOTE'
11206                            , avalue=> p_response_comment) ;
11207 
11208 IF g_debug_flag THEN
11209     Write_Debug('Calling WF_NOTIFICATION.RESPOND' );
11210 END IF ;
11211 
11212         WF_NOTIFICATION.RESPOND
11213         ( nid => x_processed_ntf_id -- nid in number
11214         , responder => p_responder  -- responder in varchar2 default null
11215         ) ;
11216 
11217     END IF ;
11218 
11219 
11220 EXCEPTION
11221    WHEN OTHERS THEN
11222 
11223    x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
11224 
11225    IF  FND_MSG_PUB.Check_Msg_Level
11226       (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
11227    THEN
11228             FND_MSG_PUB.Add_Exc_Msg
11229             ( G_PKG_NAME
11230             , l_api_name
11231             );
11232    END IF;
11233 
11234 
11235 END RespondToActReqCommentFromUI ;
11236 
11237 
11238 
11239 --
11240 --  Bug5136260
11241 --  API name   : SetChangeOrderMRPFlag
11242 --  Type       : Private
11243 --  Pre-reqs   : None.
11244 --  Function   : Set Change Order's Revised Item MFP Flag to then given mrp_flag
11245 --               if a revised item is in Status=Draft, Open,Approval, Scheduled, Released
11246 --  Parameters :p_change_id               IN  NUMBER    Change Id
11247 --              p_mrp_flag                IN  NUMBER    1: Yes G_MRP_FLAG_YES
11248 --                                                      2: No  G_MRP_FLAG_NO
11249 --              p_api_caller              IN  VARCHAR2 := NULL -- or G_WF_CALL:'WF'
11250 --              x_msg_count               OUT NUMBER
11251 --              x_msg_data                OUT VARCHAR2
11252 --              x_return_status           OUT VARCHAR2
11253 --
11254 PROCEDURE SetChangeOrderMRPFlag
11255 (   x_return_status     OUT NOCOPY VARCHAR2
11256  ,  x_msg_count         OUT NOCOPY NUMBER
11257  ,  x_msg_data          OUT NOCOPY VARCHAR2
11258  ,  p_change_id         IN  NUMBER
11259  ,  p_mrp_flag          IN  NUMBER
11260  ,  p_wf_user_id        IN  NUMBER   := NULL
11261  ,  p_api_caller        IN  VARCHAR2 := NULL -- or G_WF_CALL:'WF'
11262 )
11263 IS
11264 
11265     l_api_name          CONSTANT VARCHAR2(30) := 'SetChangeOrderMRPFlag';
11266 
11267     l_fnd_user_id       NUMBER ;
11268     l_fnd_login_id      NUMBER ;
11269     l_base_cm_type_code VARCHAR2(30) ;
11270 
11271 BEGIN
11272 
11273 
11274     --  Initialize API return status to success
11275     x_return_status := FND_API.G_RET_STS_SUCCESS;
11276 
11277 IF g_debug_flag THEN
11278    Write_Debug('Eng_Workflow_Util.SetChangeOrderMRPFlag Log');
11279    Write_Debug('-----------------------------------------------------');
11280    Write_Debug('Change Id    : ' || to_char(p_change_id) );
11281    Write_Debug('MFP Flag     : ' || to_char(p_change_id) );
11282    Write_Debug('WF User Id   : ' || to_char(p_wf_user_id) );
11283    Write_Debug('API Caller   : ' || p_api_caller );
11284    Write_Debug('-----------------------------------------------------');
11285 END IF ;
11286 
11287 
11288     -- Check if this Change Object is Chagne Order by base cm type code
11289     l_base_cm_type_code := GetBaseChangeMgmtTypeCode(p_change_id) ;
11290 
11291     IF  l_base_cm_type_code =  'CHANGE_ORDER'
11292     THEN
11293 
11294 IF g_debug_flag THEN
11295    Write_Debug('Change Object is Change Order');
11296 END IF ;
11297 
11298         l_fnd_user_id       := TO_NUMBER(FND_PROFILE.VALUE('USER_ID'));
11299         l_fnd_login_id      := TO_NUMBER(FND_PROFILE.VALUE('LOGIN_ID'));
11300 
11301         -- FND_PROFILE package is not available for workflow (WF),
11302         -- therefore manually set WHO column values
11303         IF p_api_caller = 'WF'
11304         THEN
11305           l_fnd_user_id := p_wf_user_id ;
11306           l_fnd_login_id := '' ;
11307         END IF;
11308 
11309         -- Put dummy fnd user id if it's still null
11310         IF l_fnd_user_id IS NULL
11311         THEN
11312            l_fnd_user_id := -10000;
11313         END IF ;
11314 
11315         UPDATE eng_revised_items
11316         SET mrp_active = p_mrp_flag
11317          , last_update_date = SYSDATE
11318          , last_updated_by = l_fnd_user_id
11319          , last_update_login = l_fnd_login_id
11320         WHERE change_id = p_change_id
11321         AND status_type in (0, 1, 4, 7, 8) ;
11322 
11323 IF g_debug_flag THEN
11324    Write_Debug('After updating mrp flag in revised teims');
11325 END IF ;
11326 
11327     END IF ; -- Base CM Code is Change Order
11328 
11329 
11330 EXCEPTION
11331    WHEN OTHERS THEN
11332 
11333    x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
11334 
11335    IF  FND_MSG_PUB.Check_Msg_Level
11336       (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
11337    THEN
11338             FND_MSG_PUB.Add_Exc_Msg
11339             ( G_PKG_NAME
11340             , l_api_name
11341             );
11342    END IF;
11343 
11344 
11345 END SetChangeOrderMRPFlag ;
11346 
11347 
11348 /********************************************************************
11349 * API Type      : Public APIs
11350 * Purpose       : Those APIs are public
11351 *********************************************************************/
11352 PROCEDURE GetWorkflowMonitorURL
11353 (   p_api_version       IN  NUMBER
11354  ,  p_init_msg_list     IN  VARCHAR2 := FND_API.G_FALSE
11355  ,  p_commit            IN  VARCHAR2 := FND_API.G_FALSE
11356  ,  p_validation_level  IN  NUMBER   := FND_API.G_VALID_LEVEL_FULL
11357  ,  x_return_status     OUT NOCOPY VARCHAR2
11358  ,  x_msg_count         OUT NOCOPY NUMBER
11359  ,  x_msg_data          OUT NOCOPY VARCHAR2
11360  ,  p_item_type         IN  VARCHAR2
11361  ,  p_item_key          IN  VARCHAR2
11362  ,  p_url_type          IN  VARCHAR2 := Eng_Workflow_Util.G_MONITOR_DIAGRAM
11363  ,  p_admin_mode        IN  VARCHAR2 := FND_API.G_FALSE
11364  ,  p_option            IN  VARCHAR2 := NULL
11365  ,  x_url               OUT NOCOPY VARCHAR2
11366 )
11367 IS
11368 
11369    l_api_name         CONSTANT VARCHAR2(30) := 'GetWorkflowMonitorURL';
11370    l_api_version      CONSTANT NUMBER       := 1.0;
11371    l_YES              CONSTANT VARCHAR2(3)  := 'YES';
11372    l_NO               CONSTANT VARCHAR2(3)  := 'NO';
11373    l_admin_mode                VARCHAR2(3) ;
11374    l_apps_web_agent            VARCHAR2(240) ;
11375    l_wf_web_agent              VARCHAR2(2000) ;
11376 
11377 BEGIN
11378    -- Standard Start of API savepoint
11379    -- No Need to set SAVEPOINT for this API
11380    -- SAVEPOINT GetWorkflowMonitorURL_Util ;
11381 
11382    -- Standard call to check for call compatibility.
11383    IF NOT FND_API.Compatible_API_Call(  l_api_version
11384                                       , p_api_version
11385                                       , l_api_name
11386                                       , G_PKG_NAME )
11387    THEN
11388        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
11389    END IF;
11390 
11391 
11392    -- Initialize message list if p_init_msg_list is set to TRUE.
11393    IF FND_API.to_Boolean( p_init_msg_list ) THEN
11394       FND_MSG_PUB.initialize;
11395    END IF ;
11396 
11397    --  Initialize API return status to success
11398    x_return_status := FND_API.G_RET_STS_SUCCESS;
11399 
11400 
11401    -- API body
11402 
11403    -- Get Admin Mode.
11404    IF FND_API.to_Boolean( p_admin_mode ) THEN
11405       l_admin_mode := l_YES ;
11406    ELSE
11407       l_admin_mode := l_NO ;
11408    END IF ;
11409 
11410    -- Get Web Agent
11411    l_apps_web_agent  := fnd_web_config.plsql_agent(help_mode => 'APPS')  ;
11412    l_wf_web_agent    := WF_CORE.Translate('WF_WEB_AGENT') ;
11413 
11414 
11415 
11416    IF p_url_type = Eng_Workflow_Util.G_MONITOR_ACCESSKEY
11417    THEN
11418 
11419       x_url := WF_MONITOR.GetAccessKey
11420                           (  x_item_type  => p_item_type
11421                            , x_item_key   => p_item_key
11422                            , x_admin_mode => l_admin_mode ) ;
11423 
11424    ELSIF p_url_type = Eng_Workflow_Util.G_MONITOR_DIAGRAM
11425    THEN
11426 
11427       x_url := WF_MONITOR.GetDiagramURL
11428                           (  x_agent      => l_apps_web_agent
11429                            , x_item_type  => p_item_type
11430                            , x_item_key   => p_item_key
11431                            , x_admin_mode => l_admin_mode ) ;
11432 
11433    ELSIF p_url_type = Eng_Workflow_Util.G_MONITOR_ENVELOPE
11434    THEN
11435 
11436       x_url := WF_MONITOR.GetEnvelopeURL
11437                           (  x_agent      => l_apps_web_agent
11438                            , x_item_type  => p_item_type
11439                            , x_item_key   => p_item_key
11440                            , x_admin_mode => l_admin_mode ) ;
11441 
11442 
11443    ELSIF p_url_type = Eng_Workflow_Util.G_MONITOR_ADVANCED_ENVELOPE
11444    THEN
11445 
11446       x_url := WF_MONITOR.GetAdvancedEnvelopeURL
11447                           (  x_agent      => l_apps_web_agent
11448                            , x_item_type  => p_item_type
11449                            , x_item_key   => p_item_key
11450                            , x_admin_mode => l_admin_mode
11451                            , x_options    => p_option ) ;
11452 
11453 
11454    END IF ;
11455 
11456 
11457    -- Standard check of p_commit.
11458    -- IF FND_API.To_Boolean( p_commit ) THEN
11459    --  COMMIT WORK;
11460    -- END IF;
11461 
11462    -- Standard call to get message count and if count is 1, get message info.
11463    FND_MSG_PUB.Count_And_Get
11464       (  p_count  => x_msg_count
11465       ,  p_data   => x_msg_data
11466       );
11467 
11468 EXCEPTION
11469    WHEN FND_API.G_EXC_ERROR THEN
11470        -- ROLLBACK TO GetWorkflowMonitorURL_Util ;
11471        x_return_status := FND_API.G_RET_STS_ERROR ;
11472 
11473        FND_MSG_PUB.Count_And_Get
11474         (   p_count  =>      x_msg_count
11475          ,  p_data   =>      x_msg_data
11476         );
11477 
11478    WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
11479        -- ROLLBACK TO GetWorkflowMonitorURL_Util ;
11480        x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
11481 
11482        FND_MSG_PUB.Count_And_Get
11483         (   p_count  =>      x_msg_count
11484          ,  p_data   =>      x_msg_data
11485         );
11486 
11487    WHEN OTHERS THEN
11488        -- ROLLBACK TO GetWorkflowMonitorURL_Util ;
11489        x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
11490 
11491        FND_MSG_PUB.Count_And_Get
11492         (   p_count  =>      x_msg_count
11493          ,  p_data   =>      x_msg_data
11494         );
11495 
11496        IF  FND_MSG_PUB.Check_Msg_Level
11497           (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
11498        THEN
11499             FND_MSG_PUB.Add_Exc_Msg
11500               ( G_PKG_NAME
11501               , l_api_name
11502               );
11503        END IF;
11504 
11505        FND_MSG_PUB.Count_And_Get
11506         (   p_count  =>      x_msg_count
11507          ,  p_data   =>      x_msg_data
11508         );
11509 
11510 END GetWorkflowMonitorURL ;
11511 
11512 
11513 
11514 PROCEDURE StartWorkflow
11515 (   p_api_version       IN  NUMBER
11516  ,  p_init_msg_list     IN  VARCHAR2 := FND_API.G_FALSE
11517  ,  p_commit            IN  VARCHAR2 := FND_API.G_FALSE
11518  ,  p_validation_level  IN  NUMBER   := FND_API.G_VALID_LEVEL_FULL
11519  ,  x_return_status     OUT NOCOPY VARCHAR2
11520  ,  x_msg_count         OUT NOCOPY NUMBER
11521  ,  x_msg_data          OUT NOCOPY VARCHAR2
11522  ,  p_item_type         IN  VARCHAR2
11523  ,  x_item_key          IN OUT NOCOPY VARCHAR2
11524  ,  p_process_name      IN  VARCHAR2
11525  ,  p_change_id         IN  NUMBER    := NULL
11526  ,  p_change_line_id    IN  NUMBER    := NULL
11527  ,  p_wf_user_id        IN  NUMBER
11528  ,  p_host_url          IN  VARCHAR2  := NULL
11529  ,  p_action_id         IN  NUMBER    := NULL
11530  ,  p_adhoc_party_list  IN  VARCHAR2  := NULL
11531  ,  p_route_id          IN  NUMBER    := NULL
11532  ,  p_route_step_id     IN  NUMBER    := NULL
11533  ,  p_parent_item_type  IN  VARCHAR2  := NULL
11534  ,  p_parent_item_key   IN  VARCHAR2  := NULL
11535  ,  p_debug             IN  VARCHAR2  := FND_API.G_FALSE
11536  ,  p_output_dir        IN  VARCHAR2  := NULL
11537  ,  p_debug_filename    IN  VARCHAR2  := 'Eng_ChangeWF_Start.log'
11538 )
11539 IS
11540 
11541    l_object_name        VARCHAR2(30) ;
11542    l_object_id1         NUMBER ;
11543    l_parent_object_name VARCHAR2(30) ;
11544    l_parent_object_id1  NUMBER ;
11545 
11546 BEGIN
11547 
11548 
11549    IF p_change_line_id IS NOT NULL AND p_change_line_id > 0
11550    THEN
11551        l_object_name :=  G_ENG_CHANGE_LINE ;
11552        l_object_id1  := p_change_line_id ;
11553        l_parent_object_name := G_ENG_CHANGE ;
11554 
11555        IF p_change_id IS NOT NULL AND p_change_id > 0
11556        THEN
11557 
11558           l_parent_object_id1 := p_change_id ;
11559 
11560        ELSE
11561           l_parent_object_id1 := GetParentChangeId(p_change_line_id => p_change_line_id);
11562        END IF ;
11563 
11564    ELSE
11565 
11566        l_object_name :=  G_ENG_CHANGE ;
11567        l_object_id1 := p_change_id ;
11568 
11569    END IF ;
11570 
11571 
11572    StartWorkflow
11573    (   p_api_version        => p_api_version
11574     ,  p_init_msg_list      => p_init_msg_list
11575     ,  p_commit             => p_commit
11576     ,  p_validation_level   => p_validation_level
11577     ,  x_return_status      => x_return_status
11578     ,  x_msg_count          => x_msg_count
11579     ,  x_msg_data           => x_msg_data
11580     ,  p_item_type          => p_item_type
11581     ,  x_item_key           => x_item_key
11582     ,  p_process_name       => p_process_name
11583     ,  p_object_name        => l_object_name
11584     ,  p_object_id1         => l_object_id1
11585     ,  p_object_id2         => NULL
11586     ,  p_object_id3         => NULL
11587     ,  p_object_id4         => NULL
11588     ,  p_object_id5         => NULL
11589     ,  p_parent_object_name => l_parent_object_name
11590     ,  p_parent_object_id1  => l_parent_object_id1
11591     ,  p_wf_user_id         => p_wf_user_id
11592     ,  p_host_url           => p_host_url
11593     ,  p_action_id          => p_action_id
11594     ,  p_adhoc_party_list   => p_adhoc_party_list
11595     ,  p_route_id           => p_route_id
11596     ,  p_route_step_id      => p_route_step_id
11597     ,  p_parent_item_type   => p_parent_item_type
11598     ,  p_parent_item_key    => p_parent_item_key
11599     ,  p_debug              => p_debug
11600     ,  p_output_dir         => p_output_dir
11601     ,  p_debug_filename     => p_debug_filename
11602    ) ;
11603 
11604 
11605 END StartWorkflow ;
11606 
11607 
11608 PROCEDURE StartWorkflow
11609 (   p_api_version        IN  NUMBER
11610  ,  p_init_msg_list      IN  VARCHAR2 := FND_API.G_FALSE
11611  ,  p_commit             IN  VARCHAR2 := FND_API.G_FALSE
11612  ,  p_validation_level   IN  NUMBER   := FND_API.G_VALID_LEVEL_FULL
11613  ,  x_return_status      OUT NOCOPY VARCHAR2
11614  ,  x_msg_count          OUT NOCOPY NUMBER
11615  ,  x_msg_data           OUT NOCOPY VARCHAR2
11616  ,  p_item_type          IN  VARCHAR2
11617  ,  x_item_key           IN OUT NOCOPY VARCHAR2
11618  ,  p_process_name       IN  VARCHAR2
11619  ,  p_object_name        IN  VARCHAR2
11620  ,  p_object_id1         IN  NUMBER
11621  ,  p_object_id2         IN  NUMBER    := NULL
11622  ,  p_object_id3         IN  NUMBER    := NULL
11623  ,  p_object_id4         IN  NUMBER    := NULL
11624  ,  p_object_id5         IN  NUMBER    := NULL
11625  ,  p_parent_object_name IN  VARCHAR2  := NULL
11626  ,  p_parent_object_id1  IN  NUMBER    := NULL
11627  ,  p_wf_user_id         IN  NUMBER
11628  ,  p_host_url           IN  VARCHAR2  := NULL
11629  ,  p_action_id          IN  NUMBER    := NULL
11630  ,  p_adhoc_party_list   IN  VARCHAR2  := NULL
11631  ,  p_route_id           IN  NUMBER    := NULL
11632  ,  p_route_step_id      IN  NUMBER    := NULL
11633  ,  p_parent_item_type   IN  VARCHAR2  := NULL
11634  ,  p_parent_item_key    IN  VARCHAR2  := NULL
11635  ,  p_debug              IN  VARCHAR2  := FND_API.G_FALSE
11636  ,  p_output_dir         IN  VARCHAR2  := NULL
11637  ,  p_debug_filename     IN  VARCHAR2  := 'Eng_ChangeWF_Start.log'
11638 )
11639 IS
11640 
11641    l_api_name         CONSTANT VARCHAR2(30) := 'StartWorkflow';
11642    l_api_version      CONSTANT NUMBER       := 1.0;
11643 
11644    l_wf_user_role     VARCHAR2(320) ;
11645    l_wf_user_key      VARCHAR2(240) ;
11646 
11647    l_change_id        NUMBER ;
11648    l_change_line_id   NUMBER ;
11649 
11650    l_action_id        NUMBER ;
11651    l_action_type      VARCHAR2(30) ;
11652    l_api_caller       VARCHAR2(30) ;
11653 
11654 
11655    -- R12B for Grants
11656    l_return_status    VARCHAR2(1);
11657    l_msg_count        NUMBER;
11658    l_msg_data         VARCHAR2(3000);
11659 
11660    l_target_obj_tbl   FND_TABLE_OF_VARCHAR2_30;
11661    l_index            PLS_INTEGER ;
11662 
11663 
11664 
11665 BEGIN
11666     -- Standard Start of API savepoint
11667     SAVEPOINT StartWorkflow_Util;
11668 
11669     -- Standard call to check for call compatibility.
11670     IF NOT FND_API.Compatible_API_Call(  l_api_version
11671                                        , p_api_version
11672                                        , l_api_name
11673                                        , G_PKG_NAME )
11674     THEN
11675         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
11676     END IF;
11677 
11678     -- Initialize message list if p_init_msg_list is set to TRUE.
11679     IF FND_API.to_Boolean( p_init_msg_list ) THEN
11680        FND_MSG_PUB.initialize;
11681     END IF ;
11682 
11683 
11684 
11685     -- For Test/Debug
11686     Check_And_Open_Debug_Session(p_debug, p_output_dir, p_debug_filename) ;
11687     -- R12 Comment out
11688     -- IF FND_API.to_Boolean( p_debug ) THEN
11689     --     Open_Debug_Session(p_output_dir, p_debug_filename ) ;
11690     -- END IF;
11691 
11692     --  Initialize Other Variables
11693     IF p_object_name = G_ENG_CHANGE
11694     THEN
11695 
11696        l_change_id := p_object_id1 ;
11697 
11698     ELSIF p_object_name = G_ENG_CHANGE_LINE
11699     THEN
11700 
11701        l_change_line_id := p_object_id1 ;
11702        l_change_id := p_parent_object_id1 ;
11703 
11704     END IF ;
11705 
11706     IF p_action_id IS NULL THEN
11707        l_action_id     := 0 ;
11708     ELSE
11709        l_action_id     := p_action_id ;
11710     END IF ;
11711 
11712 IF g_debug_flag THEN
11713    Write_Debug('Eng_Workflow_Util.StartWorkflow Log');
11714    Write_Debug('-----------------------------------------------------');
11715    Write_Debug('Item Type         : ' || p_item_type );
11716    Write_Debug('Item Key          : ' || x_item_key );
11717    Write_Debug('Process Name      : ' || p_process_name);
11718    Write_Debug('Object Name       : ' || p_object_name );
11719    Write_Debug('Object Id1        : ' || to_char(p_object_id1));
11720    Write_Debug('Change Id         : ' || to_char(l_change_id));
11721    Write_Debug('Change Line Id    : ' || to_char(l_change_line_id));
11722    Write_Debug('Host URL          : ' || p_host_url);
11723    Write_Debug('WF User Id        : ' || to_char(p_wf_user_id));
11724    Write_Debug('Action Id         : ' || to_char(p_action_id));
11725    Write_Debug('Adhoc Party List  : ' || p_adhoc_party_list);
11726    Write_Debug('Route Id          : ' || to_char(p_route_id));
11727    Write_Debug('Route Step Id     : ' || to_char(p_route_step_id));
11728    Write_Debug('-----------------------------------------------------');
11729    Write_Debug('Initialize return status ' );
11730 END IF ;
11731 
11732     --  Initialize API return status to success
11733     x_return_status := FND_API.G_RET_STS_SUCCESS;
11734 
11735     -----------------------------------------------------------------
11736     -- API body
11737     -----------------------------------------------------------------
11738     -- 1. ValidateWorkflowProcess:
11739     -- 2. CreateProcess:
11740     -- 2-1. SetItemUserKey:
11741     -- 2-2. SetItemOwner:
11742     -- 3. SetItemAttribute:
11743     -- 4. SetItemParent:
11744     -- 4-1. Additional Set
11745     -- 5. Execute Custom Hook:
11746     -- 6. StartProcess:
11747 
11748 IF g_debug_flag THEN
11749    Write_Debug('1. ValidateProcess. . .');
11750 END IF ;
11751 
11752     -- Call ValiadteWFProcess
11753     -- ValidateProcess
11754     ValidateProcess
11755     (  p_validation_level  => p_validation_level
11756     ,  x_return_status     => x_return_status
11757     ,  x_msg_count         => x_msg_count
11758     ,  x_msg_data          => x_msg_data
11759     ,  p_item_type         => p_item_type
11760     ,  p_process_name      => p_process_name
11761     ,  p_change_id         => l_change_id
11762     ,  p_change_line_id    => l_change_line_id
11763     ,  p_wf_user_id        => p_wf_user_id
11764     ,  p_host_url          => p_host_url
11765     ,  p_action_id         => p_action_id
11766     ,  p_adhoc_party_list  => p_adhoc_party_list
11767     ,  p_route_id          => p_route_id
11768     ,  p_route_step_id     => p_route_step_id
11769     ,  p_parent_item_type  => p_parent_item_type
11770     ,  p_parent_item_key   => p_parent_item_key
11771     ,  p_object_name        => p_object_name
11772     ,  p_object_id1         => p_object_id1
11773     ,  p_object_id2         => p_object_id2
11774     ,  p_object_id3         => p_object_id3
11775     ,  p_object_id4         => p_object_id4
11776     ,  p_object_id5         => p_object_id5
11777     ,  p_parent_object_name => p_parent_object_name
11778     ,  p_parent_object_id1  => p_parent_object_id1
11779     ) ;
11780 
11781 
11782     IF x_return_status <> FND_API.G_RET_STS_SUCCESS
11783     THEN
11784         RAISE FND_API.G_EXC_ERROR ;
11785     END IF ;
11786 
11787 
11788     --
11789     -- R12B
11790     -- Check WF availability for Document LC Change Object
11791     --
11792 IF g_debug_flag THEN
11793    Write_Debug('Document LC Change Object check. WF should not be started except Doc LC Phase WF. . .');
11794 END IF ;
11795 
11796     IF l_change_id IS NOT NULL AND l_change_id > 0
11797     THEN
11798 
11799         IF (     p_item_type <> G_CHANGE_ROUTE_ITEM_TYPE
11800             AND  p_item_type <>  G_CHANGE_ROUTE_DOC_STEP_TYPE
11801             AND  ENG_DOCUMENT_UTIL.Is_Dom_Document_Lifecycle( p_change_id   => l_change_id)
11802            )
11803         THEN
11804 
11805             IF p_item_type =  G_CHANGE_ACTION_ITEM_TYPE
11806             THEN
11807 
11808 IF g_debug_flag THEN
11809    Write_Debug('CM Workflows except Doc Phse WF Routing are not supported in Document LC ChangeObject. return. .. ');
11810 END IF ;
11811                -- At this time, not raising any error
11812                -- Set dummy item key
11813                x_item_key := Eng_Workflow_Util.G_RET_STS_NONE ;
11814                RETURN ;
11815 
11816             ELSE
11817 
11818 IF g_debug_flag THEN
11819    Write_Debug('CM Workflows except Doc Phse WF Routing are not supported in Document LC ChangeObject. Raise Error. .. ');
11820 END IF ;
11821                -- At this time, not raising any error
11822 
11823                 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
11824             END IF ;
11825 
11826 
11827         END IF ;
11828 
11829     END IF ;
11830 
11831 
11832 IF g_debug_flag THEN
11833    Write_Debug('2. CreateProcess. . .');
11834 END IF ;
11835 
11836 
11837    IF x_item_key  IS NULL THEN
11838 
11839        -- Get new item key
11840        x_item_key := GetNewItemKey ;
11841 
11842    END IF ;
11843 
11844 
11845 IF g_debug_flag THEN
11846    Write_Debug('Got new wf item key: ' || x_item_key );
11847 END IF ;
11848 
11849 
11850     -- We no longer use Submit Revision for Change Workflow
11851     --  Set workflow revision history
11852     -- SetWorkflowRevision
11853     -- (  p_item_type         => p_item_type
11854     -- ,  p_item_key          => x_item_key
11855     -- ,  p_process_name      => p_process_name
11856     -- ,  p_change_notice     => p_change_notice
11857     -- ,  p_organization_id   => p_organization_id
11858     -- ,  p_wf_user_id        => p_wf_user_id
11859     -- ,  p_action_id         => p_action_id
11860     -- ,  p_route_id          => p_route_id
11861     -- ,  p_route_step_id     => p_route_step_id
11862     -- ) ;
11863 
11864     l_wf_user_key := GetItemUserKey
11865                      (  p_item_type          => p_item_type
11866                      ,  p_item_key           => x_item_key
11867                      ,  p_change_id          => l_change_id
11868                      ,  p_change_line_id     => l_change_line_id
11869                      ,  p_object_name        => p_object_name
11870                      ,  p_object_id1         => p_object_id1
11871                      ,  p_object_id2         => p_object_id2
11872                      ,  p_object_id3         => p_object_id3
11873                      ,  p_object_id4         => p_object_id4
11874                      ,  p_object_id5         => p_object_id5
11875                      ,  p_parent_object_name => p_parent_object_name
11876                      ,  p_parent_object_id1  => p_parent_object_id1
11877                      ) ;
11878 
11879 
11880 IF g_debug_flag THEN
11881    Write_Debug('2-1. Set ItemUserKey. . .' || l_wf_user_key );
11882 END IF ;
11883 
11884     -- Get User Info
11885     l_wf_user_role := GetUserRole(p_user_id => p_wf_user_id ) ;
11886 
11887 
11888 IF g_debug_flag THEN
11889    Write_Debug('2-2. Set ItemOwner. . .' || l_wf_user_role );
11890 END IF ;
11891 
11892 
11893     -- Set User Id
11894     IF p_wf_user_id IS NULL OR  p_wf_user_id < 0
11895     THEN
11896        l_api_caller := Eng_Workflow_Util.G_WF_CALL ;
11897     END IF ;
11898 
11899 IF g_debug_flag THEN
11900    Write_Debug('2-2. Get Spcial  API Caller: ' || l_api_caller );
11901 END IF ;
11902 
11903     -- Set Workflow Process Owner
11904     WF_ENGINE.CreateProcess
11905     ( itemtype     => p_item_type
11906     , itemkey      => x_item_key
11907     , process      => p_process_name
11908     , user_key     => l_wf_user_key
11909     , owner_role   => l_wf_user_role ) ;
11910 
11911 
11912 IF g_debug_flag THEN
11913    Write_Debug('3. SetItemAttribute. . .');
11914 END IF ;
11915 
11916     -- Set Item Attributes
11917     SetAttributes
11918     (  x_return_status     => x_return_status
11919     ,  x_msg_count         => x_msg_count
11920     ,  x_msg_data          => x_msg_data
11921     ,  p_item_type         => p_item_type
11922     ,  p_item_key          => x_item_key
11923     ,  p_process_name      => p_process_name
11924     ,  p_change_id         => l_change_id
11925     ,  p_change_line_id    => l_change_line_id
11926     ,  p_wf_user_id        => p_wf_user_id
11927     ,  p_wf_user_role      => l_wf_user_role
11928     ,  p_host_url          => p_host_url
11929     ,  p_action_id         => l_action_id
11930     ,  p_adhoc_party_list  => p_adhoc_party_list
11931     ,  p_route_id          => p_route_id
11932     ,  p_route_step_id     => p_route_step_id
11933     ,  p_parent_item_type  => p_parent_item_type
11934     ,  p_parent_item_key   => p_parent_item_key
11935     ,  p_object_name        => p_object_name
11936     ,  p_object_id1         => p_object_id1
11937     ,  p_object_id2         => p_object_id2
11938     ,  p_object_id3         => p_object_id3
11939     ,  p_object_id4         => p_object_id4
11940     ,  p_object_id5         => p_object_id5
11941     ,  p_parent_object_name => p_parent_object_name
11942     ,  p_parent_object_id1  => p_parent_object_id1
11943     ) ;
11944 
11945 
11946 IF g_debug_flag THEN
11947    Write_Debug('After SetItemAttribute. . .');
11948    Write_Debug('Change Id         : ' || to_char(l_change_id));
11949 END IF ;
11950 
11951 
11952     IF x_return_status <> FND_API.G_RET_STS_SUCCESS
11953     THEN
11954         RAISE FND_API.G_EXC_ERROR ;
11955     END IF ;
11956 
11957 IF g_debug_flag THEN
11958    Write_Debug('4. SetItemParent. . .');
11959    Write_Debug('Parent Item Type : ' || p_parent_item_type);
11960    Write_Debug('Parent Item Key  : ' || p_parent_item_key);
11961 END IF ;
11962 
11963     -- If Parent WF Info is not null and
11964     -- item_type is NOT Eng_Workflow_Util.G_CHANGE_ROUTE_ITEM_TYPE
11965     -- G_CHANGE_ROUTE_ITEM_TYPE has own API to set parent wf info
11966     IF  p_parent_item_type IS NOT NULL
11967     AND p_parent_item_key  IS NOT NULL
11968     AND p_item_type <> Eng_Workflow_Util.G_CHANGE_ROUTE_ITEM_TYPE
11969     THEN
11970 
11971         -- Set Parent Worklfow Process
11972         WF_ENGINE.SetItemParent
11973         ( itemtype        => p_item_type
11974         , itemkey         => x_item_key
11975         , parent_itemtype => p_parent_item_type
11976         , parent_itemkey  => p_parent_item_key
11977         , parent_context  => NULL
11978         );
11979 
11980     END IF ;
11981 
11982 
11983     IF p_item_type = Eng_Workflow_Util.G_CHANGE_ROUTE_ITEM_TYPE
11984     THEN
11985 
11986 IF g_debug_flag THEN
11987    Write_Debug('4-2. Set Route Status . . .');
11988 END IF ;
11989 
11990         SetRouteStatus
11991         (  p_item_type         => p_item_type
11992         ,  p_item_key          => x_item_key
11993         ,  p_wf_user_id        => p_wf_user_id
11994         ,  p_route_id          => p_route_id
11995         ,  p_new_status_code   => Eng_Workflow_Util.G_RT_IN_PROGRESS
11996         ,  p_init_route        => FND_API.G_TRUE
11997         ,  p_change_id         => l_change_id
11998         ,  p_change_line_id    => l_change_line_id   -- Added in R12B
11999         ) ;
12000 
12001 
12002         -- In case that Route Object is Change Object
12003         IF p_object_name = Eng_Workflow_Util.G_ENG_CHANGE
12004         THEN
12005 
12006         /***********************************************
12007         --
12008         -- In 115.10
12009         -- Workflow Routing will not chagne Change Object
12010         -- Approval Status
12011 --  IF g_debug_flag THEN
12012 --     Write_Debug('4-3. Set Approval Route Status . . .');
12013 --  END IF ;
12014 --
12015         --   SetChangeApprovalStatus
12016         --   (  x_return_status        => x_return_status
12017         --   ,  x_msg_count            => x_msg_count
12018         --   ,  x_msg_data             => x_msg_data
12019         --   ,  p_item_type            => p_item_type
12020         --   ,  p_item_key             => x_item_key
12021         --   ,  p_change_id            => l_change_id
12022         --   ,  p_change_line_id       => l_change_line_id
12023         --   ,  p_wf_user_id           => p_wf_user_id
12024         --   ,  p_new_appr_status_type => Eng_Workflow_Util.G_REQUESTED
12025         --  ) ;
12026         --
12027 
12028 -- IF g_debug_flag THEN
12029 --  Write_Debug('After Set Approval Status .' || x_return_status );
12030 -- END IF ;
12031 
12032         --    IF x_return_status <> FND_API.G_RET_STS_SUCCESS
12033         --    THEN
12034         --        RAISE FND_API.G_EXC_ERROR ;
12035         --    END IF ;
12036         --
12037         ****************************************************/
12038 
12039 
12040 IF g_debug_flag THEN
12041    Write_Debug('4-4. Set Workflow Routing Action Log . . .');
12042 END IF ;
12043             l_action_type := Eng_Workflow_Util.ConvertRouteStatusToActionType
12044                          ( p_route_status_code =>  Eng_Workflow_Util.G_RT_IN_PROGRESS
12045                          , p_convert_type      =>  'WF_PROCESS' ) ;
12046 
12047             CreateRouteAction
12048             (  x_return_status        => x_return_status
12049             ,  x_msg_count            => x_msg_count
12050             ,  x_msg_data             => x_msg_data
12051             ,  p_change_id            => l_change_id
12052             ,  p_change_line_id       => l_change_line_id
12053             ,  p_action_type          => l_action_type
12054             ,  p_user_id              => p_wf_user_id
12055             ,  p_parent_action_id     => NULL
12056             ,  p_route_id             => p_route_id
12057             ,  p_comment              => NULL
12058             ,  x_action_id            => l_action_id
12059             ) ;
12060 
12061 IF g_debug_flag THEN
12062    Write_Debug('After Set Workflow Routing Action Log .' || x_return_status );
12063 END IF ;
12064 
12065             IF x_return_status <> FND_API.G_RET_STS_SUCCESS
12066             THEN
12067                 RAISE FND_API.G_EXC_ERROR ;
12068             END IF ;
12069 
12070             -- Set Action Id
12071             SetActionId
12072             (   p_item_type         => p_item_type
12073              ,  p_item_key          => x_item_key
12074              ,  p_action_id         => l_action_id
12075             ) ;
12076 
12077 IF g_debug_flag THEN
12078    Write_Debug('4-5. Sync Workflow Routing Status and LC Phase WF Status. . .');
12079 END IF ;
12080 
12081             -- R12B
12082             -- No need to call Eng_Workflow_Util.SyncChangeLCPhase
12083             -- For Line
12084             IF ( l_change_line_id IS NULL OR  l_change_line_id <= 0)
12085             THEN
12086 
12087                 -- Call Sync Change Lifecycle Phase API
12088                 Eng_Workflow_Util.SyncChangeLCPhase
12089                 (  x_return_status        => x_return_status
12090                 ,  x_msg_count            => x_msg_count
12091                 ,  x_msg_data             => x_msg_data
12092                 ,  p_route_id             => p_route_id
12093                 ,  p_api_caller           => l_api_caller
12094                 ) ;
12095 
12096 
12097     IF g_debug_flag THEN
12098        Write_Debug('After Sync Workflow Routing Status and LC Phase WF Status.' || x_return_status );
12099     END IF ;
12100 
12101 
12102                 IF x_return_status <> FND_API.G_RET_STS_SUCCESS
12103                 THEN
12104                     RAISE FND_API.G_EXC_ERROR ;
12105                 END IF ;
12106 
12107             END IF ;
12108 
12109 
12110         -- R12B Line Workfow Routing
12111         -- In case that Route Object is Change Line Object
12112         ELSIF p_object_name = Eng_Workflow_Util.G_ENG_CHANGE_LINE
12113         THEN
12114 
12115 
12116 IF g_debug_flag THEN
12117    Write_Debug('4-4. Set Line Workflow Routing Action Log . . .');
12118 END IF ;
12119             l_action_type := Eng_Workflow_Util.ConvertRouteStatusToActionType
12120                          ( p_route_status_code =>  Eng_Workflow_Util.G_RT_IN_PROGRESS
12121                          , p_convert_type      =>  'WF_PROCESS' ) ;
12122 
12123             CreateRouteAction
12124             (  x_return_status        => x_return_status
12125             ,  x_msg_count            => x_msg_count
12126             ,  x_msg_data             => x_msg_data
12127             ,  p_change_id            => l_change_id
12128             ,  p_change_line_id       => l_change_line_id
12129             ,  p_action_type          => l_action_type
12130             ,  p_user_id              => p_wf_user_id
12131             ,  p_parent_action_id     => NULL
12132             ,  p_route_id             => p_route_id
12133             ,  p_comment              => NULL
12134             ,  x_action_id            => l_action_id
12135             ) ;
12136 
12137 IF g_debug_flag THEN
12138    Write_Debug('After Set Line Workflow Routing Action Log .' || x_return_status );
12139 END IF ;
12140 
12141             IF x_return_status <> FND_API.G_RET_STS_SUCCESS
12142             THEN
12143                 RAISE FND_API.G_EXC_ERROR ;
12144             END IF ;
12145 
12146             -- Set Action Id
12147             SetActionId
12148             (   p_item_type         => p_item_type
12149              ,  p_item_key          => x_item_key
12150              ,  p_action_id         => l_action_id
12151             ) ;
12152 
12153 
12154         END IF ; -- End if p_object_name = Eng_Workflow_Util.G_ENG_CHANGE_LINE
12155 
12156 
12157       /***********************************************
12158       --  In 115.10
12159       --  We are not supproting
12160       --  Change Line Workflow Routing
12161       --  and Header/Line Coordination
12162       --
12163       --  SetRouteParentChild
12164       --  (  x_return_status        => x_return_status
12165       --  ,  x_msg_count            => x_msg_count
12166       --  ,  x_msg_data             => x_msg_data
12167       --  ,  p_change_id            => l_change_id
12168       --  ,  p_change_line_id       => l_change_line_id
12169       --  ,  p_route_id             => p_route_id
12170       --  ,  p_item_type            => p_item_type
12171       --  ,  p_item_key             => x_item_key
12172       --  ,  p_parent_item_type     => p_parent_item_type
12173       --  ,  p_parent_item_key      => p_parent_item_key
12174       --  ) ;
12175 
12176 --IF g_debug_flag THEN
12177 --   Write_Debug('After Set Parenet Child for Route Worklfow.' || x_return_status );
12178 --END IF ;
12179 
12180        -- IF x_return_status <> FND_API.G_RET_STS_SUCCESS
12181        -- THEN
12182        --     RAISE FND_API.G_EXC_ERROR ;
12183        -- END IF ;
12184        --
12185       ***********************************************/
12186 
12187 
12188 
12189 
12190     ELSIF (    p_item_type = Eng_Workflow_Util.G_CHANGE_ROUTE_STEP_ITEM_TYPE
12191             OR p_item_type = Eng_Workflow_Util.G_CHANGE_ROUTE_DOC_STEP_TYPE
12192             OR p_item_type = Eng_Workflow_Util.G_CHANGE_ROUTE_LINE_STEP_TYPE
12193           )
12194     THEN
12195 
12196 IF g_debug_flag THEN
12197    Write_Debug('4-2. Set Route Step Status . . .' || to_char(p_route_step_id));
12198 END IF ;
12199 
12200         Eng_Workflow_Util.SetRouteStepStatus
12201         (  p_item_type         => p_item_type
12202         ,  p_item_key          => x_item_key
12203         ,  p_wf_user_id        => p_wf_user_id
12204         ,  p_route_id          => p_route_id
12205         ,  p_route_step_id     => p_route_step_id
12206         ,  p_new_status_code   => Eng_Workflow_Util.G_RT_IN_PROGRESS
12207         ) ;
12208 
12209 
12210 IF g_debug_flag THEN
12211    Write_Debug('4-3. Set Route Step Status . . .' || to_char(p_route_step_id));
12212 END IF ;
12213 
12214         -- R12B
12215         -- Change Management Header/Line Workflow Routing Assignees Grants
12216         --
12217         -- NOTE: In R12B We support Document Revision subject and Files (Attachments)
12218         --
12219         -- Provide `view grants to workflow assignees' feature to all workflow routeing types not just for
12220         -- notification workflow type. across all subject entities
12221         -- for both header and line workflows
12222         --
12223         -- Header level: Will give Role specified in WF Definition to header subject
12224         -- entity for header workflow ad-hoc assignees across all subject entities
12225         -- Header Level: Will give OFO Role grants to header attachments for header workflow ad-hoc assignees
12226         --
12227         -- Line level: Will give Role specified in WF Definition to line subject
12228         -- entity for header workflow ad-hoc assignees across all subject entities
12229         -- Line Level: Give OFO Role grants to line workflow assignees on line attachments
12230         --
12231         -- Header and Line level: When workflow steps are re-assigned,
12232         -- same roles specified in WF Definition will be granted to the original assignee will be kept.
12233         -- In addition view grants will be provided to the new assignees
12234         --
12235 IF g_debug_flag THEN
12236     Write_Debug('calling Eng_Workflow_Util.GrantObjectRoles.' );
12237 END IF ;
12238 
12239         l_index := 0 ;
12240         l_target_obj_tbl := FND_TABLE_OF_VARCHAR2_30();
12241         IF ( p_item_type = Eng_Workflow_Util.G_CHANGE_ROUTE_DOC_STEP_TYPE )
12242         THEN
12243             l_target_obj_tbl.EXTEND ;
12244             l_index := l_index + 1 ;
12245             l_target_obj_tbl(l_index) := G_DOM_DOCUMENT_REVISION ;
12246         END IF ;
12247 
12248 
12249         Eng_Workflow_Util.GrantObjectRoles
12250         (   p_api_version               => 1.0
12251          ,  p_init_msg_list             => FND_API.G_FALSE        --
12252          ,  p_commit                    => FND_API.G_FALSE        --
12253          ,  p_validation_level          => FND_API.G_VALID_LEVEL_FULL
12254          ,  p_debug                     => p_debug
12255          ,  p_output_dir                => p_output_dir
12256          ,  p_debug_filename            => p_debug_filename
12257          ,  x_return_status             => l_return_status
12258          ,  x_msg_count                 => l_msg_count
12259          ,  x_msg_data                  => l_msg_data
12260          ,  p_change_id                 => l_change_id
12261          ,  p_change_line_id            => l_change_line_id
12262          ,  p_route_id                  => p_route_id
12263          ,  p_step_id                   => p_route_step_id
12264          ,  p_person_ids                => NULL
12265          ,  p_target_objects            => l_target_obj_tbl
12266          ,  p_api_caller                => l_api_caller
12267          ,  p_grant_option              => NULL
12268         ) ;
12269 
12270 
12271 IF g_debug_flag THEN
12272     Write_Debug('After Eng_Workflow_Util.GrantObjectRoles: ' || l_return_status );
12273 END IF ;
12274 
12275        --
12276        -- IF l_return_status <> FND_API.G_RET_STS_SUCCESS
12277        -- THEN
12278        --     RAISE FND_API.G_EXC_ERROR ;
12279        -- END IF ;
12280        --
12281 
12282     END IF ;
12283 
12284 
12285 IF g_debug_flag THEN
12286    Write_Debug('5. Executing Custom Hook: Eng_Workflow_Ext.StartCustomWorkflow . . .');
12287    Write_Debug('Item Type    : ' || p_item_type );
12288    Write_Debug('Item Key     : ' || x_item_key );
12289    Write_Debug('Process Name : ' || p_process_name);
12290 END IF ;
12291 
12292 
12293     Eng_Workflow_Ext.StartCustomWorkflow
12294     (  p_validation_level  => p_validation_level
12295     ,  x_return_status     => x_return_status
12296     ,  x_msg_count         => x_msg_count
12297     ,  x_msg_data          => x_msg_data
12298     ,  p_item_type         => p_item_type
12299     ,  x_item_key          => x_item_key
12300     ,  p_process_name      => p_process_name
12301     ,  p_change_id         => l_change_id
12302     ,  p_change_line_id    => l_change_line_id
12303     ,  p_wf_user_id        => p_wf_user_id
12304     ,  p_host_url          => p_host_url
12305     ,  p_action_id         => p_action_id
12306     ,  p_adhoc_party_list  => p_adhoc_party_list
12307     ,  p_route_id          => p_route_id
12308     ,  p_route_step_id     => p_route_step_id
12309     ,  p_parent_item_type  => p_parent_item_type
12310     ,  p_parent_item_key   => p_parent_item_key
12311     ,  p_object_name        => p_object_name
12312     ,  p_object_id1         => p_object_id1
12313     ,  p_object_id2         => p_object_id2
12314     ,  p_object_id3         => p_object_id3
12315     ,  p_object_id4         => p_object_id4
12316     ,  p_object_id5         => p_object_id5
12317     ,  p_parent_object_name => p_parent_object_name
12318     ,  p_parent_object_id1  => p_parent_object_id1
12319     ) ;
12320 
12321 IF g_debug_flag THEN
12322    Write_Debug('Return Status: ' || x_return_status );
12323 END IF ;
12324 
12325 
12326     IF x_return_status <> FND_API.G_RET_STS_SUCCESS
12327     THEN
12328         RAISE FND_API.G_EXC_ERROR ;
12329     END IF ;
12330 
12331 IF g_debug_flag THEN
12332    Write_Debug('6. StartProcess. . .');
12333    Write_Debug('Item Type    : ' || p_item_type );
12334    Write_Debug('Item Key     : ' || x_item_key );
12335    Write_Debug('Process Name : ' || p_process_name);
12336 END IF ;
12337 
12338     IF  p_item_type  IS NOT NULL
12339     AND x_item_key   IS NOT NULL
12340     THEN
12341 
12342 IF g_debug_flag THEN
12343    Write_Debug('Calling WF_ENGINE.StartProcess . . .') ;
12344 END IF ;
12345 
12346 
12347         -- Start process
12348         WF_ENGINE.StartProcess
12349         ( itemtype => p_item_type
12350         , itemkey  => x_item_key);
12351 
12352     END IF ;
12353 
12354 IF g_debug_flag THEN
12355    Write_Debug('After executing StartWorkflow API Body') ;
12356 END IF ;
12357 
12358 
12359    -- Standard check of p_commit.
12360    IF FND_API.To_Boolean( p_commit ) THEN
12361 
12362 IF g_debug_flag THEN
12363    Write_Debug('Do Commit.') ;
12364 END IF ;
12365 
12366       COMMIT WORK;
12367    END IF;
12368 
12369    -- Standard call to get message count and if count is 1, get message info.
12370    FND_MSG_PUB.Count_And_Get
12371       (  p_count  => x_msg_count
12372       ,  p_data   => x_msg_data
12373       );
12374 
12375 IF g_debug_flag THEN
12376    Write_Debug('Finish. Eng Of Proc') ;
12377    Close_Debug_Session ;
12378 END IF ;
12379 
12380 
12381 EXCEPTION
12382    WHEN FND_API.G_EXC_ERROR THEN
12383         -- Standard check of p_commit.
12384        IF FND_API.To_Boolean( p_commit ) THEN
12385 IF g_debug_flag THEN
12386    Write_Debug('Rollback . . .') ;
12387 END IF ;
12388            ROLLBACK TO StartWorkflow_Util ;
12389        END IF;
12390 
12391        x_return_status := FND_API.G_RET_STS_ERROR ;
12392 
12393        FND_MSG_PUB.Count_And_Get
12394         (   p_count  =>      x_msg_count
12395          ,  p_data   =>      x_msg_data
12396         );
12397 
12398 IF g_debug_flag THEN
12399    Write_Debug('RollBack and Finish with Error.') ;
12400    Close_Debug_Session ;
12401 END IF ;
12402 
12403    WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
12404        IF FND_API.To_Boolean( p_commit ) THEN
12405 IF g_debug_flag THEN
12406    Write_Debug('Rollback . . .') ;
12407 END IF ;
12408            ROLLBACK TO StartWorkflow_Util ;
12409        END IF;
12410 
12411        x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
12412 
12413        FND_MSG_PUB.Count_And_Get
12414         (   p_count  =>      x_msg_count
12415          ,  p_data   =>      x_msg_data
12416         );
12417 
12418 IF g_debug_flag THEN
12419    Write_Debug('Rollback and Finish with unxepcted error.') ;
12420    Close_Debug_Session ;
12421 END IF ;
12422 
12423    WHEN OTHERS THEN
12424        IF FND_API.To_Boolean( p_commit ) THEN
12425 IF g_debug_flag THEN
12426    Write_Debug('Rollback . . .') ;
12427 END IF ;
12428            ROLLBACK TO StartWorkflow_Util ;
12429        END IF;
12430 
12431        x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
12432 
12433        FND_MSG_PUB.Count_And_Get
12434         (   p_count  =>      x_msg_count
12435          ,  p_data   =>      x_msg_data
12436         );
12437 
12438        IF  FND_MSG_PUB.Check_Msg_Level
12439           (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
12440        THEN
12441             FND_MSG_PUB.Add_Exc_Msg
12442               ( G_PKG_NAME
12443               , l_api_name
12444               );
12445        END IF;
12446 
12447        FND_MSG_PUB.Count_And_Get
12448         (   p_count  =>      x_msg_count
12449          ,  p_data   =>      x_msg_data
12450         );
12451 
12452 IF g_debug_flag THEN
12453    Write_Debug('Rollback and finish with system unxepcted error: '
12454                || Substr(To_Char(SQLCODE)||'/'||SQLERRM,1,240));
12455    Close_Debug_Session ;
12456 END IF ;
12457 
12458 
12459 END StartWorkflow ;
12460 
12461 
12462 
12463 PROCEDURE AbortWorkflow
12464 (   p_api_version       IN  NUMBER
12465  ,  p_init_msg_list     IN  VARCHAR2 := FND_API.G_FALSE
12466  ,  p_commit            IN  VARCHAR2 := FND_API.G_FALSE
12467  ,  p_validation_level  IN  NUMBER   := FND_API.G_VALID_LEVEL_FULL
12468  ,  x_return_status     OUT NOCOPY VARCHAR2
12469  ,  x_msg_count         OUT NOCOPY NUMBER
12470  ,  x_msg_data          OUT NOCOPY VARCHAR2
12471  ,  p_item_type         IN  VARCHAR2
12472  ,  p_item_key          IN  VARCHAR2
12473  ,  p_process_name      IN  VARCHAR2  := NULL
12474  ,  p_wf_user_id        IN  NUMBER
12475  ,  p_debug             IN  VARCHAR2  := FND_API.G_FALSE
12476  ,  p_output_dir        IN  VARCHAR2  := NULL
12477  ,  p_debug_filename    IN  VARCHAR2  := 'Eng_ChangeWF_Abort.log'
12478 )
12479 IS
12480 
12481    l_api_name         CONSTANT VARCHAR2(30) := 'AbortWorkflow';
12482    l_api_version      CONSTANT NUMBER       := 1.0;
12483 
12484    l_activity_status  VARCHAR2(8) ;
12485    l_change_id        NUMBER ;
12486    l_change_line_id   NUMBER ;
12487    l_route_id         NUMBER ;
12488    l_route_step_id    NUMBER ;
12489 
12490    l_action_type      VARCHAR2(30) ;
12491    l_action_id        NUMBER ;
12492    l_parent_action_id NUMBER ;
12493 
12494    l_wf_user_role     VARCHAR2(320) ;
12495    l_api_caller       VARCHAR2(30) ;
12496 
12497 
12498    l_route_object_name VARCHAR2(30) ;
12499 
12500 
12501 
12502    -- R12B
12503    l_target_obj_tbl   FND_TABLE_OF_VARCHAR2_30;
12504    l_index            PLS_INTEGER ;
12505 
12506    l_msg_count                 NUMBER ;
12507    l_msg_data                  VARCHAR2(2000) ;
12508    l_return_status             VARCHAR2(1) ;
12509 
12510 
12511 BEGIN
12512     -- Standard Start of API savepoint
12513     SAVEPOINT AbortWorkflow_Util;
12514 
12515     -- Standard call to check for call compatibility.
12516     IF NOT FND_API.Compatible_API_Call(  l_api_version
12517                                        , p_api_version
12518                                        , l_api_name
12519                                        , G_PKG_NAME )
12520     THEN
12521         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
12522     END IF;
12523 
12524     -- Initialize message list if p_init_msg_list is set to TRUE.
12525     IF FND_API.to_Boolean( p_init_msg_list ) THEN
12526        FND_MSG_PUB.initialize;
12527     END IF ;
12528 
12529 
12530     -- For Test/Debug
12531     Check_And_Open_Debug_Session(p_debug, p_output_dir, p_debug_filename) ;
12532     -- R12 Comment out
12533     -- IF FND_API.to_Boolean( p_debug ) THEN
12534     --     Open_Debug_Session(p_output_dir, p_debug_filename ) ;
12535     -- END IF;
12536 
12537 
12538 IF g_debug_flag THEN
12539    Write_Debug('Eng_Workflow_Util.AbortWorkflow Log');
12540    Write_Debug('-----------------------------------------------------');
12541    Write_Debug('Item Type         : ' || p_item_type );
12542    Write_Debug('Item Key          : ' || p_item_Key );
12543    Write_Debug('Process Name      : ' || p_process_name);
12544    Write_Debug('-----------------------------------------------------');
12545    Write_Debug('Initialize return status ' );
12546 END IF ;
12547 
12548     --  Initialize API return status to success
12549     x_return_status := FND_API.G_RET_STS_SUCCESS;
12550 
12551     -----------------------------------------------------------------
12552     -- API body
12553     -----------------------------------------------------------------
12554 
12555     -- 1. ValidateAbortingProcess:
12556     -- 2. Set User Id who would abort the process:
12557     -- 3. Execute the Item Type specific logic :
12558     -- 4. Execute Custom Hook:
12559     -- 4. SetItemParent:
12560     -- 6. Release Block Abort Activity:
12561 
12562 IF g_debug_flag THEN
12563    Write_Debug('1. ValidateAbortingProcess. . .');
12564 END IF ;
12565 
12566     -- ValidateAbortingProcess
12567     ValidateAbortingProcess
12568     (  p_validation_level  => p_validation_level
12569     ,  x_return_status     => x_return_status
12570     ,  x_msg_count         => x_msg_count
12571     ,  x_msg_data          => x_msg_data
12572     ,  p_item_type         => p_item_type
12573     ,  p_item_key          => p_item_key
12574     ,  p_process_name      => p_process_name
12575     ,  p_wf_user_id        => p_wf_user_id
12576     ) ;
12577 
12578 
12579     IF x_return_status <> FND_API.G_RET_STS_SUCCESS
12580     THEN
12581         RAISE FND_API.G_EXC_ERROR ;
12582     END IF ;
12583 
12584 IF g_debug_flag THEN
12585    Write_Debug('2. Set User Id who is aborting the process. . .');
12586 END IF ;
12587 
12588     -- Set User Id
12589     IF p_wf_user_id IS NOT NULL AND p_wf_user_id >= 0
12590     THEN
12591 
12592        -- Set WF User Id
12593        SetWFUserId
12594        (   p_item_type         => p_item_type
12595         ,  p_item_key          => p_item_key
12596         ,  p_wf_user_id        => p_wf_user_id
12597        ) ;
12598 
12599        l_wf_user_role := GetUserRole(p_user_id => p_wf_user_id ) ;
12600 
12601 
12602        -- Set WF User Role
12603        SetWFUserRole
12604        (   p_item_type         => p_item_type
12605         ,  p_item_key          => p_item_key
12606         ,  p_wf_user_role      => l_wf_user_role
12607        ) ;
12608 
12609        -- Set NTF User Role for Abort Notification
12610        SetNTFFromRole
12611        (   p_item_type         => p_item_type
12612         ,  p_item_key          => p_item_key
12613         ,  p_ntf_from_role     => l_wf_user_role
12614        ) ;
12615 
12616     ELSE
12617 
12618        l_api_caller := Eng_Workflow_Util.G_WF_CALL ;
12619 
12620     END IF ;
12621 
12622 
12623 
12624 IF g_debug_flag THEN
12625    Write_Debug('3. Execute the Item Type specific logic. . .');
12626 END IF ;
12627 
12628 
12629     -- Put the Item Type specific logic here
12630     IF p_item_type = Eng_Workflow_Util.G_CHANGE_ROUTE_ITEM_TYPE
12631     THEN
12632 
12633 IF g_debug_flag THEN
12634    Write_Debug('3-1. Set Route Status . . .');
12635 END IF ;
12636 
12637         -- Get Change Object Identifier
12638         Eng_Workflow_Util.GetChangeObject
12639         (   p_item_type         => p_item_type
12640          ,  p_item_key          => p_item_key
12641          ,  x_change_id         => l_change_id
12642         ) ;
12643 
12644 
12645         -- Get Change Line Object Identifier
12646         Eng_Workflow_Util.GetChangeLineObject
12647         (   p_item_type         => p_item_type
12648          ,  p_item_key          => p_item_key
12649          ,  x_change_line_id    => l_change_line_id
12650         ) ;
12651 
12652         -- Get Route Id
12653         Eng_Workflow_Util.GetRouteId
12654         (   p_item_type         => p_item_type
12655          ,  p_item_key          => p_item_key
12656          ,  x_route_id          => l_route_id
12657         ) ;
12658 
12659         -- Get Route Object Name
12660         Eng_Workflow_Util.GetRouteObject
12661         (   p_item_type         => p_item_type
12662          ,  p_item_key          => p_item_key
12663          ,  x_route_object      => l_route_object_name
12664         ) ;
12665 
12666 
12667 
12668         SetRouteStatus
12669         (  p_item_type         => p_item_type
12670         ,  p_item_key          => p_item_key
12671         ,  p_wf_user_id        => p_wf_user_id
12672         ,  p_route_id          => l_route_id
12673         ,  p_new_status_code   => Eng_Workflow_Util.G_RT_ABORTED
12674         ,  p_change_id         => l_change_id
12675         ,  p_change_line_id    => l_change_line_id   -- Added in R12B
12676         ) ;
12677 
12678 
12679         /* Workflow will not change approval status in 115.10
12680 IF g_debug_flag THEN
12681    Write_Debug('3-2. Set Approval Route Status . . .');
12682 END IF ;
12683 
12684         -- SetChangeApprovalStatus
12685         -- (  x_return_status        => x_return_status
12686         -- ,  x_msg_count            => x_msg_count
12687         -- ,  x_msg_data             => x_msg_data
12688         -- ,  p_item_type            => p_item_type
12689         -- ,  p_item_key             => p_item_key
12690         -- ,  p_change_id            => l_change_id
12691         -- ,  p_change_line_id       => l_change_line_id
12692         -- ,  p_wf_user_id           => p_wf_user_id
12693         -- ,  p_new_appr_status_type => Eng_Workflow_Util.G_NOT_SUBMITTED
12694         -- ) ;
12695 
12696 IF g_debug_flag THEN
12697    Write_Debug('After Set Approval Status .' || x_return_status );
12698 END IF ;
12699 
12700         -- IF x_return_status <> FND_API.G_RET_STS_SUCCESS
12701         -- THEN
12702         --     RAISE FND_API.G_EXC_ERROR ;
12703         -- END IF ;
12704 
12705         */
12706 
12707 IF g_debug_flag THEN
12708    Write_Debug('3-3. Abort Child Route Step Workflows . . .');
12709 END IF ;
12710 
12711         AbortRouteSteps
12712         (  x_return_status        => x_return_status
12713         ,  x_msg_count            => x_msg_count
12714         ,  x_msg_data             => x_msg_data
12715         ,  p_route_item_type      => p_item_type
12716         ,  p_route_item_key       => p_item_key
12717         ,  p_wf_user_id           => p_wf_user_id
12718         ) ;
12719 
12720 IF g_debug_flag THEN
12721    Write_Debug('After Route Step Workflow ' || x_return_status );
12722 END IF ;
12723 
12724         IF x_return_status <> FND_API.G_RET_STS_SUCCESS
12725         THEN
12726             RAISE FND_API.G_EXC_ERROR ;
12727         END IF ;
12728 
12729 
12730         -- In case that Route Object is Change Object
12731         IF l_route_object_name = Eng_Workflow_Util.G_ENG_CHANGE
12732         THEN
12733 
12734             --
12735             -- R12 DOM LC Phase Workflow Support
12736             --
12737             IF ( ENG_DOCUMENT_UTIL.Is_Dom_Document_Lifecycle( p_change_id => l_change_id) )
12738             THEN
12739 
12740 IF g_debug_flag THEN
12741     Write_Debug('Change Object is a Doc LC Object, calling API. . . . ');
12742     Write_Debug('Calling ENG_DOCUMENT_UTIL.Abort_Doc_LC_Phase_WF. . .' );
12743 END IF ;
12744 
12745                 ENG_DOCUMENT_UTIL.Abort_Doc_LC_Phase_WF
12746                 (   p_api_version               => 1.0
12747                  ,  p_init_msg_list             => FND_API.G_FALSE        --
12748                  ,  p_commit                    => FND_API.G_FALSE        --
12749                  ,  p_validation_level          => FND_API.G_VALID_LEVEL_FULL
12750                  ,  x_return_status             => l_return_status
12751                  ,  x_msg_count                 => l_msg_count
12752                  ,  x_msg_data                  => l_msg_data
12753                  ,  p_change_id                 => l_change_id        -- Change Id
12754                  ,  p_route_id                  => l_route_id         -- WF Route ID
12755                 ) ;
12756 
12757 
12758 IF g_debug_flag THEN
12759   Write_Debug('After calling ENG_DOCUMENT_UTIL.Abort_Doc_LC_Phase_WF: ' || l_return_status );
12760 END IF ;
12761                 IF l_return_status <> FND_API.G_RET_STS_SUCCESS
12762                 THEN
12763                     RAISE FND_API.G_EXC_ERROR ;
12764                 END IF ;
12765 
12766             END IF ;
12767 
12768 
12769 IF g_debug_flag THEN
12770    Write_Debug('3-4. Set Workflow Routing Action Log . . .');
12771 END IF ;
12772 
12773             -- Get Action Id and set this as parent action id
12774             Eng_Workflow_Util.GetActionId
12775             (   p_item_type         => p_item_type
12776              ,  p_item_key          => p_item_key
12777              ,  x_action_id         => l_parent_action_id
12778             ) ;
12779 
12780             l_action_type := Eng_Workflow_Util.ConvertRouteStatusToActionType
12781                              ( p_route_status_code =>  Eng_Workflow_Util.G_RT_ABORTED
12782                              , p_convert_type      =>  'WF_PROCESS' ) ;
12783 
12784 
12785             CreateRouteAction
12786             (  x_return_status        => x_return_status
12787             ,  x_msg_count            => x_msg_count
12788             ,  x_msg_data             => x_msg_data
12789             ,  p_change_id            => l_change_id
12790             ,  p_change_line_id       => l_change_line_id
12791             ,  p_action_type          => l_action_type
12792             ,  p_user_id              => p_wf_user_id
12793             ,  p_parent_action_id     => l_parent_action_id
12794             ,  p_route_id             => l_route_id
12795             ,  p_comment              => NULL
12796             ,  x_action_id            => l_action_id
12797             ) ;
12798 
12799 IF g_debug_flag THEN
12800    Write_Debug('After Set Workflow Routing Action Log: ' || x_return_status );
12801 END IF ;
12802 
12803             IF x_return_status <> FND_API.G_RET_STS_SUCCESS
12804             THEN
12805                 RAISE FND_API.G_EXC_ERROR ;
12806             END IF ;
12807 
12808 
12809             -- R12B
12810             -- No need to call Eng_Workflow_Util.SyncChangeLCPhase
12811             -- For Line
12812             IF ( l_change_line_id IS NULL OR  l_change_line_id <= 0)
12813             THEN
12814 
12815                 -- Call Sync Change Lifecycle Phase API
12816                 Eng_Workflow_Util.SyncChangeLCPhase
12817                 (  x_return_status        => x_return_status
12818                 ,  x_msg_count            => x_msg_count
12819                 ,  x_msg_data             => x_msg_data
12820                 ,  p_route_id             => l_route_id
12821                 ,  p_api_caller           => l_api_caller
12822                 ) ;
12823 
12824 
12825 IF g_debug_flag THEN
12826    Write_Debug('After call SyncChangeLCPhase: ' || x_return_status );
12827 END IF ;
12828 
12829                 IF x_return_status <> FND_API.G_RET_STS_SUCCESS
12830                 THEN
12831                     RAISE FND_API.G_EXC_ERROR ;
12832                 END IF ;
12833             END IF ;
12834 
12835 
12836         -- R12B Line Workfow Routing
12837         -- In case that Route Object is Change Line Object
12838         ELSIF l_route_object_name = Eng_Workflow_Util.G_ENG_CHANGE_LINE
12839         THEN
12840 
12841 
12842 IF g_debug_flag THEN
12843    Write_Debug('4-4. Set Line Workflow Routing Action Log . . .');
12844 END IF ;
12845 
12846             -- Get Action Id and set this as parent action id
12847             Eng_Workflow_Util.GetActionId
12848             (   p_item_type         => p_item_type
12849              ,  p_item_key          => p_item_key
12850              ,  x_action_id         => l_parent_action_id
12851             ) ;
12852 
12853 
12854             l_action_type := Eng_Workflow_Util.ConvertRouteStatusToActionType
12855                          ( p_route_status_code =>  Eng_Workflow_Util.G_RT_ABORTED
12856                          , p_convert_type      =>  'WF_PROCESS' ) ;
12857 
12858 
12859             CreateRouteAction
12860             (  x_return_status        => x_return_status
12861             ,  x_msg_count            => x_msg_count
12862             ,  x_msg_data             => x_msg_data
12863             ,  p_change_id            => l_change_id
12864             ,  p_change_line_id       => l_change_line_id
12865             ,  p_action_type          => l_action_type
12866             ,  p_user_id              => p_wf_user_id
12867             ,  p_parent_action_id     => l_parent_action_id
12868             ,  p_route_id             => l_route_id
12869             ,  p_comment              => NULL
12870             ,  x_action_id            => l_action_id
12871             ) ;
12872 
12873 IF g_debug_flag THEN
12874    Write_Debug('After Set Line Workflow Routing Abort Action Log .' || x_return_status );
12875 END IF ;
12876 
12877             IF x_return_status <> FND_API.G_RET_STS_SUCCESS
12878             THEN
12879                 RAISE FND_API.G_EXC_ERROR ;
12880             END IF ;
12881 
12882 
12883         END IF ; -- End if p_object_name = Eng_Workflow_Util.G_ENG_CHANGE_LINE
12884 
12885 
12886 
12887 
12888 
12889         -- R12B Revoke Roles
12890         l_index := 0 ;
12891 
12892         IF ( ENG_DOCUMENT_UTIL.Is_Dom_Document_Lifecycle( p_change_id   => l_change_id) )
12893         THEN
12894 
12895 IF g_debug_flag THEN
12896    Write_Debug('Change Object is a Doc LC Object, Setting target objects. . . . ');
12897 END IF ;
12898             l_target_obj_tbl := FND_TABLE_OF_VARCHAR2_30();
12899             l_target_obj_tbl.EXTEND ;
12900             l_index := l_index+1 ;
12901             l_target_obj_tbl(l_index) := G_DOM_DOCUMENT_REVISION ;
12902         END IF ;
12903 
12904 
12905 IF g_debug_flag THEN
12906    Write_Debug('Calling Eng_Workflow_Util.RevokeObjectRoles . . . . ');
12907 END IF ;
12908 
12909 
12910         Eng_Workflow_Util.RevokeObjectRoles
12911         (   p_api_version               => 1.0
12912          ,  p_init_msg_list             => FND_API.G_FALSE        --
12913          ,  p_commit                    => FND_API.G_FALSE        --
12914          ,  p_validation_level          => FND_API.G_VALID_LEVEL_FULL
12915          ,  p_debug                     => p_debug
12916          ,  p_output_dir                => p_output_dir
12917          ,  p_debug_filename            => p_debug_filename
12918          ,  x_return_status             => l_return_status
12919          ,  x_msg_count                 => l_msg_count
12920          ,  x_msg_data                  => l_msg_data
12921          ,  p_change_id                 => l_change_id
12922          ,  p_change_line_id            => l_change_line_id
12923          ,  p_route_id                  => l_route_id
12924          ,  p_person_ids                => NULL
12925          ,  p_target_objects            => l_target_obj_tbl
12926          ,  p_api_caller                => l_api_caller
12927          ,  p_revoke_option             => NULL
12928         ) ;
12929 
12930 
12931 IF g_debug_flag THEN
12932     Write_Debug('After Eng_Workflow_Util.RevokeObjectRoles.' || l_return_status );
12933 END IF ;
12934 
12935        --
12936        -- IF l_return_status <> FND_API.G_RET_STS_SUCCESS
12937        -- THEN
12938        --     RAISE FND_API.G_EXC_ERROR ;
12939        -- END IF ;
12940        --
12941 
12942     -- R12B
12943     ELSIF (    p_item_type = Eng_Workflow_Util.G_CHANGE_ROUTE_STEP_ITEM_TYPE
12944             OR p_item_type = Eng_Workflow_Util.G_CHANGE_ROUTE_DOC_STEP_TYPE
12945             OR p_item_type = Eng_Workflow_Util.G_CHANGE_ROUTE_LINE_STEP_TYPE
12946           )
12947     THEN
12948 
12949         -- Get Route Step Id
12950         GetRouteStepId
12951         (   p_item_type         => p_item_type
12952          ,  p_item_key          => p_item_key
12953          ,  x_route_step_id     => l_route_step_id
12954         ) ;
12955 
12956 IF g_debug_flag THEN
12957    Write_Debug('3-1. Set Route Step Status . . .' || to_char(l_route_step_id));
12958 END IF ;
12959 
12960         SetRouteStepStatus
12961         (  p_item_type         => p_item_type
12962         ,  p_item_key          => p_item_key
12963         ,  p_wf_user_id        => p_wf_user_id
12964         ,  p_route_id          => l_route_id
12965         ,  p_route_step_id     => l_route_step_id
12966         ,  p_new_status_code   => Eng_Workflow_Util.G_RT_ABORTED
12967         ) ;
12968 
12969 
12970     END IF ;
12971 
12972 
12973 IF g_debug_flag THEN
12974    Write_Debug('4. Executing Custom Hook: Eng_Workflow_Ext.AbortCustomWorkflow . . .');
12975    Write_Debug('Item Type    : ' || p_item_type );
12976    Write_Debug('Item Key     : ' || p_item_key );
12977    Write_Debug('Process Name : ' || p_process_name);
12978 END IF ;
12979 
12980 
12981     Eng_Workflow_Ext.AbortCustomWorkflow
12982     (  p_validation_level  => p_validation_level
12983     ,  x_return_status     => x_return_status
12984     ,  x_msg_count         => x_msg_count
12985     ,  x_msg_data          => x_msg_data
12986     ,  p_item_type         => p_item_type
12987     ,  p_item_key          => p_item_key
12988     ,  p_process_name      => p_process_name
12989     ,  p_wf_user_id        => p_wf_user_id
12990     ) ;
12991 
12992 
12993 IF g_debug_flag THEN
12994    Write_Debug('Return Status: ' || x_return_status );
12995 END IF ;
12996 
12997 
12998     IF x_return_status <> FND_API.G_RET_STS_SUCCESS
12999     THEN
13000         RAISE FND_API.G_EXC_ERROR ;
13001     END IF ;
13002 
13003 
13004 
13005     -- 6. Abort Process or Release 'Block Abort' Activty
13006     --    Fisrt, check if Block Abort Activity is 'NOTIFIED'
13007     --    if so, complete Block Abort Activity
13008     --    if not, abort the process
13009 
13010 IF g_debug_flag THEN
13011    Write_Debug('6. Abort Process or Release Block Abort Activty . .  ' );
13012 END IF ;
13013 
13014 
13015     CheckWFActivityStatus
13016     ( p_item_type        => p_item_type
13017     , p_item_key         => p_item_key
13018     , p_activity_name    => Eng_Workflow_Util.G_BLOCK_ABORT_ACTIVITY
13019     , x_activity_status  => l_activity_status
13020     );
13021 
13022 IF g_debug_flag THEN
13023    Write_Debug('6-1. Abort Block Activity Status: ' || l_activity_status  );
13024 END IF ;
13025 
13026 
13027 
13028     IF (l_activity_status = Eng_Workflow_Util.G_WF_NOTIFIED)
13029     THEN
13030 
13031 IF g_debug_flag THEN
13032    Write_Debug('6-2. Complete  Abort Block Activity. . .' );
13033 END IF ;
13034 
13035 
13036         WF_ENGINE.CompleteActivity( p_item_type
13037                                   , p_item_key
13038                                   , Eng_Workflow_Util.G_BLOCK_ABORT_ACTIVITY
13039                                   , Eng_Workflow_Util.G_WF_COMPLETE
13040                                   );
13041 
13042     ELSE
13043 
13044 IF g_debug_flag THEN
13045    Write_Debug('6-2. Abort Workflow Process directly. . .' );
13046 END IF ;
13047 
13048 
13049 
13050         WF_ENGINE.AbortProcess( p_item_type
13051                               , p_Item_key
13052                               , p_process_name
13053                               );
13054 
13055     END IF;
13056 
13057 
13058 IF g_debug_flag THEN
13059    Write_Debug('After executing AbortWorkflow API Body') ;
13060 END IF ;
13061 
13062 
13063    -- Standard check of p_commit.
13064    IF FND_API.To_Boolean( p_commit ) THEN
13065 
13066 IF g_debug_flag THEN
13067    Write_Debug('Do Commit.') ;
13068 END IF ;
13069 
13070       COMMIT WORK;
13071 
13072    END IF;
13073 
13074    -- Standard call to get message count and if count is 1, get message info.
13075    FND_MSG_PUB.Count_And_Get
13076       (  p_count  => x_msg_count
13077       ,  p_data   => x_msg_data
13078       );
13079 
13080 IF g_debug_flag THEN
13081    Write_Debug('Finish. Eng Of Proc') ;
13082    Close_Debug_Session ;
13083 END IF ;
13084 
13085 -- To remove the step assignee created by the Reassignment.
13086 
13087 EXCEPTION
13088    WHEN FND_API.G_EXC_ERROR THEN
13089        IF FND_API.To_Boolean( p_commit ) THEN
13090 IF g_debug_flag THEN
13091    Write_Debug('Rollback . . .') ;
13092 END IF ;
13093            ROLLBACK TO AbortWorkflow_Util ;
13094        END IF;
13095 
13096        x_return_status := FND_API.G_RET_STS_ERROR ;
13097 
13098        FND_MSG_PUB.Count_And_Get
13099         (   p_count  =>      x_msg_count
13100          ,  p_data   =>      x_msg_data
13101         );
13102 
13103 IF g_debug_flag THEN
13104    Write_Debug('Finish with Error.') ;
13105    Close_Debug_Session ;
13106 END IF ;
13107 
13108    WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
13109        IF FND_API.To_Boolean( p_commit ) THEN
13110 IF g_debug_flag THEN
13111    Write_Debug('Rollback . . .') ;
13112 END IF ;
13113            ROLLBACK TO AbortWorkflow_Util ;
13114        END IF;
13115 
13116        x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
13117 
13118        FND_MSG_PUB.Count_And_Get
13119         (   p_count  =>      x_msg_count
13120          ,  p_data   =>      x_msg_data
13121         );
13122 
13123 IF g_debug_flag THEN
13124    Write_Debug('Finish with unxepcted error.') ;
13125    Close_Debug_Session ;
13126 END IF ;
13127 
13128    WHEN OTHERS THEN
13129        IF FND_API.To_Boolean( p_commit ) THEN
13130 IF g_debug_flag THEN
13131    Write_Debug('Rollback . . .') ;
13132 END IF ;
13133            ROLLBACK TO AbortWorkflow_Util ;
13134        END IF;
13135 
13136        x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
13137 
13138        FND_MSG_PUB.Count_And_Get
13139         (   p_count  =>      x_msg_count
13140          ,  p_data   =>      x_msg_data
13141         );
13142 
13143        IF  FND_MSG_PUB.Check_Msg_Level
13144           (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
13145        THEN
13146             FND_MSG_PUB.Add_Exc_Msg
13147               ( G_PKG_NAME
13148               , l_api_name
13149               );
13150        END IF;
13151 
13152        FND_MSG_PUB.Count_And_Get
13153         (   p_count  =>      x_msg_count
13154          ,  p_data   =>      x_msg_data
13155         );
13156 
13157 IF g_debug_flag THEN
13158    Write_Debug('Finish with system unxepcted error: '
13159                || Substr(To_Char(SQLCODE)||'/'||SQLERRM,1,240));
13160    Close_Debug_Session ;
13161 END IF ;
13162 
13163 
13164 END AbortWorkflow ;
13165 
13166 PROCEDURE reassignRoutePeople(   x_return_status      OUT NOCOPY VARCHAR2
13167                               ,  x_msg_count          OUT NOCOPY NUMBER
13168                               ,  x_msg_data           OUT NOCOPY VARCHAR2
13169                               ,  p_item_type          IN  VARCHAR2
13170                               ,  p_item_key           IN  VARCHAR2
13171                               ,  p_notification_id    IN  NUMBER
13172                               ,  p_reassign_mode      IN  VARCHAR2)
13173 
13174 IS
13175 
13176     l_notification_id     NUMBER;
13177 
13178     l_change_id           NUMBER ;
13179     l_object_name         VARCHAR2(30);
13180     l_step_id             NUMBER;
13181 
13182     l_route_people_id     NUMBER;
13183     l_assignee_type_code           VARCHAR2(30);
13184     l_original_assignee_id         NUMBER ;
13185     l_original_assignee_type_code  VARCHAR2(30);
13186     l_response_condition_code      VARCHAR2(30);
13187     l_adhoc_people_flag            VARCHAR2(1) ;
13188     l_response_code       VARCHAR2(30);
13189     l_comment             VARCHAR2(4000);
13190 
13191     --l_party_id            NUMBER;
13192     --l_fnd_user_id         NUMBER ;
13193     --l_fnd_login_id        NUMBER ;
13194 
13195     l_performer_user_id   NUMBER;
13196     l_performer_party_id  NUMBER;
13197 
13198 
13199     l_rowid               ROWID;
13200     l_new_party_id        NUMBER :=-1;
13201     l_new_route_people_id NUMBER ;
13202     l_new_route_assoc_id NUMBER;
13203 
13204     l_created_action_id   NUMBER;
13205     l_action_type         VARCHAR2(30);
13206 
13207     l_return_status       VARCHAR2(1);
13208     l_msg_count           NUMBER;
13209     l_msg_data            VARCHAR2(3000);
13210 
13211     -- R12B
13212     l_route_id            NUMBER;
13213     l_change_line_id      NUMBER;
13214     l_target_obj_tbl      FND_TABLE_OF_VARCHAR2_30;
13215     l_obj_index           PLS_INTEGER ;
13216     l_person_id_tbl       FND_TABLE_OF_NUMBER ;
13217     l_person_idx          PLS_INTEGER ;
13218     l_default_assignee_resp  VARCHAR2(30) ;
13219 
13220 
13221     CURSOR  c_route_person ( p_step_id            NUMBER
13222                            , p_notification_id    NUMBER )
13223     IS
13224         SELECT EngSecPeople.user_id
13225              , EngSecPeople.person_id
13226              , RoutePeople.route_people_id
13227              , RoutePeople.adhoc_people_flag
13228              , RoutePeople.assignee_type_code
13229              , RoutePeople.original_assignee_id
13230              , RoutePeople.original_assignee_type_code
13231              , RoutePeople.response_condition_code
13232         FROM   ENG_CHANGE_ROUTE_PEOPLE RoutePeople
13233              , ENG_SECURITY_PEOPLE_V EngSecPeople
13234              , WF_NOTIFICATIONS wn
13235         WHERE RoutePeople.assignee_id = EngSecPeople.person_id
13236         -- AND   RoutePeople.assignee_type_code = p_assignee_type_code
13237         AND   RoutePeople.step_id = p_step_id
13238         AND   ( RoutePeople.response_code IS NULL
13239                 OR RoutePeople.response_code = Eng_Workflow_Util.G_RT_SUBMITTED
13240                 OR RoutePeople.response_code = Eng_Workflow_Util.G_RT_NOT_RECEIVED )
13241         AND   EngSecPeople.user_name = wn.recipient_role
13242         AND   wn.notification_id = p_notification_id ;
13243 
13244     CURSOR c_report_people_assocs (p_route_people_id NUMBER)
13245     IS
13246         SELECT  ASSOC_OBJECT_NAME,ASSOC_OBJ_PK1_VALUE, ADHOC_ASSOC_FLAG,
13247              OBJECT_NAME, OBJECT_ID1 from ENG_CHANGE_ROUTE_ASSOCS
13248              where ROUTE_PEOPLE_ID=p_route_people_id;
13249 
13250 BEGIN
13251      --  Initialize API return status to success
13252      x_return_status := FND_API.G_RET_STS_SUCCESS;
13253 
13254 IF g_debug_flag THEN
13255    Write_Debug('Route p_notification_id ' || to_char(p_notification_id));
13256 END IF ;
13257 
13258      -- Get Change Object Identifier
13259      GetChangeObject
13260      (   p_item_type         => p_item_type
13261       ,  p_item_key          => p_item_key
13262       ,  x_change_id         => l_change_id
13263      ) ;
13264 
13265 
13266      -- Get Object Type
13267      l_object_name :=  GetChangeObjectName
13268      ( p_change_id           => l_change_id ) ;
13269 
13270 
13271      -- Get Current Route Step Id
13272      GetRouteStepId
13273      (  p_item_type        => p_item_type
13274      ,  p_item_key          => p_item_key
13275      ,  x_route_step_id     => l_step_id
13276      ) ;
13277 
13278 
13279      -- R12B
13280      -- Get Route Id
13281      GetRouteId
13282      (  p_item_type         => p_item_type
13283      ,  p_item_key          => p_item_key
13284      ,  x_route_id          => l_route_id
13285      ) ;
13286 
13287      -- Get Change Object Identifier
13288      GetChangeLineObject
13289      (   p_item_type         => p_item_type
13290       ,  p_item_key          => p_item_key
13291       ,  x_change_line_id    => l_change_line_id
13292      ) ;
13293 
13294 
13295      l_notification_id :=p_notification_id;
13296      l_comment :=  WF_ENGINE.context_user_comment;
13297 
13298 
13299 IF g_debug_flag THEN
13300    Write_Debug('Route Step id ' || to_char(l_step_id));
13301    Write_Debug('Route p_item_type ' || p_item_type);
13302    Write_Debug('Route p_item_key ' || p_item_key);
13303    Write_Debug('Route new role ' || WF_ENGINE.context_new_role);
13304    Write_Debug('Change Id ' || to_char(l_change_id));
13305 END IF ;
13306 
13307 
13308      SELECT person_id into l_new_party_id
13309      FROM   ENG_SECURITY_PEOPLE_V
13310      WHERE  user_name = WF_ENGINE.context_new_role;
13311 
13312 IF g_debug_flag THEN
13313    Write_Debug('Route NEW Party id to whom NTF is being transfered or reassigned: ' || to_char(l_new_party_id));
13314 END IF ;
13315 
13316      IF (p_reassign_mode = G_WF_TRANSFER)
13317      THEN
13318          l_response_code := G_RT_TRANSFERRED ;
13319 
13320      ELSIF (p_reassign_mode=G_WF_FORWARD)
13321      THEN
13322         l_response_code := G_RT_FORWARDED ;
13323      END IF;
13324 
13325 
13326 
13327      FOR rtp_rec  IN c_route_person (  p_step_id => l_step_id
13328                                      , p_notification_id => p_notification_id )
13329      LOOP
13330          l_performer_user_id            := rtp_rec.user_id ;
13331          l_performer_party_id           := rtp_rec.person_id ;
13332          l_route_people_id              := rtp_rec.route_people_id ;
13333          l_adhoc_people_flag            := rtp_rec.adhoc_people_flag ;
13334          l_assignee_type_code           := rtp_rec.assignee_type_code ;
13335          l_original_assignee_id         := rtp_rec.original_assignee_id ;
13336          l_original_assignee_type_code  := rtp_rec.original_assignee_type_code ;
13337          l_response_condition_code      := rtp_rec.response_condition_code ;
13338 
13339 
13340          update ENG_CHANGE_ROUTE_PEOPLE set
13341            WF_NOTIFICATION_ID = p_notification_id,
13342            RESPONSE_CODE = l_response_code ,
13343            RESPONSE_DATE = SYSDATE ,
13344            LAST_UPDATE_DATE = SYSDATE ,
13345            LAST_UPDATED_BY = l_performer_user_id ,
13346            LAST_UPDATE_LOGIN = null
13347          where ROUTE_PEOPLE_ID = l_route_people_id ;
13348 
13349          update ENG_CHANGE_ROUTE_PEOPLE_TL set
13350            RESPONSE_DESCRIPTION = l_comment,
13351            LAST_UPDATE_DATE = SYSDATE ,
13352            LAST_UPDATED_BY = l_performer_user_id ,
13353            LAST_UPDATE_LOGIN = null ,
13354            SOURCE_LANG = userenv('LANG')
13355          where ROUTE_PEOPLE_ID = l_route_people_id ;
13356 
13357 
13358 
13359 
13360          l_default_assignee_resp := Eng_Workflow_Util.G_RT_SUBMITTED ;
13361 
13362          IF ( p_item_type = Eng_Workflow_Util.G_CHANGE_ROUTE_LINE_STEP_TYPE
13363                AND Eng_Workflow_Util.Is_Line_Ntf_WF(p_route_id => l_route_id)
13364              )
13365          THEN
13366 
13367 IF g_debug_flag THEN
13368     Write_Debug('Calling GetStepDefaultRespCode  ' ) ;
13369 END IF ;
13370 
13371               Eng_Workflow_Util.GetStepDefaultRespCode
13372               (  p_step_id  => l_step_id
13373               ,  x_default_resp_code  => l_default_assignee_resp
13374               ) ;
13375 
13376 IF g_debug_flag THEN
13377     Write_Debug('Get Route Assignee Response : ' || l_default_assignee_resp ) ;
13378 END IF ;
13379 
13380          END IF ;
13381 
13382          select ENG_CHANGE_ROUTE_PEOPLE_S.nextval  into l_new_route_people_id from dual;
13383 
13384          Eng_Change_Route_People_Util.INSERT_ROW
13385          (
13386           X_ROWID                     => l_rowid,
13387           X_ROUTE_PEOPLE_ID           => l_new_route_people_id ,
13388           X_STEP_ID                   => l_step_id ,
13389           X_ASSIGNEE_ID               => l_new_party_id,
13390           X_ASSIGNEE_TYPE_CODE        => G_PERSON,
13391           X_ADHOC_PEOPLE_FLAG         => 'Y',
13392           X_WF_NOTIFICATION_ID        => l_notification_id ,
13393           X_RESPONSE_CODE             => l_default_assignee_resp ,
13394           X_RESPONSE_DATE             => TO_DATE(NULL),
13395           X_REQUEST_ID                => NULL,
13396           X_ORIGINAL_SYSTEM_REFERENCE => NULL,
13397           X_RESPONSE_DESCRIPTION      => NULL,
13398           X_CREATION_DATE             => SYSDATE,
13399           X_CREATED_BY                => l_performer_user_id,
13400           X_LAST_UPDATE_DATE          => SYSDATE,
13401           X_LAST_UPDATED_BY           => l_performer_user_id,
13402           X_LAST_UPDATE_LOGIN         => null,
13403           X_PROGRAM_ID                => null,
13404           X_PROGRAM_APPLICATION_ID    => null,
13405           X_PROGRAM_UPDATE_DATE       => null,
13406           X_ORIGINAL_ASSIGNEE_ID      => l_original_assignee_id,
13407           X_ORIGINAL_ASSIGNEE_TYPE_CODE => l_original_assignee_type_code,
13408           X_RESPONSE_CONDITION_CODE   => l_response_condition_code,
13409           X_PARENT_ROUTE_PEOPLE_ID    => l_route_people_id
13410          ) ;
13411 
13412          FOR assoc_rec in c_report_people_assocs(l_route_people_id)
13413          LOOP
13414             SELECT ENG_CHANGE_ROUTE_ASSOCS_S.nextval into l_new_route_assoc_id from DUAL;
13415 
13416             insert into ENG_CHANGE_ROUTE_ASSOCS
13417             (
13418               ROUTE_ASSOCIATION_ID ,
13419               ROUTE_PEOPLE_ID,
13420               ASSOC_OBJECT_NAME,
13421               ASSOC_OBJ_PK1_VALUE,
13422               ADHOC_ASSOC_FLAG,
13423               OBJECT_NAME,
13424               OBJECT_ID1,
13425               CREATION_DATE ,
13426               CREATED_BY ,
13427               LAST_UPDATE_DATE ,
13428               LAST_UPDATED_BY ,
13429               LAST_UPDATE_LOGIN
13430             )
13431             values
13432             (
13433               l_new_route_assoc_id,
13434                l_new_route_people_id,
13435                assoc_rec.ASSOC_OBJECT_NAME,
13436                assoc_rec.ASSOC_OBJ_PK1_VALUE,
13437                'Y',
13438                assoc_rec.OBJECT_NAME,
13439                assoc_rec.OBJECT_ID1,
13440                SYSDATE,
13441                l_performer_user_id,
13442                SYSDATE,
13443                l_performer_user_id,
13444                l_performer_user_id
13445              );
13446 
13447           END LOOP;
13448       END LOOP;
13449 
13450 
13451     -- R12B
13452     -- CreateAction API will take care of inserting the action
13453     -- properly for Line Workflow too.
13454     IF l_change_id IS NOT NULL AND l_change_id > 0
13455     THEN
13456         l_action_type := Eng_Workflow_Util.ConvertRouteStatusToActionType
13457                          ( p_route_status_code =>  l_response_code
13458                          , p_convert_type      =>  'RESPONSE' ) ;
13459 
13460          -- Record Action
13461          Eng_Workflow_Util.CreateAction
13462          ( x_return_status         =>  l_return_status
13463          , x_msg_count             =>  l_msg_count
13464          , x_msg_data              =>  l_msg_data
13465          , p_item_type             =>  p_item_type
13466          , p_item_key              =>  p_item_key
13467          , p_notification_id       =>  p_notification_id
13468          , p_action_type           =>  l_action_type
13469          , p_comment               =>  l_comment
13470          , x_action_id             =>  l_created_action_id
13471          , p_assignee_id           =>  l_new_party_id
13472          ) ;
13473 
13474 
13475         IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
13476 
13477             x_return_status  :=   l_return_status ;
13478             x_msg_count      :=   l_msg_count ;
13479             x_msg_data       :=   l_msg_data ;
13480         END IF ;
13481 
13482     END IF ; -- changeId is not null
13483 
13484 
13485     --
13486     -- R12B
13487     --  Grant Object Roles for this new assignee
13488     IF (    p_item_type = Eng_Workflow_Util.G_CHANGE_ROUTE_STEP_ITEM_TYPE
13489             OR p_item_type = Eng_Workflow_Util.G_CHANGE_ROUTE_DOC_STEP_TYPE
13490             OR p_item_type = Eng_Workflow_Util.G_CHANGE_ROUTE_LINE_STEP_TYPE
13491           )
13492     THEN
13493 
13494 
13495         l_obj_index := 0 ;
13496         l_person_idx := 0 ;
13497 
13498         IF ( p_item_type = Eng_Workflow_Util.G_CHANGE_ROUTE_DOC_STEP_TYPE )
13499         THEN
13500             l_target_obj_tbl := FND_TABLE_OF_VARCHAR2_30();
13501             l_target_obj_tbl.EXTEND ;
13502             l_obj_index := l_obj_index + 1 ;
13503             l_target_obj_tbl(l_obj_index) := G_DOM_DOCUMENT_REVISION ;
13504         END IF ;
13505 
13506 
13507         l_person_id_tbl := FND_TABLE_OF_NUMBER();
13508         l_person_id_tbl.EXTEND ;
13509         l_person_idx := l_person_idx + 1 ;
13510         l_person_id_tbl(l_person_idx) := l_new_party_id ;
13511 
13512 
13513 IF g_debug_flag THEN
13514     Write_Debug('Calling Eng_Workflow_Util.GrantObjectRoles for transfer assignee: ' || l_new_party_id );
13515 END IF ;
13516 
13517         Eng_Workflow_Util.GrantObjectRoles
13518         (   p_api_version               => 1.0
13519          ,  p_init_msg_list             => FND_API.G_FALSE        --
13520          ,  p_commit                    => FND_API.G_FALSE        --
13521          ,  p_validation_level          => FND_API.G_VALID_LEVEL_FULL
13522          ,  p_debug                     => FND_API.G_FALSE
13523          ,  p_output_dir                => NULL
13524          ,  p_debug_filename            => NULL
13525          ,  x_return_status             => l_return_status
13526          ,  x_msg_count                 => l_msg_count
13527          ,  x_msg_data                  => l_msg_data
13528          ,  p_change_id                 => l_change_id
13529          ,  p_change_line_id            => l_change_line_id
13530          ,  p_route_id                  => l_route_id
13531          ,  p_step_id                   => l_step_id
13532          ,  p_person_ids                => l_person_id_tbl
13533          ,  p_target_objects            => l_target_obj_tbl
13534          ,  p_api_caller                => G_WF_CALL
13535          ,  p_grant_option              => NULL
13536         ) ;
13537 
13538 IF g_debug_flag THEN
13539     Write_Debug('After Eng_Workflow_Util.GrantObjectRoles: ' || l_return_status );
13540 END IF ;
13541 
13542        --
13543        -- IF l_return_status <> FND_API.G_RET_STS_SUCCESS
13544        -- THEN
13545        --     RAISE FND_API.G_EXC_ERROR ;
13546        -- END IF ;
13547     END IF ;
13548 
13549 EXCEPTION
13550    WHEN FND_API.G_EXC_ERROR THEN
13551        ROLLBACK TO AbortWorkflow_Util ;
13552        x_return_status := FND_API.G_RET_STS_ERROR ;
13553 
13554        FND_MSG_PUB.Count_And_Get
13555         (   p_count  =>      x_msg_count
13556          ,  p_data   =>      x_msg_data
13557         );
13558 END reassignRoutePeople;
13559 
13560 
13561 --
13562 --  R12B
13563 --  API name   : GrantObjectRoles
13564 --  Type       : Private
13565 --  Pre-reqs   : None.
13566 --  Function   : Grant Change Header/Line Subject Object Roles
13567 --               and OFO Roles on Attachment for Header/Line to WF Assignees
13568 --  Parameters :
13569 --              x_return_status           OUT VARCHAR2
13570 --              x_msg_count               OUT NUMBER
13571 --              x_msg_data                OUT VARCHAR2
13572 --
13573 PROCEDURE GrantObjectRoles
13574 (   p_api_version               IN   NUMBER
13575  ,  p_init_msg_list             IN   VARCHAR2 := FND_API.G_FALSE
13576  ,  p_commit                    IN   VARCHAR2 := FND_API.G_FALSE
13577  ,  p_validation_level          IN   NUMBER   := FND_API.G_VALID_LEVEL_FULL
13578  ,  p_debug                     IN   VARCHAR2 := FND_API.G_FALSE
13579  ,  p_output_dir                IN   VARCHAR2 := NULL
13580  ,  p_debug_filename            IN   VARCHAR2 := NULL
13581  ,  x_return_status             OUT  NOCOPY  VARCHAR2
13582  ,  x_msg_count                 OUT  NOCOPY  NUMBER
13583  ,  x_msg_data                  OUT  NOCOPY  VARCHAR2
13584  ,  p_change_id                 IN   NUMBER
13585  ,  p_change_line_id            IN   NUMBER
13586  ,  p_route_id                  IN   NUMBER
13587  ,  p_step_id                   IN   NUMBER
13588  ,  p_person_ids                IN   FND_TABLE_OF_NUMBER       := NULL
13589  ,  p_target_objects            IN   FND_TABLE_OF_VARCHAR2_30  := NULL
13590  ,  p_api_caller                IN   VARCHAR2  := NULL
13591  ,  p_grant_option              IN   VARCHAR2  := NULL                   -- Optionnal
13592 )
13593 IS
13594 
13595     l_api_name                  CONSTANT VARCHAR2(30) := 'GrantObjectRoles';
13596     l_api_version               CONSTANT NUMBER       := 1.0;
13597 
13598     l_msg_count                 NUMBER ;
13599     l_msg_data                  VARCHAR2(2000) ;
13600     l_return_status             VARCHAR2(1) ;
13601 
13602     l_document_role_id          NUMBER ;
13603     l_ocs_role                  VARCHAR2(250) ;
13604 
13605     l_change_id                 NUMBER ;
13606     l_change_line_id            NUMBER ;
13607     l_document_id               NUMBER ;
13608     l_document_revision_id      NUMBER ;
13609 
13610     l_target_object_tbl         FND_TABLE_OF_VARCHAR2_30 ;
13611     l_obj_idx                   PLS_INTEGER ;
13612 
13613     l_doc_rev_person_id_tbl     FND_TABLE_OF_NUMBER ;
13614     l_doc_rev_person_idx        PLS_INTEGER ;
13615     l_ocs_person_id_tbl         FND_TABLE_OF_NUMBER ;
13616     l_ocs_person_idx            PLS_INTEGER ;
13617 
13618     l_doc_rev_grant_flag        BOOLEAN ;
13619     l_ocs_grant_flag            BOOLEAN ;
13620 
13621     l_attachment_entity_name    VARCHAR2(40) ;
13622     l_attachment_pk1value       VARCHAR2(100) ;
13623 
13624     l_base_cm_type_code        VARCHAR2(40);
13625     l_attachment_ids           FND_TABLE_OF_NUMBER;
13626     l_repository_ids           FND_TABLE_OF_NUMBER;
13627     l_source_mdedia_ids        FND_TABLE_OF_NUMBER;
13628     l_sumitted_by              NUMBER;
13629 
13630 
13631     CURSOR  c_step_assignees ( c_step_id   NUMBER )
13632     IS
13633         SELECT   RoutePeople.STEP_ID
13634                , RoutePeople.ASSIGNEE_ID
13635                , RoutePeople.ASSIGNEE_TYPE_CODE
13636                , RoutePeople.ADHOC_PEOPLE_FLAG
13637                , RoutePeople.ORIGINAL_ASSIGNEE_ID
13638                , RoutePeople.ORIGINAL_ASSIGNEE_TYPE_CODE
13639                , RoutePeople.RESPONSE_CONDITION_CODE
13640                , TO_CHAR(NULL)     ORIG_ROLE_OBJECT_NAME
13641                , TO_NUMBER(NULL)   ORIG_ROLE_OBJECT_ID
13642         FROM ENG_CHANGE_ROUTE_PEOPLE RoutePeople
13643         WHERE RoutePeople.ASSIGNEE_TYPE_CODE = 'PERSON'
13644         AND RoutePeople.ASSIGNEE_ID <> -1
13645         AND RoutePeople.ORIGINAL_ASSIGNEE_TYPE_CODE <> 'ROLE'
13646         AND ( RoutePeople.RESPONSE_CODE IS  NULL
13647              OR RoutePeople.RESPONSE_CODE = G_RT_NOT_RECEIVED
13648              OR RoutePeople.RESPONSE_CODE = G_RT_SUBMITTED
13649             )
13650         AND RoutePeople.STEP_ID = c_step_id
13651         UNION ALL
13652         SELECT   RoutePeople.STEP_ID
13653                , RoutePeople.ASSIGNEE_ID
13654                , RoutePeople.ASSIGNEE_TYPE_CODE
13655                , RoutePeople.ADHOC_PEOPLE_FLAG
13656                , RoutePeople.ORIGINAL_ASSIGNEE_ID
13657                , RoutePeople.ORIGINAL_ASSIGNEE_TYPE_CODE
13658                , RoutePeople.RESPONSE_CONDITION_CODE
13659                , fnd_obj.OBJ_NAME ORIG_ROLE_OBJECT_NAME
13660                , fnd_obj.OBJECT_ID ORIG_ROLE_OBJECT_ID
13661         FROM FND_FORM_FUNCTIONS fnd_func
13662            , FND_MENU_ENTRIES fnd_menu
13663            , FND_OBJECTS fnd_obj
13664            , ENG_CHANGE_ROUTE_PEOPLE RoutePeople
13665         WHERE fnd_obj.OBJECT_ID = fnd_func.OBJECT_ID
13666         AND fnd_func.FUNCTION_ID = fnd_menu.FUNCTION_ID
13667         AND fnd_menu.MENU_ID = ORIGINAL_ASSIGNEE_ID
13668         AND ( RoutePeople.RESPONSE_CODE IS  NULL
13669              OR RoutePeople.RESPONSE_CODE = G_RT_NOT_RECEIVED
13670              OR RoutePeople.RESPONSE_CODE = G_RT_SUBMITTED
13671             )
13672         AND RoutePeople.ASSIGNEE_TYPE_CODE = 'PERSON'
13673         AND RoutePeople.ASSIGNEE_ID <> -1
13674         AND RoutePeople.ORIGINAL_ASSIGNEE_TYPE_CODE = 'ROLE'
13675         AND RoutePeople.STEP_ID = c_step_id  ;
13676 
13677 
13678 
13679     -- Future, this SQL should be dynmic SQL
13680     CURSOR  c_chg_objects ( c_change_id   NUMBER, c_change_line_id NUMBER)
13681     IS
13682         SELECT ChangeSubj.ENTITY_NAME CHANGE_OBJECT_NAME
13683              , ChangeSubj.PK1_VALUE
13684              , ChangeSubj.PK2_VALUE
13685              , ChangeSubj.PK3_VALUE
13686              , ChangeSubj.PK4_VALUE
13687              , ChangeSubj.PK5_VALUE
13688              , ChangeSubj.CHANGE_ID
13689              , ChangeSubj.CHANGE_LINE_ID
13690         FROM ENG_CHANGE_SUBJECTS ChangeSubj
13691           ,  FND_OBJECTS FndObj
13692         WHERE  ChangeSubj.ENTITY_NAME = FndObj.OBJ_NAME
13693         AND  ChangeSubj.CHANGE_ID = c_change_id
13694         AND  ( ChangeSubj.CHANGE_LINE_ID = c_change_line_id
13695                OR (ChangeSubj.CHANGE_LINE_ID IS NULL
13696                    AND c_change_line_id = -1)
13697               )
13698         AND FndObj.OBJ_NAME = G_DOM_DOCUMENT_REVISION ; -- R12B We only support G_DOM_DOCUMENT_REVISION
13699 
13700         -- For future, if we need to support Item Role in this approach too.
13701         -- For now, comment out
13702         --
13703         -- UNION
13704         -- SELECT 'EGO_ITEM' CHANGE_OBJECT_NAME
13705         --      , ChangeCompSubj.PK1_VALUE
13706         --      , ChangeCompSubj.PK2_VALUE
13707         --      , ChangeCompSubj.PK3_VALUE
13708         --      , ChangeCompSubj.PK4_VALUE
13709         --      , ChangeCompSubj.PK5_VALUE
13710         --  , ChangeCompSubj.CHANGE_ID
13711         --  , ChangeCompSubj.CHANGE_LINE_ID
13712         --  FROM ENG_CHANGE_SUBJECTS ChangeCompSubj
13713         --  WHERE ChangeCompSubj.ENTITY_NAME = 'EGO_COMPONENT'
13714         --  AND ChangeCompSubj.CHANGE_ID = :c_change_id
13715         --  AND  ( ChangeCompSubj.CHANGE_LINE_ID = :c_change_line_id
13716         --        OR ( ChangeCompSubj.CHANGE_LINE_ID IS NULL
13717         --            AND :c_change_line_id = -1)
13718         --       ) ) WHERE CHANGE_OBJECT_NAME IN ('EGO_ITEM') ;
13719         --
13720 
13721 
13722 BEGIN
13723     -- Standard Start of API savepoint
13724     SAVEPOINT GrantObjectRoles;
13725 
13726     -- Standard call to check for call compatibility.
13727     IF NOT FND_API.Compatible_API_Call(  l_api_version
13728                                        , p_api_version
13729                                        , l_api_name
13730                                        , G_PKG_NAME )
13731     THEN
13732         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
13733     END IF;
13734 
13735     -- Initialize message list if p_init_msg_list is set to TRUE.
13736     IF FND_API.to_Boolean( p_init_msg_list ) THEN
13737        FND_MSG_PUB.initialize;
13738     END IF ;
13739 
13740 
13741     -- For Test/Debug
13742     IF FND_API.to_Boolean( p_debug ) THEN
13743         Open_Debug_Session(p_output_dir, p_debug_filename ) ;
13744     END IF ;
13745 
13746 
13747 IF g_debug_flag THEN
13748    Write_Debug('Eng_Workflow_Util.GrantObjectRoles Log');
13749    Write_Debug('-----------------------------------------------------');
13750    Write_Debug('Change Id          : ' || TO_CHAR(p_change_id) );
13751    Write_Debug('Change Line Id     : ' || TO_CHAR(p_change_line_id) );
13752    Write_Debug('Route Id           : ' || TO_CHAR(p_route_id));
13753    Write_Debug('Step Id            : ' || TO_CHAR(p_step_id));
13754    Write_Debug('API Caller         : ' || p_api_caller);
13755    Write_Debug('Grant Option       : ' || p_grant_option);
13756    Write_Debug('-----------------------------------------------------');
13757    Write_Debug('Initialize return status ' );
13758 END IF ;
13759 
13760     --  Initialize API return status to success
13761     x_return_status := FND_API.G_RET_STS_SUCCESS;
13762     l_return_status := FND_API.G_RET_STS_SUCCESS;
13763 
13764     l_target_object_tbl := FND_TABLE_OF_VARCHAR2_30() ;
13765     l_obj_idx           := 0 ;
13766 
13767     l_doc_rev_person_id_tbl := FND_TABLE_OF_NUMBER() ;
13768     l_doc_rev_person_idx    := 0 ;
13769     l_ocs_person_id_tbl     := FND_TABLE_OF_NUMBER() ;
13770     l_ocs_person_idx        := 0 ;
13771 
13772     l_change_id         := p_change_id ;
13773     l_change_line_id    := p_change_line_id ;
13774 
13775 
13776 
13777 IF g_debug_flag THEN
13778    Write_Debug('Check Attachment Entity . . .');
13779    Write_Debug('Doc Role Id          : ' || TO_CHAR(l_document_role_id) );
13780    Write_Debug('File, OCS Role        : ' || l_ocs_role);
13781 END IF ;
13782 
13783 
13784     IF l_change_line_id IS NULL OR l_change_line_id <= 0
13785     THEN
13786         l_change_line_id := -1 ;
13787 
13788         l_attachment_entity_name    :=  'ENG_ENGINEERING_CHANGES' ;
13789         l_attachment_pk1value       :=  TO_CHAR(l_change_id) ;
13790         l_base_cm_type_code := GetBaseChangeMgmtTypeCode(p_change_id);
13791 
13792     ELSE
13793 
13794         l_attachment_entity_name    :=  'ENG_CHANGE_LINES' ;
13795         l_attachment_pk1value       :=  TO_CHAR(l_change_line_id) ;
13796 
13797     END IF ;
13798 
13799 
13800 IF g_debug_flag THEN
13801    Write_Debug('Attachment Entity     : ' || l_attachment_entity_name );
13802    Write_Debug('Attachment PK1Value   : ' || l_attachment_pk1value );
13803 END IF ;
13804 
13805 
13806     l_ocs_grant_flag      := FALSE  ;
13807     l_doc_rev_grant_flag  := FALSE  ;
13808 
13809     -----------------------------------------------------------------
13810     -- API body
13811     -----------------------------------------------------------------
13812 
13813 IF g_debug_flag THEN
13814    Write_Debug('1. Check p_target_objects parameter. . .   '  );
13815 END IF ;
13816 
13817     --
13818     -- 1. Check p_target_objects parameter
13819     -- If, it's NOT null, we don't need to check Change Header and Line Subject
13820     -- Otherwise, we will query the Change Header or Line Subjects and get Subject Objects
13821     -- plus OCS File. Construct local target objects tables
13822     --
13823     -- Note: IN R12B, anyway we support only DOM_DOCUMENT_REVISION and OCS File
13824     --
13825     IF ( p_target_objects IS NOT NULL AND p_target_objects.count > 0 )
13826     THEN
13827         FOR i in p_target_objects.first .. p_target_objects.last
13828         LOOP
13829             l_target_object_tbl.EXTEND ;
13830             l_obj_idx := l_obj_idx + 1;
13831             l_target_object_tbl(l_obj_idx):=p_target_objects(i) ;
13832 
13833             IF (G_OCS_FILE = p_target_objects(i))
13834             THEN
13835                 l_ocs_grant_flag      := TRUE  ;
13836 
13837 IF g_debug_flag THEN
13838    Write_Debug(' OCS Grant Flag True . . .   '  );
13839 END IF ;
13840 
13841             ELSIF (G_DOM_DOCUMENT_REVISION = p_target_objects(i))
13842             THEN
13843                 l_doc_rev_grant_flag  := TRUE  ;
13844 
13845 IF g_debug_flag THEN
13846    Write_Debug(' DCO Rev  Grant Flag True . . .   '  );
13847 END IF ;
13848             END IF ;
13849 
13850         END LOOP;
13851 
13852 
13853     ELSE
13854         --
13855         -- By Default we support the following objects in R12B
13856         --
13857 IF g_debug_flag THEN
13858    Write_Debug(' Target Object is Null. By Default we support the following objects. . .   '  );
13859 END IF ;
13860 
13861         -- OCS Files
13862         l_target_object_tbl.EXTEND ;
13863         l_obj_idx := l_obj_idx + 1;
13864         l_target_object_tbl(l_obj_idx) := G_OCS_FILE ;
13865         l_ocs_grant_flag      := TRUE  ;
13866 
13867 IF g_debug_flag THEN
13868    Write_Debug(' OCS Grant Flag True . . .   '  );
13869 END IF ;
13870 
13871         -- G_DOM_DOCUMENT_REVISION
13872         l_target_object_tbl.EXTEND ;
13873         l_obj_idx := l_obj_idx + 1;
13874         l_target_object_tbl(l_obj_idx) := G_DOM_DOCUMENT_REVISION;
13875         l_doc_rev_grant_flag  := TRUE  ;
13876 
13877 IF g_debug_flag THEN
13878    Write_Debug(' DCO Rev  Grant Flag True . . .   '  );
13879 END IF ;
13880 
13881 
13882     END IF ;
13883 
13884     --
13885     -- 2. Get Auto Grants Roles specified in Workflow Definition
13886     --
13887     -- Note: IN R12B, anyway we support only DOM_DOCUMENT_REVISION and OCS File
13888     --
13889     --
13890     -- Get Step Activity Attributes for Auto Grants
13891     GetStepAutoGranatRoles
13892     ( p_step_id                => p_step_id
13893     , x_document_role_id       => l_document_role_id
13894     , x_ocs_role               => l_ocs_role ) ;
13895 
13896 
13897 IF g_debug_flag THEN
13898    Write_Debug('Get Auto Grants Roles specified in Workflow Definition. . .');
13899    Write_Debug('Doc Role Id          : ' || TO_CHAR(l_document_role_id) );
13900    Write_Debug('File, OCS Role       : ' || l_ocs_role);
13901 END IF ;
13902 
13903     IF (l_document_role_id IS NULL AND l_ocs_role IS NULL )
13904     THEN
13905 
13906 IF g_debug_flag THEN
13907    Write_Debug('Any Roles for Auto Grants are not specified for this step process. Return.');
13908 END IF ;
13909         RETURN ;
13910 
13911     END IF ;
13912 
13913     --
13914     -- 3. Check p_person_ids  parameter
13915     -- If, it's NOT null, we don't need to query assignees under given p_step_id
13916     -- Otherwise, we will query Workflow Step Assignees and construct person ids table
13917     --
13918     IF ( p_person_ids IS NOT NULL AND p_person_ids.count > 0 )
13919     THEN
13920 
13921         FOR j in p_person_ids.first .. p_person_ids.last
13922         LOOP
13923             l_doc_rev_person_id_tbl.EXTEND ;
13924             l_doc_rev_person_idx := l_doc_rev_person_idx + 1;
13925             l_doc_rev_person_id_tbl(l_doc_rev_person_idx) := p_person_ids(j) ;
13926 
13927             l_ocs_person_id_tbl.EXTEND ;
13928             l_ocs_person_idx := l_ocs_person_idx + 1;
13929             l_ocs_person_id_tbl(l_ocs_person_idx) := p_person_ids(j) ;
13930 
13931         END LOOP;
13932 
13933     ELSE
13934 
13935         FOR rtp_rec  IN c_step_assignees (c_step_id => p_step_id )
13936         LOOP
13937 
13938             --
13939             -- Exclude the assignees derivded from DOM_DOUCMENT_REVISION Role
13940             --
13941             IF ( rtp_rec.orig_role_object_name  IS NULL
13942                  OR rtp_rec.orig_role_object_name <> G_DOM_DOCUMENT_REVISION
13943                 )
13944             THEN
13945 
13946                 l_doc_rev_person_id_tbl.EXTEND ;
13947                 l_doc_rev_person_idx := l_doc_rev_person_idx + 1;
13948                 l_doc_rev_person_id_tbl(l_doc_rev_person_idx) := rtp_rec.assignee_id ;
13949 
13950             END IF ;
13951 
13952             l_ocs_person_id_tbl.EXTEND ;
13953             l_ocs_person_idx := l_ocs_person_idx + 1;
13954             l_ocs_person_id_tbl(l_ocs_person_idx) := rtp_rec.assignee_id ;
13955 
13956         END LOOP ;
13957 
13958     END IF ;
13959 
13960     IF (l_doc_rev_grant_flag)
13961     THEN
13962 
13963         --
13964         -- 4. Execute Query for Change Subject by given change id and change line id
13965         --    and iterlate the fetched row.
13966         --    Call insdividual API to grant the objects to assignees.
13967         --
13968         -- Note: IN R12B, anyway we support only DOM_DOCUMENT_REVISION and OCS File
13969         --
13970 
13971 
13972 
13973         FOR c_chg_objects_rec  IN c_chg_objects (  c_change_id => l_change_id
13974                                                 ,  c_change_line_id => l_change_line_id
13975                                                 )
13976         LOOP
13977             IF ( G_DOM_DOCUMENT_REVISION = c_chg_objects_rec.CHANGE_OBJECT_NAME
13978                  AND l_document_role_id IS NOT NULL
13979                  AND (l_doc_rev_person_id_tbl IS NOT NULL AND l_doc_rev_person_id_tbl.count > 0)
13980                )
13981             THEN
13982 
13983                 -- MK Comment Need to verify this PK1 is Revision Id or not
13984                 l_document_id          := TO_NUMBER(c_chg_objects_rec.PK1_VALUE) ;
13985                 l_document_revision_id := TO_NUMBER(c_chg_objects_rec.PK2_VALUE) ;
13986 
13987 
13988 IF g_debug_flag THEN
13989     Write_Debug('Calling ENG_DOCUMENT_UTIL.Grant_Document_Role. . .' );
13990 END IF ;
13991 
13992 
13993                 ENG_DOCUMENT_UTIL.Grant_Document_Role
13994                 (   p_api_version               => 1.0
13995                  ,  p_init_msg_list             => FND_API.G_FALSE        --
13996                  ,  p_commit                    => FND_API.G_FALSE        --
13997                  ,  p_validation_level          => FND_API.G_VALID_LEVEL_FULL
13998                  ,  p_debug                     => p_debug
13999                  ,  p_output_dir                => p_output_dir
14000                  ,  p_debug_filename            => p_debug_filename
14001                  ,  x_return_status             => l_return_status
14002                  ,  x_msg_count                 => l_msg_count
14003                  ,  x_msg_data                  => l_msg_data
14004                  ,  p_document_id               => l_document_id               -- Dom Document Id
14005                  ,  p_document_revision_id      => l_document_revision_id      -- Dom Document Revision Id
14006                  ,  p_change_id                 => l_change_id                 -- Change Id
14007                  ,  p_change_line_id            => l_change_line_id            -- Change Line Id
14008                  ,  p_party_ids                 => l_doc_rev_person_id_tbl     -- Person's HZ_PARTIES.PARTY_ID Array
14009                  ,  p_role_id                   => l_document_role_id          -- Role Id to be granted
14010                  ,  p_api_caller                => p_api_caller                -- Optionnal for future use
14011                 ) ;
14012 
14013 
14014 IF g_debug_flag THEN
14015     Write_Debug('After calling ENG_DOCUMENT_UTIL.Grant_Document_Role: ' || l_return_status );
14016 END IF ;
14017 
14018                  --
14019                  -- IF l_return_status <> FND_API.G_RET_STS_SUCCESS
14020                  -- THEN
14021                  --     RAISE FND_API.G_EXC_ERROR ;
14022                  -- END IF ;
14023                  --
14024 
14025             END IF ;
14026         END LOOP ;
14027 
14028 
14029     END IF ; -- (l_doc_rev_grant_flag IS TRUE)
14030 
14031     --
14032     -- 5. Call ENG_DOCUMENT_UTIL.Grant_Attachments_OCSRole
14033     --    to grant roles on Attachments
14034     --
14035 
14036 
14037     IF ( l_ocs_grant_flag
14038          AND  l_ocs_role IS NOT NULL
14039          AND (l_ocs_person_id_tbl IS NOT NULL AND l_ocs_person_id_tbl.count > 0)
14040        )
14041     THEN
14042 
14043 IF g_debug_flag THEN
14044     Write_Debug('Calling ENG_DOCUMENT_UTIL.Grant_Attachments_OCSRole. . .' );
14045 
14046 END IF ;
14047      if (l_base_cm_type_code is not null
14048      and l_base_cm_type_code in ('ATTACHMENT_APPROVAL','ATTACHMENT_REVIEW') )
14049      then
14050          GetAttachmentChangeDetails(  p_change_id  => l_attachment_pk1value
14051                      , x_source_media_id_tbl           => l_source_mdedia_ids
14052                      , x_attached_document_id_tbl      => l_attachment_ids
14053                      , x_repository_id_tbl             => l_repository_ids
14054                      , x_creator_user_id           => l_sumitted_by
14055                     );
14056 
14057      end if;
14058 
14059         ENG_DOCUMENT_UTIL.Grant_Attachments_OCSRole
14060         (   p_api_version               => 1.0
14061          ,  p_init_msg_list             => FND_API.G_FALSE        --
14062          ,  p_commit                    => FND_API.G_FALSE        --
14063          ,  p_validation_level          => FND_API.G_VALID_LEVEL_FULL
14064          ,  p_debug                     => p_debug
14065          ,  p_output_dir                => p_output_dir
14066          ,  p_debug_filename            => p_debug_filename
14067          ,  x_return_status             => l_return_status
14068          ,  x_msg_count                 => l_msg_count
14069          ,  x_msg_data                  => l_msg_data
14070          ,  p_entity_name               => l_attachment_entity_name    -- ENG_ENGINEERING_CHANGES or ENG_CHANGE_LINES
14071          ,  p_pk1value                  => l_attachment_pk1value       -- CHANGE_ID or CHANGE_LINE_ID
14072          ,  p_pk2value                  => NULL
14073          ,  p_pk3value                  => NULL
14074          ,  p_pk4value                  => NULL
14075          ,  p_pk5value                  => NULL
14076          ,  p_party_ids                 => l_ocs_person_id_tbl         -- Person's HZ_PARTIES.PARTY_ID Array
14077          ,  p_ocs_role                  => l_ocs_role                  -- OCS Role to be granted
14078          ,  p_source_media_id_tbl           => l_source_mdedia_ids
14079          ,  p_attachment_id_tbl             => l_attachment_ids
14080          ,  p_repository_id_tbl             => l_repository_ids
14081          ,  p_submitted_by              => l_sumitted_by
14082          ,  p_api_caller                => p_api_caller                -- Optionnal for future use
14083         ) ;
14084 
14085 
14086 
14087 IF g_debug_flag THEN
14088     Write_Debug('After ENG_DOCUMENT_UTIL.Grant_Attachments_OCSRole: ' || l_return_status );
14089 END IF ;
14090 
14091        --
14092        -- IF l_return_status <> FND_API.G_RET_STS_SUCCESS
14093        -- THEN
14094        --     RAISE FND_API.G_EXC_ERROR ;
14095        -- END IF ;
14096        --
14097 
14098 
14099     END IF ;
14100 
14101 
14102 
14103 IF g_debug_flag THEN
14104    Write_Debug('After executing GrantObjectRoles API Body') ;
14105 END IF ;
14106 
14107 
14108    -- Standard check of p_commit.
14109    IF FND_API.To_Boolean( p_commit ) THEN
14110 
14111 IF g_debug_flag THEN
14112    Write_Debug('Do Commit.') ;
14113 END IF ;
14114 
14115       COMMIT WORK;
14116 
14117    END IF;
14118 
14119    -- Standard call to get message count and if count is 1, get message info.
14120    FND_MSG_PUB.Count_And_Get
14121       (  p_count  => x_msg_count
14122       ,  p_data   => x_msg_data
14123       );
14124 
14125 IF g_debug_flag THEN
14126    Write_Debug('Finish. Eng Of Proc') ;
14127    Close_Debug_Session ;
14128 END IF ;
14129 
14130 
14131 EXCEPTION
14132    WHEN FND_API.G_EXC_ERROR THEN
14133 
14134        -- Standard check of p_commit.
14135        IF FND_API.To_Boolean( p_commit )
14136        THEN
14137          ROLLBACK TO GrantObjectRoles ;
14138        END IF ;
14139        x_return_status := FND_API.G_RET_STS_ERROR ;
14140 
14141        FND_MSG_PUB.Count_And_Get
14142         (   p_count  =>      x_msg_count
14143          ,  p_data   =>      x_msg_data
14144         );
14145 
14146 IF g_debug_flag THEN
14147    Write_Debug('Finish with Error.') ;
14148    Close_Debug_Session ;
14149 END IF ;
14150 
14151    WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
14152        -- Standard check of p_commit.
14153        IF FND_API.To_Boolean( p_commit )
14154        THEN
14155          ROLLBACK TO GrantObjectRoles ;
14156 IF g_debug_flag THEN
14157    Write_Debug('Rollback. . . ' );
14158 END IF ;
14159 
14160        END IF ;
14161 
14162        x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
14163 
14164        FND_MSG_PUB.Count_And_Get
14165         (   p_count  =>      x_msg_count
14166          ,  p_data   =>      x_msg_data
14167         );
14168 
14169 IF g_debug_flag THEN
14170    Write_Debug('Finish with unxepcted error.') ;
14171    Close_Debug_Session ;
14172 END IF ;
14173 
14174    WHEN OTHERS THEN
14175        -- Standard check of p_commit.
14176        IF FND_API.To_Boolean( p_commit )
14177        THEN
14178          ROLLBACK TO GrantObjectRoles ;
14179 
14180 IF g_debug_flag THEN
14181    Write_Debug('Rollback. . . ' );
14182 END IF ;
14183 
14184        END IF ;
14185        x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
14186 
14187        FND_MSG_PUB.Count_And_Get
14188         (   p_count  =>      x_msg_count
14189          ,  p_data   =>      x_msg_data
14190         );
14191 
14192        IF  FND_MSG_PUB.Check_Msg_Level
14193           (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
14194        THEN
14195             FND_MSG_PUB.Add_Exc_Msg
14196               ( G_PKG_NAME
14197               , l_api_name
14198               );
14199        END IF;
14200 
14201        FND_MSG_PUB.Count_And_Get
14202         (   p_count  =>      x_msg_count
14203          ,  p_data   =>      x_msg_data
14204         );
14205 
14206 IF g_debug_flag THEN
14207    Write_Debug('Finish with system unxepcted error: '
14208                || Substr(To_Char(SQLCODE)||'/'||SQLERRM,1,240));
14209    Close_Debug_Session ;
14210 END IF ;
14211 
14212 
14213 END GrantObjectRoles ;
14214 
14215 
14216 --
14217 --  R12B
14218 --  API name   : RevokeObjectRoles
14219 --  Type       : Private
14220 --  Pre-reqs   : None.
14221 --  Function   : Revoke Change Header/Line Subject Object Roles
14222 --               and OFO Roles on Attachment for Header/Line from WF Assignees
14223 --               This API is mainly called when Chagne Object or Change Line is cancelled.
14224 --  Parameters :
14225 --              x_return_status           OUT VARCHAR2
14226 --              x_msg_count               OUT NUMBER
14227 --              x_msg_data                OUT VARCHAR2
14228 --
14229 --              p_revoke_option   G_REVOKE_ALL will reovked object roles for Header and Lines
14230 --                                G_REVOKE_HEADER will reovked object roles for Header
14231 --                                G_REVOKE_LINE will reovked object roles for Line
14232 --                                p_revoke_option default G_REVOKE_LINE
14233 --
14234 PROCEDURE RevokeObjectRoles
14235 (   p_api_version               IN   NUMBER                             --
14236  ,  p_init_msg_list             IN   VARCHAR2 := FND_API.G_FALSE        --
14237  ,  p_commit                    IN   VARCHAR2 := FND_API.G_FALSE        --
14238  ,  p_validation_level          IN   NUMBER   := FND_API.G_VALID_LEVEL_FULL
14239  ,  p_debug                     IN   VARCHAR2 := FND_API.G_FALSE        --
14240  ,  p_output_dir                IN   VARCHAR2 := NULL
14241  ,  p_debug_filename            IN   VARCHAR2 := NULL
14242  ,  x_return_status             OUT  NOCOPY  VARCHAR2                   --
14243  ,  x_msg_count                 OUT  NOCOPY  NUMBER                     --
14244  ,  x_msg_data                  OUT  NOCOPY  VARCHAR2                   --
14245  ,  p_change_id                 IN   NUMBER                             -- Change Id
14246  ,  p_change_line_id            IN   NUMBER                             -- Change Line Id
14247  ,  p_person_ids                IN   FND_TABLE_OF_NUMBER       := NULL
14248  ,  p_target_objects            IN   FND_TABLE_OF_VARCHAR2_30  := NULL
14249  ,  p_api_caller                IN   VARCHAR2  := NULL
14250  ,  p_revoke_option             IN   VARCHAR2  := NULL                  -- Optionnal: G_REVOKE_ALL
14251  )
14252  IS
14253       l_msg_count                 NUMBER ;
14254       l_msg_data                  VARCHAR2(2000) ;
14255       l_return_status             VARCHAR2(1) ;
14256 
14257       l_change_id                 NUMBER ;
14258       l_change_line_id            NUMBER ;
14259       l_revoke_option             VARCHAR2(30) ;
14260       l_route_id                  NUMBER ;
14261 
14262 
14263       CURSOR  c_header_routes(c_change_id NUMBER)
14264       IS
14265           SELECT  routes.OBJECT_ID1 CHANGE_ID
14266                 , TO_NUMBER(NULL)   CHANGE_LINE_ID
14267                 , routes.ROUTE_ID
14268           FROM  ENG_CHANGE_ROUTES  routes
14269           WHERE routes.STATUS_CODE IN ( Eng_Workflow_Util.G_RT_REJECTED
14270                                  , Eng_Workflow_Util.G_RT_APPROVED
14271                                  , Eng_Workflow_Util.G_RT_COMPLETED
14272                                  , Eng_Workflow_Util.G_RT_TIME_OUT) -- G_RT_ABORTED was taken care by ABORT WF
14273           AND ( routes.TEMPLATE_FLAG = G_RT_INSTANCE
14274                 OR routes.TEMPLATE_FLAG = G_RT_HISTORY)
14275           AND routes.OBJECT_NAME = G_ENG_CHANGE
14276           AND routes.OBJECT_ID1 = c_change_id ;
14277 
14278 
14279       CURSOR  c_line_routes(c_change_id NUMBER, c_change_line_id NUMBER)
14280       IS
14281           SELECT  chg_line.CHANGE_ID
14282                 , chg_line.CHANGE_LINE_ID
14283                 , line_routes.ROUTE_ID
14284           FROM  ENG_CHANGE_ROUTES  line_routes
14285              ,  ENG_CHANGE_LINES chg_line
14286           WHERE line_routes.STATUS_CODE IN ( Eng_Workflow_Util.G_RT_REJECTED
14287                                  , Eng_Workflow_Util.G_RT_APPROVED
14288                                  , Eng_Workflow_Util.G_RT_COMPLETED
14289                                  , Eng_Workflow_Util.G_RT_TIME_OUT ) -- G_RT_ABORTED was taken care by ABORT WF
14290           AND ( line_routes.TEMPLATE_FLAG = G_RT_INSTANCE
14291                 OR line_routes.TEMPLATE_FLAG = G_RT_HISTORY)
14292           AND line_routes.object_id1 = chg_line.CHANGE_LINE_ID
14293           AND line_routes.OBJECT_NAME = G_ENG_CHANGE_LINE
14294           AND ( chg_line.CHANGE_LINE_ID = c_change_line_id  OR c_change_line_id = -1)
14295           AND chg_line.CHANGE_ID = c_change_id ;
14296 
14297 
14298 
14299   BEGIN
14300 
14301        l_change_id       :=  p_change_id ;
14302        l_change_line_id  :=  p_change_line_id ;
14303 
14304        IF  l_change_line_id IS NULL OR l_change_line_id <= 0
14305        THEN
14306            l_change_line_id := -1 ;
14307        END IF ;
14308 
14309        l_revoke_option := p_revoke_option ;
14310        IF l_revoke_option IS NULL
14311        THEN
14312           l_revoke_option := G_REVOKE_LINE ;
14313        END IF ;
14314 
14315 
14316        IF (l_revoke_option <> G_REVOKE_LINE)
14317        THEN
14318            FOR l_rec  IN c_header_routes (c_change_id => l_change_id )
14319            LOOP
14320                l_route_id := l_rec.ROUTE_ID ;
14321 
14322 IF g_debug_flag THEN
14323     Write_Debug('ENG_DOCUMENT_UTIL.RevokeObjectRoles For Header Route .' || TO_CHAR(l_route_id) );
14324 END IF ;
14325                BEGIN
14326                    RevokeObjectRoles
14327                    (   p_api_version               => p_api_version
14328                     ,  p_init_msg_list             => FND_API.G_FALSE
14329                     ,  p_commit                    => p_commit
14330                     ,  p_validation_level          => p_validation_level
14331                     ,  p_debug                     => p_debug
14332                     ,  p_output_dir                => p_output_dir
14333                     ,  p_debug_filename            => p_debug_filename
14334                     ,  x_return_status             => l_return_status
14335                     ,  x_msg_count                 => l_msg_count
14336                     ,  x_msg_data                  => l_msg_data
14337                     ,  p_change_id                 => p_change_id
14338                     ,  p_change_line_id            => p_change_line_id
14339                     ,  p_route_id                  => l_route_id
14340                     ,  p_person_ids                => p_person_ids
14341                     ,  p_target_objects            => p_target_objects
14342                     ,  p_api_caller                => p_api_caller
14343                     ,  p_revoke_option             => p_revoke_option
14344                     )  ;
14345 
14346 IF g_debug_flag THEN
14347     Write_Debug('After ENG_DOCUMENT_UTIL.RevokeObjectRoles For Header Route.' || l_route_id );
14348 END IF ;
14349                 EXCEPTION
14350                   WHEN OTHERS THEN
14351                      NULL ;
14352                 END ;
14353 
14354                 IF l_return_status <> FND_API.G_RET_STS_SUCCESS
14355                 THEN
14356                     x_return_status := l_return_status ;
14357                     x_msg_count     := l_msg_count ;
14358                     x_msg_data      := l_msg_data ;
14359                     RETURN ;
14360                 END IF ;
14361            END LOOP ;
14362         END IF ; -- (p_revoke_option <> G_REVOKE_LINE)
14363 
14364 
14365        IF  ( l_revoke_option = G_REVOKE_ALL OR l_revoke_option = G_REVOKE_LINE )
14366        THEN
14367 
14368            FOR l_line_rec  IN c_line_routes (c_change_id => l_change_id, c_change_line_id => l_change_line_id )
14369            LOOP
14370                l_route_id := l_line_rec.ROUTE_ID ;
14371 
14372 IF g_debug_flag THEN
14373     Write_Debug('Calling  ENG_DOCUMENT_UTIL.RevokeObjectRoles For Line .Route ' || TO_CHAR(l_route_id) );
14374 END IF ;
14375                BEGIN
14376                    RevokeObjectRoles
14377                    (   p_api_version               => p_api_version
14378                     ,  p_init_msg_list             => FND_API.G_FALSE
14379                     ,  p_commit                    => p_commit
14380                     ,  p_validation_level          => p_validation_level
14381                     ,  p_debug                     => p_debug
14382                     ,  p_output_dir                => p_output_dir
14383                     ,  p_debug_filename            => p_debug_filename
14384                     ,  x_return_status             => l_return_status
14385                     ,  x_msg_count                 => l_msg_count
14386                     ,  x_msg_data                  => l_msg_data
14387                     ,  p_change_id                 => p_change_id
14388                     ,  p_change_line_id            => p_change_line_id
14389                     ,  p_route_id                  => l_route_id
14390                     ,  p_person_ids                => p_person_ids
14391                     ,  p_target_objects            => p_target_objects
14392                     ,  p_api_caller                => p_api_caller
14393                     ,  p_revoke_option             => p_revoke_option
14394                     )  ;
14395 
14396 IF g_debug_flag THEN
14397     Write_Debug('After ENG_DOCUMENT_UTIL.RevokeObjectRoles For Line Route.' || l_route_id );
14398 END IF ;
14399                 EXCEPTION
14400                   WHEN OTHERS THEN
14401                      NULL ;
14402                 END ;
14403 
14404                 IF l_return_status <> FND_API.G_RET_STS_SUCCESS
14405                 THEN
14406                     x_return_status := l_return_status ;
14407                     x_msg_count     := l_msg_count ;
14408                     x_msg_data      := l_msg_data ;
14409                     RETURN ;
14410                 END IF ;
14411            END LOOP ;
14412 
14413        END IF ;
14414 
14415  END RevokeObjectRoles ;
14416 
14417 
14418 --
14419 --  R12B
14420 --  API name   : RevokeObjectRoles
14421 --  Type       : Private
14422 --  Pre-reqs   : None.
14423 --  Function   : Revoke Change Header/Line Subject Object Roles
14424 --               and OFO Roles on Attachment for Header/Line from WF Assignees
14425 --  Parameters :
14426 --              x_return_status           OUT VARCHAR2
14427 --              x_msg_count               OUT NUMBER
14428 --              x_msg_data                OUT VARCHAR2
14429 --
14430 PROCEDURE RevokeObjectRoles
14431 (   p_api_version               IN   NUMBER                             --
14432  ,  p_init_msg_list             IN   VARCHAR2 := FND_API.G_FALSE        --
14433  ,  p_commit                    IN   VARCHAR2 := FND_API.G_FALSE        --
14434  ,  p_validation_level          IN   NUMBER   := FND_API.G_VALID_LEVEL_FULL
14435  ,  p_debug                     IN   VARCHAR2 := FND_API.G_FALSE        --
14436  ,  p_output_dir                IN   VARCHAR2 := NULL
14437  ,  p_debug_filename            IN   VARCHAR2 := NULL
14438  ,  x_return_status             OUT  NOCOPY  VARCHAR2                   --
14439  ,  x_msg_count                 OUT  NOCOPY  NUMBER                     --
14440  ,  x_msg_data                  OUT  NOCOPY  VARCHAR2                   --
14441  ,  p_change_id                 IN   NUMBER                             -- Change Id
14442  ,  p_change_line_id            IN   NUMBER                             -- Change Line Id
14443  ,  p_route_id                  IN   NUMBER
14444  ,  p_person_ids                IN   FND_TABLE_OF_NUMBER       := NULL
14445  ,  p_target_objects            IN   FND_TABLE_OF_VARCHAR2_30  := NULL
14446  ,  p_api_caller                IN   VARCHAR2  := NULL
14447  ,  p_revoke_option             IN   VARCHAR2  := NULL                  -- Optionnal
14448  )
14449  IS
14450 
14451      l_msg_count                 NUMBER ;
14452      l_msg_data                  VARCHAR2(2000) ;
14453      l_return_status             VARCHAR2(1) ;
14454 
14455      l_step_id                   NUMBER ;
14456 
14457 
14458      CURSOR  c_route_step( c_route_id   NUMBER )
14459      IS
14460          SELECT   RouteStep.STEP_ID
14461          FROM ENG_CHANGE_ROUTE_STEPS RouteStep
14462          WHERE ( RouteStep.STEP_STATUS_CODE <> Eng_Workflow_Util.G_RT_NOT_STARTED
14463                  AND  RouteStep.STEP_STATUS_CODE <> Eng_Workflow_Util.G_RT_IN_PROGRESS)
14464          AND RouteStep.ROUTE_ID = c_route_id ;
14465 
14466 
14467 
14468  BEGIN
14469 
14470       FOR l_rec  IN c_route_step (c_route_id => p_route_id )
14471       LOOP
14472 
14473           l_step_id := l_rec.STEP_ID ;
14474 
14475  IF g_debug_flag THEN
14476       Write_Debug('ENG_DOCUMENT_UTIL.RevokeObjectRoles For Step.' || TO_CHAR(l_step_id) );
14477  END IF ;
14478           BEGIN
14479               RevokeObjectRoles
14480               (   p_api_version               => p_api_version
14481                ,  p_init_msg_list             => FND_API.G_FALSE
14482                ,  p_commit                    => p_commit
14483                ,  p_validation_level          => p_validation_level
14484                ,  p_debug                     => p_debug
14485                ,  p_output_dir                => p_output_dir
14486                ,  p_debug_filename            => p_debug_filename
14487                ,  x_return_status             => l_return_status
14488                ,  x_msg_count                 => l_msg_count
14489                ,  x_msg_data                  => l_msg_data
14490                ,  p_change_id                 => p_change_id
14491                ,  p_change_line_id            => p_change_line_id
14492                ,  p_route_id                  => p_route_id
14493                ,  p_step_id                   => l_step_id
14494                ,  p_person_ids                => p_person_ids
14495                ,  p_target_objects            => p_target_objects
14496                ,  p_api_caller                => p_api_caller
14497                ,  p_revoke_option             => p_revoke_option
14498                )  ;
14499 
14500  IF g_debug_flag THEN
14501      Write_Debug('After ENG_DOCUMENT_UTIL.RevokeObjectRoles For Step.' || l_rec.STEP_ID );
14502  END IF ;
14503            EXCEPTION
14504              WHEN OTHERS THEN
14505                 NULL ;
14506            END ;
14507 
14508            IF l_return_status <> FND_API.G_RET_STS_SUCCESS
14509            THEN
14510                x_return_status := l_return_status ;
14511                x_msg_count     := l_msg_count ;
14512                x_msg_data      := l_msg_data ;
14513                RETURN ;
14514            END IF ;
14515       END LOOP;
14516 
14517 
14518 END RevokeObjectRoles ;
14519 
14520 --
14521 --  R12B
14522 --  API name   : RevokeObjectRoles
14523 --  Type       : Private
14524 --  Pre-reqs   : None.
14525 --  Function   : Revoke Change Header/Line Subject Object Roles
14526 --               and OFO Roles on Attachment for Header/Line from WF Assignees
14527 --  Parameters :
14528 --              x_return_status           OUT VARCHAR2
14529 --              x_msg_count               OUT NUMBER
14530 --              x_msg_data                OUT VARCHAR2
14531 --
14532 PROCEDURE RevokeObjectRoles
14533 (   p_api_version               IN   NUMBER                             --
14534  ,  p_init_msg_list             IN   VARCHAR2 := FND_API.G_FALSE        --
14535  ,  p_commit                    IN   VARCHAR2 := FND_API.G_FALSE        --
14536  ,  p_validation_level          IN   NUMBER   := FND_API.G_VALID_LEVEL_FULL
14537  ,  p_debug                     IN   VARCHAR2 := FND_API.G_FALSE        --
14538  ,  p_output_dir                IN   VARCHAR2 := NULL
14539  ,  p_debug_filename            IN   VARCHAR2 := NULL
14540  ,  x_return_status             OUT  NOCOPY  VARCHAR2                   --
14541  ,  x_msg_count                 OUT  NOCOPY  NUMBER                     --
14542  ,  x_msg_data                  OUT  NOCOPY  VARCHAR2                   --
14543  ,  p_change_id                 IN   NUMBER                             -- Change Id
14544  ,  p_change_line_id            IN   NUMBER                             -- Change Line Id
14545  ,  p_route_id                  IN   NUMBER
14546  ,  p_step_id                   IN   NUMBER
14547  ,  p_person_ids                IN   FND_TABLE_OF_NUMBER       := NULL
14548  ,  p_target_objects            IN   FND_TABLE_OF_VARCHAR2_30  := NULL
14549  ,  p_api_caller                IN   VARCHAR2  := NULL
14550  ,  p_revoke_option             IN   VARCHAR2  := NULL                  -- Optionnal
14551  )
14552  IS
14553 
14554     l_api_name                  CONSTANT VARCHAR2(30) := 'RevokeObjectRoles';
14555     l_api_version               CONSTANT NUMBER       := 1.0;
14556 
14557     l_msg_count                 NUMBER ;
14558     l_msg_data                  VARCHAR2(2000) ;
14559     l_return_status             VARCHAR2(1) ;
14560 
14561     l_document_role_id          NUMBER ;
14562     l_ocs_role                  VARCHAR2(250) ;
14563 
14564     l_change_id                 NUMBER ;
14565     l_change_line_id            NUMBER ;
14566 
14567     l_document_id               NUMBER ;
14568     l_document_revision_id      NUMBER ;
14569 
14570     l_target_object_tbl         FND_TABLE_OF_VARCHAR2_30 ;
14571     l_obj_idx                   PLS_INTEGER ;
14572 
14573     l_doc_rev_person_id_tbl     FND_TABLE_OF_NUMBER ;
14574     l_doc_rev_person_idx        PLS_INTEGER ;
14575     l_ocs_person_id_tbl         FND_TABLE_OF_NUMBER ;
14576     l_ocs_person_idx            PLS_INTEGER ;
14577 
14578     l_doc_rev_revoke_flag       BOOLEAN ;
14579     l_ocs_revoke_flag           BOOLEAN ;
14580 
14581     l_attachment_entity_name    VARCHAR2(40) ;
14582     l_attachment_pk1value       VARCHAR2(100) ;
14583 
14584 
14585     CURSOR  c_step_assignees ( c_step_id   NUMBER )
14586     IS
14587         SELECT   RouteStep.ROUTE_ID
14588                , RoutePeople.STEP_ID
14589                , RoutePeople.ASSIGNEE_ID
14590                , RoutePeople.ASSIGNEE_TYPE_CODE
14591                , RoutePeople.ADHOC_PEOPLE_FLAG
14592                , RoutePeople.ORIGINAL_ASSIGNEE_ID
14593                , RoutePeople.ORIGINAL_ASSIGNEE_TYPE_CODE
14594                , RoutePeople.RESPONSE_CONDITION_CODE
14595                , TO_CHAR(NULL)     ORIG_ROLE_OBJECT_NAME
14596                , TO_NUMBER(NULL)   ORIG_ROLE_OBJECT_ID
14597         FROM ENG_CHANGE_ROUTE_PEOPLE RoutePeople
14598            , ENG_CHANGE_ROUTE_STEPS RouteStep
14599         WHERE RoutePeople.ASSIGNEE_TYPE_CODE = 'PERSON'
14600         AND RoutePeople.ASSIGNEE_ID <> -1
14601         AND RoutePeople.ORIGINAL_ASSIGNEE_TYPE_CODE <> 'ROLE'
14602         AND RoutePeople.STEP_ID = RouteStep.STEP_ID
14603         AND ( RouteStep.STEP_STATUS_CODE <> Eng_Workflow_Util.G_RT_NOT_STARTED
14604               AND  RouteStep.STEP_STATUS_CODE <> Eng_Workflow_Util.G_RT_IN_PROGRESS)
14605         AND RouteStep.STEP_ID = c_step_id
14606         UNION
14607         SELECT   RouteStep.ROUTE_ID
14608                , RoutePeople.STEP_ID
14609                , RoutePeople.ASSIGNEE_ID
14610                , RoutePeople.ASSIGNEE_TYPE_CODE
14611                , RoutePeople.ADHOC_PEOPLE_FLAG
14612                , RoutePeople.ORIGINAL_ASSIGNEE_ID
14613                , RoutePeople.ORIGINAL_ASSIGNEE_TYPE_CODE
14614                , RoutePeople.RESPONSE_CONDITION_CODE
14615                , fnd_obj.OBJ_NAME ORIG_ROLE_OBJECT_NAME
14616                , fnd_obj.OBJECT_ID ORIG_ROLE_OBJECT_ID
14617         FROM FND_FORM_FUNCTIONS fnd_func
14618            , FND_MENU_ENTRIES fnd_menu
14619            , FND_OBJECTS fnd_obj
14620            , ENG_CHANGE_ROUTE_PEOPLE RoutePeople
14621            , ENG_CHANGE_ROUTE_STEPS RouteStep
14622         WHERE fnd_obj.OBJECT_ID = fnd_func.OBJECT_ID
14623         AND fnd_func.FUNCTION_ID = fnd_menu.FUNCTION_ID
14624         AND fnd_menu.MENU_ID = ORIGINAL_ASSIGNEE_ID
14625         AND RoutePeople.ASSIGNEE_TYPE_CODE = 'PERSON'
14626         AND RoutePeople.ASSIGNEE_ID <> -1
14627         AND RoutePeople.ORIGINAL_ASSIGNEE_TYPE_CODE = 'ROLE'
14628         AND RoutePeople.STEP_ID = RouteStep.STEP_ID
14629         AND ( RouteStep.STEP_STATUS_CODE <> Eng_Workflow_Util.G_RT_NOT_STARTED
14630               AND  RouteStep.STEP_STATUS_CODE <> Eng_Workflow_Util.G_RT_IN_PROGRESS)
14631         AND RouteStep.STEP_ID = c_step_id  ;
14632 
14633 
14634 
14635     -- Future, this SQL should be dynmic SQL
14636     CURSOR  c_chg_objects ( c_change_id   NUMBER, c_change_line_id NUMBER)
14637     IS
14638         SELECT ChangeSubj.ENTITY_NAME CHANGE_OBJECT_NAME
14639              , ChangeSubj.PK1_VALUE
14640              , ChangeSubj.PK2_VALUE
14641              , ChangeSubj.PK3_VALUE
14642              , ChangeSubj.PK4_VALUE
14643              , ChangeSubj.PK5_VALUE
14644              , ChangeSubj.CHANGE_ID
14645              , ChangeSubj.CHANGE_LINE_ID
14646         FROM ENG_CHANGE_SUBJECTS ChangeSubj
14647           ,  FND_OBJECTS FndObj
14648         WHERE  ChangeSubj.ENTITY_NAME = FndObj.OBJ_NAME
14649         AND  ChangeSubj.CHANGE_ID = c_change_id
14650         AND  ( ChangeSubj.CHANGE_LINE_ID = c_change_line_id
14651                OR (ChangeSubj.CHANGE_LINE_ID IS NULL
14652                    AND c_change_line_id = -1)
14653               )
14654         AND FndObj.OBJ_NAME = G_DOM_DOCUMENT_REVISION ; -- R12B We only support G_DOM_DOCUMENT_REVISION
14655 
14656         -- For future, if we need to support Item Role in this approach too.
14657         -- For now, comment out
14658         --
14659         -- UNION
14660         -- SELECT 'EGO_ITEM' CHANGE_OBJECT_NAME
14661         --      , ChangeCompSubj.PK1_VALUE
14662         --      , ChangeCompSubj.PK2_VALUE
14663         --      , ChangeCompSubj.PK3_VALUE
14664         --      , ChangeCompSubj.PK4_VALUE
14665         --      , ChangeCompSubj.PK5_VALUE
14666         --  , ChangeCompSubj.CHANGE_ID
14667         --  , ChangeCompSubj.CHANGE_LINE_ID
14668         --  FROM ENG_CHANGE_SUBJECTS ChangeCompSubj
14669         --  WHERE ChangeCompSubj.ENTITY_NAME = 'EGO_COMPONENT'
14670         --  AND ChangeCompSubj.CHANGE_ID = :c_change_id
14671         --  AND  ( ChangeCompSubj.CHANGE_LINE_ID = :c_change_line_id
14672         --        OR ( ChangeCompSubj.CHANGE_LINE_ID IS NULL
14673         --            AND :c_change_line_id = -1)
14674         --       ) ) WHERE CHANGE_OBJECT_NAME IN ('EGO_ITEM') ;
14675         --
14676 
14677 
14678 
14679 BEGIN
14680     -- Standard Start of API savepoint
14681     SAVEPOINT RevokeObjectRoles;
14682 
14683     -- Standard call to check for call compatibility.
14684     IF NOT FND_API.Compatible_API_Call(  l_api_version
14685                                        , p_api_version
14686                                        , l_api_name
14687                                        , G_PKG_NAME )
14688     THEN
14689         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
14690     END IF;
14691 
14692     -- Initialize message list if p_init_msg_list is set to TRUE.
14693     IF FND_API.to_Boolean( p_init_msg_list ) THEN
14694        FND_MSG_PUB.initialize;
14695     END IF ;
14696 
14697 
14698     -- For Test/Debug
14699     IF FND_API.to_Boolean( p_debug ) THEN
14700         Open_Debug_Session(p_output_dir, p_debug_filename ) ;
14701     END IF ;
14702 
14703 
14704 IF g_debug_flag THEN
14705    Write_Debug('Eng_Workflow_Util.RevokeObjectRoles Log');
14706    Write_Debug('-----------------------------------------------------');
14707    Write_Debug('Change Id          : ' || TO_CHAR(p_change_id) );
14708    Write_Debug('Change Line Id     : ' || TO_CHAR(p_change_line_id) );
14709    Write_Debug('Route Id           : ' || TO_CHAR(p_route_id));
14710    Write_Debug('Step Id            : ' || TO_CHAR(p_step_id));
14711    Write_Debug('API Caller         : ' || p_api_caller);
14712    Write_Debug('Revoke Option      : ' || p_revoke_option);
14713    Write_Debug('-----------------------------------------------------');
14714    Write_Debug('Initialize return status ' );
14715 END IF ;
14716 
14717     --  Initialize API return status to success
14718     x_return_status := FND_API.G_RET_STS_SUCCESS;
14719     l_return_status := FND_API.G_RET_STS_SUCCESS;
14720 
14721     l_target_object_tbl := FND_TABLE_OF_VARCHAR2_30() ;
14722     l_obj_idx           := 0 ;
14723 
14724     l_doc_rev_person_id_tbl := FND_TABLE_OF_NUMBER() ;
14725     l_doc_rev_person_idx    := 0 ;
14726     l_ocs_person_id_tbl     := FND_TABLE_OF_NUMBER() ;
14727     l_ocs_person_idx        := 0 ;
14728 
14729     l_change_id         := p_change_id ;
14730     l_change_line_id    := p_change_line_id ;
14731 
14732     IF l_change_line_id IS NULL OR l_change_line_id <= 0
14733     THEN
14734 
14735         l_change_line_id := -1 ;
14736 
14737         l_attachment_entity_name    :=  'ENG_ENGINEERING_CHANGES' ;
14738         l_attachment_pk1value       :=  TO_CHAR(l_change_id) ;
14739 
14740     ELSE
14741         l_attachment_entity_name    :=  'ENG_CHANGE_LINES' ;
14742         l_attachment_pk1value       :=  TO_CHAR(l_change_line_id) ;
14743     END IF ;
14744 
14745 IF g_debug_flag THEN
14746    Write_Debug('Attachmetn Entity');
14747    Write_Debug('Entity Name : ' || l_attachment_entity_name );
14748    Write_Debug('Entity Id1  : ' || l_attachment_pk1value );
14749 END IF ;
14750 
14751     l_ocs_revoke_flag      := FALSE  ;
14752     l_doc_rev_revoke_flag  := FALSE  ;
14753 
14754     -----------------------------------------------------------------
14755     -- API body
14756     -----------------------------------------------------------------
14757 
14758 
14759     --
14760     -- 1. Check p_target_objects parameter
14761     -- If, it's NOT null, we don't need to check Change Header and Line Subject
14762     -- Otherwise, we will query the Change Header or Line Subjects and get Subject Objects
14763     -- plus OCS File. Construct local target objects tables
14764     --
14765     -- Note: IN R12B, anyway we support only DOM_DOCUMENT_REVISION and OCS File
14766     --
14767     IF ( p_target_objects IS NOT NULL AND p_target_objects.count > 0 )
14768     THEN
14769 
14770 
14771 IF g_debug_flag THEN
14772    Write_Debug('p_target_objects IS NOT NULL. . .');
14773 END IF ;
14774 
14775 
14776         FOR i in p_target_objects.first .. p_target_objects.last
14777         LOOP
14778 
14779 IF g_debug_flag THEN
14780    Write_Debug('p_target_objects = ' || to_char(i) || ' :  ' || p_target_objects(i) );
14781 END IF ;
14782             l_target_object_tbl.EXTEND ;
14783             l_obj_idx := l_obj_idx + 1 ;
14784             l_target_object_tbl(l_obj_idx) := p_target_objects(i) ;
14785 
14786             IF (G_OCS_FILE = p_target_objects(i))
14787             THEN
14788                 l_ocs_revoke_flag      := TRUE  ;
14789 
14790             ELSIF (G_DOM_DOCUMENT_REVISION = p_target_objects(i))
14791             THEN
14792                 l_doc_rev_revoke_flag  := TRUE  ;
14793 
14794             END IF ;
14795 
14796         END LOOP;
14797 
14798 
14799     ELSE
14800 
14801 
14802 IF g_debug_flag THEN
14803    Write_Debug('p_target_objects IS NULL. . .');
14804 END IF ;
14805 
14806         --
14807         -- By Default we support the following objects in R12B
14808         --
14809         -- OCS Files
14810         l_target_object_tbl.EXTEND ;
14811         l_obj_idx := l_obj_idx + 1 ;
14812         l_target_object_tbl(l_obj_idx):= G_OCS_FILE ;
14813         l_ocs_revoke_flag      := TRUE  ;
14814 
14815         -- G_DOM_DOCUMENT_REVISION
14816         l_target_object_tbl.EXTEND ;
14817         l_obj_idx := l_obj_idx + 1 ;
14818         l_target_object_tbl(l_obj_idx):= G_DOM_DOCUMENT_REVISION;
14819         l_doc_rev_revoke_flag  := TRUE  ;
14820 
14821     END IF ;
14822 
14823 
14824     --
14825     -- We don't need to get Roles per discussion with DOM team
14826     -- DOM Security API should revoke the grants per entity or change object info
14827     -- and person ids.
14828     -- So if we face a performance issue, we should modify the logic to get all route and step
14829     -- people by one-query and call the API without getting Roles specified
14830     -- in WFT definition per Step Workflow Process
14831     --
14832     -- 2. Get Auto Grants Roles specified in Workflow Definition
14833     --
14834     -- Note: IN R12B, anyway we support only DOM_DOCUMENT_REVISION and OCS File
14835     --
14836     --
14837     -- Get Step Activity Attributes for Auto Grants
14838     GetStepAutoGranatRoles
14839     ( p_step_id                => p_step_id
14840     , x_document_role_id       => l_document_role_id
14841     , x_ocs_role               => l_ocs_role ) ;
14842 
14843 
14844 IF g_debug_flag THEN
14845    Write_Debug('Get Auto Revoke Roles specified in Workflow Definition. . .');
14846    Write_Debug('Doc Role Id          : ' || TO_CHAR(l_document_role_id) );
14847    Write_Debug('File, OCS Role       : ' || l_ocs_role);
14848 END IF ;
14849 
14850     IF (l_document_role_id IS NULL AND l_ocs_role IS NULL )
14851     THEN
14852 
14853 IF g_debug_flag THEN
14854    Write_Debug('Any Roles for Auto Revoke are not specified for this step process. Return.');
14855 END IF ;
14856 
14857         --
14858         -- Comment out this. Just in case
14859         -- RETURN ;
14860 
14861     END IF ;
14862 
14863     -- 3. Check p_person_ids  parameter
14864     -- If, it's NOT null, we don't need to query assignees under given p_step_id
14865     -- Otherwise, we will query Workflow Step Assignees and construct person ids table
14866     --
14867     IF ( p_person_ids IS NOT NULL AND p_person_ids.count > 0 )
14868     THEN
14869 
14870         FOR j in p_person_ids.first .. p_person_ids.last
14871         LOOP
14872             l_doc_rev_person_id_tbl.EXTEND ;
14873             l_doc_rev_person_idx := l_doc_rev_person_idx + 1 ;
14874             l_doc_rev_person_id_tbl(l_doc_rev_person_idx) := p_person_ids(j) ;
14875 
14876             l_ocs_person_id_tbl.EXTEND ;
14877             l_ocs_person_idx := l_ocs_person_idx + 1;
14878             l_ocs_person_id_tbl(l_ocs_person_idx) := p_person_ids(j) ;
14879 
14880         END LOOP;
14881 
14882     ELSE
14883 
14884         FOR rtp_rec  IN c_step_assignees (c_step_id => p_step_id )
14885         LOOP
14886 
14887             --
14888             -- Exclude the assignees derivded from DOM_DOUCMENT_REVISION Role
14889             --
14890             IF ( rtp_rec.orig_role_object_name  IS NULL
14891                  OR rtp_rec.orig_role_object_name <> G_DOM_DOCUMENT_REVISION
14892                 )
14893             THEN
14894 
14895                 l_doc_rev_person_id_tbl.EXTEND ;
14896                 l_doc_rev_person_idx := l_doc_rev_person_idx + 1 ;
14897                 l_doc_rev_person_id_tbl(l_doc_rev_person_idx):= rtp_rec.assignee_id ;
14898 
14899             END IF ;
14900 
14901             l_ocs_person_id_tbl.EXTEND ;
14902             l_ocs_person_idx := l_ocs_person_idx + 1;
14903             l_ocs_person_id_tbl(l_ocs_person_idx):=rtp_rec.assignee_id ;
14904 
14905         END LOOP ;
14906 
14907     END IF ;
14908 
14909 
14910 
14911     IF (l_doc_rev_revoke_flag)
14912     THEN
14913 
14914         --
14915         -- 4. Execute Query for Change Subject by given change id and change line id
14916         --    and iterlate the fetched row.
14917         --    Call insdividual API to grant the objects to assignees.
14918         --
14919         -- Note: IN R12B, anyway we support only DOM_DOCUMENT_REVISION and OCS File
14920         --
14921         FOR c_chg_objects_rec  IN c_chg_objects (  c_change_id => l_change_id
14922                                                 ,  c_change_line_id => l_change_line_id
14923                                                 )
14924         LOOP
14925             IF ( G_DOM_DOCUMENT_REVISION = c_chg_objects_rec.CHANGE_OBJECT_NAME
14926                  AND l_document_role_id IS NOT NULL
14927                  AND (l_doc_rev_person_id_tbl IS NOT NULL AND l_doc_rev_person_id_tbl.count > 0)
14928                )
14929             THEN
14930 
14931                 -- MK Comment Need to verify this PK1 is Revision Id or not
14932                 l_document_id          := TO_NUMBER(c_chg_objects_rec.PK1_VALUE) ;
14933                 l_document_revision_id := TO_NUMBER(c_chg_objects_rec.PK2_VALUE) ;
14934 
14935 IF g_debug_flag THEN
14936     Write_Debug('Calling ENG_DOCUMENT_UTIL.Revoke_Document_Role . . .  ');
14937 END IF ;
14938 
14939                 ENG_DOCUMENT_UTIL.Revoke_Document_Role
14940                 (   p_api_version               => 1.0
14941                  ,  p_init_msg_list             => FND_API.G_FALSE        --
14942                  ,  p_commit                    => FND_API.G_FALSE        --
14943                  ,  p_validation_level          => FND_API.G_VALID_LEVEL_FULL
14944                  ,  p_debug                     => p_debug
14945                  ,  p_output_dir                => p_output_dir
14946                  ,  p_debug_filename            => p_debug_filename
14947                  ,  x_return_status             => l_return_status
14948                  ,  x_msg_count                 => l_msg_count
14949                  ,  x_msg_data                  => l_msg_data
14950                  ,  p_document_id               => l_document_id               -- Dom Document Id
14951                  ,  p_document_revision_id      => l_document_revision_id      -- Dom Document Revision Id
14952                  ,  p_change_id                 => l_change_id                 -- Change Id
14953                  ,  p_change_line_id            => l_change_line_id            -- Change Line Id
14954                  ,  p_party_ids                 => l_doc_rev_person_id_tbl     -- Person's HZ_PARTIES.PARTY_ID Array
14955                  ,  p_role_id                   => l_document_role_id          -- Role Id to be granted
14956                  ,  p_api_caller                => p_api_caller                -- Optionnal for future use
14957                 ) ;
14958 
14959 
14960 
14961 IF g_debug_flag THEN
14962     Write_Debug('After ENG_DOCUMENT_UTIL.Revoke_Document_Role: ' || l_return_status );
14963 END IF ;
14964 
14965                  --
14966                  -- IF l_return_status <> FND_API.G_RET_STS_SUCCESS
14967                  -- THEN
14968                  --     RAISE FND_API.G_EXC_ERROR ;
14969                  -- END IF ;
14970                  --
14971 
14972             END IF ;
14973         END LOOP ;
14974 
14975 
14976     END IF ; -- (l_doc_rev_revoke_flag IS TRUE)
14977 
14978     --
14979     -- 5. Call ENG_DOCUMENT_UTIL.Grant_Attachments_OCSRole
14980     --    to grant roles on Attachments
14981     --
14982     IF ( l_ocs_revoke_flag
14983          AND  l_ocs_role IS NOT NULL
14984          AND (l_ocs_person_id_tbl IS NOT NULL AND l_ocs_person_id_tbl.count > 0)
14985        )
14986     THEN
14987 
14988 IF g_debug_flag THEN
14989     Write_Debug('Calling ENG_DOCUMENT_UTIL.Revoke_Attachments_OCSRole . . .  ');
14990 END IF ;
14991 
14992         ENG_DOCUMENT_UTIL.Revoke_Attachments_OCSRole
14993         (   p_api_version               => 1.0
14994          ,  p_init_msg_list             => FND_API.G_FALSE        --
14995          ,  p_commit                    => FND_API.G_FALSE        --
14996          ,  p_validation_level          => FND_API.G_VALID_LEVEL_FULL
14997          ,  p_debug                     => p_debug
14998          ,  p_output_dir                => p_output_dir
14999          ,  p_debug_filename            => p_debug_filename
15000          ,  x_return_status             => l_return_status
15001          ,  x_msg_count                 => l_msg_count
15002          ,  x_msg_data                  => l_msg_data
15003          ,  p_entity_name               => l_attachment_entity_name    -- ENG_ENGINEERING_CHANGES or ENG_CHANGE_LINES
15004          ,  p_pk1value                  => l_attachment_pk1value       -- CHANGE_ID or CHANGE_LINE_ID
15005          ,  p_pk2value                  => NULL
15006          ,  p_pk3value                  => NULL
15007          ,  p_pk4value                  => NULL
15008          ,  p_pk5value                  => NULL
15009          ,  p_party_ids                 => l_ocs_person_id_tbl         -- Person's HZ_PARTIES.PARTY_ID Array
15010          ,  p_ocs_role                  => l_ocs_role                  -- OCS Role to be revoked
15011          ,  p_api_caller                => p_api_caller                -- Optionnal for future use
15012         ) ;
15013 
15014 
15015 IF g_debug_flag THEN
15016     Write_Debug('After ENG_DOCUMENT_UTIL.Revoke_Attachments_OCSRole: ' || l_return_status );
15017 END IF ;
15018 
15019        --
15020        -- IF l_return_status <> FND_API.G_RET_STS_SUCCESS
15021        -- THEN
15022        --     RAISE FND_API.G_EXC_ERROR ;
15023        -- END IF ;
15024        --
15025 
15026 
15027     END IF ;
15028 
15029 
15030     -----------------------------------------------------------------
15031     -- END OF API body
15032     -----------------------------------------------------------------
15033 
15034 
15035 IF g_debug_flag THEN
15036    Write_Debug('After executing RevokeObjectRoles API Body') ;
15037 END IF ;
15038 
15039 
15040    -- Standard check of p_commit.
15041    IF FND_API.To_Boolean( p_commit ) THEN
15042 
15043 IF g_debug_flag THEN
15044    Write_Debug('Do Commit.') ;
15045 END IF ;
15046 
15047       COMMIT WORK;
15048 
15049    END IF;
15050 
15051    -- Standard call to get message count and if count is 1, get message info.
15052    FND_MSG_PUB.Count_And_Get
15053       (  p_count  => x_msg_count
15054       ,  p_data   => x_msg_data
15055       );
15056 
15057 IF g_debug_flag THEN
15058    Write_Debug('Finish. Eng Of Proc') ;
15059    Close_Debug_Session ;
15060 END IF ;
15061 
15062 
15063 EXCEPTION
15064    WHEN FND_API.G_EXC_ERROR THEN
15065 
15066        -- Standard check of p_commit.
15067        IF FND_API.To_Boolean( p_commit )
15068        THEN
15069          ROLLBACK TO RevokeObjectRoles ;
15070        END IF ;
15071        x_return_status := FND_API.G_RET_STS_ERROR ;
15072 
15073        FND_MSG_PUB.Count_And_Get
15074         (   p_count  =>      x_msg_count
15075          ,  p_data   =>      x_msg_data
15076         );
15077 
15078 IF g_debug_flag THEN
15079    Write_Debug('Finish with Error.') ;
15080    Close_Debug_Session ;
15081 END IF ;
15082 
15083    WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
15084        -- Standard check of p_commit.
15085        IF FND_API.To_Boolean( p_commit )
15086        THEN
15087          ROLLBACK TO RevokeObjectRoles ;
15088 IF g_debug_flag THEN
15089    Write_Debug('RollBack . .  ..') ;
15090 END IF ;
15091        END IF ;
15092 
15093        x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
15094 
15095        FND_MSG_PUB.Count_And_Get
15096         (   p_count  =>      x_msg_count
15097          ,  p_data   =>      x_msg_data
15098         );
15099 
15100 IF g_debug_flag THEN
15101    Write_Debug('Finish with unxepcted error.') ;
15102    Close_Debug_Session ;
15103 END IF ;
15104 
15105    WHEN OTHERS THEN
15106        -- Standard check of p_commit.
15107        IF FND_API.To_Boolean( p_commit )
15108        THEN
15109          ROLLBACK TO RevokeObjectRoles ;
15110 IF g_debug_flag THEN
15111    Write_Debug('RollBack . .  ..') ;
15112 END IF ;
15113        END IF ;
15114 
15115        x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
15116 
15117        FND_MSG_PUB.Count_And_Get
15118         (   p_count  =>      x_msg_count
15119          ,  p_data   =>      x_msg_data
15120         );
15121 
15122        IF  FND_MSG_PUB.Check_Msg_Level
15123           (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
15124        THEN
15125             FND_MSG_PUB.Add_Exc_Msg
15126               ( G_PKG_NAME
15127               , l_api_name
15128               );
15129        END IF;
15130 
15131        FND_MSG_PUB.Count_And_Get
15132         (   p_count  =>      x_msg_count
15133          ,  p_data   =>      x_msg_data
15134         );
15135 
15136 IF g_debug_flag THEN
15137    Write_Debug('Finish with system unxepcted error: '
15138                || Substr(To_Char(SQLCODE)||'/'||SQLERRM,1,240));
15139    Close_Debug_Session ;
15140 END IF ;
15141 
15142 
15143 END RevokeObjectRoles ;
15144 
15145 
15146 END Eng_Workflow_Util ;